diff --git a/.create-adapter.json b/.create-adapter.json deleted file mode 100644 index 0fea5142..00000000 --- a/.create-adapter.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "cli": true, - "target": "directory", - "adapterName": "tibberlink", - "title": "Tibber Link", - "description": "links Tibber API data to be used in ioBroker", - "keywords": ["power", "energy", "Tibber"], - "expert": "yes", - "features": ["adapter"], - "adminFeatures": [], - "type": "communication", - "startMode": "schedule", - "scheduleStartOnChange": "yes", - "connectionType": "cloud", - "dataSource": "poll", - "connectionIndicator": "yes", - "language": "TypeScript", - "adminReact": "no", - "tools": ["ESLint", "Prettier"], - "releaseScript": "yes", - "devServer": "no", - "indentation": "Tab", - "quotes": "double", - "es6class": "yes", - "authorName": "Hombach", - "authorGithub": "Hombach", - "authorEmail": "TibberLink@homba.ch", - "gitRemoteProtocol": "HTTPS", - "gitCommit": "no", - "defaultBranch": "main", - "license": "GNU GPLv3", - "dependabot": "yes", - "creatorVersion": "2.0.2" -} diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 59a37d7a..00000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -build/ -.prettierrc.js -.eslintrc.js -**/.eslintrc.js \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 9897e13c..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,60 +0,0 @@ -module.exports = { - root: true, // Don't look outside this project for inherited configs - parser: "@typescript-eslint/parser", // Specifies the ESLint parser - parserOptions: { - ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features - sourceType: "module", // Allows for the use of imports - project: "./tsconfig.json", - }, - extends: [ - "plugin:@typescript-eslint/recommended", // Uses the recommended rules from the @typescript-eslint/eslint-plugin - "plugin:prettier/recommended", // Enables eslint-plugin-prettier and displays prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array. - ], - plugins: [], - rules: { - "@typescript-eslint/no-parameter-properties": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-use-before-define": [ - "error", - { - functions: false, - typedefs: false, - classes: false, - }, - ], - "@typescript-eslint/no-unused-vars": [ - "error", - { - ignoreRestSiblings: true, - argsIgnorePattern: "^_", - }, - ], - "@typescript-eslint/explicit-function-return-type": [ - "warn", - { - allowExpressions: true, - allowTypedFunctionExpressions: true, - }, - ], - "prettier/prettier": [ - "error", - { - endOfLine: "auto", - }, - ], - "@typescript-eslint/no-object-literal-type-assertion": "off", - "@typescript-eslint/interface-name-prefix": "off", - "@typescript-eslint/no-non-null-assertion": "off", // This is necessary for Map.has()/get()! - "no-var": "error", - "prefer-const": "error", - "no-trailing-spaces": "error", - }, - overrides: [ - { - files: ["*.test.ts"], - rules: { - "@typescript-eslint/explicit-function-return-type": "off", - }, - }, - ], -}; diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 2db6ec0f..c37b3057 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -23,7 +23,6 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots and logfiles to help explain your problem. **Versions:** - - Adapter version: - JS-Controller version: - Node version: diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index ed7c2d9c..fbf8bc5d 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -17,14 +17,15 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node_version: ["20", "18"] + node_version: ["22", "20", "18"] steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v4.0.3 + - uses: actions/setup-node@v4.1.0 with: node-version: ${{ matrix.node_version }} - name: npm install, build and test run: | + # npm install npm install --legacy-peer-deps npm run build --if-present npm run test:integration --if-present @@ -35,7 +36,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v4.0.3 + - uses: actions/setup-node@v4.1.0 with: node-version: "20.x" registry-url: https://registry.npmjs.org/ diff --git a/.github/workflows/test-and-release.yml b/.github/workflows/test-and-release.yml index 2cdeca23..c53ca01a 100644 --- a/.github/workflows/test-and-release.yml +++ b/.github/workflows/test-and-release.yml @@ -31,6 +31,7 @@ jobs: node-version: '20.x' # Uncomment the following line if your adapter cannot be installed using 'npm ci' # install-command: 'npm install' + # install-command: npm install --legacy-peer-deps type-checking: true lint: true @@ -52,10 +53,8 @@ jobs: # install-command: 'npm install' build: true - # TODO: To enable automatic npm releases, create a token on npmjs.org # Enter this token as a GitHub secret (with name NPM_TOKEN) in the repository options - # Then uncomment the following block: # # Deploys the final package to NPM @@ -70,6 +69,10 @@ jobs: # # runs-on: ubuntu-latest # +# # Write permissions are required to create Github releases +# permissions: +# contents: write +# # steps: # - uses: ioBroker/testing-action-deploy@v1 # with: diff --git a/.gitignore b/.gitignore index 2eba537a..87b7ea45 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,15 @@ yarn-error.log* lerna-debug.log* .pnpm-debug.log* +*.code-workspace +node_modules +nbproject + +# npm package files +iobroker.*.tgz + +Thumbs.db + # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -35,13 +44,6 @@ bower_components # node-waf configuration .lock-wscript -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - # Snowpack dependency directory (https://snowpack.dev/) web_modules/ @@ -66,9 +68,6 @@ web_modules/ # Optional REPL history .node_repl_history -# Output of 'npm pack' -*.tgz - # Yarn Integrity file .yarn-integrity diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 41eb733b..00000000 --- a/.prettierignore +++ /dev/null @@ -1,4 +0,0 @@ -package.json -package-lock.json -build/ -test-and-release.yml diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index 5e921f3d..00000000 --- a/.prettierrc.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - semi: true, - trailingComma: "all", - singleQuote: false, - printWidth: 160, - useTabs: true, - tabWidth: 4, - endOfLine: "lf", -}; diff --git a/.vscode/settings.json b/.vscode/settings.json index 3756f93a..61ab5272 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,7 +12,11 @@ "json.schemas": [ { "fileMatch": ["io-package.json"], - "url": "https://json.schemastore.org/io-package" + "url": "https://raw.githubusercontent.com/ioBroker/ioBroker.js-controller/master/schemas/io-package.json" + }, + { + "fileMatch": ["admin/jsonConfig.json", "admin/jsonCustom.json", "admin/jsonTab.json"], + "url": "https://raw.githubusercontent.com/ioBroker/adapter-react-v5/main/schemas/jsonConfig.json" } ] } diff --git a/CHANGELOG_OLD.md b/CHANGELOG_OLD.md index be5fadd3..80d1fd6f 100644 --- a/CHANGELOG_OLD.md +++ b/CHANGELOG_OLD.md @@ -18,6 +18,124 @@ If you're not currently a Tibber user, I would greatly appreciate it if you coul ## Changelog - OLD CHANGES +### 3.0.0 (2024-04-15) + +- (HombachC) BREAKING: dropped support for node.js 16 (#368) +- (HombachC) BREAKING: js-controller >= 5 is required +- (HombachC) changed to tier 2 as data provider +- (HombachC) corrected io-package.json according to new schema (#368) +- (HombachC) update typescript to 5.4.5 +- (HombachC) update adapter-core to 3.0.6 + +### 2.3.2 (2024-03-17) + +- (HombachC) code optimizations +- (HombachC) fix undefined force mode (#349) +- (HombachC) fix poll of not existing current price state (#348) +- (HombachC) fix current price poll when configured as not to poll (#350) +- (HombachC) bump dependencies + +### 2.3.1 (2024-03-10) + +- (HombachC) BREAKING: Calculator channels of type 'smart battery buffer' will now switch outputs to 'OFF' only once, directly after setting the channel to Active=false (#332) +- (HombachC) Fixed error in jsonConfig.json (#329) +- (HombachC) deleted feed disconnect debug-message, cause warn message already exists +- (HombachC) bump typescript-eslint to gen 7 +- (HombachC) bump dependencies + +### 2.2.2 (2024-02-19) + +- (HombachC) simplify internal state handling +- (HombachC) shorten home string in Calculator screen (#317) +- (HombachC) fix feedback loop trap (#321) +- (HombachC) add some tooltips to config screen (#317) + +### 2.2.1 (2024-02-08) + +- (HombachC) fix edge case problems with defect feed data from Tibber server (#312) +- (HombachC) bump dependencies + +### 2.2.0 (2024-02-04) + +- (HombachC) add data points for BestHoursBlock results - period and average cost (#240) +- (HombachC) fixed wrong error message texts +- (HombachC) fix some possible edge cases in internal support functions +- (HombachC) internal code docu optimization +- (HombachC) bump dependencies + +### 2.1.1 (2024-01-27) + +- (HombachC) fix reconnect error for Pulse feed (#300) +- (HombachC) new error message handler +- (HombachC) internal code docu optimization + +### 2.1.0 (2024-01-21) + +- (HombachC) add repeatablity for LTF channels (#289) +- (HombachC) tweak Smart Battery Buffer documentation + +### 2.0.1 (2024-01-15) + +- (HombachC) modify timing in Tibber Pulse feed connect (#271) +- (HombachC) bump dependencies + +### 2.0.0 (2023-12-23) + +- (HombachC) BREAKING: dropped support for js-controller 3.x (#247) +- (HombachC) diversificate Tibber server polls to prevent potential DDoS reactions (#252) +- (HombachC) add data point for averageRemaining of todays prices (#254) +- (HombachC) add 2 data points for last successfull update of today and tomorrow prices (#261) +- (HombachC) year 2024 changes +- (HombachC) fix small error in dynamic feed timing +- (HombachC) bump dependencies + +### 1.8.1 (2023-12-16) + +- (HombachC) add notice about changes in configuration + +### 1.8.0 (2023-12-14) + +- (HombachC) implement optional disable of price pull (#232) +- (HombachC) implement price categorization algorithm for battery buffer applications (#193) +- (HombachC) Fix 2 errors in pull of prices tomorrow (#235, #232) +- (HombachC) changed Tibber link in config + +### 1.7.2 (2023-12-07) + +- (HombachC) implemented dynamic raise of feed reconnect (#225) +- (HombachC) small bugfix in pricecalls +- (HombachC) first changes for "smart battery buffer" (#193) +- (HombachC) update typescript to 5.3.3 + +### 1.7.1 (2023-12-04) + +- (HombachC) added hint for consumption data in documentation (#223) +- (HombachC) mitigate error handling (#217) +- (HombachC) added description to object Features/RealTimeConsumptionEnabled (#224) +- (HombachC) bump dependencies + +### 1.7.0 (2023-11-30) + +- (HombachC) implement getting historical consumption data from Tibber Server (#163) +- (HombachC) fix error in adapter unload +- (HombachC) some code optimisations + +### 1.6.1 (2023-11-26) + +- (HombachC) cleanup in documentation and translation handling + +### 1.6.0 (2023-11-26) + +- (HombachC) fixed major bug in 1.5.0, not working calculator channels (#212) +- (HombachC) implement limit calculations to a time frame (#153) +- (HombachC) fix error of missing price data upon not working tibber server connect at adapter start (#204) +- (HombachC) fixed possible error with wrong price date in multi home systems +- (HombachC) fixed possible type error, notified by Sentry +- (HombachC) added some documentation for inverse use of channels (#202) +- (HombachC) added Sentry statistics +- (HombachC) optimize translation handling +- (HombachC) bump dependencies + ### 1.5.0 (2023-11-13) - (HombachC) implement calculator channel names (#186) diff --git a/README.md b/README.md index c9f7de3a..17d4b315 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ ![GitHub last commit](https://img.shields.io/github/last-commit/hombach/iobroker.tibberlink?logo=github&style=flat-square) ![GitHub issues](https://img.shields.io/github/issues/hombach/iobroker.tibberlink?logo=github&style=flat-square) -![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/hombach/iobroker.tibberlink/test-and-release.yml?branch=main&logo=github&style=flat-square) +![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/hombach/iobroker.tibberlink/test-and-release.yml?branch=master&logo=github&style=flat-square) [![CodeQL](https://github.com/hombach/ioBroker.tibberlink/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/hombach/ioBroker.tibberlink/actions/workflows/codeql-analysis.yml) [![Appveyor-CI](https://ci.appveyor.com/api/projects/status/github/hombach/ioBroker.tibberlink?branch=master&svg=true)](https://ci.appveyor.com/project/hombach/iobroker-tibberlink) [![SNYK Known Vulnerabilities](https://snyk.io/test/github/hombach/ioBroker.tibberlink/badge.svg)](https://snyk.io/test/github/hombach/ioBroker.tibberlink) @@ -35,40 +35,40 @@ If you're not currently a Tibber user, I would greatly appreciate it if you coul ## Standard Configuration -- Begin by creating a new instance of the adapter. -- You'll also require an API token from Tibber, which you can obtain here: [Tibber Developer API](https://developer.tibber.com). -- Enter your Tibber API token in the standard settings and configure at least one line for live feed settings (select "None available"). -- Save the settings and exit the configuration to restart the adapter; this step allows your home(s) to be queried the first time from the Tibber server. -- Return to the configuration screen and select the homes from which you wish to fetch real-time data using your Tibber Pulse. You can also select homes and disable the feed (Note: This works only if the hardware is installed and the Tibber server has verified the connection to Pulse). -- Note: If you have more than one home actively in your Tibber account you have to add all of them to get rid of error message caused by potentially not needed homes. Add them all and disable the options. -- You have the option to deactivate the retrieval of price data for today and tomorrow, for instance, if you only intend to utilize Pulse live feeds -- Optionally, you can enable the retrieval of historical consumption data. Please specify the number of datasets for hours, days, weeks, months, and years. You can use "0" to disable one or more of these intervals based on your preferences. -- Note: It's essential to be mindful of the dataset size, as excessively large requests may result in a lack of response from the Tibber Server. We recommend experimenting with the dataset size to ensure optimal functionality. Adjusting the intervals and dataset numbers can help strike the right balance between obtaining insightful data and maintaining server responsiveness. E.g. 48 is a quite good amount for hours. -- Save the settings. +- Begin by creating a new instance of the adapter. +- You'll also require an API token from Tibber, which you can obtain here: [Tibber Developer API](https://developer.tibber.com). +- Enter your Tibber API token in the standard settings and configure at least one line for live feed settings (select "None available"). +- Save the settings and exit the configuration to restart the adapter; this step allows your home(s) to be queried the first time from the Tibber server. +- Return to the configuration screen and select the homes from which you wish to fetch real-time data using your Tibber Pulse. You can also select homes and disable the feed (Note: This works only if the hardware is installed and the Tibber server has verified the connection to Pulse). +- Note: If you have more than one home actively in your Tibber account you have to add all of them to get rid of error message caused by potentially not needed homes. Add them all and disable the options. +- You have the option to deactivate the retrieval of price data for today and tomorrow, for instance, if you only intend to utilize Pulse live feeds +- Optionally, you can enable the retrieval of historical consumption data. Please specify the number of datasets for hours, days, weeks, months, and years. You can use "0" to disable one or more of these intervals based on your preferences. +- Note: It's essential to be mindful of the dataset size, as excessively large requests may result in a lack of response from the Tibber Server. We recommend experimenting with the dataset size to ensure optimal functionality. Adjusting the intervals and dataset numbers can help strike the right balance between obtaining insightful data and maintaining server responsiveness. E.g. 48 is a quite good amount for hours. +- Save the settings. ## Calculator Configuration -- Now that the Tibber connection is up and running, you can also leverage the Calculator to incorporate additional automation features into the TibberLink adapter. -- The Calculator operates using channels, with each channel linked to a selected home. -- These channels can be activated or deactivated based on corresponding states. -- These states are designed to serve as external, dynamic inputs for TibberLink, allowing you to, for example, adjust the marginal cost ("TriggerPrice") from an external source or disable the calculator channel ("Active"). -- The states of a calculator channel are positioned adjacent to the home states and named according to the channel number. Hereby the channelname choosen in admin screen is shown here to better identify your configurations. - ![Calculator States](docu/calculatorStates.png) -- The behavior of each channel is determined by its type: "best cost (LTF)", "best single hours (LTF)", "best hours block (LTF)" or "smart battery buffer". -- Each channel populates one or two external states as output, which has to be selected in the settings tab. For instance, this state might be "0_userdata.0.example_state" or any other writeable external state. -- If no external output state is selected, an internal state within the channel's range will be created. -- The values to be written to the output state can be defined in "value YES" and "value NO," e.g., "true" for boolean states or a number or text to be written. -- Outputs: - - "Best cost": Utilizes the "TriggerPrice" state as input, producing a "YES" output every hour when the current Tibber energy cost is below the trigger price. - - "Best single hours": Generates a "YES" output during the least expensive hours, with the number defined in the "AmountHours" state. - - "Best hours block": Outputs "YES" during the most cost-effective block of hours, with the number of hours specified in the "AmountHours" state. - Additionally, the average total cost in the determined block is written to a state "AverageTotalCost" nearby the input states of this channel. Also start and end hour of the block is written to "BlockStartFullHour" and "BlockEndFullHour" as a result of the calculation. - - "Best cost LTF": "Best cost" within a Limited Time Frame (LTF). - - "Best single hours LTF": "Best single hours" within a Limited Time Frame (LTF). - - "Best hours block LTF": "Best hours block" within a Limited Time Frame (LTF). - - "Smart Battery Buffer": Utilize the "EfficiencyLoss" parameter to specify the efficiency loss of the battery system. The "EfficiencyLoss" parameter can range from 0 to 1, where 0 represents no efficiency loss and 1 represents complete efficiency loss. For example, a value of 0.25 indicates a 25% efficiency loss for a charge/discharge cycle. - Use the "AmountHours" parameter to input the desired number of hours for battery charging. The calculator will activate battery charging ("value YES") and deactivate battery feed ("value 2 NO") during the specified "AmountHours" cheapest hours. Conversely, it will deactivate battery charging ("value NO") and activate battery feed ("value 2 YES") during hours with the highest cost, provided the cost is higher than the highest total price among the cheap hours. In the remaining normal hours where energy buffering by the battery is not economically viable, both outputs will be switched off. -- LTF channels: Function similarly to standard channels but only operate within a time frame defined by the "StartTime" and "StopTime" state objects. After "StopTime," the channel deactivates itself. "StartTime" and "StopTime" may span over several days. The states must be filled with a date-time string in ISO-8601 format with a timezone offset, such as: "2024-01-17T21:00:00.000+01:00". Additionally, the channels have a new state parameter called "RepeatDays," which is set to 0 by default. If "RepeatDays" is set to a positive integer value, the channel will repeat its cycle by increasing both StartTime and StopTime by the number of days specified in "RepeatDays", once StopTime is reached. E.g. For daily repetition, set "RepeatDays" to 1." +- Now that the Tibber connection is up and running, you can also leverage the Calculator to incorporate additional automation features into the TibberLink adapter. +- The Calculator operates using channels, with each channel linked to a selected home. +- These channels can be activated or deactivated based on corresponding states. +- These states are designed to serve as external, dynamic inputs for TibberLink, allowing you to, for example, adjust the marginal cost ("TriggerPrice") from an external source or disable the calculator channel ("Active"). +- The states of a calculator channel are positioned adjacent to the home states and named according to the channel number. Hereby the channelname choosen in admin screen is shown here to better identify your configurations. + ![Calculator States](docu/calculatorStates.png) +- The behavior of each channel is determined by its type: "best cost (LTF)", "best single hours (LTF)", "best hours block (LTF)" or "smart battery buffer". +- Each channel populates one or two external states as output, which has to be selected in the settings tab. For instance, this state might be "0_userdata.0.example_state" or any other writeable external state. +- If no external output state is selected, an internal state within the channel's range will be created. +- The values to be written to the output state can be defined in "value YES" and "value NO," e.g., "true" for boolean states or a number or text to be written. +- Outputs: + - "Best cost": Utilizes the "TriggerPrice" state as input, producing a "YES" output every hour when the current Tibber energy cost is below the trigger price. + - "Best single hours": Generates a "YES" output during the least expensive hours, with the number defined in the "AmountHours" state. + - "Best hours block": Outputs "YES" during the most cost-effective block of hours, with the number of hours specified in the "AmountHours" state. + Additionally, the average total cost in the determined block is written to a state "AverageTotalCost" nearby the input states of this channel. Also start and end hour of the block is written to "BlockStartFullHour" and "BlockEndFullHour" as a result of the calculation. + - "Best cost LTF": "Best cost" within a Limited Time Frame (LTF). + - "Best single hours LTF": "Best single hours" within a Limited Time Frame (LTF). + - "Best hours block LTF": "Best hours block" within a Limited Time Frame (LTF). + - "Smart Battery Buffer": Utilize the "EfficiencyLoss" parameter to specify the efficiency loss of the battery system. The "EfficiencyLoss" parameter can range from 0 to 1, where 0 represents no efficiency loss and 1 represents complete efficiency loss. For example, a value of 0.25 indicates a 25% efficiency loss for a charge/discharge cycle. + Use the "AmountHours" parameter to input the desired number of hours for battery charging. The calculator will activate battery charging ("value YES") and deactivate battery feed ("value 2 NO") during the specified "AmountHours" cheapest hours. Conversely, it will deactivate battery charging ("value NO") and activate battery feed ("value 2 YES") during hours with the highest cost, provided the cost is higher than the highest total price among the cheap hours. In the remaining normal hours where energy buffering by the battery is not economically viable, both outputs will be switched off. +- LTF channels: These operate similarly to standard channels but are active only within a time frame defined by the 'StartTime' and 'StopTime' state objects. After 'StopTime,' the channel automatically deactivates. 'StartTime' and 'StopTime' can span two calendar days, as Tibber does not provide data beyond a 48-hour window. Both states require a date-time string in ISO-8601 format with a timezone offset, e.g., '2024-12-24T18:00:00.000+01:00'." Additionally, the LTF channels feature a new state parameter called 'RepeatDays,' which defaults to 0. When 'RepeatDays' is set to a positive integer, the channel will repeat its cycle by incrementing both 'StartTime' and 'StopTime' by the specified number of days after 'StopTime' is reached. For example, set 'RepeatDays' to 1 for daily repetition. ### Hints @@ -101,248 +101,191 @@ This adapter employs Sentry libraries to automatically report exceptions and cod ## Donate - + If you enjoyed this project — or just feeling generous, consider buying me a beer. Cheers! :beers: ## Changelog -! Note that missing version entries are typically dependency updates for improved security. +### 4.0.0 (2024-12-xx) WORK in PROGRESS -### 3.4.8 (2024-08-xx) +- (HombachC) BREAKING: dropped support for ioBroker.admin < 7.0.0 because of ioBroker Responsive Design Initiative (#544) +- (HombachC) redesigned admin tab for calculator +- (HombachC) optimize translations, added more tooltips +- (HombachC) fix repeated calculation of LTF channels (#593) +- (HombachC) added BlockStart / BlockEnd as date string (#516) +- (HombachC) throttle sentry messaging -- (HombachC) updated axios because of vulnerability -- (HombachC) added tests for Node.js 22 +### 3.5.4 (2024-12-01) + +- (HombachC) add warning when LTF stop time isn't same or next day and provide docu +- (HombachC) fix error in calculator channel 'best single hours' (#594) +- (HombachC) intruduce 'iobroker/eslint-config' (#591) +- (HombachC) performance optimizations +- (HombachC) dependency updates + +### 3.5.3 (2024-11-23) + +- (HombachC) fix edge case in output state setup and usage +- (HombachC) optimzed state subscription +- (HombachC) update deprecated state calls +- (HombachC) add await to delObjectAsync +- (HombachC) harmonize project tools +- (HombachC) dependency updates + +### 3.5.2 (2024-10-30) + +- (HombachC) add verification for YES/NO 2 values in calculator (#547) +- (HombachC) optimized responsive design (#544) +- (HombachC) migrate eslint to >9.x +- (HombachC) switch to ES2022 code +- (HombachC) adapted to new API constraints (#546) +- (HombachC) replace deprecated setStateAsync by setState + +### 3.5.1 (2024-10-05) + +- (HombachC) changed to less feed disconnection warnings in log (#445) +- (HombachC) fix error in output2 of smart battery buffer (#538) +- (HombachC) update deprecated state calls +- (HombachC) dependency updates + +### 3.5.0 (2024-10-02) + +- (HombachC) update adapter core +- (HombachC) fix error in SML decoder +- (HombachC) add 2 new SML scale factor codes (#535) +- (HombachC) dependency updates + +### 3.4.10 (2024-09-16) + +- (HombachC) add verification of poll interval (#518) +- (HombachC) bumb date-fns to 4.0.0 + +### 3.4.9 (2024-09-15) + +- (HombachC) add adjustable Bridge poll intervall (#518) +- (HombachC) add node.js 22 to the adapter testing (#519) +- (HombachC) add docu link to config screen (#504) +- (HombachC) repository cleanup +- (HombachC) dependency updates + +### 3.4.8 (2024-08-16) + +- (HombachC) updated axios because of vulnerability +- (HombachC) added tests for Node.js 22 ### 3.4.7 (2024-08-10) -- (HombachC) adapter checker detected optimizations (#493) -- (HombachC) improved error message (#490) +- (HombachC) adapter checker detected optimizations (#493) +- (HombachC) improved error message (#490) ### 3.4.6 (2024-08-07) -- (HombachC) Catch wrong OBIS Codes, probably caused by Pulse communication errors -- (HombachC) code cleanup +- (HombachC) Catch wrong OBIS Codes, probably caused by Pulse communication errors +- (HombachC) code cleanup ### 3.4.5 (2024-07-31) -- (HombachC) decode meter mode 4 for local Tipper Pulse poll (#477) -- (HombachC) decode meter mode 1 for local Tipper Pulse poll (#478) -- (HombachC) fixed wrong Pulse local status names (voltage) -- (HombachC) add docu on local Pulse poll config screen (#479) -- (HombachC) code cleanup -- (HombachC) bump dependencies +- (HombachC) decode meter mode 4 for local Tipper Pulse poll (#477) +- (HombachC) decode meter mode 1 for local Tipper Pulse poll (#478) +- (HombachC) fixed wrong Pulse local status names (voltage) +- (HombachC) add docu on local Pulse poll config screen (#479) +- (HombachC) code cleanup +- (HombachC) bump dependencies ### 3.4.4 (2024-07-28) -- (HombachC) local poll of data - change units Wh to kWh and round to 0,1kWh (#469) +- (HombachC) local poll of data - change units Wh to kWh and round to 0,1kWh (#469) ### 3.4.3 (2024-07-14) -- (HombachC) added unit to Pulse temperature and round to 0,1°C -- (HombachC) added unit to Pulse battery voltage and round to 100mV -- (HombachC) added unit to Pulse uptime -- (HombachC) added state with Pulse uptime as human readable string -- (HombachC) reinitialize some TibberLocal states upon adapter startup -- (HombachC) code optimisation -- (HombachC) bump dependencies +- (HombachC) added unit to Pulse temperature and round to 0,1°C +- (HombachC) added unit to Pulse battery voltage and round to 100mV +- (HombachC) added unit to Pulse uptime +- (HombachC) added state with Pulse uptime as human readable string +- (HombachC) reinitialize some TibberLocal states upon adapter startup +- (HombachC) code optimisation +- (HombachC) bump dependencies ### 3.4.2 (2024-07-13) -- (HombachC) fix typos in units -- (HombachC) fix type mismatch for state objects (#455) -- (HombachC) code optimisation +- (HombachC) fix typos in units +- (HombachC) fix type mismatch for state objects (#455) +- (HombachC) code optimisation ### 3.4.1 (2024-07-13) -- (HombachC) fix logging error -- (HombachC) bump dependencies +- (HombachC) fix logging error +- (HombachC) bump dependencies ### 3.4.0 (2024-07-12) -- (HombachC) add mode for local poll of Pulse data (#201) +- (HombachC) add mode for local poll of Pulse data (#201) ### 3.3.3 (2024-07-04) -- (HombachC) fix sentry notified possible error -- (HombachC) try to fix startup error (#444) +- (HombachC) fix sentry notified possible error +- (HombachC) try to fix startup error (#444) ### 3.3.2 (2024-06-21) -- (HombachC) fix 2 security issues in dependencies -- (HombachC) fix sentry notified possible error +- (HombachC) fix 2 security issues in dependencies +- (HombachC) fix sentry notified possible error ### 3.3.1 (2024-06-13) -- (HombachC) fix small sentry discovered error (#418) -- (HombachC) added note for multihomes to documentation (#422) +- (HombachC) fix small sentry discovered error (#418) +- (HombachC) added note for multihomes to documentation (#422) ### 3.3.0 (2024-06-05) -- (HombachC) implements optional, obsolete api call for total historical cost, incl. grid fees (#405) -- (HombachC) Updates @iobroker/adapter-core from 3.1.6 -- (HombachC) Updates @iobroker/types from 5.0.19 to 6.0.0 +- (HombachC) implements optional, obsolete api call for total historical cost, incl. grid fees (#405) +- (HombachC) Updates @iobroker/adapter-core from 3.1.6 +- (HombachC) Updates @iobroker/types from 5.0.19 to 6.0.0 ### 3.2.1 (2024-06-03) -- (HombachC) added unique endpoint string +- (HombachC) added unique endpoint string ### 3.2.0 (2024-06-03) -- (HombachC) IMPORTANT: adapter components had been blocked by Tibber - you have to update! -- (HombachC) bump base dependencies -- (HombachC) adapter will use internal output states for calculator if none defined in configuration (#325) -- (HombachC) implement first run mode in calculator to reduce system load -- (HombachC) internal optimisations +- (HombachC) IMPORTANT: adapter components had been blocked by Tibber - you have to update! +- (HombachC) bump base dependencies +- (HombachC) adapter will use internal output states for calculator if none defined in configuration (#325) +- (HombachC) implement first run mode in calculator to reduce system load +- (HombachC) internal optimisations ### 3.1.2 (2024-05-20) -- (HombachC) deleting unused temp home objects after adapter config (#393) -- (HombachC) bump dependencies +- (HombachC) deleting unused temp home objects after adapter config (#393) +- (HombachC) bump dependencies ### 3.1.1 (2024-05-16) -- (HombachC) throttle down reconnection speed -- (HombachC) logging optimizations (#396; #217) -- (HombachC) adaptations to newer environment (#394; #395) +- (HombachC) throttle down reconnection speed +- (HombachC) logging optimizations (#396; #217) +- (HombachC) adaptations to newer environment (#394; #395) ### 3.1.0 (2024-05-07) -- (HombachC) enable manual control of configured outputs when automation is deactivated (#334) -- (HombachC) fix not working LTF Channel when using too short LTF (#383) -- (HombachC) code optimisations -- (HombachC) update adapter-core to 3.1.4 -- (HombachC) bump dependencies +- (HombachC) enable manual control of configured outputs when automation is deactivated (#334) +- (HombachC) fix not working LTF Channel when using too short LTF (#383) +- (HombachC) code optimisations +- (HombachC) update adapter-core to 3.1.4 +- (HombachC) bump dependencies ### 3.0.1 (2024-04-20) -- (HombachC) updated adapter testing -- (HombachC) bump dependencies +- (HombachC) updated adapter testing +- (HombachC) bump dependencies ### 3.0.0 (2024-04-15) -- (HombachC) BREAKING: dropped support for node.js 16 (#368) -- (HombachC) BREAKING: js-controller >= 5 is required -- (HombachC) changed to tier 2 as data provider -- (HombachC) corrected io-package.json according to new schema (#368) -- (HombachC) update typescript to 5.4.5 -- (HombachC) update adapter-core to 3.0.6 - -### 2.3.2 (2024-03-17) - -- (HombachC) code optimizations -- (HombachC) fix undefined force mode (#349) -- (HombachC) fix poll of not existing current price state (#348) -- (HombachC) fix current price poll when configured as not to poll (#350) -- (HombachC) bump dependencies - -### 2.3.1 (2024-03-10) - -- (HombachC) BREAKING: Calculator channels of type 'smart battery buffer' will now switch outputs to 'OFF' only once, directly after setting the channel to Active=false (#332) -- (HombachC) Fixed error in jsonConfig.json (#329) -- (HombachC) deleted feed disconnect debug-message, cause warn message already exists -- (HombachC) bump typescript-eslint to gen 7 -- (HombachC) bump dependencies - -### 2.2.2 (2024-02-19) - -- (HombachC) simplify internal state handling -- (HombachC) shorten home string in Calculator screen (#317) -- (HombachC) fix feedback loop trap (#321) -- (HombachC) add some tooltips to config screen (#317) - -### 2.2.1 (2024-02-08) - -- (HombachC) fix edge case problems with defect feed data from Tibber server (#312) -- (HombachC) bump dependencies - -### 2.2.0 (2024-02-04) - -- (HombachC) add data points for BestHoursBlock results - period and average cost (#240) -- (HombachC) fixed wrong error message texts -- (HombachC) fix some possible edge cases in internal support functions -- (HombachC) internal code docu optimization -- (HombachC) bump dependencies - -### 2.1.1 (2024-01-27) - -- (HombachC) fix reconnect error for Pulse feed (#300) -- (HombachC) new error message handler -- (HombachC) internal code docu optimization - -### 2.1.0 (2024-01-21) - -- (HombachC) add repeatablity for LTF channels (#289) -- (HombachC) tweak Smart Battery Buffer documentation - -### 2.0.1 (2024-01-15) - -- (HombachC) modify timing in Tibber Pulse feed connect (#271) -- (HombachC) bump dependencies - -### 2.0.0 (2023-12-23) - -- (HombachC) BREAKING: dropped support for js-controller 3.x (#247) -- (HombachC) diversificate Tibber server polls to prevent potential DDoS reactions (#252) -- (HombachC) add data point for averageRemaining of todays prices (#254) -- (HombachC) add 2 data points for last successfull update of today and tomorrow prices (#261) -- (HombachC) year 2024 changes -- (HombachC) fix small error in dynamic feed timing -- (HombachC) bump dependencies - -### 1.8.1 (2023-12-16) - -- (HombachC) add notice about changes in configuration - -### 1.8.0 (2023-12-14) - -- (HombachC) implement optional disable of price pull (#232) -- (HombachC) implement price categorization algorithm for battery buffer applications (#193) -- (HombachC) Fix 2 errors in pull of prices tomorrow (#235, #232) -- (HombachC) changed Tibber link in config - -### 1.7.2 (2023-12-07) - -- (HombachC) implemented dynamic raise of feed reconnect (#225) -- (HombachC) small bugfix in pricecalls -- (HombachC) first changes for "smart battery buffer" (#193) -- (HombachC) update typescript to 5.3.3 - -### 1.7.1 (2023-12-04) - -- (HombachC) added hint for consumption data in documentation (#223) -- (HombachC) mitigate error handling (#217) -- (HombachC) added description to object Features/RealTimeConsumptionEnabled (#224) -- (HombachC) bump dependencies - -### 1.7.0 (2023-11-30) - -- (HombachC) implement getting historical consumption data from Tibber Server (#163) -- (HombachC) fix error in adapter unload -- (HombachC) some code optimisations - -### 1.6.1 (2023-11-26) - -- (HombachC) cleanup in documentation and translation handling - -### 1.6.0 (2023-11-26) - -- (HombachC) fixed major bug in 1.5.0, not working calculator channels (#212) -- (HombachC) implement limit calculations to a time frame (#153) -- (HombachC) fix error of missing price data upon not working tibber server connect at adapter start (#204) -- (HombachC) fixed possible error with wrong price date in multi home systems -- (HombachC) fixed possible type error, notified by Sentry -- (HombachC) added some documentation for inverse use of channels (#202) -- (HombachC) added Sentry statistics -- (HombachC) optimize translation handling -- (HombachC) bump dependencies - -### 1.5.0 (2023-11-13) - -- (HombachC) implement calculator channel names (#186) -- (HombachC) fix error in cron jobs (#190) -- (HombachC) remove not used calculator channel state objects (#188) -- (HombachC) code optimizations -- (HombachC) optimize translation handling +- (HombachC) BREAKING: dropped support for node.js 16 (#368) +- (HombachC) BREAKING: js-controller >= 5 is required +- (HombachC) changed to tier 2 as data provider +- (HombachC) corrected io-package.json according to new schema (#368) +- (HombachC) update typescript to 5.4.5 +- (HombachC) update adapter-core to 3.0.6 ### Old Changes see [CHANGELOG OLD](CHANGELOG_OLD.md) diff --git a/admin/i18n/de.json b/admin/i18n/de.json deleted file mode 100644 index 3fc2503a..00000000 --- a/admin/i18n/de.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "s_Active": "Aktiv" -} diff --git a/admin/i18n/de/translations.json b/admin/i18n/de/translations.json new file mode 100644 index 00000000..dc332971 --- /dev/null +++ b/admin/i18n/de/translations.json @@ -0,0 +1,89 @@ +{ + "LBL_StandardTab": "Standardeinstellungen", + "LBL_TibberAPIToken": "Tibber-API-Token", + "LBL_referralLink": "Wenn Sie noch kein Tibber-Benutzer sind, würde ich mich sehr freuen, wenn Sie meinen Empfehlungslink verwenden könnten.", + "LBL_HomesList": "Konfiguration von Pulse-Live-Datenströmen", + "LBL_item_homeID": "Tibber-Haus", + "TTIP_item_homeID": "Die Haus-ID dieses Tibber-Hauses", + "LBL_item_priceDataPollActive": "Nutzen Sie die Tibber-Preisdatenumfrage", + "TTIP_item_priceDataPollActive": "Nutzen Sie die Tibber-Preisdatenumfrage", + "LBL_item_feedActive": "Verwenden Sie Tibber Pulse Feed", + "TTIP_item_feedActive": "Verwenden Sie den Tibber Pulse-Feed für Live-Verbrauchsdaten", + "LBL_item_statsActive": "Historische Verbrauchsdaten abrufen", + "TTIP_item_statsActive": "Rufen Sie historische Verbrauchsdaten für dieses Haus ab", + "LBL_item_numberConsHourly": "Std", + "TTIP_item_numberConsHourly": "Anzahl der vergangenen Stunden, die abgerufen werden sollen", + "LBL_item_numberConsDaily": "Tage", + "TTIP_item_numberConsDaily": "Anzahl der vergangenen Tage, die abgerufen werden sollen", + "LBL_item_numberConsWeekly": "Wochen", + "TTIP_item_numberConsWeekly": "Anzahl der vergangenen Wochen, die abgerufen werden sollen", + "LBL_item_numberConsMonthly": "Monate", + "TTIP_item_numberConsMonthly": "Anzahl der vergangenen Monate, die abgerufen werden sollen", + "LBL_item_numberConsAnnual": "Jahre", + "TTIP_item_numberConsAnnual": "Anzahl der vergangenen Jahre, die abgerufen werden sollen", + "LBL_feedDataDetailHeader": "Wählen Sie alle Felder aus, die Sie in die Live-Feed-Daten laden möchten (Leistung und Zeitstempel sind standardmäßig aktiviert):", + "LBL_phases": "Spannungs- und Stromwerte – Bei mehreren Messgeräten sind diese Werte möglicherweise nicht im Datenrahmen enthalten, was möglicherweise zu Nullwerten führt. Abhängig von der spezifischen Firmware des Messgeräts können weitere Abweichungen auftreten. Nullwerte generieren keinen Status in Ihren ioBroker-Objekten.", + "LBL_helpLink": "Adapterdokumentation anzeigen", + "LBL_CalculatorTab": "Rechnereinstellungen", + "LBL_UseCalculator": "Verwenden Sie Automatisierungsrechnerkanäle", + "LBL_CalculatorList": "Rechnerkanäle", + "LBL_item_chHomeID": "Wählen Sie Kanal-Home-ID", + "TTIP_item_chHomeID": "Wählen Sie das Haus aus, dem dieser Kanal zugeordnet werden soll.", + "LBL_item_chType": "Kanaltyp", + "TTIP_item_chType": "Wählen Sie den Operationstyp für den Kanal aus.", + "LBL_item_chType_option_1": "beste Kosten", + "LBL_item_chType_option_2": "beste Einzelstunden", + "LBL_item_chType_option_3": "Bester Stundenblock", + "LBL_item_chType_option_4": "Bester Kosten-LTF", + "LBL_item_chType_option_5": "beste Einzelstunden LTF", + "LBL_item_chType_option_6": "Beste Stunden blockieren LTF", + "LBL_item_chType_option_7": "intelligenter Batteriepuffer", + "LBL_item_chName": "Kanalname", + "TTIP_item_chName": "Kanalname, um Ihre Bundesstaaten leichter identifizieren zu können.", + "LBL_item_chTargetState": "Zielzustand", + "TTIP_item_chTargetState": "Wählen Sie den Zielausgangszustand für diesen Kanal aus. Wenn keine angegeben wird, wird eine im Channel-Ordner erstellt.", + "LBL_item_chValueOn": "Wert JA", + "TTIP_item_chValueOn": "Die in den Ausgabezustand zu schreibenden Werte können als „Wert JA“ und „Wert NEIN“ definiert werden, beispielsweise „wahr“ für boolesche Zustände oder eine zu schreibende Zahl oder ein zu schreibender Text.", + "LBL_item_chValueOff": "Wert NEIN", + "TTIP_item_chValueOff": "Die in den Ausgabezustand zu schreibenden Werte können als „Wert JA“ und „Wert NEIN“ definiert werden, beispielsweise „wahr“ für boolesche Zustände oder eine zu schreibende Zahl oder ein zu schreibender Text.", + "LBL_item_chTargetState2": "Zielzustand 2", + "TTIP_item_chTargetState2": "Wählen Sie den zweiten Zielausgangszustand für diesen Kanal. Wenn keine angegeben wird, wird im Channel-Ordner ein neues erstellt.", + "LBL_item_chValueOn2": "Wert JA 2", + "TTIP_item_chValueOn2": "Die in den zweiten Ausgabezustand zu schreibenden Werte können als „Wert JA 2“ und „Wert NEIN 2“ definiert werden, beispielsweise „wahr“ für boolesche Zustände oder eine zu schreibende Zahl oder ein zu schreibender Text.", + "LBL_item_chValueOff2": "Wert NEIN 2", + "TTIP_item_chValueOff2": "Die in den zweiten Ausgabezustand zu schreibenden Werte können als „Wert JA 2“ und „Wert NEIN 2“ definiert werden, beispielsweise „wahr“ für boolesche Zustände oder eine zu schreibende Zahl oder ein zu schreibender Text.", + "LBL_calculatorhelp1": "Kanäle können basierend auf einem entsprechenden benannten Status aktiviert oder deaktiviert werden.", + "LBL_calculatorhelp2": "Alle Zustände eines Rechnerkanals werden in der Nähe der Heimatzustände positioniert und mit der Kanalnummer gekennzeichnet.", + "LBL_calculatorhelp3": "Das Verhalten eines Kanals wird durch seinen Typ bestimmt: „Beste Kosten“, „Beste Einzelstunden“, „Bester Stundenblock“ oder „Intelligenter Batteriepuffer“.", + "LBL_calculatorhelp4": "Jeder Kanal stellt als Ausgang einen externen Zustand zur Verfügung, der im Reiter „Einstellungen“ ausgewählt werden kann. Dieser Status könnte beispielsweise „0_userdata.0.example_state“ oder ein anderer beschreibbarer externer Status sein.", + "LBL_calculatorhelp5": "Wenn kein externer Ausgangszustand ausgewählt ist, wird ein interner Zustand innerhalb des Kanalbereichs generiert.", + "LBL_calculatorhelp6": "Die in den Ausgabezustand zu schreibenden Werte können als „Wert JA“ und „Wert NEIN“ definiert werden, beispielsweise „wahr“ für boolesche Zustände oder eine zu schreibende Zahl oder ein zu schreibender Text.", + "LBL_calculatorhelp7": "Ausgaben: Die folgenden Ausgabeparameter sind definiert:", + "LBL_calculatorhelp8": "„Beste Kosten“: Verwendet das „TriggerPrice“-Objekt als Eingabe und generiert jede Stunde eine „YES“-Ausgabe, wenn die aktuellen Tibber-Energiekosten unter dem Triggerpreis liegen.", + "LBL_calculatorhelp9": "„Beste einzelne Stunden“: Erzeugt während der günstigsten Stunden eine „JA“-Ausgabe mit der im „AmountHours“-Objekt definierten Stundenzahl.", + "LBL_calculatorhelp10": "„Bester Stundenblock“: Gibt „JA“ während des kostengünstigsten Stundenblocks aus, mit der im „AmountHours“-Objekt angegebenen Dauer.", + "LBL_calculatorhelp11": "„Beste Kosten LTF“: „Beste Kosten“ innerhalb eines begrenzten Zeitrahmens (LTF).", + "LBL_calculatorhelp12": "„Beste Einzelstunden LTF“: „Beste Einzelstunden“ innerhalb eines begrenzten Zeitrahmens (LTF).", + "LBL_calculatorhelp13": "„Beste Stunden-Block LTF“: „Beste Stunden-Block“ innerhalb eines begrenzten Zeitrahmens (LTF)", + "LBL_calculatorhelp14": "„Smart Battery Buffer“: Verwendet den Parameter „EfficiencyLoss“, um den Effizienzverlust des Batteriesystems anzugeben. Der Parameter „AmountHours“ definiert die gewünschte Stundenzahl für die Batterieladung. Der Rechner aktiviert während der angegebenen „AmountHours“ der günstigsten Stunden die Batterieladung ('Wert JA') und deaktiviert die Batteriespeisung ('Wert 2 NEIN'). Umgekehrt wird in den Stunden mit den höchsten Kosten die Batterieladung deaktiviert („Wert NEIN“) und die Batteriespeisung aktiviert („Wert 2 JA“), sofern die Kosten den höchsten Gesamtpreis unter den günstigsten Stunden übersteigen. Während der restlichen Normalstunden, in denen eine Energiepufferung durch die Batterie wirtschaftlich nicht sinnvoll ist, werden beide Ausgänge abgeschaltet.", + "LBL_calculatorhelp15": "LTF-Kanäle: Diese funktionieren ähnlich wie Standardkanäle, sind jedoch nur innerhalb eines durch die Statusobjekte „StartTime“ und „StopTime“ definierten Zeitrahmens aktiv. Nach „StopTime“ wird der Kanal automatisch deaktiviert. „StartTime“ und „StopTime“ können sich über zwei Kalendertage erstrecken, da Tibber keine Daten über ein 48-Stunden-Fenster hinaus bereitstellt. Beide Zustände erfordern eine Datums-/Uhrzeitzeichenfolge im ISO-8601-Format mit einem Zeitzonenversatz, z. B. „2024-12-24T18:00:00.000+01:00“.", + "LBL_calculatorhelp16": "Darüber hinaus enthalten die LTF-Kanäle einen neuen Statusparameter namens „RepeatDays“, der standardmäßig 0 ist. Wenn „RepeatDays“ auf eine positive Ganzzahl gesetzt ist, wiederholt der Kanal seinen Zyklus, indem er sowohl „StartTime“ als auch „StopTime“ um die angegebene Zahl erhöht Tage nach Erreichen von „StopTime“. Setzen Sie beispielsweise „RepeatDays“ für eine tägliche Wiederholung auf 1.", + "LBL_SpecialsTab": "Spezielle Einstellungen", + "LBL_UseObsoleteStats": "Veralteten API-Aufruf für historische Verbrauchsdaten verwenden – vorsichtig vorgehen!", + "LBL_specialshelp1": "Ruft auch TotalCost-Werte ab, einschließlich spezieller Netzgebühren in Deutschland. Bitte überprüfen Sie die Werte mit denen, die in Ihrer Tibber-App angezeigt werden.", + "LBL_LocalPulseTab": "Einstellungen für die lokale Pulsumfrage", + "LBL_item_UseLocalPulseData": "Verwenden Sie die direkte Abfrage lokaler Tibber-Impulse – seien Sie vorsichtig!", + "LBL_item_localpulsehelp1": "Verwenden Sie Ihre Tibber Bridge(s), um Daten direkt lokal von Ihren Tibber Pulse-Modul(en) abzufragen.", + "LBL_item_localpulsehelp2": "Damit es funktioniert, müssen Sie die Weboberfläche der Bridge so ändern, dass sie dauerhaft aktiviert bleibt.", + "LBL_item_localpulsehelp3": "marq24 hat hier eine hervorragende Beschreibung für seine Home Assistant-Integration bereitgestellt:", + "LBL_item_localpulsehelp4": "https://github.com/marq24/ha-tibber-pulse-local", + "LBL_PulseList": "Local Pulse zum Abfragen von Daten von:", + "LBL_item_tibberBridgeUrl": "Bridge-Netzwerkadresse", + "TTIP_item_tibberBridgeUrl": "Name Ihrer Bridge oder ihre IP-Adresse (standardmäßig „tibber-host“).", + "LBL_item_tibberBridgePassword": "Bridge-Passwort", + "TTIP_item_tibberBridgePassword": "Das Passwort für Ihre lokale Tibber Bridge, wie auf der Hardware angegeben.", + "LBL_item_tibberPulseLocalNodeId": "Pulse NodeID", + "TTIP_item_tibberPulseLocalNodeId": "Die Knoten-ID, unter der Ihr Pulse auf der Bridge registriert ist.", + "LBL_item_tibberBridgeRawDataInterval": "Abfrageintervall", + "TTIP_item_tibberBridgeRawDataInterval": "Das Intervall (in Millisekunden) für die Abfrage Ihrer Bridge nach Pulse-Daten." +} diff --git a/admin/i18n/en.json b/admin/i18n/en.json deleted file mode 100644 index 9275cc5f..00000000 --- a/admin/i18n/en.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "s_Active": "Active" -} diff --git a/admin/i18n/en/translations.json b/admin/i18n/en/translations.json new file mode 100644 index 00000000..8cc9f01a --- /dev/null +++ b/admin/i18n/en/translations.json @@ -0,0 +1,92 @@ +{ + "LBL_StandardTab": "Standard Settings", + "LBL_TibberAPIToken": "Tibber API Token", + "LBL_referralLink": "If you're not yet a Tibber user, I would greatly appreciate it if you could use my referral link.", + "LBL_HomesList": "Configuration of Pulse Live Data Streams", + "LBL_item_homeID": "Tibber Home", + "TTIP_item_homeID": "The home ID of this Tibber home", + "LBL_item_priceDataPollActive": "Use Tibber Price Data Poll", + "TTIP_item_priceDataPollActive": "Use Tibber price data poll", + "LBL_item_feedActive": "Use Tibber Pulse Feed", + "TTIP_item_feedActive": "Use Tibber Pulse feed for live consumption data", + "LBL_item_statsActive": "Retrieve historical consumption data", + "TTIP_item_statsActive": "Retrieve historical consumption data for this home", + "LBL_item_numberConsHourly": "Hours", + "TTIP_item_numberConsHourly": "Number of past hours to be retrieved", + "LBL_item_numberConsDaily": "Days", + "TTIP_item_numberConsDaily": "Number of past days to be retrieved", + "LBL_item_numberConsWeekly": "Weeks", + "TTIP_item_numberConsWeekly": "Number of past weeks to be retrieved", + "LBL_item_numberConsMonthly": "Months", + "TTIP_item_numberConsMonthly": "Number of past months to be retrieved", + "LBL_item_numberConsAnnual": "Years", + "TTIP_item_numberConsAnnual": "Number of past years to be retrieved", + "LBL_feedDataDetailHeader": "Select all fields you want to load in the live-feed data (power and timestamp are enabled by default):", + "LBL_phases": "Voltage and current values - In the case of multiple meters, these values may not be included in the data frame, potentially resulting in null values. Other deviations may occur depending on the specific firmware of the meter. Null values will not generate a state in your ioBroker objects.", + "LBL_helpLink": "Show adapter documentation", + + "LBL_CalculatorTab": "Calculator Settings", + "LBL_UseCalculator": "Use automation calculator channels", + "LBL_CalculatorList": "Calculator Channels", + "LBL_item_chHomeID": "Select Channel Home ID", + "TTIP_item_chHomeID": "Select the home to which this channel should be attached.", + "LBL_item_chType": "Channel Type", + "TTIP_item_chType": "Select the operation type for the channel.", + "LBL_item_chType_option_1": "best cost", + "LBL_item_chType_option_2": "best single hours", + "LBL_item_chType_option_3": "best hours block", + "LBL_item_chType_option_4": "best cost LTF", + "LBL_item_chType_option_5": "best single hours LTF", + "LBL_item_chType_option_6": "best hours block LTF", + "LBL_item_chType_option_7": "smart battery buffer", + "LBL_item_chName": "Channel Name", + "TTIP_item_chName": "Channel name to help identify your states more easily.", + "LBL_item_chTargetState": "Target State", + "TTIP_item_chTargetState": "Select the target output state for this channel. If none is provided, one will be created within the Channel folder.", + "LBL_item_chValueOn": "Value YES", + "TTIP_item_chValueOn": "The values to be written to the output state can be defined as 'value YES' and 'value NO', for example, 'true' for boolean states, or a number or text to be written.", + "LBL_item_chValueOff": "Value NO", + "TTIP_item_chValueOff": "The values to be written to the output state can be defined as 'value YES' and 'value NO', for example, 'true' for boolean states, or a number or text to be written.", + "LBL_item_chTargetState2": "Target State 2", + "TTIP_item_chTargetState2": "Select the second target output state for this channel. If none is provided, a new one will be created within the Channel folder.", + "LBL_item_chValueOn2": "Value YES 2", + "TTIP_item_chValueOn2": "The values to be written to the second output state can be defined as 'value YES 2' and 'value NO 2', for example, 'true' for boolean states, or a number or text to be written.", + "LBL_item_chValueOff2": "Value NO 2", + "TTIP_item_chValueOff2": "The values to be written to the second output state can be defined as 'value YES 2' and 'value NO 2', for example, 'true' for boolean states, or a number or text to be written.", + "LBL_calculatorhelp1": "Channels can be activated or deactivated based on a corresponding named state.", + "LBL_calculatorhelp2": "All states of a calculator channel are positioned near the home states and are labeled with the channel number.", + "LBL_calculatorhelp3": "The behavior of a channel is determined by its type: 'Best Cost,' 'Best Single Hours,' 'Best Hours Block,' or 'Smart Battery Buffer.'", + "LBL_calculatorhelp4": "Each channel provides an external state as output, which can be selected in the settings tab. This state could be, for instance, '0_userdata.0.example_state' or any other writable external state.", + "LBL_calculatorhelp5": "If no external output state is selected, an internal state within the channel's range will be generated.", + "LBL_calculatorhelp6": "The values to be written to the output state can be defined as 'value YES' and 'value NO,' for example, 'true' for boolean states, or a number or text to be written.", + "LBL_calculatorhelp7": "Outputs: The following output parameters are defined:", + "LBL_calculatorhelp8": "'Best cost': Uses the 'TriggerPrice' object as input, generating a 'YES' output every hour when the current Tibber energy cost is below the trigger price.", + "LBL_calculatorhelp9": "'Best single hours': Generates a 'YES' output during the least expensive hours, with the number of hours defined in the 'AmountHours' object.", + "LBL_calculatorhelp10": "'Best hours block': Outputs 'YES' during the most cost-effective block of hours, with the duration specified in the 'AmountHours' object.", + "LBL_calculatorhelp11": "'Best cost LTF': 'Best cost' within a Limited Time Frame (LTF).", + "LBL_calculatorhelp12": "'Best single hours LTF': 'Best single hours' within a Limited Time Frame (LTF).", + "LBL_calculatorhelp13": "'Best hours block LTF': 'Best hours block' within a Limited Time Frame (LTF)", + "LBL_calculatorhelp14": "'Smart Battery Buffer': Utilizes the 'EfficiencyLoss' parameter to specify the efficiency loss of the battery system. The 'AmountHours' parameter defines the desired number of hours for battery charging. The calculator will activate battery charging ('value YES') and deactivate battery feed ('value 2 NO') during the specified 'AmountHours' of the cheapest hours. Conversely, it will deactivate battery charging ('value NO') and activate battery feed ('value 2 YES') during the hours with the highest cost, provided the cost exceeds the highest total price among the cheapest hours. During the remaining normal hours, where energy buffering by the battery is not economically viable, both outputs will be turned off.", + "LBL_calculatorhelp15": "LTF channels: These function similarly to standard channels but are active only within a time frame defined by the 'StartTime' and 'StopTime' state objects. After 'StopTime,' the channel automatically deactivates. 'StartTime' and 'StopTime' can span two calendar days, as Tibber does not provide data beyond a 48-hour window. Both states require a date-time string in ISO-8601 format with a timezone offset, e.g., '2024-12-24T18:00:00.000+01:00'.", + "LBL_calculatorhelp16": "Additionally, the LTF channels include a new state parameter called 'RepeatDays,' which defaults to 0. When 'RepeatDays' is set to a positive integer, the channel repeats its cycle by incrementing both 'StartTime' and 'StopTime' by the specified number of days after 'StopTime' is reached. For example, set 'RepeatDays' to 1 for daily repetition.", + + "LBL_SpecialsTab": "Special Settings", + "LBL_UseObsoleteStats": "Use obsolete API call for historical consumption data - proceed with caution!", + "LBL_specialshelp1": "Also retrieves TotalCost values, including special grid fees in Germany. Please verify the values with those shown in your Tibber app.", + + "LBL_LocalPulseTab": "Local Pulse Poll Settings", + "LBL_item_UseLocalPulseData": "Use direct polling of local Tibber Pulse(s) - proceed with caution!", + "LBL_item_localpulsehelp1": "Use your Tibber Bridge(s) to directly poll data from your Tibber Pulse module(s) locally.", + "LBL_item_localpulsehelp2": "To make it work, you need to modify the Bridge's web interface to keep it permanently enabled.", + "LBL_item_localpulsehelp3": "marq24 has provided an excellent description of how to do this for his Home Assistant integration here:", + "LBL_item_localpulsehelp4": "https://github.com/marq24/ha-tibber-pulse-local", + "LBL_PulseList": "Local Pulse to poll data from:", + "LBL_item_tibberBridgeUrl": "Bridge Network Address", + "TTIP_item_tibberBridgeUrl": "Name of your Bridge or its IP address (defaults to 'tibber-host').", + "LBL_item_tibberBridgePassword": "Bridge password", + "TTIP_item_tibberBridgePassword": "The password for your local Tibber Bridge, as provided on the hardware.", + "LBL_item_tibberPulseLocalNodeId": "Pulse NodeID", + "TTIP_item_tibberPulseLocalNodeId": "The node ID where your Pulse is registered on the Bridge.", + "LBL_item_tibberBridgeRawDataInterval": "Poll interval", + "TTIP_item_tibberBridgeRawDataInterval": "The interval, in milliseconds, for polling your Bridge for Pulse data." +} diff --git a/admin/i18n/es.json b/admin/i18n/es.json deleted file mode 100644 index aca8bef8..00000000 --- a/admin/i18n/es.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "s_Active": "Activo" -} diff --git a/admin/i18n/es/translations.json b/admin/i18n/es/translations.json new file mode 100644 index 00000000..80f5e8f6 --- /dev/null +++ b/admin/i18n/es/translations.json @@ -0,0 +1,89 @@ +{ + "LBL_StandardTab": "Configuración estándar", + "LBL_TibberAPIToken": "Token API de Tibber", + "LBL_referralLink": "Si aún no eres usuario de Tibber, te agradecería mucho que pudieras utilizar mi enlace de referencia.", + "LBL_HomesList": "Configuración de transmisiones de datos en vivo de Pulse", + "LBL_item_homeID": "Casa Tibber", + "TTIP_item_homeID": "El ID de esta casa de Tibber", + "LBL_item_priceDataPollActive": "Utilice la encuesta de datos de precios de Tibber", + "TTIP_item_priceDataPollActive": "Utilice la encuesta de datos de precios de Tibber", + "LBL_item_feedActive": "Utilice la alimentación por pulsos de Tibber", + "TTIP_item_feedActive": "Utilice el feed Tibber Pulse para obtener datos de consumo en vivo", + "LBL_item_statsActive": "Recuperar datos históricos de consumo", + "TTIP_item_statsActive": "Recuperar datos históricos de consumo de esta vivienda.", + "LBL_item_numberConsHourly": "Horas", + "TTIP_item_numberConsHourly": "Número de horas pasadas que se recuperarán", + "LBL_item_numberConsDaily": "Días", + "TTIP_item_numberConsDaily": "Número de días pasados ​​que se recuperarán", + "LBL_item_numberConsWeekly": "Semanas", + "TTIP_item_numberConsWeekly": "Número de semanas pasadas que se recuperarán", + "LBL_item_numberConsMonthly": "Meses", + "TTIP_item_numberConsMonthly": "Número de meses anteriores que se recuperarán", + "LBL_item_numberConsAnnual": "Años", + "TTIP_item_numberConsAnnual": "Número de años anteriores que se recuperarán", + "LBL_feedDataDetailHeader": "Seleccione todos los campos que desea cargar en los datos de transmisión en vivo (la energía y la marca de tiempo están habilitadas de forma predeterminada):", + "LBL_phases": "Valores de voltaje y corriente: en el caso de varios medidores, es posible que estos valores no se incluyan en el marco de datos, lo que podría generar valores nulos. Pueden ocurrir otras desviaciones dependiendo del firmware específico del medidor. Los valores nulos no generarán un estado en sus objetos ioBroker.", + "LBL_helpLink": "Mostrar documentación del adaptador", + "LBL_CalculatorTab": "Configuración de la calculadora", + "LBL_UseCalculator": "Utilice canales de calculadora de automatización", + "LBL_CalculatorList": "Canales de calculadora", + "LBL_item_chHomeID": "Seleccionar ID de inicio del canal", + "TTIP_item_chHomeID": "Seleccione la casa a la que se debe adjuntar este canal.", + "LBL_item_chType": "Tipo de canal", + "TTIP_item_chType": "Seleccione el tipo de operación para el canal.", + "LBL_item_chType_option_1": "mejor costo", + "LBL_item_chType_option_2": "mejores horas individuales", + "LBL_item_chType_option_3": "bloque de mejores horas", + "LBL_item_chType_option_4": "mejor costo LTF", + "LBL_item_chType_option_5": "mejores horas individuales LTF", + "LBL_item_chType_option_6": "bloque de mejores horas LTF", + "LBL_item_chType_option_7": "buffer de batería inteligente", + "LBL_item_chName": "Nombre del canal", + "TTIP_item_chName": "Nombre del canal para ayudar a identificar sus estados más fácilmente.", + "LBL_item_chTargetState": "Estado objetivo", + "TTIP_item_chTargetState": "Seleccione el estado de salida objetivo para este canal. Si no se proporciona ninguno, se creará uno dentro de la carpeta del Canal.", + "LBL_item_chValueOn": "Valor SI", + "TTIP_item_chValueOn": "Los valores que se escribirán en el estado de salida se pueden definir como 'valor SÍ' y 'valor NO', por ejemplo, 'verdadero' para estados booleanos, o un número o texto a escribir.", + "LBL_item_chValueOff": "Valor NO", + "TTIP_item_chValueOff": "Los valores que se escribirán en el estado de salida se pueden definir como 'valor SÍ' y 'valor NO', por ejemplo, 'verdadero' para estados booleanos, o un número o texto a escribir.", + "LBL_item_chTargetState2": "Estado objetivo 2", + "TTIP_item_chTargetState2": "Seleccione el segundo estado de salida objetivo para este canal. Si no se proporciona ninguno, se creará uno nuevo dentro de la carpeta del Canal.", + "LBL_item_chValueOn2": "Valor SÍ 2", + "TTIP_item_chValueOn2": "Los valores que se escribirán en el segundo estado de salida se pueden definir como 'valor SÍ 2' y 'valor NO 2', por ejemplo, 'verdadero' para estados booleanos, o un número o texto a escribir.", + "LBL_item_chValueOff2": "Valor NO 2", + "TTIP_item_chValueOff2": "Los valores que se escribirán en el segundo estado de salida se pueden definir como 'valor SÍ 2' y 'valor NO 2', por ejemplo, 'verdadero' para estados booleanos, o un número o texto a escribir.", + "LBL_calculatorhelp1": "Los canales se pueden activar o desactivar según el estado con nombre correspondiente.", + "LBL_calculatorhelp2": "Todos los estados de un canal de calculadora están ubicados cerca de los estados de origen y están etiquetados con el número de canal.", + "LBL_calculatorhelp3": "El comportamiento de un canal está determinado por su tipo: \"Mejor costo\", \"Mejores horas individuales\", \"Mejor bloque de horas\" o \"Búfer de batería inteligente\".", + "LBL_calculatorhelp4": "Cada canal proporciona un estado externo como salida, que se puede seleccionar en la pestaña de configuración. Este estado podría ser, por ejemplo, '0_userdata.0.example_state' o cualquier otro estado externo grabable.", + "LBL_calculatorhelp5": "Si no se selecciona ningún estado de salida externo, se generará un estado interno dentro del rango del canal.", + "LBL_calculatorhelp6": "Los valores que se escribirán en el estado de salida se pueden definir como 'valor SÍ' y 'valor NO', por ejemplo, 'verdadero' para estados booleanos, o un número o texto que se escribirá.", + "LBL_calculatorhelp7": "Salidas: Se definen los siguientes parámetros de salida:", + "LBL_calculatorhelp8": "'Mejor costo': utiliza el objeto 'TriggerPrice' como entrada, generando una salida 'SÍ' cada hora cuando el costo actual de energía de Tibber está por debajo del precio de activación.", + "LBL_calculatorhelp9": "'Mejores horas individuales': Genera una salida 'SÍ' durante las horas menos costosas, con el número de horas definido en el objeto 'AmountHours'.", + "LBL_calculatorhelp10": "'Mejor bloque de horas': genera 'SÍ' durante el bloque de horas más rentable, con la duración especificada en el objeto 'AmountHours'.", + "LBL_calculatorhelp11": "'Mejor costo LTF': 'Mejor costo' dentro de un marco de tiempo limitado (LTF).", + "LBL_calculatorhelp12": "'Mejores horas individuales LTF': 'Mejores horas individuales' dentro de un período de tiempo limitado (LTF).", + "LBL_calculatorhelp13": "'Bloque de mejores horas LTF': 'Bloque de mejores horas' dentro de un marco de tiempo limitado (LTF)", + "LBL_calculatorhelp14": "'Smart Battery Buffer': utiliza el parámetro 'EfficiencyLoss' para especificar la pérdida de eficiencia del sistema de batería. El parámetro 'AmountHours' define el número deseado de horas para cargar la batería. La calculadora activará la carga de la batería ('valor SÍ') y desactivará la alimentación de la batería ('valor 2 NO') durante las 'Cantidad de Horas' especificadas de las horas más baratas. Por el contrario, desactivará la carga de baterías ('valor NO') y activará la alimentación de baterías ('valor 2 SI') durante las horas de mayor coste, siempre que el coste supere el precio total más alto entre las horas más económicas. Durante las horas normales restantes, cuando el almacenamiento de energía mediante la batería no sea económicamente viable, ambas salidas estarán apagadas.", + "LBL_calculatorhelp15": "Canales LTF: Estos funcionan de manera similar a los canales estándar, pero están activos solo dentro de un período de tiempo definido por los objetos de estado 'StartTime' y 'StopTime'. Después de 'StopTime', el canal se desactiva automáticamente. 'StartTime' y 'StopTime' pueden abarcar dos días naturales, ya que Tibber no proporciona datos más allá de un período de 48 horas. Ambos estados requieren una cadena de fecha y hora en formato ISO-8601 con un desplazamiento de zona horaria, por ejemplo, '2024-12-24T18:00:00.000+01:00'.", + "LBL_calculatorhelp16": "Además, los canales LTF incluyen un nuevo parámetro de estado llamado 'RepeatDays', que por defecto es 0. Cuando 'RepeatDays' se establece en un número entero positivo, el canal repite su ciclo incrementando tanto 'StartTime' como 'StopTime' en el número especificado. de días después de alcanzar el 'StopTime'. Por ejemplo, establezca 'RepeatDays' en 1 para la repetición diaria.", + "LBL_SpecialsTab": "Configuraciones especiales", + "LBL_UseObsoleteStats": "Utilice una llamada API obsoleta para obtener datos de consumo históricos: ¡proceda con precaución!", + "LBL_specialshelp1": "También recupera los valores de TotalCost, incluidas las tarifas especiales de la red en Alemania. Verifique los valores con los que se muestran en su aplicación Tibber.", + "LBL_LocalPulseTab": "Configuración de sondeo de pulso local", + "LBL_item_UseLocalPulseData": "Utilice el sondeo directo de los Tibber Pulse locales. ¡Proceda con precaución!", + "LBL_item_localpulsehelp1": "Utilice su(s) puente(s) Tibber para sondear directamente los datos de su(s) módulo(s) Tibber Pulse localmente.", + "LBL_item_localpulsehelp2": "Para que funcione, debe modificar la interfaz web de Bridge para mantenerla habilitada permanentemente.", + "LBL_item_localpulsehelp3": "marq24 ha proporcionado una excelente descripción de cómo hacer esto para la integración de Home Assistant aquí:", + "LBL_item_localpulsehelp4": "https://github.com/marq24/ha-tibber-pulse-local", + "LBL_PulseList": "Pulso local para sondear datos de:", + "LBL_item_tibberBridgeUrl": "Dirección de red del puente", + "TTIP_item_tibberBridgeUrl": "Nombre de su Bridge o su dirección IP (el valor predeterminado es 'tibber-host').", + "LBL_item_tibberBridgePassword": "Contraseña del puente", + "TTIP_item_tibberBridgePassword": "La contraseña de su Tibber Bridge local, tal como se proporciona en el hardware.", + "LBL_item_tibberPulseLocalNodeId": "ID de nodo de pulso", + "TTIP_item_tibberPulseLocalNodeId": "El ID del nodo donde está registrado su Pulse en el Bridge.", + "LBL_item_tibberBridgeRawDataInterval": "Intervalo de encuesta", + "TTIP_item_tibberBridgeRawDataInterval": "El intervalo, en milisegundos, para sondear los datos de Bridge for Pulse." +} diff --git a/admin/i18n/fr.json b/admin/i18n/fr.json deleted file mode 100644 index 6af44fc8..00000000 --- a/admin/i18n/fr.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "s_Active": "Actif" -} diff --git a/admin/i18n/fr/translations.json b/admin/i18n/fr/translations.json new file mode 100644 index 00000000..6cca5517 --- /dev/null +++ b/admin/i18n/fr/translations.json @@ -0,0 +1,89 @@ +{ + "LBL_StandardTab": "Paramètres standards", + "LBL_TibberAPIToken": "Jeton API Tibber", + "LBL_referralLink": "Si vous n'êtes pas encore un utilisateur de Tibber, j'apprécierais grandement que vous puissiez utiliser mon lien de parrainage.", + "LBL_HomesList": "Configuration des flux de données Pulse Live", + "LBL_item_homeID": "Accueil Tibber", + "TTIP_item_homeID": "L'identifiant de cette maison Tibber", + "LBL_item_priceDataPollActive": "Utiliser le sondage sur les données sur les prix Tibber", + "TTIP_item_priceDataPollActive": "Utiliser le sondage sur les données de prix Tibber", + "LBL_item_feedActive": "Utiliser l'alimentation par impulsions Tibber", + "TTIP_item_feedActive": "Utilisez le flux Tibber Pulse pour les données de consommation en direct", + "LBL_item_statsActive": "Récupérer les données historiques de consommation", + "TTIP_item_statsActive": "Récupérer les données historiques de consommation de cette maison", + "LBL_item_numberConsHourly": "Heures", + "TTIP_item_numberConsHourly": "Nombre d'heures passées à récupérer", + "LBL_item_numberConsDaily": "Jours", + "TTIP_item_numberConsDaily": "Nombre de jours passés à récupérer", + "LBL_item_numberConsWeekly": "Semaines", + "TTIP_item_numberConsWeekly": "Nombre de semaines passées à récupérer", + "LBL_item_numberConsMonthly": "Mois", + "TTIP_item_numberConsMonthly": "Nombre de mois passés à récupérer", + "LBL_item_numberConsAnnual": "Années", + "TTIP_item_numberConsAnnual": "Nombre d'années passées à récupérer", + "LBL_feedDataDetailHeader": "Sélectionnez tous les champs que vous souhaitez charger dans les données du flux en direct (la puissance et l'horodatage sont activés par défaut) :", + "LBL_phases": "Valeurs de tension et de courant : dans le cas de plusieurs compteurs, ces valeurs peuvent ne pas être incluses dans la trame de données, ce qui peut entraîner des valeurs nulles. D'autres écarts peuvent survenir en fonction du micrologiciel spécifique du compteur. Les valeurs nulles ne généreront pas d'état dans vos objets ioBroker.", + "LBL_helpLink": "Afficher la documentation de l'adaptateur", + "LBL_CalculatorTab": "Paramètres de la calculatrice", + "LBL_UseCalculator": "Utiliser les canaux du calculateur d'automatisation", + "LBL_CalculatorList": "Canaux de calculatrice", + "LBL_item_chHomeID": "Sélectionnez l'ID d'accueil de la chaîne", + "TTIP_item_chHomeID": "Sélectionnez la maison à laquelle cette chaîne doit être rattachée.", + "LBL_item_chType": "Type de canal", + "TTIP_item_chType": "Sélectionnez le type d'opération pour le canal.", + "LBL_item_chType_option_1": "meilleur coût", + "LBL_item_chType_option_2": "meilleures heures individuelles", + "LBL_item_chType_option_3": "bloc des meilleures heures", + "LBL_item_chType_option_4": "LTF au meilleur coût", + "LBL_item_chType_option_5": "meilleures heures individuelles LTF", + "LBL_item_chType_option_6": "meilleurs horaires bloc LTF", + "LBL_item_chType_option_7": "tampon de batterie intelligent", + "LBL_item_chName": "Nom de la chaîne", + "TTIP_item_chName": "Nom de la chaîne pour vous aider à identifier plus facilement vos états.", + "LBL_item_chTargetState": "État cible", + "TTIP_item_chTargetState": "Sélectionnez l'état de sortie cible pour ce canal. Si aucun n’est fourni, un sera créé dans le dossier Channel.", + "LBL_item_chValueOn": "Valeur OUI", + "TTIP_item_chValueOn": "Les valeurs à écrire dans l'état de sortie peuvent être définies comme « valeur OUI » et « valeur NON », par exemple « vrai » pour les états booléens, ou un nombre ou un texte à écrire.", + "LBL_item_chValueOff": "Valeur NON", + "TTIP_item_chValueOff": "Les valeurs à écrire dans l'état de sortie peuvent être définies comme « valeur OUI » et « valeur NON », par exemple « vrai » pour les états booléens, ou un nombre ou un texte à écrire.", + "LBL_item_chTargetState2": "État cible 2", + "TTIP_item_chTargetState2": "Sélectionnez le deuxième état de sortie cible pour ce canal. Si aucun n’est fourni, un nouveau sera créé dans le dossier Channel.", + "LBL_item_chValueOn2": "Valeur OUI 2", + "TTIP_item_chValueOn2": "Les valeurs à écrire dans le deuxième état de sortie peuvent être définies comme « valeur OUI 2 » et « valeur NON 2 », par exemple « vrai » pour les états booléens, ou un nombre ou un texte à écrire.", + "LBL_item_chValueOff2": "Valeur NON 2", + "TTIP_item_chValueOff2": "Les valeurs à écrire dans le deuxième état de sortie peuvent être définies comme « valeur OUI 2 » et « valeur NON 2 », par exemple « vrai » pour les états booléens, ou un nombre ou un texte à écrire.", + "LBL_calculatorhelp1": "Les canaux peuvent être activés ou désactivés en fonction d'un état nommé correspondant.", + "LBL_calculatorhelp2": "Tous les états d'un canal de calculatrice sont positionnés à proximité des états d'origine et sont étiquetés avec le numéro de canal.", + "LBL_calculatorhelp3": "Le comportement d'un canal est déterminé par son type : « Meilleur coût », « Meilleures heures individuelles », « Meilleur bloc d'heures » ou « Tampon de batterie intelligent ».", + "LBL_calculatorhelp4": "Chaque canal fournit un état externe en sortie, qui peut être sélectionné dans l'onglet Paramètres. Cet état pourrait être, par exemple, « 0_userdata.0.example_state » ou tout autre état externe accessible en écriture.", + "LBL_calculatorhelp5": "Si aucun état de sortie externe n'est sélectionné, un état interne dans la plage du canal sera généré.", + "LBL_calculatorhelp6": "Les valeurs à écrire dans l'état de sortie peuvent être définies comme « valeur OUI » et « valeur NON », par exemple « vrai » pour les états booléens, ou un nombre ou un texte à écrire.", + "LBL_calculatorhelp7": "Sorties : Les paramètres de sortie suivants sont définis :", + "LBL_calculatorhelp8": "« Meilleur coût » : utilise l'objet « TriggerPrice » comme entrée, générant une sortie « OUI » toutes les heures lorsque le coût énergétique actuel de Tibber est inférieur au prix de déclenchement.", + "LBL_calculatorhelp9": "'Meilleures heures individuelles' : Génère une sortie 'OUI' pendant les heures les moins chères, avec le nombre d'heures défini dans l'objet 'AmountHours'.", + "LBL_calculatorhelp10": "« Meilleur bloc d'heures » : affiche « OUI » pendant le bloc d'heures le plus rentable, avec la durée spécifiée dans l'objet « AmountHours ».", + "LBL_calculatorhelp11": "« Meilleur coût LTF » : « Meilleur coût » dans un délai limité (LTF).", + "LBL_calculatorhelp12": "« Meilleures heures individuelles LTF » : « Meilleures heures individuelles » dans une période limitée (LTF).", + "LBL_calculatorhelp13": "« Meilleurs blocs d'heures LTF » : « Meilleurs blocs d'heures » dans une période limitée (LTF)", + "LBL_calculatorhelp14": "« Smart Battery Buffer » : utilise le paramètre « EfficiencyLoss » pour spécifier la perte d'efficacité du système de batterie. Le paramètre 'AmountHours' définit le nombre d'heures souhaité pour la charge de la batterie. La calculatrice activera la charge de la batterie (« valeur OUI ») et désactivera l'alimentation de la batterie (« valeur 2 NON ») pendant la « quantité d'heures » spécifiée des heures les moins chères. À l'inverse, il désactivera la charge de la batterie (« valeur NON ») et activera l'alimentation de la batterie (« valeur 2 OUI ») pendant les heures où le coût est le plus élevé, à condition que le coût dépasse le prix total le plus élevé parmi les heures les moins chères. Pendant les heures normales restantes, où la mise en mémoire tampon de l'énergie par la batterie n'est pas économiquement viable, les deux sorties seront désactivées.", + "LBL_calculatorhelp15": "Canaux LTF : ceux-ci fonctionnent de manière similaire aux canaux standard mais ne sont actifs que dans un laps de temps défini par les objets d'état 'StartTime' et 'StopTime'. Après « StopTime », la chaîne se désactive automatiquement. « StartTime » et « StopTime » peuvent s'étendre sur deux jours calendaires, car Tibber ne fournit pas de données au-delà d'une fenêtre de 48 heures. Les deux États nécessitent une chaîne date-heure au format ISO-8601 avec un décalage de fuseau horaire, par exemple « 2024-12-24T18:00:00.000+01:00 ».", + "LBL_calculatorhelp16": "De plus, les canaux LTF incluent un nouveau paramètre d'état appelé « RepeatDays », dont la valeur par défaut est 0. Lorsque « RepeatDays » est défini sur un nombre entier positif, le canal répète son cycle en incrémentant à la fois « StartTime » et « StopTime » du nombre spécifié. de jours après que « StopTime » soit atteint. Par exemple, définissez « RepeatDays » sur 1 pour une répétition quotidienne.", + "LBL_SpecialsTab": "Paramètres spéciaux", + "LBL_UseObsoleteStats": "Utilisez un appel API obsolète pour les données de consommation historiques - procédez avec prudence !", + "LBL_specialshelp1": "Récupère également les valeurs TotalCost, y compris les frais de réseau spéciaux en Allemagne. Veuillez vérifier les valeurs avec celles affichées dans votre application Tibber.", + "LBL_LocalPulseTab": "Paramètres de sondage local", + "LBL_item_UseLocalPulseData": "Utilisez l'interrogation directe des Tibber Pulse(s) locaux - procédez avec prudence !", + "LBL_item_localpulsehelp1": "Utilisez votre ou vos ponts Tibber pour interroger directement les données de votre ou vos modules Tibber Pulse localement.", + "LBL_item_localpulsehelp2": "Pour que cela fonctionne, vous devez modifier l'interface Web du Bridge pour le maintenir activé en permanence.", + "LBL_item_localpulsehelp3": "marq24 a fourni une excellente description de la façon de procéder pour son intégration Home Assistant ici :", + "LBL_item_localpulsehelp4": "https://github.com/marq24/ha-tibber-pulse-local", + "LBL_PulseList": "Local Pulse pour interroger les données de :", + "LBL_item_tibberBridgeUrl": "Adresse du réseau du pont", + "TTIP_item_tibberBridgeUrl": "Nom de votre Bridge ou son adresse IP (par défaut 'tibber-host').", + "LBL_item_tibberBridgePassword": "Mot de passe du pont", + "TTIP_item_tibberBridgePassword": "Le mot de passe de votre Tibber Bridge local, tel qu'indiqué sur le matériel.", + "LBL_item_tibberPulseLocalNodeId": "ID de nœud d'impulsion", + "TTIP_item_tibberPulseLocalNodeId": "L'ID du nœud où votre Pulse est enregistré sur le Bridge.", + "LBL_item_tibberBridgeRawDataInterval": "Intervalle d'interrogation", + "TTIP_item_tibberBridgeRawDataInterval": "L'intervalle, en millisecondes, pour interroger votre Bridge for Pulse." +} diff --git a/admin/i18n/it.json b/admin/i18n/it.json deleted file mode 100644 index 18d5c962..00000000 --- a/admin/i18n/it.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "s_Active": "Attivo" -} diff --git a/admin/i18n/it/translations.json b/admin/i18n/it/translations.json new file mode 100644 index 00000000..b1300dbc --- /dev/null +++ b/admin/i18n/it/translations.json @@ -0,0 +1,89 @@ +{ + "LBL_StandardTab": "Impostazioni standard", + "LBL_TibberAPIToken": "Token API Tibber", + "LBL_referralLink": "Se non sei ancora un utente Tibber, apprezzerei molto se potessi utilizzare il mio link di riferimento.", + "LBL_HomesList": "Configurazione dei flussi di dati in tempo reale", + "LBL_item_homeID": "Casa Tibber", + "TTIP_item_homeID": "L'ID di questa casa di Tibber", + "LBL_item_priceDataPollActive": "Utilizza il sondaggio sui dati sui prezzi di Tibber", + "TTIP_item_priceDataPollActive": "Utilizza il sondaggio sui dati sui prezzi di Tibber", + "LBL_item_feedActive": "Utilizzare l'alimentazione a impulsi Tibber", + "TTIP_item_feedActive": "Utilizza il feed Tibber Pulse per i dati sul consumo in tempo reale", + "LBL_item_statsActive": "Recuperare i dati storici sui consumi", + "TTIP_item_statsActive": "Recupera i dati storici sul consumo di questa casa", + "LBL_item_numberConsHourly": "Ore", + "TTIP_item_numberConsHourly": "Numero di ore passate da recuperare", + "LBL_item_numberConsDaily": "Giorni", + "TTIP_item_numberConsDaily": "Numero di giorni passati da recuperare", + "LBL_item_numberConsWeekly": "Settimane", + "TTIP_item_numberConsWeekly": "Numero di settimane passate da recuperare", + "LBL_item_numberConsMonthly": "Mesi", + "TTIP_item_numberConsMonthly": "Numero di mesi passati da recuperare", + "LBL_item_numberConsAnnual": "Anni", + "TTIP_item_numberConsAnnual": "Numero di anni passati da recuperare", + "LBL_feedDataDetailHeader": "Seleziona tutti i campi che desideri caricare nei dati del feed live (alimentazione e timestamp sono abilitati per impostazione predefinita):", + "LBL_phases": "Valori di tensione e corrente: nel caso di più contatori, questi valori potrebbero non essere inclusi nel frame dati, risultando potenzialmente in valori nulli. Potrebbero verificarsi altre deviazioni a seconda del firmware specifico del misuratore. I valori null non genereranno uno stato nei tuoi oggetti ioBroker.", + "LBL_helpLink": "Mostra la documentazione dell'adattatore", + "LBL_CalculatorTab": "Impostazioni della calcolatrice", + "LBL_UseCalculator": "Utilizza i canali del calcolatore di automazione", + "LBL_CalculatorList": "Canali della calcolatrice", + "LBL_item_chHomeID": "Seleziona ID casa canale", + "TTIP_item_chHomeID": "Seleziona la casa a cui collegare questo canale.", + "LBL_item_chType": "Tipo di canale", + "TTIP_item_chType": "Selezionare il tipo di operazione per il canale.", + "LBL_item_chType_option_1": "miglior costo", + "LBL_item_chType_option_2": "le migliori ore singole", + "LBL_item_chType_option_3": "blocco orari migliori", + "LBL_item_chType_option_4": "miglior costo LTF", + "LBL_item_chType_option_5": "miglior LTF a singola ora", + "LBL_item_chType_option_6": "gli orari migliori bloccano LTF", + "LBL_item_chType_option_7": "buffer intelligente della batteria", + "LBL_item_chName": "Nome del canale", + "TTIP_item_chName": "Nome del canale per identificare più facilmente i tuoi stati.", + "LBL_item_chTargetState": "Stato di destinazione", + "TTIP_item_chTargetState": "Seleziona lo stato di uscita target per questo canale. Se non ne viene fornito nessuno, ne verrà creato uno all'interno della cartella Canale.", + "LBL_item_chValueOn": "Valore SI", + "TTIP_item_chValueOn": "I valori da scrivere nello stato di uscita possono essere definiti come \"valore SI\" e \"valore NO\", ad esempio \"vero\" per gli stati booleani oppure un numero o un testo da scrivere.", + "LBL_item_chValueOff": "Valore NO", + "TTIP_item_chValueOff": "I valori da scrivere nello stato di uscita possono essere definiti come \"valore SI\" e \"valore NO\", ad esempio \"vero\" per gli stati booleani oppure un numero o un testo da scrivere.", + "LBL_item_chTargetState2": "Stato di destinazione 2", + "TTIP_item_chTargetState2": "Selezionare il secondo stato di uscita target per questo canale. Se non ne viene fornito nessuno, ne verrà creato uno nuovo all'interno della cartella Canale.", + "LBL_item_chValueOn2": "Valore SI 2", + "TTIP_item_chValueOn2": "I valori da scrivere nel secondo stato di uscita possono essere definiti come \"valore SI 2\" e \"valore NO 2\", ad esempio \"vero\" per gli stati booleani oppure un numero o un testo da scrivere.", + "LBL_item_chValueOff2": "Valore NO2", + "TTIP_item_chValueOff2": "I valori da scrivere nel secondo stato di uscita possono essere definiti come \"valore SI 2\" e \"valore NO 2\", ad esempio \"vero\" per gli stati booleani oppure un numero o un testo da scrivere.", + "LBL_calculatorhelp1": "I canali possono essere attivati ​​o disattivati ​​in base allo stato denominato corrispondente.", + "LBL_calculatorhelp2": "Tutti gli stati di un canale della calcolatrice sono posizionati vicino agli stati home e sono etichettati con il numero del canale.", + "LBL_calculatorhelp3": "Il comportamento di un canale è determinato dal suo tipo: \"Miglior costo\", \"Migliori ore singole\", \"Miglior blocco di ore\" o \"Buffer batteria intelligente\".", + "LBL_calculatorhelp4": "Ciascun canale fornisce uno stato esterno come uscita, che può essere selezionato nella scheda delle impostazioni. Questo stato potrebbe essere, ad esempio, \"0_userdata.0.example_state\" o qualsiasi altro stato esterno scrivibile.", + "LBL_calculatorhelp5": "Se non viene selezionato nessuno stato di uscita esterna, verrà generato uno stato interno all'interno dell'intervallo del canale.", + "LBL_calculatorhelp6": "I valori da scrivere nello stato di uscita possono essere definiti come \"valore SI\" e \"valore NO\", ad esempio \"vero\" per gli stati booleani oppure un numero o un testo da scrivere.", + "LBL_calculatorhelp7": "Output: sono definiti i seguenti parametri di output:", + "LBL_calculatorhelp8": "'Miglior costo': utilizza l'oggetto 'TriggerPrice' come input, generando un output 'SÌ' ogni ora quando il costo energetico attuale di Tibber è inferiore al prezzo di attivazione.", + "LBL_calculatorhelp9": "'Migliori ore singole': genera un output 'SÌ' durante le ore meno costose, con il numero di ore definito nell'oggetto 'AmountHours'.", + "LBL_calculatorhelp10": "'Blocco di ore migliori': restituisce 'SÌ' durante il blocco di ore più conveniente, con la durata specificata nell'oggetto 'AmountHours'.", + "LBL_calculatorhelp11": "\"Miglior costo LTF\": \"Miglior costo\" entro un intervallo di tempo limitato (LTF).", + "LBL_calculatorhelp12": "\"Migliori ore singole LTF\": \"Migliori ore singole\" in un intervallo di tempo limitato (LTF).", + "LBL_calculatorhelp13": "\"Blocco ore migliori LTF\": \"Blocco ore migliori\" entro un intervallo di tempo limitato (LTF)", + "LBL_calculatorhelp14": "'Smart Battery Buffer': utilizza il parametro 'EfficiencyLoss' per specificare la perdita di efficienza del sistema batteria. Il parametro 'AmountHours' definisce il numero di ore desiderato per la ricarica della batteria. La calcolatrice attiverà la ricarica della batteria ('valore YES') e disattiverà l'alimentazione della batteria ('valore 2 NO') durante le 'AmountHours' specificate delle ore più economiche. Viceversa disattiverà la ricarica della batteria ('valore NO') e attiverà l'alimentazione della batteria ('valore 2 SI') nelle ore con costo più elevato, purché il costo superi il prezzo totale più alto tra le ore più economiche. Durante le restanti ore normali, in cui l'accumulo di energia da parte della batteria non è economicamente sostenibile, entrambe le uscite verranno disattivate.", + "LBL_calculatorhelp15": "Canali LTF: funzionano in modo simile ai canali standard ma sono attivi solo entro un intervallo di tempo definito dagli oggetti di stato \"StartTime\" e \"StopTime\". Dopo \"StopTime\", il canale si disattiva automaticamente. \"StartTime\" e \"StopTime\" possono estendersi su due giorni di calendario, poiché Tibber non fornisce dati oltre una finestra di 48 ore. Entrambi gli stati richiedono una stringa data-ora in formato ISO-8601 con un offset del fuso orario, ad esempio \"2024-12-24T18:00:00.000+01:00\".", + "LBL_calculatorhelp16": "Inoltre, i canali LTF includono un nuovo parametro di stato chiamato \"RepeatDays\", che per impostazione predefinita è 0. Quando \"RepeatDays\" è impostato su un numero intero positivo, il canale ripete il suo ciclo incrementando sia \"StartTime\" che \"StopTime\" del numero specificato di giorni dopo il raggiungimento di 'StopTime'. Ad esempio, imposta \"RepeatDays\" su 1 per la ripetizione quotidiana.", + "LBL_SpecialsTab": "Impostazioni speciali", + "LBL_UseObsoleteStats": "Utilizza la chiamata API obsoleta per i dati storici sul consumo: procedi con cautela!", + "LBL_specialshelp1": "Recupera anche i valori TotalCost, incluse le tariffe di rete speciali in Germania. Verifica i valori con quelli mostrati nella tua app Tibber.", + "LBL_LocalPulseTab": "Impostazioni sondaggio impulso locale", + "LBL_item_UseLocalPulseData": "Utilizzare il polling diretto dei Tibber Pulse locali: procedere con cautela!", + "LBL_item_localpulsehelp1": "Utilizza i tuoi Tibber Bridge per interrogare direttamente i dati dai tuoi moduli Tibber Pulse localmente.", + "LBL_item_localpulsehelp2": "Per farlo funzionare, è necessario modificare l'interfaccia web del Bridge per mantenerlo permanentemente abilitato.", + "LBL_item_localpulsehelp3": "marq24 ha fornito un'eccellente descrizione di come eseguire questa operazione per l'integrazione dell'Home Assistant qui:", + "LBL_item_localpulsehelp4": "https://github.com/marq24/ha-tibber-pulse-local", + "LBL_PulseList": "Impulso locale per interrogare i dati da:", + "LBL_item_tibberBridgeUrl": "Indirizzo di rete del bridge", + "TTIP_item_tibberBridgeUrl": "Nome del tuo Bridge o relativo indirizzo IP (il valore predefinito è \"tibber-host\").", + "LBL_item_tibberBridgePassword": "Parola d'ordine del ponte", + "TTIP_item_tibberBridgePassword": "La password per il tuo Tibber Bridge locale, come fornita sull'hardware.", + "LBL_item_tibberPulseLocalNodeId": "ID nodo impulso", + "TTIP_item_tibberPulseLocalNodeId": "L'ID del nodo in cui è registrato il tuo Pulse sul Bridge.", + "LBL_item_tibberBridgeRawDataInterval": "Intervallo di sondaggio", + "TTIP_item_tibberBridgeRawDataInterval": "L'intervallo, in millisecondi, per il polling dei dati Bridge for Pulse." +} diff --git a/admin/i18n/nl.json b/admin/i18n/nl.json deleted file mode 100644 index 0f91cbca..00000000 --- a/admin/i18n/nl.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "s_Active": "Actief" -} diff --git a/admin/i18n/nl/translations.json b/admin/i18n/nl/translations.json new file mode 100644 index 00000000..273c78fb --- /dev/null +++ b/admin/i18n/nl/translations.json @@ -0,0 +1,89 @@ +{ + "LBL_StandardTab": "Standaard instellingen", + "LBL_TibberAPIToken": "Tibber API-token", + "LBL_referralLink": "Als u nog geen Tibber-gebruiker bent, zou ik het zeer op prijs stellen als u mijn verwijzingslink zou willen gebruiken.", + "LBL_HomesList": "Configuratie van Pulse Live-gegevensstromen", + "LBL_item_homeID": "Tibber Thuis", + "TTIP_item_homeID": "Het huis-ID van dit Tibber-huis", + "LBL_item_priceDataPollActive": "Gebruik Tibber-prijsgegevenspeiling", + "TTIP_item_priceDataPollActive": "Gebruik Tibber-prijsgegevenspeiling", + "LBL_item_feedActive": "Gebruik Tibber Pulsvoer", + "TTIP_item_feedActive": "Gebruik Tibber Pulse feed voor live verbruiksgegevens", + "LBL_item_statsActive": "Historische verbruiksgegevens ophalen", + "TTIP_item_statsActive": "Historische verbruiksgegevens van deze woning opvragen", + "LBL_item_numberConsHourly": "Uur", + "TTIP_item_numberConsHourly": "Aantal afgelopen uren dat moet worden opgehaald", + "LBL_item_numberConsDaily": "Dagen", + "TTIP_item_numberConsDaily": "Aantal afgelopen dagen dat moet worden opgehaald", + "LBL_item_numberConsWeekly": "Weken", + "TTIP_item_numberConsWeekly": "Aantal afgelopen weken dat moet worden opgehaald", + "LBL_item_numberConsMonthly": "Maanden", + "TTIP_item_numberConsMonthly": "Aantal afgelopen maanden dat moet worden opgehaald", + "LBL_item_numberConsAnnual": "Jaren", + "TTIP_item_numberConsAnnual": "Aantal op te halen afgelopen jaren", + "LBL_feedDataDetailHeader": "Selecteer alle velden die u in de livefeedgegevens wilt laden (stroom en tijdstempel zijn standaard ingeschakeld):", + "LBL_phases": "Spannings- en stroomwaarden - In het geval van meerdere meters zijn deze waarden mogelijk niet opgenomen in het dataframe, wat mogelijk resulteert in nulwaarden. Andere afwijkingen kunnen optreden afhankelijk van de specifieke firmware van de meter. Null-waarden genereren geen status in uw ioBroker-objecten.", + "LBL_helpLink": "Adapterdocumentatie tonen", + "LBL_CalculatorTab": "Rekenmachine-instellingen", + "LBL_UseCalculator": "Gebruik automatiseringscalculatorkanalen", + "LBL_CalculatorList": "Rekenmachinekanalen", + "LBL_item_chHomeID": "Selecteer Kanaalhome-ID", + "TTIP_item_chHomeID": "Selecteer het huis waaraan dit kanaal moet worden gekoppeld.", + "LBL_item_chType": "Kanaaltype", + "TTIP_item_chType": "Selecteer het bewerkingstype voor het kanaal.", + "LBL_item_chType_option_1": "beste kosten", + "LBL_item_chType_option_2": "beste enkele uren", + "LBL_item_chType_option_3": "beste urenblok", + "LBL_item_chType_option_4": "beste kosten LTF", + "LBL_item_chType_option_5": "beste enkele uren LTF", + "LBL_item_chType_option_6": "beste urenblok LTF", + "LBL_item_chType_option_7": "slimme batterijbuffer", + "LBL_item_chName": "Kanaalnaam", + "TTIP_item_chName": "Kanaalnaam om uw staten gemakkelijker te identificeren.", + "LBL_item_chTargetState": "Doelstaat", + "TTIP_item_chTargetState": "Selecteer de doeluitgangsstatus voor dit kanaal. Als er geen is opgegeven, wordt er een gemaakt in de map Kanaal.", + "LBL_item_chValueOn": "Waarde JA", + "TTIP_item_chValueOn": "De waarden die naar de uitvoerstatus moeten worden geschreven, kunnen worden gedefinieerd als 'waarde JA' en 'waarde NEE', bijvoorbeeld 'waar' voor Booleaanse toestanden, of een getal of tekst die moet worden geschreven.", + "LBL_item_chValueOff": "Waarde NEE", + "TTIP_item_chValueOff": "De waarden die naar de uitvoerstatus moeten worden geschreven, kunnen worden gedefinieerd als 'waarde JA' en 'waarde NEE', bijvoorbeeld 'waar' voor Booleaanse toestanden, of een getal of tekst die moet worden geschreven.", + "LBL_item_chTargetState2": "Doelstaat 2", + "TTIP_item_chTargetState2": "Selecteer de tweede doeluitgangsstatus voor dit kanaal. Als er geen is opgegeven, wordt er een nieuwe gemaakt in de map Kanaal.", + "LBL_item_chValueOn2": "Waarde JA 2", + "TTIP_item_chValueOn2": "De waarden die naar de tweede uitvoerstatus moeten worden geschreven, kunnen worden gedefinieerd als 'waarde JA 2' en 'waarde NEE 2', bijvoorbeeld 'waar' voor Booleaanse toestanden, of een getal of tekst die moet worden geschreven.", + "LBL_item_chValueOff2": "Waarde NEE 2", + "TTIP_item_chValueOff2": "De waarden die naar de tweede uitvoerstatus moeten worden geschreven, kunnen worden gedefinieerd als 'waarde JA 2' en 'waarde NEE 2', bijvoorbeeld 'waar' voor Booleaanse toestanden, of een getal of tekst die moet worden geschreven.", + "LBL_calculatorhelp1": "Kanalen kunnen worden geactiveerd of gedeactiveerd op basis van een overeenkomstige benoemde status.", + "LBL_calculatorhelp2": "Alle statussen van een rekenmachinekanaal bevinden zich in de buurt van de thuisstatussen en zijn gelabeld met het kanaalnummer.", + "LBL_calculatorhelp3": "Het gedrag van een kanaal wordt bepaald door het type: 'Best Cost', 'Best Single Hours', 'Best Hours Block' of 'Smart Battery Buffer'.", + "LBL_calculatorhelp4": "Elk kanaal biedt een externe status als uitgang, die kan worden geselecteerd op het tabblad Instellingen. Deze status kan bijvoorbeeld '0_userdata.0.example_state' zijn of een andere schrijfbare externe status.", + "LBL_calculatorhelp5": "Als er geen externe uitgangsstatus is geselecteerd, wordt een interne status binnen het bereik van het kanaal gegenereerd.", + "LBL_calculatorhelp6": "De waarden die naar de uitvoerstatus moeten worden geschreven, kunnen worden gedefinieerd als 'waarde JA' en 'waarde NEE', bijvoorbeeld 'waar' voor Booleaanse toestanden, of een getal of tekst die moet worden geschreven.", + "LBL_calculatorhelp7": "Uitvoer: De volgende uitvoerparameters zijn gedefinieerd:", + "LBL_calculatorhelp8": "'Beste kosten': gebruikt het object 'TriggerPrice' als invoer en genereert elk uur een 'JA'-uitvoer wanneer de huidige Tibber-energiekosten lager zijn dan de triggerprijs.", + "LBL_calculatorhelp9": "'Beste enkele uren': Genereert een 'JA'-uitvoer tijdens de minst dure uren, waarbij het aantal uren is gedefinieerd in het object 'AmountHours'.", + "LBL_calculatorhelp10": "'Beste urenblok': Geeft 'JA' weer tijdens het meest kosteneffectieve urenblok, met de duur gespecificeerd in het object 'AmountHours'.", + "LBL_calculatorhelp11": "'Best cost LTF': 'Best cost' binnen een Limited Time Frame (LTF).", + "LBL_calculatorhelp12": "'Beste losse uren LTF': 'Beste losse uren' binnen een Limited Time Frame (LTF).", + "LBL_calculatorhelp13": "'Beste urenblok LTF': 'Beste urenblok' binnen een Limited Time Frame (LTF)", + "LBL_calculatorhelp14": "'Smart Battery Buffer': Gebruikt de parameter 'EfficiencyLoss' om het efficiëntieverlies van het batterijsysteem te specificeren. De parameter 'AmountHours' definieert het gewenste aantal uren voor het opladen van de batterij. De rekenmachine activeert het opladen van de batterij ('waarde JA') en deactiveert de batterijvoeding ('waarde 2 NEE') tijdens de opgegeven 'AmountHours' van de goedkoopste uren. Omgekeerd zal het het opladen van de batterij ('waarde NEE') en het voeden van de batterij ('waarde 2 JA') deactiveren tijdens de uren met de hoogste kosten, op voorwaarde dat de kosten hoger zijn dan de hoogste totaalprijs onder de goedkoopste uren. Tijdens de resterende normale uren, waarin energiebuffering door de batterij economisch niet haalbaar is, worden beide uitgangen uitgeschakeld.", + "LBL_calculatorhelp15": "LTF-kanalen: Deze functioneren op dezelfde manier als standaardkanalen, maar zijn alleen actief binnen een tijdsbestek dat wordt gedefinieerd door de statusobjecten 'StartTime' en 'StopTime'. Na 'StopTime' wordt het kanaal automatisch gedeactiveerd. 'StartTime' en 'StopTime' kunnen twee kalenderdagen bestrijken, omdat Tibber geen gegevens verstrekt buiten een tijdsbestek van 48 uur. Beide statussen vereisen een datum-tijdreeks in ISO-8601-notatie met een tijdzoneverschuiving, bijvoorbeeld '2024-12-24T18:00:00.000+01:00'.", + "LBL_calculatorhelp16": "Bovendien bevatten de LTF-kanalen een nieuwe statusparameter genaamd 'RepeatDays', die standaard op 0 staat. Wanneer 'RepeatDays' is ingesteld op een positief geheel getal, herhaalt het kanaal zijn cyclus door zowel 'StartTime' als 'StopTime' met het opgegeven aantal te verhogen. aantal dagen nadat 'StopTime' is bereikt. Stel 'RepeatDays' bijvoorbeeld in op 1 voor dagelijkse herhaling.", + "LBL_SpecialsTab": "Speciale instellingen", + "LBL_UseObsoleteStats": "Gebruik verouderde API-aanroepen voor historische verbruiksgegevens - ga voorzichtig te werk!", + "LBL_specialshelp1": "Haalt ook TotalCost-waarden op, inclusief speciale nettarieven in Duitsland. Controleer de waarden met de waarden die in uw Tibber-app worden weergegeven.", + "LBL_LocalPulseTab": "Lokale pulspeiling-instellingen", + "LBL_item_UseLocalPulseData": "Gebruik directe peiling van lokale Tibber Pulse(s) - ga voorzichtig te werk!", + "LBL_item_localpulsehelp1": "Gebruik uw Tibber Bridge(s) om rechtstreeks lokaal gegevens van uw Tibber Pulse-module(s) op te vragen.", + "LBL_item_localpulsehelp2": "Om het te laten werken, moet u de webinterface van Bridge aanpassen zodat deze permanent ingeschakeld blijft.", + "LBL_item_localpulsehelp3": "marq24 heeft hier een uitstekende beschrijving gegeven van hoe dit te doen voor zijn Home Assistant-integratie:", + "LBL_item_localpulsehelp4": "https://github.com/marq24/ha-tibber-pulse-local", + "LBL_PulseList": "Lokale puls om gegevens op te vragen van:", + "LBL_item_tibberBridgeUrl": "Bridge-netwerkadres", + "TTIP_item_tibberBridgeUrl": "Naam van uw Bridge of zijn IP-adres (standaard 'tibber-host').", + "LBL_item_tibberBridgePassword": "Bridge-wachtwoord", + "TTIP_item_tibberBridgePassword": "Het wachtwoord voor uw lokale Tibber Bridge, zoals aangegeven op de hardware.", + "LBL_item_tibberPulseLocalNodeId": "PulsknooppuntID", + "TTIP_item_tibberPulseLocalNodeId": "Het knooppunt-ID waar uw Pulse op de Bridge is geregistreerd.", + "LBL_item_tibberBridgeRawDataInterval": "Poll-interval", + "TTIP_item_tibberBridgeRawDataInterval": "Het interval, in milliseconden, voor het opvragen van uw Bridge for Pulse-gegevens." +} diff --git a/admin/i18n/pl.json b/admin/i18n/pl.json deleted file mode 100644 index d6547f80..00000000 --- a/admin/i18n/pl.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "s_Active": "Aktywny" -} diff --git a/admin/i18n/pl/translations.json b/admin/i18n/pl/translations.json new file mode 100644 index 00000000..00727ca8 --- /dev/null +++ b/admin/i18n/pl/translations.json @@ -0,0 +1,89 @@ +{ + "LBL_StandardTab": "Ustawienia standardowe", + "LBL_TibberAPIToken": "Token API Tibbera", + "LBL_referralLink": "Jeśli nie jesteś jeszcze użytkownikiem Tibbera, będę bardzo wdzięczny, jeśli skorzystasz z mojego linku polecającego.", + "LBL_HomesList": "Konfiguracja impulsowych strumieni danych w czasie rzeczywistym", + "LBL_item_homeID": "Dom Tibbera", + "TTIP_item_homeID": "Identyfikator tego domu Tibbera", + "LBL_item_priceDataPollActive": "Skorzystaj z ankiety dotyczącej cen Tibbera", + "TTIP_item_priceDataPollActive": "Skorzystaj z ankiety dotyczącej cen Tibbera", + "LBL_item_feedActive": "Użyj zasilania impulsowego Tibbera", + "TTIP_item_feedActive": "Użyj kanału Tibber Pulse, aby uzyskać bieżące dane dotyczące zużycia", + "LBL_item_statsActive": "Pobierz historyczne dane dotyczące zużycia", + "TTIP_item_statsActive": "Pobierz historyczne dane dotyczące zużycia dla tego domu", + "LBL_item_numberConsHourly": "Godziny", + "TTIP_item_numberConsHourly": "Liczba przeszłych godzin do pobrania", + "LBL_item_numberConsDaily": "Dni", + "TTIP_item_numberConsDaily": "Liczba ostatnich dni do pobrania", + "LBL_item_numberConsWeekly": "Tygodnie", + "TTIP_item_numberConsWeekly": "Liczba ostatnich tygodni do pobrania", + "LBL_item_numberConsMonthly": "Miesiące", + "TTIP_item_numberConsMonthly": "Liczba ostatnich miesięcy do pobrania", + "LBL_item_numberConsAnnual": "Lata", + "TTIP_item_numberConsAnnual": "Liczba poprzednich lat do pobrania", + "LBL_feedDataDetailHeader": "Wybierz wszystkie pola, które chcesz załadować do danych na żywo (zasilanie i znacznik czasu są domyślnie włączone):", + "LBL_phases": "Wartości napięcia i prądu – w przypadku wielu liczników wartości te mogą nie zostać uwzględnione w ramce danych, co może skutkować otrzymaniem wartości zerowych. Mogą wystąpić inne odchylenia w zależności od konkretnego oprogramowania licznika. Wartości null nie będą generować stanu w obiektach ioBroker.", + "LBL_helpLink": "Pokaż dokumentację adaptera", + "LBL_CalculatorTab": "Ustawienia kalkulatora", + "LBL_UseCalculator": "Skorzystaj z kanałów kalkulatora automatyzacji", + "LBL_CalculatorList": "Kanały kalkulatora", + "LBL_item_chHomeID": "Wybierz identyfikator główny kanału", + "TTIP_item_chHomeID": "Wybierz dom, do którego ma być podłączony ten kanał.", + "LBL_item_chType": "Typ kanału", + "TTIP_item_chType": "Wybierz typ operacji dla kanału.", + "LBL_item_chType_option_1": "najlepszy koszt", + "LBL_item_chType_option_2": "najlepsze pojedyncze godziny", + "LBL_item_chType_option_3": "blok najlepszych godzin", + "LBL_item_chType_option_4": "najlepszy koszt LTF", + "LBL_item_chType_option_5": "najlepsze pojedyncze godziny LTF", + "LBL_item_chType_option_6": "blok najlepszych godzin LTF", + "LBL_item_chType_option_7": "inteligentny bufor baterii", + "LBL_item_chName": "Nazwa kanału", + "TTIP_item_chName": "Nazwa kanału ułatwiająca identyfikację stanów.", + "LBL_item_chTargetState": "Stan docelowy", + "TTIP_item_chTargetState": "Wybierz docelowy stan wyjścia dla tego kanału. Jeśli nie zostanie podany żaden, zostanie on utworzony w folderze Kanał.", + "LBL_item_chValueOn": "Wartość TAK", + "TTIP_item_chValueOn": "Wartości zapisywane do stanu wyjściowego można zdefiniować jako „wartość TAK” i „wartość NIE”, na przykład „prawda” dla stanów boolowskich lub liczba lub tekst do zapisania.", + "LBL_item_chValueOff": "Wartość nr", + "TTIP_item_chValueOff": "Wartości zapisywane do stanu wyjściowego można zdefiniować jako „wartość TAK” i „wartość NIE”, na przykład „prawda” dla stanów boolowskich lub liczba lub tekst do zapisania.", + "LBL_item_chTargetState2": "Stan docelowy 2", + "TTIP_item_chTargetState2": "Wybierz drugi docelowy stan wyjścia dla tego kanału. Jeśli nie zostanie podany żaden, nowy zostanie utworzony w folderze Kanał.", + "LBL_item_chValueOn2": "Wartość TAK 2", + "TTIP_item_chValueOn2": "Wartości zapisywane na drugi stan wyjścia można zdefiniować jako „wartość TAK 2” i „wartość NIE 2”, np. „prawda” dla stanów boolowskich lub liczba lub tekst do zapisania.", + "LBL_item_chValueOff2": "Wartość nr 2", + "TTIP_item_chValueOff2": "Wartości zapisywane na drugi stan wyjścia można zdefiniować jako „wartość TAK 2” i „wartość NIE 2”, np. „prawda” dla stanów boolowskich lub liczba lub tekst do zapisania.", + "LBL_calculatorhelp1": "Kanały można aktywować lub dezaktywować w oparciu o odpowiedni nazwany stan.", + "LBL_calculatorhelp2": "Wszystkie stany kanału kalkulatora są umieszczone w pobliżu stanów macierzystych i są oznaczone numerem kanału.", + "LBL_calculatorhelp3": "Zachowanie kanału zależy od jego typu: „Najlepszy koszt”, „Najlepsze pojedyncze godziny”, „Blok najlepszych godzin” lub „Inteligentny bufor baterii”.", + "LBL_calculatorhelp4": "Każdy kanał udostępnia jako wyjście stan zewnętrzny, który można wybrać w zakładce ustawień. Tym stanem może być na przykład „0_userdata.0.example_state” lub dowolny inny zapisywalny stan zewnętrzny.", + "LBL_calculatorhelp5": "Jeżeli nie zostanie wybrany stan wyjścia zewnętrznego, zostanie wygenerowany stan wewnętrzny w zakresie kanału.", + "LBL_calculatorhelp6": "Wartości, które mają być zapisywane w stanie wyjściowym, można zdefiniować jako „wartość TAK” i „wartość NIE”, na przykład „prawda” w przypadku stanów boolowskich lub liczba lub tekst do zapisania.", + "LBL_calculatorhelp7": "Wyjścia: zdefiniowano następujące parametry wyjściowe:", + "LBL_calculatorhelp8": "„Najlepszy koszt”: Używa obiektu „TriggerPrice” jako danych wejściowych, generując wynik „TAK” co godzinę, gdy bieżący koszt energii Tibbera jest niższy od ceny wyzwalającej.", + "LBL_calculatorhelp9": "„Najlepsze pojedyncze godziny”: Generuje wynik „TAK” w najtańszych godzinach, z liczbą godzin zdefiniowaną w obiekcie „AmountHours”.", + "LBL_calculatorhelp10": "„Blok najlepszych godzin”: Wyświetla „TAK” podczas najbardziej opłacalnego bloku godzin, o czasie trwania określonym w obiekcie „AmountHours”.", + "LBL_calculatorhelp11": "„Najlepszy koszt LTF”: „Najlepszy koszt” w ograniczonych ramach czasowych (LTF).", + "LBL_calculatorhelp12": "„Najlepsze pojedyncze godziny LTF”: „Najlepsze pojedyncze godziny” w ograniczonych ramach czasowych (LTF).", + "LBL_calculatorhelp13": "„Blok najlepszych godzin LTF”: „Blok najlepszych godzin” w ograniczonych ramach czasowych (LTF)", + "LBL_calculatorhelp14": "„Inteligentny bufor baterii”: wykorzystuje parametr „EfficiencyLoss” do określenia utraty wydajności systemu baterii. Parametr „AmountHours” określa żądaną liczbę godzin ładowania akumulatora. Kalkulator aktywuje ładowanie akumulatora („wartość TAK”) i dezaktywuje zasilanie akumulatora („wartość 2 NIE”) w określonych „AmountHours” najtańszych godzinach. I odwrotnie, wyłączy ładowanie akumulatora („wartość NIE”) i włączy zasilanie akumulatora („wartość 2 TAK”) w godzinach o najwyższym koszcie, pod warunkiem, że koszt przekroczy najwyższą cenę łączną wśród najtańszych godzin. W pozostałych normalnych godzinach, gdy buforowanie energii przez akumulator nie jest ekonomicznie opłacalne, oba wyjścia zostaną wyłączone.", + "LBL_calculatorhelp15": "Kanały LTF: Działają podobnie do kanałów standardowych, ale są aktywne tylko w przedziale czasowym zdefiniowanym przez obiekty stanu „StartTime” i „StopTime”. Po upływie „StopTime” kanał automatycznie się dezaktywuje. „StartTime” i „StopTime” mogą obejmować dwa dni kalendarzowe, ponieważ Tibber nie dostarcza danych wykraczających poza 48-godzinny okres. Obydwa stany wymagają ciągu daty i godziny w formacie ISO-8601 z przesunięciem strefy czasowej, np. „2024-12-24T18:00:00.000+01:00”.", + "LBL_calculatorhelp16": "Dodatkowo kanały LTF zawierają nowy parametr stanu o nazwie „RepeatDays”, którego wartość domyślna wynosi 0. Gdy parametr „RepeatDays” jest ustawiony na dodatnią liczbę całkowitą, kanał powtarza swój cykl, zwiększając zarówno „StartTime”, jak i „StopTime” o określoną liczbę dni po osiągnięciu „StopTime”. Na przykład ustaw „RepeatDays” na 1, aby powtarzać codziennie.", + "LBL_SpecialsTab": "Ustawienia specjalne", + "LBL_UseObsoleteStats": "Użyj przestarzałego wywołania API w celu uzyskania historycznych danych dotyczących zużycia - postępuj ostrożnie!", + "LBL_specialshelp1": "Pobiera również wartości TotalCost, w tym specjalne opłaty sieciowe w Niemczech. Sprawdź wartości z tymi wyświetlanymi w aplikacji Tibber.", + "LBL_LocalPulseTab": "Ustawienia lokalnego sondażu pulsu", + "LBL_item_UseLocalPulseData": "Skorzystaj z bezpośredniego odpytywania lokalnych impulsów Tibbera – zachowaj ostrożność!", + "LBL_item_localpulsehelp1": "Użyj mostków Tibber Bridge do bezpośredniego sondowania danych z modułów Tibber Pulse lokalnie.", + "LBL_item_localpulsehelp2": "Aby to zadziałało, musisz zmodyfikować interfejs sieciowy Bridge, aby był stale włączony.", + "LBL_item_localpulsehelp3": "marq24 dostarczył tutaj doskonały opis, jak to zrobić w przypadku integracji z Home Assistant:", + "LBL_item_localpulsehelp4": "https://github.com/marq24/ha-tibber-pulse-local", + "LBL_PulseList": "Local Pulse do odpytywania danych z:", + "LBL_item_tibberBridgeUrl": "Adres sieciowy mostu", + "TTIP_item_tibberBridgeUrl": "Nazwa Twojego mostu lub jego adres IP (domyślnie „tibber-host”).", + "LBL_item_tibberBridgePassword": "Hasło mostu", + "TTIP_item_tibberBridgePassword": "Hasło do lokalnego mostu Tibber Bridge, podane na sprzęcie.", + "LBL_item_tibberPulseLocalNodeId": "Impulsowy identyfikator węzła", + "TTIP_item_tibberPulseLocalNodeId": "Identyfikator węzła, w którym Twój Pulse jest zarejestrowany na moście.", + "LBL_item_tibberBridgeRawDataInterval": "Interwał ankiety", + "TTIP_item_tibberBridgeRawDataInterval": "Interwał w milisekundach odpytywania danych Bridge for Pulse." +} diff --git a/admin/i18n/pt.json b/admin/i18n/pt.json deleted file mode 100644 index 3e91e96a..00000000 --- a/admin/i18n/pt.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "s_Active": "Ativo" -} diff --git a/admin/i18n/pt/translations.json b/admin/i18n/pt/translations.json new file mode 100644 index 00000000..854a23f6 --- /dev/null +++ b/admin/i18n/pt/translations.json @@ -0,0 +1,89 @@ +{ + "LBL_StandardTab": "Configurações padrão", + "LBL_TibberAPIToken": "Token da API Tibber", + "LBL_referralLink": "Se você ainda não é usuário do Tibber, eu agradeceria muito se você pudesse usar meu link de indicação.", + "LBL_HomesList": "Configuração de fluxos de dados ao vivo do Pulse", + "LBL_item_homeID": "Casa Tibber", + "TTIP_item_homeID": "O ID da casa desta casa do Tibber", + "LBL_item_priceDataPollActive": "Use a pesquisa de dados de preços do Tibber", + "TTIP_item_priceDataPollActive": "Use a pesquisa de dados de preços do Tibber", + "LBL_item_feedActive": "Use Tibber Pulse Feed", + "TTIP_item_feedActive": "Use o feed Tibber Pulse para dados de consumo ao vivo", + "LBL_item_statsActive": "Recuperar dados históricos de consumo", + "TTIP_item_statsActive": "Recuperar dados históricos de consumo desta casa", + "LBL_item_numberConsHourly": "Horas", + "TTIP_item_numberConsHourly": "Número de horas anteriores a serem recuperadas", + "LBL_item_numberConsDaily": "Dias", + "TTIP_item_numberConsDaily": "Número de dias anteriores a serem recuperados", + "LBL_item_numberConsWeekly": "Semanas", + "TTIP_item_numberConsWeekly": "Número de semanas anteriores a serem recuperadas", + "LBL_item_numberConsMonthly": "Meses", + "TTIP_item_numberConsMonthly": "Número de meses anteriores a serem recuperados", + "LBL_item_numberConsAnnual": "Anos", + "TTIP_item_numberConsAnnual": "Número de anos anteriores a serem recuperados", + "LBL_feedDataDetailHeader": "Selecione todos os campos que deseja carregar nos dados do feed ao vivo (a potência e o carimbo de data/hora estão habilitados por padrão):", + "LBL_phases": "Valores de tensão e corrente - No caso de medidores múltiplos, esses valores podem não ser incluídos no quadro de dados, resultando potencialmente em valores nulos. Outros desvios podem ocorrer dependendo do firmware específico do medidor. Valores nulos não gerarão um estado em seus objetos ioBroker.", + "LBL_helpLink": "Mostrar documentação do adaptador", + "LBL_CalculatorTab": "Configurações da calculadora", + "LBL_UseCalculator": "Use canais de calculadora de automação", + "LBL_CalculatorList": "Canais de calculadora", + "LBL_item_chHomeID": "Selecione o ID inicial do canal", + "TTIP_item_chHomeID": "Selecione a casa à qual este canal deve ser anexado.", + "LBL_item_chType": "Tipo de canal", + "TTIP_item_chType": "Selecione o tipo de operação para o canal.", + "LBL_item_chType_option_1": "melhor custo", + "LBL_item_chType_option_2": "melhores horas individuais", + "LBL_item_chType_option_3": "bloco de melhores horários", + "LBL_item_chType_option_4": "melhor custo LTF", + "LBL_item_chType_option_5": "melhores horas individuais LTF", + "LBL_item_chType_option_6": "melhores horários bloquear LTF", + "LBL_item_chType_option_7": "buffer de bateria inteligente", + "LBL_item_chName": "Nome do canal", + "TTIP_item_chName": "Nome do canal para ajudar a identificar seus estados com mais facilidade.", + "LBL_item_chTargetState": "Estado alvo", + "TTIP_item_chTargetState": "Selecione o estado de saída de destino para este canal. Se nenhum for fornecido, um será criado na pasta Canal.", + "LBL_item_chValueOn": "Valor SIM", + "TTIP_item_chValueOn": "Os valores a serem escritos no estado de saída podem ser definidos como 'valor SIM' e 'valor NÃO', por exemplo, 'verdadeiro' para estados booleanos, ou um número ou texto a ser escrito.", + "LBL_item_chValueOff": "Valor NÃO", + "TTIP_item_chValueOff": "Os valores a serem escritos no estado de saída podem ser definidos como 'valor SIM' e 'valor NÃO', por exemplo, 'verdadeiro' para estados booleanos, ou um número ou texto a ser escrito.", + "LBL_item_chTargetState2": "Estado alvo 2", + "TTIP_item_chTargetState2": "Selecione o segundo estado de saída alvo para este canal. Se nenhum for fornecido, um novo será criado na pasta Canal.", + "LBL_item_chValueOn2": "Valor SIM 2", + "TTIP_item_chValueOn2": "Os valores a serem escritos no segundo estado de saída podem ser definidos como 'valor SIM 2' e 'valor NÃO 2', por exemplo, 'verdadeiro' para estados booleanos, ou um número ou texto a ser escrito.", + "LBL_item_chValueOff2": "Valor NÃO 2", + "TTIP_item_chValueOff2": "Os valores a serem escritos no segundo estado de saída podem ser definidos como 'valor SIM 2' e 'valor NÃO 2', por exemplo, 'verdadeiro' para estados booleanos, ou um número ou texto a ser escrito.", + "LBL_calculatorhelp1": "Os canais podem ser ativados ou desativados com base em um estado nomeado correspondente.", + "LBL_calculatorhelp2": "Todos os estados de um canal da calculadora são posicionados próximos aos estados iniciais e são rotulados com o número do canal.", + "LBL_calculatorhelp3": "O comportamento de um canal é determinado pelo seu tipo: 'Melhor custo', 'Melhores horas individuais', 'Bloco de melhores horas' ou 'Buffer de bateria inteligente'.", + "LBL_calculatorhelp4": "Cada canal fornece um estado externo como saída, que pode ser selecionado na aba de configurações. Este estado pode ser, por exemplo, '0_userdata.0.example_state' ou qualquer outro estado externo gravável.", + "LBL_calculatorhelp5": "Se nenhum estado de saída externo for selecionado, será gerado um estado interno dentro da faixa do canal.", + "LBL_calculatorhelp6": "Os valores a serem gravados no estado de saída podem ser definidos como 'valor SIM' e 'valor NÃO', por exemplo, 'verdadeiro' para estados booleanos, ou um número ou texto a ser escrito.", + "LBL_calculatorhelp7": "Saídas: Os seguintes parâmetros de saída são definidos:", + "LBL_calculatorhelp8": "'Melhor custo': Usa o objeto 'TriggerPrice' como entrada, gerando uma saída 'SIM' a cada hora quando o custo atual da energia do Tibber estiver abaixo do preço de gatilho.", + "LBL_calculatorhelp9": "'Melhores horas individuais': Gera uma saída 'SIM' durante as horas menos dispendiosas, com o número de horas definido no objeto 'AmountHours'.", + "LBL_calculatorhelp10": "'Bloco de melhores horas': gera 'SIM' durante o bloco de horas com melhor custo-benefício, com a duração especificada no objeto 'AmountHours'.", + "LBL_calculatorhelp11": "'LTF de melhor custo': 'Melhor custo' dentro de um período de tempo limitado (LTF).", + "LBL_calculatorhelp12": "'Melhor LTF de horas individuais': 'Melhores horas individuais' dentro de um período de tempo limitado (LTF).", + "LBL_calculatorhelp13": "'Bloco de melhores horas LTF': 'Bloco de melhores horas' dentro de um período de tempo limitado (LTF)", + "LBL_calculatorhelp14": "'Smart Battery Buffer': Utiliza o parâmetro 'EfficiencyLoss' para especificar a perda de eficiência do sistema de bateria. O parâmetro ‘AmountHours’ define o número desejado de horas para carregamento da bateria. A calculadora ativará o carregamento da bateria ('valor YES') e desativará a alimentação da bateria ('valor 2 NO') durante o 'AmountHours' especificado das horas mais baratas. Por outro lado, desativará o carregamento da bateria ('valor NÃO') e ativará a alimentação da bateria ('valor 2 SIM') durante as horas de maior custo, desde que o custo exceda o preço total mais elevado entre as horas mais baratas. Durante as restantes horas normais, onde o armazenamento de energia pela bateria não for economicamente viável, ambas as saídas serão desligadas.", + "LBL_calculatorhelp15": "Canais LTF: Funcionam de forma semelhante aos canais padrão, mas ficam ativos apenas dentro de um período de tempo definido pelos objetos de estado 'StartTime' e 'StopTime'. Após 'StopTime', o canal é desativado automaticamente. 'StartTime' e 'StopTime' podem abranger dois dias corridos, já que o Tibber não fornece dados além de uma janela de 48 horas. Ambos os estados exigem uma sequência de data e hora no formato ISO-8601 com um deslocamento de fuso horário, por exemplo, '2024-12-24T18:00:00.000+01:00'.", + "LBL_calculatorhelp16": "Além disso, os canais LTF incluem um novo parâmetro de estado chamado 'RepeatDays', cujo padrão é 0. Quando 'RepeatDays' é definido como um número inteiro positivo, o canal repete seu ciclo incrementando 'StartTime' e 'StopTime' pelo número especificado de dias após 'StopTime' ser atingido. Por exemplo, defina 'RepeatDays' como 1 para repetição diária.", + "LBL_SpecialsTab": "Configurações especiais", + "LBL_UseObsoleteStats": "Use uma chamada de API obsoleta para dados históricos de consumo. Proceda com cautela!", + "LBL_specialshelp1": "Também recupera valores TotalCost, incluindo taxas especiais de rede na Alemanha. Verifique os valores com aqueles mostrados em seu aplicativo Tibber.", + "LBL_LocalPulseTab": "Configurações de pesquisa de pulso local", + "LBL_item_UseLocalPulseData": "Use a pesquisa direta do(s) Pulso(s) Tibber local(is) - proceda com cuidado!", + "LBL_item_localpulsehelp1": "Use seu(s) Tibber Bridge(s) para pesquisar dados diretamente de seu(s) módulo(s) Tibber Pulse localmente.", + "LBL_item_localpulsehelp2": "Para que funcione, você precisa modificar a interface web do Bridge para mantê-lo permanentemente ativado.", + "LBL_item_localpulsehelp3": "marq24 forneceu uma excelente descrição de como fazer isso para a integração do Home Assistant aqui:", + "LBL_item_localpulsehelp4": "https://github.com/marq24/ha-tibber-pulse-local", + "LBL_PulseList": "Local Pulse para pesquisar dados de:", + "LBL_item_tibberBridgeUrl": "Endereço de rede da ponte", + "TTIP_item_tibberBridgeUrl": "Nome da sua Bridge ou seu endereço IP (o padrão é 'tibber-host').", + "LBL_item_tibberBridgePassword": "Senha da ponte", + "TTIP_item_tibberBridgePassword": "A senha do seu Tibber Bridge local, conforme fornecida no hardware.", + "LBL_item_tibberPulseLocalNodeId": "ID do nó de pulso", + "TTIP_item_tibberPulseLocalNodeId": "O ID do nó onde seu Pulse está registrado na Bridge.", + "LBL_item_tibberBridgeRawDataInterval": "Intervalo de pesquisa", + "TTIP_item_tibberBridgeRawDataInterval": "O intervalo, em milissegundos, para pesquisar dados do Bridge for Pulse." +} diff --git a/admin/i18n/ru.json b/admin/i18n/ru.json deleted file mode 100644 index b930e8d2..00000000 --- a/admin/i18n/ru.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "s_Active": "Активен" -} diff --git a/admin/i18n/ru/translations.json b/admin/i18n/ru/translations.json new file mode 100644 index 00000000..b95df92d --- /dev/null +++ b/admin/i18n/ru/translations.json @@ -0,0 +1,89 @@ +{ + "LBL_StandardTab": "Стандартные настройки", + "LBL_TibberAPIToken": "Токен API Тиббера", + "LBL_referralLink": "Если вы еще не являетесь пользователем Tibber, я был бы очень признателен, если бы вы использовали мою реферальную ссылку.", + "LBL_HomesList": "Конфигурация потоков импульсных данных в реальном времени", + "LBL_item_homeID": "Тиббер Хоум", + "TTIP_item_homeID": "Идентификатор этого дома в Тиббере", + "LBL_item_priceDataPollActive": "Используйте опрос данных о ценах на Тиббер", + "TTIP_item_priceDataPollActive": "Используйте опрос ценовых данных Tibber", + "LBL_item_feedActive": "Использовать импульсную подачу Tibber", + "TTIP_item_feedActive": "Используйте канал Tibber Pulse для получения данных о потреблении в реальном времени.", + "LBL_item_statsActive": "Получить исторические данные о потреблении", + "TTIP_item_statsActive": "Получить исторические данные о потреблении для этого дома", + "LBL_item_numberConsHourly": "Часы", + "TTIP_item_numberConsHourly": "Количество прошлых часов, которые необходимо получить", + "LBL_item_numberConsDaily": "Дни", + "TTIP_item_numberConsDaily": "Количество прошлых дней, которые необходимо получить", + "LBL_item_numberConsWeekly": "Недели", + "TTIP_item_numberConsWeekly": "Количество прошлых недель, которые необходимо получить", + "LBL_item_numberConsMonthly": "Месяцы", + "TTIP_item_numberConsMonthly": "Количество прошлых месяцев, которые необходимо получить", + "LBL_item_numberConsAnnual": "Годы", + "TTIP_item_numberConsAnnual": "Количество прошлых лет, которые необходимо получить", + "LBL_feedDataDetailHeader": "Выберите все поля, которые вы хотите загрузить в данные прямой трансляции (мощность и метка времени включены по умолчанию):", + "LBL_phases": "Значения напряжения и тока. В случае нескольких счетчиков эти значения могут не быть включены в кадр данных, что может привести к нулевым значениям. Другие отклонения могут возникнуть в зависимости от конкретной прошивки счетчика. Нулевые значения не будут генерировать состояние в ваших объектах ioBroker.", + "LBL_helpLink": "Показать документацию по адаптеру", + "LBL_CalculatorTab": "Настройки калькулятора", + "LBL_UseCalculator": "Используйте каналы калькулятора автоматизации", + "LBL_CalculatorList": "Калькулятор каналов", + "LBL_item_chHomeID": "Выберите домашний идентификатор канала", + "TTIP_item_chHomeID": "Выберите дом, к которому должен быть привязан этот канал.", + "LBL_item_chType": "Тип канала", + "TTIP_item_chType": "Выберите тип операции для канала.", + "LBL_item_chType_option_1": "лучшая цена", + "LBL_item_chType_option_2": "лучшие одиночные часы", + "LBL_item_chType_option_3": "блок лучших часов", + "LBL_item_chType_option_4": "лучшая стоимость LTF", + "LBL_item_chType_option_5": "лучшие одиночные часы LTF", + "LBL_item_chType_option_6": "блок лучших часов LTF", + "LBL_item_chType_option_7": "умный буфер батареи", + "LBL_item_chName": "Название канала", + "TTIP_item_chName": "Название канала, которое поможет вам легче идентифицировать ваши состояния.", + "LBL_item_chTargetState": "Целевое состояние", + "TTIP_item_chTargetState": "Выберите целевое состояние выхода для этого канала. Если ничего не указано, он будет создан в папке «Канал».", + "LBL_item_chValueOn": "Значение ДА", + "TTIP_item_chValueOn": "Значения, которые должны быть записаны в выходное состояние, могут быть определены как «значение ДА» и «значение НЕТ», например «истина» для логических состояний или число или текст для записи.", + "LBL_item_chValueOff": "Значение НЕТ", + "TTIP_item_chValueOff": "Значения, которые должны быть записаны в выходное состояние, могут быть определены как «значение ДА» и «значение НЕТ», например «истина» для логических состояний или число или текст для записи.", + "LBL_item_chTargetState2": "Целевое состояние 2", + "TTIP_item_chTargetState2": "Выберите второе целевое состояние выхода для этого канала. Если ничего не указано, в папке «Канал» будет создан новый.", + "LBL_item_chValueOn2": "Значение ДА 2", + "TTIP_item_chValueOn2": "Значения, которые должны быть записаны во второе выходное состояние, могут быть определены как «значение ДА 2» и «значение НЕТ 2», например, «истина» для логических состояний или число или текст для записи.", + "LBL_item_chValueOff2": "Значение № 2", + "TTIP_item_chValueOff2": "Значения, которые должны быть записаны во второе выходное состояние, могут быть определены как «значение ДА 2» и «значение НЕТ 2», например, «истина» для логических состояний или число или текст для записи.", + "LBL_calculatorhelp1": "Каналы можно активировать или деактивировать на основе соответствующего именованного состояния.", + "LBL_calculatorhelp2": "Все состояния канала калькулятора располагаются рядом с исходными состояниями и помечаются номером канала.", + "LBL_calculatorhelp3": "Поведение канала определяется его типом: «Лучшая стоимость», «Лучшие отдельные часы», «Блок лучших часов» или «Умный буфер батареи».", + "LBL_calculatorhelp4": "Каждый канал предоставляет внешнее состояние в качестве выхода, которое можно выбрать на вкладке настроек. Это состояние может быть, например, «0_userdata.0.example_state» или любым другим доступным для записи внешним состоянием.", + "LBL_calculatorhelp5": "Если внешнее состояние выхода не выбрано, будет сгенерировано внутреннее состояние в пределах диапазона канала.", + "LBL_calculatorhelp6": "Значения, которые должны быть записаны в выходное состояние, могут быть определены как «значение ДА» и «значение НЕТ», например «истина» для логических состояний или число или текст для записи.", + "LBL_calculatorhelp7": "Выходы: Определены следующие выходные параметры:", + "LBL_calculatorhelp8": "«Лучшая стоимость»: использует объект «TriggerPrice» в качестве входных данных, генерируя выходной сигнал «ДА» каждый час, когда текущая стоимость энергии Tibber ниже триггерной цены.", + "LBL_calculatorhelp9": "«Лучшие отдельные часы»: генерирует вывод «ДА» в течение самых дешевых часов, при этом количество часов определяется в объекте «AmountHours».", + "LBL_calculatorhelp10": "«Блок лучших часов»: выводит «ДА» в течение наиболее экономически эффективного блока часов, продолжительность которого указана в объекте «AmountHours».", + "LBL_calculatorhelp11": "«Лучшая стоимость LTF»: «Лучшая стоимость» в течение ограниченного периода времени (LTF).", + "LBL_calculatorhelp12": "«Лучшие отдельные часы LTF»: «Лучшие отдельные часы» в течение ограниченного периода времени (LTF).", + "LBL_calculatorhelp13": "«Блок лучших часов LTF»: «Блок лучших часов» в течение ограниченного периода времени (LTF)", + "LBL_calculatorhelp14": "«Интеллектуальный буфер батареи»: использует параметр «EfficiencyLoss», чтобы указать потерю эффективности аккумуляторной системы. Параметр AmountHours определяет желаемое количество часов для зарядки аккумулятора. Калькулятор активирует зарядку аккумулятора («значение ДА») и отключит питание аккумулятора («значение 2 НЕТ») в течение указанного «AmountHours» самых дешевых часов. И наоборот, он отключит зарядку батареи («значение НЕТ») и активирует питание батареи («значение 2 ДА») в часы с наибольшей стоимостью, при условии, что стоимость превышает самую высокую общую цену среди самых дешевых часов. В остальные часы работы, когда буферизация энергии с помощью батареи экономически нецелесообразна, оба выхода будут отключены.", + "LBL_calculatorhelp15": "Каналы LTF: Они функционируют аналогично стандартным каналам, но активны только в течение периода времени, определенного объектами состояния StartTime и StopTime. После StopTime канал автоматически отключается. «StartTime» и «StopTime» могут охватывать два календарных дня, поскольку Тиббер не предоставляет данные за пределами 48-часового окна. Для обоих состояний требуется строка даты и времени в формате ISO-8601 со смещением часового пояса, например, «2024-12-24T18:00:00.000+01:00».", + "LBL_calculatorhelp16": "Кроме того, каналы LTF включают новый параметр состояния под названием «RepeatDays», который по умолчанию равен 0. Когда для параметра «RepeatDays» установлено положительное целое число, канал повторяет свой цикл, увеличивая «StartTime» и «StopTime» на указанное число. дней после достижения StopTime. Например, установите для параметра «RepeatDays» значение 1 для ежедневного повторения.", + "LBL_SpecialsTab": "Специальные настройки", + "LBL_UseObsoleteStats": "Используйте устаревший вызов API для получения исторических данных о потреблении — действуйте осторожно!", + "LBL_specialshelp1": "Также извлекаются значения TotalCost, включая специальные сборы за энергосистему в Германии. Пожалуйста, сверьте значения со значениями, указанными в вашем приложении Tibber.", + "LBL_LocalPulseTab": "Настройки локального опроса импульсов", + "LBL_item_UseLocalPulseData": "Используйте прямой опрос локальных импульсов Tibber — действуйте осторожно!", + "LBL_item_localpulsehelp1": "Используйте мосты Tibber для прямого опроса данных с модулей Tibber Pulse локально.", + "LBL_item_localpulsehelp2": "Чтобы это заработало, вам необходимо изменить веб-интерфейс Bridge, чтобы он оставался включенным постоянно.", + "LBL_item_localpulsehelp3": "marq24 предоставил отличное описание того, как это сделать для интеграции Home Assistant:", + "LBL_item_localpulsehelp4": "https://github.com/marq24/ha-tibber-pulse-local", + "LBL_PulseList": "Local Pulse для опроса данных из:", + "LBL_item_tibberBridgeUrl": "Сетевой адрес моста", + "TTIP_item_tibberBridgeUrl": "Имя вашего моста или его IP-адрес (по умолчанию «tibber-host»).", + "LBL_item_tibberBridgePassword": "Пароль моста", + "TTIP_item_tibberBridgePassword": "Пароль для вашего локального Tibber Bridge, предусмотренный на оборудовании.", + "LBL_item_tibberPulseLocalNodeId": "Идентификатор импульсного узла", + "TTIP_item_tibberPulseLocalNodeId": "Идентификатор узла, на котором ваш Pulse зарегистрирован на мосту.", + "LBL_item_tibberBridgeRawDataInterval": "Интервал опроса", + "TTIP_item_tibberBridgeRawDataInterval": "Интервал в миллисекундах для опроса вашего моста на предмет импульсных данных." +} diff --git a/admin/i18n/uk.json b/admin/i18n/uk.json deleted file mode 100644 index 289ec054..00000000 --- a/admin/i18n/uk.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "s_Active": "Активний" -} diff --git a/admin/i18n/uk/translations.json b/admin/i18n/uk/translations.json new file mode 100644 index 00000000..febec583 --- /dev/null +++ b/admin/i18n/uk/translations.json @@ -0,0 +1,89 @@ +{ + "LBL_StandardTab": "Стандартні налаштування", + "LBL_TibberAPIToken": "Токен API Tibber", + "LBL_referralLink": "Якщо ви ще не користувач Tibber, я буду дуже вдячний, якщо ви скористаєтеся моїм реферальним посиланням.", + "LBL_HomesList": "Конфігурація Pulse Live Data Streams", + "LBL_item_homeID": "Дім Тіббера", + "TTIP_item_homeID": "Ідентифікатор будинку Tibber", + "LBL_item_priceDataPollActive": "Використовуйте Tibber Price Data Poll", + "TTIP_item_priceDataPollActive": "Використовуйте опитування щодо цін Tibber", + "LBL_item_feedActive": "Використовуйте Tibber Pulse Feed", + "TTIP_item_feedActive": "Використовуйте канал Tibber Pulse для отримання даних про споживання в реальному часі", + "LBL_item_statsActive": "Отримати історичні дані про споживання", + "TTIP_item_statsActive": "Отримати історичні дані споживання для цього будинку", + "LBL_item_numberConsHourly": "години", + "TTIP_item_numberConsHourly": "Кількість минулих годин, які потрібно отримати", + "LBL_item_numberConsDaily": "днів", + "TTIP_item_numberConsDaily": "Кількість минулих днів, які потрібно отримати", + "LBL_item_numberConsWeekly": "тижнів", + "TTIP_item_numberConsWeekly": "Кількість останніх тижнів, які потрібно отримати", + "LBL_item_numberConsMonthly": "Місяці", + "TTIP_item_numberConsMonthly": "Кількість останніх місяців, які потрібно отримати", + "LBL_item_numberConsAnnual": "років", + "TTIP_item_numberConsAnnual": "Кількість минулих років, які потрібно отримати", + "LBL_feedDataDetailHeader": "Виберіть усі поля, які потрібно завантажити в дані живої стрічки (потужність і мітка часу ввімкнено за замовчуванням):", + "LBL_phases": "Значення напруги та струму – у випадку кількох лічильників ці значення можуть не включатися у кадр даних, що потенційно може призвести до нульових значень. Інші відхилення можуть виникати в залежності від конкретної прошивки глюкометра. Нульові значення не генеруватимуть стан у ваших об’єктах ioBroker.", + "LBL_helpLink": "Показати документацію адаптера", + "LBL_CalculatorTab": "Налаштування калькулятора", + "LBL_UseCalculator": "Використовуйте канали калькулятора автоматизації", + "LBL_CalculatorList": "Канали калькулятора", + "LBL_item_chHomeID": "Виберіть канал Home ID", + "TTIP_item_chHomeID": "Виберіть будинок, до якого потрібно приєднати цей канал.", + "LBL_item_chType": "Тип каналу", + "TTIP_item_chType": "Виберіть тип операції для каналу.", + "LBL_item_chType_option_1": "найкраща вартість", + "LBL_item_chType_option_2": "найкращі окремі години", + "LBL_item_chType_option_3": "блок найкращих годин", + "LBL_item_chType_option_4": "найкраща вартість LTF", + "LBL_item_chType_option_5": "найкращі години LTF", + "LBL_item_chType_option_6": "найкращі години блоку LTF", + "LBL_item_chType_option_7": "розумний буфер батареї", + "LBL_item_chName": "Назва каналу", + "TTIP_item_chName": "Назва каналу, щоб легше визначити ваш стан.", + "LBL_item_chTargetState": "Цільовий стан", + "TTIP_item_chTargetState": "Виберіть цільовий вихідний стан для цього каналу. Якщо жодного не вказано, його буде створено в папці Channel.", + "LBL_item_chValueOn": "Цінність ТАК", + "TTIP_item_chValueOn": "Значення, які мають бути записані у вихідний стан, можуть бути визначені як «значення ТАК» і «значення НІ», наприклад, «істина» для логічних станів, або число чи текст, які потрібно записати.", + "LBL_item_chValueOff": "Значення НІ", + "TTIP_item_chValueOff": "Значення, які мають бути записані у вихідний стан, можуть бути визначені як «значення ТАК» і «значення НІ», наприклад, «істина» для логічних станів, або число чи текст, які потрібно записати.", + "LBL_item_chTargetState2": "Цільовий стан 2", + "TTIP_item_chTargetState2": "Виберіть другий цільовий вихідний стан для цього каналу. Якщо жодного не надано, у папці Channel буде створено новий.", + "LBL_item_chValueOn2": "Значення ТАК 2", + "TTIP_item_chValueOn2": "Значення, які мають бути записані у другий вихідний стан, можуть бути визначені як «значення ТАК 2» і «значення НІ 2», наприклад, «істина» для логічних станів, або число чи текст, які потрібно записати.", + "LBL_item_chValueOff2": "Цінність НІ 2", + "TTIP_item_chValueOff2": "Значення, які мають бути записані у другий вихідний стан, можуть бути визначені як «значення ТАК 2» і «значення НІ 2», наприклад, «істина» для логічних станів, або число чи текст, які потрібно записати.", + "LBL_calculatorhelp1": "Канали можна активувати або деактивувати на основі відповідного іменованого стану.", + "LBL_calculatorhelp2": "Усі стани каналу калькулятора розташовані біля вихідних станів і позначені номером каналу.", + "LBL_calculatorhelp3": "Поведінка каналу визначається його типом: «Найкраща вартість», «Найкращі окремі години», «Найкращий блок годин» або «Розумний буфер батареї».", + "LBL_calculatorhelp4": "Кожен канал надає зовнішній стан як вихід, який можна вибрати на вкладці налаштувань. Таким станом може бути, наприклад, '0_userdata.0.example_state' або будь-який інший доступний для запису зовнішній стан.", + "LBL_calculatorhelp5": "Якщо зовнішній вихідний стан не вибрано, буде згенеровано внутрішній стан у діапазоні каналу.", + "LBL_calculatorhelp6": "Значення, які мають бути записані у вихідний стан, можуть бути визначені як «значення ТАК» і «значення НІ», наприклад, «істина» для логічних станів, або число чи текст, які потрібно записати.", + "LBL_calculatorhelp7": "Виходи: визначено такі вихідні параметри:", + "LBL_calculatorhelp8": "«Найкраща вартість»: використовує об’єкт «TriggerPrice» як вхідні дані, щогодини генерує вихідні дані «ТАК», коли поточна вартість енергії Tibber нижча від початкової ціни.", + "LBL_calculatorhelp9": "«Найкращі окремі години»: генерує результат «ТАК» протягом найменш дорогих годин із кількістю годин, визначеною в об’єкті «AmountHours».", + "LBL_calculatorhelp10": "«Найкращий блок годин»: виводить «ТАК» протягом найбільш економічно ефективного блоку годин із тривалістю, зазначеною в об’єкті «AmountHours».", + "LBL_calculatorhelp11": "«Найкраща вартість LTF»: «Найкраща вартість» протягом обмеженого періоду часу (LTF).", + "LBL_calculatorhelp12": "«Найкращі окремі години LTF»: «Найкращі окремі години» протягом обмеженого періоду часу (LTF).", + "LBL_calculatorhelp13": "«Best hours block LTF»: «Best hours block» протягом обмеженого періоду часу (LTF)", + "LBL_calculatorhelp14": "«Smart Battery Buffer»: використовує параметр «EfficiencyLoss», щоб визначити втрату ефективності акумуляторної системи. Параметр «AmountHours» визначає бажану кількість годин для зарядки акумулятора. Калькулятор увімкне зарядку батареї («значення ТАК») і вимкне живлення батареї («значення 2 НІ») протягом зазначеного «Кількість годин» найдешевших годин. І навпаки, він вимкне зарядку батареї («значення НІ») і активує живлення від батареї («значення 2 ТАК») протягом годин із найвищою ціною, якщо вартість перевищує найвищу загальну ціну серед найдешевших годин. Протягом звичайних годин, що залишилися, коли буферизація енергії батареєю є економічно недоцільною, обидва виходи будуть вимкнені.", + "LBL_calculatorhelp15": "Канали LTF: вони функціонують подібно до стандартних каналів, але активні лише протягом періоду часу, визначеного об’єктами стану «StartTime» і «StopTime». Після «StopTime» канал автоматично вимикається. «StartTime» і «StopTime» можуть охоплювати два календарних дні, оскільки Tibber не надає даних за межами 48-годинного вікна. Для обох станів потрібен рядок дати й часу у форматі ISO-8601 із зміщенням часового поясу, наприклад, «2024-12-24T18:00:00.000+01:00».", + "LBL_calculatorhelp16": "Крім того, канали LTF включають новий параметр стану під назвою «RepeatDays», який за замовчуванням дорівнює 0. Якщо для «RepeatDays» встановлено додатне ціле число, канал повторює свій цикл, збільшуючи «StartTime» і «StopTime» на вказане число. днів після досягнення \"StopTime\". Наприклад, установіть «RepeatDays» на 1 для щоденного повторення.", + "LBL_SpecialsTab": "Спеціальні налаштування", + "LBL_UseObsoleteStats": "Використовуйте застарілий виклик API для історичних даних споживання – будьте обережні!", + "LBL_specialshelp1": "Також отримує значення TotalCost, включаючи спеціальні плати за мережу в Німеччині. Звірте значення з тими, що відображаються у вашому додатку Tibber.", + "LBL_LocalPulseTab": "Налаштування локального опитування пульсу", + "LBL_item_UseLocalPulseData": "Використовуйте пряме опитування місцевих Tibber Pulse – будьте обережні!", + "LBL_item_localpulsehelp1": "Використовуйте свій(-і) Tibber Bridge(-и) для безпосереднього локального опитування даних із вашого(их) модуля(ів) Tibber Pulse.", + "LBL_item_localpulsehelp2": "Щоб він працював, вам потрібно змінити веб-інтерфейс Bridge, щоб він постійно залишався ввімкненим.", + "LBL_item_localpulsehelp3": "marq24 надав чудовий опис того, як це зробити для інтеграції домашнього помічника тут:", + "LBL_item_localpulsehelp4": "https://github.com/marq24/ha-tibber-pulse-local", + "LBL_PulseList": "Місцевий імпульс для опитування даних з:", + "LBL_item_tibberBridgeUrl": "Мережева адреса мосту", + "TTIP_item_tibberBridgeUrl": "Назва вашого Bridge або його IP-адреса (за замовчуванням — «tibber-host»).", + "LBL_item_tibberBridgePassword": "Пароль мосту", + "TTIP_item_tibberBridgePassword": "Пароль для вашого локального Tibber Bridge, як зазначено на апаратному забезпеченні.", + "LBL_item_tibberPulseLocalNodeId": "Pulse NodeID", + "TTIP_item_tibberPulseLocalNodeId": "Ідентифікатор вузла, де ваш Pulse зареєстровано на Bridge.", + "LBL_item_tibberBridgeRawDataInterval": "Інтервал опитування", + "TTIP_item_tibberBridgeRawDataInterval": "Інтервал, у мілісекундах, для опитування вашого Bridge для даних Pulse." +} diff --git a/admin/i18n/zh-cn.json b/admin/i18n/zh-cn.json deleted file mode 100644 index 3b196866..00000000 --- a/admin/i18n/zh-cn.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "s_Active": "活跃" -} diff --git a/admin/i18n/zh-cn/translations.json b/admin/i18n/zh-cn/translations.json new file mode 100644 index 00000000..2877d603 --- /dev/null +++ b/admin/i18n/zh-cn/translations.json @@ -0,0 +1,89 @@ +{ + "LBL_StandardTab": "标准设置", + "LBL_TibberAPIToken": "Tibber API 令牌", + "LBL_referralLink": "如果您还不是 Tibber 用户,如果您能使用我的推荐链接,我将不胜感激。", + "LBL_HomesList": "脉冲实时数据流的配置", + "LBL_item_homeID": "蒂伯之家", + "TTIP_item_homeID": "此 Tibber 住宅的住宅 ID", + "LBL_item_priceDataPollActive": "使用 Tibber 价格数据调查", + "TTIP_item_priceDataPollActive": "使用 Tibber 价格数据调查", + "LBL_item_feedActive": "使用 Tibber 脉冲进给", + "TTIP_item_feedActive": "使用 Tibber Pulse 获取实时消耗数据", + "LBL_item_statsActive": "检索历史消费数据", + "TTIP_item_statsActive": "检索该房屋的历史消费数据", + "LBL_item_numberConsHourly": "时间", + "TTIP_item_numberConsHourly": "要检索的过去小时数", + "LBL_item_numberConsDaily": "天", + "TTIP_item_numberConsDaily": "要检索的过去天数", + "LBL_item_numberConsWeekly": "周数", + "TTIP_item_numberConsWeekly": "要检索的过去几周的数量", + "LBL_item_numberConsMonthly": "几个月", + "TTIP_item_numberConsMonthly": "要检索的过去月份数", + "LBL_item_numberConsAnnual": "年", + "TTIP_item_numberConsAnnual": "要检索的过去年份数", + "LBL_feedDataDetailHeader": "选择要在实时馈送数据中加载的所有字段(默认情况下启用电源和时间戳):", + "LBL_phases": "电压和电流值 - 如果有多个仪表,这些值可能不包含在数据帧中,从而可能导致空值。根据仪表的具体固件,可能会出现其他偏差。空值不会在 ioBroker 对象中生成状态。", + "LBL_helpLink": "显示适配器文档", + "LBL_CalculatorTab": "计算器设置", + "LBL_UseCalculator": "使用自动化计算器通道", + "LBL_CalculatorList": "计算器频道", + "LBL_item_chHomeID": "选择频道家庭 ID", + "TTIP_item_chHomeID": "选择该频道应连接到的家庭。", + "LBL_item_chType": "通道类型", + "TTIP_item_chType": "选择通道的操作类型。", + "LBL_item_chType_option_1": "最佳成本", + "LBL_item_chType_option_2": "最佳单小时", + "LBL_item_chType_option_3": "最佳时间段", + "LBL_item_chType_option_4": "最佳成本 LTF", + "LBL_item_chType_option_5": "最佳单小时 LTF", + "LBL_item_chType_option_6": "最佳时间块 LTF", + "LBL_item_chType_option_7": "智能电池缓冲器", + "LBL_item_chName": "频道名称", + "TTIP_item_chName": "频道名称可帮助您更轻松地识别您的状态。", + "LBL_item_chTargetState": "目标状态", + "TTIP_item_chTargetState": "选择该通道的目标输出状态。如果未提供,将在 Channel 文件夹中创建一个。", + "LBL_item_chValueOn": "值是", + "TTIP_item_chValueOn": "要写入输出状态的值可以定义为“值是”和“值否”,例如布尔状态的“真”,或者要写入的数字或文本。", + "LBL_item_chValueOff": "值 否", + "TTIP_item_chValueOff": "要写入输出状态的值可以定义为“值是”和“值否”,例如布尔状态的“真”,或者要写入的数字或文本。", + "LBL_item_chTargetState2": "目标状态2", + "TTIP_item_chTargetState2": "选择该通道的第二个目标输出状态。如果未提供,将在 Channel 文件夹中创建一个新文件夹。", + "LBL_item_chValueOn2": "值是 2", + "TTIP_item_chValueOn2": "要写入第二输出状态的值可以被定义为“值是2”和“值否2”,例如,布尔状态的“真”,或者要写入的数字或文本。", + "LBL_item_chValueOff2": "价值NO 2", + "TTIP_item_chValueOff2": "要写入第二输出状态的值可以被定义为“值是2”和“值否2”,例如,布尔状态的“真”,或者要写入的数字或文本。", + "LBL_calculatorhelp1": "可以根据相应的命名状态来激活或停用通道。", + "LBL_calculatorhelp2": "计算器通道的所有状态都位于主状态附近,并标有通道编号。", + "LBL_calculatorhelp3": "通道的行为由其类型决定:“最佳成本”、“最佳单小时”、“最佳时间块”或“智能电池缓冲器”。", + "LBL_calculatorhelp4": "每个通道提供外部状态作为输出,可以在设置选项卡中选择。例如,该状态可以是“0_userdata.0.example_state”或任何其他可写的外部状态。", + "LBL_calculatorhelp5": "如果未选择外部输出状态,将生成通道范围内的内部状态。", + "LBL_calculatorhelp6": "要写入输出状态的值可以定义为“值是”和“值否”,例如布尔状态的“真”,或者要写入的数字或文本。", + "LBL_calculatorhelp7": "输出:定义了以下输出参数:", + "LBL_calculatorhelp8": "“最佳成本”:使用“TriggerPrice”对象作为输入,当当前 Tibber 能源成本低于触发价格时,每小时生成“YES”输出。", + "LBL_calculatorhelp9": "“最佳单小时”:在最便宜的时间内生成“YES”输出,并在“AmountHours”对象中定义小时数。", + "LBL_calculatorhelp10": "“最佳时间段”:在最具成本效益的时间段内输出“YES”,持续时间在“AmountHours”对象中指定。", + "LBL_calculatorhelp11": "“最佳成本 LTF”:有限时间范围 (LTF) 内的“最佳成本”。", + "LBL_calculatorhelp12": "“最佳单小时 LTF”:有限时间范围 (LTF) 内的“最佳单小时”。", + "LBL_calculatorhelp13": "“最佳时间段 LTF”:有限时间范围 (LTF) 内的“最佳时间段”", + "LBL_calculatorhelp14": "“智能电池缓冲器”:利用“效率损失”参数来指定电池系统的效率损失。 “AmountHours”参数定义了电池充电所需的小时数。计算器将在指定的最便宜时间的“AmountHours”期​​间激活电池充电(“值 YES”)并停用电池供电(“值 2 NO”)。相反,如果成本超过最便宜时段中的最高总价,则它将在成本最高的时段内停用电池充电(“值否”)并激活电池供电(“值2是”)。在剩余的正常时间内,如果电池缓冲能量在经济上不可行,则两个输出都将关闭。", + "LBL_calculatorhelp15": "LTF 通道:这些通道的功能与标准通道类似,但仅在“StartTime”和“StopTime”状态对象定义的时间范围内有效。 “StopTime”过后,通道会自动停用。 “StartTime”和“StopTime”可以跨越两个日历日,因为 Tibber 不提供超过 48 小时窗口的数据。这两种状态都需要 ISO-8601 格式的日期时间字符串和时区偏移量,例如“2024-12-24T18:00:00.000+01:00”。", + "LBL_calculatorhelp16": "此外,LTF 通道包括一个名为“RepeatDays”的新状态参数,默认值为 0。当“RepeatDays”设置为正整数时,通道通过将“StartTime”和“StopTime”增加指定的数字来重复其循环达到“StopTime”后的天数。例如,将“RepeatDays”设置为 1 表示每日重复。", + "LBL_SpecialsTab": "特殊设置", + "LBL_UseObsoleteStats": "使用过时的 API 调用来获取历史消费数据 - 谨慎操作!", + "LBL_specialshelp1": "还检索 TotalCost 值,包括德国的特殊电网费用。请验证这些值与您的 Tibber 应用程序中显示的值。", + "LBL_LocalPulseTab": "本地脉冲轮询设置", + "LBL_item_UseLocalPulseData": "使用本地 Tibber Pulse 的直接轮询 - 谨慎操作!", + "LBL_item_localpulsehelp1": "使用 Tibber Bridge 直接从本地 Tibber Pulse 模块轮询数据。", + "LBL_item_localpulsehelp2": "为了使其正常工作,您需要修改 Bridge 的 Web 界面以使其永久启用。", + "LBL_item_localpulsehelp3": "marq24 在这里提供了关于如何为其 Home Assistant 集成执行此操作的精彩描述:", + "LBL_item_localpulsehelp4": "https://github.com/marq24/ha-tibber-pulse-local", + "LBL_PulseList": "本地脉冲轮询数据:", + "LBL_item_tibberBridgeUrl": "网桥网络地址", + "TTIP_item_tibberBridgeUrl": "您的网桥名称或其 IP 地址(默认为“tibber-host”)。", + "LBL_item_tibberBridgePassword": "桥接密码", + "TTIP_item_tibberBridgePassword": "硬件上提供的本地 Tibber Bridge 的密码。", + "LBL_item_tibberPulseLocalNodeId": "脉冲节点ID", + "TTIP_item_tibberPulseLocalNodeId": "您的 Pulse 在网桥上注册的节点 ID。", + "LBL_item_tibberBridgeRawDataInterval": "轮询间隔", + "TTIP_item_tibberBridgeRawDataInterval": "轮询 Bridge 获取脉冲数据的时间间隔(以毫秒为单位)。" +} diff --git a/admin/jsonConfig.json b/admin/jsonConfig.json index bd98ae5a..82417e0d 100644 --- a/admin/jsonConfig.json +++ b/admin/jsonConfig.json @@ -1,100 +1,52 @@ { "i18n": true, "type": "tabs", + "tabsStyle": { + "width": "calc(100% - 100px)" + }, "items": { "_StandardTab": { "type": "panel", - "label": { - "en": "Standard settings", - "de": "Standard-Einstellungen", - "ru": "Стандартные настройки", - "pt": "Configurações padrão", - "nl": "Standaardinstellingen", - "fr": "Paramètres standard", - "it": "Impostazioni predefinite", - "es": "Configuración estándar", - "pl": "Ustawienia standardowe", - "uk": "Стандартні налаштування", - "zh-cn": "标准设置" - }, + "label": "LBL_StandardTab", "items": { "TibberAPIToken": { "type": "text", - "label": { - "en": "Token for Tibber API", - "de": "Token für Tibber API", - "ru": "Токен для Tibber API", - "pt": "Token para a API Tibber", - "nl": "Token voor Tibber API", - "fr": "Token pour l'API Tibber", - "it": "Token per l'API di Tibber", - "es": "Token para la API de Tibber", - "pl": "Token do API Tibber", - "uk": "Токен для API Tibber", - "zh-cn": "Tibber API 的令牌" - }, + "label": "LBL_TibberAPIToken", "maxLength": 60, + "xs": 12, "sm": 12, - "md": 6, + "md": 8, "lg": 6, + "xl": 4, "newLine": true }, - - "_link": { + "_referralLink": { "type": "staticLink", - "label": { - "en": "If you're not currently a Tibber user, I would greatly appreciate it if you could use my referral link", - "de": "Wenn Sie derzeit kein Tibber-Benutzer sind, würde ich es sehr schätzen, wenn Sie meinen Empfehlungslink verwenden könnten", - "ru": "Если вы в настоящее время не являетесь пользователем Tibber, я был бы очень признателен, если бы вы могли использовать мою реферальную ссылку", - "pt": "Se você não é atualmente um usuário da Tibber, eu ficaria muito agradecido se você pudesse usar meu link de referência", - "nl": "Als u op dit moment geen Tibber-gebruiker bent, zou ik het zeer waarderen als u mijn verwijzingslink zou kunnen gebruiken", - "fr": "Si vous n'êtes pas actuellement un utilisateur de Tibber, je vous serais très reconnaissant si vous pouviez utiliser mon lien de parrainage", - "it": "Se al momento non sei un utente di Tibber, sarei molto grato se potessi utilizzare il mio link di riferimento", - "es": "Si actualmente no eres usuario de Tibber, te agradecería mucho si pudieras usar mi enlace de referencia", - "pl": "Jeśli obecnie nie jesteś użytkownikiem Tibber, bardzo bym docenił, gdybyś mógł skorzystać z mojego linku polecającego", - "uk": "Якщо ви в даний момент не є користувачем Tibber, я б вдячний, якщо ви могли б використовувати мій реферальний посилання", - "zh-cn": "如果您目前不是Tibber的用户,如果您能使用我的推荐链接,我将非常感激" - }, + "label": "LBL_referralLink", "href": "https://invite.tibber.com/mu8c82n5", "button": true, "icon": "info", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "HomesList": { "type": "table", + "label": "LBL_HomesList", + "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 12, "lg": 12, - "label": { - "en": "Configuration of Pulse live data streams", - "de": "Konfiguration von Pulse-Live-Datenströmen", - "ru": "Настройка потоковых данных в режиме реального времени Pulse", - "pt": "Configuração de transmissões de dados ao vivo do Pulse", - "nl": "Configuratie van Pulse live gegevensstromen", - "fr": "Configuration des flux de données en direct Pulse", - "it": "Configurazione dei flussi di dati in tempo reale di Pulse", - "es": "Configuración de transmisiones de datos en tiempo real de Pulse", - "pl": "Konfiguracja strumieni danych na żywo Pulse", - "uk": "Налаштування потокових даних в режимі реального часу Pulse", - "zh-cn": "Pulse实时数据流配置" - }, - "hidden": "!data.TibberAPIToken", + "xl": 12, "items": [ { "type": "selectSendTo", - "title": { - "en": "Tibber Home", - "de": "Tibber Zuhause", - "ru": "Дом Tibber", - "pt": "Casa Tibber", - "nl": "Tibber Thuis", - "fr": "Maison Tibber", - "it": "Casa Tibber", - "es": "Casa Tibber", - "pl": "Dom Tibber", - "uk": "Tibber Дім", - "zh-cn": "Tibber家" - }, + "label": "LBL_item_homeID", + "tooltip": "TTIP_item_homeID", "command": "HomesForConfig", "attr": "homeID", "filter": false, @@ -104,19 +56,8 @@ }, { "type": "checkbox", - "title": { - "en": "Use Tibber price data poll", - "de": "Verwende die Tibber Preisdatenabfrage", - "ru": "Использовать опрос данных о ценах от Tibber", - "pt": "Usar pesquisa de dados de preço da Tibber", - "nl": "Gebruik de prijsgegevenspoll van Tibber", - "fr": "Utiliser l'interrogation des données de prix Tibber", - "it": "Utilizza l'interrogazione dei dati sui prezzi di Tibber", - "es": "Utilizar la consulta de datos de precios de Tibber", - "pl": "Użyj ankiety cenowej danych Tibber", - "uk": "Використовуйте опитування даних про ціни від Tibber", - "zh-cn": "使用 Tibber 价格数据轮询" - }, + "label": "LBL_item_priceDataPollActive", + "tooltip": "TTIP_item_priceDataPollActive", "attr": "priceDataPollActive", "filter": false, "sort": false, @@ -125,19 +66,8 @@ }, { "type": "checkbox", - "title": { - "en": "Use Tibber Pulse feed", - "de": "Verwende Tibber Pulse-Feed", - "ru": "Используйте ленту Tibber Pulse", - "pt": "Use o feed Tibber Pulse", - "nl": "Gebruik Tibber Pulse-feed", - "fr": "Utilisez le flux Tibber Pulse", - "it": "Usa il feed Tibber Pulse", - "es": "Utiliza el feed Tibber Pulse", - "pl": "Użyj strumienia Tibber Pulse", - "uk": "Використовуйте стрічку Tibber Pulse", - "zh-cn": "使用 Tibber Pulse 数据流" - }, + "label": "LBL_item_feedActive", + "tooltip": "TTIP_item_feedActive", "attr": "feedActive", "filter": false, "sort": false, @@ -146,19 +76,8 @@ }, { "type": "checkbox", - "title": { - "en": "Pull historical consumption data", - "de": "Historische Verbrauchsdaten abrufen", - "ru": "Получение истории потребления энергии", - "pt": "Buscar dados históricos de consumo", - "nl": "Historische verbruiksgegevens ophalen", - "fr": "Extraire les données de consommation historiques", - "it": "Recupera i dati storici di consumo", - "es": "Obtener datos históricos de consumo", - "pl": "Pobierz historyczne dane o zużyciu", - "uk": "Отримати історичні дані споживання", - "zh-cn": "拉取历史耗电数据" - }, + "label": "LBL_item_statsActive", + "tooltip": "TTIP_item_statsActive", "attr": "statsActive", "filter": false, "sort": false, @@ -167,837 +86,569 @@ }, { "type": "number", - "title": { - "en": "hours", - "de": "Stunden", - "ru": "часов", - "pt": "horas", - "nl": "uren", - "fr": "heures", - "it": "ore", - "es": "horas", - "pl": "godziny", - "uk": "годин", - "zh-cn": "小时" - }, + "label": "LBL_item_numberConsHourly", + "tooltip": "TTIP_item_numberConsHourly", "attr": "numberConsHourly", "disabled": "!data.statsActive", "min": 0, - "max": 400, + "max": 744, "step": 1, "width": "6%", "default": 24 }, { "type": "number", - "title": { - "en": "days", - "de": "Tage", - "ru": "дней", - "pt": "dias", - "nl": "dagen", - "fr": "jours", - "it": "giorni", - "es": "días", - "pl": "dni", - "uk": "днів", - "zh-cn": "天" - }, + "label": "LBL_item_numberConsDaily", + "tooltip": "TTIP_item_numberConsDaily", "attr": "numberConsDaily", "disabled": "!data.statsActive", "min": 0, - "max": 30, + "max": 31, "step": 1, "width": "6%", "default": 7 }, { "type": "number", - "title": { - "en": "weeks", - "de": "Wochen", - "ru": "недель", - "pt": "semanas", - "nl": "weken", - "fr": "semaines", - "it": "settimane", - "es": "semanas", - "pl": "tygodnie", - "uk": "тижнів", - "zh-cn": "周" - }, + "label": "LBL_item_numberConsWeekly", + "tooltip": "TTIP_item_numberConsWeekly", "attr": "numberConsWeekly", "disabled": "!data.statsActive", "min": 0, - "max": 10, + "max": 52, "step": 1, "width": "6%", "default": 4 }, { "type": "number", - "title": { - "en": "months", - "de": "Monate", - "ru": "месяцев", - "pt": "meses", - "nl": "maanden", - "fr": "mois", - "it": "mesi", - "es": "meses", - "pl": "miesięcy", - "uk": "місяців", - "zh-cn": "月" - }, + "label": "LBL_item_numberConsMonthly", + "tooltip": "TTIP_item_numberConsMonthly", "attr": "numberConsMonthly", "disabled": "!data.statsActive", "min": 0, - "max": 10, + "max": 12, "step": 1, "width": "6%", "default": 4 }, { "type": "number", - "title": { - "en": "years", - "de": "Jahre", - "ru": "лет", - "pt": "anos", - "nl": "jaren", - "fr": "ans", - "it": "anni", - "es": "años", - "pl": "lat", - "uk": "років", - "zh-cn": "年" - }, + "label": "LBL_item_numberConsAnnual", + "tooltip": "TTIP_item_numberConsAnnual", "attr": "numberConsAnnual", "disabled": "!data.statsActive", "min": 0, - "max": 10, + "max": 1, "step": 1, "width": "6%", - "default": 2 + "default": 1 } ] }, - "_feedDataDetail": { + "_feedDataDetailHeader": { "type": "header", - "text": { - "en": "Select all fields you want to load in live-feed data (power and timestamp are on by default):", - "de": "Wählen Sie alle Felder aus, die Sie in den Live-Feed-Daten laden möchten (Leistung und Zeitstempel sind standardmäßig aktiviert):", - "ru": "Выберите все поля, которые вы хотите загрузить в данные с живой подачей (мощность и временная метка включены по умолчанию):", - "pt": "Selecione todos os campos que deseja carregar nos dados de feed ao vivo (potência e carimbo de data/hora estão ativados por padrão):", - "nl": "Selecteer alle velden die u wilt laden in live-feed gegevens (vermogen en tijdstempel zijn standaard ingeschakeld):", - "fr": "Sélectionnez tous les champs que vous souhaitez charger dans les données en direct (puissance et horodatage sont activés par défaut):", - "it": "Seleziona tutti i campi che desideri caricare nei dati in tempo reale (potenza e timestamp sono attivi per impostazione predefinita):", - "es": "Seleccione todos los campos que desea cargar en los datos de transmisión en vivo (potencia y marca de tiempo están activados por defecto):", - "pl": "Wybierz wszystkie pola, które chcesz załadować do danych na żywo (moc i znacznik czasu są domyślnie włączone):", - "uk": "Виберіть всі поля, які ви хочете завантажити в живі дані (потужність та відмітка часу включені за замовчуванням):", - "zh-cn": "选择要在实时数据中加载的所有字段 (功率和时间戳默认开启):" - }, + "text": "LBL_feedDataDetailHeader", "hidden": "!data.TibberAPIToken", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "size": 3 }, "FeedConfigLastMeterConsumption": { "type": "checkbox", "label": "LastMeterConsumption", + "noTranslation": true, + "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, "lg": 4, - "hidden": "!data.TibberAPIToken", + "xl": 4, "newLine": true }, "FeedConfigAccumulatedConsumption": { "type": "checkbox", "label": "AccumulatedConsumption", + "noTranslation": true, "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigAccumulatedConsumptionLastHour": { "type": "checkbox", "label": "AccumulatedConsumptionLastHour", + "noTranslation": true, "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigLastMeterProduction": { "type": "checkbox", + "noTranslation": true, "label": "LastMeterProduction", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, "lg": 4, + "xl": 4, "newLine": true }, "FeedConfigAccumulatedProduction": { "type": "checkbox", + "noTranslation": true, "label": "AccumulatedProduction", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigAccumulatedProductionLastHour": { "type": "checkbox", + "noTranslation": true, "label": "AccumulatedProductionLastHour", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigAccumulatedCost": { "type": "checkbox", + "noTranslation": true, "label": "AccumulatedCost", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, "lg": 4, + "xl": 4, "newLine": true }, "FeedConfigAccumulatedReward": { "type": "checkbox", + "noTranslation": true, "label": "AccumulatedReward", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigCurrency": { "type": "checkbox", + "noTranslation": true, "label": "Currency", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigMinPower": { "type": "checkbox", + "noTranslation": true, "label": "MinPower", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, "lg": 4, + "xl": 4, "newLine": true }, "FeedConfigAveragePower": { "type": "checkbox", + "noTranslation": true, "label": "AveragePower", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigMaxPower": { "type": "checkbox", + "noTranslation": true, "label": "MaxPower", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigPowerProduction": { "type": "checkbox", + "noTranslation": true, "label": "PowerProduction", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, "lg": 4, + "xl": 4, "newLine": true }, "FeedConfigMinPowerProduction": { "type": "checkbox", + "noTranslation": true, "label": "MinPowerProduction", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigMaxPowerProduction": { "type": "checkbox", + "noTranslation": true, "label": "MaxPowerProduction", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigPowerFactor": { "type": "checkbox", + "noTranslation": true, "label": "PowerFactor", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, "lg": 4, + "xl": 4, "newLine": true }, "FeedConfigSignalStrength": { "type": "checkbox", + "noTranslation": true, "label": "SignalStrength", "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "_phases": { "type": "staticText", "hidden": "!data.TibberAPIToken", - "label": { - "en": "Voltage and current values - In the case of several meters, these values may not be included in the data frame, which could result in null values. Other deviations may also occur based on the specific firmware of the meter. Null values will not generate a state in your ioBroker objects.", - "de": "Spannungs- und Stromwerte - In einigen Fällen können diese Werte bei mehreren Zählern nicht im Datenrahmen enthalten sein, was zu Nullwerten führen kann. Weitere Abweichungen können auch auf der spezifischen Firmware des Zählers basieren. Nullwerte generieren keine Zustände in Ihren ioBroker-Objekten.", - "ru": "Значения напряжения и тока - В случае нескольких счетчиков эти значения могут не включаться в кадр данных, что может привести к нулевым значениям. Другие отклонения также могут возникнуть на основе конкретной прошивки счетчика. Нулевые значения не создадут состояние в ваших объектах ioBroker.", - "pt": "Valores de tensão e corrente - No caso de vários medidores, esses valores podem não estar incluídos no quadro de dados, o que pode resultar em valores nulos. Outras discrepâncias também podem ocorrer com base na firmware específica do medidor. Valores nulos não gerarão um estado em seus objetos ioBroker.", - "nl": "Spannings- en stroomwaarden - In het geval van meerdere meters kunnen deze waarden mogelijk niet zijn opgenomen in het gegevenskader, wat kan resulteren in nulwaarden. Andere afwijkingen kunnen ook optreden op basis van de specifieke firmware van de meter. Nulwaarden genereren geen toestand in uw ioBroker-objecten.", - "fr": "Valeurs de tension et de courant - Dans le cas de plusieurs compteurs, ces valeurs peuvent ne pas être incluses dans le cadre de données, ce qui pourrait entraîner des valeurs nulles. D'autres écarts peuvent également se produire en fonction du firmware spécifique du compteur. Les valeurs nulles ne généreront pas d'état dans vos objets ioBroker.", - "it": "Valori di tensione e corrente - Nel caso di diversi contatori, questi valori potrebbero non essere inclusi nel frame dati, il che potrebbe comportare valori nulli. Possono verificarsi altre deviazioni in base alla specifica firmware del contatore. I valori nulli non genereranno uno stato nei vostri oggetti ioBroker.", - "es": "Valores de voltaje y corriente - En el caso de varios medidores, estos valores pueden no estar incluidos en el marco de datos, lo que podría dar lugar a valores nulos. También pueden producirse otras desviaciones según la firmware específica del medidor. Los valores nulos no generarán un estado en sus objetos ioBroker.", - "pl": "Wartości napięcia i prądu - W przypadku kilku liczników te wartości mogą nie być uwzględnione w ramce danych, co może skutkować wartościami zerowymi. Inne odstępstwa mogą również wystąpić na podstawie konkretnej wersji firmware licznika. Wartości zerowe nie wygenerują stanu w twoich obiektach ioBroker.", - "uk": "Значення напруги та струму - В разі кількох лічильників ці значення можуть не включати в кадр даних, що може призвести до нульових значень. Інші відхилення також можуть виникнути на основі конкретної прошивки лічильника. Нульові значення не створять стан в ваших об'єктах ioBroker.", - "zh-cn": "电压和电流数值 - 在多台仪表的情况下,这些数值可能不包括在数据帧中,可能导致空值。根据电表的具体固件,还可能出现其他偏差。空值不会在您的ioBroker对象中生成状态。" - }, + "label": "LBL_phases", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "FeedConfigVoltagePhase1": { "type": "checkbox", "label": "VoltagePhase1", + "noTranslation": true, "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, "lg": 4, + "xl": 4, "newLine": true }, "FeedConfigVoltagePhase2": { "type": "checkbox", "label": "VoltagePhase2", + "noTranslation": true, "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigVoltagePhase3": { "type": "checkbox", "label": "VoltagePhase3", + "noTranslation": true, "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigCurrentL1": { "type": "checkbox", "label": "CurrentL1", + "noTranslation": true, "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, "lg": 4, + "xl": 4, "newLine": true }, "FeedConfigCurrentL2": { "type": "checkbox", "label": "CurrentL2", + "noTranslation": true, "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 }, "FeedConfigCurrentL3": { "type": "checkbox", "label": "CurrentL3", + "noTranslation": true, "hidden": "!data.TibberAPIToken", + "xs": 12, "sm": 12, "md": 6, - "lg": 4 + "lg": 4, + "xl": 4 + }, + + "_headerDocumentation": { + "type": "header", + "text": "", + "noTranslation": true, + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, + "size": 3 + }, + "_helpLink": { + "type": "staticLink", + "button": true, + "variant": "contained", + "icon": "info", + "label": "LBL_helpLink", + "href": "https://github.com/hombach/ioBroker.tibberlink/blob/master/README.md", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, + "newLine": true } } }, "_CalculatorTab": { "type": "panel", - "label": { - "en": "Calculator Settings", - "de": "Automatisierungs-Einstellungen", - "ru": "Настройки автоматизации", - "pt": "Configurações de automação", - "nl": "Automatiseringsinstellingen", - "fr": "Paramètres d'automatisation", - "it": "Impostazioni di automazione", - "es": "Configuración de automatización", - "pl": "Ustawienia automatyzacji", - "uk": "Налаштування автоматизації", - "zh-cn": "自动化设置" - }, + "label": "LBL_CalculatorTab", "hidden": "!data.TibberAPIToken", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "items": { - "_CalculatorHeader": { - "type": "header", - "text": { - "en": "Calculator Channels", - "de": "Automatisierungs-Kanäle", - "ru": "Каналы автоматизации", - "pt": "Canais de automação", - "nl": "Automatiseringskanalen", - "fr": "Canaux d'automatisation", - "it": "Canali di automazione", - "es": "Canales de automatización", - "pl": "Kanały automatyzacji", - "uk": "Канали автоматизації", - "zh-cn": "自动化通道" - }, - "size": 3 - }, - "UseCalculator": { "type": "checkbox", - "label": { - "en": "Use Automation", - "de": "Automatisierung verwenden", - "ru": "Использовать автоматизацию", - "pt": "Usar Automação", - "nl": "Gebruik Automatisering", - "fr": "Utiliser l'Automatisation", - "it": "Usa Automazione", - "es": "Usar Automatización", - "pl": "Użyj Automatyzacji", - "uk": "Використовувати автоматизацію", - "zh-cn": "使用自动化" - }, + "label": "LBL_UseCalculator", + "xs": 12, "sm": 12, "md": 12, "lg": 12, - "newLine": true + "xl": 12 }, "CalculatorList": { - "type": "table", + "type": "accordion", + "titleAttr": "chName", + "label": "LBL_CalculatorList", + "hidden": "!data.UseCalculator", + "xs": 12, "sm": 12, "md": 12, "lg": 12, - "label": { - "en": "Calculator Channels", - "de": "Automatisierungs-Kanäle", - "ru": "Каналы автоматизации", - "pt": "Canais de automação", - "nl": "Automatiseringskanalen", - "fr": "Canaux d'automatisation", - "it": "Canali di automazione", - "es": "Canales de automatización", - "pl": "Kanały automatyzacji", - "uk": "Канали автоматизації", - "zh-cn": "自动化通道" - }, - "hidden": "!data.UseCalculator", + "xl": 12, "items": [ { "type": "selectSendTo", - "title": { - "en": "Channel Home", - "de": "Kanal Zuhause", - "ru": "Домашний канал", - "pt": "Canal Residencial", - "nl": "Thuis-kanaal", - "fr": "Canal Domicile", - "it": "Canale Home", - "es": "Canal de Hogar", - "pl": "Kanał Domowy", - "uk": "Домашній канал", - "zh-cn": "家庭通道" - }, + "label": "LBL_item_chHomeID", + "tooltip": "TTIP_item_chHomeID", "attr": "chHomeID", "default": "No Home selected", - "filter": false, - "sort": false, - "width": "10% ", "command": "HomesForCalculator", - "tooltip": { - "en": "select the home this channel should be attached to", - "de": "Wählen Sie das Zuhause aus, an das dieser Kanal angehängt werden soll", - "ru": "выберите дом, к которому должен быть присоединен этот канал", - "pt": "selecione a casa à qual este canal deve ser anexado", - "nl": "selecteer het huis waaraan dit kanaal moet worden gekoppeld", - "fr": "sélectionnez la maison à laquelle ce canal doit être attaché", - "it": "seleziona la casa a cui questo canale dovrebbe essere collegato", - "es": "seleccione el hogar al que este canal debe estar adjunto", - "pl": "wybierz dom, do którego ten kanał powinien być podłączony", - "uk": "виберіть будинок, до якого має бути приєднаний цей канал", - "zh-cn": "选择要连接到的主页" - } + "xs": 12, + "sm": 12, + "md": 6, + "lg": 6, + "xl": 6 }, { "type": "select", - "title": { - "en": "Channel Type", - "de": "Kanaltyp", - "ru": "Тип канала", - "pt": "Tipo de Canal", - "nl": "Soort Kanaal", - "fr": "Type de Canal", - "it": "Tipo di Canale", - "es": "Tipo de Canal", - "pl": "Typ kanału", - "uk": "Тип каналу", - "zh-cn": "通道类型" - }, - "tooltip": { - "en": "Channels have to be activated or deactivated in a corresponding state", - "de": "Kanäle müssen in einem entsprechenden Zustand aktiviert oder deaktiviert werden", - "ru": "Каналы должны быть активированы или деактивированы в соответствующем состоянии", - "pt": "Os canais devem ser ativados ou desativados em um estado correspondente", - "nl": "Kanalen moeten worden geactiveerd of gedeactiveerd in een overeenkomstige staat", - "fr": "Les chaînes doivent être activées ou désactivées dans un état correspondant", - "it": "I canali devono essere attivati o disattivati in uno stato corrispondente", - "es": "Los canales deben activarse o desactivarse en un estado correspondiente", - "pl": "Kanały muszą być aktywowane lub dezaktywowane w odpowiednim stanie", - "uk": "Канали повинні бути активовані або деактивовані в відповідному стані", - "zh-cn": "通道必须在相应状态下激活或停用" - }, + "label": "LBL_item_chType", + "tooltip": "TTIP_item_chType", "attr": "chType", "options": [ { - "label": { - "en": "best cost", - "de": "beste Kosten", - "ru": "лучшие затраты", - "pt": "melhor custo", - "nl": "beste kosten", - "fr": "meilleur coût", - "it": "miglior costo", - "es": "mejor costo", - "pl": "najlepsze koszty", - "uk": "кращі витрати", - "zh-cn": "最佳成本" - }, + "label": "LBL_item_chType_option_1", "value": 1 }, { - "label": { - "en": "best single hours", - "de": "beste Einzelstunden", - "ru": "лучшие одиночные часы", - "pt": "melhores horas únicas", - "nl": "beste enkele uren", - "fr": "meilleures heures uniques", - "it": "migliori ore singole", - "es": "mejores horas individuales", - "pl": "najlepsze pojedyncze godziny", - "uk": "кращі одиничні години", - "zh-cn": "最佳单个小时" - }, + "label": "LBL_item_chType_option_2", "value": 2 }, { - "label": { - "en": "best hours block", - "de": "beste Stundenblock", - "ru": "лучший часовой блок", - "pt": "melhor bloco de horas", - "nl": "beste uren blok", - "fr": "meilleur bloc d'heures", - "it": "miglior blocco di ore", - "es": "mejor bloque de horas", - "pl": "najlepszy blok godzin", - "uk": "кращий годинний блок", - "zh-cn": "最佳小时块" - }, + "label": "LBL_item_chType_option_3", "value": 3 }, { - "label": { - "en": "best cost LTF", - "de": "beste Kosten LTF", - "ru": "лучшие затраты LTF", - "pt": "melhor custo LTF", - "nl": "beste kosten LTF", - "fr": "meilleur coût LTF", - "it": "miglior costo LTF", - "es": "mejor costo LTF", - "pl": "najlepsze koszty LTF", - "uk": "Найкращі витрати LTF", - "zh-cn": "最佳成本 LTF" - }, + "label": "LBL_item_chType_option_4", "value": 4 }, { - "label": { - "en": "best single hours LTF", - "de": "beste Einzelstunden LTF", - "ru": "лучшие одиночные часы LTF", - "pt": "melhores horas únicas LTF", - "nl": "beste enkele uren LTF", - "fr": "meilleures heures uniques LTF", - "it": "migliori ore singole LTF", - "es": "mejores horas individuales LTF", - "pl": "najlepsze pojedyncze godziny LTF", - "uk": "кращі одиничні години LTF", - "zh-cn": "最佳单个小时 LTF" - }, + "label": "LBL_item_chType_option_5", "value": 5 }, { - "label": { - "en": "best hours block LTF", - "de": "beste Stundenblock LTF", - "ru": "лучший часовой блок LTF", - "pt": "melhor bloco de horas LTF", - "nl": "beste uren blok LTF", - "fr": "meilleur bloc d'heures LTF", - "it": "miglior blocco di ore LTF", - "es": "mejor bloque de horas LTF", - "pl": "najlepszy blok godzin LTF", - "uk": "кращий годинний блок LTF", - "zh-cn": "最佳小时块 LTF" - }, + "label": "LBL_item_chType_option_6", "value": 6 }, { - "label": { - "en": "smart battery buffer", - "de": "intelligenter Batteriepuffer", - "ru": "умный буфер батареи", - "pt": "buffer de bateria inteligente", - "nl": "slimme batterijbuffer", - "fr": "tampon de batterie intelligent", - "it": "buffer batteria intelligente", - "es": "buffer de batería inteligente", - "pl": "inteligentny bufor baterii", - "uk": "розумний буфер акумулятора", - "zh-cn": "智能电池缓冲区" - }, + "label": "LBL_item_chType_option_7", "value": 7 } ], - "filter": false, - "sort": false, - "width": "15%" + "xs": 12, + "sm": 12, + "md": 6, + "lg": 6, + "xl": 6 }, + { "type": "text", - "title": { - "en": "Channel Name", - "de": "Kanalname", - "ru": "Имя канала", - "pt": "Nome do Canal", - "nl": "Kanaalnaam", - "fr": "Nom du Canal", - "it": "Nome del Canale", - "es": "Nombre del Canal", - "pl": "Nazwa kanału", - "uk": "Назва каналу", - "zh-cn": "通道名称" - }, - "tooltip": { - "en": "channel name to better identify your states", - "de": "Kanalname zur besseren Identifizierung Ihrer Zustände", - "ru": "название канала для лучшей идентификации ваших состояний", - "pt": "nome do canal para identificar melhor seus estados", - "nl": "kanaalnaam om uw toestanden beter te identificeren", - "fr": "nom du canal pour mieux identifier vos états", - "it": "nome del canale per identificare meglio i tuoi stati", - "es": "nombre del canal para identificar mejor tus estados", - "pl": "nazwa kanału do lepszego zidentyfikowania twoich stanów", - "uk": "назва каналу для кращої ідентифікації ваших станів", - "zh-cn": "通道名称以更好地识别您的状态" - }, + "label": "LBL_item_chName", + "tooltip": "TTIP_item_chName", "maxLength": 25, "attr": "chName", - "filter": false, - "sort": false, - "width": "15%", - "default": "Channel Name" + "validator": "if(data.name === '' || data.name === null){return false;}else{const myRegEx = /^([0-9a-z_ ])*$/i; return myRegEx.test(data.name);}", + "validatorNoSaveOnError": true, + "default": "channel name", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12 }, + { "type": "objectId", - "title": { - "en": "Target State", - "de": "Ziel State", - "ru": "Целевое состояние", - "pt": "Estado Alvo", - "nl": "Doelstaat", - "fr": "État Cible", - "it": "Stato Obiettivo", - "es": "Estado Objetivo", - "pl": "Stan Docelowy", - "uk": "Цільовий стан", - "zh-cn": "目标状态" - }, + "label": "LBL_item_chTargetState", + "tooltip": "TTIP_item_chTargetState", "attr": "chTargetState", - "filter": false, - "sort": false, - "width": "15%" + "default": "", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12 }, + { "type": "text", - "title": { - "en": "Value YES", - "de": "Wert JA", - "ru": "Значение ДА", - "pt": "Valor SIM", - "nl": "Waarde JA", - "fr": "Valeur OUI", - "it": "Valore SÌ", - "es": "Valor SÍ", - "pl": "Wartość TAK", - "uk": "Значення ТАК", - "zh-cn": "值 是" - }, - "tooltip": { - "en": "The values to be written to the output state can be defined in 'value YES' and 'value NO,' e.g., 'true' for boolean states, or a number or text to be written.", - "de": "Die Werte, die in den Ausgabestatus geschrieben werden sollen, können in 'Wert JA' und 'Wert NEIN' definiert werden, z.B. 'true' für boolesche Zustände oder eine Zahl oder Text, der geschrieben werden soll.", - "ru": "Значения, которые должны быть записаны в состояние вывода, могут быть определены в 'значение ДА' и 'значение НЕТ', например, 'true' для булевых состояний или число или текст, который должен быть записан.", - "pt": "Os valores a serem escritos no estado de saída podem ser definidos em 'valor SIM' e 'valor NÃO', por exemplo, 'true' para estados booleanos, ou um número ou texto a ser escrito.", - "nl": "De waarden die moeten worden geschreven naar de uitvoerstatus kunnen worden gedefinieerd in 'waarde JA' en 'waarde NEE', bijvoorbeeld 'true' voor booleaanse toestanden, of een getal of tekst om te schrijven.", - "fr": "Les valeurs à écrire dans l'état de sortie peuvent être définies dans 'valeur OUI' et 'valeur NON', par exemple 'true' pour les états booléens, ou un nombre ou un texte à écrire.", - "it": "I valori da scrivere nello stato di uscita possono essere definiti in 'valore SÌ' e 'valore NO', ad esempio 'true' per gli stati booleani, o un numero o un testo da scrivere.", - "es": "Los valores que se deben escribir en el estado de salida se pueden definir en 'valor SÍ' y 'valor NO', por ejemplo, 'true' para estados booleanos, o un número o texto que se debe escribir.", - "pl": "Wartości do zapisania w stanie wyjściowym można zdefiniować w 'wartość TAK' i 'wartość NIE', na przykład 'true' dla stanów logicznych lub liczby lub tekst do zapisania.", - "uk": "Значення, які слід записувати в вихідний стан, можуть бути визначені у 'значення ТАК' і 'значення НІ', наприклад, 'true' для булевих станів або число або текст для запису.", - "zh-cn": "要写入输出状态的值可以在'值是'和'值否'中定义,例如,对于布尔状态可以使用'true',或者可以写入数字或文本。" - }, + "label": "LBL_item_chValueOn", + "tooltip": "TTIP_item_chValueOn", "maxLength": 20, "attr": "chValueOn", - "filter": false, - "sort": false, - "width": "10%", - "default": "" + "default": "true", + "xs": 12, + "sm": 12, + "md": 6, + "lg": 6, + "xl": 6 }, { "type": "text", - "title": { - "en": "Value NO", - "de": "Wert NEIN", - "ru": "Значение НЕТ", - "pt": "Valor NÃO", - "nl": "Waarde NEE", - "fr": "Valeur NON", - "it": "Valore NO", - "es": "Valor NO", - "pl": "Wartość NIE", - "uk": "Значення НІ", - "zh-cn": "值 否" - }, - "tooltip": { - "en": "The values to be written to the output state can be defined in 'value YES' and 'value NO,' e.g., 'true' for boolean states, or a number or text to be written.", - "de": "Die Werte, die in den Ausgabestatus geschrieben werden sollen, können in 'Wert JA' und 'Wert NEIN' definiert werden, z.B. 'true' für boolesche Zustände oder eine Zahl oder Text, der geschrieben werden soll.", - "ru": "Значения, которые должны быть записаны в состояние вывода, могут быть определены в 'значение ДА' и 'значение НЕТ', например, 'true' для булевых состояний или число или текст, который должен быть записан.", - "pt": "Os valores a serem escritos no estado de saída podem ser definidos em 'valor SIM' e 'valor NÃO', por exemplo, 'true' para estados booleanos, ou um número ou texto a ser escrito.", - "nl": "De waarden die moeten worden geschreven naar de uitvoerstatus kunnen worden gedefinieerd in 'waarde JA' en 'waarde NEE', bijvoorbeeld 'true' voor booleaanse toestanden, of een getal of tekst om te schrijven.", - "fr": "Les valeurs à écrire dans l'état de sortie peuvent être définies dans 'valeur OUI' et 'valeur NON', par exemple 'true' pour les états booléens, ou un nombre ou un texte à écrire.", - "it": "I valori da scrivere nello stato di uscita possono essere definiti in 'valore SÌ' e 'valore NO', ad esempio 'true' per gli stati booleani, o un numero o un testo da scrivere.", - "es": "Los valores que se deben escribir en el estado de salida se pueden definir en 'valor SÍ' y 'valor NO', por ejemplo, 'true' para estados booleanos, o un número o texto que se debe escribir.", - "pl": "Wartości do zapisania w stanie wyjściowym można zdefiniować w 'wartość TAK' i 'wartość NIE', na przykład 'true' dla stanów logicznych lub liczby lub tekst do zapisania.", - "uk": "Значення, які слід записувати в вихідний стан, можуть бути визначені у 'значення ТАК' і 'значення НІ', наприклад, 'true' для булевих станів або число або текст для запису.", - "zh-cn": "要写入输出状态的值可以在'值是'和'值否'中定义,例如,对于布尔状态可以使用'true',或者可以写入数字或文本。" - }, + "label": "LBL_item_chValueOff", + "tooltip": "TTIP_item_chValueOff", "maxLength": 20, "attr": "chValueOff", - "filter": false, - "sort": false, - "width": "7.5%", - "default": "" + "default": "false", + "xs": 12, + "sm": 12, + "md": 6, + "lg": 6, + "xl": 6 }, { "type": "objectId", - "title": { - "en": "Target State 2", - "de": "Zielzustand 2", - "ru": "Целевое состояние 2", - "pt": "Estado alvo 2", - "nl": "Doelstaat 2", - "fr": "État cible 2", - "it": "Stato di destinazione 2", - "es": "Estado objetivo 2", - "pl": "Stan docelowy 2", - "uk": "Цільовий стан 2", - "zh-cn": "目标状态 2" - }, + "label": "LBL_item_chTargetState2", + "tooltip": "TTIP_item_chTargetState2", "attr": "chTargetState2", - "filter": false, - "sort": false, - "width": "15%", - "hidden": "data.chType !== 7" + "hidden": "data.chType !== 7", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12 }, + { "type": "text", - "title": { - "en": "Value YES 2", - "de": "Wert JA 2", - "ru": "Значение ДА 2", - "pt": "Valor SIM 2", - "nl": "Waarde JA 2", - "fr": "Valeur OUI 2", - "it": "Valore SÌ 2", - "es": "Valor SÍ 2", - "pl": "Wartość TAK 2", - "uk": "Значення ТАК 2", - "zh-cn": "值 是 2" - }, - "tooltip": { - "en": "The values to be written to the output state can be defined in 'value YES' and 'value NO,' e.g., 'true' for boolean states, or a number or text to be written.", - "de": "Die Werte, die in den Ausgabestatus geschrieben werden sollen, können in 'Wert JA' und 'Wert NEIN' definiert werden, z.B. 'true' für boolesche Zustände oder eine Zahl oder Text, der geschrieben werden soll.", - "ru": "Значения, которые должны быть записаны в состояние вывода, могут быть определены в 'значение ДА' и 'значение НЕТ', например, 'true' для булевых состояний или число или текст, который должен быть записан.", - "pt": "Os valores a serem escritos no estado de saída podem ser definidos em 'valor SIM' e 'valor NÃO', por exemplo, 'true' para estados booleanos, ou um número ou texto a ser escrito.", - "nl": "De waarden die moeten worden geschreven naar de uitvoerstatus kunnen worden gedefinieerd in 'waarde JA' en 'waarde NEE', bijvoorbeeld 'true' voor booleaanse toestanden, of een getal of tekst om te schrijven.", - "fr": "Les valeurs à écrire dans l'état de sortie peuvent être définies dans 'valeur OUI' et 'valeur NON', par exemple 'true' pour les états booléens, ou un nombre ou un texte à écrire.", - "it": "I valori da scrivere nello stato di uscita possono essere definiti in 'valore SÌ' e 'valore NO', ad esempio 'true' per gli stati booleani, o un numero o un testo da scrivere.", - "es": "Los valores que se deben escribir en el estado de salida se pueden definir en 'valor SÍ' y 'valor NO', por ejemplo, 'true' para estados booleanos, o un número o texto que se debe escribir.", - "pl": "Wartości do zapisania w stanie wyjściowym można zdefiniować w 'wartość TAK' i 'wartość NIE', na przykład 'true' dla stanów logicznych lub liczby lub tekst do zapisania.", - "uk": "Значення, які слід записувати в вихідний стан, можуть бути визначені у 'значення ТАК' і 'значення НІ', наприклад, 'true' для булевих станів або число або текст для запису.", - "zh-cn": "要写入输出状态的值可以在'值是'和'值否'中定义,例如,对于布尔状态可以使用'true',或者可以写入数字或文本。" - }, + "label": "LBL_item_chValueOn2", + "tooltip": "TTIP_item_chValueOn2", "maxLength": 20, "attr": "chValueOn2", - "filter": false, - "sort": false, - "width": "7.5%", - "default": "", + "default": "true", + "xs": 12, + "sm": 12, + "md": 6, + "lg": 6, + "xl": 6, "hidden": "data.chType !== 7" }, { "type": "text", - "title": { - "en": "Value NO 2", - "de": "Wert NEIN 2", - "ru": "Значение НЕТ 2", - "pt": "Valor NÃO 2", - "nl": "Waarde NEE 2", - "fr": "Valeur NON 2", - "it": "Valore NO 2", - "es": "Valor NO 2", - "pl": "Wartość NIE 2", - "uk": "Значення НІ 2", - "zh-cn": "值 否 2" - }, - "tooltip": { - "en": "The values to be written to the output state can be defined in 'value YES' and 'value NO,' e.g., 'true' for boolean states, or a number or text to be written.", - "de": "Die Werte, die in den Ausgabestatus geschrieben werden sollen, können in 'Wert JA' und 'Wert NEIN' definiert werden, z.B. 'true' für boolesche Zustände oder eine Zahl oder Text, der geschrieben werden soll.", - "ru": "Значения, которые должны быть записаны в состояние вывода, могут быть определены в 'значение ДА' и 'значение НЕТ', например, 'true' для булевых состояний или число или текст, который должен быть записан.", - "pt": "Os valores a serem escritos no estado de saída podem ser definidos em 'valor SIM' e 'valor NÃO', por exemplo, 'true' para estados booleanos, ou um número ou texto a ser escrito.", - "nl": "De waarden die moeten worden geschreven naar de uitvoerstatus kunnen worden gedefinieerd in 'waarde JA' en 'waarde NEE', bijvoorbeeld 'true' voor booleaanse toestanden, of een getal of tekst om te schrijven.", - "fr": "Les valeurs à écrire dans l'état de sortie peuvent être définies dans 'valeur OUI' et 'valeur NON', par exemple 'true' pour les états booléens, ou un nombre ou un texte à écrire.", - "it": "I valori da scrivere nello stato di uscita possono essere definiti in 'valore SÌ' e 'valore NO', ad esempio 'true' per gli stati booleani, o un numero o un testo da scrivere.", - "es": "Los valores que se deben escribir en el estado de salida se pueden definir en 'valor SÍ' y 'valor NO', por ejemplo, 'true' para estados booleanos, o un número o texto que se debe escribir.", - "pl": "Wartości do zapisania w stanie wyjściowym można zdefiniować w 'wartość TAK' i 'wartość NIE', na przykład 'true' dla stanów logicznych lub liczby lub tekst do zapisania.", - "uk": "Значення, які слід записувати в вихідний стан, можуть бути визначені у 'значення ТАК' і 'значення НІ', наприклад, 'true' для булевих станів або число або текст для запису.", - "zh-cn": "要写入输出状态的值可以在'值是'和'值否'中定义,例如,对于布尔状态可以使用'true',或者可以写入数字或文本。" - }, + "label": "LBL_item_chValueOff2", + "tooltip": "TTIP_item_chValueOff2", "maxLength": 20, "attr": "chValueOff2", - "filter": false, - "sort": false, - "width": "7.5%", - "default": "", + "default": "false", + "xs": 12, + "sm": 12, + "md": 6, + "lg": 6, + "xl": 6, "hidden": "data.chType !== 7" } ] @@ -1006,271 +657,177 @@ "_calculatorhelp1": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": "Channels can be activated or deactivated in a corresponding state.", - "de": "Kanäle können in einem entsprechenden Zustand aktiviert oder deaktiviert werden.", - "ru": "Каналы могут быть активированы или деактивированы в соответствующем состоянии.", - "pt": "Os canais podem ser ativados ou desativados em um estado correspondente.", - "nl": "Kanalen kunnen worden geactiveerd of gedeactiveerd in een overeenkomstige status.", - "fr": "Les canaux peuvent être activés ou désactivés dans un état correspondant.", - "it": "I canali possono essere attivati o disattivati in uno stato corrispondente.", - "es": "Los canales se pueden activar o desactivar en un estado correspondiente.", - "pl": "Kanały można aktywować lub dezaktywować w odpowiednim stanie.", - "uk": "Канали можуть бути активовані або деактивовані в відповідному стані.", - "zh-cn": "通道可以在相应状态下激活或停用。" - }, + "label": "LBL_calculatorhelp1", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp2": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": "All states of a calculator channel are placed near the homes states, named by the channel number.", - "de": "Alle Zustände eines Rechnerkanals sind in der Nähe der Hauszustände platziert und sind nach der Kanalnummer benannt.", - "ru": "Все состояния канала калькулятора размещены рядом со состояниями дома и названы номером канала.", - "pt": "Todos os estados de um canal de calculadora são colocados perto dos estados das casas, nomeados pelo número do canal.", - "nl": "Alle toestanden van een calculator-kanaal worden in de buurt van de toestanden van de huizen geplaatst en worden genoemd naar het kanaalnummer.", - "fr": "Tous les états d'un canal de calculatrice sont placés à proximité des états des maisons, nommés par le numéro du canal.", - "it": "Tutti gli stati di un canale del calcolatore sono posizionati vicino agli stati delle abitazioni, denominati per numero di canale.", - "es": "Todos los estados de un canal de calculadora se colocan cerca de los estados de las viviendas, nombrados por el número del canal.", - "pl": "Wszystkie stany kanału kalkulatora są umieszczone w pobliżu stanów domów i nazwane numerem kanału.", - "uk": "Всі стани калькуляторного каналу розташовані поруч зі станами будинків і названі номером каналу.", - "zh-cn": "计算器通道的所有状态都位于家庭状态附近,以通道号命名。" - }, + "label": "LBL_calculatorhelp2", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp3": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": "The behavior of a channel is defined by its type: 'best cost'; 'best single hours'; 'best hours block'.", - "de": "Das Verhalten eines Kanals wird durch seinen Typ definiert: 'beste Kosten'; 'beste Einzelstunden'; 'beste Stundenblock'.", - "ru": "Поведение канала определяется его типом: 'лучшие затраты'; 'лучшие отдельные часы'; 'лучший часовой блок'.", - "pt": "O comportamento de um canal é definido por seu tipo: 'melhor custo'; 'melhores horas únicas'; 'melhor bloco de horas'.", - "nl": "Het gedrag van een kanaal wordt bepaald door het type: 'beste kosten'; 'beste enkele uren'; 'beste uren blok'.", - "fr": "Le comportement d'un canal est défini par son type : 'meilleur coût' ; 'meilleures heures uniques' ; 'meilleur bloc d'heures'.", - "it": "Il comportamento di un canale è definito dal suo tipo: 'miglior costo'; 'migliori ore singole'; 'miglior blocco di ore'.", - "es": "El comportamiento de un canal se define por su tipo: 'mejor costo'; 'mejores horas individuales'; 'mejor bloque de horas'.", - "pl": "Zachowanie kanału jest określane przez jego typ: 'najlepszy koszt'; 'najlepsze pojedyncze godziny'; 'najlepszy blok godzin'.", - "uk": "Поведінка каналу визначається його типом: 'найкращі витрати'; 'найкращі години'; 'найкращий годинний блок'.", - "zh-cn": "通道的行为由其类型定义:'最佳成本';'最佳单个小时';'最佳小时块'" - }, + "label": "LBL_calculatorhelp3", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp4": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": "Each channel has an external state as output, which can be chosen in the settings tab. This state could be, for example, '0_userdata.0.example_state' or any other writable external state.", - "de": "Jeder Kanal hat einen externen Zustand als Ausgabe, der im Einstellungstab ausgewählt werden kann. Dieser Zustand könnte beispielsweise '0_userdata.0.example_state' oder ein anderer beschreibbarer externer Zustand sein.", - "ru": "У каждого канала есть внешнее состояние в качестве выхода, которое можно выбрать во вкладке настроек. Этим состоянием может быть, например, '0_userdata.0.example_state' или любое другое записываемое внешнее состояние.", - "pt": "Cada canal tem um estado externo como saída, que pode ser escolhido na guia de configurações. Este estado pode ser, por exemplo, '0_userdata.0.example_state' ou qualquer outro estado externo gravável.", - "nl": "Elk kanaal heeft een extern staat als uitvoer, die kan worden gekozen in het instellingen tabblad. Deze staat kan bijvoorbeeld '0_userdata.0.example_state' zijn of een andere beschrijfbare externe staat.", - "fr": "Chaque canal a un état externe en sortie, qui peut être choisi dans l'onglet des paramètres. Cet état pourrait être, par exemple, '0_userdata.0.example_state' ou tout autre état externe inscriptible.", - "it": "Ogni canale ha uno stato esterno come uscita, che può essere scelto nella scheda delle impostazioni. Questo stato potrebbe essere, ad esempio, '0_userdata.0.example_state' o qualsiasi altro stato esterno scrivibile.", - "es": "Cada canal tiene un estado externo como salida, que se puede elegir en la pestaña de configuración. Este estado podría ser, por ejemplo, '0_userdata.0.example_state' u cualquier otro estado externo escribible.", - "pl": "Każdy kanał ma stan zewnętrzny jako wyjście, który można wybrać w karcie ustawień. Stan ten może być na przykład '0_userdata.0.example_state' lub dowolny inny zapisywalny stan zewnętrzny.", - "uk": "У кожного каналу є зовнішній стан як вихід, який можна вибрати в вкладці налаштувань. Цей стан може бути, наприклад, '0_userdata.0.example_state' або будь-який інший записуваний зовнішній стан.", - "zh-cn": "每个通道都有一个外部状态作为输出,可以在设置选项卡中选择。此状态可以是,例如,'0_userdata.0.example_state'或任何其他可写的外部状态。" - }, + "label": "LBL_calculatorhelp4", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp5": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": "If no external output state is selected, an internal state within the channel's range will be created.", - "de": "Wenn kein externer Ausgangszustand ausgewählt ist, wird ein interner Zustand innerhalb des Kanalbereichs erstellt.", - "ru": "Если не выбран внешний выходной статус, будет создан внутренний статус в пределах диапазона канала.", - "pt": "Se nenhum estado de saída externo for selecionado, um estado interno dentro do alcance do canal será criado.", - "nl": "Als er geen externe uitvoerstatus is geselecteerd, wordt een interne status binnen het bereik van het kanaal aangemaakt.", - "fr": "Si aucun état de sortie externe n'est sélectionné, un état interne dans la plage du canal sera créé.", - "it": "Se non viene selezionato uno stato di uscita esterno, verrà creato uno stato interno entro il raggio del canale.", - "es": "Si no se selecciona un estado de salida externo, se creará un estado interno dentro del rango del canal.", - "pl": "Jeśli nie zostanie wybrany zewnętrzny stan wyjściowy, zostanie utworzony stan wewnętrzny w zakresie kanału.", - "uk": "Якщо не вибрано зовнішній вихідний стан, буде створено внутрішній стан у межах діапазону каналу.", - "zh-cn": "如果未选择外部输出状态,则会在通道范围内创建内部状态。" - }, + "label": "LBL_calculatorhelp5", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp6": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": "The values to be written to the output state can be defined in 'value YES' and 'value NO,' e.g., 'true' for boolean states, or a number or text to be written.", - "de": "Die Werte, die in den Ausgabestatus geschrieben werden sollen, können in 'Wert JA' und 'Wert NEIN' definiert werden, z.B. 'true' für boolesche Zustände oder eine Zahl oder Text, der geschrieben werden soll.", - "ru": "Значения, которые должны быть записаны в состояние вывода, могут быть определены в 'значение ДА' и 'значение НЕТ', например, 'true' для булевых состояний или число или текст, который должен быть записан.", - "pt": "Os valores a serem escritos no estado de saída podem ser definidos em 'valor SIM' e 'valor NÃO', por exemplo, 'true' para estados booleanos, ou um número ou texto a ser escrito.", - "nl": "De waarden die moeten worden geschreven naar de uitvoerstatus kunnen worden gedefinieerd in 'waarde JA' en 'waarde NEE', bijvoorbeeld 'true' voor booleaanse toestanden, of een getal of tekst om te schrijven.", - "fr": "Les valeurs à écrire dans l'état de sortie peuvent être définies dans 'valeur OUI' et 'valeur NON', par exemple 'true' pour les états booléens, ou un nombre ou un texte à écrire.", - "it": "I valori da scrivere nello stato di uscita possono essere definiti in 'valore SÌ' e 'valore NO', ad esempio 'true' per gli stati booleani, o un numero o un testo da scrivere.", - "es": "Los valores que se deben escribir en el estado de salida se pueden definir en 'valor SÍ' y 'valor NO', por ejemplo, 'true' para estados booleanos, o un número o texto que se debe escribir.", - "pl": "Wartości do zapisania w stanie wyjściowym można zdefiniować w 'wartość TAK' i 'wartość NIE', na przykład 'true' dla stanów logicznych lub liczby lub tekst do zapisania.", - "uk": "Значення, які слід записувати в вихідний стан, можуть бути визначені у 'значення ТАК' і 'значення НІ', наприклад, 'true' для булевих станів або число або текст для запису.", - "zh-cn": "要写入输出状态的值可以在'值是'和'值否'中定义,例如,对于布尔状态可以使用'true',或者可以写入数字或文本。" - }, + "label": "LBL_calculatorhelp6", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp7": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": "Outputs:", - "de": "Ausgaben:", - "ru": "Вывод:", - "pt": "Saídas:", - "nl": "Uitvoer:", - "fr": "Sorties:", - "it": "Uscite:", - "es": "Salidas:", - "pl": "Wyniki:", - "uk": "Виводи:", - "zh-cn": "输出:" - }, + "label": "LBL_calculatorhelp7", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp8": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": " 'Best cost': Utilizes the 'TriggerPrice' object as input, producing a 'YES' output every hour when the current Tibber energy cost is below the trigger price", - "de": " 'Beste Kosten': Verwendet das Objekt 'TriggerPrice' als Eingabe und erzeugt jede Stunde eine 'YES'-Ausgabe, wenn die aktuellen Tibber-Energiekosten unter dem Auslösepreis liegen", - "ru": " 'Лучшие затраты': Использует объект 'TriggerPrice' в качестве входных данных, выдающее 'YES' каждый час, когда текущая стоимость энергии Tibber ниже цены триггера", - "pt": " 'Melhor custo': Utiliza o objeto 'TriggerPrice' como entrada, produzindo uma saída 'YES' a cada hora quando o custo de energia atual da Tibber estiver abaixo do preço de gatilho", - "nl": " 'Beste kost': Gebruikt het object 'TriggerPrice' als invoer, geeft elke uur een 'JA'-uitvoer wanneer de huidige Tibber energiekosten onder de drempelprijs liggen", - "fr": " 'Meilleur coût': Utilise l'objet 'TriggerPrice' comme entrée, produisant une sortie 'YES' chaque heure lorsque le coût actuel de l'énergie Tibber est inférieur au prix déclencheur", - "it": " 'Miglior costo': Utilizza l'oggetto 'TriggerPrice' come input, producendo un output 'YES' ogni ora quando il costo energetico corrente di Tibber è inferiore al prezzo di trigger", - "es": " 'Mejor costo': Utiliza el objeto 'TriggerPrice' como entrada, produciendo una salida 'YES' cada hora cuando el costo actual de la energía Tibber está por debajo del precio de activación", - "pl": " 'Najlepszy koszt': Wykorzystuje obiekt 'TriggerPrice' jako wejście, generując wyjście 'YES' co godzinę, gdy aktualny koszt energii Tibber jest poniżej ceny wyzwalacza", - "uk": " 'Best cost': Використовує об'єкт 'TriggerPrice' як вхідні дані, видає 'YES' кожну годину, коли поточна вартість енергії Tibber нижче тригер-ціни", - "zh-cn": " '最佳成本':使用'TriggerPrice'对象作为输入,当当前Tibber能源成本低于触发价格时,每小时产生'YES'输出" - }, + "label": "LBL_calculatorhelp8", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp9": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": " 'Best single hours': Generates a 'YES' output during the least expensive hours, with the number defined in the 'AmountHours' object", - "de": " 'Beste Einzelstunden': Erzeugt eine 'YES'-Ausgabe während der kostengünstigsten Stunden, mit der im Objekt 'AmountHours' definierten Anzahl", - "ru": " 'Лучшие одиночные часы': Генерирует выход 'YES' во время наименее дорогих часов, с количеством, определенным в объекте 'AmountHours'", - "pt": " 'Melhores horas únicas': Gera uma saída 'YES' durante as horas menos caras, com o número definido no objeto 'AmountHours'", - "nl": " 'Beste enkele uren': Genereert een 'JA'-uitvoer tijdens de goedkoopste uren, met het aantal gedefinieerd in het object 'AmountHours'", - "fr": " 'Meilleures heures uniques': Génère une sortie 'YES' pendant les heures les moins chères, avec le nombre défini dans l'objet 'AmountHours'", - "it": " 'Migliori ore singole': Genera un'uscita 'YES' durante le ore meno costose, con il numero definito nell'oggetto 'AmountHours'", - "es": " 'Mejores horas individuales': Genera una salida 'YES' durante las horas menos costosas, con el número definido en el objeto 'AmountHours'", - "pl": " 'Najlepsze pojedyncze godziny': Generuje wyjście 'YES' w trakcie najtańszych godzin, z liczbą określoną w obiekcie 'AmountHours'", - "uk": " 'Найкращі одиночні години': Генерує вихід 'YES' протягом найменш дорогих годин, з числом, визначеним у об'єкті 'AmountHours'", - "zh-cn": " '最佳单小时': 在最便宜的小时内生成'YES'输出,其数量在'AmountHours'对象中定义" - }, + "label": "LBL_calculatorhelp9", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp10": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": " 'Best hours block': Outputs 'YES' during the most cost-effective block of hours, with the number of hours specified in the 'AmountHours' object", - "de": " 'Bester Stundenblock': Gibt 'YES' während des kostengünstigsten Stundenblocks aus, mit der im Objekt 'AmountHours' festgelegten Anzahl von Stunden", - "ru": " 'Лучший блок часов': Выводит 'YES' во время наиболее эффективного по стоимости блока часов, с указанием количества часов в объекте 'AmountHours'", - "pt": " 'Melhor bloco de horas': Gera 'YES' durante o bloco de horas mais econômico, com o número de horas especificado no objeto 'AmountHours'", - "nl": " 'Beste uren blok': Geeft 'JA' uit tijdens het meest kosteneffectieve blok van uren, met het aantal uur gespecificeerd in het object 'AmountHours'", - "fr": " 'Meilleur bloc d'heures': Produit 'YES' pendant le bloc d'heures le plus rentable, avec le nombre d'heures spécifié dans l'objet 'AmountHours'", - "it": " 'Miglior blocco di ore': Emette un'uscita 'YES' durante il blocco di ore più conveniente, con il numero di ore specificato nell'oggetto 'AmountHours'", - "es": " 'Mejor bloque de horas': Genera 'YES' durante el bloque de horas más rentable, con el número de horas especificado en el objeto 'AmountHours'", - "pl": " 'Najlepszy blok godzin': Generuje 'YES' podczas najbardziej opłacalnego bloku godzin, z liczbą godzin określoną w obiekcie 'AmountHours'", - "uk": " 'Кращий блок годин': Виводить 'YES' під час найбільш вигідного блоку годин, із зазначенням кількості годин у об'єкті 'AmountHours'", - "zh-cn": " '最佳时段': 在最经济的小时内输出'YES',在'AmountHours'对象中指定的小时数" - }, + "label": "LBL_calculatorhelp10", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp11": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": " 'Best cost LTF': 'Best cost' within a Limited Time Frame (LTF)", - "de": " 'Beste Kosten LTF': 'Beste Kosten' innerhalb eines begrenzten Zeitrahmens (LTF)", - "ru": " 'Лучшие затраты LTF': 'Лучшие затраты' в пределах ограниченного временного интервала (LTF)", - "pt": " 'Melhor custo LTF': 'Melhor custo' dentro de um quadro de tempo limitado (LTF)", - "nl": " 'Beste kosten LTF': 'Beste kosten' binnen een beperkt tijdsbestek (LTF)", - "fr": " 'Meilleur coût LTF': 'Meilleur coût' dans un cadre temporel limité (LTF)", - "it": " 'Miglior costo LTF': 'Miglior costo' all'interno di un periodo di tempo limitato (LTF)", - "es": " 'Mejor costo LTF': 'Mejor costo' dentro de un Marco de Tiempo Limitado (LTF)", - "pl": " 'Najlepsze koszty LTF': 'Najlepsze koszty' w ramach ograniczonego okresu czasu (LTF)", - "uk": " 'Найкращі витрати LTF': 'Найкращі витрати' в межах обмеженого часового проміжку (LTF)", - "zh-cn": " '最佳成本 LTF': 在有限时间范围内的'最佳成本' (LTF)" - }, + "label": "LBL_calculatorhelp11", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp12": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": " 'Best single hours LTF': 'Best single hours' within a Limited Time Frame (LTF)", - "de": " 'Beste Einzelstunden LTF': 'Beste Einzelstunden' innerhalb eines begrenzten Zeitrahmens (LTF)", - "ru": " 'Лучшие одиночные часы LTF': 'Лучшие одиночные часы' в пределах ограниченного временного интервала (LTF)", - "pt": " 'Melhores horas únicas LTF': 'Melhores horas únicas' dentro de um quadro de tempo limitado (LTF)", - "nl": " 'Beste enkele uren LTF': 'Beste enkele uren' binnen een beperkt tijdsbestek (LTF)", - "fr": " 'Meilleures heures uniques LTF': 'Meilleures heures uniques' dans un cadre temporel limité (LTF)", - "it": " 'Miglior ore singole LTF': 'Miglior ore singole' all'interno di un periodo di tempo limitato (LTF)", - "es": " 'Mejor horas individuales LTF': 'Mejor horas individuales' dentro de un Marco de Tiempo Limitado (LTF)", - "pl": " 'Najlepsze pojedyncze godziny LTF': 'Najlepsze pojedyncze godziny' w ramach ograniczonego okresu czasu (LTF)", - "uk": " 'Найкращі одиночні години LTF': 'Найкращі одиночні години' в межах обмеженого часового проміжку (LTF)", - "zh-cn": " '最佳单小时 LTF': 在有限时间范围内的'最佳单小时' (LTF)" - }, + "label": "LBL_calculatorhelp12", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp13": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": " 'Best hours block LTF': 'Best hours block' within a Limited Time Frame (LTF)", - "de": " 'Bester Stundenblock LTF': 'Bester Stundenblock' innerhalb eines begrenzten Zeitrahmens (LTF)", - "ru": " 'Лучший блок часов LTF': 'Лучший блок часов' в пределах ограниченного временного интервала (LTF)", - "pt": " 'Melhor bloco de horas LTF': 'Melhor bloco de horas' dentro de um quadro de tempo limitado (LTF)", - "nl": " 'Beste uren blok LTF': 'Beste uren blok' binnen een beperkt tijdsbestek (LTF)", - "fr": " 'Meilleur bloc d'heures LTF': 'Meilleur bloc d'heures' dans un cadre temporel limité (LTF)", - "it": " 'Miglior blocco di ore LTF': 'Miglior blocco di ore' all'interno di un periodo di tempo limitato (LTF)", - "es": " 'Mejor bloque de horas LTF': 'Mejor bloque de horas' dentro de un Marco de Tiempo Limitado (LTF)", - "pl": " 'Najlepszy blok godzin LTF': 'Najlepszy blok godzin' w ramach ograniczonego okresu czasu (LTF)", - "uk": " 'Найкращий блок годин LTF': 'Найкращий блок годин' в межах обмеженого часового проміжку (LTF)", - "zh-cn": " '最佳时段 LTF': 在有限时间范围内的'最佳时段' (LTF)" - }, + "label": "LBL_calculatorhelp13", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp14": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": " 'Smart Battery Buffer': Utilize the 'EfficiencyLoss' parameter to specify the efficiency loss of the battery system. Use the 'AmountHours' parameter to input the desired number of hours for battery charging. The calculator will activate battery charging ('value YES') and deactivate battery feed ('value 2 NO') during the specified 'AmountHours' cheapest hours. Conversely, it will deactivate battery charging ('value NO') and activate battery feed ('value 2 YES') during hours with the highest cost, provided the cost is higher than the highest total price among the cheap hours. In the remaining normal hours where energy buffering by the battery is not economically viable, both outputs will be switched off.", - "de": " 'Intelligenter Batteriepuffer': Verwenden Sie den Parameter 'EfficiencyLoss', um den Wirkungsgradverlust des Batteriesystems anzugeben. Verwenden Sie den Parameter 'AmountHours', um die gewünschte Anzahl von Stunden für das Laden der Batterie einzugeben. Der Rechner aktiviert das Batterieladen ('Wert YES') und deaktiviert die Batteriezufuhr ('Wert 2 NO') während der angegebenen 'AmountHours' günstigsten Stunden. Umgekehrt deaktiviert er das Batterieladen ('Wert NO') und aktiviert die Batteriezufuhr ('Wert 2 YES') während der Stunden mit den höchsten Kosten, vorausgesetzt, die Kosten sind höher als der höchste Gesamtpreis unter den günstigen Stunden. In den verbleibenden normalen Stunden, in denen eine Energiespeicherung durch die Batterie wirtschaftlich nicht sinnvoll ist, werden beide Ausgänge ausgeschaltet.", - "ru": " 'Умный буфер батареи': Используйте параметр 'EfficiencyLoss', чтобы указать потери эффективности батарейной системы. Используйте параметр 'AmountHours', чтобы ввести желаемое количество часов для зарядки батареи. Калькулятор активирует зарядку батареи ('значение YES') и деактивирует подачу батареи ('значение 2 NO') в течение указанных 'AmountHours' самых дешевых часов. Напротив, он деактивирует зарядку батареи ('значение NO') и активирует подачу батареи ('значение 2 YES') в часы с наивысшей стоимостью, при условии, что стоимость выше самой высокой общей цены среди дешевых часов. В оставшиеся обычные часы, когда энергия буферизации батареи экономически нецелесообразна, оба выхода будут отключены.", - "pt": " 'Buffer de bateria inteligente': Utilize o parâmetro 'EfficiencyLoss' para especificar a perda de eficiência do sistema de bateria. Use o parâmetro 'AmountHours' para inserir o número desejado de horas para carregar a bateria. A calculadora ativará o carregamento da bateria ('valor YES') e desativará a alimentação da bateria ('valor 2 NO') durante as horas mais baratas especificadas em 'AmountHours'. Ao contrário, desativará o carregamento da bateria ('valor NO') e ativará a alimentação da bateria ('valor 2 YES') durante as horas com o maior custo, desde que o custo seja maior que o preço total mais alto entre as horas mais baratas. Nas horas normais restantes, em que o armazenamento de energia pela bateria não é economicamente viável, ambas as saídas serão desligadas.", - "nl": " 'Slimme batterijbuffer': Gebruik de parameter 'EfficiencyLoss' om het rendementsverlies van het batterijsysteem aan te geven. Gebruik de parameter 'AmountHours' om het gewenste aantal uren voor het opladen van de batterij in te voeren. De rekenmachine activeert het opladen van de batterij ('waarde YES') en deactiveert de batterijtoevoer ('waarde 2 NO') tijdens de gespecificeerde 'AmountHours' goedkoopste uren. Omgekeerd zal het het opladen van de batterij deactiveren ('waarde NO') en de batterijtoevoer activeren ('waarde 2 YES') tijdens uren met de hoogste kosten, op voorwaarde dat de kosten hoger zijn dan de hoogste totale prijs onder de goedkope uren. In de overige normale uren waar energiebuffering door de batterij niet economisch haalbaar is, worden beide uitgangen uitgeschakeld.", - "fr": " 'Tampon de batterie intelligent': Utilisez le paramètre 'EfficiencyLoss' pour spécifier la perte d'efficacité du système de batterie. Utilisez le paramètre 'AmountHours' pour entrer le nombre d'heures souhaité pour la charge de la batterie. Le calculateur activera la charge de la batterie ('valeur YES') et désactivera l'alimentation de la batterie ('valeur 2 NO') pendant les heures les moins chères spécifiées dans 'AmountHours'. Inversement, il désactivera la charge de la batterie ('valeur NO') et activera l'alimentation de la batterie ('valeur 2 YES') pendant les heures les plus coûteuses, à condition que le coût soit supérieur au prix total le plus élevé parmi les heures bon marché. Pendant les heures normales restantes où le tamponnement d'énergie par la batterie n'est pas économiquement viable, les deux sorties seront désactivées.", - "it": " 'Buffer batteria intelligente': Utilizza il parametro 'EfficiencyLoss' per specificare la perdita di efficienza del sistema di batterie. Usa il parametro 'AmountHours' per inserire il numero desiderato di ore per la ricarica della batteria. La calcolatrice attiverà la ricarica della batteria ('valore YES') e disattiverà l'alimentazione della batteria ('valore 2 NO') durante le 'AmountHours' ore più economiche specificate. Al contrario, disattiverà la ricarica della batteria ('valore NO') e attiverà l'alimentazione della batteria ('valore 2 YES') durante le ore con il costo più elevato, a condizione che il costo sia superiore al prezzo totale più alto tra le ore economiche. Nelle restanti ore normali in cui il buffering energetico della batteria non è economicamente vantaggioso, entrambe le uscite verranno disattivate.", - "es": " 'Buffer de batería inteligente': Utilice el parámetro 'EfficiencyLoss' para especificar la pérdida de eficiencia del sistema de batería. Utilice el parámetro 'AmountHours' para ingresar la cantidad deseada de horas para la carga de la batería. La calculadora activará la carga de la batería ('valor YES') y desactivará la alimentación de la batería ('valor 2 NO') durante las horas más baratas especificadas en 'AmountHours'. Por el contrario, desactivará la carga de la batería ('valor NO') y activará la alimentación de la batería ('valor 2 YES') durante las horas con el mayor costo, siempre que el costo sea mayor que el precio total más alto entre las horas baratas. En las horas normales restantes en las que el almacenamiento de energía por la batería no es económicamente viable, ambas salidas se apagarán.", - "pl": " 'Inteligentny bufor baterii': Użyj parametru 'EfficiencyLoss', aby określić straty wydajności systemu baterii. Użyj parametru 'AmountHours', aby wprowadzić żądaną liczbę godzin na ładowanie baterii. Kalkulator aktywuje ładowanie baterii ('wartość YES') i dezaktywuje podawanie baterii ('wartość 2 NO') podczas określonych 'AmountHours' najtańszych godzin. W przeciwnym razie dezaktywuje ładowanie baterii ('wartość NO') i aktywuje podawanie baterii ('wartość 2 YES') podczas godzin o najwyższym koszcie, pod warunkiem, że koszt jest wyższy niż najwyższa cena całkowita wśród tanich godzin. W pozostałych normalnych godzinach, gdy buforowanie energii przez baterię nie jest ekonomicznie opłacalne, obie wyjścia zostaną wyłączone.", - "uk": " 'Розумний буфер акумулятора': Використовуйте параметр 'EfficiencyLoss', щоб вказати втрати ефективності системи акумулятора. Використовуйте параметр 'AmountHours', щоб ввести бажану кількість годин для заряджання акумулятора. Калькулятор активує заряджання акумулятора ('значення YES') та вимкне живлення акумулятора ('значення 2 NO') протягом вказаних 'AmountHours' найдешевших годин. Навпаки, він вимкне заряджання акумулятора ('значення NO') та активує живлення акумулятора ('значення 2 YES') протягом годин з найвищою вартістю, за умови, що вартість вища за найвищу загальну ціну серед дешевих годин. В залишкові нормальні години, коли буферизація енергії акумулятором економічно невигідна, обидві виходи будуть вимкнені.", - "zh-cn": " '智能电池缓冲区': 使用 'EfficiencyLoss' 参数指定电池系统的效率损失。使用 'AmountHours' 参数输入所需的电池充电小时数。计算器将在指定的 'AmountHours' 最便宜的小时内激活电池充电('value YES')并停用电池供电('value 2 NO')。相反,在成本最高的小时内,前提是成本高于便宜小时中的最高总价,将停用电池充电('value NO')并激活电池供电('value 2 YES')。在电池缓冲能量在经济上不可行的其余正常小时内,两个输出都将关闭。" - }, + "label": "LBL_calculatorhelp14", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_calculatorhelp15": { "type": "staticText", "hidden": "!data.UseCalculator", - "label": { - "en": "LTF channels: Function similarly to standard channels but only operate within a time frame defined by the 'StartTime' and 'StopTime' state objects. After 'StopTime,' the channel deactivates itself. 'StartTime' and 'StopTime' may span over several days. The states must be filled with a date-time string in ISO-8601 format with a timezone offset, such as: '2023-11-17T21:00:00.000+01:00'", - "de": "LTF-Kanäle: Funktionieren ähnlich wie Standardkanäle, arbeiten jedoch nur innerhalb eines durch die Statusobjekte 'StartTime' und 'StopTime' definierten Zeitrahmens. Nach 'StopTime' deaktiviert sich der Kanal selbst. 'StartTime' und 'StopTime' können sich über mehrere Tage erstrecken. Die Zustände müssen mit einem Datum-Zeit-String im ISO-8601-Format mit einem Zeitzonenoffset gefüllt sein, z. B .: '2023-11-17T21:00:00.000+01:00'", - "ru": "LTF-каналы: Функционируют аналогично стандартным каналам, но работают только в пределах временного интервала, определенного объектами состояний 'StartTime' и 'StopTime'. После 'StopTime' канал деактивируется сам. 'StartTime' и 'StopTime' могут охватывать несколько дней. Состояния должны быть заполнены строкой даты-времени в формате ISO-8601 с смещением часового пояса, например: '2023-11-17T21:00:00.000+01:00'", - "pt": "Canais LTF: Funcionam de maneira semelhante aos canais padrão, mas operam apenas dentro de um intervalo de tempo definido pelos objetos de estado 'StartTime' e 'StopTime'. Após 'StopTime', o canal se desativa. 'StartTime' e 'StopTime' podem abranger vários dias. Os estados devem ser preenchidos com uma string de data e hora no formato ISO-8601 com um deslocamento de fuso horário, como: '2023-11-17T21:00:00.000+01:00'", - "nl": "LTF-kanalen: Functioneren op dezelfde manier als standaardkanalen, maar werken alleen binnen een tijdsbestek dat wordt gedefinieerd door de toestelobjecten 'StartTime' en 'StopTime'. Na 'StopTime' deactiveert het kanaal zichzelf. 'StartTime' en 'StopTime' kunnen zich over meerdere dagen uitstrekken. De staten moeten worden gevuld met een datum-tijdreeks in ISO-8601-indeling met een tijdzoneverschil, zoals: '2023-11-17T21:00:00.000+01:00'", - "fr": "Canaux LTF : Fonctionnent de manière similaire aux canaux standard mais n'opèrent que dans une plage horaire définie par les objets d'état 'StartTime' et 'StopTime'. Après 'StopTime', le canal se désactive. 'StartTime' et 'StopTime' peuvent s'étendre sur plusieurs jours. Les états doivent être remplis avec une chaîne de date-heure au format ISO-8601 avec un décalage de fuseau horaire, par exemple : '2023-11-17T21:00:00.000+01:00'", - "it": "Canali LTF: Funzionano in modo simile ai canali standard ma operano solo all'interno di un periodo definito dagli oggetti di stato 'StartTime' e 'StopTime'. Dopo 'StopTime', il canale si disattiva. 'StartTime' e 'StopTime' possono estendersi su più giorni. Gli stati devono essere compilati con una stringa di data e ora nel formato ISO-8601 con un offset di fuso orario, ad esempio: '2023-11-17T21:00:00.000+01:00'", - "es": "Canales LTF: Funcionan de manera similar a los canales estándar, pero solo operan dentro de un marco de tiempo definido por los objetos de estado 'StartTime' y 'StopTime'. Después de 'StopTime', el canal se desactiva. 'StartTime' y 'StopTime' pueden abarcar varios días. Los estados deben llenarse con una cadena de fecha y hora en formato ISO-8601 con un desplazamiento de zona horaria, como: '2023-11-17T21:00:00.000+01:00'", - "pl": "Kanały LTF: Działają podobnie jak standardowe kanały, ale działają tylko w oknie czasowym określonym przez obiekty stanu 'StartTime' i 'StopTime'. Po 'StopTime' kanał dezaktywuje się. 'StartTime' i 'StopTime' mogą obejmować kilka dni. Stany muszą być wypełnione ciągiem daty i godziny w formacie ISO-8601 z przesunięciem strefy czasowej, na przykład: '2023-11-17T21:00:00.000+01:00'", - "uk": "LTF-канали: Функціонують аналогічно стандартним каналам, але працюють лише в межах часового інтервалу, визначеного об'єктами стану 'StartTime' та 'StopTime'. Після 'StopTime' канал деактивується. 'StartTime' та 'StopTime' можуть охоплювати кілька днів. Стани повинні бути заповнені рядком дати та часу в форматі ISO-8601 з часовим поясом, наприклад: '2023-11-17T21:00:00.000+01:00'", - "zh-cn": "LTF通道:与标准通道类似,但仅在由'StartTime'和'StopTime'状态对象定义的时间范围内运行。在'StopTime'后,通道将自动停用。 'StartTime'和'StopTime'可能跨越多天。状态必须填写ISO-8601格式的带有时区偏移的日期时间字符串,例如:'2023-11-17T21:00:00.000+01:00'" - }, + "label": "LBL_calculatorhelp15", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, + "newLine": true + }, + "_calculatorhelp16": { + "type": "staticText", + "hidden": "!data.UseCalculator", + "label": "LBL_calculatorhelp16", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true } } @@ -1278,75 +835,28 @@ "_SpecialsTab": { "type": "panel", - "label": { - "en": "Special Settings", - "de": "Spezielle Einstellungen", - "ru": "Специальные настройки", - "pt": "Configurações Especiais", - "nl": "Speciale Instellingen", - "fr": "Paramètres Spéciaux", - "it": "Impostazioni Speciali", - "es": "Configuraciones Especiales", - "pl": "Specjalne Ustawienia", - "uk": "Спеціальні налаштування", - "zh-cn": "特殊设置" - }, + "label": "LBL_SpecialsTab", "hidden": "!data.TibberAPIToken", "items": { - "_SpecialsHeader": { - "type": "header", - "text": { - "en": "Special Settings", - "de": "Spezielle Einstellungen", - "ru": "Специальные настройки", - "pt": "Configurações Especiais", - "nl": "Speciale Instellingen", - "fr": "Paramètres Spéciaux", - "it": "Impostazioni Speciali", - "es": "Configuraciones Especiales", - "pl": "Specjalne Ustawienia", - "uk": "Спеціальні налаштування", - "zh-cn": "特殊设置" - }, - "size": 3 - }, - "UseObsoleteStats": { "type": "checkbox", - "label": { - "en": "Use obsolete API call for historical consumption data - handle with care!", - "de": "Veralteten API-Aufruf für historische Verbrauchsdaten verwenden - mit Vorsicht behandeln!", - "ru": "Используйте устаревший вызов API для исторических данных о потреблении - обращайтесь осторожно!", - "pt": "Use chamada de API obsoleta para dados de consumo histórico - manuseie com cuidado!", - "nl": "Gebruik verouderde API-oproep voor historische verbruiksgegevens - wees voorzichtig!", - "fr": "Utilisez l'appel d'API obsolète pour les données de consommation historiques - manipulez avec précaution!", - "it": "Utilizzare la chiamata API obsoleta per i dati di consumo storici - gestire con attenzione!", - "es": "¡Use la llamada de API obsoleta para los datos de consumo históricos, maneje con cuidado!", - "pl": "Użyj przestarzałego wywołania interfejsu API do danych historycznego zużycia - obchodź się ostrożnie!", - "uk": "Використовуйте застарілий виклик API для історичних даних споживання - обережно обходьтеся!", - "zh-cn": "使用过时的 API 调用获取历史消耗数据 - 谨慎处理!" - }, + "label": "LBL_UseObsoleteStats", + "xs": 12, "sm": 12, "md": 12, "lg": 12, + "xl": 12, "newLine": true }, "_specialshelp1": { "type": "staticText", - "label": { - "en": "also retrieves TotalCost values, including special grid fees in Germany. Please verify with the values you get in your Tibber app", - "de": "ruft auch TotalCost-Werte ab, einschließlich spezieller Netzgebühren in Deutschland. Bitte überprüfen Sie die Werte mit den Werten, die Sie in Ihrer Tibber-App erhalten", - "ru": "также извлекает значения TotalCost, включая специальные сетевые сборы в Германии. Пожалуйста, проверьте полученные значения с значениями, которые вы получаете в своем приложении Tibber", - "pt": "também recupera valores de TotalCost, incluindo taxas especiais da rede na Alemanha. Por favor, verifique com os valores que você obtém no seu aplicativo Tibber", - "nl": "haalt ook TotalCost-waarden op, inclusief speciale netkosten in Duitsland. Verifieer alstublieft met de waarden die u krijgt in uw Tibber-app", - "fr": "récupère également les valeurs de TotalCost, y compris les frais spéciaux du réseau en Allemagne. Veuillez vérifier avec les valeurs que vous obtenez dans votre application Tibber", - "it": "recupera anche i valori di TotalCost, inclusi i costi speciali della rete in Germania. Verifica con i valori che ottieni nella tua app Tibber", - "es": "también recupera los valores de TotalCost, incluidas las tarifas especiales de la red en Alemania. Por favor, verifique con los valores que obtiene en su aplicación Tibber", - "pl": "pobiera również wartości TotalCost, w tym specjalne opłaty za sieć w Niemczech. Proszę sprawdzić wartości z wartościami, które otrzymujesz w swojej aplikacji Tibber", - "uk": "також отримує значення TotalCost, включаючи спеціальні мережеві збори в Німеччині. Будь ласка, перевірте отримані значення зі значеннями, які ви отримуєте у своєму додатку Tibber", - "zh-cn": "还检索 TotalCost 值,包括德国的特殊电网费用。请与您在 Tibber APP 中获得的值进行验证" - }, + "label": "LBL_specialshelp1", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true } } @@ -1354,169 +864,76 @@ "_LocalPulseTab": { "type": "panel", - "label": { - "en": "Local Pulse Poll Settings", - "de": "Lokale Pulse Abfrage Einstellungen", - "ru": "Настройки локального опроса Pulse", - "pt": "Configurações de Pesquisa de Pulse Local", - "nl": "Instellingen voor lokale Pulse polling", - "fr": "Paramètres de sondage de pulsations locales", - "it": "Impostazioni di polling degli Pulse locali", - "es": "Configuraciones de sondeo de Pulse local", - "pl": "Ustawienia lokalnego sondowania impulsów", - "uk": "Налаштування локального опитування Pulse", - "zh-cn": "本地脉冲轮询设置" - }, + "label": "LBL_LocalPulseTab", "items": { - "_LocalPulseHeader": { - "type": "header", - "text": { - "en": "Local Pulse Poll Settings", - "de": "Lokale Pulse Abfrage Einstellungen", - "ru": "Настройки локального опроса Pulse", - "pt": "Configurações de Pesquisa de Pulse Local", - "nl": "Instellingen voor lokale Pulse polling", - "fr": "Paramètres de sondage de pulsations locales", - "it": "Impostazioni di polling degli Pulse locali", - "es": "Configuraciones de sondeo de Pulse local", - "pl": "Ustawienia lokalnego sondowania impulsów", - "uk": "Налаштування локального опитування Pulse", - "zh-cn": "本地脉冲轮询设置" - }, - "size": 3 - }, - "UseLocalPulseData": { "type": "checkbox", - "label": { - "en": "Use direct poll of local Tibber Pulse(s) - handle with care!", - "de": "Direkte Abfrage von lokalen Tibber Pulse(s) verwenden - mit Vorsicht behandeln!", - "ru": "Используйте прямой опрос локальных Tibber Pulse - обращайтесь с осторожностью!", - "pt": "Use pesquisa direta de Tibber Pulse(s) local - manuseie com cuidado!", - "nl": "Gebruik directe polling van lokale Tibber Pulse(s) - behandel met zorg!", - "fr": "Utilisez le sondage direct des Tibber Pulse(s) locaux - manipulez avec précaution!", - "it": "Usa il sondaggio diretto dei Tibber Pulse locali - maneggiare con cura!", - "es": "Use sondeo directo de Tibber Pulse(s) locales - ¡manéjelo con cuidado!", - "pl": "Użyj bezpośredniego sondowania lokalnych Tibber Pulse - używaj ostrożnie!", - "uk": "Використовуйте пряме опитування локальних Tibber Pulse - поводьтеся обережно!", - "zh-cn": "使用本地 Tibber Pulse 的直接轮询 - 小心处理!" - }, + "label": "LBL_item_UseLocalPulseData", + "xs": 12, "sm": 12, "md": 12, "lg": 12, + "xl": 12, "newLine": true }, - "_localpulsehelp1": { "type": "staticText", - "label": { - "en": "Use your Tibber Bridge(s) to poll data directly from your Tibber Pulse module(s) locally.", - "de": "Verwenden Sie Ihre Tibber Bridge(s), um Daten direkt von Ihrem Tibber Pulse-Modul(en) lokal abzufragen.", - "ru": "Используйте ваши Tibber Bridge для локального опроса данных напрямую с ваших Tibber Pulse модулей.", - "pt": "Use suas Tibber Bridge(s) para buscar dados diretamente de seus módulos Tibber Pulse localmente.", - "nl": "Gebruik uw Tibber Bridge(s) om gegevens lokaal direct van uw Tibber Pulse-module(s) te polleren.", - "fr": "Utilisez vos Tibber Bridge(s) pour interroger directement les données de vos modules Tibber Pulse localement.", - "it": "Usa i tuoi Tibber Bridge per sondare i dati direttamente dai tuoi moduli Tibber Pulse localmente.", - "es": "Use sus Tibber Bridge(s) para sondear datos directamente desde sus módulos Tibber Pulse localmente.", - "pl": "Użyj swoich Tibber Bridge, aby bezpośrednio sondować dane z modułów Tibber Pulse lokalnie.", - "uk": "Використовуйте ваші Tibber Bridge для локального опитування даних безпосередньо з ваших модулів Tibber Pulse.", - "zh-cn": "使用您的 Tibber Bridge 在本地直接从您的 Tibber Pulse 模块中轮询数据。" - }, + "label": "LBL_item_localpulsehelp1", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_localpulsehelp2": { "type": "staticText", - "label": { - "en": "To make it work, you need to modify the web interface of the Bridge to remain permanently enabled.", - "de": "Damit es funktioniert, müssen Sie die Webschnittstelle der Bridge so modifizieren, dass sie dauerhaft aktiviert bleibt.", - "ru": "Чтобы это работало, необходимо изменить веб-интерфейс Bridge, чтобы он оставался постоянно включенным.", - "pt": "Para que funcione, você precisa modificar a interface web da Bridge para permanecer permanentemente ativada.", - "nl": "Om het te laten werken, moet je de webinterface van de Bridge aanpassen zodat deze permanent ingeschakeld blijft.", - "fr": "Pour que cela fonctionne, vous devez modifier l'interface web du Bridge pour qu'elle reste activée en permanence.", - "it": "Per farlo funzionare, è necessario modificare l'interfaccia web del Bridge in modo che rimanga sempre abilitata.", - "es": "Para que funcione, necesita modificar la interfaz web del Bridge para que permanezca habilitada permanentemente.", - "pl": "Aby to działało, należy zmodyfikować interfejs internetowy mostka, aby pozostał na stałe włączony.", - "uk": "Щоб це працювало, потрібно змінити веб-інтерфейс мосту, щоб він залишався постійно ввімкненим.", - "zh-cn": "要使其正常工作,您需要修改桥的 Web 界面,以使其保持永久启用状态。" - }, + "label": "LBL_item_localpulsehelp2", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_localpulsehelp3": { "type": "staticText", - "label": { - "en": "marq24 has described how to do this excellently for his HomeAssistant integration here:", - "de": "marq24 hat hier hervorragend beschrieben, wie dies für seine HomeAssistant-Integration funktioniert:", - "ru": "marq24 отлично описал, как это сделать для своей интеграции с HomeAssistant здесь:", - "pt": "marq24 descreveu como fazer isso de maneira excelente para sua integração com HomeAssistant aqui:", - "nl": "marq24 heeft hier uitstekend beschreven hoe je dit doet voor zijn HomeAssistant-integratie:", - "fr": "marq24 a décrit comment le faire de manière excellente pour son intégration HomeAssistant ici :", - "it": "marq24 ha descritto come fare ciò in modo eccellente per la sua integrazione HomeAssistant qui:", - "es": "marq24 ha descrito cómo hacer esto de manera excelente para su integración con HomeAssistant aquí:", - "pl": "marq24 doskonale opisał, jak to zrobić dla swojej integracji z HomeAssistant tutaj:", - "uk": "marq24 чудово описав, як це зробити для своєї інтеграції з HomeAssistant тут:", - "zh-cn": "marq24 已经在这里为他的 HomeAssistant 集成做了出色的描述:" - }, + "label": "LBL_item_localpulsehelp3", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": true }, "_localpulsehelp4": { "type": "staticLink", - "label": { - "en": "https://github.com/marq24/ha-tibber-pulse-local" - }, + "label": "LBL_item_localpulsehelp4", "href": "https://github.com/marq24/ha-tibber-pulse-local", "button": false, "variant": "text", + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12, + "xl": 12, "newLine": false }, "PulseList": { "type": "table", + "label": "LBL_PulseList", + "hidden": "!data.UseLocalPulseData", + "xs": 12, "sm": 12, "md": 12, "lg": 12, - "label": { - "en": "Local Pulse to poll data from.", - "de": "Lokaler Pulse, von dem Daten abgefragt werden sollen.", - "ru": "Локальный Pulse для опроса данных.", - "pt": "Pulse local para buscar dados de.", - "nl": "Lokale Pulse om gegevens van te polleren.", - "fr": "Pulse local pour interroger les données.", - "it": "Pulse locale da cui sondare i dati.", - "es": "Pulse local para sondear datos de.", - "pl": "Lokalny Pulse do sondowania danych.", - "uk": "Локальний Pulse для опитування даних.", - "zh-cn": "用于轮询数据的本地 Pulse。" - }, - "hidden": "!data.UseLocalPulseData", + "xl": 12, "items": [ { "type": "text", - "title": { - "en": "Bridge network address", - "de": "Bridge-Netzwerkadresse", - "ru": "Сетевой адрес моста", - "pt": "Endereço de rede da Bridge", - "nl": "Brugnetwerkadres", - "fr": "Adresse réseau du pont", - "it": "Indirizzo di rete del bridge", - "es": "Dirección de red del puente", - "pl": "Adres sieciowy mostka", - "uk": "Мережева адреса мосту", - "zh-cn": "桥接网络地址" - }, - "tooltip": { - "en": "Name of your Bridge or IP address (defaults to tibber-host)", - "de": "Name Ihrer Bridge oder IP-Adresse (Standard ist tibber-host)", - "ru": "Имя вашего Bridge или IP-адрес (по умолчанию tibber-host)", - "pt": "Nome da sua Bridge ou endereço IP (padrão é tibber-host)", - "nl": "Naam van uw Bridge of IP-adres (standaard tibber-host)", - "fr": "Nom de votre Bridge ou adresse IP (par défaut tibber-host)", - "it": "Nome del tuo Bridge o indirizzo IP (predefinito tibber-host)", - "es": "Nombre de su Bridge o dirección IP (por defecto tibber-host)", - "pl": "Nazwa twojego Bridge lub adres IP (domyślnie tibber-host)", - "uk": "Назва вашого Bridge або IP-адреса (за замовчуванням tibber-host)", - "zh-cn": "您的 Bridge 名称或 IP 地址(默认为 tibber-host)" - }, + "label": "LBL_item_tibberBridgeUrl", + "tooltip": "TTIP_item_tibberBridgeUrl", "maxLength": 30, "attr": "tibberBridgeUrl", "filter": false, @@ -1526,32 +943,8 @@ }, { "type": "text", - "title": { - "en": "Bridge password", - "de": "Bridge-Passwort", - "ru": "Пароль моста", - "pt": "Senha da Bridge", - "nl": "Bridge-wachtwoord", - "fr": "Mot de passe du pont", - "it": "Password del bridge", - "es": "Contraseña del puente", - "pl": "Hasło do mostu", - "uk": "Пароль моста", - "zh-cn": "桥接密码" - }, - "tooltip": { - "en": "The password for your local Tibber Bridge, as printed on the hardware.", - "de": "Das Passwort für Ihre lokale Tibber Bridge, wie auf der Hardware gedruckt.", - "ru": "Пароль для вашего локального Tibber Bridge, как указано на аппаратных средствах.", - "pt": "A senha para sua Bridge Tibber local, conforme impresso no hardware.", - "nl": "Het wachtwoord voor uw lokale Tibber Bridge, zoals afgedrukt op de hardware.", - "fr": "Le mot de passe de votre Bridge Tibber local, tel qu'imprimé sur le matériel.", - "it": "La password per il tuo Bridge Tibber locale, come stampato sull'hardware.", - "es": "La contraseña para su Puente Tibber local, como se imprime en el hardware.", - "pl": "Hasło do Twojego lokalnego mostu Tibber, jak wydrukowane na sprzęcie.", - "uk": "Пароль для вашого локального мосту Tibber, як вказано на апаратних засобах.", - "zh-cn": "本地 Tibber 桥的密码,如印在硬件上。" - }, + "label": "LBL_item_tibberBridgePassword", + "tooltip": "TTIP_item_tibberBridgePassword", "maxLength": 20, "attr": "tibberBridgePassword", "filter": false, @@ -1561,38 +954,25 @@ }, { "type": "number", - "title": { - "en": "Pulse NodeID", - "de": "Pulse NodeID", - "ru": "Pulse NodeID", - "pt": "Pulse NodeID", - "nl": "Pulse NodeID", - "fr": "Pulse NodeID", - "it": "Pulse NodeID", - "es": "Pulse NodeID", - "pl": "Pulse NodeID", - "uk": "Pulse NodeID", - "zh-cn": "Pulse NodeID" - }, - "tooltip": { - "en": "The node ID where your Pulse is registered on your Bridge.", - "de": "Die Knoten-ID, unter der Ihr Pulse auf Ihrer Bridge registriert ist.", - "ru": "Идентификатор узла, на котором зарегистрирован ваш Pulse на вашем мосту.", - "pt": "O ID do nó onde o seu Pulse está registrado na sua Bridge.", - "nl": "Het knooppunt-ID waar uw Pulse is geregistreerd op uw Bridge.", - "fr": "L'ID du nœud où votre Pulse est enregistré sur votre pont.", - "it": "L'ID del nodo dove il tuo Pulse è registrato sul tuo Bridge.", - "es": "El ID del nodo donde su Pulse está registrado en su Puente.", - "pl": "Identyfikator węzła, na którym zarejestrowany jest twój Pulse na twoim Bridge.", - "uk": "Ідентифікатор вузла, на якому зареєстрований ваш Pulse на вашому мосту.", - "zh-cn": "您的 Pulse 在桥上注册的节点 ID。" - }, + "label": "LBL_item_tibberBridgePassword", + "tooltip": "TTIP_item_tibberBridgePassword", "attr": "tibberPulseLocalNodeId", "min": 0, "max": 99, "step": 1, - "width": "20%", + "width": "10%", "default": 1 + }, + { + "type": "number", + "label": "LBL_item_tibberBridgeRawDataInterval", + "tooltip": "TTIP_item_tibberBridgeRawDataInterval", + "attr": "tibberBridgeRawDataInterval", + "min": 1000, + "max": 100000, + "step": 100, + "width": "10%", + "default": 2000 } ] } diff --git a/appveyor.yml b/appveyor.yml index c689dd48..55ac777f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,6 +3,7 @@ environment: matrix: - nodejs_version: "18" - nodejs_version: "20" + - nodejs_version: "22" platform: - x64 clone_folder: 'c:\projects\%APPVEYOR_PROJECT_NAME%' diff --git a/build/lib/tibberHelper.js b/build/lib/projectUtils.js similarity index 76% rename from build/lib/tibberHelper.js rename to build/lib/projectUtils.js index aa1b86f9..8bc80b8a 100644 --- a/build/lib/tibberHelper.js +++ b/build/lib/projectUtils.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.TibberHelper = exports.enCalcType = void 0; +exports.ProjectUtils = exports.enCalcType = void 0; exports.getCalcTypeDescription = getCalcTypeDescription; var enCalcType; (function (enCalcType) { @@ -13,6 +13,11 @@ var enCalcType; enCalcType[enCalcType["SmartBatteryBuffer"] = 7] = "SmartBatteryBuffer"; //BestCostMaxHours = 8, })(enCalcType || (exports.enCalcType = enCalcType = {})); +/** + * getCalcTypeDescription + * + * @param calcType - ID of calculator channel type + */ function getCalcTypeDescription(calcType) { switch (calcType) { case enCalcType.BestCost: @@ -35,24 +40,19 @@ function getCalcTypeDescription(calcType) { return "Unknown"; } } -class TibberHelper { +/** + * ProjectUtils + */ +class ProjectUtils { + adapter; + /** + * constructor + * + * @param adapter - ioBroker adapter instance + */ constructor(adapter) { this.adapter = adapter; } - getStatePrefix(homeId, space, id, name) { - const statePrefix = { - key: name ? name : id, - value: `Homes.${homeId}.${space}.${id}`, - }; - return statePrefix; - } - getStatePrefixLocal(pulse, id, name) { - const statePrefix = { - key: name ? name : id, - value: `LocalPulse.${pulse}.${id}`, - }; - return statePrefix; - } /** * Retrieves the value of a given state by its name. * @@ -83,9 +83,7 @@ class TibberHelper { if (!this.isLikeEmpty(stateValueObject)) { return stateValueObject; } - else { - throw `Unable to retrieve info from state '${stateName}'.`; - } + throw new Error(`Unable to retrieve info from state '${stateName}'.`); } } catch (error) { @@ -107,6 +105,52 @@ class TibberHelper { } return true; } + /** + * Get foreign state value + * + * @param stateName - Full path to state, like 0_userdata.0.other.isSummer + * @returns State value, or null if error + */ + // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents + async asyncGetForeignStateVal(stateName) { + try { + const stateObject = await this.asyncGetForeignState(stateName); + if (stateObject == null) { + return null; + } // errors thrown already in asyncGetForeignState() + return stateObject.val; + } + catch (error) { + this.adapter.log.error(`[asyncGetForeignStateValue](${stateName}): ${error}`); + return null; + } + } + /** + * Get foreign state + * + * @param stateName - Full path to state, like 0_userdata.0.other.isSummer + * @returns State object: {val: false, ack: true, ts: 1591117034451, …}, or null if error + */ + async asyncGetForeignState(stateName) { + try { + const stateObject = await this.adapter.getForeignObjectAsync(stateName); // Check state existence + if (!stateObject) { + throw new Error(`State '${stateName}' does not exist.`); + } + else { + // Get state value, so like: {val: false, ack: true, ts: 1591117034451, …} + const stateValueObject = await this.adapter.getForeignStateAsync(stateName); + if (!this.isLikeEmpty(stateValueObject)) { + return stateValueObject; + } + throw new Error(`Unable to retrieve info from state '${stateName}'.`); + } + } + catch (error) { + this.adapter.log.error(`[asyncGetForeignState](${stateName}): ${error}`); + return null; + } + } /** * Checks if the given input variable is effectively empty. * @@ -129,18 +173,14 @@ class TibberHelper { if (sTemp !== "") { return false; } - else { - return true; - } - } - else { return true; } + return true; } /** * Checks if a string state exists, creates it if necessary, and updates its value. * - * @param stateName - An object containing the key and value for the name of the state. + * @param stateName - A string representing the name of the state. * @param value - The string value to set for the state. * @param description - Optional description for the state (default is "-"). * @param writeable - Optional boolean indicating if the state should be writeable (default is false). @@ -152,7 +192,7 @@ class TibberHelper { if (value != undefined) { if (value.trim().length > 0) { const commonObj = { - name: stateName.key, + name: stateName.split(".").pop(), type: "string", role: "text", desc: description, @@ -160,21 +200,21 @@ class TibberHelper { write: writeable, }; if (!forceMode) { - await this.adapter.setObjectNotExistsAsync(stateName.value, { + await this.adapter.setObjectNotExistsAsync(stateName, { type: "state", common: commonObj, native: {}, }); } else { - await this.adapter.setObjectAsync(stateName.value, { + await this.adapter.setObjectAsync(stateName, { type: "state", common: commonObj, native: {}, }); } - if (!dontUpdate || (await this.adapter.getStateAsync(stateName.value)) === null) { - await this.adapter.setStateAsync(stateName.value, { val: value, ack: true }); + if (!dontUpdate || (await this.adapter.getStateAsync(stateName)) === null) { + await this.adapter.setState(stateName, { val: value, ack: true }); } } } @@ -182,7 +222,7 @@ class TibberHelper { /** * Checks if a number state exists, creates it if necessary, and updates its value. * - * @param stateName - An object containing the key and value for the name of the state. + * @param stateName - A string representing the name of the state. * @param value - The number value to set for the state. * @param description - Optional description for the state (default is "-"). * @param unit - Optional unit string to set for the state (default is undefined). @@ -192,9 +232,9 @@ class TibberHelper { * @returns A Promise that resolves when the state is checked, created (if necessary), and updated. */ async checkAndSetValueNumber(stateName, value, description = "-", unit, writeable = false, dontUpdate = false, forceMode = false) { - if (value || value === 0) { + if (value !== undefined) { const commonObj = { - name: stateName.key, + name: stateName.split(".").pop(), type: "number", role: "value", desc: description, @@ -206,61 +246,61 @@ class TibberHelper { commonObj.unit = unit; } if (!forceMode) { - await this.adapter.setObjectNotExistsAsync(stateName.value, { + await this.adapter.setObjectNotExistsAsync(stateName, { type: "state", common: commonObj, native: {}, }); } else { - await this.adapter.setObjectAsync(stateName.value, { + await this.adapter.setObjectAsync(stateName, { type: "state", common: commonObj, native: {}, }); } - if (!dontUpdate || (await this.adapter.getStateAsync(stateName.value)) === null) { - await this.adapter.setStateAsync(stateName.value, { val: value, ack: true }); + if (!dontUpdate || (await this.adapter.getStateAsync(stateName)) === null) { + await this.adapter.setState(stateName, { val: value, ack: true }); } } } /** * Checks if a boolean state exists, creates it if necessary, and updates its value. * - * @param stateName - An object containing the key and value for the name of the state. + * @param stateName - A string representing the name of the state. * @param value - The boolean value to set for the state. * @param description - Optional description for the state (default is "-"). * @param writeable - Optional boolean indicating if the state should be writeable (default is false). * @param dontUpdate - Optional boolean indicating if the state should not be updated if it already exists (default is false). + * @param forceMode - Optional boolean indicating if the state should be overwritten if it already exists (default is false). * @returns A Promise that resolves when the state is checked, created (if necessary), and updated. */ - async checkAndSetValueBoolean(stateName, value, description = "-", writeable = false, dontUpdate = false) { + async checkAndSetValueBoolean(stateName, value, description = "-", writeable = false, dontUpdate = false, forceMode = false) { if (value !== undefined && value !== null) { const commonObj = { - name: stateName.key, + name: stateName.split(".").pop(), type: "boolean", role: "indicator", desc: description, read: true, write: writeable, }; - if (stateName.value.split(".").pop() === stateName.key) { - await this.adapter.setObjectNotExistsAsync(stateName.value, { + if (!forceMode) { + await this.adapter.setObjectNotExistsAsync(stateName, { type: "state", common: commonObj, native: {}, }); } else { - await this.adapter.setObjectAsync(stateName.value, { + await this.adapter.setObjectAsync(stateName, { type: "state", common: commonObj, native: {}, }); } - // Update the state value if not in don't update mode or the state does not exist - if (!dontUpdate || (await this.adapter.getStateAsync(stateName.value)) === null) { - await this.adapter.setStateAsync(stateName.value, { val: value, ack: true }); + if (!dontUpdate || (await this.adapter.getStateAsync(stateName)) === null) { + await this.adapter.setState(stateName, { val: value, ack: true }); } } } @@ -277,8 +317,9 @@ class TibberHelper { if (error.errors && Array.isArray(error.errors)) { // Iterate over the array of errors and concatenate their messages for (const err of error.errors) { - if (errorMessages) + if (errorMessages) { errorMessages += ", "; + } errorMessages += err.message; } } @@ -292,5 +333,5 @@ class TibberHelper { return `Error (${error.statusMessage || error.statusText || "Unknown Status"}) occurred during: -${context}- : ${errorMessages}`; } } -exports.TibberHelper = TibberHelper; -//# sourceMappingURL=tibberHelper.js.map \ No newline at end of file +exports.ProjectUtils = ProjectUtils; +//# sourceMappingURL=projectUtils.js.map \ No newline at end of file diff --git a/build/lib/projectUtils.js.map b/build/lib/projectUtils.js.map new file mode 100644 index 00000000..47c431ff --- /dev/null +++ b/build/lib/projectUtils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"projectUtils.js","sourceRoot":"","sources":["../../src/lib/projectUtils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/lib/tibberAPICaller.js b/build/lib/tibberAPICaller.js index 10743030..0f8ff623 100644 --- a/build/lib/tibberAPICaller.js +++ b/build/lib/tibberAPICaller.js @@ -3,20 +3,35 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.TibberAPICaller = void 0; const tibber_api_1 = require("tibber-api"); const EnergyResolution_1 = require("tibber-api/lib/src/models/enums/EnergyResolution"); -const tibberHelper_1 = require("./tibberHelper"); -class TibberAPICaller extends tibberHelper_1.TibberHelper { +const projectUtils_1 = require("./projectUtils"); +/** + * TibberAPICaller + */ +class TibberAPICaller extends projectUtils_1.ProjectUtils { + tibberConfig; + tibberQuery; + /** + * constructor + * + * @param tibberConfig - the Tibber configuration object + * @param adapter - ioBroker adapter instance + */ constructor(tibberConfig, adapter) { super(adapter); this.tibberConfig = tibberConfig; this.tibberQuery = new tibber_api_1.TibberQuery(this.tibberConfig, 60000); } + /** + * updateHomesFromAPI + */ async updateHomesFromAPI() { try { const Homes = await this.tibberQuery.getHomes(); this.adapter.log.debug(`Got homes from tibber api: ${JSON.stringify(Homes)}`); const homeInfoList = []; - for (const index in Homes) { - const currentHome = Homes[index]; + //for (const index in Homes) { + //const currentHome = Homes[index]; + for (const currentHome of Homes) { homeInfoList.push({ ID: currentHome.id, NameInApp: currentHome.appNickname, @@ -27,22 +42,22 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { // Set HomeId in tibberConfig for further API Calls this.tibberConfig.homeId = currentHome.id; // Home GENERAL - this.checkAndSetValue(this.getStatePrefix(currentHome.id, "General", "Id"), currentHome.id, "ID of your home"); - this.checkAndSetValue(this.getStatePrefix(currentHome.id, "General", "Timezone"), currentHome.timeZone, "The time zone the home resides in"); - this.checkAndSetValue(this.getStatePrefix(currentHome.id, "General", "NameInApp"), currentHome.appNickname, "The nickname given to the home"); - this.checkAndSetValue(this.getStatePrefix(currentHome.id, "General", "AvatarInApp"), currentHome.appAvatar, "The chosen app avatar for the home"); + void this.checkAndSetValue(`Homes.${currentHome.id}.General.Id`, currentHome.id, "ID of your home"); + void this.checkAndSetValue(`Homes.${currentHome.id}.General.Timezone`, currentHome.timeZone, "The time zone the home resides in"); + void this.checkAndSetValue(`Homes.${currentHome.id}.General.NameInApp`, currentHome.appNickname, "The nickname given to the home"); + void this.checkAndSetValue(`Homes.${currentHome.id}.General.AvatarInApp`, currentHome.appAvatar, "The chosen app avatar for the home"); // Values: APARTMENT, ROWHOUSE, FLOORHOUSE1, FLOORHOUSE2, FLOORHOUSE3, COTTAGE, CASTLE - this.checkAndSetValue(this.getStatePrefix(currentHome.id, "General", "Type"), currentHome.type, "The type of home."); + void this.checkAndSetValue(`Homes.${currentHome.id}.General.Type`, currentHome.type, "The type of home."); // Values: APARTMENT, ROWHOUSE, HOUSE, COTTAGE - this.checkAndSetValue(this.getStatePrefix(currentHome.id, "General", "PrimaryHeatingSource"), currentHome.primaryHeatingSource, "The primary form of heating in the home"); + void this.checkAndSetValue(`Homes.${currentHome.id}.General.PrimaryHeatingSource`, currentHome.primaryHeatingSource, "The primary form of heating in the home"); // Values: AIR2AIR_HEATPUMP, ELECTRICITY, GROUND, DISTRICT_HEATING, ELECTRIC_BOILER, AIR2WATER_HEATPUMP, OTHER - this.checkAndSetValueNumber(this.getStatePrefix(currentHome.id, "General", "Size"), currentHome.size, "The size of the home in square meters"); - this.checkAndSetValueNumber(this.getStatePrefix(currentHome.id, "General", "NumberOfResidents"), currentHome.numberOfResidents, "The number of people living in the home"); - this.checkAndSetValueNumber(this.getStatePrefix(currentHome.id, "General", "MainFuseSize"), currentHome.mainFuseSize, "The main fuse size"); - this.checkAndSetValueBoolean(this.getStatePrefix(currentHome.id, "General", "HasVentilationSystem"), currentHome.hasVentilationSystem, "Whether the home has a ventilation system"); + void this.checkAndSetValueNumber(`Homes.${currentHome.id}.General.Size`, currentHome.size, "The size of the home in square meters"); + void this.checkAndSetValueNumber(`Homes.${currentHome.id}.General.NumberOfResidents`, currentHome.numberOfResidents, "The number of people living in the home"); + void this.checkAndSetValueNumber(`Homes.${currentHome.id}.General.MainFuseSize`, currentHome.mainFuseSize, "The main fuse size"); + void this.checkAndSetValueBoolean(`Homes.${currentHome.id}.General.HasVentilationSystem`, currentHome.hasVentilationSystem, "Whether the home has a ventilation system"); this.fetchAddress(currentHome.id, "Address", currentHome.address); this.fetchLegalEntity(currentHome.id, "Owner", currentHome.owner); - this.checkAndSetValueBoolean(this.getStatePrefix(currentHome.id, "Features", "RealTimeConsumptionEnabled"), currentHome.features.realTimeConsumptionEnabled, "Whether Tibber server will send consumption data by API"); + void this.checkAndSetValueBoolean(`Homes.${currentHome.id}.Features.RealTimeConsumptionEnabled`, currentHome.features.realTimeConsumptionEnabled, "Whether Tibber server will send consumption data by API"); } return homeInfoList; } @@ -61,10 +76,12 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { async updateCurrentPriceAllHomes(homeInfoList, forceUpdate = false) { let okprice = true; for (const curHomeInfo of homeInfoList) { - if (!curHomeInfo.PriceDataPollActive) + if (!curHomeInfo.PriceDataPollActive) { continue; - if (!(await this.updateCurrentPrice(curHomeInfo.ID, forceUpdate))) - okprice = false; // single fault sets all false + } + if (!(await this.updateCurrentPrice(curHomeInfo.ID, forceUpdate))) { + okprice = false; + } // single fault sets all false } return okprice; } @@ -88,8 +105,9 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { // update remaining average if (Array.isArray(pricesToday) && pricesToday[2] && pricesToday[2].startsAt) { const exDateToday = new Date(pricesToday[2].startsAt); - if (now.getDate == exDateToday.getDate) + if (now.getDate == exDateToday.getDate) { this.fetchPriceRemainingAverage(homeId, `PricesToday.averageRemaining`, pricesToday); + } } if (!exDateCurrent || now.getHours() !== exDateCurrent.getHours() || forceUpdate) { const currentPrice = await this.tibberQuery.getCurrentEnergyPrice(homeId); @@ -100,7 +118,7 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { return true; } } - else if (now.getHours() !== exDateCurrent.getHours()) { + else if (now.getHours() == exDateCurrent.getHours()) { this.adapter.log.debug(`Hour (${exDateCurrent.getHours()}) of known current price is already the current hour, polling of current price from Tibber skipped`); return true; } @@ -113,10 +131,12 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { } } catch (error) { - if (forceUpdate) + if (forceUpdate) { this.adapter.log.error(this.generateErrorMessage(error, `pull of current price`)); - else + } + else { this.adapter.log.warn(this.generateErrorMessage(error, `pull of current price`)); + } return false; } return false; @@ -131,14 +151,15 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { async updatePricesTodayAllHomes(homeInfoList, forceUpdate = false) { let okprice = true; for (const curHomeInfo of homeInfoList) { - if (!curHomeInfo.PriceDataPollActive) + if (!curHomeInfo.PriceDataPollActive) { continue; + } if (!(await this.updatePricesToday(curHomeInfo.ID, forceUpdate))) { okprice = false; } else { const now = new Date(); - this.checkAndSetValue(this.getStatePrefix(curHomeInfo.ID, "PricesToday", "lastUpdate"), now.toString(), `last update of prices today`); + void this.checkAndSetValue(`Homes.${curHomeInfo.ID}.PricesToday.lastUpdate`, now.toString(), `last update of prices today`); } } return okprice; @@ -168,18 +189,22 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { throw new Error(`Got invalid data structure from Tibber [you might not have a valid (or fully confirmed) contract]`); } this.adapter.log.debug(`Got prices today from tibber api: ${JSON.stringify(pricesToday)} Force: ${forceUpdate}`); - this.checkAndSetValue(this.getStatePrefix(homeId, "PricesToday", "json"), JSON.stringify(pricesToday), "The prices today as json"); // write also it might be empty + void this.checkAndSetValue(`Homes.${homeId}.PricesToday.json`, JSON.stringify(pricesToday), "The prices today as json"); // write also it might be empty + //WiP 600 + void this.checkAndSetValue(`Homes.${homeId}.PricesYesterday.json`, JSON.stringify(exPricesToday), "The prices yesterday as json"); + //WiP 600 this.fetchPriceAverage(homeId, `PricesToday.average`, pricesToday); this.fetchPriceRemainingAverage(homeId, `PricesToday.averageRemaining`, pricesToday); this.fetchPriceMaximum(homeId, `PricesToday.maximum`, pricesToday.sort((a, b) => a.total - b.total)); this.fetchPriceMinimum(homeId, `PricesToday.minimum`, pricesToday.sort((a, b) => a.total - b.total)); - for (const i in pricesToday) { - const price = pricesToday[i]; + //for (const i in pricesToday) { + for (const price of pricesToday) { + //const price = pricesToday[i]; const hour = new Date(price.startsAt.substr(0, 19)).getHours(); await this.fetchPrice(homeId, `PricesToday.${hour}`, price); } if (Array.isArray(pricesToday) && pricesToday[2] && pricesToday[2].startsAt) { - this.checkAndSetValue(this.getStatePrefix(homeId, "PricesToday", "jsonBYpriceASC"), JSON.stringify(pricesToday.sort((a, b) => a.total - b.total)), "prices sorted by cost ascending as json"); + void this.checkAndSetValue(`Homes.${homeId}.PricesToday.jsonBYpriceASC`, JSON.stringify(pricesToday.sort((a, b) => a.total - b.total)), "prices sorted by cost ascending as json"); exDate = new Date(pricesToday[2].startsAt); if (exDate && exDate >= today) { return true; @@ -187,20 +212,22 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { } else { // Handle the case when pricesToday is not an array, it's empty!, so just don't sort and write - this.checkAndSetValue(this.getStatePrefix(homeId, "PricesToday", "jsonBYpriceASC"), JSON.stringify(pricesToday), "prices sorted by cost ascending as json"); + void this.checkAndSetValue(`Homes.${homeId}.PricesToday.jsonBYpriceASC`, JSON.stringify(pricesToday), "prices sorted by cost ascending as json"); return false; } } else { - this.adapter.log.debug(`Existing date (${exDate}) of price info is already the today date, polling of prices today from Tibber skipped`); + this.adapter.log.debug(`Existing date of price info is already the today date, polling of prices today from Tibber skipped`); return true; } } catch (error) { - if (forceUpdate) + if (forceUpdate) { this.adapter.log.error(this.generateErrorMessage(error, `force pull of prices today`)); - else + } + else { this.adapter.log.warn(this.generateErrorMessage(error, `pull of prices today`)); + } return false; } return false; @@ -215,14 +242,15 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { async updatePricesTomorrowAllHomes(homeInfoList, forceUpdate = false) { let okprice = true; for (const curHomeInfo of homeInfoList) { - if (!curHomeInfo.PriceDataPollActive) + if (!curHomeInfo.PriceDataPollActive) { continue; + } if (!(await this.updatePricesTomorrow(curHomeInfo.ID, forceUpdate))) { okprice = false; // single fault sets all false } else { const now = new Date(); - this.checkAndSetValue(this.getStatePrefix(curHomeInfo.ID, "PricesTomorrow", "lastUpdate"), now.toString(), `last update of prices tomorrow`); + void this.checkAndSetValue(`Homes.${curHomeInfo.ID}.PricesTomorrow.lastUpdate`, now.toString(), `last update of prices tomorrow`); } } return okprice; @@ -250,7 +278,7 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { if (!exDate || exDate < morgen || forceUpdate) { const pricesTomorrow = await this.tibberQuery.getTomorrowsEnergyPrices(homeId); this.adapter.log.debug(`Got prices tomorrow from tibber api: ${JSON.stringify(pricesTomorrow)} Force: ${forceUpdate}`); - this.checkAndSetValue(this.getStatePrefix(homeId, "PricesTomorrow", "json"), JSON.stringify(pricesTomorrow), "The prices tomorrow as json"); // write also it might be empty + void this.checkAndSetValue(`Homes.${homeId}.PricesTomorrow.json`, JSON.stringify(pricesTomorrow), "The prices tomorrow as json"); // write also it might be empty if (pricesTomorrow.length === 0) { // pricing not known, before about 13:00 - delete all the states this.adapter.log.debug(`Emptying prices tomorrow and average cause existing ones are obsolete...`); @@ -260,40 +288,41 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { this.emptyingPriceAverage(homeId, `PricesTomorrow.average`); this.emptyingPriceMaximum(homeId, `PricesTomorrow.maximum`); this.emptyingPriceMinimum(homeId, `PricesTomorrow.minimum`); - this.checkAndSetValue(this.getStatePrefix(homeId, "PricesTomorrow", "jsonBYpriceASC"), JSON.stringify(pricesTomorrow), "prices sorted by cost ascending as json"); + void this.checkAndSetValue(`Homes.${homeId}.PricesTomorrow.jsonBYpriceASC`, JSON.stringify(pricesTomorrow), "prices sorted by cost ascending as json"); return false; } else if (Array.isArray(pricesTomorrow)) { // pricing known, after about 13:00 - write the states - for (const i in pricesTomorrow) { - const price = pricesTomorrow[i]; + //for (const i in pricesTomorrow) { + for (const price of pricesTomorrow) { + //const price = pricesTomorrow[i]; const hour = new Date(price.startsAt.substr(0, 19)).getHours(); - await this.fetchPrice(homeId, "PricesTomorrow." + hour, price); + await this.fetchPrice(homeId, `PricesTomorrow.${hour}`, price); } this.fetchPriceAverage(homeId, `PricesTomorrow.average`, pricesTomorrow); this.fetchPriceMaximum(homeId, `PricesTomorrow.maximum`, pricesTomorrow.sort((a, b) => a.total - b.total)); this.fetchPriceMinimum(homeId, `PricesTomorrow.minimum`, pricesTomorrow.sort((a, b) => a.total - b.total)); - this.checkAndSetValue(this.getStatePrefix(homeId, "PricesTomorrow", "jsonBYpriceASC"), JSON.stringify(pricesTomorrow.sort((a, b) => a.total - b.total)), "prices sorted by cost ascending as json"); + void this.checkAndSetValue(`Homes.${homeId}.PricesTomorrow.jsonBYpriceASC`, JSON.stringify(pricesTomorrow.sort((a, b) => a.total - b.total)), "prices sorted by cost ascending as json"); exDate = new Date(pricesTomorrow[2].startsAt); if (exDate && exDate >= morgen) { return true; } - else { - return false; - } + return false; } } else if (exDate && exDate >= morgen) { - this.adapter.log.debug(`Existing date (${exDate}) of price info is already the tomorrow date, polling of prices tomorrow from Tibber skipped`); + this.adapter.log.debug(`Existing date of price info is already the tomorrow date, polling of prices tomorrow from Tibber skipped`); return true; } return false; } catch (error) { - if (forceUpdate) + if (forceUpdate) { this.adapter.log.error(this.generateErrorMessage(error, `force pull of prices tomorrow`)); - else + } + else { this.adapter.log.warn(this.generateErrorMessage(error, `pull of prices tomorrow`)); + } return false; } } @@ -305,8 +334,9 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { async updateConsumptionAllHomes() { try { for (const home of this.adapter.config.HomesList) { - if (!home.statsActive || !home.homeID) + if (!home.statsActive || !home.homeID) { continue; + } const homeID = home.homeID; const resolutions = [ { type: EnergyResolution_1.EnergyResolution.HOURLY, state: `jsonHourly`, numCons: home.numberConsHourly, description: `hour` }, @@ -324,10 +354,10 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { else { consumption = await this.tibberQuery.getConsumption(type, numCons, homeID); } - this.checkAndSetValue(this.getStatePrefix(homeID, `Consumption`, state), JSON.stringify(consumption), `Historical consumption last ${description}s as json)`); + void this.checkAndSetValue(`Homes.${homeID}.Consumption.${state}`, JSON.stringify(consumption), `Historical consumption last ${description}s as json)`); } else { - this.checkAndSetValue(this.getStatePrefix(homeID, `Consumption`, state), `[]`); + void this.checkAndSetValue(`Homes.${homeID}.Consumption.${state}`, `[]`); } } this.adapter.log.debug(`Got all consumption data from Tibber Server for home: ${homeID}`); @@ -346,12 +376,12 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { * @returns Promise - Resolves when the price data is successfully fetched and updated. */ async fetchPrice(homeId, objectDestination, price) { - await this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), price.total, "Total price (energy + taxes)"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), price.energy, "Spotmarket energy price"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), price.tax, "Tax part of the price (energy, tax, VAT...)"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "startsAt"), price.startsAt, "Start time of the price"); - //this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "currency"), price.currency, "The price currency"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), price.level, "Price level compared to recent price values"); + await this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, price.total, "Total price (energy + taxes)"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, price.energy, "Spotmarket energy price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, price.tax, "Tax part of the price (energy, tax, VAT...)"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.startsAt`, price.startsAt, "Start time of the price"); + //void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.currency`, price.currency, "The price currency"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, price.level, "Price level compared to recent price values"); } fetchPriceAverage(homeId, objectDestination, price) { const totalSum = price.reduce((sum, item) => { @@ -360,17 +390,17 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { } return sum; }, 0); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), Math.round(1000 * (totalSum / price.length)) / 1000, "Todays total price average"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, Math.round(1000 * (totalSum / price.length)) / 1000, "Todays total price average"); const energySum = price.reduce((sum, item) => sum + item.energy, 0); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), Math.round(1000 * (energySum / price.length)) / 1000, "Todays average spotmarket price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, Math.round(1000 * (energySum / price.length)) / 1000, "Todays average spotmarket price"); const taxSum = price.reduce((sum, item) => sum + item.tax, 0); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), Math.round(1000 * (taxSum / price.length)) / 1000, "Todays average tax price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, Math.round(1000 * (taxSum / price.length)) / 1000, "Todays average tax price"); } fetchPriceRemainingAverage(homeId, objectDestination, price) { const now = new Date(); // current time const currentHour = now.getHours(); // filter to prices of current and later hours - const filteredPrices = price.filter((item) => { + const filteredPrices = price.filter(item => { const itemHour = new Date(item.startsAt).getHours(); return itemHour >= currentHour; }); @@ -380,93 +410,94 @@ class TibberAPICaller extends tibberHelper_1.TibberHelper { } return sum; }, 0); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), Math.round(1000 * (remainingTotalSum / filteredPrices.length)) / 1000, "Todays total price remaining average"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, Math.round(1000 * (remainingTotalSum / filteredPrices.length)) / 1000, "Todays total price remaining average"); const remainingEnergySum = filteredPrices.reduce((sum, item) => sum + item.energy, 0); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), Math.round(1000 * (remainingEnergySum / filteredPrices.length)) / 1000, "Todays remaining average spot market price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, Math.round(1000 * (remainingEnergySum / filteredPrices.length)) / 1000, "Todays remaining average spot market price"); const remainingTaxSum = filteredPrices.reduce((sum, item) => sum + item.tax, 0); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), Math.round(1000 * (remainingTaxSum / filteredPrices.length)) / 1000, "Todays remaining average tax price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, Math.round(1000 * (remainingTaxSum / filteredPrices.length)) / 1000, "Todays remaining average tax price"); } fetchPriceMaximum(homeId, objectDestination, price) { if (!price || typeof price[23].total !== "number") { // possible exit 1.4.3 - Sentry discovered possible error in 1.4.1 // return; } - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), Math.round(1000 * price[23].total) / 1000, "Todays total price maximum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), Math.round(1000 * price[23].energy) / 1000, "Todays spotmarket price at total price maximum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), Math.round(1000 * price[23].tax) / 1000, "Todays tax price at total price maximum"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), price[23].level, "Price level compared to recent price values"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "startsAt"), price[23].startsAt, "Start time of the price maximum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, Math.round(1000 * price[23].total) / 1000, "Todays total price maximum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, Math.round(1000 * price[23].energy) / 1000, "Todays spotmarket price at total price maximum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, Math.round(1000 * price[23].tax) / 1000, "Todays tax price at total price maximum"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, price[23].level, "Price level compared to recent price values"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.startsAt`, price[23].startsAt, "Start time of the price maximum"); } fetchPriceMinimum(homeId, objectDestination, price) { - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), Math.round(1000 * price[0].total) / 1000, "Todays total price minimum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), Math.round(1000 * price[0].energy) / 1000, "Todays spotmarket price at total price minimum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), Math.round(1000 * price[0].tax) / 1000, "Todays tax price at total price minimum"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), price[0].level, "Price level compared to recent price values"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "startsAt"), price[0].startsAt, "Start time of the price minimum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, Math.round(1000 * price[0].total) / 1000, "Todays total price minimum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, Math.round(1000 * price[0].energy) / 1000, "Todays spotmarket price at total price minimum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, Math.round(1000 * price[0].tax) / 1000, "Todays tax price at total price minimum"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, price[0].level, "Price level compared to recent price values"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.startsAt`, price[0].startsAt, "Start time of the price minimum"); } emptyingPrice(homeId, objectDestination) { - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), 0, "The total price (energy + taxes)"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), 0, "Spotmarket price"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), 0, "Tax part of the price (energy tax, VAT, etc.)"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), "Not known now", "Price level compared to recent price values"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, 0, "The total price (energy + taxes)"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, 0, "Spotmarket price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, 0, "Tax part of the price (energy tax, VAT, etc.)"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, "Not known now", "Price level compared to recent price values"); } emptyingPriceAverage(homeId, objectDestination) { - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), 0, "The todays total price average"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), 0, "The todays avarage spotmarket price"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), 0, "The todays avarage tax price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, 0, "The todays total price average"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, 0, "The todays avarage spotmarket price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, 0, "The todays avarage tax price"); } emptyingPriceMaximum(homeId, objectDestination) { - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), 0, "Todays total price maximum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), 0, "Todays spotmarket price at total price maximum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), 0, "Todays tax price at total price maximum"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), "Not known now", "Price level compared to recent price values"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "startsAt"), "Not known now", "Start time of the price maximum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, 0, "Todays total price maximum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, 0, "Todays spotmarket price at total price maximum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, 0, "Todays tax price at total price maximum"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, "Not known now", "Price level compared to recent price values"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.startsAt`, "Not known now", "Start time of the price maximum"); } emptyingPriceMinimum(homeId, objectDestination) { - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), 0, "Todays total price minimum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), 0, "Todays spotmarket price at total price minimum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), 0, "Todays tax price at total price minimum"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), "Not known now", "Price level compared to recent price values"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "startsAt"), "Not known now", "Start time of the price minimum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, 0, "Todays total price minimum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, 0, "Todays spotmarket price at total price minimum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, 0, "Todays tax price at total price minimum"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, "Not known now", "Price level compared to recent price values"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.startsAt`, "Not known now", "Start time of the price minimum"); } fetchLegalEntity(homeId, objectDestination, legalEntity) { - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Id"), legalEntity.id); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "FirstName"), legalEntity.firstName); - this.checkAndSetValueBoolean(this.getStatePrefix(homeId, objectDestination, "IsCompany"), legalEntity.isCompany); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Name"), legalEntity.name); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "MiddleName"), legalEntity.middleName); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "LastName"), legalEntity.lastName); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "OrganizationNo"), legalEntity.organizationNo); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Language"), legalEntity.language); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Id`, legalEntity.id); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.FirstName`, legalEntity.firstName); + void this.checkAndSetValueBoolean(`Homes.${homeId}.${objectDestination}.IsCompany`, legalEntity.isCompany); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Name`, legalEntity.name); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.MiddleName`, legalEntity.middleName); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.LastName`, legalEntity.lastName); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.OrganizationNo`, legalEntity.organizationNo); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Language`, legalEntity.language); if (legalEntity.contactInfo) { - this.fetchContactInfo(homeId, objectDestination + ".ContactInfo", legalEntity.contactInfo); + this.fetchContactInfo(homeId, `${objectDestination}.ContactInfo`, legalEntity.contactInfo); } if (legalEntity.address) { - this.fetchAddress(homeId, objectDestination + ".Address", legalEntity.address); + this.fetchAddress(homeId, `${objectDestination}.Address`, legalEntity.address); } } fetchContactInfo(homeId, objectDestination, contactInfo) { - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Email"), contactInfo.email); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Mobile"), contactInfo.mobile); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Email`, contactInfo.email); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Mobile`, contactInfo.mobile); } fetchAddress(homeId, objectDestination, address) { - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "address1"), address.address1); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "address2"), address.address2); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "address3"), address.address3); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "City"), address.city); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "PostalCode"), address.postalCode); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Country"), address.country); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Latitude"), address.latitude); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Longitude"), address.longitude); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.address1`, address.address1); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.address2`, address.address2); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.address3`, address.address3); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.City`, address.city); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.PostalCode`, address.postalCode); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Country`, address.country); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Latitude`, address.latitude); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Longitude`, address.longitude); } - //#region *** obsolete data poll for consumption data #405 *** + //#region *** obsolete data poll for consumption data *** /** * Get energy consumption for one or more homes. * Returns an array of IConsumption + * * @param resolution EnergyResolution. Valid values: HOURLY, DAILY, WEEKLY, MONTHLY, ANNUAL * @param lastCount Return the last number of records * @param homeId Tibber home ID. - * @return Array of IConsumption + * @returns Array of IConsumption */ async getConsumptionObs(resolution, lastCount, homeId) { const gqlHomeConsumptionObs = ` diff --git a/build/lib/tibberAPICaller.js.map b/build/lib/tibberAPICaller.js.map index 79872a7e..4c5700f6 100644 --- a/build/lib/tibberAPICaller.js.map +++ b/build/lib/tibberAPICaller.js.map @@ -1 +1 @@ -{"version":3,"file":"tibberAPICaller.js","sourceRoot":"","sources":["../../src/lib/tibberAPICaller.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tibberAPICaller.js","sourceRoot":"","sources":["../../src/lib/tibberAPICaller.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/lib/tibberCalculator.js b/build/lib/tibberCalculator.js index 685a2062..6a9d2f1f 100644 --- a/build/lib/tibberCalculator.js +++ b/build/lib/tibberCalculator.js @@ -2,8 +2,23 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.TibberCalculator = void 0; const date_fns_1 = require("date-fns"); -const tibberHelper_1 = require("./tibberHelper"); -class TibberCalculator extends tibberHelper_1.TibberHelper { +const projectUtils_1 = require("./projectUtils"); +/** + * TibberCalculator + */ +class TibberCalculator extends projectUtils_1.ProjectUtils { + numBestCost; + numBestSingleHours; + numBestHoursBlock; + numBestCostLTF; + numBestSingleHoursLTF; + numBestHoursBlockLTF; + numSmartBatteryBuffer; + /** + * constructor + * + * @param adapter - ioBroker adapter instance + */ constructor(adapter) { super(adapter); this.numBestCost = 0; @@ -14,6 +29,9 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { this.numBestHoursBlockLTF = 0; this.numSmartBatteryBuffer = 0; } + /** + * initStats + */ initStats() { this.numBestCost = 0; this.numBestSingleHours = 0; @@ -25,54 +43,59 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } increaseStatsValueByOne(type) { switch (type) { - case tibberHelper_1.enCalcType.BestCost: + case projectUtils_1.enCalcType.BestCost: this.numBestCost++; break; - case tibberHelper_1.enCalcType.BestSingleHours: + case projectUtils_1.enCalcType.BestSingleHours: this.numBestSingleHours++; break; - case tibberHelper_1.enCalcType.BestHoursBlock: + case projectUtils_1.enCalcType.BestHoursBlock: this.numBestHoursBlock++; break; - case tibberHelper_1.enCalcType.BestCostLTF: + case projectUtils_1.enCalcType.BestCostLTF: this.numBestCostLTF++; break; - case tibberHelper_1.enCalcType.BestSingleHoursLTF: + case projectUtils_1.enCalcType.BestSingleHoursLTF: this.numBestSingleHoursLTF++; break; - case tibberHelper_1.enCalcType.BestHoursBlockLTF: + case projectUtils_1.enCalcType.BestHoursBlockLTF: this.numBestHoursBlockLTF++; break; - case tibberHelper_1.enCalcType.SmartBatteryBuffer: + case projectUtils_1.enCalcType.SmartBatteryBuffer: this.numSmartBatteryBuffer++; } } + /** + * + * @param homeId - ID of the home + * @param channel - ID of the calculator channel + */ async setupCalculatorStates(homeId, channel) { try { - if (this.adapter.config.CalculatorList[channel].chName === undefined) { - this.adapter.config.CalculatorList[channel].chName = `Channel Name`; + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (channelConfig.chName === undefined) { + channelConfig.chName = `Channel Name`; } - const channelName = this.adapter.config.CalculatorList[channel].chName; - //#region *** setup calculations channels folder *** - const typeDesc = (0, tibberHelper_1.getCalcTypeDescription)(this.adapter.config.CalculatorList[channel].chType); + //#region *** setup calculation channels folder *** + const typeDesc = (0, projectUtils_1.getCalcTypeDescription)(channelConfig.chType); await this.adapter.setObjectAsync(`Homes.${homeId}.Calculations.${channel}`, { type: "channel", common: { - name: channelName, + name: channelConfig.chName, desc: `type: ${typeDesc}`, }, native: {}, }); //#endregion //#region *** setup chActive state object for all channel types *** - if (this.adapter.config.CalculatorList[channel].chActive === undefined) { - this.adapter.config.CalculatorList[channel].chActive = false; + if (channelConfig.chActive === undefined) { + channelConfig.chActive = false; } - this.checkAndSetValueBoolean(this.getStatePrefix(homeId, `Calculations.${channel}`, `Active`, channelName), this.adapter.config.CalculatorList[channel].chActive, `Whether the calculation channel is active`, true, true); + void this.checkAndSetValueBoolean(`Homes.${homeId}.Calculations.${channel}.Active`, channelConfig.chActive, `Whether the calculation channel is active`, true, true); const valueActive = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.Active`); if (typeof valueActive === "boolean") { - this.adapter.config.CalculatorList[channel].chActive = valueActive; - this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to Active: ${this.adapter.config.CalculatorList[channel].chActive}`); + channelConfig.chActive = valueActive; + this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to Active: ${channelConfig.chActive}`); } else { this.adapter.log.debug(`Wrong type for chActive: ${valueActive}`); @@ -84,7 +107,7 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { "best single hours" | Input state: "AmountHours" | Output state: "Output" "best hours block" | Input state: "AmountHours" - | Output state: "Output", "AverageTotalCost", "BlockStartFullHour", "BlockEndFullHour" + | Output state: "Output", "AverageTotalCost", "BlockStartFullHour", "BlockEndFullHour", "BlockStart", "BlockEnd" "best cost LTF" | Input state: "TriggerPrice", "StartTime", "StopTime", "RepeatDays" | Output state: "Output" "best single hours LTF" | Input state: "AmountHours", "StartTime", "StopTime", "RepeatDays" @@ -94,93 +117,103 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { "smart battery buffer" | Input state: "AmountHours", "EfficiencyLoss" | Output state: "Output", "Output2" */ - switch (this.adapter.config.CalculatorList[channel].chType) { - case tibberHelper_1.enCalcType.BestCost: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AmountHours`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StopTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `RepeatDays`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStopTime`).value); + switch (channelConfig.chType) { + case projectUtils_1.enCalcType.BestCost: + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AmountHours`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.RepeatDays`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AverageTotalCost`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStart`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStop`); await this.setup_chTriggerPrice(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; - case tibberHelper_1.enCalcType.BestSingleHours: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StopTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `RepeatDays`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStopTime`).value); + case projectUtils_1.enCalcType.BestSingleHours: + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.RepeatDays`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AverageTotalCost`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStart`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStop`); await this.setup_chAmountHours(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; - case tibberHelper_1.enCalcType.BestHoursBlock: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StopTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `RepeatDays`).value); + case projectUtils_1.enCalcType.BestHoursBlock: + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.RepeatDays`); await this.setup_chAmountHours(homeId, channel); - await this.setup_chAverageTotalCost(homeId, channel); - await this.setup_chBlockStartFullHour(homeId, channel); - await this.setup_chBlockEndFullHour(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + this.setup_chAverageTotalCost(homeId, channel); + this.setup_chBlockStartFullHour(homeId, channel); + this.setup_chBlockEndFullHour(homeId, channel); + this.setup_chBlockStart(homeId, channel); + this.setup_chBlockEnd(homeId, channel); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; - case tibberHelper_1.enCalcType.BestCostLTF: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AmountHours`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStopTime`).value); + case projectUtils_1.enCalcType.BestCostLTF: + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AmountHours`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AverageTotalCost`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStopTime`); await this.setup_chTriggerPrice(homeId, channel); await this.setup_chStartTime(homeId, channel); await this.setup_chStopTime(homeId, channel); await this.setup_chRepeatDays(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; - case tibberHelper_1.enCalcType.BestSingleHoursLTF: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStopTime`).value); + case projectUtils_1.enCalcType.BestSingleHoursLTF: + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AverageTotalCost`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStopTime`); await this.setup_chAmountHours(homeId, channel); await this.setup_chStartTime(homeId, channel); await this.setup_chStopTime(homeId, channel); await this.setup_chRepeatDays(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; - case tibberHelper_1.enCalcType.BestHoursBlockLTF: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); + case projectUtils_1.enCalcType.BestHoursBlockLTF: + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); await this.setup_chAmountHours(homeId, channel); await this.setup_chStartTime(homeId, channel); await this.setup_chStopTime(homeId, channel); await this.setup_chRepeatDays(homeId, channel); - await this.setup_chAverageTotalCost(homeId, channel); - await this.setup_chBlockStartFullHour(homeId, channel); - await this.setup_chBlockEndFullHour(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + this.setup_chAverageTotalCost(homeId, channel); + this.setup_chBlockStartFullHour(homeId, channel); + this.setup_chBlockEndFullHour(homeId, channel); + this.setup_chBlockStart(homeId, channel); + this.setup_chBlockEnd(homeId, channel); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; - case tibberHelper_1.enCalcType.SmartBatteryBuffer: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StopTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `RepeatDays`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStopTime`).value); + case projectUtils_1.enCalcType.SmartBatteryBuffer: + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.RepeatDays`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AverageTotalCost`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStart`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStop`); await this.setup_chAmountHours(homeId, channel); await this.setup_chEfficiencyLoss(homeId, channel); await this.setup_chOutput(homeId, channel); // OUTPUTS @@ -206,44 +239,46 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } } async setup_chOutput(homeId, channel) { - if (this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive")) { - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output`).value); + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (channelConfig?.chTargetState && channelConfig.chTargetState.length > 10 && !channelConfig.chTargetState.startsWith("choose your state to drive")) { + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output`); } else { try { - this.checkAndSetValueBoolean(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output`), false, `standard output if no special one selected in config`, true, true); + void this.checkAndSetValueBoolean(`Homes.${homeId}.Calculations.${channel}.Output`, false, `standard output if no special one selected in config`, true, true); } catch (error) { - this.adapter.log.warn(this.generateErrorMessage(error, `setup of state Output for calculator`)); + this.adapter.log.warn(this.generateErrorMessage(error, `setup of state Output for calculator for Home ${homeId}, Channel ${channel}`)); } } } async setup_chOutput2(homeId, channel) { - if (this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive")) { - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (channelConfig?.chTargetState2 && + channelConfig.chTargetState2.length > 10 && + !channelConfig.chTargetState2.startsWith("choose your state to drive")) { + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); } else { try { - this.checkAndSetValueBoolean(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`), false, `standard output if no special one selected in config`, true, true); + void this.checkAndSetValueBoolean(`Homes.${homeId}.Calculations.${channel}.Output2`, false, `standard output2 if no special one selected in config`, true, true); } catch (error) { - this.adapter.log.warn(this.generateErrorMessage(error, `setup of state Output2 for calculator`)); + this.adapter.log.warn(this.generateErrorMessage(error, `setup of state Output2 for calculator for Home ${homeId}, Channel ${channel}`)); } } } async setup_chTriggerPrice(homeId, channel) { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; - if (this.adapter.config.CalculatorList[channel].chTriggerPrice === undefined) { - this.adapter.config.CalculatorList[channel].chTriggerPrice = 0; + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (channelConfig.chTriggerPrice === undefined) { + channelConfig.chTriggerPrice = 0; } - this.checkAndSetValueNumber(this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`), this.adapter.config.CalculatorList[channel].chTriggerPrice, `pricelevel to trigger this channel at`, undefined, true, true); + void this.checkAndSetValueNumber(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`, channelConfig.chTriggerPrice, `pricelevel to trigger this channel at`, undefined, true, true); const valueTriggerPrice = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); if (typeof valueTriggerPrice === "number") { - this.adapter.config.CalculatorList[channel].chTriggerPrice = valueTriggerPrice; - this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to TriggerPrice: ${this.adapter.config.CalculatorList[channel].chTriggerPrice}`); + channelConfig.chTriggerPrice = valueTriggerPrice; + this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to TriggerPrice: ${channelConfig.chTriggerPrice}`); } else { this.adapter.log.debug(`Wrong type for chTriggerPrice: ${valueTriggerPrice}`); @@ -255,16 +290,16 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } async setup_chAmountHours(homeId, channel) { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; + const channelConfig = this.adapter.config.CalculatorList[channel]; //*** chAmountHours *** - if (this.adapter.config.CalculatorList[channel].chAmountHours === undefined) { - this.adapter.config.CalculatorList[channel].chAmountHours = 0; + if (channelConfig.chAmountHours === undefined) { + channelConfig.chAmountHours = 0; } - this.checkAndSetValueNumber(this.getStatePrefix(homeId, `Calculations.${channel}`, `AmountHours`), this.adapter.config.CalculatorList[channel].chAmountHours, `amount of hours to trigger this channel`, undefined, true, true); + void this.checkAndSetValueNumber(`Homes.${homeId}.Calculations.${channel}.AmountHours`, channelConfig.chAmountHours, `amount of hours to trigger this channel`, undefined, true, true); const valueAmountHours = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.AmountHours`); if (typeof valueAmountHours === "number") { - this.adapter.config.CalculatorList[channel].chAmountHours = valueAmountHours; - this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to AmountHours: ${this.adapter.config.CalculatorList[channel].chAmountHours}`); + channelConfig.chAmountHours = valueAmountHours; + this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to AmountHours: ${channelConfig.chAmountHours}`); } else { this.adapter.log.debug(`Wrong type for chAmountHours: ${valueAmountHours}`); @@ -276,18 +311,18 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } async setup_chStartTime(homeId, channel) { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; + const channelConfig = this.adapter.config.CalculatorList[channel]; //*** chStartTime *** - if (this.adapter.config.CalculatorList[channel].chStartTime === undefined) { + if (channelConfig.chStartTime === undefined) { const today = new Date(); today.setHours(0, 0, 0, 0); // sets clock to 0:00 - this.adapter.config.CalculatorList[channel].chStartTime = today; + channelConfig.chStartTime = today; } - this.checkAndSetValue(this.getStatePrefix(homeId, `Calculations.${channel}`, `StartTime`), this.adapter.config.CalculatorList[channel].chStartTime.toISOString(), `Start time for this channel`, true, true); + void this.checkAndSetValue(`Homes.${homeId}.Calculations.${channel}.StartTime`, channelConfig.chStartTime.toISOString(), `Start time for this channel`, true, true); const valueStartTime = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.StartTime`); if (typeof valueStartTime === "string") { - this.adapter.config.CalculatorList[channel].chStartTime.setTime(Date.parse(valueStartTime)); - this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to StartTime: ${this.adapter.config.CalculatorList[channel].chStartTime}`); + channelConfig.chStartTime.setTime(Date.parse(valueStartTime)); + this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to StartTime: ${channelConfig.chStartTime.toISOString()}`); } else { this.adapter.log.debug(`Wrong type for chStartTime: ${valueStartTime}`); @@ -299,18 +334,18 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } async setup_chStopTime(homeId, channel) { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; + const channelConfig = this.adapter.config.CalculatorList[channel]; //*** chStopTime *** - if (this.adapter.config.CalculatorList[channel].chStopTime === undefined) { + if (channelConfig.chStopTime === undefined) { const today = new Date(); today.setHours(23, 59, 0, 0); // sets clock to 0:00 - this.adapter.config.CalculatorList[channel].chStopTime = today; + channelConfig.chStopTime = today; } - this.checkAndSetValue(this.getStatePrefix(homeId, `Calculations.${channel}`, `StopTime`), this.adapter.config.CalculatorList[channel].chStopTime.toISOString(), `Stop time for this channel`, true, true); + void this.checkAndSetValue(`Homes.${homeId}.Calculations.${channel}.StopTime`, channelConfig.chStopTime.toISOString(), `Stop time for this channel`, true, true); const valueStopTime = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.StopTime`); if (typeof valueStopTime === "string") { - this.adapter.config.CalculatorList[channel].chStopTime.setTime(Date.parse(valueStopTime)); - this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to StopTime: ${this.adapter.config.CalculatorList[channel].chStopTime}`); + channelConfig.chStopTime.setTime(Date.parse(valueStopTime)); + this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to StopTime: ${channelConfig.chStopTime.toISOString()}`); } else { this.adapter.log.debug(`Wrong type for chStopTime: ${valueStopTime}`); @@ -322,16 +357,16 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } async setup_chRepeatDays(homeId, channel) { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; + const channelConfig = this.adapter.config.CalculatorList[channel]; //*** chRepeatDays *** - if (this.adapter.config.CalculatorList[channel].chRepeatDays === undefined) { - this.adapter.config.CalculatorList[channel].chRepeatDays = 0; + if (channelConfig.chRepeatDays === undefined) { + channelConfig.chRepeatDays = 0; } - this.checkAndSetValueNumber(this.getStatePrefix(homeId, `Calculations.${channel}`, `RepeatDays`), this.adapter.config.CalculatorList[channel].chRepeatDays, `number of days to shift this LTF channel for repetition`, undefined, true, true); + void this.checkAndSetValueNumber(`Homes.${homeId}.Calculations.${channel}.RepeatDays`, channelConfig.chRepeatDays, `number of days to shift this LTF channel for repetition`, undefined, true, true); const valueRepeatDays = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.RepeatDays`); if (typeof valueRepeatDays === "number") { - this.adapter.config.CalculatorList[channel].chRepeatDays = valueRepeatDays; - this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to RepeatDays: ${this.adapter.config.CalculatorList[channel].chRepeatDays}`); + channelConfig.chRepeatDays = valueRepeatDays; + this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to RepeatDays: ${channelConfig.chRepeatDays}`); } else { this.adapter.log.debug(`Wrong type for chTriggerPrice: ${valueRepeatDays}`); @@ -343,16 +378,16 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } async setup_chEfficiencyLoss(homeId, channel) { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; + const channelConfig = this.adapter.config.CalculatorList[channel]; //*** chEfficiencyLoss *** - if (this.adapter.config.CalculatorList[channel].chEfficiencyLoss === undefined) { - this.adapter.config.CalculatorList[channel].chEfficiencyLoss = 0; + if (channelConfig.chEfficiencyLoss === undefined) { + channelConfig.chEfficiencyLoss = 0; } - this.checkAndSetValueNumber(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`), this.adapter.config.CalculatorList[channel].chEfficiencyLoss, `efficiency loss between charge and discharge of battery system`, undefined, true, true); + void this.checkAndSetValueNumber(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`, channelConfig.chEfficiencyLoss, `efficiency loss between charge and discharge of battery system`, undefined, true, true); const valueEfficiencyLoss = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); if (typeof valueEfficiencyLoss === "number") { - this.adapter.config.CalculatorList[channel].chAmountHours = valueEfficiencyLoss; - this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to EfficiencyLoss: ${this.adapter.config.CalculatorList[channel].chEfficiencyLoss}`); + channelConfig.chAmountHours = valueEfficiencyLoss; + this.adapter.log.debug(`setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to EfficiencyLoss: ${channelConfig.chEfficiencyLoss}`); } else { this.adapter.log.debug(`Wrong type for chEfficiencyLoss: ${valueEfficiencyLoss}`); @@ -362,41 +397,74 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { this.adapter.log.warn(this.generateErrorMessage(error, `setup of state EfficiencyLoss for calculator`)); } } - async setup_chAverageTotalCost(homeId, channel) { + setup_chAverageTotalCost(homeId, channel) { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; - this.checkAndSetValueNumber(this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`), 0, `average total cost in determined block`, undefined, false, false); - this.adapter.log.debug(`setup calculator output state AverageTotalCost in home: ${homeId} - channel: ${channel}-${channelName}`); + const channelConfig = this.adapter.config.CalculatorList[channel]; + void this.checkAndSetValueNumber(`Homes.${homeId}.Calculations.${channel}.AverageTotalCost`, 0, `average total cost in determined block`, undefined, false, false); + this.adapter.log.debug(`setup calculator output state AverageTotalCost in home: ${homeId} - channel: ${channel}-${channelConfig.chName}`); } catch (error) { this.adapter.log.warn(this.generateErrorMessage(error, `setup of state AverageTotalCost for calculator`)); } } - async setup_chBlockStartFullHour(homeId, channel, delMode = false) { + setup_chBlockStartFullHour(homeId, channel, delMode = false) { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; - this.checkAndSetValue(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartFullHour`), `-`, `first hour of determined block`, false, false); - if (!delMode) - this.adapter.log.debug(`setup calculator output state BlockStartFullHour in home: ${homeId} - channel: ${channel}-${channelName}`); + const channelConfig = this.adapter.config.CalculatorList[channel]; + void this.checkAndSetValue(`Homes.${homeId}.Calculations.${channel}.BlockStartFullHour`, `-`, `first hour of determined block`, false, false); + if (!delMode) { + this.adapter.log.debug(`setup calculator output state BlockStartFullHour in home: ${homeId} - channel: ${channel}-${channelConfig.chName}`); + } } catch (error) { this.adapter.log.warn(this.generateErrorMessage(error, `write state BlockStartFullHour for calculator`)); } } - async setup_chBlockEndFullHour(homeId, channel, delMode = false) { + setup_chBlockEndFullHour(homeId, channel, delMode = false) { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; - this.checkAndSetValue(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockEndFullHour`), `-`, `end hour of determined block`, false, false); - if (!delMode) - this.adapter.log.debug(`setup calculator output state BlockEndFullHour in home: ${homeId} - channel: ${channel}-${channelName}`); + const channelConfig = this.adapter.config.CalculatorList[channel]; + void this.checkAndSetValue(`Homes.${homeId}.Calculations.${channel}.BlockEndFullHour`, `-`, `end hour of determined block`, false, false); + if (!delMode) { + this.adapter.log.debug(`setup calculator output state BlockEndFullHour in home: ${homeId} - channel: ${channel}-${channelConfig.chName}`); + } } catch (error) { this.adapter.log.warn(this.generateErrorMessage(error, `write state BlockEndFullHour for calculator`)); } } - async startCalculatorTasks(onStateChange = false, firstRun = false) { - if (!this.adapter.config.UseCalculator) + setup_chBlockStart(homeId, channel, delMode = false) { + try { + const channelConfig = this.adapter.config.CalculatorList[channel]; + void this.checkAndSetValue(`Homes.${homeId}.Calculations.${channel}.BlockStart`, `-`, `start date string of determined block`, false, false); + if (!delMode) { + this.adapter.log.debug(`setup calculator output state BlockStart in home: ${homeId} - channel: ${channel}-${channelConfig.chName}`); + } + } + catch (error) { + this.adapter.log.warn(this.generateErrorMessage(error, `write state BlockStart for calculator`)); + } + } + setup_chBlockEnd(homeId, channel, delMode = false) { + try { + const channelConfig = this.adapter.config.CalculatorList[channel]; + void this.checkAndSetValue(`Homes.${homeId}.Calculations.${channel}.BlockEnd`, `-`, `stop date string of determined block`, false, false); + if (!delMode) { + this.adapter.log.debug(`setup calculator output state BlockEnd in home: ${homeId} - channel: ${channel}-${channelConfig.chName}`); + } + } + catch (error) { + this.adapter.log.warn(this.generateErrorMessage(error, `write state BlockEnd for calculator`)); + } + } + /** + * startCalculatorTasks + * + * @param onStateChange - Optional onStateChange mode (default = false) + * @param firstRun - Optional firstRun mode (default = false) + */ + startCalculatorTasks(onStateChange = false, firstRun = false) { + if (!this.adapter.config.UseCalculator) { return; + } const badComponents = ["tibberlink", "Homes", "Calculations"]; // we must not use an input as output!! for (const channel in this.adapter.config.CalculatorList) { //#region *** first run checks *** @@ -411,9 +479,10 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { this.adapter.config.CalculatorList[channel].chTargetState !== "") { const chTargetStateComponents = this.adapter.config.CalculatorList[channel].chTargetState.split("."); let foundAllBadComponents = true; - badComponents.forEach((badComponent) => { - if (!chTargetStateComponents.includes(badComponent)) + badComponents.forEach(badComponent => { + if (!chTargetStateComponents.includes(badComponent)) { foundAllBadComponents = false; + } }); if (foundAllBadComponents) { this.adapter.log.error(`Invalid destination state defined in calculator channel ${channel}. Please avoid specifying the activation state of this channel as the destination. Skipping channel execution.`); @@ -424,20 +493,22 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { this.adapter.log.debug(`chTargetState is null or undefined in calculator channel ${channel}. Skipping channel execution.`); continue; // skip channel } - if (this.adapter.config.CalculatorList[channel].chType === tibberHelper_1.enCalcType.SmartBatteryBuffer) { + //checks for SmartBatteryBuffer only... + if (this.adapter.config.CalculatorList[channel].chType === projectUtils_1.enCalcType.SmartBatteryBuffer) { if (!this.adapter.config.CalculatorList[channel] || !this.adapter.config.CalculatorList[channel].chTargetState2 || !this.adapter.config.CalculatorList[channel].chTargetState2.trim()) { - this.adapter.log.warn(`Empty second destination state in calculator channel ${channel} defined - provide correct external state 2 - channel will use internal state OUTPUT2`); + this.adapter.log.warn(`Empty second destination state in calculator channel ${channel} defined - provide correct external state 2 - upon this, channel will use internal state OUTPUT2`); } if (this.adapter.config.CalculatorList[channel].chTargetState2 != null && typeof this.adapter.config.CalculatorList[channel].chTargetState2 === "string" && this.adapter.config.CalculatorList[channel].chTargetState2 !== "") { const chTargetState2Components = this.adapter.config.CalculatorList[channel].chTargetState2.split("."); let foundAllBadComponents = true; - badComponents.forEach((badComponent) => { - if (!chTargetState2Components.includes(badComponent)) + badComponents.forEach(badComponent => { + if (!chTargetState2Components.includes(badComponent)) { foundAllBadComponents = false; + } }); if (foundAllBadComponents) { this.adapter.log.error(`Invalid second destination state defined in calculator channel ${channel}. Please avoid specifying the activation state of this channel as the destination. Skipping channel execution.`); @@ -448,57 +519,68 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { this.adapter.log.debug(`chTargetState2 is null or undefined in calculator channel ${channel}. Skipping channel execution.`); continue; // skip channel } + if (this.adapter.config.CalculatorList[channel].chValueOn2 == null || + this.adapter.config.CalculatorList[channel].chValueOn2 === "" || + this.adapter.config.CalculatorList[channel].chValueOff2 == null || + this.adapter.config.CalculatorList[channel].chValueOff2 === "") { + this.adapter.log.error(`"Value YES 2" or "Value NO 2" is null or undefined in calculator channel ${channel}. Please provide usable values in config.`); + continue; // skip channel + } } } - //#endregion first run mode + //#endregion first run checks try { if (this.adapter.config.CalculatorList[channel].chActive || onStateChange) { - // If Active=false been set just now - or still active then act - else just produce debug log in the following runs + // If Active=false been set just now - or still active then act - else just produce debug log in the following runs switch (this.adapter.config.CalculatorList[channel].chType) { - case tibberHelper_1.enCalcType.BestCost: - this.executeCalculatorBestCost(parseInt(channel)); + case projectUtils_1.enCalcType.BestCost: + void this.executeCalculatorBestCost(parseInt(channel)); break; - case tibberHelper_1.enCalcType.BestSingleHours: - this.executeCalculatorBestSingleHours(parseInt(channel)); + case projectUtils_1.enCalcType.BestSingleHours: + void this.executeCalculatorBestSingleHours(parseInt(channel)); break; - case tibberHelper_1.enCalcType.BestHoursBlock: - this.executeCalculatorBestHoursBlock(parseInt(channel)); + case projectUtils_1.enCalcType.BestHoursBlock: + void this.executeCalculatorBestHoursBlock(parseInt(channel)); break; - case tibberHelper_1.enCalcType.BestCostLTF: - this.executeCalculatorBestCost(parseInt(channel), true); + case projectUtils_1.enCalcType.BestCostLTF: + void this.executeCalculatorBestCost(parseInt(channel), true); break; - case tibberHelper_1.enCalcType.BestSingleHoursLTF: - this.executeCalculatorBestSingleHours(parseInt(channel), true); + case projectUtils_1.enCalcType.BestSingleHoursLTF: + void this.executeCalculatorBestSingleHours(parseInt(channel), true); break; - case tibberHelper_1.enCalcType.BestHoursBlockLTF: - this.executeCalculatorBestHoursBlock(parseInt(channel), true); + case projectUtils_1.enCalcType.BestHoursBlockLTF: + void this.executeCalculatorBestHoursBlock(parseInt(channel), true); break; - case tibberHelper_1.enCalcType.SmartBatteryBuffer: - this.executeCalculatorSmartBatteryBuffer(parseInt(channel)); + case projectUtils_1.enCalcType.SmartBatteryBuffer: + void this.executeCalculatorSmartBatteryBuffer(parseInt(channel)); break; default: this.adapter.log.debug(`unknown value for calculator type: ${this.adapter.config.CalculatorList[channel].chType}`); } } else { - this.adapter.log.debug(`calculator channel: ${channel} - ${(0, tibberHelper_1.getCalcTypeDescription)(this.adapter.config.CalculatorList[channel].chType)}; execution skipped because channel not set to active in channel states`); + this.adapter.log.debug(`calculator channel: ${channel} - ${(0, projectUtils_1.getCalcTypeDescription)(this.adapter.config.CalculatorList[channel].chType)}; execution skipped because channel not set to active in channel states`); } } catch (error) { - this.adapter.log.warn(`unhandled error execute calculator channel ${channel}`); + this.adapter.log.warn(`unhandled error ${error} while executing calculator channel ${channel}`); } } } - async updateCalculatorUsageStats() { - if (!this.adapter.config.UseCalculator) + /** + * updateCalculatorUsageStats + */ + updateCalculatorUsageStats() { + if (!this.adapter.config.UseCalculator) { return; - this.initStats; + } + this.initStats(); for (const channel in this.adapter.config.CalculatorList) { try { this.increaseStatsValueByOne(this.adapter.config.CalculatorList[channel].chType); } catch (error) { - this.adapter.log.debug(`unhandled error in calculator channel ${channel} scan`); + this.adapter.log.debug(`unhandled error ${error} in calculator usage scan for channel ${channel}`); } } } @@ -506,46 +588,50 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { try { let valueToSet = ""; const now = new Date(); - if (!this.adapter.config.CalculatorList[channel].chActive) { + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (!channelConfig.chActive) { // not active - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; + valueToSet = channelConfig.chValueOff; } - else if (modeLTF && now < this.adapter.config.CalculatorList[channel].chStartTime) { + else if (modeLTF && now < channelConfig.chStartTime) { // chActive but before LTF - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; + valueToSet = channelConfig.chValueOff; } - else if (modeLTF && now > this.adapter.config.CalculatorList[channel].chStopTime) { + else if (modeLTF && now > channelConfig.chStopTime) { // chActive but after LTF - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - if (this.adapter.config.CalculatorList[channel].chRepeatDays == 0) { + valueToSet = channelConfig.chValueOff; + if (channelConfig.chRepeatDays == 0) { // no repeating planned - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Active`, false, true); + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.Active`, false, true); } else { - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StartTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(this.adapter.config.CalculatorList[channel].chStartTime, this.adapter.config.CalculatorList[channel].chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StopTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(this.adapter.config.CalculatorList[channel].chStopTime, this.adapter.config.CalculatorList[channel].chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.StartTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(channelConfig.chStartTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + channelConfig.chStartTime = (0, date_fns_1.addDays)(channelConfig.chStartTime, channelConfig.chRepeatDays); + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.StopTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(channelConfig.chStopTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + channelConfig.chStopTime = (0, date_fns_1.addDays)(channelConfig.chStopTime, channelConfig.chRepeatDays); } } else { // chActive and inside LTF -> choose desired value - const currentPrice = await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.CurrentPrice.total`); - if (this.adapter.config.CalculatorList[channel].chTriggerPrice > currentPrice) { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOn; + const currentPrice = await this.getStateValue(`Homes.${channelConfig.chHomeID}.CurrentPrice.total`); + if (channelConfig.chTriggerPrice > currentPrice) { + valueToSet = channelConfig.chValueOn; } else { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; + valueToSet = channelConfig.chValueOff; } } //set value to foreign state, if defined let sOutState = ""; - if (this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive")) { - sOutState = this.adapter.config.CalculatorList[channel].chTargetState; - this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); + if (channelConfig?.chTargetState && + channelConfig.chTargetState.length > 10 && + !channelConfig.chTargetState.startsWith("choose your state to drive")) { + sOutState = channelConfig.chTargetState; + void this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); } else { - sOutState = `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Output`; - this.adapter.setStateAsync(sOutState, convertValue(valueToSet), true); + sOutState = `Homes.${channelConfig.chHomeID}.Calculations.${channel}.Output`; + void this.adapter.setState(sOutState, convertValue(valueToSet), true); } this.adapter.log.debug(`calculator channel: ${channel} - best price ${modeLTF ? "LTF" : ""}; setting state: ${sOutState} to ${valueToSet}`); } @@ -557,67 +643,81 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { try { let valueToSet = ""; const now = new Date(); - if (!this.adapter.config.CalculatorList[channel].chActive) { + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (!channelConfig.chActive) { // not active -> choose chValueOff - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; + valueToSet = channelConfig.chValueOff; } - else if (modeLTF && now < this.adapter.config.CalculatorList[channel].chStartTime) { + else if (modeLTF && now < channelConfig.chStartTime) { // chActive but before LTF -> choose chValueOff - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; + valueToSet = channelConfig.chValueOff; } - else if (modeLTF && now > this.adapter.config.CalculatorList[channel].chStopTime) { + else if (modeLTF && now > channelConfig.chStopTime) { // chActive, modeLTF but after LTF -> choose chValueOff and disable channel - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - if (this.adapter.config.CalculatorList[channel].chRepeatDays == 0) { - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Active`, false, true); + valueToSet = channelConfig.chValueOff; + if (channelConfig.chRepeatDays == 0) { + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.Active`, false, true); } else { // chRepeatDays present, change start and stop time accordingly - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StartTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(this.adapter.config.CalculatorList[channel].chStartTime, this.adapter.config.CalculatorList[channel].chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StopTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(this.adapter.config.CalculatorList[channel].chStopTime, this.adapter.config.CalculatorList[channel].chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.StartTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(channelConfig.chStartTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + channelConfig.chStartTime = (0, date_fns_1.addDays)(channelConfig.chStartTime, channelConfig.chRepeatDays); + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.StopTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(channelConfig.chStopTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + channelConfig.chStopTime = (0, date_fns_1.addDays)(channelConfig.chStopTime, channelConfig.chRepeatDays); } } else { - // chActive -> choose desired value - const pricesToday = JSON.parse(await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.PricesToday.jsonBYpriceASC`)); + // chActive and inside LTF -> choose desired value + const pricesToday = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesToday.json`)); let filteredPrices = pricesToday; if (modeLTF) { // Limited Time Frame mode - const pricesTomorrow = JSON.parse(await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.PricesTomorrow.json`)); - const startTime = this.adapter.config.CalculatorList[channel].chStartTime; - const stopTime = this.adapter.config.CalculatorList[channel].chStopTime; + const pricesTomorrow = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesTomorrow.json`)); + //WiP 600 + const pricesYesterday = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesYesterday.json`)); + //WiP 600 + const startTime = channelConfig.chStartTime; + const stopTime = channelConfig.chStopTime; // Merge prices if pricesTomorrow is not empty let mergedPrices = pricesToday; if (pricesTomorrow.length !== 0) { mergedPrices = [...pricesToday, ...pricesTomorrow]; } + //WiP 600 + if (pricesYesterday.length !== 0) { + mergedPrices = [...pricesYesterday, ...mergedPrices]; + } + //WiP 600 // filter objects to time frame - filteredPrices = mergedPrices.filter((price) => { + filteredPrices = mergedPrices.filter(price => { const priceDate = new Date(price.startsAt); return priceDate >= startTime && priceDate < stopTime; }); } + //WIP + filteredPrices.sort((a, b) => a.total - b.total); // get first n entries und test for matching hour - const n = this.adapter.config.CalculatorList[channel].chAmountHours; + const n = channelConfig.chAmountHours; const result = filteredPrices.slice(0, n).map((entry) => checkHourMatch(entry)); // identify if any element is true - if (result.some((value) => value)) { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOn; + if (result.some(value => value)) { + valueToSet = channelConfig.chValueOn; } else { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; + valueToSet = channelConfig.chValueOff; } } //set value to foreign state, if defined let sOutState = ""; - if (this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive")) { - sOutState = this.adapter.config.CalculatorList[channel].chTargetState; - this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); + if (channelConfig?.chTargetState && + channelConfig.chTargetState.length > 10 && + !channelConfig.chTargetState.startsWith("choose your state to drive")) { + sOutState = channelConfig.chTargetState; + void this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); } else { - sOutState = `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Output`; - this.adapter.setStateAsync(sOutState, convertValue(valueToSet), true); + sOutState = `Homes.${channelConfig.chHomeID}.Calculations.${channel}.Output`; + void this.adapter.setState(sOutState, convertValue(valueToSet), true); } this.adapter.log.debug(`calculator channel: ${channel} - best single hours ${modeLTF ? "LTF" : ""}; setting state: ${sOutState} to ${valueToSet}`); } @@ -629,53 +729,72 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { try { let valueToSet = ""; const now = new Date(); - if (!this.adapter.config.CalculatorList[channel].chActive) { + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (!channelConfig.chActive) { // not active -> choose chValueOff - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - this.setup_chBlockStartFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); - this.setup_chBlockEndFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); + valueToSet = channelConfig.chValueOff; + this.setup_chBlockStartFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockEndFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockStart(channelConfig.chHomeID, channel, true); + this.setup_chBlockEnd(channelConfig.chHomeID, channel, true); } - else if (modeLTF && now < this.adapter.config.CalculatorList[channel].chStartTime) { + else if (modeLTF && now < channelConfig.chStartTime) { // chActive but before LTF -> choose chValueOff - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - this.setup_chBlockStartFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); - this.setup_chBlockEndFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); + valueToSet = channelConfig.chValueOff; + this.setup_chBlockStartFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockEndFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockStart(channelConfig.chHomeID, channel, true); + this.setup_chBlockEnd(channelConfig.chHomeID, channel, true); } - else if (modeLTF && now > this.adapter.config.CalculatorList[channel].chStopTime) { + else if (modeLTF && now > channelConfig.chStopTime) { // chActive but after LTF -> choose chValueOff and disable channel or generate new running period - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - this.setup_chBlockStartFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); - this.setup_chBlockEndFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); - if (this.adapter.config.CalculatorList[channel].chRepeatDays == 0) { - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Active`, false, true); + valueToSet = channelConfig.chValueOff; + this.setup_chBlockStartFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockEndFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockStart(channelConfig.chHomeID, channel, true); + this.setup_chBlockEnd(channelConfig.chHomeID, channel, true); + if (channelConfig.chRepeatDays == 0) { + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.Active`, false, true); } else { - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StartTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(this.adapter.config.CalculatorList[channel].chStartTime, this.adapter.config.CalculatorList[channel].chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StopTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(this.adapter.config.CalculatorList[channel].chStopTime, this.adapter.config.CalculatorList[channel].chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.StartTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(channelConfig.chStartTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + channelConfig.chStartTime = (0, date_fns_1.addDays)(channelConfig.chStartTime, channelConfig.chRepeatDays); + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.StopTime`, (0, date_fns_1.format)((0, date_fns_1.addDays)(channelConfig.chStopTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + channelConfig.chStopTime = (0, date_fns_1.addDays)(channelConfig.chStopTime, channelConfig.chRepeatDays); } } else { - const pricesToday = JSON.parse(await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.PricesToday.json`)); + // chActive and inside LTF -> choose desired value + const pricesToday = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesToday.json`)); let filteredPrices = pricesToday; if (modeLTF) { // Limited Time Frame mode, modify filteredPrices accordingly - const pricesTomorrow = JSON.parse(await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.PricesTomorrow.json`)); - const startTime = this.adapter.config.CalculatorList[channel].chStartTime; - const stopTime = this.adapter.config.CalculatorList[channel].chStopTime; + const pricesTomorrow = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesTomorrow.json`)); + //WiP 600 + const pricesYesterday = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesYesterday.json`)); + //WiP 600 + const startTime = channelConfig.chStartTime; + const stopTime = channelConfig.chStopTime; // Merge prices if pricesTomorrow is not empty let mergedPrices = pricesToday; if (pricesTomorrow.length !== 0) { mergedPrices = [...pricesToday, ...pricesTomorrow]; } + //WiP 600 + if (pricesYesterday.length !== 0) { + mergedPrices = [...pricesYesterday, ...mergedPrices]; + } + //WiP 600 // filter objects to time frame - filteredPrices = mergedPrices.filter((price) => { + filteredPrices = mergedPrices.filter(price => { const priceDate = new Date(price.startsAt); return priceDate >= startTime && priceDate < stopTime; }); } + //#region *** Find cheapest block *** let minSum = Number.MAX_VALUE; let startIndex = 0; - const n = Math.min(this.adapter.config.CalculatorList[channel].chAmountHours, filteredPrices.length); + const n = Math.min(channelConfig.chAmountHours, filteredPrices.length); for (let i = 0; i < filteredPrices.length - n + 1; i++) { let sum = 0; for (let j = i; j < i + n; j++) { @@ -688,32 +807,38 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } const minSumEntries = filteredPrices.slice(startIndex, startIndex + n).map((entry) => checkHourMatch(entry)); // identify if any element is true - if (minSumEntries.some((value) => value)) { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOn; + if (minSumEntries.some(value => value)) { + valueToSet = channelConfig.chValueOn; } else { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; + valueToSet = channelConfig.chValueOff; } + //#endregion // calculate average cost of determined block of hours, write to data point - this.checkAndSetValueNumber(this.getStatePrefix(this.adapter.config.CalculatorList[channel].chHomeID, `Calculations.${channel}`, `AverageTotalCost`), Math.round(1000 * (minSum / n)) / 1000, `average total cost in determined block`, undefined, false, false); - // write start and stop time of determined block to data points + void this.checkAndSetValueNumber(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.AverageTotalCost`, Math.round(1000 * (minSum / n)) / 1000, `average total cost in determined block`, undefined, false, false); + //#region *** Write start and stop time of determined block to data points *** const beginDate = new Date(filteredPrices[startIndex].startsAt); + void this.checkAndSetValue(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.BlockStartFullHour`, (0, date_fns_1.format)(beginDate, "H"), `first hour of determined block`, false, false); + void this.checkAndSetValue(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.BlockStart`, filteredPrices[startIndex].startsAt, `start date string of determined block`, false, false); const endDate = new Date(filteredPrices[startIndex + n - 1].startsAt); - this.checkAndSetValue(this.getStatePrefix(this.adapter.config.CalculatorList[channel].chHomeID, `Calculations.${channel}`, `BlockStartFullHour`), (0, date_fns_1.format)(beginDate, "H"), `first hour of determined block`, false, false); - this.checkAndSetValue(this.getStatePrefix(this.adapter.config.CalculatorList[channel].chHomeID, `Calculations.${channel}`, `BlockEndFullHour`), (0, date_fns_1.format)((0, date_fns_1.addHours)(endDate, 1), "H"), `end hour of determined block`, false, false); + void this.checkAndSetValue(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.BlockEndFullHour`, (0, date_fns_1.format)((0, date_fns_1.addHours)(endDate, 1), "H"), `end hour of determined block`, false, false); + void this.checkAndSetValue(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.BlockEnd`, filteredPrices[startIndex + n].startsAt, `stop date string of determined block`, false, false); + //#endregion } - //set value to foreign state, if defined + //#region *** set value to foreign state, if defined, or use internal Output *** let sOutState = ""; - if (this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive")) { - sOutState = this.adapter.config.CalculatorList[channel].chTargetState; - this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); + if (channelConfig?.chTargetState && + channelConfig.chTargetState.length > 10 && + !channelConfig.chTargetState.startsWith("choose your state to drive")) { + sOutState = channelConfig.chTargetState; + void this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); } else { - sOutState = `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Output`; - this.adapter.setStateAsync(sOutState, convertValue(valueToSet), true); + sOutState = `Homes.${channelConfig.chHomeID}.Calculations.${channel}.Output`; + void this.adapter.setState(sOutState, convertValue(valueToSet), true); } this.adapter.log.debug(`calculator channel: ${channel} - best hours block ${modeLTF ? "LTF" : ""}; setting state: ${sOutState} to ${valueToSet}`); + //#endregion } catch (error) { this.adapter.log.warn(this.generateErrorMessage(error, `execute calculator for best hours block ${modeLTF ? "LTF " : ""}in channel ${channel}`)); @@ -753,16 +878,17 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { try { let valueToSet = ""; let valueToSet2 = ""; - if (!this.adapter.config.CalculatorList[channel].chActive) { + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (!channelConfig.chActive) { // Not Active - disable battery charging (OFF-1) and also disable feed into home energy system (OFF-2) - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - valueToSet2 = this.adapter.config.CalculatorList[channel].chValueOff2; + valueToSet = channelConfig.chValueOff; + valueToSet2 = channelConfig.chValueOff2; } else { // chActive -> choose desired values - const pricesToday = JSON.parse(await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.PricesToday.json`)); - const maxCheapCount = await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.AmountHours`); - const efficiencyLoss = await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.EfficiencyLoss`); + const pricesToday = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesToday.json`)); + const maxCheapCount = await this.getStateValue(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.AmountHours`); + const efficiencyLoss = await this.getStateValue(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.EfficiencyLoss`); // sort by total price pricesToday.sort((a, b) => a.total - b.total); const cheapHours = []; @@ -781,7 +907,7 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } cheapIndex++; } - const maxCheapTotal = Math.max(...cheapHours.map((hour) => hour.total)); + const maxCheapTotal = Math.max(...cheapHours.map(hour => hour.total)); for (const hour of pricesToday) { if (!cheapHours.includes(hour)) { if (hour.total > minDelta + maxCheapTotal) { @@ -792,27 +918,27 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } } } - this.adapter.log.debug(`calculator channel ${channel} SBB-type result - cheap hours: ${cheapHours.map((hour) => hour.total)}`); - this.adapter.log.debug(`calculator channel ${channel} SBB-type result - normal hours: ${normalHours.map((hour) => hour.total)}`); - this.adapter.log.debug(`calculator channel ${channel} SBB-type result - expensive hours: ${expensiveHours.map((hour) => hour.total)}`); + this.adapter.log.debug(`calculator channel ${channel} SBB-type result - cheap hours: ${cheapHours.map(hour => hour.total).join(", ")}`); + this.adapter.log.debug(`calculator channel ${channel} SBB-type result - normal hours: ${normalHours.map(hour => hour.total).join(", ")}`); + this.adapter.log.debug(`calculator channel ${channel} SBB-type result - expensive hours: ${expensiveHours.map(hour => hour.total).join(", ")}`); const resultCheap = cheapHours.map((entry) => checkHourMatch(entry)); const resultNormal = normalHours.map((entry) => checkHourMatch(entry)); const resultExpensive = expensiveHours.map((entry) => checkHourMatch(entry)); // identify if an element is true and generate output - if (resultCheap.some((value) => value)) { + if (resultCheap.some(value => value)) { // Cheap Hours - enable battery charging (ON-1) and disable feed into home energy system (OFF-2) - valueToSet = this.adapter.config.CalculatorList[channel].chValueOn; - valueToSet2 = this.adapter.config.CalculatorList[channel].chValueOff2; + valueToSet = channelConfig.chValueOn; + valueToSet2 = channelConfig.chValueOff2; } - else if (resultNormal.some((value) => value)) { + else if (resultNormal.some(value => value)) { // Normal Hours - disable battery charging (OFF-1) and also disable feed into home energy system (OFF-2) - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - valueToSet2 = this.adapter.config.CalculatorList[channel].chValueOff2; + valueToSet = channelConfig.chValueOff; + valueToSet2 = channelConfig.chValueOff2; } - else if (resultExpensive.some((value) => value)) { + else if (resultExpensive.some(value => value)) { // Expensive Hours - disable battery charging (OFF-1) and enable feed into home energy system (ON-2) - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - valueToSet2 = this.adapter.config.CalculatorList[channel].chValueOn2; + valueToSet = channelConfig.chValueOff; + valueToSet2 = channelConfig.chValueOn2; } else { this.adapter.log.warn(this.generateErrorMessage(`no result found for SBB`, `execute calculator for smart battery buffer in channel ${channel}`)); @@ -825,24 +951,24 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } //set value to foreign states, if defined let sOutState = ""; - if (this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive")) { - sOutState = this.adapter.config.CalculatorList[channel].chTargetState; - this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); + if (channelConfig?.chTargetState && + channelConfig.chTargetState.length > 10 && + !channelConfig.chTargetState.startsWith("choose your state to drive")) { + sOutState = channelConfig.chTargetState; + void this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); } else { - sOutState = `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Output`; - this.adapter.setStateAsync(sOutState, convertValue(valueToSet), true); + sOutState = `Homes.${channelConfig.chHomeID}.Calculations.${channel}.Output`; + void this.adapter.setState(sOutState, convertValue(valueToSet), true); } - sOutState = ""; - if (this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive")) { - sOutState = this.adapter.config.CalculatorList[channel].chTargetState; - this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet2)); + sOutState = ""; // reinit for output 2 + if (channelConfig.chTargetState2.length > 10 && !channelConfig.chTargetState2.startsWith("choose your state to drive")) { + sOutState = channelConfig.chTargetState2; + void this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet2)); } else { - sOutState = `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Output2`; - this.adapter.setStateAsync(sOutState, convertValue(valueToSet2), true); + sOutState = `Homes.${channelConfig.chHomeID}.Calculations.${channel}.Output2`; + void this.adapter.setState(sOutState, convertValue(valueToSet2), true); } } catch (error) { @@ -851,12 +977,27 @@ class TibberCalculator extends tibberHelper_1.TibberHelper { } } exports.TibberCalculator = TibberCalculator; -// function to check for equal hour values of given to current +/** + * Checks if the current hour matches the hour of a given entry's start time. + * This method compares the hour of the current date and time with the hour extracted from the `startsAt` property of the provided `entry` object. + * If the hours match, the function returns `true`, otherwise `false`. + * + * @param entry - An object of type `IPrice` containing a `startsAt` property that represents the start time as a date string. + * @returns A boolean indicating whether the current hour matches the hour of the `startsAt` time. + */ function checkHourMatch(entry) { const currentDateTime = new Date(); const startDateTime = new Date(entry.startsAt); return currentDateTime.getHours() === startDateTime.getHours(); } +/** + * Converts a string value to its corresponding boolean, number, or string representation. + * This method attempts to convert the input string into a boolean if it matches "true" or "false" (case-insensitive). + * If the string can be parsed as a number, it is converted to a number. Otherwise, the original string is returned. + * + * @param Value - The string to be converted into a boolean, number, or returned as a string. + * @returns A boolean if the string is "true" or "false", a number if the string represents a valid numeric value, or the original string if no conversion is possible. + */ function convertValue(Value) { if (Value.toLowerCase() === "true") { return true; @@ -864,9 +1005,7 @@ function convertValue(Value) { else if (Value.toLowerCase() === "false") { return false; } - else { - const numericValue = parseFloat(Value); - return isNaN(numericValue) ? Value : numericValue; - } + const numericValue = parseFloat(Value); + return isNaN(numericValue) ? Value : numericValue; } //# sourceMappingURL=tibberCalculator.js.map \ No newline at end of file diff --git a/build/lib/tibberCalculator.js.map b/build/lib/tibberCalculator.js.map index 637f4f3f..c1969d1e 100644 --- a/build/lib/tibberCalculator.js.map +++ b/build/lib/tibberCalculator.js.map @@ -1 +1 @@ -{"version":3,"file":"tibberCalculator.js","sourceRoot":"","sources":["../../src/lib/tibberCalculator.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tibberCalculator.js","sourceRoot":"","sources":["../../src/lib/tibberCalculator.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/lib/tibberHelper.js.map b/build/lib/tibberHelper.js.map deleted file mode 100644 index c6b22a09..00000000 --- a/build/lib/tibberHelper.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"tibberHelper.js","sourceRoot":"","sources":["../../src/lib/tibberHelper.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/lib/tibberLocal.js b/build/lib/tibberLocal.js index 90e09901..a7e570e1 100644 --- a/build/lib/tibberLocal.js +++ b/build/lib/tibberLocal.js @@ -6,59 +6,80 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.TibberLocal = void 0; const axios_1 = __importDefault(require("axios")); const date_fns_1 = require("date-fns"); -const tibberHelper_1 = require("./tibberHelper"); -class TibberLocal extends tibberHelper_1.TibberHelper { +const projectUtils_1 = require("./projectUtils"); +/** + * TibberLocal + */ +class TibberLocal extends projectUtils_1.ProjectUtils { + intervalList; + TestData = ""; + // example HEX strings - meter mode 3 e.g. for "ISKRA ISK00 7034" meters + // TestData: string = `1b1b1b1b01010101760512923b426200620072630101760101050630be6c0b090149534b0004316b61010163a9b600760512923b43620062007263070177010b090149534b0004316b61070100620affff726201650b7415f27a77078181c78203ff010101010449534b0177070100000009ff010101010b090149534b0004316b610177070100010800ff65000101a001621e52ff59000000000ee32fcb0177070100010801ff0101621e52ff59000000000ee32fcb0177070100010802ff0101621e52ff5900000000000000000177070100020800ff0101621e52ff590000000007318ead0177070100020801ff0101621e52ff590000000007318ead0177070100020802ff0101621e52ff5900000000000000000177070100100700ff0101621b520055fffffff10177078181c78205ff010101018302268dd6b5bfb5760a1b2c763b034bd3af9863ea9000593a8da767ec1ba01e9b6e8d52fa200e7ec7517fc100295699650b01010163d03800760512923b4462006200726302017101630a84001b1b1b1b1a00a9f2`; + // example HEX strings - meter mode 3??? WiP e.g. for "EasyMeter Q3AA2064" meters + // TestData: string = `1b1b1b1b01010101760b455359416ebd0ac96831620062007263010176010445535908455359781168310b09014553591103bf6ebd0101638b0d00760b455359416ebd0ac96832620062007263070177010b09014553591103bf6ebd080100620affff0072620165039878117677078181c78203ff01010101044553590177070100000009ff010101010b09014553591103bf6ebd0177070100010800ff6400008001621e52fc5900000007fdd4f5c60177070100020800ff6400008001621e52fc5900000000002009db0177070100100700ff0101621b52fe5900000000000028d60177078181c7f006ff010101010401003e0101016305d800760b455359416ebd0ac968336200620072630201710163c13b000000001b1b1b1b1a032b3e`; + TestMode = false; + MetricsDataInterval = 60000; + meterMode = 0; //negSignPattern: string = "77070100010800ff6301a"; + /** + * + * @param adapter - ioBroker adapter instance + */ constructor(adapter) { super(adapter); - this.TestData = ""; - this.TestMode = false; - this.MetricsDataInterval = 60000; - this.RawDataInterval = 2000; - this.meterMode = 0; this.intervalList = []; } - async setupOnePulseLocal(pulse) { + /** + * setupOnePulseLocal + * + * @param pulse - ID of the Tibber Pulse + */ + setupOnePulseLocal(pulse) { try { if (this.adapter.config.PulseList[pulse].puName === undefined) { this.adapter.config.PulseList[pulse].puName = `Pulse Local`; } + const interval = this.adapter.config.PulseList[pulse].tibberBridgeRawDataInterval; + if (interval === undefined || interval === null || isNaN(interval) || interval < 1000) { + this.adapter.config.PulseList[pulse].tibberBridgeRawDataInterval = 2000; + } if (!this.TestMode) { let firstMetricsRun = true; let firstDataRun = true; //#region *** get Tibber Bridge metrics first time this.getPulseData(pulse) - .then((response) => { + .then(response => { this.adapter.log.debug(`Polled local Tibber Bridge metrics${firstMetricsRun ? " for the first time" : ""}: ${JSON.stringify(response)}`); this.fetchPulseInfo(pulse, response, "", firstMetricsRun); firstMetricsRun = false; }) - .catch((e) => { + .catch(e => { this.adapter.log.error(`Error while polling and parsing Tibber Bridge metrics: ${e}`); }); //#endregion //#region *** setup Tibber Bridge metrics job const jobBridgeMetrics = setInterval(() => { this.getPulseData(pulse) - .then((response) => { + .then(response => { this.adapter.log.debug(`Polled local Tibber Bridge metrics: ${JSON.stringify(response)}`); this.fetchPulseInfo(pulse, response, "", firstMetricsRun); firstMetricsRun = false; }) - .catch((e) => { + .catch(e => { this.adapter.log.error(`Error polling and parsing Tibber Bridge metrics: ${e}`); }); }, this.MetricsDataInterval); - if (jobBridgeMetrics) + if (jobBridgeMetrics) { this.intervalList.push(jobBridgeMetrics); + } //#endregion //#region *** setup Tibber Pulse data job const jobPulseLocal = setInterval(() => { // poll data and log as HEX string this.getDataAsHexString(pulse) - .then((hexString) => { + .then(hexString => { this.adapter.log.debug(`got HEX data from local pulse: ${hexString}`); // log data as HEX string - this.checkAndSetValue(this.getStatePrefixLocal(pulse, "SMLDataHEX"), hexString, this.adapter.config.PulseList[pulse].puName); + void this.checkAndSetValue(`LocalPulse.${pulse}.SMLDataHEX`, hexString, this.adapter.config.PulseList[pulse].puName); this.adapter.log.debug(`trying to parse meter mode ${this.meterMode}`); switch (this.meterMode) { case 1: @@ -75,16 +96,19 @@ class TibberLocal extends tibberHelper_1.TibberHelper { } firstDataRun = false; }) - .catch((e) => { - this.adapter.log.warn(`Error local polling of Tibber Pulse RAW data: ${e}`); + .catch(error => { + this.adapter.log.warn(`Error local polling of Tibber Pulse RAW data: ${error}`); }); - }, this.RawDataInterval); - if (jobPulseLocal) + }, this.adapter.config.PulseList[pulse].tibberBridgeRawDataInterval); + if (jobPulseLocal) { this.intervalList.push(jobPulseLocal); + } //#endregion } else { - const parsedMessages = this.extractAndParseSMLMessages(99, this.TestData); + // test mode + this.adapter.log.error(`RUNNING IN TEST MODE`); + const parsedMessages = void this.extractAndParseSMLMessages(0, this.TestData); this.adapter.log.warn(`Parsed messages from test data ${parsedMessages}`); } } @@ -97,10 +121,8 @@ class TibberLocal extends tibberHelper_1.TibberHelper { * * This method iterates over all interval jobs stored in `this.intervalList` and clears each one. * If an error occurs during this process, it logs a warning message. - * - * @returns A promise that resolves when all intervals have been cleared. */ - async clearIntervals() { + clearIntervals() { try { // Here we must clear all intervals that may still be active for (const intervalJob of this.intervalList) { @@ -192,20 +214,21 @@ class TibberLocal extends tibberHelper_1.TibberHelper { else { switch (key) { case "timestamp": + // eslint-disable-next-line no-case-declarations const TimeValue = this.isValidUnixTimestampAndConvert(obj[key]); if (TimeValue) { obj[key] = TimeValue; - this.checkAndSetValue(this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), obj[key], this.adapter.config.PulseList[pulse].puName, false, false, firstTime); + void this.checkAndSetValue(`LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, false, false, firstTime); } break; case "node_temperature": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber(this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), Math.round(obj[key] * 10) / 10, `Temperature of this Tibber Pulse unit`, "°C", false, false, firstTime); + void this.checkAndSetValueNumber(`LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, Math.round(obj[key] * 10) / 10, `Temperature of this Tibber Pulse unit`, "°C", false, false, firstTime); } break; case "meter_mode": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber(this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), Math.round(obj[key] * 10) / 10, `Mode of your Pulse to grid-meter communication`, "", false, false, firstTime); + void this.checkAndSetValueNumber(`LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, Math.round(obj[key] * 10) / 10, `Mode of your Pulse to grid-meter communication`, "", false, false, firstTime); this.meterMode = obj[key]; if (![1, 3, 4].includes(obj[key])) { this.adapter.log.warn(`Potential problems with Pulse meter mode ${obj[key]}`); @@ -214,12 +237,12 @@ class TibberLocal extends tibberHelper_1.TibberHelper { break; case "node_battery_voltage": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber(this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), Math.round(obj[key] * 100) / 100, `Temperature of this Tibber Pulse unit`, "V", false, false, firstTime); + void this.checkAndSetValueNumber(`LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, Math.round(obj[key] * 100) / 100, `Temperature of this Tibber Pulse unit`, "V", false, false, firstTime); } break; case "node_uptime_ms": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber(this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), obj[key], `Uptime of your Tibber Pulse in ms`, "ms", false, false, firstTime); + void this.checkAndSetValueNumber(`LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], `Uptime of your Tibber Pulse in ms`, "ms", false, false, firstTime); function formatMilliseconds(ms) { const duration = (0, date_fns_1.intervalToDuration)({ start: 0, end: ms }); const formattedDuration = (0, date_fns_1.formatDuration)(duration, { format: ["months", "days", "hours", "minutes", "seconds"] }); @@ -229,30 +252,30 @@ class TibberLocal extends tibberHelper_1.TibberHelper { return parts.slice(0, 6).join(" "); // slice(0, 4) um die ersten zwei Blöcke (jeweils Einheit und Wert) zu erhalten // Output: "229 days 3 hours 17 minutes" } - this.checkAndSetValue(this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}node_uptime`), formatMilliseconds(obj[key]), `Uptime of your Tibber Pulse`, false, false, firstTime); + void this.checkAndSetValue(`LocalPulse.${pulse}.PulseInfo.${prefix}node_uptime`, formatMilliseconds(obj[key]), `Uptime of your Tibber Pulse`, false, false, firstTime); } break; case "time_in_em0_ms": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber(this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), obj[key], this.adapter.config.PulseList[pulse].puName, "ms", false, false, firstTime); + void this.checkAndSetValueNumber(`LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, "ms", false, false, firstTime); } break; case "time_in_em1_ms": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber(this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), obj[key], this.adapter.config.PulseList[pulse].puName, "ms", false, false, firstTime); + void this.checkAndSetValueNumber(`LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, "ms", false, false, firstTime); } break; case "time_in_em2_ms": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber(this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), obj[key], this.adapter.config.PulseList[pulse].puName, "ms", false, false, firstTime); + void this.checkAndSetValueNumber(`LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, "ms", false, false, firstTime); } break; default: if (typeof obj[key] === "string") { - this.checkAndSetValue(this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), obj[key], this.adapter.config.PulseList[pulse].puName, false, false, firstTime); + void this.checkAndSetValue(`LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, false, false, firstTime); } else { - this.checkAndSetValueNumber(this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), obj[key], this.adapter.config.PulseList[pulse].puName, "", false, false, firstTime); + void this.checkAndSetValueNumber(`LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, "", false, false, firstTime); } } } @@ -290,21 +313,22 @@ class TibberLocal extends tibberHelper_1.TibberHelper { * Extracts and parses Mode 3 energy meter messages from a hexadecimal string. * * @param pulse - An identifier for the pulse. - * @param transfer - A string representing the hexadecimal Mode 3 messages to be parsed. + * @param transfer - A string representing the hexadecimal mode 3 message to be parsed. * @param forceMode - An optional boolean indicating whether to force the mode (default is false). - * @returns A Promise that resolves when the parsing and processing are complete. */ - async extractAndParseSMLMessages(pulse, transfer, forceMode = false) { + extractAndParseSMLMessages(pulse, transfer, forceMode = false) { const messages = transfer.matchAll(/7707(0100[0-9a-fA-F].{5}?ff).{4,28}62([0-9a-fA-F]{2})52([0-9a-fA-F]{2})([0-9a-fA-F]{2})((?:[0-9a-fA-F]{2}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8}|[0-9a-fA-F]{10}|[0-9a-fA-F]{8}|[0-9a-fA-F]{16}))01(?=(77)|(0101)|(\n))/g); const output = []; for (const match of messages) { const result = { name: "", value: 0 }; - //this.adapter.log.debug(`overall compliance: ${match[0]}`); - //this.adapter.log.debug(`group 1: ${match[1]}`); - //this.adapter.log.debug(`group 2: ${match[2]}`); - //this.adapter.log.debug(`group 3: $[match[3]}`); - //this.adapter.log.debug(`group 4: $[match[4]}`); - //this.adapter.log.debug(`group 5: ${match[5]}`); + if (this.TestMode) { + this.adapter.log.debug(`parse SML overall compliance: ${match[0]}`); + this.adapter.log.debug(`parse SML group 1: ${match[1]}`); + this.adapter.log.debug(`parse SML group 2: ${match[2]}`); + this.adapter.log.debug(`parse SML group 3: ${match[3]}`); + this.adapter.log.debug(`parse SML group 4: ${match[4]}`); + this.adapter.log.debug(`parse SML group 5: ${match[5]}`); + } result.name = findObisCodeName(match[1]); if (result.name.startsWith(`Found invalid OBIS-Code:`)) { this.adapter.log.debug(result.name); @@ -317,11 +341,10 @@ class TibberLocal extends tibberHelper_1.TibberHelper { result.value = parseSignedHex(match[5]); const decimalCode = parseInt(match[2], 16); result.unit = findDlmsUnitByCode(decimalCode); - if (match[3].toLowerCase() == "ff") { - result.value = result.value / 10; - } - else if (match[3].toLowerCase() == "fe") { - result.value = result.value / 100; + const scalingFactors = { ff: 10, fe: 100, fd: 1000, fc: 10000 }; + const scaleFactor = scalingFactors[match[3].toLowerCase()]; + if (scaleFactor) { + result.value /= scaleFactor; } //#region *** negSignPattern /* @@ -338,8 +361,15 @@ class TibberLocal extends tibberHelper_1.TibberHelper { } */ //#endregion - if (result.value > 1000000000 || result.value < -1000000000) { - this.adapter.log.debug(`Result.value < or > 1.000.000.000 skiped!`); + if (result.value < -1000000000) { + this.adapter.log.debug(`Result.value < -1.000.000.000 skiped!`); + this.adapter.log.debug(JSON.stringify(result)); + this.adapter.log.debug(`overall compliance: ${match[0]}`); + this.adapter.log.debug(`RAW: ${transfer}`); + continue; + } + if (result.value > 1000000000) { + this.adapter.log.debug(`Result.value > 1.000.000.000 skiped!`); this.adapter.log.debug(JSON.stringify(result)); this.adapter.log.debug(`overall compliance: ${match[0]}`); this.adapter.log.debug(`RAW: ${transfer}`); @@ -347,15 +377,16 @@ class TibberLocal extends tibberHelper_1.TibberHelper { } if (result.unit == "Wh") { result.unit = "kWh"; - result.value = Math.round(result.value / 100) / 10; + result.value = Math.round(result.value / 10) / 100; } - this.checkAndSetValueNumber(this.getStatePrefixLocal(pulse, result.name), result.value, this.adapter.config.PulseList[pulse].puName, result.unit, false, false, forceMode); + void this.checkAndSetValueNumber(`LocalPulse.${pulse}.${result.name}`, result.value, this.adapter.config.PulseList[pulse].puName, result.unit, false, false, forceMode); this.adapter.log.debug(`Pulse mode 3 parse result: ${JSON.stringify(result)}`); const formattedMatch = match[0].replace(/(..)/g, "$1 ").trim(); output.push(`${getCurrentTimeFormatted()}: ${formattedMatch}\n`); } - if (output.length > 0) + if (output.length > 0) { this.adapter.log.debug(`Format for https://tasmota-sml-parser.dicp.net :\n ${output.join("")}`); + } } /** * Extracts and parses Mode 1 and 4 energy meter messages from a hexadecimal string. @@ -367,9 +398,8 @@ class TibberLocal extends tibberHelper_1.TibberHelper { * @param pulse - An identifier for the pulse. * @param transfer - A string representing the hexadecimal Mode 1 or 4 messages to be parsed. * @param forceMode - An optional boolean indicating whether to force the mode (default is false). - * @returns A Promise that resolves when the parsing and processing are complete. */ - async extractAndParseMode1_4Messages(pulse, transfer, forceMode = false) { + extractAndParseMode1_4Messages(pulse, transfer, forceMode = false) { const PulseParseResults = []; // example HEX strings - meter mode 1 e.g. for "ZPA GH305" meters // transfer = `2f5a50413547483330352e76322d32302e30302d470d0a0d0a02312d303a432e312e302a32353528315a504130303235313337353738290d0a312d303a312e382e302a323535283031383131362e333030322a6b5768290d0a312d303a312e382e312a323535283030303030302e303030302a6b5768290d0a312d303a312e382e322a323535283031383131362e333030322a6b5768290d0a312d303a322e382e302a323535283031393330362e303938392a6b5768290d0a312d303a31362e372e302a323535282d3030333039342a57290d0a312d303a33322e372e302a323535283233332e352a56290d0a312d303a35322e372e302a323535283233332e332a56290d0a312d303a37322e372e302a323535283233332e392a56290d0a312d303a33312e372e302a323535283030322e39382a41290d0a312d303a35312e372e302a323535283030352e33302a41290d0a312d303a37312e372e302a323535283030352e33302a41290d0a312d303a38312e372e312a323535283132302a646567290d0a312d303a38312e372e322a323535283234302a646567290d0a312d303a38312e372e342a323535283139342a646567290d0a312d303a38312e372e31352a323535283138362a646567290d0a312d303a38312e372e32362a323535283139342a646567290d0a312d303a31342e372e302a3235352835302e302a487a290d0a312d303a302e322e302a323535287665722e32302c44363841393343372c3230323030343039290d0a312d303a432e39302e322a323535284436384139334337290d0a312d303a462e462a32353528303030303030290d0a312d303a432e352e302a323535283030314337393034290d0a312d303a33362e372e302a323535282d3030303637332a57290d0a312d303a35362e372e302a323535282d3030313232322a57290d0a312d303a37362e372e302a323535282d3030313139312a57290d0a312d303a312e382e302a39362830303030392e382a6b5768290d0a312d303a312e382e302a39372830303037362e302a6b5768290d0a312d303a312e382e302a39382830303334372e342a6b5768290d0a312d303a312e382e302a39392830383136392e312a6b5768290d0a312d303a312e382e302a3130302831383131362e332a6b5768290d0a210d0a033c`; @@ -399,7 +429,7 @@ class TibberLocal extends tibberHelper_1.TibberHelper { const unit = match[3]; // Push the parsed measurement into the measurements array PulseParseResults.push({ name, value, unit }); - this.checkAndSetValueNumber(this.getStatePrefixLocal(pulse, name), value, this.adapter.config.PulseList[pulse].puName, unit, false, false, forceMode); + void this.checkAndSetValueNumber(`LocalPulse.${pulse}.${name}`, value, this.adapter.config.PulseList[pulse].puName, unit, false, false, forceMode); } } } @@ -417,7 +447,7 @@ class TibberLocal extends tibberHelper_1.TibberHelper { if (typeof n !== "number" || n < 0 || n > currentTime || !Number.isInteger(n)) { return false; } - // Konvertiere zu deutschem Zeitformat + // convert to German format const date = new Date(n * 1000); return date.toLocaleString("de-DE"); // WiP: use system string instead of always German; use date-fns } @@ -448,33 +478,39 @@ function parseSignedHex(hexStr) { const bitLength = hexStr.length * 4; if (bitLength <= 4) { // Behandlung als 4-Bit-Zahl - if (num > 0x7) + if (num > 0x7) { num = num - 0x1n; + } } else if (bitLength <= 8) { // Behandlung als 8-Bit-Zahl - if (num > 0x7f) + if (num > 0x7f) { num = num - 0x100n; + } } else if (bitLength <= 16) { // Behandlung als 16-Bit-Zahl - if (num > 0x7fff) + if (num > 0x7fff) { num = num - 0x10000n; + } } else if (bitLength <= 24) { // Behandlung als 16-Bit-Zahl - if (num > 0x7fffff) + if (num > 0x7fffff) { num = num - 0x1000000n; + } } else if (bitLength <= 32) { // Behandlung als 32-Bit-Zahl - if (num > 0x7fffffff) + if (num > 0x7fffffff) { num = num - 0x100000000n; + } } else { // Behandlung als 64-Bit-Zahl - if (num > 0x7fffffffffffffffn) + if (num > 0x7fffffffffffffffn) { num = num - 0x10000000000000000n; + } } return Number(num.toString()); } @@ -562,14 +598,13 @@ function findDlmsUnitByCode(decimalCode) { { code: 0x42, unit: "(unitless)", quantity: "no unit, unitless, count", unitName: "", siDefinition: "" }, { code: 0x0, unit: "", quantity: "", unitName: "", siDefinition: "stop condition for iterator" }, ]; - const found = dlmsUnits.find((item) => item.code === decimalCode); + const found = dlmsUnits.find(item => item.code === decimalCode); return found ? found.unit : ""; } /** * Finds the name corresponding to a given OBIS code. * * @param code - A string representing the OBIS code to look up. - * @param obisCodesWithNames - An array of objects where each object contains a `code` and `name` property. * @returns A string representing the name associated with the OBIS code, or "Unknown" if the code is not found. */ function findObisCodeName(code) { @@ -637,8 +672,8 @@ function findObisCodeName(code) { * - Hexadecimal format: exactly 12 hexadecimal characters. * - Decimal format: three groups of digits separated by dots. * - * @param {string} code - The OBIS code to be validated. - * @returns {boolean} - Returns true if the code matches either the hexadecimal or decimal format, false otherwise. + * @param code - The OBIS code to be validated. + * @returns Returns true if the code matches either the hexadecimal or decimal format, false otherwise. */ function isValidObisCode(code) { // Regex for hexadecimal format: exactly 12 hexadecimal characters diff --git a/build/lib/tibberLocal.js.map b/build/lib/tibberLocal.js.map index e9e3398e..28677587 100644 --- a/build/lib/tibberLocal.js.map +++ b/build/lib/tibberLocal.js.map @@ -1 +1 @@ -{"version":3,"file":"tibberLocal.js","sourceRoot":"","sources":["../../src/lib/tibberLocal.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tibberLocal.js","sourceRoot":"","sources":["../../src/lib/tibberLocal.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/lib/tibberPulse.js b/build/lib/tibberPulse.js index 0c5451f5..65350fe5 100644 --- a/build/lib/tibberPulse.js +++ b/build/lib/tibberPulse.js @@ -2,18 +2,37 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.TibberPulse = void 0; const tibber_api_1 = require("tibber-api"); -const tibberHelper_1 = require("./tibberHelper"); -class TibberPulse extends tibberHelper_1.TibberHelper { +const projectUtils_1 = require("./projectUtils"); +/** + * TibberPulse + */ +class TibberPulse extends projectUtils_1.ProjectUtils { + tibberConfig; + tibberQuery; + tibberFeed; + httpQueryUrl; + reconnectTime = 6000; + maxReconnectTime = 900000; + countedFeedDisconnects = 0; + lastFeedWarningTime = null; + deltaFeedWarningTime = 0; + /** + * constructor + * + * @param tibberConfig - The Tibber config object + * @param adapter - ioBroker adapter instance + */ constructor(tibberConfig, adapter) { super(adapter); - this.reconnectTime = 6000; - this.maxReconnectTime = 900000; this.tibberConfig = tibberConfig; this.tibberQuery = new tibber_api_1.TibberQuery(this.tibberConfig); this.tibberFeed = new tibber_api_1.TibberFeed(this.tibberQuery); this.httpQueryUrl = tibberConfig.apiEndpoint.queryUrl; this.addEventHandlerOnFeed(this.tibberFeed); } + /** + * ConnectPulseStream + */ async ConnectPulseStream() { try { await this.tibberFeed.connect(); @@ -22,6 +41,9 @@ class TibberPulse extends tibberHelper_1.TibberHelper { this.adapter.log.warn(`Error in ConnectPulseStream: ${error.message}`); } } + /** + * DisconnectPulseStream + */ DisconnectPulseStream() { try { this.tibberFeed.close(); @@ -34,45 +56,90 @@ class TibberPulse extends tibberHelper_1.TibberHelper { } addEventHandlerOnFeed(currentFeed) { // Set info.connection state for event "connected" - currentFeed.on("connected", (data) => { + currentFeed.on("connected", data => { this.adapter.log.debug(`Tibber feed connected: ${data.toString()}`); - this.adapter.setState("info.connection", true, true); + void this.adapter.setState("info.connection", true, true); }); - // Set info.connection state for event "disconnected" - currentFeed.on("disconnected", (data) => { - this.adapter.setState("info.connection", false, true); - if (this.adapter.config.HomesList.some((info) => info.feedActive)) { - this.adapter.log.warn(`A feed was disconnected. I try to reconnect with incremental delay - Tibber error text: ${data.toString()}`); - this.reconnect(); + /** + * Handles the disconnection of a data feed and manages reconnection attempts with incremental delays. + * + * This method is triggered when the data feed gets disconnected. It updates the connection state (`info.connection` to `false`) and monitors the frequency of disconnection attempts to avoid excessive reconnections. + * + * The following logic is applied: + * - **Disconnection count (`countedFeedDisconnects`)**: Tracks the number of disconnections. Warnings are logged when the feed disconnects 5 or 25 times. At 25 disconnections, an error is logged instead of a warning. + * - **Warning time interval (`deltaFeedWarningTime`)**: Measures the time (in minutes) since the last disconnection warning. If more than 60 minutes have passed, the warning counter resets. + * - If the feed disconnects frequently within a **30-minute window**, it logs a warning and resets the disconnection counter. + * - After each disconnection, the system tries to reconnect, logging the result. If disconnections occur too often, warnings or errors are logged based on the number of reconnection attempts. + * + * @param data - The error message sent by Tibber upon disconnection, which is logged for diagnostic purposes. + */ + currentFeed.on("disconnected", data => { + void this.adapter.setState("info.connection", false, true); + if (this.adapter.config.HomesList.some(info => info.feedActive)) { + this.deltaFeedWarningTime = 0; + if (this.lastFeedWarningTime !== null) { + this.deltaFeedWarningTime = (new Date().getTime() - this.lastFeedWarningTime.getTime()) / 1000 / 60; // timedifference in minutes + } + if (this.countedFeedDisconnects < 25 && this.deltaFeedWarningTime > 60) { + this.countedFeedDisconnects = 0; + this.lastFeedWarningTime = null; + this.deltaFeedWarningTime = 0; + } + this.countedFeedDisconnects++; + const loggingTextBlock = ` to reconnect with incremental delay - Error text sent by Tibber: ${data.toString()}`; + if (this.deltaFeedWarningTime > 30) { + this.countedFeedDisconnects = 0; + this.lastFeedWarningTime = null; + this.adapter.log.warn(`A feed was disconnected very often. I keep trying${loggingTextBlock}`); + } + else { + if (this.countedFeedDisconnects == 5) { + this.lastFeedWarningTime = new Date(); + this.adapter.log.warn(`A feed was disconnected very often. I keep trying${loggingTextBlock}`); + } + else if (this.countedFeedDisconnects == 25) { + this.adapter.log.error(`A feed was disconnected very often. I keep trying${loggingTextBlock}`); + } + else { + this.adapter.log.debug(`A feed was disconnected. I try to${loggingTextBlock}`); + } + } + void this.reconnect(); } }); // Add error handler on connection - currentFeed.on("error", (error) => { + currentFeed.on("error", error => { let errorMessage = ""; if (error instanceof Error) { - if (error.message) + if (error.message) { errorMessage = error.message; - else if (error.name) + } + else if (error.name) { errorMessage = error.name; - else + } + else { errorMessage = "Unspecified error"; + } } - else if (typeof error === "string") + else if (typeof error === "string") { errorMessage = error; - else + } + else { errorMessage = "Unknown error"; + } this.adapter.log.warn(`Error on Tibber feed: ${errorMessage}`); }); // Add data receiver - currentFeed.on("data", (data) => { + currentFeed.on("data", data => { const receivedData = data; this.fetchLiveMeasurement("LiveMeasurement", receivedData); }); } fetchLiveMeasurement(objectDestination, liveMeasurement) { let power = 0; - if (liveMeasurement.powerProduction === undefined || liveMeasurement.powerProduction === null) - liveMeasurement.powerProduction = 0; // fix wrong data from Tibber in edge cases + if (liveMeasurement.powerProduction === undefined || liveMeasurement.powerProduction === null) { + liveMeasurement.powerProduction = 0; + } // fix wrong data from Tibber in edge cases if (liveMeasurement.power > 0) { power = liveMeasurement.power; } @@ -82,34 +149,34 @@ class TibberPulse extends tibberHelper_1.TibberHelper { // "minpower" should be called "minpowerConsumption" - in fact there is no correct minpower yet, // when we think about minpower and maxpower should be linked to "power" (positive and negative power) if (this.tibberConfig.homeId !== undefined) { - this.checkAndSetValue(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "timestamp"), liveMeasurement.timestamp, "Timestamp when usage occurred"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "power"), power, "Powerlevel measured at the moment +/-", "W"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "lastMeterConsumption"), Math.round(1000 * liveMeasurement.lastMeterConsumption) / 1000, "Latest consumption meter state", "kWh"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedConsumption"), Math.round(1000 * liveMeasurement.accumulatedConsumption) / 1000, "Energy consumed since midnight", "kWh"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedProduction"), Math.round(1000 * liveMeasurement.accumulatedProduction) / 1000, "Energy feed into grid since midnight", "kWh"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedConsumptionLastHour"), Math.round(1000 * liveMeasurement.accumulatedConsumptionLastHour) / 1000, "Energy consumed since since last hour shift", "kWh"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedProductionLastHour"), Math.round(1000 * liveMeasurement.accumulatedProductionLastHour) / 1000, "Energy produced since last hour shift", "kWh"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedCost"), liveMeasurement.accumulatedCost, "Accumulated cost since midnight; requires active Tibber power deal"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedReward"), liveMeasurement.accumulatedReward, "Accumulated reward since midnight; requires active Tibber power deal"); - this.checkAndSetValue(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "currency"), liveMeasurement.currency, "Currency of displayed cost; requires active Tibber power deal"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "minPower"), liveMeasurement.minPower, "Min consumption since midnight", "W"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "averagePower"), liveMeasurement.averagePower, "Average consumption since midnight", "W"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "maxPower"), liveMeasurement.maxPower, "Peak consumption since midnight", "W"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "powerConsumption"), liveMeasurement.power, "Net consumption (A+) at the moment", "W"); + void this.checkAndSetValue(`Homes.${this.tibberConfig.homeId}.${objectDestination}.timestamp`, liveMeasurement.timestamp, "Timestamp when usage occurred"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.power`, power, "Powerlevel measured at the moment +/-", "W"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.lastMeterConsumption`, Math.round(1000 * liveMeasurement.lastMeterConsumption) / 1000, "Latest consumption meter state", "kWh"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedConsumption`, Math.round(1000 * liveMeasurement.accumulatedConsumption) / 1000, "Energy consumed since midnight", "kWh"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedProduction`, Math.round(1000 * liveMeasurement.accumulatedProduction) / 1000, "Energy feed into grid since midnight", "kWh"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedConsumptionLastHour`, Math.round(1000 * liveMeasurement.accumulatedConsumptionLastHour) / 1000, "Energy consumed since since last hour shift", "kWh"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedProductionLastHour`, Math.round(1000 * liveMeasurement.accumulatedProductionLastHour) / 1000, "Energy produced since last hour shift", "kWh"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedCost`, liveMeasurement.accumulatedCost, "Accumulated cost since midnight; requires active Tibber power deal"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedReward`, liveMeasurement.accumulatedReward, "Accumulated reward since midnight; requires active Tibber power deal"); + void this.checkAndSetValue(`Homes.${this.tibberConfig.homeId}.${objectDestination}.currency`, liveMeasurement.currency, "Currency of displayed cost; requires active Tibber power deal"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.minPower`, liveMeasurement.minPower, "Min consumption since midnight", "W"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.averagePower`, liveMeasurement.averagePower, "Average consumption since midnight", "W"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.maxPower`, liveMeasurement.maxPower, "Peak consumption since midnight", "W"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.powerConsumption`, liveMeasurement.power, "Net consumption (A+) at the moment", "W"); if (this.adapter.config.FeedConfigPowerProduction) { - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "powerProduction"), liveMeasurement.powerProduction, "Net grid feed-in (A-) at the moment", "W"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.powerProduction`, liveMeasurement.powerProduction, "Net grid feed-in (A-) at the moment", "W"); } - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "minPowerProduction"), liveMeasurement.minPowerProduction, "Min net grid feed-in since midnight", "W"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "maxPowerProduction"), liveMeasurement.maxPowerProduction, "Max net grid feed-in since midnight", "W"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "lastMeterProduction"), Math.round(1000 * liveMeasurement.lastMeterProduction) / 1000, "Latest grid feed-in meter state", "kWh"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "powerFactor"), liveMeasurement.powerFactor, "Power factor (active power / apparent power)"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "signalStrength"), liveMeasurement.signalStrength, "Device signal strength (Pulse - dB; Watty - percent)"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "voltagePhase1"), liveMeasurement.voltagePhase1, "Voltage on phase 1; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "V"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "voltagePhase2"), liveMeasurement.voltagePhase2, "Voltage on phase 2; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "V"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "voltagePhase3"), liveMeasurement.voltagePhase3, "Voltage on phase 3; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "V"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "currentL1"), liveMeasurement.currentL1, "Current on L1; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "A"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "currentL2"), liveMeasurement.currentL2, "Current on L2; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "A"); - this.checkAndSetValueNumber(this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "currentL3"), liveMeasurement.currentL3, "Current on L3; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "A"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.minPowerProduction`, liveMeasurement.minPowerProduction, "Min net grid feed-in since midnight", "W"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.maxPowerProduction`, liveMeasurement.maxPowerProduction, "Max net grid feed-in since midnight", "W"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.lastMeterProduction`, Math.round(1000 * liveMeasurement.lastMeterProduction) / 1000, "Latest grid feed-in meter state", "kWh"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.powerFactor`, liveMeasurement.powerFactor, "Power factor (active power / apparent power)"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.signalStrength`, liveMeasurement.signalStrength, "Device signal strength (Pulse - dB; Watty - percent)"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.voltagePhase1`, liveMeasurement.voltagePhase1, "Voltage on phase 1; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "V"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.voltagePhase2`, liveMeasurement.voltagePhase2, "Voltage on phase 2; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "V"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.voltagePhase3`, liveMeasurement.voltagePhase3, "Voltage on phase 3; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "V"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.currentL1`, liveMeasurement.currentL1, "Current on L1; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "A"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.currentL2`, liveMeasurement.currentL2, "Current on L2; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "A"); + void this.checkAndSetValueNumber(`Homes.${this.tibberConfig.homeId}.${objectDestination}.currentL3`, liveMeasurement.currentL3, "Current on L3; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "A"); } } /** diff --git a/build/lib/tibberPulse.js.map b/build/lib/tibberPulse.js.map index 430f36c2..7d825e5d 100644 --- a/build/lib/tibberPulse.js.map +++ b/build/lib/tibberPulse.js.map @@ -1 +1 @@ -{"version":3,"file":"tibberPulse.js","sourceRoot":"","sources":["../../src/lib/tibberPulse.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tibberPulse.js","sourceRoot":"","sources":["../../src/lib/tibberPulse.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/lib/tools.js b/build/lib/tools.js index 4b3a43b7..eb40e39e 100644 --- a/build/lib/tools.js +++ b/build/lib/tools.js @@ -8,8 +8,9 @@ exports.isArray = isArray; exports.translateText = translateText; const axios_1 = __importDefault(require("axios")); /** - * Tests whether the given variable is a real object and not an Array - * @param it The variable to test + * Tests whether the given variable is a real object and not an Array. + * + * @param it The variable to test. */ function isObject(it) { // This is necessary because: @@ -20,15 +21,18 @@ function isObject(it) { } /** * Tests whether the given variable is really an Array + * * @param it The variable to test */ function isArray(it) { - if (Array.isArray != null) + if (Array.isArray != null) { return Array.isArray(it); + } return Object.prototype.toString.call(it) === "[object Array]"; } /** * Translates text using the Google Translate API + * * @param text The text to translate * @param targetLang The target languate * @param yandexApiKey The yandex API key. You can create one for free at https://translate.yandex.com/developers @@ -43,12 +47,12 @@ async function translateText(text, targetLang, yandexApiKey) { if (yandexApiKey) { return translateYandex(text, targetLang, yandexApiKey); } - else { - return translateGoogle(text, targetLang); - } + return "DISABLED"; + //return translateGoogle(text, targetLang); } /** * Translates text with Yandex API + * * @param text The text to translate * @param targetLang The target languate * @param apiKey The yandex API key. You can create one for free at https://translate.yandex.com/developers @@ -69,29 +73,4 @@ async function translateYandex(text, targetLang, apiKey) { throw new Error(`Could not translate to "${targetLang}": ${e}`); } } -/** - * Translates text with Google API - * @param text The text to translate - * @param targetLang The target languate - */ -async function translateGoogle(text, targetLang) { - try { - // prettier-ignore - const url = `http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=${targetLang}&dt=t&q=${encodeURIComponent(text)}&ie=UTF-8&oe=UTF-8`; - const response = await axios_1.default.request({ url, timeout: 15000 }); - if (isArray(response.data)) { - // we got a valid response - return response.data[0][0][0]; - } - throw new Error(`Invalid response for translate request`); - } - catch (e) { - if (e.response?.status === 429) { - throw new Error(`Could not translate to "${targetLang}": Rate-limited by Google Translate`); - } - else { - throw new Error(`Could not translate to "${targetLang}": ${e}`); - } - } -} //# sourceMappingURL=tools.js.map \ No newline at end of file diff --git a/build/lib/tools.js.map b/build/lib/tools.js.map index 166f6e0f..026880de 100644 --- a/build/lib/tools.js.map +++ b/build/lib/tools.js.map @@ -1 +1 @@ -{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/lib/tools.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/lib/tools.ts"],"names":[],"mappings":";;;;;AAOA,4BAMC;AAOD,0BAKC;AASD,sCAWC;AA7CD,kDAA0B;AAE1B;;;;GAIG;AACH,SAAgB,QAAQ,CAAC,EAAW;IACnC,6BAA6B;IAC7B,2BAA2B;IAC3B,yBAAyB;IACzB,gCAAgC;IAChC,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,iBAAiB,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO,CAAC,EAAW;IAClC,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,gBAAgB,CAAC;AAChE,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,UAAkB,EAAE,YAAqB;IAC1F,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;SAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACX,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,UAAU,CAAC;IAClB,2CAA2C;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,UAAkB,EAAE,MAAc;IAC9E,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC5B,UAAU,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,+DAA+D,MAAM,SAAS,kBAAkB,CAAC,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;QAC3I,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,UAAU,MAAM,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;AACF,CAAC"} \ No newline at end of file diff --git a/build/main.js b/build/main.js index 2cd53944..d904d0cb 100644 --- a/build/main.js +++ b/build/main.js @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( }) : function(o, v) { o["default"] = v; }); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); Object.defineProperty(exports, "__esModule", { value: true }); // The adapter-core module gives you access to the core ioBroker functions you need to create an adapter const utils = __importStar(require("@iobroker/adapter-core")); @@ -37,22 +47,6 @@ class Tibberlink extends utils.Adapter { ...options, name: "tibberlink", }); - this.homeInfoList = []; - this.queryUrl = ""; - this.tibberCalculator = new tibberCalculator_1.TibberCalculator(this); - /** - * generates random delay time in milliseconds between min minutes and max minutes - * - * @param minMinutes - minimum minutes of delay as number - * @param maxMinutes - maximum minutes of delay as number - * @returns delay - milliseconds as integer - */ - this.getRandomDelay = (minMinutes, maxMinutes) => { - if (minMinutes >= maxMinutes) - throw new Error("minMinutes should be less than maxMinutes"); - const randomMinutes = Math.random() * (maxMinutes - minMinutes) + minMinutes; - return Math.floor(randomMinutes * 60 * 1000); - }; this.on("ready", this.onReady.bind(this)); this.on("stateChange", this.onStateChange.bind(this)); // this.on("objectChange", this.onObjectChange.bind(this)); @@ -62,6 +56,10 @@ class Tibberlink extends utils.Adapter { this.cronList = []; this.queryUrl = "https://api.tibber.com/v1-beta/gql"; } + cronList; + homeInfoList = []; + queryUrl = ""; + tibberCalculator = new tibberCalculator_1.TibberCalculator(this); /** * Is called when databases are connected and adapter received configuration. */ @@ -70,7 +68,7 @@ class Tibberlink extends utils.Adapter { if (!this.config.TibberAPIToken) { // No Token defined in configuration this.log.error(`Missing API Token - please check configuration`); - this.setState(`info.connection`, false, true); + void this.setState(`info.connection`, false, true); } else { // Need 2 configs - API and Feed (feed changed query url) @@ -79,7 +77,7 @@ class Tibberlink extends utils.Adapter { apiEndpoint: { apiKey: this.config.TibberAPIToken, queryUrl: this.queryUrl, - userAgent: `${this.config.TibberAPIToken.slice(5, 20).split("").reverse().join("")}${Date.now}`, + userAgent: `${this.config.TibberAPIToken.slice(5, 20).split("").reverse().join("")}${Date.now()}`, }, }; // Now read homes list from API @@ -92,12 +90,12 @@ class Tibberlink extends utils.Adapter { //set data in homeinfolist according to config data const result = []; for (const home of this.config.HomesList) { - const matchingHomeInfo = this.homeInfoList.find((info) => info.ID === home.homeID); + const matchingHomeInfo = this.homeInfoList.find(info => info.ID === home.homeID); if (!matchingHomeInfo) { this.log.error(`Configured feed for Home ID: ${home.homeID} not found in current data from Tibber server - delete the configuration line or verify any faults in your Tibber connection`); continue; } - if (result.some((info) => info.ID === matchingHomeInfo.ID)) { + if (result.some(info => info.ID === matchingHomeInfo.ID)) { this.log.warn(`Double configuration of Home ID: ${home.homeID} found - please remove obsolete line in config - data of first instance will be used`); continue; } @@ -105,9 +103,9 @@ class Tibberlink extends utils.Adapter { matchingHomeInfo.PriceDataPollActive = home.priceDataPollActive; result.push(matchingHomeInfo); } - for (const index in this.homeInfoList) { - this.log.debug(`Feed Config for Home: ${this.homeInfoList[index].NameInApp} (${this.homeInfoList[index].ID}) - realtime data available: ${this.homeInfoList[index].RealTime} - feed configured as active: ${this.homeInfoList[index].FeedActive}`); - this.log.debug(`Price Poll Config for Home: ${this.homeInfoList[index].NameInApp} (${this.homeInfoList[index].ID}) - poll configured as active: ${this.homeInfoList[index].PriceDataPollActive}`); + for (const homeInfo of this.homeInfoList) { + this.log.debug(`Feed Config for Home: ${homeInfo.NameInApp} (${homeInfo.ID}) - realtime data available: ${homeInfo.RealTime} - feed configured as active: ${homeInfo.FeedActive}`); + this.log.debug(`Price Poll Config for Home: ${homeInfo.NameInApp} (${homeInfo.ID}) - poll configured as active: ${homeInfo.PriceDataPollActive}`); } } } @@ -119,13 +117,13 @@ class Tibberlink extends utils.Adapter { this.log.error(tibberAPICaller.generateErrorMessage(error, `pull of homes from Tibber-Server`)); } // if feed is not used - set info.connection if data received - if (this.config.HomesList?.every((info) => !info.feedActive)) { + if (this.config.HomesList?.every(info => !info.feedActive)) { if (this.homeInfoList.length > 0) { - this.setState("info.connection", true, true); + void this.setState("info.connection", true, true); this.log.debug(`Connection Check: Feed not enabled and I received home list from api - good connection`); } else { - this.setState("info.connection", false, true); + void this.setState("info.connection", false, true); this.log.debug(`Connection Check: Feed not enabled and I do not get home list from api - bad connection`); } } @@ -134,9 +132,12 @@ class Tibberlink extends utils.Adapter { const sentryInstance = this.getPluginInstance("sentry"); const today = new Date(); const last = await this.getStateAsync("info.LastSentryLogDay"); + const lastDate = last?.val ? (0, date_fns_1.parseISO)(last.val) : null; const pulseLocal = this.config.UseLocalPulseData ? 1 : 0; - if (last?.val != (await today.getDate())) { - await this.tibberCalculator.updateCalculatorUsageStats(); + // Verify if 3 or more days in the past + if (!lastDate || (0, date_fns_1.differenceInDays)(today, lastDate) >= 3) { + // WiP 4.0.0 if (last?.val != today.getDate()) { + this.tibberCalculator.updateCalculatorUsageStats(); if (sentryInstance) { const Sentry = sentryInstance.getSentryObject(); Sentry && @@ -152,11 +153,10 @@ class Tibberlink extends utils.Adapter { scope.setTag("numBestSingleHours", this.tibberCalculator.numBestSingleHours); scope.setTag("numBestSingleHoursLTF", this.tibberCalculator.numBestSingleHoursLTF); scope.setTag("numSmartBatteryBuffer", this.tibberCalculator.numSmartBatteryBuffer); - //scope.setTag("usedAdminAdapter", version); - Sentry.captureMessage("Adapter TibberLink started", "info"); // Level "info" + Sentry.captureMessage("Adapter TibberLink started", "info"); }); } - this.setStateAsync("info.LastSentryLogDay", { val: today.getDate(), ack: true }); + void this.setState("info.LastSentryLogDay", { val: today.getDate(), ack: true }); } } // if no homeIDs available - adapter can't do that much and restarts @@ -188,7 +188,7 @@ class Tibberlink extends utils.Adapter { try { this.log.info(`Setting up local poll of consumption data for ${this.config.PulseList.length} pulse module(s)`); for (const pulse in this.config.PulseList) { - await tibberLocal.setupOnePulseLocal(parseInt(pulse)); + tibberLocal.setupOnePulseLocal(parseInt(pulse)); } } catch (error) { @@ -197,15 +197,14 @@ class Tibberlink extends utils.Adapter { } //Local Bridge Call // (force) get current prices and start calculator tasks once for the FIRST time - if (!(await tibberAPICaller.updateCurrentPriceAllHomes(this.homeInfoList, true))) { - } - this.jobPricesTodayLOOP(tibberAPICaller); - this.jobPricesTomorrowLOOP(tibberAPICaller); - tibberCalculator.startCalculatorTasks(false, true); + await tibberAPICaller.updateCurrentPriceAllHomes(this.homeInfoList, true); + void this.jobPricesTodayLOOP(tibberAPICaller); + void this.jobPricesTomorrowLOOP(tibberAPICaller); + void tibberCalculator.startCalculatorTasks(false, true); // Get consumption data for the first time - tibberAPICaller.updateConsumptionAllHomes(); + void tibberAPICaller.updateConsumptionAllHomes(); const jobCurrentPrice = cron_1.CronJob.from({ - cronTime: "20 57 * * * *", //"20 57 * * * *" = 3 minuten vor 00:00:20 jede Stunde + cronTime: "20 57 * * * *", //"20 58 * * * *" = 2 minutes before 00:00:20 jede Stunde => 00:01:20 - 00:03:20 onTick: async () => { let okPrice = false; do { @@ -213,35 +212,37 @@ class Tibberlink extends utils.Adapter { okPrice = await tibberAPICaller.updateCurrentPriceAllHomes(this.homeInfoList); this.log.debug(`Cron job CurrentPrice - okPrice: ${okPrice}`); } while (!okPrice); - tibberCalculator.startCalculatorTasks(); - tibberAPICaller.updateConsumptionAllHomes(); + void tibberCalculator.startCalculatorTasks(); + void tibberAPICaller.updateConsumptionAllHomes(); }, start: true, timeZone: "system", runOnInit: false, }); - if (jobCurrentPrice) + if (jobCurrentPrice) { this.cronList.push(jobCurrentPrice); + } const jobPricesToday = cron_1.CronJob.from({ - cronTime: "20 56 23 * * *", //"20 56 23 * * *" = 5 minuten vor 00:01:20 + cronTime: "20 56 23 * * *", //"20 56 23 * * *" = 5 minutes before 00:01:20 => 00:00:20 - 00:02:20 for first try onTick: async () => { let okPrice = false; do { await this.delay(this.getRandomDelay(4, 6)); + await tibberAPICaller.updatePricesTomorrowAllHomes(this.homeInfoList); okPrice = await tibberAPICaller.updatePricesTodayAllHomes(this.homeInfoList); this.log.debug(`Cron job PricesToday - okPrice: ${okPrice}`); } while (!okPrice); - await tibberAPICaller.updatePricesTomorrowAllHomes(this.homeInfoList); - tibberCalculator.startCalculatorTasks(); + void tibberCalculator.startCalculatorTasks(); }, start: true, timeZone: "system", runOnInit: true, }); - if (jobPricesToday) + if (jobPricesToday) { this.cronList.push(jobPricesToday); + } const jobPricesTomorrow = cron_1.CronJob.from({ - cronTime: "20 56 12 * * *", //"20 56 12 * * *" = 5 minuten vor 13:01:20 + cronTime: "20 56 12 * * *", //"20 56 12 * * *" = 5 minutes before 13:01:20 => 13:00:20 - 13:02:20 for first try onTick: async () => { let okPrice = false; do { @@ -249,16 +250,17 @@ class Tibberlink extends utils.Adapter { okPrice = await tibberAPICaller.updatePricesTomorrowAllHomes(this.homeInfoList); this.log.debug(`Cron job PricesTomorrow - okPrice: ${okPrice}`); } while (!okPrice); - tibberCalculator.startCalculatorTasks(); + void tibberCalculator.startCalculatorTasks(); }, start: true, timeZone: "system", runOnInit: true, }); - if (jobPricesTomorrow) + if (jobPricesTomorrow) { this.cronList.push(jobPricesTomorrow); + } //#region *** If user uses live feed - start feed connection *** - if (this.homeInfoList.some((info) => info.FeedActive)) { + if (this.homeInfoList.some(info => info.FeedActive)) { // array with configs of feeds, init with base data set const tibberFeedConfigs = Array.from({ length: this.homeInfoList.length }, () => { return { @@ -266,15 +268,16 @@ class Tibberlink extends utils.Adapter { apiEndpoint: { apiKey: this.config.TibberAPIToken, queryUrl: this.queryUrl, - userAgent: `${this.config.TibberAPIToken.slice(5, 20).split("").reverse().join("")}${Date.now}`, + userAgent: `${this.config.TibberAPIToken.slice(5, 20).split("").reverse().join("")}${Date.now()}`, }, timestamp: true, }; }); const tibberPulseInstances = new Array(this.homeInfoList.length); // array for TibberPulse-instances - if (!this.homeInfoList.some((homeInfo) => homeInfo.ID == `None available - restart adapter after entering token`)) { - this.delObjectAsync(`Homes.None available - restart adapter after entering token`, { recursive: true }); + if (!this.homeInfoList.some(homeInfo => homeInfo.ID == `None available - restart adapter after entering token`)) { + await this.delObjectAsync(`Homes.None available - restart adapter after entering token`, { recursive: true }); } + // eslint-disable-next-line @typescript-eslint/no-for-in-array for (const index in this.homeInfoList) { if (!this.homeInfoList[index].FeedActive || !this.homeInfoList[index].RealTime) { this.log.warn(`skipping feed of live data - no Pulse configured for this home according to Tibber server`); @@ -285,52 +288,75 @@ class Tibberlink extends utils.Adapter { // define the fields for datafeed tibberFeedConfigs[index].homeId = this.homeInfoList[index].ID; tibberFeedConfigs[index].power = true; - if (this.config.FeedConfigLastMeterConsumption) + if (this.config.FeedConfigLastMeterConsumption) { tibberFeedConfigs[index].lastMeterConsumption = true; - if (this.config.FeedConfigAccumulatedConsumption) + } + if (this.config.FeedConfigAccumulatedConsumption) { tibberFeedConfigs[index].accumulatedConsumption = true; - if (this.config.FeedConfigAccumulatedProduction) + } + if (this.config.FeedConfigAccumulatedProduction) { tibberFeedConfigs[index].accumulatedProduction = true; - if (this.config.FeedConfigAccumulatedConsumptionLastHour) + } + if (this.config.FeedConfigAccumulatedConsumptionLastHour) { tibberFeedConfigs[index].accumulatedConsumptionLastHour = true; - if (this.config.FeedConfigAccumulatedProductionLastHour) + } + if (this.config.FeedConfigAccumulatedProductionLastHour) { tibberFeedConfigs[index].accumulatedProductionLastHour = true; - if (this.config.FeedConfigAccumulatedCost) + } + if (this.config.FeedConfigAccumulatedCost) { tibberFeedConfigs[index].accumulatedCost = true; - if (this.config.FeedConfigAccumulatedCost) + } + if (this.config.FeedConfigAccumulatedCost) { tibberFeedConfigs[index].accumulatedReward = true; - if (this.config.FeedConfigCurrency) + } + if (this.config.FeedConfigCurrency) { tibberFeedConfigs[index].currency = true; - if (this.config.FeedConfigMinPower) + } + if (this.config.FeedConfigMinPower) { tibberFeedConfigs[index].minPower = true; - if (this.config.FeedConfigAveragePower) + } + if (this.config.FeedConfigAveragePower) { tibberFeedConfigs[index].averagePower = true; - if (this.config.FeedConfigMaxPower) + } + if (this.config.FeedConfigMaxPower) { tibberFeedConfigs[index].maxPower = true; - if (this.config.FeedConfigPowerProduction) + } + if (this.config.FeedConfigPowerProduction) { tibberFeedConfigs[index].powerProduction = true; - if (this.config.FeedConfigMinPowerProduction) + } + if (this.config.FeedConfigMinPowerProduction) { tibberFeedConfigs[index].minPowerProduction = true; - if (this.config.FeedConfigMaxPowerProduction) + } + if (this.config.FeedConfigMaxPowerProduction) { tibberFeedConfigs[index].maxPowerProduction = true; - if (this.config.FeedConfigLastMeterProduction) + } + if (this.config.FeedConfigLastMeterProduction) { tibberFeedConfigs[index].lastMeterProduction = true; - if (this.config.FeedConfigPowerFactor) + } + if (this.config.FeedConfigPowerFactor) { tibberFeedConfigs[index].powerFactor = true; - if (this.config.FeedConfigVoltagePhase1) + } + if (this.config.FeedConfigVoltagePhase1) { tibberFeedConfigs[index].voltagePhase1 = true; - if (this.config.FeedConfigVoltagePhase2) + } + if (this.config.FeedConfigVoltagePhase2) { tibberFeedConfigs[index].voltagePhase2 = true; - if (this.config.FeedConfigVoltagePhase3) + } + if (this.config.FeedConfigVoltagePhase3) { tibberFeedConfigs[index].voltagePhase3 = true; - if (this.config.FeedConfigCurrentL1) + } + if (this.config.FeedConfigCurrentL1) { tibberFeedConfigs[index].currentL1 = true; - if (this.config.FeedConfigCurrentL2) + } + if (this.config.FeedConfigCurrentL2) { tibberFeedConfigs[index].currentL2 = true; - if (this.config.FeedConfigCurrentL3) + } + if (this.config.FeedConfigCurrentL3) { tibberFeedConfigs[index].currentL3 = true; - if (this.config.FeedConfigSignalStrength) + } + if (this.config.FeedConfigSignalStrength) { tibberFeedConfigs[index].signalStrength = true; + } tibberPulseInstances[index] = new tibberPulse_1.TibberPulse(tibberFeedConfigs[index], this); // add new instance to array tibberPulseInstances[index].ConnectPulseStream(); } @@ -345,6 +371,8 @@ class Tibberlink extends utils.Adapter { } /** * subfunction to loop till prices today for all homes are got from server - adapter startup-phase + * + * @param tibberAPICaller - TibberAPICaller */ async jobPricesTodayLOOP(tibberAPICaller) { let okPrice = false; @@ -356,6 +384,8 @@ class Tibberlink extends utils.Adapter { } /** * subfunction to loop till prices tomorrow for all homes are got from server - adapter startup-phase + * + * @param tibberAPICaller - TibberAPICaller */ async jobPricesTomorrowLOOP(tibberAPICaller) { let okPrice = false; @@ -365,8 +395,24 @@ class Tibberlink extends utils.Adapter { await this.delay(this.getRandomDelay(4, 6)); } while (!okPrice); } + /** + * generates random delay time in milliseconds between min minutes and max minutes + * + * @param minMinutes - minimum minutes of delay as number + * @param maxMinutes - maximum minutes of delay as number + * @returns delay - milliseconds as integer + */ + getRandomDelay = (minMinutes, maxMinutes) => { + if (minMinutes >= maxMinutes) { + throw new Error("minMinutes should be less than maxMinutes"); + } + const randomMinutes = Math.random() * (maxMinutes - minMinutes) + minMinutes; + return Math.floor(randomMinutes * 60 * 1000); + }; /** * Is called from adapter config screen + * + * @param obj - any */ onMessage(obj) { if (obj) { @@ -375,7 +421,7 @@ class Tibberlink extends utils.Adapter { if (obj.callback) { try { if (this.homeInfoList.length > 0) { - this.sendTo(obj.from, obj.command, this.homeInfoList.map((item) => ({ + this.sendTo(obj.from, obj.command, this.homeInfoList.map(item => ({ label: `${item.NameInApp} (${item.ID})`, value: item.ID, })), obj.callback); @@ -385,7 +431,7 @@ class Tibberlink extends utils.Adapter { this.sendTo(obj.from, obj.command, [{ label: "None available", value: "None available" }], obj.callback); } } - catch (error) { + catch { this.sendTo(obj.from, obj.command, [{ label: "None available", value: "None available" }], obj.callback); } } @@ -394,7 +440,7 @@ class Tibberlink extends utils.Adapter { if (obj.callback) { try { if (this.homeInfoList.length > 0) { - this.sendTo(obj.from, obj.command, this.homeInfoList.map((item) => ({ + this.sendTo(obj.from, obj.command, this.homeInfoList.map(item => ({ //label: `${item.NameInApp} (${item.ID.substring(item.ID.lastIndexOf("-") + 1)})`, label: `${item.NameInApp} (...${item.ID.slice(-8)})`, value: item.ID, @@ -405,7 +451,7 @@ class Tibberlink extends utils.Adapter { this.sendTo(obj.from, obj.command, [{ label: "None available", value: "None available" }], obj.callback); } } - catch (error) { + catch { this.sendTo(obj.from, obj.command, [{ label: "None available", value: "None available" }], obj.callback); } } @@ -415,6 +461,8 @@ class Tibberlink extends utils.Adapter { } /** * Is called when adapter shuts down - callback has to be called under any circumstances! + * + * @param callback - void */ onUnload(callback) { try { @@ -423,11 +471,9 @@ class Tibberlink extends utils.Adapter { cronJob.stop(); } if (this.config.UseLocalPulseData) { - //tibberLocal - //WiP call shutdown in tibberLocale + //WiP call shutdown in tibberLocal } - // info.connect to false, when adapter is shut down - this.setState("info.connection", false, true); + void this.setState("info.connection", false, true); callback(); } catch (e) { @@ -437,6 +483,9 @@ class Tibberlink extends utils.Adapter { } /** * Is called if a subscribed state changes + * + * @param id - state ID + * @param state - ioBroker state object */ onStateChange(id, state) { try { @@ -444,6 +493,7 @@ class Tibberlink extends utils.Adapter { // The state was changed // this.adapter.subscribeStates(`Homes.${homeId}.Calculations.${channel}.*`); if (!state.ack) { + this.log.debug(`state change detected and parsing for id: ${id} - state: ${state.val}`); if (id.includes(`.Calculations.`)) { const statePath = id.split("."); const homeIDToMatch = statePath[3]; @@ -457,7 +507,7 @@ class Tibberlink extends utils.Adapter { if (typeof state.val === "boolean") { this.config.CalculatorList[calcChannel].chActive = state.val; this.log.debug(`calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to Active: ${this.config.CalculatorList[calcChannel].chActive}`); - this.setStateAsync(id, state.val, true); // set acknowledge true + void this.setState(id, state.val, true); // set acknowledge true } else { this.log.warn(`Wrong type for channel: ${calcChannel} - chActive: ${state.val}`); @@ -468,7 +518,7 @@ class Tibberlink extends utils.Adapter { if (typeof state.val === "number") { this.config.CalculatorList[calcChannel].chTriggerPrice = state.val; this.log.debug(`calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to TriggerPrice: ${this.config.CalculatorList[calcChannel].chTriggerPrice}`); - this.setStateAsync(id, state.val, true); + void this.setState(id, state.val, true); } else { this.log.warn(`Wrong type for channel: ${calcChannel} - chTriggerPrice: ${state.val}`); @@ -479,7 +529,7 @@ class Tibberlink extends utils.Adapter { if (typeof state.val === "number") { this.config.CalculatorList[calcChannel].chAmountHours = state.val; this.log.debug(`calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to AmountHours: ${this.config.CalculatorList[calcChannel].chAmountHours}`); - this.setStateAsync(id, state.val, true); + void this.setState(id, state.val, true); } else { this.log.warn(`Wrong type for channel: ${calcChannel} - chAmountHours: ${state.val}`); @@ -497,7 +547,7 @@ class Tibberlink extends utils.Adapter { dateWithTimeZone.setMinutes(0, 0, 0); this.config.CalculatorList[calcChannel].chStartTime = dateWithTimeZone; this.log.debug(`calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to StartTime: ${(0, date_fns_1.format)(dateWithTimeZone, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")}`); - this.setStateAsync(id, (0, date_fns_1.format)(dateWithTimeZone, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + void this.setState(id, (0, date_fns_1.format)(dateWithTimeZone, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); } else { this.log.warn(`Invalid ISO-8601 format or missing timezone offset for channel: ${calcChannel} - chStartTime: ${state.val}`); @@ -518,8 +568,17 @@ class Tibberlink extends utils.Adapter { // floor to hour dateWithTimeZone.setMinutes(0, 0, 0); this.config.CalculatorList[calcChannel].chStopTime = dateWithTimeZone; + // WIP 3.5.4 START Warn long LTF + // Get StartTime directly as a Date object + const startTime = this.config.CalculatorList[calcChannel].chStartTime; + // Check if StopTime is not the same day or the next day as StartTime + if (!(0, date_fns_1.isSameDay)(dateWithTimeZone, startTime) && !(0, date_fns_1.isSameDay)(dateWithTimeZone, (0, date_fns_1.addDays)(startTime, 1))) { + this.log.warn(`StopTime for channel ${calcChannel} is not the same or next day as StartTime! StartTime: ${startTime.toISOString()}, StopTime: ${dateWithTimeZone.toISOString()}`); + this.log.warn(`Setting StopTime outside the feasible range (same or next day as StartTime) can lead to errors in calculations or unexpected behavior. Please verify your configuration.`); + } + // WIP 3.5.4 STOP this.log.debug(`calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to StopTime: ${(0, date_fns_1.format)(dateWithTimeZone, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")}`); - this.setStateAsync(id, (0, date_fns_1.format)(dateWithTimeZone, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + void this.setState(id, (0, date_fns_1.format)(dateWithTimeZone, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); } else { this.log.warn(`Invalid ISO-8601 format or missing timezone offset for channel: ${calcChannel} - chStopTime: ${state.val}`); @@ -534,7 +593,7 @@ class Tibberlink extends utils.Adapter { if (typeof state.val === "number") { this.config.CalculatorList[calcChannel].chRepeatDays = state.val; this.log.debug(`calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to RepeatDays: ${this.config.CalculatorList[calcChannel].chRepeatDays}`); - this.setStateAsync(id, state.val, true); + void this.setState(id, state.val, true); } else { this.log.warn(`Wrong type for channel: ${calcChannel} - chRepeatDays: ${state.val}`); @@ -545,7 +604,7 @@ class Tibberlink extends utils.Adapter { if (typeof state.val === "number") { this.config.CalculatorList[calcChannel].chEfficiencyLoss = state.val; this.log.debug(`calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to EfficiencyLoss: ${this.config.CalculatorList[calcChannel].chEfficiencyLoss}`); - this.setStateAsync(id, state.val, true); + void this.setState(id, state.val, true); } else { this.log.warn(`Wrong type for channel: ${calcChannel} - chEfficiencyLoss: ${state.val}`); @@ -554,7 +613,7 @@ class Tibberlink extends utils.Adapter { default: this.log.debug(`unknown value for setting type: ${settingType}`); } - this.tibberCalculator.startCalculatorTasks(true); + void this.tibberCalculator.startCalculatorTasks(true); } else { this.log.debug(`wrong index values in state ID or missing value for settingType`); diff --git a/build/main.js.map b/build/main.js.map index 436cc974..5808015c 100644 --- a/build/main.js.map +++ b/build/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..c90698da --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,20 @@ +// ioBroker eslint template configuration file for js and ts files +// Please note that esm or react based modules need additional modules loaded. +import config from "@iobroker/eslint-config"; + +export default [ + ...config, + + { + // specify files to exclude from linting here + ignores: ["*.test.js", "test/**/*.js", "*.config.mjs", "build", "admin/build", "admin/words.js", "admin/admin.d.ts", "**/adapter-config.d.ts"], + }, + + { + // you may disable some 'jsdoc' warnings - but using jsdoc is highly recommended + // as this improves maintainability. jsdoc warnings will not block build process. + rules: { + // 'jsdoc/require-jsdoc': 'off', + }, + }, +]; diff --git a/info/Anleitung Iskra MT681 eHZ.pdf b/info/Anleitung Iskra MT681 eHZ.pdf new file mode 100644 index 00000000..344c6b2e Binary files /dev/null and b/info/Anleitung Iskra MT681 eHZ.pdf differ diff --git a/info/EasyMeter Q3A.pdf b/info/EasyMeter Q3A.pdf new file mode 100644 index 00000000..9c9a1b65 Binary files /dev/null and b/info/EasyMeter Q3A.pdf differ diff --git a/io-package.json b/io-package.json index cae7f4bd..460efc45 100644 --- a/io-package.json +++ b/io-package.json @@ -1,168 +1,101 @@ { "common": { "name": "tibberlink", - "version": "3.4.8", + "version": "4.0.0", "news": { - "3.4.8": { - "en": "updated axios because of vulnerability\nadded tests for Node.js 22", - "de": "axios aufgrund einer Schwachstelle aktualisiert\nTests für Node.js 22 hinzugefügt", - "ru": "обновлен axios из-за уязвимости\nдобавлены тесты для Node.js 22", - "pt": "atualizado axios devido a uma vulnerabilidade\nadicionados testes para Node.js 22", - "nl": "axios bijgewerkt vanwege kwetsbaarheid\ntests toegevoegd voor Node.js 22", - "fr": "axios mis à jour en raison d'une vulnérabilité\najouté des tests pour Node.js 22", - "it": "axios aggiornato a causa di una vulnerabilità\naggiunti test per Node.js 22", - "es": "axios actualizado debido a una vulnerabilidad\nse añadieron pruebas para Node.js 22", - "pl": "zaktualizowano axios z powodu luki\ndodano testy dla Node.js 22", - "uk": "оновлено axios через уразливість\nдодано тести для Node.js 22", - "zh-cn": "由于漏洞更新了 axios\n添加了 Node.js 22 的测试" + "4.0.0": { + "en": "BREAKING: Dropped support for ioBroker.admin versions below 7.0.0 due to the ioBroker Responsive Design Initiative (#544).\nRedesigned the admin tab for the calculator.\noptimize translations, added more tooltips", + "de": "BREAKING: Die Unterstützung für ioBroker.admin-Versionen unter 7.0.0 wurde aufgrund der ioBroker Responsive Design Initiative eingestellt (#544).\nDie Registerkarte „Admin“ für den Rechner wurde neu gestaltet.\nÜbersetzungen optimieren, weitere Tooltips hinzugefügt", + "ru": "СРОЧНАЯ ИНФОРМАЦИЯ: Прекращена поддержка версий ioBroker.admin ниже 7.0.0 из-за инициативы адаптивного дизайна ioBroker (#544).\nПереработана вкладка администратора калькулятора.\nоптимизировать переводы, добавлены дополнительные подсказки", + "pt": "QUEBRANDO: Suporte abandonado para versões ioBroker.admin abaixo de 7.0.0 devido à ioBroker Responsive Design Initiative (#544).\nA guia de administração da calculadora foi redesenhada.\notimizar traduções, adicionou mais dicas de ferramentas", + "nl": "BREAKING: Ondersteuning voor ioBroker.admin-versies lager dan 7.0.0 is stopgezet vanwege het ioBroker Responsive Design Initiative (#544).\nHet beheerderstabblad voor de rekenmachine is opnieuw ontworpen.\noptimaliseer vertalingen, heb meer tooltips toegevoegd", + "fr": "RUPTURE : suppression de la prise en charge des versions ioBroker.admin inférieures à 7.0.0 en raison de l'initiative de conception réactive ioBroker (#544).\nRefonte de l'onglet d'administration de la calculatrice.\noptimiser les traductions, ajout de plus d'info-bulles", + "it": "BREAKING: Supporto interrotto per le versioni di ioBroker.admin precedenti alla 7.0.0 a causa della ioBroker Responsive Design Initiative (#544).\nRiprogettata la scheda di amministrazione per la calcolatrice.\nottimizzare le traduzioni, aggiungere più tooltip", + "es": "ÚLTIMA HORA: Se eliminó el soporte para las versiones de ioBroker.admin inferiores a 7.0.0 debido a la Iniciativa de Diseño Responsivo de ioBroker (#544).\nRediseñado la pestaña de administración de la calculadora.\noptimizar las traducciones, agregar más información sobre herramientas", + "pl": "ŁAMANIE: Usunięto obsługę wersji ioBroker.admin poniżej 7.0.0 z powodu inicjatywy ioBroker Responsive Design Initiative (nr 544).\nPrzeprojektowano zakładkę administracyjną kalkulatora.\nzoptymalizować tłumaczenia, dodano więcej podpowiedzi", + "uk": "ПОРУШЕННЯ: припинено підтримку версій ioBroker.admin нижче 7.0.0 через ініціативу ioBroker Responsive Design Initiative (#544).\nПерероблено вкладку адміністратора для калькулятора.\nоптимізувати переклади, додано більше підказок", + "zh-cn": "重大事件:由于 ioBroker 响应式设计计划 (#544),不再支持 7.0.0 以下的 ioBroker.admin 版本。\n重新设计了计算器的管理选项卡。\n优化翻译,添加更多工具提示" }, - "3.4.7": { - "en": "adapter checker detected optimizations (#493)\nimproved error message (#490)", - "de": "Adapter-Checker erkannte Optimierungen (#493)\nverbesserte Fehlermeldung (#490)", - "ru": "оптимизации, обнаруженные проверяющим адаптера (#493)\nулучшенное сообщение об ошибке (#490)", - "pt": "otimizações detectadas pelo verificador de adaptadores (#493)\nmensagem de erro aprimorada (#490)", - "nl": "door adapter checker gedetecteerde optimalisaties (#493)\nverbeterde foutmelding (#490)", - "fr": "optimisations détectées par le vérificateur d'adaptateurs (#493)\nmessage d'erreur amélioré (#490)", - "it": "ottimizzazioni rilevate dal controllo dell'adattatore (#493)\nmessaggio di errore migliorato (#490)", - "es": "optimizaciones detectadas por el verificador de adaptadores (#493)\nmensaje de error mejorado (#490)", - "pl": "optymalizacje wykryte przez sprawdzanie adaptera (#493)\nulepszona wiadomość o błędzie (#490)", - "uk": "оптимізації, виявлені перевіряючим адаптера (#493)\nпокращене повідомлення про помилку (#490)", - "zh-cn": "适配器检查器检测到的优化 (#493)\n改进的错误消息 (#490)" + "3.5.4": { + "en": "Fix error in calculator channel 'best single hours' (#594)\nIntroduce 'iobroker/eslint-config' (#591)\nPerformance optimizations\nDependency updates", + "de": "Fehler im Berechnungs-Kanal 'beste einzelne Stunden' (#594) beheben\n'iobroker/eslint-config' einführen (#591)\nLeistungsoptimierungen\nAbhängigkeitsaktualisierungen", + "ru": "Исправление ошибки в канале калькулятора 'лучшие отдельные часы' (#594)\nВнедрение 'iobroker/eslint-config' (#591)\nОптимизация производительности\nОбновление зависимостей", + "pt": "Corrigir erro no canal do calculador 'melhores horas individuais' (#594)\nIntroduzir 'iobroker/eslint-config' (#591)\nOtimizações de desempenho\nAtualizações de dependências", + "nl": "Fout in de calculatorkanaal 'beste enkele uren' (#594) verhelpen\n'iobroker/eslint-config' introduceren (#591)\nPrestatieoptimalisaties\nAfhankelijkheidsupdates", + "fr": "Corriger l'erreur dans le canal du calculateur 'meilleures heures individuelles' (#594)\nIntroduire 'iobroker/eslint-config' (#591)\nOptimisations des performances\nMises à jour des dépendances", + "it": "Correggere l'errore nel canale del calcolatore 'migliori singole ore' (#594)\nIntrodurre 'iobroker/eslint-config' (#591)\nOttimizzazioni delle prestazioni\nAggiornamenti delle dipendenze", + "es": "Corregir error en el canal del calculador 'mejores horas individuales' (#594)\nIntroducir 'iobroker/eslint-config' (#591)\nOptimizaciones de rendimiento\nActualizaciones de dependencias", + "pl": "Napraw błąd w kanale kalkulatora 'najlepsze pojedyncze godziny' (#594)\nWprowadź 'iobroker/eslint-config' (#591)\nOptymalizacje wydajności\nAktualizacje zależności", + "uk": "Виправити помилку в каналі калькулятора 'кращі окремі години' (#594)\nВпровадити 'iobroker/eslint-config' (#591)\nОптимізація продуктивності\nОновлення залежностей", + "zh-cn": "修复计算器频道 '最佳单个小时' 中的错误 (#594)\n引入 'iobroker/eslint-config' (#591)\n性能优化\n更新依赖" }, - "3.4.6": { - "en": "Catch wrong OBIS Codes, probably caused by Pulse communication errors", - "de": "Fange falsche OBIS-Codes ab, wahrscheinlich verursacht durch Pulse-Kommunikationsfehler", - "ru": "Перехват неправильных кодов OBIS, вероятно, вызванных ошибками связи Pulse", - "pt": "Capturar códigos OBIS incorretos, provavelmente causados por erros de comunicação Pulse", - "nl": "Ongeldige OBIS-codes opvangen, waarschijnlijk veroorzaakt door Pulse-communicatiefouten", - "fr": "Intercepter les codes OBIS incorrects, probablement causés par des erreurs de communication Pulse", - "it": "Cattura codici OBIS errati, probabilmente causati da errori di comunicazione Pulse", - "es": "Capturar códigos OBIS incorrectos, probablemente causados por errores de comunicación de Pulse", - "pl": "Przechwyć nieprawidłowe kody OBIS, prawdopodobnie spowodowane błędami komunikacji Pulse", - "uk": "Перехоплення неправильних OBIS-кодів, ймовірно, спричинених помилками зв'язку Pulse", - "zh-cn": "捕获错误的 OBIS 代码,可能是由于 Pulse 通信错误引起的" + "3.5.3": { + "en": "Fix edge case in output state setup and usage\nOptimized state subscription\nUpdate deprecated state calls\nAdd await to delObjectAsync\nHarmonize project tools\nDependency updates", + "de": "Randfall bei der Einrichtung und Nutzung von Ausgabeständen behoben\nZustandsabonnement optimiert\nVeraltete Zustandsaufrufe aktualisiert\nAwait zu delObjectAsync hinzugefügt\nProjektwerkzeuge harmonisiert\nAbhängigkeiten aktualisiert", + "ru": "Исправлен крайний случай настройки и использования выходного состояния\nОптимизирована подписка на состояние\nОбновлены устаревшие вызовы состояния\nДобавлено ожидание в delObjectAsync\nУнификация инструментов проекта\nОбновление зависимостей", + "pt": "Corrigir caso extremo na configuração e uso do estado de saída\nAssinatura de estado otimizada\nAtualizar chamadas de estado obsoletas\nAdicionar await ao delObjectAsync\nHarmonizar ferramentas do projeto\nAtualizar dependências", + "nl": "Randgeval in output statusinstelling en gebruik opgelost\nStatusabonnement geoptimaliseerd\nVerouderde statusaanroepen bijgewerkt\nAwait toegevoegd aan delObjectAsync\nProjecttools geharmoniseerd\nAfhankelijkheden bijgewerkt", + "fr": "Correction d'un cas limite dans la configuration et l'utilisation de l'état de sortie\nOptimisation de la souscription d'état\nMise à jour des appels d'état obsolètes\nAjout d'attente à delObjectAsync\nHarmonisation des outils de projet\nMise à jour des dépendances", + "it": "Corretto caso limite nella configurazione e utilizzo dello stato di output\nOttimizzata la sottoscrizione dello stato\nAggiornate le chiamate di stato deprecate\nAggiunto await a delObjectAsync\nArmonizzati gli strumenti del progetto\nAggiornate le dipendenze", + "es": "Corregir caso límite en la configuración y uso del estado de salida\nOptimizar suscripción de estado\nActualizar llamadas de estado obsoletas\nAgregar await a delObjectAsync\nArmonizar herramientas del proyecto\nActualizar dependencias", + "pl": "Naprawiono przypadek brzegowy w konfiguracji i użyciu stanu wyjścia\nZoptymalizowano subskrypcję stanu\nZaktualizowano przestarzałe wywołania stanów\nDodano await do delObjectAsync\nUjednolicono narzędzia projektu\nZaktualizowano zależności", + "uk": "Виправлено крайній випадок у налаштуванні та використанні стану виходу\nОптимізовано підписку на стан\nОновлено застарілі виклики стану\nДодано await до delObjectAsync\nУніфіковано інструменти проєкту\nОновлено залежності", + "zh-cn": "修复输出状态设置和使用中的边缘情况\n优化状态订阅\n更新已弃用的状态调用\n在 delObjectAsync 中添加 await\n统一项目工具\n更新依赖项" }, - "3.4.5": { - "en": "decode meter mode 4 for local Tibber Pulse poll (#477)\ndecode meter mode 1 for local Tibber Pulse poll (#478)\nfixed wrong Pulse local status names (voltage)\nadd docu on local Pulse poll config screen (#479)", - "de": "Dekodiere Zählermodus 4 für lokale Tibber Pulse-Abfrage (#477)\nDekodiere Zählermodus 1 für lokale Tibber Pulse-Abfrage (#478)\nfalsche lokale Pulse-Statusnamen (Spannung) korrigiert\nDokumentation zum Konfigurationsbildschirm für lokale Pulse-Abfragen hinzugefügt (#479)", - "ru": "декодировать режим счетчика 4 для локального опроса Tibber Pulse (#477)\nдекодировать режим счетчика 1 для локального опроса Tibber Pulse (#478)\nисправлены неверные локальные названия статусов Pulse (напряжение)\nдобавить документацию на экран конфигурации локального опроса Pulse (#479)", - "pt": "decodificar modo de medidor 4 para pesquisa local do Tibber Pulse (#477)\ndecodificar modo de medidor 1 para pesquisa local do Tibber Pulse (#478)\nnomes de status locais do Pulse incorretos corrigidos (voltagem)\nadicionar documentação na tela de configuração de pesquisa local do Pulse (#479)", - "nl": "decodeer meterstand 4 voor lokale Tibber Pulse-peiling (#477)\ndecodeer meterstand 1 voor lokale Tibber Pulse-peiling (#478)\nfoutieve lokale Pulstatusnamen (spanning) gecorrigeerd\ndocumentatie toevoegen op het configuratiescherm voor lokale Pulse-peiling (#479)", - "fr": "décoder le mode compteur 4 pour le sondage local Tibber Pulse (#477)\ndécoder le mode compteur 1 pour le sondage local Tibber Pulse (#478)\nnoms de statuts locaux de Pulse incorrects corrigés (tension)\najouter de la documentation sur l'écran de configuration des sondages locaux de Pulse (#479)", - "it": "decodificare la modalità del contatore 4 per il sondaggio locale di Tibber Pulse (#477)\ndecodificare la modalità del contatore 1 per il sondaggio locale di Tibber Pulse (#478)\ncorretti nomi di stato locali di Pulse errati (tensione)\naggiungere la documentazione sulla schermata di configurazione del sondaggio Pulse locale (#479)", - "es": "decodificar el modo del medidor 4 para la encuesta local de Tibber Pulse (#477)\ndecodificar el modo del medidor 1 para la encuesta local de Tibber Pulse (#478)\nnombres de estados locales de Pulse corregidos (voltaje)\nagregar documentación en la pantalla de configuración de la encuesta de Pulse local (#479)", - "pl": "dekodować tryb licznika 4 dla lokalnej ankiety Tibber Pulse (#477)\ndekodować tryb licznika 1 dla lokalnej ankiety Tibber Pulse (#478)\nnazwy lokalnych statusów Pulse (napięcie) naprawiono\ndodaj dokumentację na ekranie konfiguracji lokalnej ankiety Pulse (#479)", - "uk": "декодувати режим лічильника 4 для локального опитування Tibber Pulse (#477)\nдекодувати режим лічильника 1 для локального опитування Tibber Pulse (#478)\nвиправлено неправильні локальні назви статусів Pulse (напруга)\nдодати документацію на екрані налаштувань локального опитування Pulse (#479)", - "zh-cn": "解码本地 Tibber Pulse 轮询的仪表模式 4 (#477)\n解码本地 Tibber Pulse 轮询的仪表模式 1 (#478)\n修正错误的 Pulse 本地状态名称(电压)\n在本地 Pulse 轮询配置屏幕上添加文档 (#479)" + "3.5.2": { + "en": "Add verification for YES/NO 2 values in calculator (#547)\nOptimized responsive design (#544)\nMigrate eslint to >9.x\nSwitch to ES2022 code\nAdapted to new API constraints (#546)", + "de": "Hinzufügen einer Verifizierung für YES/NO 2-Werte im Rechner (#547)\nOptimiertes responsives Design (#544)\nMigration von eslint zu >9.x\nUmstellung auf ES2022-Code\nAngepasst an neue API-Einschränkungen (#546)", + "ru": "Добавлена проверка значений ДА/НЕТ 2 в калькуляторе (#547)\nОптимизирован адаптивный дизайн (#544)\nПереход на eslint >9.x\nПереход на код ES2022\nАдаптировано к новым ограничениям API (#546)", + "pt": "Adicionar verificação para valores SIM/NÃO 2 na calculadora (#547)\nDesign responsivo otimizado (#544)\nMigrar eslint para >9.x\nMudar para código ES2022\nAdaptado para novas restrições de API (#546)", + "nl": "Verificatie toegevoegd voor JA/NEE 2-waarden in calculator (#547)\nGeoptimaliseerd responsief ontwerp (#544)\nMigratie eslint naar >9.x\nOverschakeling naar ES2022-code\nAangepast aan nieuwe API-beperkingen (#546)", + "fr": "Ajout de la vérification des valeurs OUI/NON 2 dans la calculatrice (#547)\nOptimisation du design adaptatif (#544)\nMigration d'eslint vers >9.x\nPassage au code ES2022\nAdaptation aux nouvelles contraintes de l'API (#546)", + "it": "Aggiunta verifica per i valori SÌ/NO 2 nel calcolatore (#547)\nDesign reattivo ottimizzato (#544)\nMigrazione di eslint a >9.x\nPassaggio al codice ES2022\nAdattato ai nuovi vincoli API (#546)", + "es": "Añadida verificación para valores SÍ/NO 2 en calculadora (#547)\nOptimizado diseño responsivo (#544)\nMigrar eslint a >9.x\nCambiar a código ES2022\nAdaptado a nuevas restricciones de API (#546)", + "pl": "Dodano weryfikację wartości TAK/NIE 2 w kalkulatorze (#547)\nZoptymalizowany responsywny design (#544)\nMigracja eslint do >9.x\nPrzejście na kod ES2022\nDostosowano do nowych ograniczeń API (#546)", + "uk": "Додано перевірку значень ТАК/НІ 2 в калькуляторі (#547)\nОптимізовано адаптивний дизайн (#544)\nМіграція eslint до >9.x\nПерехід на код ES2022\nАдаптовано до нових обмежень API (#546)", + "zh-cn": "为计算器中的 YES/NO 2 值添加验证 (#547)\n优化响应式设计 (#544)\n迁移 eslint 到 >9.x\n切换到 ES2022 代码\n适应新的 API 约束 (#546)" }, - "3.4.4": { - "en": "local poll of data - change units Wh to kWh and round to 0.1kWh (#469)", - "de": "Lokale Abfrage von Daten - Einheiten von Wh in kWh ändern und auf 0,1 kWh runden (#469)", - "ru": "локальный опрос данных - изменить единицы измерения с Втч на кВтч и округлить до 0,1 кВтч (#469)", - "pt": "consulta local de dados - alterar unidades de Wh para kWh e arredondar para 0,1kWh (#469)", - "nl": "lokale gegevenspoll - verander eenheden van Wh naar kWh en rond af naar 0,1 kWh (#469)", - "fr": "sondage local de données - changer les unités de Wh en kWh et arrondir à 0,1kWh (#469)", - "it": "sondaggio locale dei dati - cambiare le unità da Wh a kWh e arrotondare a 0,1 kWh (#469)", - "es": "sondeo local de datos: cambiar unidades de Wh a kWh y redondear a 0,1kWh (#469)", - "pl": "lokalne sondowanie danych - zmiana jednostek z Wh na kWh i zaokrąglenie do 0,1 kWh (#469)", - "uk": "локальне опитування даних - змінити одиниці з Втч на кВтч та округлити до 0,1 кВтч (#469)", - "zh-cn": "本地数据轮询 - 将单位从 Wh 更改为 kWh 并四舍五入到 0.1kWh (#469)" + "3.5.1": { + "en": "changed to less feed disconnection warnings in log (#445)\nfix error in output2 of smart battery buffer (#538)\nupdate deprecated state calls\ndependency updates", + "de": "geändert auf weniger Feed-Trennungswarnungen im Log (#445)\nFehler in Ausgang2 des Smart-Batterie-Puffers behoben (#538)\nveraltete Statusaufrufe aktualisiert\nAbhängigkeitsupdates", + "ru": "изменено на меньшее количество предупреждений об отключении канала в журнале (#445)\nисправлена ошибка в выходе2 умного буферного аккумулятора (#538)\nобновление устаревших вызовов состояния\nобновления зависимостей", + "pt": "alterado para menos avisos de desconexão de feed no log (#445)\ncorreção de erro na saída2 do buffer de bateria inteligente (#538)\natualização de chamadas de estado obsoletas\natualizações de dependências", + "nl": "gewijzigd naar minder feed-verbindingswaarschuwingen in logboek (#445)\nfout in output2 van slimme batterijbuffer opgelost (#538)\nverouderde statusaanroepen bijgewerkt\nbijwerken van afhankelijkheden", + "fr": "modifié pour moins d'avertissements de déconnexion de flux dans le journal (#445)\ncorrection de l'erreur dans la sortie2 du tampon de batterie intelligent (#538)\nmise à jour des appels d'état obsolètes\nmises à jour des dépendances", + "it": "modificato per meno avvisi di disconnessione del feed nel registro (#445)\ncorretto errore in output2 del buffer batteria intelligente (#538)\naggiornamento delle chiamate di stato deprecate\naggiornamenti delle dipendenze", + "es": "cambiado a menos advertencias de desconexión de alimentación en el registro (#445)\ncorregir error en la salida2 del búfer de batería inteligente (#538)\nactualizar llamadas de estado obsoletas\nactualizaciones de dependencias", + "pl": "zmieniono na mniej ostrzeżeń o odłączeniu kanału w dzienniku (#445)\nnaprawiono błąd w wyjściu2 bufora inteligentnej baterii (#538)\naktualizacja przestarzałych wywołań stanu\naktualizacje zależności", + "uk": "змінено на менше попереджень про відключення каналу в журналі (#445)\nвиправлено помилку в виході2 розумного буфера акумулятора (#538)\nоновлення застарілих викликів стану\nоновлення залежностей", + "zh-cn": "日志中减少了馈电断开警告 (#445)\n修复了智能电池缓冲区的输出2错误 (#538)\n更新了不推荐的状态调用\n依赖项更新" }, - "3.4.3": { - "en": "added unit to Pulse temperature and round to 0.1°C\nadded unit to Pulse battery voltage and round to 100mV\nadded unit to Pulse uptime\nadded state with Pulse uptime as human readable string", - "de": "Einheit zur Pulse-Temperatur hinzugefügt und auf 0,1°C gerundet\nEinheit zur Pulse-Batteriespannung hinzugefügt und auf 100mV gerundet\nEinheit zur Pulse-Betriebszeit hinzugefügt\nZustand mit Pulse-Betriebszeit als lesbaren String hinzugefügt", - "ru": "добавлена единица измерения температуры Pulse и округление до 0,1°C\nдобавлена единица измерения напряжения батареи Pulse и округление до 100мВ\nдобавлена единица измерения времени работы Pulse\nдобавлено состояние с временем работы Pulse в виде читаемой строки", - "pt": "adicionada unidade à temperatura do Pulse e arredondada para 0,1°C\nadicionada unidade à voltagem da bateria do Pulse e arredondada para 100mV\nadicionada unidade ao tempo de atividade do Pulse\nadicionado estado com tempo de atividade do Pulse como string legível", - "nl": "eenheid toegevoegd aan Pulse-temperatuur en afgerond naar 0,1°C\neenheid toegevoegd aan Pulse-accuspanning en afgerond naar 100mV\neenheid toegevoegd aan Pulse-uptime\ntoestand toegevoegd met Pulse-uptime als leesbare string", - "fr": "ajout de l'unité à la température du Pulse et arrondi à 0,1°C\najout de l'unité à la tension de la batterie du Pulse et arrondi à 100mV\najout de l'unité au temps de fonctionnement du Pulse\najout de l'état avec le temps de fonctionnement du Pulse sous forme de chaîne lisible", - "it": "aggiunta unità alla temperatura Pulse e arrotondata a 0,1°C\naggiunta unità alla tensione della batteria Pulse e arrotondata a 100mV\naggiunta unità al tempo di attività Pulse\naggiunto stato con tempo di attività Pulse come stringa leggibile", - "es": "se agregó unidad a la temperatura del Pulse y se redondeó a 0,1°C\nse agregó unidad al voltaje de la batería del Pulse y se redondeó a 100mV\nse agregó unidad al tiempo de actividad del Pulse\nse agregó estado con el tiempo de actividad del Pulse como cadena legible", - "pl": "dodano jednostkę do temperatury Pulse i zaokrąglono do 0,1°C\ndodano jednostkę do napięcia baterii Pulse i zaokrąglono do 100mV\ndodano jednostkę do czasu pracy Pulse\ndodano stan z czasem pracy Pulse jako czytelny ciąg znaków", - "uk": "додано одиницю виміру температури Pulse і округлено до 0,1°C\nдодано одиницю виміру напруги акумулятора Pulse і округлено до 100мВ\nдодано одиницю виміру часу роботи Pulse\nдодано стан з часом роботи Pulse у вигляді читабельного рядка", - "zh-cn": "添加单位到 Pulse 温度并四舍五入到 0.1°C\n添加单位到 Pulse 电池电压并四舍五入到 100mV\n添加单位到 Pulse 运行时间\n添加具有 Pulse 运行时间的状态为人类可读字符串" + "3.5.0": { + "en": "update adapter core\nfix error in SML decoder\nadd 2 new SML scale factor codes (#535)\ndependency updates", + "de": "Adapter-Core aktualisieren\nFehler im SML-Decoder beheben\n2 neue SML-Skalierungsfaktoren hinzufügen (#535)\nAbhängigkeitsupdates", + "ru": "обновить ядро адаптера\nисправить ошибку в декодере SML\nдобавить 2 новых кода масштабирования SML (#535)\nобновления зависимостей", + "pt": "atualizar o núcleo do adaptador\ncorrigir erro no decodificador SML\nadicionar 2 novos códigos de fator de escala SML (#535)\natualizações de dependências", + "nl": "adapterkern bijwerken\nfout in SML-decoder oplossen\n2 nieuwe SML-schaalfactorcodes toevoegen (#535)\nbijwerken van afhankelijkheden", + "fr": "mettre à jour le noyau de l'adaptateur\ncorriger l'erreur dans le décodeur SML\najouter 2 nouveaux codes de facteur d'échelle SML (#535)\nmises à jour des dépendances", + "it": "aggiornare il core dell'adattatore\ncorreggere l'errore nel decodificatore SML\naggiungere 2 nuovi codici del fattore di scala SML (#535)\naggiornamenti delle dipendenze", + "es": "actualizar el núcleo del adaptador\ncorregir el error en el decodificador SML\nagregar 2 nuevos códigos de factor de escala SML (#535)\nactualizaciones de dependencias", + "pl": "aktualizacja rdzenia adaptera\nnapraw błąd w dekoderze SML\ndodaj 2 nowe kody współczynnika skali SML (#535)\naktualizacje zależności", + "uk": "оновлення ядра адаптера\nвиправлення помилки в декодері SML\nдодати 2 нових коди масштабування SML (#535)\nоновлення залежностей", + "zh-cn": "更新适配器核心\n修复SML解码器中的错误\n添加2个新的SML比例因子代码 (#535)\n依赖项更新" }, - "3.4.0": { - "en": "add mode for local poll of Pulse data (#201)", - "de": "Modus für lokale Abfrage von Pulse Daten hinzufügen (#201)", - "ru": "добавить режим для локального опроса данных Pulse (#201)", - "pt": "adicionar modo para sondagem local de dados Pulse (#201)", - "nl": "modus toevoegen voor lokale polling van Pulse data (#201)", - "fr": "ajouter un mode pour le sondage local des données Pulse (#201)", - "it": "aggiungere una modalità per il sondaggio locale dei dati Pulse (#201)", - "es": "añadir modo para sondeo local de datos Pulse (#201)", - "pl": "dodaj tryb lokalnego sondowania danych Pulse (#201)", - "uk": "додати режим для локального опитування даних Pulse (#201)", - "zh-cn": "添加本地轮询 Pulse 数据模式 (#201)" + "3.4.10": { + "en": "add verification of poll interval (#518)\nbump date-fns to 4.0.0", + "de": "Überprüfung des Polling-Intervalls hinzufügen (#518)\ndate-fns auf 4.0.0 aktualisieren", + "ru": "добавить проверку интервала опроса (#518)\nобновить date-fns до 4.0.0", + "pt": "adicionar verificação do intervalo de polling (#518)\natualizar date-fns para 4.0.0", + "nl": "verificatie van het polling-interval toevoegen (#518)\ndate-fns bijwerken naar 4.0.0", + "fr": "ajouter la vérification de l'intervalle de sondage (#518)\nmettre à jour date-fns vers 4.0.0", + "it": "aggiungere la verifica dell'intervallo di polling (#518)\naggiornare date-fns a 4.0.0", + "es": "añadir verificación del intervalo de sondeo (#518)\nactualizar date-fns a 4.0.0", + "pl": "dodano weryfikację interwału sondowania (#518)\naktualizacja date-fns do wersji 4.0.0", + "uk": "додано перевірку інтервалу опитування (#518)\nоновлення date-fns до 4.0.0", + "zh-cn": "添加轮询间隔验证 (#518)\n将 date-fns 升级到 4.0.0" } }, "messages": [ - { - "condition": { - "operand": "and", - "rules": ["oldVersion<0.3.0", "newVersion>=0.3.0"] - }, - "title": { - "en": "Important notice!", - "de": "Wichtiger Hinweis!", - "ru": "Важное замечание!", - "pt": "Notícia importante!", - "nl": "Belangrijke mededeling!", - "fr": "Avis important!", - "it": "Avviso IMPORTANTE!", - "es": "Noticia importante!", - "pl": "Ważna uwaga!", - "uk": "Погода!", - "zh-cn": "重要通知!" - }, - "text": { - "en": "Configuration of Pulse live data feed has changed!! You have to reenable it in the configuration! Now you can enable or disable for each Home.", - "de": "Die Konfiguration des Pulse Live-Datenfeeds hat sich geändert! Sie müssen es in der Konfiguration wieder aktivieren! Jetzt können Sie für jedes Zuhause aktivieren oder deaktivieren.", - "ru": "Конфигурация базы данных Pulse изменилась! Вы должны восстановить его в конфигурации! Теперь вы можете включить или отключить для каждого дома.", - "pt": "A configuração do feed de dados ao vivo do Pulse mudou! Você tem que reenable-lo na configuração! Agora você pode ativar ou desativar para cada casa.", - "nl": "Vermomming van Pulse live gegevens is veranderd! Je moet het vergoeden in het vertrouwen. Nu kun je in staat zijn voor elk huis.", - "fr": "Configuration du flux de données en direct Pulse a changé! Vous devez le réactiver dans la configuration ! Maintenant, vous pouvez activer ou désactiver pour chaque Maison.", - "it": "La configurazione dell'alimentazione dei dati live Pulse è cambiata! Devi riattivarlo nella configurazione! Ora è possibile attivare o disattivare per ogni casa.", - "es": "¡La configuración de los datos de Pulse en vivo ha cambiado! ¡Tienes que volver a habilitarlo en la configuración! Ahora usted puede habilitar o desactivar para cada hogar.", - "pl": "Zmiana danych na żywo została zmieniona. Zrezygnujesz go w konfiguracji! Teraz możesz umieścić lub uwolnić każdy dom.", - "uk": "Настроювання імпульсних живих даних змінено! Ви повинні змінити його в конфігурації! Тепер ви можете ввімкнути або вимкнути для кожного будинку.", - "zh-cn": "皮尔西人生活数据集成已改变! 你们必须把它重新纳入组合! 现在,你可以为每一个家庭提供或可分割的东西。." - }, - "level": "warn", - "buttons": ["agree", "cancel"] - }, - { - "condition": { - "operand": "and", - "rules": ["oldVersion<1.8.0", "newVersion>=1.8.0"] - }, - "title": { - "en": "Important notice!", - "de": "Wichtiger Hinweis!", - "ru": "Важное замечание!", - "pt": "Notícia importante!", - "nl": "Belangrijke mededeling!", - "fr": "Avis important!", - "it": "Avviso IMPORTANTE!", - "es": "Noticia importante!", - "pl": "Ważna uwaga!", - "uk": "Погода!", - "zh-cn": "重要通知!" - }, - "text": { - "en": "Configuration of adapter has changed!! Please verify your settings for Tibber price data poll. And save the settings!!", - "de": "Die Konfiguration des Adapters wurde geändert!! Überprüfen Sie bitte Ihre Einstellungen für die Tibber-Preisdatenabfrage. Und speichern Sie die Einstellungen!!", - "ru": "Конфигурация адаптера была изменена!! Пожалуйста, проверьте ваши настройки для опроса ценовых данных Tibber. И сохраните настройки!!", - "pt": "A configuração do adaptador foi alterada!! Por favor, verifique suas configurações para a pesquisa de dados de preços do Tibber. E salve as configurações!!", - "nl": "De configuratie van de adapter is gewijzigd!! Controleer alstublieft uw instellingen voor de Tibber-prijsgegevens poll. En sla de instellingen op!!", - "fr": "La configuration de l'adaptateur a été modifiée!! Veuillez vérifier vos paramètres pour l'interrogation des données de prix Tibber. Et sauvegardez les paramètres!!", - "it": "La configurazione dell'adattatore è stata modificata!! Verifica le tue impostazioni per l'interrogazione dei dati sui prezzi di Tibber. E salva le impostazioni!!", - "es": "¡¡La configuración del adaptador ha cambiado!! Por favor, verifique sus ajustes para la consulta de datos de precios de Tibber. ¡Y guarde la configuración!!", - "pl": "Konfiguracja adaptera została zmieniona!! Proszę sprawdzić ustawienia dla sondowania danych cenowych Tibber. I zapisać ustawienia!!", - "uk": "Конфігурація адаптера була змінена!! Будь ласка, перевірте ваші налаштування для опитування цінових даних Tibber. І збережіть налаштування!!" - }, - "level": "warn", - "buttons": ["agree", "cancel"] - }, { "condition": { "operand": "and", @@ -226,7 +159,6 @@ }, "authors": ["Hombach "], "keywords": ["power", "energy", "Tibber"], - "tier": 2, "licenseInformation": { "license": "GPL-3.0-only", "type": "free" @@ -234,9 +166,10 @@ "platform": "Javascript/Node.js", "icon": "tibberlink.png", "enabled": true, - "extIcon": "https://raw.githubusercontent.com/Hombach/ioBroker.tibberlink/main/admin/tibberlink.png", - "readme": "https://github.com/Hombach/ioBroker.tibberlink/blob/main/README.md", + "extIcon": "https://raw.githubusercontent.com/Hombach/ioBroker.tibberlink/master/admin/tibberlink.png", + "readme": "https://github.com/Hombach/ioBroker.tibberlink/blob/master/README.md", "loglevel": "info", + "tier": 2, "mode": "daemon", "messagebox": true, "allowInit": true, @@ -254,7 +187,7 @@ ], "globalDependencies": [ { - "admin": ">=5.1.28" + "admin": ">=7.0.0" } ], "plugins": { @@ -299,7 +232,8 @@ "puName": "Pulse Local", "tibberBridgeUrl": "tibber-host", "tibberBridgePassword": "xxxx-xxxx", - "tibberPulseLocalNodeId": 1 + "tibberPulseLocalNodeId": 1, + "tibberBridgeRawDataInterval": 2000 } ] }, @@ -314,29 +248,29 @@ "native": {} }, { - "_id": "info.LastSentryLogDay", + "_id": "info.connection", "type": "state", "common": { - "role": "value", - "name": "Last day of month for Sentry log", - "type": "number", - "unit": "", + "role": "indicator.connected", + "name": "Device or service connected", + "type": "boolean", "read": true, "write": false, - "def": 0 + "def": false }, "native": {} }, { - "_id": "info.connection", + "_id": "info.LastSentryLogDay", "type": "state", "common": { - "role": "indicator.connected", - "name": "Device or service connected", - "type": "boolean", + "role": "value", + "name": "Last day of month for Sentry log", + "type": "number", + "unit": "", "read": true, "write": false, - "def": false + "def": 0 }, "native": {} } diff --git a/package-lock.json b/package-lock.json index cc49e60e..2d6ab598 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3083 +1,8115 @@ { - "name": "iobroker.tibberlink", - "version": "3.4.7", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "iobroker.tibberlink", - "version": "3.4.7", - "license": "GPL-3.0-only", - "dependencies": { - "@iobroker/adapter-core": "^3.1.6", - "cron": "^3.1.7", - "date-fns": "^3.6.0", - "tibber-api": "^5.1.11" - }, - "devDependencies": { - "@iobroker/testing": "^4.1.3", - "@iobroker/types": "^6.0.10", - "@types/chai": "^4.3.11", - "@types/chai-as-promised": "^7.1.8", - "@types/mocha": "^10.0.7", - "@types/node": "^22.3.0", - "@types/proxyquire": "^1.3.31", - "@types/sinon": "^17.0.3", - "@types/sinon-chai": "^3.2.12", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", - "axios": "^1.7.3", - "chai": "^4.5.0", - "chai-as-promised": "^7.1.2", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", - "mocha": "^10.7.3", - "prettier": "^3.3.3", - "proxyquire": "^2.1.3", - "sinon": "^18.0.0", - "sinon-chai": "^3.7.0", - "source-map-support": "^0.5.21", - "ts-node": "^10.9.2", - "typescript": "~5.5.4" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@iobroker/adapter-core": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@iobroker/adapter-core/-/adapter-core-3.1.6.tgz", - "integrity": "sha512-cArv8IzVsP3r8HivsYwO02e5WueboIH9v66PkHSGtadeUQQKUyxV32dzirM6YArWcI6+Iw5USQgVR9E+ryP3xg==", - "engines": { - "npm": ">=7.0.0" - }, - "peerDependencies": { - "@iobroker/types": "^6.0.0" - } - }, - "node_modules/@iobroker/testing": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@iobroker/testing/-/testing-4.1.3.tgz", - "integrity": "sha512-PTfvlXQBXDJVX35bkJxzgjuMX6bEjUmB4Dy8+bWLqbOgyq1JQVrRn+ah5IB7hEf+4lP8wD0MpAjXFJTv3zfTvA==", - "dev": true, - "dependencies": { - "alcalzone-shared": "~4.0.3", - "chai": "^4.3.7", - "chai-as-promised": "^7.1.1", - "debug": "^4.3.4", - "fs-extra": "^10.1.0", - "mocha": "^10.2.0", - "sinon": "^15.0.1", - "sinon-chai": "^3.7.0" - } - }, - "node_modules/@iobroker/testing/node_modules/sinon": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", - "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", - "deprecated": "16.1.1", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.3.0", - "@sinonjs/samsam": "^8.0.0", - "diff": "^5.1.0", - "nise": "^5.1.4", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/@iobroker/types": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/@iobroker/types/-/types-6.0.10.tgz", - "integrity": "sha512-3OT4a4QbLuWujobiea+zWA5JIksVdf0diZYzxcEv8W5BuvV5DUR3HlCUzXhLfF6X8Jgc+uFt3wRQ1s+m9v4/aw==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/chai": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", - "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", - "dev": true - }, - "node_modules/@types/chai-as-promised": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", - "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/luxon": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", - "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==" - }, - "node_modules/@types/mocha": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", - "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "22.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.3.0.tgz", - "integrity": "sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g==", - "dev": true, - "dependencies": { - "undici-types": "~6.18.2" - } - }, - "node_modules/@types/proxyquire": { - "version": "1.3.31", - "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.31.tgz", - "integrity": "sha512-uALowNG2TSM1HNPMMOR0AJwv4aPYPhqB0xlEhkeRTMuto5hjoSPZkvgu1nbPUkz3gEPAHv4sy4DmKsurZiEfRQ==", - "dev": true - }, - "node_modules/@types/sinon": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", - "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", - "dev": true, - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinon-chai": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.12.tgz", - "integrity": "sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==", - "dev": true, - "dependencies": { - "@types/chai": "*", - "@types/sinon": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", - "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/alcalzone-shared": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/alcalzone-shared/-/alcalzone-shared-4.0.8.tgz", - "integrity": "sha512-Rr0efCjNL9lw7miDvU8exL87Y42ehsLU2jUGNQUphhnlvxnTMrHeApWgoOSGZvsE2PhxC3KO7Z+VpQ/IbuV3aA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", - "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", - "dev": true, - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 6" - } - }, - "node_modules/chai/node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cron": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/cron/-/cron-3.1.7.tgz", - "integrity": "sha512-tlBg7ARsAMQLzgwqVxy8AZl/qlTc5nibqYwtNGoCrd+cV+ugI+tvZC1oT/8dFH8W455YrywGykx/KMmAqOr7Jw==", - "dependencies": { - "@types/luxon": "~3.4.0", - "luxon": "~3.4.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", - "integrity": "sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA==", - "dev": true, - "dependencies": { - "is-object": "~1.0.1", - "merge-descriptors": "~1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/luxon": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", - "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", - "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/module-not-found-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", - "integrity": "sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==", - "dev": true - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/nise": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", - "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/proxyquire": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", - "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", - "dev": true, - "dependencies": { - "fill-keys": "^1.0.2", - "module-not-found-error": "^1.0.1", - "resolve": "^1.11.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sinon": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", - "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.1", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/samsam": "^8.0.0", - "diff": "^5.2.0", - "nise": "^6.0.0", - "supports-color": "^7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "peerDependencies": { - "chai": "^4.0.0", - "sinon": ">=4.0.0" - } - }, - "node_modules/sinon/node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/sinon/node_modules/just-extend": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", - "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", - "dev": true - }, - "node_modules/sinon/node_modules/nise": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", - "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/text-encoding": "^0.7.2", - "just-extend": "^6.2.0", - "path-to-regexp": "^6.2.1" - } - }, - "node_modules/sinon/node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tibber-api": { - "version": "5.1.11", - "resolved": "https://registry.npmjs.org/tibber-api/-/tibber-api-5.1.11.tgz", - "integrity": "sha512-/rkfHnYVEMc7IHrtzeXmPmzL3CvC3FPFBvYwxD5io4orrwG62oFAbLyzVt99+e4KIynbDaE/QGQml221kt+m1g==", - "dependencies": { - "ws": "^8.17.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.18.2.tgz", - "integrity": "sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } + "name": "iobroker.tibberlink", + "version": "4.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "iobroker.tibberlink", + "version": "4.0.0", + "license": "GPL-3.0-only", + "dependencies": { + "@iobroker/adapter-core": "^3.2.3", + "axios": "^1.7.9", + "cron": "^3.2.1", + "date-fns": "^4.1.0", + "tibber-api": "^5.1.11" + }, + "devDependencies": { + "@iobroker/adapter-dev": "^1.3.0", + "@iobroker/eslint-config": "^1.0.0", + "@iobroker/testing": "^5.0.0", + "@iobroker/types": "^7.0.4", + "@types/chai": "^4.3.11", + "@types/chai-as-promised": "^7.1.8", + "@types/mocha": "^10.0.10", + "@types/node": "^22.10.1", + "@types/proxyquire": "^1.3.31", + "@types/sinon": "^17.0.3", + "@types/sinon-chai": "^3.2.12", + "chai": "^4.5.0", + "chai-as-promised": "^7.1.2", + "mocha": "^11.0.1", + "proxyquire": "^2.1.3", + "sinon": "^19.0.2", + "sinon-chai": "^3.7.0", + "source-map-support": "^0.5.21", + "ts-node": "^10.9.2", + "typescript": "~5.7.2" + }, + "engines": { + "node": ">= 18.18" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", + "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", + "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@esm2cjs/execa": { + "version": "6.1.1-cjs.1", + "resolved": "https://registry.npmjs.org/@esm2cjs/execa/-/execa-6.1.1-cjs.1.tgz", + "integrity": "sha512-FHxfnmuDIjY1VS/BLzDkL8EkbcFvi8s6x1nYQ1Nyu0An0n88EJcGhDBcRWLFwt3C3nT7xwI+MwHRH1TZcAFW2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@esm2cjs/human-signals": "^3.0.1", + "@esm2cjs/is-stream": "^3.0.0", + "@esm2cjs/npm-run-path": "^5.1.1-cjs.0", + "@esm2cjs/onetime": "^6.0.1-cjs.0", + "@esm2cjs/strip-final-newline": "^3.0.1-cjs.0", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "merge-stream": "^2.0.0", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/AlCalzone" + } + }, + "node_modules/@esm2cjs/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@esm2cjs/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-QZme4eF/PwTpeSbMB4AaWGQ4VSygzE30jI+Oas1NPTtZQAgcHwWVDOQpIW8FUmtzn5Q+2cS7AjnTzbtqtc5P6g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.20.0" + }, + "funding": { + "url": "https://github.com/sponsors/AlCalzone" + } + }, + "node_modules/@esm2cjs/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@esm2cjs/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-qcBscHlJpZFOD5nnmMHkzOrq2xyvsp9fbVreQLS8x2LOs8N3CrNi3fqvFY0GVJR+YSOHscwhG9T5t4Ck7R7QGw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/AlCalzone" + } + }, + "node_modules/@esm2cjs/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@esm2cjs/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-LIIAjcpjLr4rcbYmRQ+eRu55Upy/MMB78seIlwqbnyiA+cTa1/pxWnJ1NHJQrw6tx2wMQmlYoJj+wf16NjWH6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/AlCalzone" + } + }, + "node_modules/@esm2cjs/npm-run-path": { + "version": "5.1.1-cjs.0", + "resolved": "https://registry.npmjs.org/@esm2cjs/npm-run-path/-/npm-run-path-5.1.1-cjs.0.tgz", + "integrity": "sha512-CWeAIyE8iNSCgP2ItPE8iPgS+lACqgH+MuFRaWOIl2T7hnHqPFfhAJJ/LcLJJ/RMIxNMeenjFMwc91HW7NWr1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@esm2cjs/path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/AlCalzone" + } + }, + "node_modules/@esm2cjs/onetime": { + "version": "6.0.1-cjs.0", + "resolved": "https://registry.npmjs.org/@esm2cjs/onetime/-/onetime-6.0.1-cjs.0.tgz", + "integrity": "sha512-MkZMZSxrSC/6yUuAw6Azc56XOgwHQQIsNDlO/zgFmOcycJBhRwRuc/gdYUUOFNZIh7y+f0JSIxkNdJPFvJ5W0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@esm2cjs/mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/AlCalzone" + } + }, + "node_modules/@esm2cjs/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@esm2cjs/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-fKzZ3uIIP4j+7WfyG0MEkomGHL0hUXWCx1kY2Zct3GTdl4pyY+3k5lCUxjgdDa2Ld1BCjMNorXnRHiBP6jW6CQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/AlCalzone" + } + }, + "node_modules/@esm2cjs/strip-final-newline": { + "version": "3.0.1-cjs.0", + "resolved": "https://registry.npmjs.org/@esm2cjs/strip-final-newline/-/strip-final-newline-3.0.1-cjs.0.tgz", + "integrity": "sha512-o41riCGPiOEStayoikBCAqwa6igbv9L9rP+k5UCfQ24EJD/wGrdDs/KTNwkHG5JzDK3T60D5dMkWkLKEPy8gjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/AlCalzone" + } + }, + "node_modules/@google-cloud/common": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz", + "integrity": "sha512-fUoMo5b8iAKbrYpneIRV3z95AlxVJPrjpevxs4SKoclngWZvTXBSGpNisF5+x5m+oNGve7jfB1e6vNBZBUs7Fw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@google-cloud/projectify": "^3.0.0", + "@google-cloud/promisify": "^3.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^8.0.2", + "retry-request": "^5.0.0", + "teeny-request": "^8.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz", + "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz", + "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/@google-cloud/translate": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@google-cloud/translate/-/translate-7.2.2.tgz", + "integrity": "sha512-IAJhPKotLH/OF/NzWml/byLDN+OILbs1P4k+7HNUJK618NsShFelRKzh3pRUUQA4DX0je3HaEZw9nR+5uJ6ZEg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@google-cloud/common": "^4.0.0", + "@google-cloud/promisify": "^3.0.0", + "arrify": "^2.0.0", + "extend": "^3.0.2", + "google-gax": "^3.5.8", + "is-html": "^2.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.8.22", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.22.tgz", + "integrity": "sha512-oAjDdN7fzbUi+4hZjKG96MR6KTEubAeMpQEb+77qy+3r0Ua5xTFuie6JOLr4ZZgl5g+W5/uRTS2M1V8mVAFPuA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "dev": true, + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iobroker/adapter-core": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@iobroker/adapter-core/-/adapter-core-3.2.3.tgz", + "integrity": "sha512-ktk2KGexzOAbUZpkv/9JATJvO2DUHIfQAWhtpRjLxcR3+hs5/73hvt46XPSqwSpY/wnw5+E7kM7BqkfN7G19IQ==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@iobroker/types": ">=6.0.11" + } + }, + "node_modules/@iobroker/adapter-dev": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@iobroker/adapter-dev/-/adapter-dev-1.3.0.tgz", + "integrity": "sha512-mvh2whYkujRQ8WVxF64DrMfXitbhPvXhpgIooqzWS2OyND+iZqFBQYfy5n8Jk0cddgEXWegmg/G2m65OigSVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@esm2cjs/execa": "^6.1.1-cjs.1", + "@google-cloud/translate": "^7.2.2", + "ansi-colors": "^4.1.3", + "axios": "^1.6.7", + "esbuild": "^0.20.0", + "fs-extra": "^11.2.0", + "tiny-glob": "^0.2.9", + "yargs": "^17.7.2" + }, + "bin": { + "build-adapter": "bin/build-adapter.js", + "translate-adapter": "bin/translate-adapter.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@iobroker/adapter-dev/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@iobroker/adapter-dev/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@iobroker/adapter-dev/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@iobroker/eslint-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@iobroker/eslint-config/-/eslint-config-1.0.0.tgz", + "integrity": "sha512-84gqXXsmAFKjpb2iXOvhMRAR0qgLb5xaWATnuwD7GW029J7ofqweFpgdDb7JxJ6Jdtwk4J0kwz1jmp4FsqDETA==", + "dev": true, + "peerDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.10.0", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "@typescript-eslint/parser": "^8.4.0", + "eslint": ">=9.10.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jsdoc": "^50.2.2", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.36.0", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-unicorn": "^55.0.0", + "globals": "^15.9.0", + "prettier": "^3.3.3", + "typescript-eslint": "^8.5.0" + } + }, + "node_modules/@iobroker/testing": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@iobroker/testing/-/testing-5.0.0.tgz", + "integrity": "sha512-JrtWaGrgTU5MGRZowwyrDHVz8nzh/1QUqiOo1g9SXrRwT3PH0f6wRQKfe/RKiULFD2O4N3isc7pqyZg/uv4wdA==", + "dev": true, + "dependencies": { + "alcalzone-shared": "~4.0.8", + "chai": "^4.5.0", + "chai-as-promised": "^7.1.2", + "debug": "^4.3.7", + "fs-extra": "^11.2.0", + "mocha": "^10.7.3", + "sinon": "^19.0.2", + "sinon-chai": "^3.7.0" + } + }, + "node_modules/@iobroker/testing/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@iobroker/testing/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@iobroker/testing/node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@iobroker/types": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@iobroker/types/-/types-7.0.4.tgz", + "integrity": "sha512-wCRFt525dxTjbMQwxbXK5GVdivJ6tywolsROOu19w1M+coOfnqkv5+eBsXDUL1zqLrDyzoUxfYtwF0Gs5R0AyA==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz", + "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/commons/node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz", + "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "lodash.get": "^4.4.2", + "type-detect": "^4.1.0" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/chai": { + "version": "4.3.20", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", + "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", + "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^5.1.2", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/luxon": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", + "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/proxyquire": { + "version": "1.3.31", + "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.31.tgz", + "integrity": "sha512-uALowNG2TSM1HNPMMOR0AJwv4aPYPhqB0xlEhkeRTMuto5hjoSPZkvgu1nbPUkz3gEPAHv4sy4DmKsurZiEfRQ==", + "dev": true + }, + "node_modules/@types/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sinon": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", + "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", + "dev": true, + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinon-chai": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.12.tgz", + "integrity": "sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "*", + "@types/sinon": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz", + "integrity": "sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.17.0", + "@typescript-eslint/type-utils": "8.17.0", + "@typescript-eslint/utils": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.17.0.tgz", + "integrity": "sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.17.0", + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/typescript-estree": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz", + "integrity": "sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz", + "integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.17.0", + "@typescript-eslint/utils": "8.17.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz", + "integrity": "sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz", + "integrity": "sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz", + "integrity": "sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.17.0", + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/typescript-estree": "8.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz", + "integrity": "sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.17.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/alcalzone-shared": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/alcalzone-shared/-/alcalzone-shared-4.0.8.tgz", + "integrity": "sha512-Rr0efCjNL9lw7miDvU8exL87Y42ehsLU2jUGNQUphhnlvxnTMrHeApWgoOSGZvsE2PhxC3KO7Z+VpQ/IbuV3aA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001685", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001685.tgz", + "integrity": "sha512-e/kJN1EMyHQzgcMEEgoo+YTCO1NGCmIYHk5Qk8jT6AazWemS5QFKJ5ShCJlH3GZrNIdZofcNCEwZqbMjjKzmnA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0", + "peer": true + }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", + "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/core-js-compat": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "browserslist": "^4.24.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cron": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/cron/-/cron-3.2.1.tgz", + "integrity": "sha512-w2n5l49GMmmkBFEsH9FIDhjZ1n1QgTMOCMGuQtOXs5veNiosZmso6bQGuqOJSYAXXrG84WQFVneNk+Yt0Ua9iw==", + "dependencies": { + "@types/luxon": "~3.4.0", + "luxon": "~3.5.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.68", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz", + "integrity": "sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/ent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ent/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", + "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", + "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.16.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.5", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "50.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.0.tgz", + "integrity": "sha512-tCNp4fR79Le3dYTPB0dKEv7yFyvGkUCa+Z3yuTrrNGGOxBlXo9Pn0PEgroOZikUQOGjxoGMVKNjrOHcYEdfszg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@es-joy/jsdoccomment": "~0.49.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.6", + "escape-string-regexp": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.1.0", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.1.0-rc-fb9a90fa48-20240614", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz", + "integrity": "sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "55.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-55.0.0.tgz", + "integrity": "sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.5", + "@eslint-community/eslint-utils": "^4.4.0", + "ci-info": "^4.0.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.37.0", + "esquery": "^1.5.0", + "globals": "^15.7.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.2.1", + "jsesc": "^3.0.2", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.10.0", + "semver": "^7.6.1", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=18.18" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=8.56.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", + "integrity": "sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA==", + "dev": true, + "dependencies": { + "is-object": "~1.0.1", + "merge-descriptors": "~1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "15.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", + "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/google-auth-library": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", + "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.3.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-gax": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-3.6.1.tgz", + "integrity": "sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "~1.8.0", + "@grpc/proto-loader": "^0.7.0", + "@types/long": "^4.0.0", + "@types/rimraf": "^3.0.2", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "fast-text-encoding": "^1.0.3", + "google-auth-library": "^8.0.2", + "is-stream-ended": "^0.1.4", + "node-fetch": "^2.6.1", + "object-hash": "^3.0.0", + "proto3-json-serializer": "^1.0.0", + "protobufjs": "7.2.4", + "protobufjs-cli": "1.1.1", + "retry-request": "^5.0.0" + }, + "bin": { + "compileProtos": "build/tools/compileProtos.js", + "minifyProtoJson": "build/tools/minify.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "deprecated": "Package is no longer maintained", + "dev": true, + "license": "MIT", + "dependencies": { + "node-forge": "^1.3.1" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/gopd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.1.0.tgz", + "integrity": "sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", + "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", + "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-html": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-html/-/is-html-2.0.0.tgz", + "integrity": "sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "html-tags": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", + "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", + "integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "gopd": "^1.1.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", + "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", + "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "has-symbols": "^1.0.3", + "safe-regex-test": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz", + "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^14.1.1", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "dev": true, + "license": "Unlicense", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.0.1.tgz", + "integrity": "sha512-+3GkODfsDG71KSCQhc4IekSW+ItCK/kiez1Z28ksWvYhKXV/syxMlerR/sC7whDp7IyreZ4YxceMLdTs5hQE8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/module-not-found-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", + "integrity": "sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/nise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", + "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.1", + "@sinonjs/text-encoding": "^0.7.3", + "just-extend": "^6.2.0", + "path-to-regexp": "^8.1.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-imports": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", + "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", + "dev": true, + "license": "Apache-2.0 AND MIT", + "peer": true, + "dependencies": { + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", + "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proto3-json-serializer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz", + "integrity": "sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "protobufjs": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "dev": true, + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs-cli": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz", + "integrity": "sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "chalk": "^4.0.0", + "escodegen": "^1.13.0", + "espree": "^9.0.0", + "estraverse": "^5.1.0", + "glob": "^8.0.0", + "jsdoc": "^4.0.0", + "minimist": "^1.2.0", + "semver": "^7.1.2", + "tmp": "^0.2.1", + "uglify-js": "^3.7.7" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "protobufjs": "^7.0.0" + } + }, + "node_modules/protobufjs-cli/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/proxyquire": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", + "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", + "dev": true, + "dependencies": { + "fill-keys": "^1.0.2", + "module-not-found-error": "^1.0.1", + "resolve": "^1.11.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", + "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "which-builtin-type": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regjsparser": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", + "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/retry-request": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz", + "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sinon": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.2.tgz", + "integrity": "sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.2", + "@sinonjs/samsam": "^8.0.1", + "diff": "^7.0.0", + "nise": "^6.1.1", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "dev": true, + "license": "(BSD-2-Clause OR WTFPL)", + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0", + "peer": true + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true, + "license": "CC0-1.0", + "peer": true + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "dev": true, + "license": "MIT", + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/teeny-request": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz", + "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tibber-api": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/tibber-api/-/tibber-api-5.3.1.tgz", + "integrity": "sha512-+8SvQZIYmaDyCvwjqWeSO81K0I0a3LtfgHKePwWI6ldWjqOIIr0XJo2K4p3S7VHN2JTqrtOiHCxjt2SbUdtzrw==", + "dependencies": { + "ws": "^8.18.0" + } + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "peer": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.17.0.tgz", + "integrity": "sha512-409VXvFd/f1br1DCbuKNFqQpXICoTB+V51afcwG1pn1a3Cp92MqAUges3YjwEdQ0cMUoCIodjVDAYzyD8h3SYA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.17.0", + "@typescript-eslint/parser": "8.17.0", + "@typescript-eslint/utils": "8.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", + "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.0", + "is-number-object": "^1.1.0", + "is-string": "^1.1.0", + "is-symbol": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", + "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } } diff --git a/package.json b/package.json index dbc32968..edbfbfce 100644 --- a/package.json +++ b/package.json @@ -1,85 +1,81 @@ { - "name": "iobroker.tibberlink", - "version": "3.4.8", - "description": "links tibber API data to be used in ioBroker", - "author": { - "name": "Hombach", - "email": "tibberlink@homba.ch" - }, - "homepage": "https://github.com/Hombach/ioBroker.tibberlink", - "license": "GPL-3.0-only", - "keywords": [ - "ioBroker", - "power", - "energy", - "energy supplier", - "grid", - "Tibber", - "ESS" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/hombach/ioBroker.tibberlink.git" - }, - "engines": { - "node": ">= 18" - }, - "dependencies": { - "@iobroker/adapter-core": "^3.1.6", - "tibber-api": "^5.1.11", - "cron": "^3.1.7", - "axios": "^1.7.4", - "date-fns": "^3.6.0" - }, - "devDependencies": { - "@iobroker/testing": "^4.1.3", - "@iobroker/types": "^6.0.10", - "@types/chai": "^4.3.11", - "@types/chai-as-promised": "^7.1.8", - "@types/mocha": "^10.0.7", - "@types/node": "^22.3.0", - "@types/proxyquire": "^1.3.31", - "@types/sinon": "^17.0.3", - "@types/sinon-chai": "^3.2.12", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", - "chai": "^4.5.0", - "chai-as-promised": "^7.1.2", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", - "mocha": "^10.7.3", - "prettier": "^3.3.3", - "proxyquire": "^2.1.3", - "sinon": "^18.0.0", - "sinon-chai": "^3.7.0", - "source-map-support": "^0.5.21", - "ts-node": "^10.9.2", - "typescript": "~5.5.4" - }, - "main": "build/main.js", - "files": [ - "admin{,/!(src)/**}/!(tsconfig|tsconfig.*).json", - "admin{,/!(src)/**}/*.{html,css,png,svg,jpg,js}", - "build/", - "www/", - "io-package.json", - "LICENSE" - ], - "scripts": { - "build:ts": "tsc -p tsconfig.build.json", - "build": "npm run build:ts", - "watch:ts": "tsc -p tsconfig.build.json --watch", - "watch": "npm run watch:ts", - "test:ts": "mocha --config test/mocharc.custom.json src/**/*.test.ts", - "test:package": "mocha test/package --exit", - "test:integration": "mocha test/integration --exit", - "test": "npm run test:ts && npm run test:package", - "check": "tsc --noEmit", - "lint": "eslint --ext .ts src/" - }, - "bugs": { - "url": "https://github.com/Hombach/ioBroker.tibberlink/issues" - }, - "readmeFilename": "README.md" + "name": "iobroker.tibberlink", + "version": "4.0.0", + "description": "links tibber API data to be used in ioBroker", + "author": { + "name": "Hombach", + "email": "tibberlink@homba.ch" + }, + "homepage": "https://github.com/Hombach/ioBroker.tibberlink", + "license": "GPL-3.0-only", + "keywords": [ + "ioBroker", + "power", + "energy", + "energy supplier", + "grid", + "Tibber", + "ESS" + ], + "repository": { + "type": "git", + "url": "https://github.com/hombach/ioBroker.tibberlink.git" + }, + "engines": { + "node": ">= 18.18" + }, + "dependencies": { + "@iobroker/adapter-core": "^3.2.3", + "axios": "^1.7.9", + "cron": "^3.2.1", + "date-fns": "^4.1.0", + "tibber-api": "^5.1.11" + }, + "devDependencies": { + "@iobroker/adapter-dev": "^1.3.0", + "@iobroker/eslint-config": "^1.0.0", + "@iobroker/testing": "^5.0.0", + "@iobroker/types": "^7.0.4", + "@types/chai": "^4.3.11", + "@types/chai-as-promised": "^7.1.8", + "@types/mocha": "^10.0.10", + "@types/node": "^22.10.1", + "@types/proxyquire": "^1.3.31", + "@types/sinon": "^17.0.3", + "@types/sinon-chai": "^3.2.12", + "chai": "^4.5.0", + "chai-as-promised": "^7.1.2", + "mocha": "^11.0.1", + "proxyquire": "^2.1.3", + "sinon": "^19.0.2", + "sinon-chai": "^3.7.0", + "source-map-support": "^0.5.21", + "ts-node": "^10.9.2", + "typescript": "~5.7.2" + }, + "main": "build/main.js", + "files": [ + "admin/", + "build/", + "www/", + "io-package.json", + "LICENSE" + ], + "scripts": { + "build:ts": "tsc -p tsconfig.build.json", + "build": "npm run build:ts", + "watch:ts": "tsc -p tsconfig.build.json --watch", + "watch": "npm run watch:ts", + "test:ts": "mocha --config test/mocharc.custom.json src/**/*.test.ts", + "test:package": "mocha test/package --exit", + "test:integration": "mocha test/integration --exit", + "test": "npm run test:ts && npm run test:package", + "check": "tsc --noEmit", + "lint": "eslint -c eslint.config.mjs .", + "translate": "translate-adapter" + }, + "bugs": { + "url": "https://github.com/Hombach/ioBroker.tibberlink/issues" + }, + "readmeFilename": "README.md" } diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 00000000..1928d021 --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,10 @@ +// iobroker prettier configuration file +import prettierConfig from "@iobroker/eslint-config/prettier.config.mjs"; + +export default { + ...prettierConfig, + // uncomment next line if you prefer double quotes + singleQuote: false, + printWidth: 160, + useTabs: true, +}; diff --git a/src/lib/adapter-config.d.ts b/src/lib/adapter-config.d.ts index 24df61e5..1cb443eb 100644 --- a/src/lib/adapter-config.d.ts +++ b/src/lib/adapter-config.d.ts @@ -71,6 +71,7 @@ declare global { tibberBridgeUrl: string; tibberBridgePassword: string; tibberPulseLocalNodeId: number; + tibberBridgeRawDataInterval: number; }, ]; } diff --git a/src/lib/tibberHelper.ts b/src/lib/projectUtils.ts similarity index 70% rename from src/lib/tibberHelper.ts rename to src/lib/projectUtils.ts index 516c8ebd..ab20b020 100644 --- a/src/lib/tibberHelper.ts +++ b/src/lib/projectUtils.ts @@ -1,4 +1,4 @@ -import * as utils from "@iobroker/adapter-core"; +import type * as utils from "@iobroker/adapter-core"; export enum enCalcType { BestCost = 1, @@ -11,6 +11,11 @@ export enum enCalcType { //BestCostMaxHours = 8, } +/** + * getCalcTypeDescription + * + * @param calcType - ID of calculator channel type + */ export function getCalcTypeDescription(calcType: enCalcType): string { switch (calcType) { case enCalcType.BestCost: @@ -34,44 +39,44 @@ export function getCalcTypeDescription(calcType: enCalcType): string { } } +/** + * Information about a home configuration. + */ export interface IHomeInfo { + /** Unique identifier for the home. */ ID: string; + /** Display name of the home in the app. */ NameInApp: string; + /** Whether real-time updates are enabled. */ RealTime: boolean; + /** Whether the home feed is active. */ FeedActive: boolean; + /** Whether price data polling is active. */ PriceDataPollActive: boolean; } -export class TibberHelper { +/** + * ProjectUtils + */ +export class ProjectUtils { adapter: utils.AdapterInstance; + /** + * constructor + * + * @param adapter - ioBroker adapter instance + */ constructor(adapter: utils.AdapterInstance) { this.adapter = adapter; } - protected getStatePrefix(homeId: string, space: string, id: string, name?: string): { [key: string]: string } { - const statePrefix = { - key: name ? name : id, - value: `Homes.${homeId}.${space}.${id}`, - }; - return statePrefix; - } - - protected getStatePrefixLocal(pulse: number, id: string, name?: string): { [key: string]: string } { - const statePrefix = { - key: name ? name : id, - value: `LocalPulse.${pulse}.${id}`, - }; - return statePrefix; - } - /** * Retrieves the value of a given state by its name. * * @param stateName - A string representing the name of the state to retrieve. * @returns A Promise that resolves with the value of the state if it exists, otherwise resolves with null. */ - protected async getStateValue(stateName: string): Promise { + protected async getStateValue(stateName: string): Promise { try { const stateObject = await this.getState(stateName); return stateObject?.val ?? null; // errors have already been handled in getState() @@ -87,16 +92,15 @@ export class TibberHelper { * @param stateName - A string representing the name of the state to retrieve. * @returns A Promise that resolves with the object of the state if it exists, otherwise resolves with null. */ - private async getState(stateName: string): Promise { + private async getState(stateName: string): Promise { try { if (await this.verifyStateAvailable(stateName)) { // Get state value, so like: {val: false, ack: true, ts: 1591117034451, �} const stateValueObject = await this.adapter.getStateAsync(stateName); if (!this.isLikeEmpty(stateValueObject)) { return stateValueObject; - } else { - throw `Unable to retrieve info from state '${stateName}'.`; } + throw new Error(`Unable to retrieve info from state '${stateName}'.`); } } catch (error) { this.adapter.log.error(`[asyncGetState](${stateName}): ${error}`); @@ -110,7 +114,7 @@ export class TibberHelper { * @param stateName - A string representing the name of the state to verify. * @returns A Promise that resolves with true if the state exists, otherwise resolves with false. */ - private async verifyStateAvailable(stateName: string): Promise { + private async verifyStateAvailable(stateName: string): Promise { const stateObject = await this.adapter.getObjectAsync(stateName); // Check state existence if (!stateObject) { this.adapter.log.debug(`[verifyStateAvailable](${stateName}): State does not exist.`); @@ -119,6 +123,51 @@ export class TibberHelper { return true; } + /** + * Get foreign state value + * + * @param stateName - Full path to state, like 0_userdata.0.other.isSummer + * @returns State value, or null if error + */ + // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents + async asyncGetForeignStateVal(stateName: string): Promise { + try { + const stateObject = await this.asyncGetForeignState(stateName); + if (stateObject == null) { + return null; + } // errors thrown already in asyncGetForeignState() + return stateObject.val; + } catch (error) { + this.adapter.log.error(`[asyncGetForeignStateValue](${stateName}): ${error}`); + return null; + } + } + + /** + * Get foreign state + * + * @param stateName - Full path to state, like 0_userdata.0.other.isSummer + * @returns State object: {val: false, ack: true, ts: 1591117034451, …}, or null if error + */ + private async asyncGetForeignState(stateName: string): Promise { + try { + const stateObject = await this.adapter.getForeignObjectAsync(stateName); // Check state existence + if (!stateObject) { + throw new Error(`State '${stateName}' does not exist.`); + } else { + // Get state value, so like: {val: false, ack: true, ts: 1591117034451, …} + const stateValueObject = await this.adapter.getForeignStateAsync(stateName); + if (!this.isLikeEmpty(stateValueObject)) { + return stateValueObject; + } + throw new Error(`Unable to retrieve info from state '${stateName}'.`); + } + } catch (error) { + this.adapter.log.error(`[asyncGetForeignState](${stateName}): ${error}`); + return null; + } + } + /** * Checks if the given input variable is effectively empty. * @@ -140,18 +189,16 @@ export class TibberHelper { sTemp = sTemp.replace(/\}+/g, ""); // remove all >}< if (sTemp !== "") { return false; - } else { - return true; } - } else { return true; } + return true; } /** * Checks if a string state exists, creates it if necessary, and updates its value. * - * @param stateName - An object containing the key and value for the name of the state. + * @param stateName - A string representing the name of the state. * @param value - The string value to set for the state. * @param description - Optional description for the state (default is "-"). * @param writeable - Optional boolean indicating if the state should be writeable (default is false). @@ -160,17 +207,17 @@ export class TibberHelper { * @returns A Promise that resolves when the state is checked, created (if necessary), and updated. */ protected async checkAndSetValue( - stateName: { [key: string]: string }, + stateName: string, value: string, - description: string = "-", - writeable: boolean = false, - dontUpdate: boolean = false, - forceMode: boolean = false, + description = "-", + writeable = false, + dontUpdate = false, + forceMode = false, ): Promise { if (value != undefined) { if (value.trim().length > 0) { const commonObj: ioBroker.StateCommon = { - name: stateName.key, + name: stateName.split(".").pop(), type: "string", role: "text", desc: description, @@ -178,20 +225,20 @@ export class TibberHelper { write: writeable, }; if (!forceMode) { - await this.adapter.setObjectNotExistsAsync(stateName.value, { + await this.adapter.setObjectNotExistsAsync(stateName, { type: "state", common: commonObj, native: {}, }); } else { - await this.adapter.setObjectAsync(stateName.value, { + await this.adapter.setObjectAsync(stateName, { type: "state", common: commonObj, native: {}, }); } - if (!dontUpdate || (await this.adapter.getStateAsync(stateName.value)) === null) { - await this.adapter.setStateAsync(stateName.value, { val: value, ack: true }); + if (!dontUpdate || (await this.adapter.getStateAsync(stateName)) === null) { + await this.adapter.setState(stateName, { val: value, ack: true }); } } } @@ -200,7 +247,7 @@ export class TibberHelper { /** * Checks if a number state exists, creates it if necessary, and updates its value. * - * @param stateName - An object containing the key and value for the name of the state. + * @param stateName - A string representing the name of the state. * @param value - The number value to set for the state. * @param description - Optional description for the state (default is "-"). * @param unit - Optional unit string to set for the state (default is undefined). @@ -210,17 +257,17 @@ export class TibberHelper { * @returns A Promise that resolves when the state is checked, created (if necessary), and updated. */ protected async checkAndSetValueNumber( - stateName: { [key: string]: string }, + stateName: string, value: number, - description: string = "-", + description = "-", unit?: string, - writeable: boolean = false, - dontUpdate: boolean = false, - forceMode: boolean = false, + writeable = false, + dontUpdate = false, + forceMode = false, ): Promise { - if (value || value === 0) { + if (value !== undefined) { const commonObj: ioBroker.StateCommon = { - name: stateName.key, + name: stateName.split(".").pop(), type: "number", role: "value", desc: description, @@ -232,21 +279,21 @@ export class TibberHelper { commonObj.unit = unit; } if (!forceMode) { - await this.adapter.setObjectNotExistsAsync(stateName.value, { + await this.adapter.setObjectNotExistsAsync(stateName, { type: "state", common: commonObj, native: {}, }); } else { - await this.adapter.setObjectAsync(stateName.value, { + await this.adapter.setObjectAsync(stateName, { type: "state", common: commonObj, native: {}, }); } - if (!dontUpdate || (await this.adapter.getStateAsync(stateName.value)) === null) { - await this.adapter.setStateAsync(stateName.value, { val: value, ack: true }); + if (!dontUpdate || (await this.adapter.getStateAsync(stateName)) === null) { + await this.adapter.setState(stateName, { val: value, ack: true }); } } } @@ -254,23 +301,25 @@ export class TibberHelper { /** * Checks if a boolean state exists, creates it if necessary, and updates its value. * - * @param stateName - An object containing the key and value for the name of the state. + * @param stateName - A string representing the name of the state. * @param value - The boolean value to set for the state. * @param description - Optional description for the state (default is "-"). * @param writeable - Optional boolean indicating if the state should be writeable (default is false). * @param dontUpdate - Optional boolean indicating if the state should not be updated if it already exists (default is false). + * @param forceMode - Optional boolean indicating if the state should be overwritten if it already exists (default is false). * @returns A Promise that resolves when the state is checked, created (if necessary), and updated. */ protected async checkAndSetValueBoolean( - stateName: { [key: string]: string }, + stateName: string, value: boolean, - description: string = "-", - writeable: boolean = false, - dontUpdate: boolean = false, + description = "-", + writeable = false, + dontUpdate = false, + forceMode = false, ): Promise { if (value !== undefined && value !== null) { const commonObj: ioBroker.StateCommon = { - name: stateName.key, + name: stateName.split(".").pop(), type: "boolean", role: "indicator", desc: description, @@ -278,22 +327,22 @@ export class TibberHelper { write: writeable, }; - if (stateName.value.split(".").pop() === stateName.key) { - await this.adapter.setObjectNotExistsAsync(stateName.value, { + if (!forceMode) { + await this.adapter.setObjectNotExistsAsync(stateName, { type: "state", common: commonObj, native: {}, }); } else { - await this.adapter.setObjectAsync(stateName.value, { + await this.adapter.setObjectAsync(stateName, { type: "state", common: commonObj, native: {}, }); } - // Update the state value if not in don't update mode or the state does not exist - if (!dontUpdate || (await this.adapter.getStateAsync(stateName.value)) === null) { - await this.adapter.setStateAsync(stateName.value, { val: value, ack: true }); + + if (!dontUpdate || (await this.adapter.getStateAsync(stateName)) === null) { + await this.adapter.setState(stateName, { val: value, ack: true }); } } } @@ -311,7 +360,9 @@ export class TibberHelper { if (error.errors && Array.isArray(error.errors)) { // Iterate over the array of errors and concatenate their messages for (const err of error.errors) { - if (errorMessages) errorMessages += ", "; + if (errorMessages) { + errorMessages += ", "; + } errorMessages += err.message; } } else if (error.message) { diff --git a/src/lib/tibberAPICaller.ts b/src/lib/tibberAPICaller.ts index c9e9a189..993f518c 100644 --- a/src/lib/tibberAPICaller.ts +++ b/src/lib/tibberAPICaller.ts @@ -1,31 +1,44 @@ -import * as utils from "@iobroker/adapter-core"; -import { IConfig, TibberQuery } from "tibber-api"; -import { IAddress } from "tibber-api/lib/src/models/IAddress"; -import { IConsumption } from "tibber-api/lib/src/models/IConsumption"; // obsolete data poll for consumption data -import { IContactInfo } from "tibber-api/lib/src/models/IContactInfo"; -import { IHome } from "tibber-api/lib/src/models/IHome"; // obsolete data poll for consumption data -import { ILegalEntity } from "tibber-api/lib/src/models/ILegalEntity"; -import { IPrice } from "tibber-api/lib/src/models/IPrice"; +import type * as utils from "@iobroker/adapter-core"; +import { TibberQuery, type IConfig } from "tibber-api"; +import type { IAddress } from "tibber-api/lib/src/models/IAddress"; +import type { IConsumption } from "tibber-api/lib/src/models/IConsumption"; // obsolete data poll for consumption data +import type { IContactInfo } from "tibber-api/lib/src/models/IContactInfo"; +import type { IHome } from "tibber-api/lib/src/models/IHome"; // obsolete data poll for consumption data +import type { ILegalEntity } from "tibber-api/lib/src/models/ILegalEntity"; +import type { IPrice } from "tibber-api/lib/src/models/IPrice"; import { EnergyResolution } from "tibber-api/lib/src/models/enums/EnergyResolution"; -import { IHomeInfo, TibberHelper } from "./tibberHelper"; +import { ProjectUtils, type IHomeInfo } from "./projectUtils"; -export class TibberAPICaller extends TibberHelper { +/** + * TibberAPICaller + */ +export class TibberAPICaller extends ProjectUtils { tibberConfig: IConfig; tibberQuery: TibberQuery; + /** + * constructor + * + * @param tibberConfig - the Tibber configuration object + * @param adapter - ioBroker adapter instance + */ constructor(tibberConfig: IConfig, adapter: utils.AdapterInstance) { super(adapter); this.tibberConfig = tibberConfig; this.tibberQuery = new TibberQuery(this.tibberConfig, 60000); } + /** + * updateHomesFromAPI + */ async updateHomesFromAPI(): Promise { try { const Homes = await this.tibberQuery.getHomes(); this.adapter.log.debug(`Got homes from tibber api: ${JSON.stringify(Homes)}`); const homeInfoList: IHomeInfo[] = []; - for (const index in Homes) { - const currentHome = Homes[index]; + //for (const index in Homes) { + //const currentHome = Homes[index]; + for (const currentHome of Homes) { homeInfoList.push({ ID: currentHome.id, NameInApp: currentHome.appNickname, @@ -36,32 +49,28 @@ export class TibberAPICaller extends TibberHelper { // Set HomeId in tibberConfig for further API Calls this.tibberConfig.homeId = currentHome.id; // Home GENERAL - this.checkAndSetValue(this.getStatePrefix(currentHome.id, "General", "Id"), currentHome.id, "ID of your home"); - this.checkAndSetValue(this.getStatePrefix(currentHome.id, "General", "Timezone"), currentHome.timeZone, "The time zone the home resides in"); - this.checkAndSetValue(this.getStatePrefix(currentHome.id, "General", "NameInApp"), currentHome.appNickname, "The nickname given to the home"); - this.checkAndSetValue( - this.getStatePrefix(currentHome.id, "General", "AvatarInApp"), - currentHome.appAvatar, - "The chosen app avatar for the home", - ); + void this.checkAndSetValue(`Homes.${currentHome.id}.General.Id`, currentHome.id, "ID of your home"); + void this.checkAndSetValue(`Homes.${currentHome.id}.General.Timezone`, currentHome.timeZone, "The time zone the home resides in"); + void this.checkAndSetValue(`Homes.${currentHome.id}.General.NameInApp`, currentHome.appNickname, "The nickname given to the home"); + void this.checkAndSetValue(`Homes.${currentHome.id}.General.AvatarInApp`, currentHome.appAvatar, "The chosen app avatar for the home"); // Values: APARTMENT, ROWHOUSE, FLOORHOUSE1, FLOORHOUSE2, FLOORHOUSE3, COTTAGE, CASTLE - this.checkAndSetValue(this.getStatePrefix(currentHome.id, "General", "Type"), currentHome.type, "The type of home."); + void this.checkAndSetValue(`Homes.${currentHome.id}.General.Type`, currentHome.type, "The type of home."); // Values: APARTMENT, ROWHOUSE, HOUSE, COTTAGE - this.checkAndSetValue( - this.getStatePrefix(currentHome.id, "General", "PrimaryHeatingSource"), + void this.checkAndSetValue( + `Homes.${currentHome.id}.General.PrimaryHeatingSource`, currentHome.primaryHeatingSource, "The primary form of heating in the home", ); // Values: AIR2AIR_HEATPUMP, ELECTRICITY, GROUND, DISTRICT_HEATING, ELECTRIC_BOILER, AIR2WATER_HEATPUMP, OTHER - this.checkAndSetValueNumber(this.getStatePrefix(currentHome.id, "General", "Size"), currentHome.size, "The size of the home in square meters"); - this.checkAndSetValueNumber( - this.getStatePrefix(currentHome.id, "General", "NumberOfResidents"), + void this.checkAndSetValueNumber(`Homes.${currentHome.id}.General.Size`, currentHome.size, "The size of the home in square meters"); + void this.checkAndSetValueNumber( + `Homes.${currentHome.id}.General.NumberOfResidents`, currentHome.numberOfResidents, "The number of people living in the home", ); - this.checkAndSetValueNumber(this.getStatePrefix(currentHome.id, "General", "MainFuseSize"), currentHome.mainFuseSize, "The main fuse size"); - this.checkAndSetValueBoolean( - this.getStatePrefix(currentHome.id, "General", "HasVentilationSystem"), + void this.checkAndSetValueNumber(`Homes.${currentHome.id}.General.MainFuseSize`, currentHome.mainFuseSize, "The main fuse size"); + void this.checkAndSetValueBoolean( + `Homes.${currentHome.id}.General.HasVentilationSystem`, currentHome.hasVentilationSystem, "Whether the home has a ventilation system", ); @@ -69,8 +78,8 @@ export class TibberAPICaller extends TibberHelper { this.fetchAddress(currentHome.id, "Address", currentHome.address); this.fetchLegalEntity(currentHome.id, "Owner", currentHome.owner); - this.checkAndSetValueBoolean( - this.getStatePrefix(currentHome.id, "Features", "RealTimeConsumptionEnabled"), + void this.checkAndSetValueBoolean( + `Homes.${currentHome.id}.Features.RealTimeConsumptionEnabled`, currentHome.features.realTimeConsumptionEnabled, "Whether Tibber server will send consumption data by API", ); @@ -89,11 +98,15 @@ export class TibberAPICaller extends TibberHelper { * @param forceUpdate - OPTIONAL: force mode, without verification if existing data is fitting to current date, default: false * @returns okprice - got correct data */ - async updateCurrentPriceAllHomes(homeInfoList: IHomeInfo[], forceUpdate: boolean = false): Promise { + async updateCurrentPriceAllHomes(homeInfoList: IHomeInfo[], forceUpdate = false): Promise { let okprice = true; for (const curHomeInfo of homeInfoList) { - if (!curHomeInfo.PriceDataPollActive) continue; - if (!(await this.updateCurrentPrice(curHomeInfo.ID, forceUpdate))) okprice = false; // single fault sets all false + if (!curHomeInfo.PriceDataPollActive) { + continue; + } + if (!(await this.updateCurrentPrice(curHomeInfo.ID, forceUpdate))) { + okprice = false; + } // single fault sets all false } return okprice; } @@ -104,7 +117,7 @@ export class TibberAPICaller extends TibberHelper { * @param forceUpdate - OPTIONAL: force mode, without verification if existing data is fitting to current date, default: false * @returns okprice - got new data */ - private async updateCurrentPrice(homeId: string, forceUpdate: boolean = false): Promise { + private async updateCurrentPrice(homeId: string, forceUpdate = false): Promise { try { if (homeId) { let exDateCurrent: Date | null = null; @@ -117,7 +130,9 @@ export class TibberAPICaller extends TibberHelper { // update remaining average if (Array.isArray(pricesToday) && pricesToday[2] && pricesToday[2].startsAt) { const exDateToday: Date = new Date(pricesToday[2].startsAt); - if (now.getDate == exDateToday.getDate) this.fetchPriceRemainingAverage(homeId, `PricesToday.averageRemaining`, pricesToday); + if (now.getDate == exDateToday.getDate) { + this.fetchPriceRemainingAverage(homeId, `PricesToday.averageRemaining`, pricesToday); + } } if (!exDateCurrent || now.getHours() !== exDateCurrent.getHours() || forceUpdate) { @@ -128,7 +143,7 @@ export class TibberAPICaller extends TibberHelper { if (exDateCurrent && now.getHours() === exDateCurrent.getHours()) { return true; } - } else if (now.getHours() !== exDateCurrent.getHours()) { + } else if (now.getHours() == exDateCurrent.getHours()) { this.adapter.log.debug( `Hour (${exDateCurrent.getHours()}) of known current price is already the current hour, polling of current price from Tibber skipped`, ); @@ -139,9 +154,12 @@ export class TibberAPICaller extends TibberHelper { } else { return false; } - } catch (error: any) { - if (forceUpdate) this.adapter.log.error(this.generateErrorMessage(error, `pull of current price`)); - else this.adapter.log.warn(this.generateErrorMessage(error, `pull of current price`)); + } catch (error: unknown) { + if (forceUpdate) { + this.adapter.log.error(this.generateErrorMessage(error, `pull of current price`)); + } else { + this.adapter.log.warn(this.generateErrorMessage(error, `pull of current price`)); + } return false; } return false; @@ -154,15 +172,17 @@ export class TibberAPICaller extends TibberHelper { * @param forceUpdate - OPTIONAL: force mode, without verification if existing data is fitting to current date, default: false * @returns okprice - got correct data */ - async updatePricesTodayAllHomes(homeInfoList: IHomeInfo[], forceUpdate: boolean = false): Promise { + async updatePricesTodayAllHomes(homeInfoList: IHomeInfo[], forceUpdate = false): Promise { let okprice = true; for (const curHomeInfo of homeInfoList) { - if (!curHomeInfo.PriceDataPollActive) continue; + if (!curHomeInfo.PriceDataPollActive) { + continue; + } if (!(await this.updatePricesToday(curHomeInfo.ID, forceUpdate))) { okprice = false; } else { const now = new Date(); - this.checkAndSetValue(this.getStatePrefix(curHomeInfo.ID, "PricesToday", "lastUpdate"), now.toString(), `last update of prices today`); + void this.checkAndSetValue(`Homes.${curHomeInfo.ID}.PricesToday.lastUpdate`, now.toString(), `last update of prices today`); } } return okprice; @@ -174,7 +194,7 @@ export class TibberAPICaller extends TibberHelper { * @param forceUpdate - OPTIONAL: force mode, without verification if existing data is fitting to current date, default: false * @returns okprice - got correct data */ - private async updatePricesToday(homeId: string, forceUpdate: boolean = false): Promise { + private async updatePricesToday(homeId: string, forceUpdate = false): Promise { try { let exDate: Date | null = null; let exPricesToday: IPrice[] = []; @@ -192,7 +212,10 @@ export class TibberAPICaller extends TibberHelper { throw new Error(`Got invalid data structure from Tibber [you might not have a valid (or fully confirmed) contract]`); } this.adapter.log.debug(`Got prices today from tibber api: ${JSON.stringify(pricesToday)} Force: ${forceUpdate}`); - this.checkAndSetValue(this.getStatePrefix(homeId, "PricesToday", "json"), JSON.stringify(pricesToday), "The prices today as json"); // write also it might be empty + void this.checkAndSetValue(`Homes.${homeId}.PricesToday.json`, JSON.stringify(pricesToday), "The prices today as json"); // write also it might be empty + //WiP 600 + void this.checkAndSetValue(`Homes.${homeId}.PricesYesterday.json`, JSON.stringify(exPricesToday), "The prices yesterday as json"); + //WiP 600 this.fetchPriceAverage(homeId, `PricesToday.average`, pricesToday); this.fetchPriceRemainingAverage(homeId, `PricesToday.averageRemaining`, pricesToday); this.fetchPriceMaximum( @@ -205,14 +228,15 @@ export class TibberAPICaller extends TibberHelper { `PricesToday.minimum`, pricesToday.sort((a, b) => a.total - b.total), ); - for (const i in pricesToday) { - const price = pricesToday[i]; + //for (const i in pricesToday) { + for (const price of pricesToday) { + //const price = pricesToday[i]; const hour = new Date(price.startsAt.substr(0, 19)).getHours(); await this.fetchPrice(homeId, `PricesToday.${hour}`, price); } if (Array.isArray(pricesToday) && pricesToday[2] && pricesToday[2].startsAt) { - this.checkAndSetValue( - this.getStatePrefix(homeId, "PricesToday", "jsonBYpriceASC"), + void this.checkAndSetValue( + `Homes.${homeId}.PricesToday.jsonBYpriceASC`, JSON.stringify(pricesToday.sort((a, b) => a.total - b.total)), "prices sorted by cost ascending as json", ); @@ -222,20 +246,23 @@ export class TibberAPICaller extends TibberHelper { } } else { // Handle the case when pricesToday is not an array, it's empty!, so just don't sort and write - this.checkAndSetValue( - this.getStatePrefix(homeId, "PricesToday", "jsonBYpriceASC"), + void this.checkAndSetValue( + `Homes.${homeId}.PricesToday.jsonBYpriceASC`, JSON.stringify(pricesToday), "prices sorted by cost ascending as json", ); return false; } } else { - this.adapter.log.debug(`Existing date (${exDate}) of price info is already the today date, polling of prices today from Tibber skipped`); + this.adapter.log.debug(`Existing date of price info is already the today date, polling of prices today from Tibber skipped`); return true; } - } catch (error: any) { - if (forceUpdate) this.adapter.log.error(this.generateErrorMessage(error, `force pull of prices today`)); - else this.adapter.log.warn(this.generateErrorMessage(error, `pull of prices today`)); + } catch (error: unknown) { + if (forceUpdate) { + this.adapter.log.error(this.generateErrorMessage(error, `force pull of prices today`)); + } else { + this.adapter.log.warn(this.generateErrorMessage(error, `pull of prices today`)); + } return false; } return false; @@ -248,15 +275,17 @@ export class TibberAPICaller extends TibberHelper { * @param forceUpdate - OPTIONAL: force mode, without verification if existing data is fitting to current date, default: false * @returns okprice - got correct data */ - async updatePricesTomorrowAllHomes(homeInfoList: IHomeInfo[], forceUpdate: boolean = false): Promise { + async updatePricesTomorrowAllHomes(homeInfoList: IHomeInfo[], forceUpdate = false): Promise { let okprice = true; for (const curHomeInfo of homeInfoList) { - if (!curHomeInfo.PriceDataPollActive) continue; + if (!curHomeInfo.PriceDataPollActive) { + continue; + } if (!(await this.updatePricesTomorrow(curHomeInfo.ID, forceUpdate))) { okprice = false; // single fault sets all false } else { const now = new Date(); - this.checkAndSetValue(this.getStatePrefix(curHomeInfo.ID, "PricesTomorrow", "lastUpdate"), now.toString(), `last update of prices tomorrow`); + void this.checkAndSetValue(`Homes.${curHomeInfo.ID}.PricesTomorrow.lastUpdate`, now.toString(), `last update of prices tomorrow`); } } return okprice; @@ -268,7 +297,7 @@ export class TibberAPICaller extends TibberHelper { * @param forceUpdate - OPTIONAL: force mode, without verification if existing data is fitting to current date, default: false * @returns okprice - got new data */ - private async updatePricesTomorrow(homeId: string, forceUpdate: boolean = false): Promise { + private async updatePricesTomorrow(homeId: string, forceUpdate = false): Promise { try { let exDate: Date | null = null; let exPricesTomorrow: IPrice[] = []; @@ -284,7 +313,7 @@ export class TibberAPICaller extends TibberHelper { if (!exDate || exDate < morgen || forceUpdate) { const pricesTomorrow = await this.tibberQuery.getTomorrowsEnergyPrices(homeId); this.adapter.log.debug(`Got prices tomorrow from tibber api: ${JSON.stringify(pricesTomorrow)} Force: ${forceUpdate}`); - this.checkAndSetValue(this.getStatePrefix(homeId, "PricesTomorrow", "json"), JSON.stringify(pricesTomorrow), "The prices tomorrow as json"); // write also it might be empty + void this.checkAndSetValue(`Homes.${homeId}.PricesTomorrow.json`, JSON.stringify(pricesTomorrow), "The prices tomorrow as json"); // write also it might be empty if (pricesTomorrow.length === 0) { // pricing not known, before about 13:00 - delete all the states this.adapter.log.debug(`Emptying prices tomorrow and average cause existing ones are obsolete...`); @@ -294,18 +323,19 @@ export class TibberAPICaller extends TibberHelper { this.emptyingPriceAverage(homeId, `PricesTomorrow.average`); this.emptyingPriceMaximum(homeId, `PricesTomorrow.maximum`); this.emptyingPriceMinimum(homeId, `PricesTomorrow.minimum`); - this.checkAndSetValue( - this.getStatePrefix(homeId, "PricesTomorrow", "jsonBYpriceASC"), + void this.checkAndSetValue( + `Homes.${homeId}.PricesTomorrow.jsonBYpriceASC`, JSON.stringify(pricesTomorrow), "prices sorted by cost ascending as json", ); return false; } else if (Array.isArray(pricesTomorrow)) { // pricing known, after about 13:00 - write the states - for (const i in pricesTomorrow) { - const price = pricesTomorrow[i]; + //for (const i in pricesTomorrow) { + for (const price of pricesTomorrow) { + //const price = pricesTomorrow[i]; const hour = new Date(price.startsAt.substr(0, 19)).getHours(); - await this.fetchPrice(homeId, "PricesTomorrow." + hour, price); + await this.fetchPrice(homeId, `PricesTomorrow.${hour}`, price); } this.fetchPriceAverage(homeId, `PricesTomorrow.average`, pricesTomorrow); this.fetchPriceMaximum( @@ -318,26 +348,28 @@ export class TibberAPICaller extends TibberHelper { `PricesTomorrow.minimum`, pricesTomorrow.sort((a, b) => a.total - b.total), ); - this.checkAndSetValue( - this.getStatePrefix(homeId, "PricesTomorrow", "jsonBYpriceASC"), + void this.checkAndSetValue( + `Homes.${homeId}.PricesTomorrow.jsonBYpriceASC`, JSON.stringify(pricesTomorrow.sort((a, b) => a.total - b.total)), "prices sorted by cost ascending as json", ); exDate = new Date(pricesTomorrow[2].startsAt); if (exDate && exDate >= morgen) { return true; - } else { - return false; } + return false; } } else if (exDate && exDate >= morgen) { - this.adapter.log.debug(`Existing date (${exDate}) of price info is already the tomorrow date, polling of prices tomorrow from Tibber skipped`); + this.adapter.log.debug(`Existing date of price info is already the tomorrow date, polling of prices tomorrow from Tibber skipped`); return true; } return false; - } catch (error: any) { - if (forceUpdate) this.adapter.log.error(this.generateErrorMessage(error, `force pull of prices tomorrow`)); - else this.adapter.log.warn(this.generateErrorMessage(error, `pull of prices tomorrow`)); + } catch (error: unknown) { + if (forceUpdate) { + this.adapter.log.error(this.generateErrorMessage(error, `force pull of prices tomorrow`)); + } else { + this.adapter.log.warn(this.generateErrorMessage(error, `pull of prices tomorrow`)); + } return false; } } @@ -350,7 +382,9 @@ export class TibberAPICaller extends TibberHelper { async updateConsumptionAllHomes(): Promise { try { for (const home of this.adapter.config.HomesList) { - if (!home.statsActive || !home.homeID) continue; + if (!home.statsActive || !home.homeID) { + continue; + } const homeID = home.homeID; const resolutions = [ { type: EnergyResolution.HOURLY, state: `jsonHourly`, numCons: home.numberConsHourly, description: `hour` }, @@ -367,18 +401,18 @@ export class TibberAPICaller extends TibberHelper { } else { consumption = await this.tibberQuery.getConsumption(type, numCons, homeID); } - this.checkAndSetValue( - this.getStatePrefix(homeID, `Consumption`, state), + void this.checkAndSetValue( + `Homes.${homeID}.Consumption.${state}`, JSON.stringify(consumption), `Historical consumption last ${description}s as json)`, ); } else { - this.checkAndSetValue(this.getStatePrefix(homeID, `Consumption`, state), `[]`); + void this.checkAndSetValue(`Homes.${homeID}.Consumption.${state}`, `[]`); } } this.adapter.log.debug(`Got all consumption data from Tibber Server for home: ${homeID}`); } - } catch (error: any) { + } catch (error: unknown) { this.adapter.log.error(this.generateErrorMessage(error, `pull of consumption data`)); } } @@ -392,12 +426,12 @@ export class TibberAPICaller extends TibberHelper { * @returns Promise - Resolves when the price data is successfully fetched and updated. */ private async fetchPrice(homeId: string, objectDestination: string, price: IPrice): Promise { - await this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), price.total, "Total price (energy + taxes)"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), price.energy, "Spotmarket energy price"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), price.tax, "Tax part of the price (energy, tax, VAT...)"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "startsAt"), price.startsAt, "Start time of the price"); - //this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "currency"), price.currency, "The price currency"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), price.level, "Price level compared to recent price values"); + await this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, price.total, "Total price (energy + taxes)"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, price.energy, "Spotmarket energy price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, price.tax, "Tax part of the price (energy, tax, VAT...)"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.startsAt`, price.startsAt, "Start time of the price"); + //void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.currency`, price.currency, "The price currency"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, price.level, "Price level compared to recent price values"); } private fetchPriceAverage(homeId: string, objectDestination: string, price: IPrice[]): void { @@ -407,20 +441,20 @@ export class TibberAPICaller extends TibberHelper { } return sum; }, 0); - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "total"), + void this.checkAndSetValueNumber( + `Homes.${homeId}.${objectDestination}.total`, Math.round(1000 * (totalSum / price.length)) / 1000, "Todays total price average", ); const energySum = price.reduce((sum, item) => sum + item.energy, 0); - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "energy"), + void this.checkAndSetValueNumber( + `Homes.${homeId}.${objectDestination}.energy`, Math.round(1000 * (energySum / price.length)) / 1000, "Todays average spotmarket price", ); const taxSum = price.reduce((sum, item) => sum + item.tax, 0); - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "tax"), + void this.checkAndSetValueNumber( + `Homes.${homeId}.${objectDestination}.tax`, Math.round(1000 * (taxSum / price.length)) / 1000, "Todays average tax price", ); @@ -429,7 +463,7 @@ export class TibberAPICaller extends TibberHelper { const now = new Date(); // current time const currentHour = now.getHours(); // filter to prices of current and later hours - const filteredPrices = price.filter((item) => { + const filteredPrices = price.filter(item => { const itemHour = new Date(item.startsAt).getHours(); return itemHour >= currentHour; }); @@ -440,20 +474,20 @@ export class TibberAPICaller extends TibberHelper { } return sum; }, 0); - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "total"), + void this.checkAndSetValueNumber( + `Homes.${homeId}.${objectDestination}.total`, Math.round(1000 * (remainingTotalSum / filteredPrices.length)) / 1000, "Todays total price remaining average", ); const remainingEnergySum = filteredPrices.reduce((sum, item) => sum + item.energy, 0); - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "energy"), + void this.checkAndSetValueNumber( + `Homes.${homeId}.${objectDestination}.energy`, Math.round(1000 * (remainingEnergySum / filteredPrices.length)) / 1000, "Todays remaining average spot market price", ); const remainingTaxSum = filteredPrices.reduce((sum, item) => sum + item.tax, 0); - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "tax"), + void this.checkAndSetValueNumber( + `Homes.${homeId}.${objectDestination}.tax`, Math.round(1000 * (remainingTaxSum / filteredPrices.length)) / 1000, "Todays remaining average tax price", ); @@ -464,110 +498,103 @@ export class TibberAPICaller extends TibberHelper { // possible exit 1.4.3 - Sentry discovered possible error in 1.4.1 // return; } - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "total"), - Math.round(1000 * price[23].total) / 1000, - "Todays total price maximum", - ); - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "energy"), + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, Math.round(1000 * price[23].total) / 1000, "Todays total price maximum"); + void this.checkAndSetValueNumber( + `Homes.${homeId}.${objectDestination}.energy`, Math.round(1000 * price[23].energy) / 1000, "Todays spotmarket price at total price maximum", ); - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "tax"), + void this.checkAndSetValueNumber( + `Homes.${homeId}.${objectDestination}.tax`, Math.round(1000 * price[23].tax) / 1000, "Todays tax price at total price maximum", ); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), price[23].level, "Price level compared to recent price values"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "startsAt"), price[23].startsAt, "Start time of the price maximum"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, price[23].level, "Price level compared to recent price values"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.startsAt`, price[23].startsAt, "Start time of the price maximum"); } private fetchPriceMinimum(homeId: string, objectDestination: string, price: IPrice[]): void { - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "total"), - Math.round(1000 * price[0].total) / 1000, - "Todays total price minimum", - ); - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "energy"), + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, Math.round(1000 * price[0].total) / 1000, "Todays total price minimum"); + void this.checkAndSetValueNumber( + `Homes.${homeId}.${objectDestination}.energy`, Math.round(1000 * price[0].energy) / 1000, "Todays spotmarket price at total price minimum", ); - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, objectDestination, "tax"), + void this.checkAndSetValueNumber( + `Homes.${homeId}.${objectDestination}.tax`, Math.round(1000 * price[0].tax) / 1000, "Todays tax price at total price minimum", ); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), price[0].level, "Price level compared to recent price values"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "startsAt"), price[0].startsAt, "Start time of the price minimum"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, price[0].level, "Price level compared to recent price values"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.startsAt`, price[0].startsAt, "Start time of the price minimum"); } private emptyingPrice(homeId: string, objectDestination: string): void { - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), 0, "The total price (energy + taxes)"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), 0, "Spotmarket price"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), 0, "Tax part of the price (energy tax, VAT, etc.)"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), "Not known now", "Price level compared to recent price values"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, 0, "The total price (energy + taxes)"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, 0, "Spotmarket price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, 0, "Tax part of the price (energy tax, VAT, etc.)"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, "Not known now", "Price level compared to recent price values"); } private emptyingPriceAverage(homeId: string, objectDestination: string): void { - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), 0, "The todays total price average"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), 0, "The todays avarage spotmarket price"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), 0, "The todays avarage tax price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, 0, "The todays total price average"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, 0, "The todays avarage spotmarket price"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, 0, "The todays avarage tax price"); } private emptyingPriceMaximum(homeId: string, objectDestination: string): void { - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), 0, "Todays total price maximum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), 0, "Todays spotmarket price at total price maximum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), 0, "Todays tax price at total price maximum"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), "Not known now", "Price level compared to recent price values"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "startsAt"), "Not known now", "Start time of the price maximum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, 0, "Todays total price maximum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, 0, "Todays spotmarket price at total price maximum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, 0, "Todays tax price at total price maximum"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, "Not known now", "Price level compared to recent price values"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.startsAt`, "Not known now", "Start time of the price maximum"); } private emptyingPriceMinimum(homeId: string, objectDestination: string): void { - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "total"), 0, "Todays total price minimum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "energy"), 0, "Todays spotmarket price at total price minimum"); - this.checkAndSetValueNumber(this.getStatePrefix(homeId, objectDestination, "tax"), 0, "Todays tax price at total price minimum"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "level"), "Not known now", "Price level compared to recent price values"); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "startsAt"), "Not known now", "Start time of the price minimum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.total`, 0, "Todays total price minimum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.energy`, 0, "Todays spotmarket price at total price minimum"); + void this.checkAndSetValueNumber(`Homes.${homeId}.${objectDestination}.tax`, 0, "Todays tax price at total price minimum"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.level`, "Not known now", "Price level compared to recent price values"); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.startsAt`, "Not known now", "Start time of the price minimum"); } private fetchLegalEntity(homeId: string, objectDestination: string, legalEntity: ILegalEntity): void { - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Id"), legalEntity.id); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "FirstName"), legalEntity.firstName); - this.checkAndSetValueBoolean(this.getStatePrefix(homeId, objectDestination, "IsCompany"), legalEntity.isCompany); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Name"), legalEntity.name); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "MiddleName"), legalEntity.middleName); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "LastName"), legalEntity.lastName); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "OrganizationNo"), legalEntity.organizationNo); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Language"), legalEntity.language); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Id`, legalEntity.id); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.FirstName`, legalEntity.firstName); + void this.checkAndSetValueBoolean(`Homes.${homeId}.${objectDestination}.IsCompany`, legalEntity.isCompany); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Name`, legalEntity.name); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.MiddleName`, legalEntity.middleName); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.LastName`, legalEntity.lastName); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.OrganizationNo`, legalEntity.organizationNo); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Language`, legalEntity.language); if (legalEntity.contactInfo) { - this.fetchContactInfo(homeId, objectDestination + ".ContactInfo", legalEntity.contactInfo); + this.fetchContactInfo(homeId, `${objectDestination}.ContactInfo`, legalEntity.contactInfo); } if (legalEntity.address) { - this.fetchAddress(homeId, objectDestination + ".Address", legalEntity.address); + this.fetchAddress(homeId, `${objectDestination}.Address`, legalEntity.address); } } private fetchContactInfo(homeId: string, objectDestination: string, contactInfo: IContactInfo): void { - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Email"), contactInfo.email); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Mobile"), contactInfo.mobile); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Email`, contactInfo.email); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Mobile`, contactInfo.mobile); } private fetchAddress(homeId: string, objectDestination: string, address: IAddress): void { - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "address1"), address.address1); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "address2"), address.address2); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "address3"), address.address3); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "City"), address.city); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "PostalCode"), address.postalCode); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Country"), address.country); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Latitude"), address.latitude); - this.checkAndSetValue(this.getStatePrefix(homeId, objectDestination, "Longitude"), address.longitude); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.address1`, address.address1); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.address2`, address.address2); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.address3`, address.address3); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.City`, address.city); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.PostalCode`, address.postalCode); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Country`, address.country); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Latitude`, address.latitude); + void this.checkAndSetValue(`Homes.${homeId}.${objectDestination}.Longitude`, address.longitude); } - //#region *** obsolete data poll for consumption data #405 *** + //#region *** obsolete data poll for consumption data *** /** * Get energy consumption for one or more homes. * Returns an array of IConsumption + * * @param resolution EnergyResolution. Valid values: HOURLY, DAILY, WEEKLY, MONTHLY, ANNUAL * @param lastCount Return the last number of records * @param homeId Tibber home ID. - * @return Array of IConsumption + * @returns Array of IConsumption */ async getConsumptionObs(resolution: EnergyResolution, lastCount: number, homeId: string): Promise { const gqlHomeConsumptionObs = ` diff --git a/src/lib/tibberCalculator.ts b/src/lib/tibberCalculator.ts index 357a0587..0ecaae2b 100644 --- a/src/lib/tibberCalculator.ts +++ b/src/lib/tibberCalculator.ts @@ -1,9 +1,12 @@ -import * as utils from "@iobroker/adapter-core"; +import type * as utils from "@iobroker/adapter-core"; import { addDays, addHours, format } from "date-fns"; -import { IPrice } from "tibber-api/lib/src/models/IPrice"; -import { TibberHelper, enCalcType, getCalcTypeDescription } from "./tibberHelper"; +import type { IPrice } from "tibber-api/lib/src/models/IPrice"; +import { ProjectUtils, enCalcType, getCalcTypeDescription } from "./projectUtils"; -export class TibberCalculator extends TibberHelper { +/** + * TibberCalculator + */ +export class TibberCalculator extends ProjectUtils { numBestCost: number; numBestSingleHours: number; numBestHoursBlock: number; @@ -12,6 +15,11 @@ export class TibberCalculator extends TibberHelper { numBestHoursBlockLTF: number; numSmartBatteryBuffer: number; + /** + * constructor + * + * @param adapter - ioBroker adapter instance + */ constructor(adapter: utils.AdapterInstance) { super(adapter); this.numBestCost = 0; @@ -23,6 +31,9 @@ export class TibberCalculator extends TibberHelper { this.numSmartBatteryBuffer = 0; } + /** + * initStats + */ initStats(): void { this.numBestCost = 0; this.numBestSingleHours = 0; @@ -58,19 +69,24 @@ export class TibberCalculator extends TibberHelper { } } + /** + * + * @param homeId - ID of the home + * @param channel - ID of the calculator channel + */ async setupCalculatorStates(homeId: string, channel: number): Promise { try { - if (this.adapter.config.CalculatorList[channel].chName === undefined) { - this.adapter.config.CalculatorList[channel].chName = `Channel Name`; + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (channelConfig.chName === undefined) { + channelConfig.chName = `Channel Name`; } - const channelName = this.adapter.config.CalculatorList[channel].chName; - //#region *** setup calculations channels folder *** - const typeDesc: string = getCalcTypeDescription(this.adapter.config.CalculatorList[channel].chType); + //#region *** setup calculation channels folder *** + const typeDesc: string = getCalcTypeDescription(channelConfig.chType); await this.adapter.setObjectAsync(`Homes.${homeId}.Calculations.${channel}`, { type: "channel", common: { - name: channelName, + name: channelConfig.chName, desc: `type: ${typeDesc}`, }, native: {}, @@ -78,21 +94,21 @@ export class TibberCalculator extends TibberHelper { //#endregion //#region *** setup chActive state object for all channel types *** - if (this.adapter.config.CalculatorList[channel].chActive === undefined) { - this.adapter.config.CalculatorList[channel].chActive = false; + if (channelConfig.chActive === undefined) { + channelConfig.chActive = false; } - this.checkAndSetValueBoolean( - this.getStatePrefix(homeId, `Calculations.${channel}`, `Active`, channelName), - this.adapter.config.CalculatorList[channel].chActive, + void this.checkAndSetValueBoolean( + `Homes.${homeId}.Calculations.${channel}.Active`, + channelConfig.chActive, `Whether the calculation channel is active`, true, true, // set to false if adapter config from database should be used ); const valueActive = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.Active`); if (typeof valueActive === "boolean") { - this.adapter.config.CalculatorList[channel].chActive = valueActive; + channelConfig.chActive = valueActive; this.adapter.log.debug( - `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to Active: ${this.adapter.config.CalculatorList[channel].chActive}`, + `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to Active: ${channelConfig.chActive}`, ); } else { this.adapter.log.debug(`Wrong type for chActive: ${valueActive}`); @@ -105,7 +121,7 @@ export class TibberCalculator extends TibberHelper { "best single hours" | Input state: "AmountHours" | Output state: "Output" "best hours block" | Input state: "AmountHours" - | Output state: "Output", "AverageTotalCost", "BlockStartFullHour", "BlockEndFullHour" + | Output state: "Output", "AverageTotalCost", "BlockStartFullHour", "BlockEndFullHour", "BlockStart", "BlockEnd" "best cost LTF" | Input state: "TriggerPrice", "StartTime", "StopTime", "RepeatDays" | Output state: "Output" "best single hours LTF" | Input state: "AmountHours", "StartTime", "StopTime", "RepeatDays" @@ -115,93 +131,103 @@ export class TibberCalculator extends TibberHelper { "smart battery buffer" | Input state: "AmountHours", "EfficiencyLoss" | Output state: "Output", "Output2" */ - switch (this.adapter.config.CalculatorList[channel].chType) { + switch (channelConfig.chType) { case enCalcType.BestCost: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AmountHours`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StopTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `RepeatDays`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStopTime`).value); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AmountHours`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.RepeatDays`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AverageTotalCost`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStart`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStop`); await this.setup_chTriggerPrice(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; case enCalcType.BestSingleHours: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StopTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `RepeatDays`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStopTime`).value); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.RepeatDays`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AverageTotalCost`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStart`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStop`); await this.setup_chAmountHours(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; case enCalcType.BestHoursBlock: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StopTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `RepeatDays`).value); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.RepeatDays`); await this.setup_chAmountHours(homeId, channel); - await this.setup_chAverageTotalCost(homeId, channel); - await this.setup_chBlockStartFullHour(homeId, channel); - await this.setup_chBlockEndFullHour(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + this.setup_chAverageTotalCost(homeId, channel); + this.setup_chBlockStartFullHour(homeId, channel); + this.setup_chBlockEndFullHour(homeId, channel); + this.setup_chBlockStart(homeId, channel); + this.setup_chBlockEnd(homeId, channel); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; case enCalcType.BestCostLTF: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AmountHours`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStopTime`).value); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AmountHours`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AverageTotalCost`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStopTime`); await this.setup_chTriggerPrice(homeId, channel); await this.setup_chStartTime(homeId, channel); await this.setup_chStopTime(homeId, channel); await this.setup_chRepeatDays(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; case enCalcType.BestSingleHoursLTF: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStopTime`).value); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AverageTotalCost`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStopTime`); await this.setup_chAmountHours(homeId, channel); await this.setup_chStartTime(homeId, channel); await this.setup_chStopTime(homeId, channel); await this.setup_chRepeatDays(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; case enCalcType.BestHoursBlockLTF: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`).value); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); await this.setup_chAmountHours(homeId, channel); await this.setup_chStartTime(homeId, channel); await this.setup_chStopTime(homeId, channel); await this.setup_chRepeatDays(homeId, channel); - await this.setup_chAverageTotalCost(homeId, channel); - await this.setup_chBlockStartFullHour(homeId, channel); - await this.setup_chBlockEndFullHour(homeId, channel); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); // OUTPUTS + this.setup_chAverageTotalCost(homeId, channel); + this.setup_chBlockStartFullHour(homeId, channel); + this.setup_chBlockEndFullHour(homeId, channel); + this.setup_chBlockStart(homeId, channel); + this.setup_chBlockEnd(homeId, channel); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); // OUTPUTS await this.setup_chOutput(homeId, channel); break; case enCalcType.SmartBatteryBuffer: - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`).value); // INPUTS - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `StopTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `RepeatDays`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartTime`).value); - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStopTime`).value); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); // INPUTS + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.StopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.RepeatDays`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.AverageTotalCost`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStartTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStopTime`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStart`); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.BlockStop`); await this.setup_chAmountHours(homeId, channel); await this.setup_chEfficiencyLoss(homeId, channel); await this.setup_chOutput(homeId, channel); // OUTPUTS @@ -228,54 +254,54 @@ export class TibberCalculator extends TibberHelper { } private async setup_chOutput(homeId: string, channel: number): Promise { - if ( - this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive") - ) { - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output`).value); + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (channelConfig?.chTargetState && channelConfig.chTargetState.length > 10 && !channelConfig.chTargetState.startsWith("choose your state to drive")) { + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output`); } else { try { - this.checkAndSetValueBoolean( - this.getStatePrefix(homeId, `Calculations.${channel}`, `Output`), + void this.checkAndSetValueBoolean( + `Homes.${homeId}.Calculations.${channel}.Output`, false, `standard output if no special one selected in config`, true, true, ); } catch (error) { - this.adapter.log.warn(this.generateErrorMessage(error, `setup of state Output for calculator`)); + this.adapter.log.warn(this.generateErrorMessage(error, `setup of state Output for calculator for Home ${homeId}, Channel ${channel}`)); } } } private async setup_chOutput2(homeId: string, channel: number): Promise { + const channelConfig = this.adapter.config.CalculatorList[channel]; if ( - this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive") + channelConfig?.chTargetState2 && + channelConfig.chTargetState2.length > 10 && + !channelConfig.chTargetState2.startsWith("choose your state to drive") ) { - this.adapter.delObjectAsync(this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`).value); + await this.adapter.delObjectAsync(`Homes.${homeId}.Calculations.${channel}.Output2`); } else { try { - this.checkAndSetValueBoolean( - this.getStatePrefix(homeId, `Calculations.${channel}`, `Output2`), + void this.checkAndSetValueBoolean( + `Homes.${homeId}.Calculations.${channel}.Output2`, false, - `standard output if no special one selected in config`, + `standard output2 if no special one selected in config`, true, true, ); } catch (error) { - this.adapter.log.warn(this.generateErrorMessage(error, `setup of state Output2 for calculator`)); + this.adapter.log.warn(this.generateErrorMessage(error, `setup of state Output2 for calculator for Home ${homeId}, Channel ${channel}`)); } } } private async setup_chTriggerPrice(homeId: string, channel: number): Promise { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; - if (this.adapter.config.CalculatorList[channel].chTriggerPrice === undefined) { - this.adapter.config.CalculatorList[channel].chTriggerPrice = 0; + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (channelConfig.chTriggerPrice === undefined) { + channelConfig.chTriggerPrice = 0; } - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, `Calculations.${channel}`, `TriggerPrice`), - this.adapter.config.CalculatorList[channel].chTriggerPrice, + void this.checkAndSetValueNumber( + `Homes.${homeId}.Calculations.${channel}.TriggerPrice`, + channelConfig.chTriggerPrice, `pricelevel to trigger this channel at`, undefined, true, @@ -283,9 +309,9 @@ export class TibberCalculator extends TibberHelper { ); const valueTriggerPrice = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.TriggerPrice`); if (typeof valueTriggerPrice === "number") { - this.adapter.config.CalculatorList[channel].chTriggerPrice = valueTriggerPrice; + channelConfig.chTriggerPrice = valueTriggerPrice; this.adapter.log.debug( - `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to TriggerPrice: ${this.adapter.config.CalculatorList[channel].chTriggerPrice}`, + `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to TriggerPrice: ${channelConfig.chTriggerPrice}`, ); } else { this.adapter.log.debug(`Wrong type for chTriggerPrice: ${valueTriggerPrice}`); @@ -296,14 +322,14 @@ export class TibberCalculator extends TibberHelper { } private async setup_chAmountHours(homeId: string, channel: number): Promise { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; + const channelConfig = this.adapter.config.CalculatorList[channel]; //*** chAmountHours *** - if (this.adapter.config.CalculatorList[channel].chAmountHours === undefined) { - this.adapter.config.CalculatorList[channel].chAmountHours = 0; + if (channelConfig.chAmountHours === undefined) { + channelConfig.chAmountHours = 0; } - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, `Calculations.${channel}`, `AmountHours`), - this.adapter.config.CalculatorList[channel].chAmountHours, + void this.checkAndSetValueNumber( + `Homes.${homeId}.Calculations.${channel}.AmountHours`, + channelConfig.chAmountHours, `amount of hours to trigger this channel`, undefined, true, @@ -311,9 +337,9 @@ export class TibberCalculator extends TibberHelper { ); const valueAmountHours = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.AmountHours`); if (typeof valueAmountHours === "number") { - this.adapter.config.CalculatorList[channel].chAmountHours = valueAmountHours; + channelConfig.chAmountHours = valueAmountHours; this.adapter.log.debug( - `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to AmountHours: ${this.adapter.config.CalculatorList[channel].chAmountHours}`, + `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to AmountHours: ${channelConfig.chAmountHours}`, ); } else { this.adapter.log.debug(`Wrong type for chAmountHours: ${valueAmountHours}`); @@ -324,25 +350,25 @@ export class TibberCalculator extends TibberHelper { } private async setup_chStartTime(homeId: string, channel: number): Promise { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; + const channelConfig = this.adapter.config.CalculatorList[channel]; //*** chStartTime *** - if (this.adapter.config.CalculatorList[channel].chStartTime === undefined) { + if (channelConfig.chStartTime === undefined) { const today = new Date(); today.setHours(0, 0, 0, 0); // sets clock to 0:00 - this.adapter.config.CalculatorList[channel].chStartTime = today; + channelConfig.chStartTime = today; } - this.checkAndSetValue( - this.getStatePrefix(homeId, `Calculations.${channel}`, `StartTime`), - this.adapter.config.CalculatorList[channel].chStartTime.toISOString(), + void this.checkAndSetValue( + `Homes.${homeId}.Calculations.${channel}.StartTime`, + channelConfig.chStartTime.toISOString(), `Start time for this channel`, true, true, ); const valueStartTime = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.StartTime`); if (typeof valueStartTime === "string") { - this.adapter.config.CalculatorList[channel].chStartTime.setTime(Date.parse(valueStartTime)); + channelConfig.chStartTime.setTime(Date.parse(valueStartTime)); this.adapter.log.debug( - `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to StartTime: ${this.adapter.config.CalculatorList[channel].chStartTime}`, + `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to StartTime: ${channelConfig.chStartTime.toISOString()}`, ); } else { this.adapter.log.debug(`Wrong type for chStartTime: ${valueStartTime}`); @@ -353,25 +379,25 @@ export class TibberCalculator extends TibberHelper { } private async setup_chStopTime(homeId: string, channel: number): Promise { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; + const channelConfig = this.adapter.config.CalculatorList[channel]; //*** chStopTime *** - if (this.adapter.config.CalculatorList[channel].chStopTime === undefined) { + if (channelConfig.chStopTime === undefined) { const today = new Date(); today.setHours(23, 59, 0, 0); // sets clock to 0:00 - this.adapter.config.CalculatorList[channel].chStopTime = today; + channelConfig.chStopTime = today; } - this.checkAndSetValue( - this.getStatePrefix(homeId, `Calculations.${channel}`, `StopTime`), - this.adapter.config.CalculatorList[channel].chStopTime.toISOString(), + void this.checkAndSetValue( + `Homes.${homeId}.Calculations.${channel}.StopTime`, + channelConfig.chStopTime.toISOString(), `Stop time for this channel`, true, true, ); const valueStopTime = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.StopTime`); if (typeof valueStopTime === "string") { - this.adapter.config.CalculatorList[channel].chStopTime.setTime(Date.parse(valueStopTime)); + channelConfig.chStopTime.setTime(Date.parse(valueStopTime)); this.adapter.log.debug( - `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to StopTime: ${this.adapter.config.CalculatorList[channel].chStopTime}`, + `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to StopTime: ${channelConfig.chStopTime.toISOString()}`, ); } else { this.adapter.log.debug(`Wrong type for chStopTime: ${valueStopTime}`); @@ -382,14 +408,14 @@ export class TibberCalculator extends TibberHelper { } private async setup_chRepeatDays(homeId: string, channel: number): Promise { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; + const channelConfig = this.adapter.config.CalculatorList[channel]; //*** chRepeatDays *** - if (this.adapter.config.CalculatorList[channel].chRepeatDays === undefined) { - this.adapter.config.CalculatorList[channel].chRepeatDays = 0; + if (channelConfig.chRepeatDays === undefined) { + channelConfig.chRepeatDays = 0; } - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, `Calculations.${channel}`, `RepeatDays`), - this.adapter.config.CalculatorList[channel].chRepeatDays, + void this.checkAndSetValueNumber( + `Homes.${homeId}.Calculations.${channel}.RepeatDays`, + channelConfig.chRepeatDays, `number of days to shift this LTF channel for repetition`, undefined, true, @@ -397,9 +423,9 @@ export class TibberCalculator extends TibberHelper { ); const valueRepeatDays = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.RepeatDays`); if (typeof valueRepeatDays === "number") { - this.adapter.config.CalculatorList[channel].chRepeatDays = valueRepeatDays; + channelConfig.chRepeatDays = valueRepeatDays; this.adapter.log.debug( - `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to RepeatDays: ${this.adapter.config.CalculatorList[channel].chRepeatDays}`, + `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to RepeatDays: ${channelConfig.chRepeatDays}`, ); } else { this.adapter.log.debug(`Wrong type for chTriggerPrice: ${valueRepeatDays}`); @@ -410,14 +436,14 @@ export class TibberCalculator extends TibberHelper { } private async setup_chEfficiencyLoss(homeId: string, channel: number): Promise { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; + const channelConfig = this.adapter.config.CalculatorList[channel]; //*** chEfficiencyLoss *** - if (this.adapter.config.CalculatorList[channel].chEfficiencyLoss === undefined) { - this.adapter.config.CalculatorList[channel].chEfficiencyLoss = 0; + if (channelConfig.chEfficiencyLoss === undefined) { + channelConfig.chEfficiencyLoss = 0; } - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, `Calculations.${channel}`, `EfficiencyLoss`), - this.adapter.config.CalculatorList[channel].chEfficiencyLoss, + void this.checkAndSetValueNumber( + `Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`, + channelConfig.chEfficiencyLoss, `efficiency loss between charge and discharge of battery system`, undefined, true, @@ -425,9 +451,9 @@ export class TibberCalculator extends TibberHelper { ); const valueEfficiencyLoss = await this.getStateValue(`Homes.${homeId}.Calculations.${channel}.EfficiencyLoss`); if (typeof valueEfficiencyLoss === "number") { - this.adapter.config.CalculatorList[channel].chAmountHours = valueEfficiencyLoss; + channelConfig.chAmountHours = valueEfficiencyLoss; this.adapter.log.debug( - `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelName} - set to EfficiencyLoss: ${this.adapter.config.CalculatorList[channel].chEfficiencyLoss}`, + `setup calculator settings state in home: ${homeId} - channel: ${channel}-${channelConfig.chName} - set to EfficiencyLoss: ${channelConfig.chEfficiencyLoss}`, ); } else { this.adapter.log.debug(`Wrong type for chEfficiencyLoss: ${valueEfficiencyLoss}`); @@ -436,55 +462,77 @@ export class TibberCalculator extends TibberHelper { this.adapter.log.warn(this.generateErrorMessage(error, `setup of state EfficiencyLoss for calculator`)); } } - private async setup_chAverageTotalCost(homeId: string, channel: number): Promise { + private setup_chAverageTotalCost(homeId: string, channel: number): void { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; - this.checkAndSetValueNumber( - this.getStatePrefix(homeId, `Calculations.${channel}`, `AverageTotalCost`), + const channelConfig = this.adapter.config.CalculatorList[channel]; + void this.checkAndSetValueNumber( + `Homes.${homeId}.Calculations.${channel}.AverageTotalCost`, 0, `average total cost in determined block`, undefined, false, false, ); - this.adapter.log.debug(`setup calculator output state AverageTotalCost in home: ${homeId} - channel: ${channel}-${channelName}`); + this.adapter.log.debug(`setup calculator output state AverageTotalCost in home: ${homeId} - channel: ${channel}-${channelConfig.chName}`); } catch (error) { this.adapter.log.warn(this.generateErrorMessage(error, `setup of state AverageTotalCost for calculator`)); } } - private async setup_chBlockStartFullHour(homeId: string, channel: number, delMode: boolean = false): Promise { + private setup_chBlockStartFullHour(homeId: string, channel: number, delMode = false): void { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; - this.checkAndSetValue( - this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockStartFullHour`), - `-`, - `first hour of determined block`, - false, - false, - ); - if (!delMode) this.adapter.log.debug(`setup calculator output state BlockStartFullHour in home: ${homeId} - channel: ${channel}-${channelName}`); + const channelConfig = this.adapter.config.CalculatorList[channel]; + void this.checkAndSetValue(`Homes.${homeId}.Calculations.${channel}.BlockStartFullHour`, `-`, `first hour of determined block`, false, false); + if (!delMode) { + this.adapter.log.debug(`setup calculator output state BlockStartFullHour in home: ${homeId} - channel: ${channel}-${channelConfig.chName}`); + } } catch (error) { this.adapter.log.warn(this.generateErrorMessage(error, `write state BlockStartFullHour for calculator`)); } } - private async setup_chBlockEndFullHour(homeId: string, channel: number, delMode: boolean = false): Promise { + private setup_chBlockEndFullHour(homeId: string, channel: number, delMode = false): void { try { - const channelName = this.adapter.config.CalculatorList[channel].chName; - this.checkAndSetValue( - this.getStatePrefix(homeId, `Calculations.${channel}`, `BlockEndFullHour`), - `-`, - `end hour of determined block`, - false, - false, - ); - if (!delMode) this.adapter.log.debug(`setup calculator output state BlockEndFullHour in home: ${homeId} - channel: ${channel}-${channelName}`); + const channelConfig = this.adapter.config.CalculatorList[channel]; + void this.checkAndSetValue(`Homes.${homeId}.Calculations.${channel}.BlockEndFullHour`, `-`, `end hour of determined block`, false, false); + if (!delMode) { + this.adapter.log.debug(`setup calculator output state BlockEndFullHour in home: ${homeId} - channel: ${channel}-${channelConfig.chName}`); + } } catch (error) { this.adapter.log.warn(this.generateErrorMessage(error, `write state BlockEndFullHour for calculator`)); } } + private setup_chBlockStart(homeId: string, channel: number, delMode = false): void { + try { + const channelConfig = this.adapter.config.CalculatorList[channel]; + void this.checkAndSetValue(`Homes.${homeId}.Calculations.${channel}.BlockStart`, `-`, `start date string of determined block`, false, false); + if (!delMode) { + this.adapter.log.debug(`setup calculator output state BlockStart in home: ${homeId} - channel: ${channel}-${channelConfig.chName}`); + } + } catch (error) { + this.adapter.log.warn(this.generateErrorMessage(error, `write state BlockStart for calculator`)); + } + } + private setup_chBlockEnd(homeId: string, channel: number, delMode = false): void { + try { + const channelConfig = this.adapter.config.CalculatorList[channel]; + void this.checkAndSetValue(`Homes.${homeId}.Calculations.${channel}.BlockEnd`, `-`, `stop date string of determined block`, false, false); + if (!delMode) { + this.adapter.log.debug(`setup calculator output state BlockEnd in home: ${homeId} - channel: ${channel}-${channelConfig.chName}`); + } + } catch (error) { + this.adapter.log.warn(this.generateErrorMessage(error, `write state BlockEnd for calculator`)); + } + } - async startCalculatorTasks(onStateChange: boolean = false, firstRun: boolean = false): Promise { - if (!this.adapter.config.UseCalculator) return; + /** + * startCalculatorTasks + * + * @param onStateChange - Optional onStateChange mode (default = false) + * @param firstRun - Optional firstRun mode (default = false) + */ + startCalculatorTasks(onStateChange = false, firstRun = false): Promise { + if (!this.adapter.config.UseCalculator) { + return; + } const badComponents = ["tibberlink", "Homes", "Calculations"]; // we must not use an input as output!! @@ -508,8 +556,10 @@ export class TibberCalculator extends TibberHelper { ) { const chTargetStateComponents = this.adapter.config.CalculatorList[channel].chTargetState.split("."); let foundAllBadComponents = true; - badComponents.forEach((badComponent) => { - if (!chTargetStateComponents.includes(badComponent)) foundAllBadComponents = false; + badComponents.forEach(badComponent => { + if (!chTargetStateComponents.includes(badComponent)) { + foundAllBadComponents = false; + } }); if (foundAllBadComponents) { this.adapter.log.error( @@ -522,6 +572,7 @@ export class TibberCalculator extends TibberHelper { continue; // skip channel } + //checks for SmartBatteryBuffer only... if (this.adapter.config.CalculatorList[channel].chType === enCalcType.SmartBatteryBuffer) { if ( !this.adapter.config.CalculatorList[channel] || @@ -529,7 +580,7 @@ export class TibberCalculator extends TibberHelper { !this.adapter.config.CalculatorList[channel].chTargetState2.trim() ) { this.adapter.log.warn( - `Empty second destination state in calculator channel ${channel} defined - provide correct external state 2 - channel will use internal state OUTPUT2`, + `Empty second destination state in calculator channel ${channel} defined - provide correct external state 2 - upon this, channel will use internal state OUTPUT2`, ); } @@ -540,8 +591,10 @@ export class TibberCalculator extends TibberHelper { ) { const chTargetState2Components = this.adapter.config.CalculatorList[channel].chTargetState2.split("."); let foundAllBadComponents = true; - badComponents.forEach((badComponent) => { - if (!chTargetState2Components.includes(badComponent)) foundAllBadComponents = false; + badComponents.forEach(badComponent => { + if (!chTargetState2Components.includes(badComponent)) { + foundAllBadComponents = false; + } }); if (foundAllBadComponents) { this.adapter.log.error( @@ -553,34 +606,45 @@ export class TibberCalculator extends TibberHelper { this.adapter.log.debug(`chTargetState2 is null or undefined in calculator channel ${channel}. Skipping channel execution.`); continue; // skip channel } + if ( + this.adapter.config.CalculatorList[channel].chValueOn2 == null || + this.adapter.config.CalculatorList[channel].chValueOn2 === "" || + this.adapter.config.CalculatorList[channel].chValueOff2 == null || + this.adapter.config.CalculatorList[channel].chValueOff2 === "" + ) { + this.adapter.log.error( + `"Value YES 2" or "Value NO 2" is null or undefined in calculator channel ${channel}. Please provide usable values in config.`, + ); + continue; // skip channel + } } } - //#endregion first run mode + //#endregion first run checks try { if (this.adapter.config.CalculatorList[channel].chActive || onStateChange) { - // If Active=false been set just now - or still active then act - else just produce debug log in the following runs + // If Active=false been set just now - or still active then act - else just produce debug log in the following runs switch (this.adapter.config.CalculatorList[channel].chType) { case enCalcType.BestCost: - this.executeCalculatorBestCost(parseInt(channel)); + void this.executeCalculatorBestCost(parseInt(channel)); break; case enCalcType.BestSingleHours: - this.executeCalculatorBestSingleHours(parseInt(channel)); + void this.executeCalculatorBestSingleHours(parseInt(channel)); break; case enCalcType.BestHoursBlock: - this.executeCalculatorBestHoursBlock(parseInt(channel)); + void this.executeCalculatorBestHoursBlock(parseInt(channel)); break; case enCalcType.BestCostLTF: - this.executeCalculatorBestCost(parseInt(channel), true); + void this.executeCalculatorBestCost(parseInt(channel), true); break; case enCalcType.BestSingleHoursLTF: - this.executeCalculatorBestSingleHours(parseInt(channel), true); + void this.executeCalculatorBestSingleHours(parseInt(channel), true); break; case enCalcType.BestHoursBlockLTF: - this.executeCalculatorBestHoursBlock(parseInt(channel), true); + void this.executeCalculatorBestHoursBlock(parseInt(channel), true); break; case enCalcType.SmartBatteryBuffer: - this.executeCalculatorSmartBatteryBuffer(parseInt(channel)); + void this.executeCalculatorSmartBatteryBuffer(parseInt(channel)); break; default: this.adapter.log.debug(`unknown value for calculator type: ${this.adapter.config.CalculatorList[channel].chType}`); @@ -590,78 +654,82 @@ export class TibberCalculator extends TibberHelper { `calculator channel: ${channel} - ${getCalcTypeDescription(this.adapter.config.CalculatorList[channel].chType)}; execution skipped because channel not set to active in channel states`, ); } - } catch (error: any) { - this.adapter.log.warn(`unhandled error execute calculator channel ${channel}`); + } catch (error) { + this.adapter.log.warn(`unhandled error ${error} while executing calculator channel ${channel}`); } } } - async updateCalculatorUsageStats(): Promise { - if (!this.adapter.config.UseCalculator) return; - this.initStats; + /** + * updateCalculatorUsageStats + */ + updateCalculatorUsageStats(): void { + if (!this.adapter.config.UseCalculator) { + return; + } + this.initStats(); for (const channel in this.adapter.config.CalculatorList) { try { this.increaseStatsValueByOne(this.adapter.config.CalculatorList[channel].chType); - } catch (error: any) { - this.adapter.log.debug(`unhandled error in calculator channel ${channel} scan`); + } catch (error) { + this.adapter.log.debug(`unhandled error ${error} in calculator usage scan for channel ${channel}`); } } } - private async executeCalculatorBestCost(channel: number, modeLTF: boolean = false): Promise { + private async executeCalculatorBestCost(channel: number, modeLTF = false): Promise { try { - let valueToSet: string = ""; + let valueToSet = ""; const now = new Date(); - if (!this.adapter.config.CalculatorList[channel].chActive) { + const channelConfig = this.adapter.config.CalculatorList[channel]; + + if (!channelConfig.chActive) { // not active - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - } else if (modeLTF && now < this.adapter.config.CalculatorList[channel].chStartTime) { + valueToSet = channelConfig.chValueOff; + } else if (modeLTF && now < channelConfig.chStartTime) { // chActive but before LTF - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - } else if (modeLTF && now > this.adapter.config.CalculatorList[channel].chStopTime) { + valueToSet = channelConfig.chValueOff; + } else if (modeLTF && now > channelConfig.chStopTime) { // chActive but after LTF - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - if (this.adapter.config.CalculatorList[channel].chRepeatDays == 0) { + valueToSet = channelConfig.chValueOff; + if (channelConfig.chRepeatDays == 0) { // no repeating planned - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Active`, false, true); + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.Active`, false, true); } else { - this.adapter.setStateAsync( - `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StartTime`, - format( - addDays(this.adapter.config.CalculatorList[channel].chStartTime, this.adapter.config.CalculatorList[channel].chRepeatDays), - "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", - ), + void this.adapter.setState( + `Homes.${channelConfig.chHomeID}.Calculations.${channel}.StartTime`, + format(addDays(channelConfig.chStartTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true, ); - this.adapter.setStateAsync( - `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StopTime`, - format( - addDays(this.adapter.config.CalculatorList[channel].chStopTime, this.adapter.config.CalculatorList[channel].chRepeatDays), - "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", - ), + channelConfig.chStartTime = addDays(channelConfig.chStartTime, channelConfig.chRepeatDays); + void this.adapter.setState( + `Homes.${channelConfig.chHomeID}.Calculations.${channel}.StopTime`, + format(addDays(channelConfig.chStopTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true, ); + channelConfig.chStopTime = addDays(channelConfig.chStopTime, channelConfig.chRepeatDays); } } else { // chActive and inside LTF -> choose desired value - const currentPrice = await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.CurrentPrice.total`); - if (this.adapter.config.CalculatorList[channel].chTriggerPrice > currentPrice) { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOn; + const currentPrice = await this.getStateValue(`Homes.${channelConfig.chHomeID}.CurrentPrice.total`); + if (channelConfig.chTriggerPrice > currentPrice) { + valueToSet = channelConfig.chValueOn; } else { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; + valueToSet = channelConfig.chValueOff; } } //set value to foreign state, if defined - let sOutState: string = ""; + let sOutState = ""; if ( - this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive") + channelConfig?.chTargetState && + channelConfig.chTargetState.length > 10 && + !channelConfig.chTargetState.startsWith("choose your state to drive") ) { - sOutState = this.adapter.config.CalculatorList[channel].chTargetState; - this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); + sOutState = channelConfig.chTargetState; + void this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); } else { - sOutState = `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Output`; - this.adapter.setStateAsync(sOutState, convertValue(valueToSet), true); + sOutState = `Homes.${channelConfig.chHomeID}.Calculations.${channel}.Output`; + void this.adapter.setState(sOutState, convertValue(valueToSet), true); } this.adapter.log.debug(`calculator channel: ${channel} - best price ${modeLTF ? "LTF" : ""}; setting state: ${sOutState} to ${valueToSet}`); } catch (error) { @@ -669,90 +737,94 @@ export class TibberCalculator extends TibberHelper { } } - private async executeCalculatorBestSingleHours(channel: number, modeLTF: boolean = false): Promise { + private async executeCalculatorBestSingleHours(channel: number, modeLTF = false): Promise { try { - let valueToSet: string = ""; + let valueToSet = ""; const now = new Date(); - if (!this.adapter.config.CalculatorList[channel].chActive) { + const channelConfig = this.adapter.config.CalculatorList[channel]; + + if (!channelConfig.chActive) { // not active -> choose chValueOff - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - } else if (modeLTF && now < this.adapter.config.CalculatorList[channel].chStartTime) { + valueToSet = channelConfig.chValueOff; + } else if (modeLTF && now < channelConfig.chStartTime) { // chActive but before LTF -> choose chValueOff - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - } else if (modeLTF && now > this.adapter.config.CalculatorList[channel].chStopTime) { + valueToSet = channelConfig.chValueOff; + } else if (modeLTF && now > channelConfig.chStopTime) { // chActive, modeLTF but after LTF -> choose chValueOff and disable channel - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - if (this.adapter.config.CalculatorList[channel].chRepeatDays == 0) { - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Active`, false, true); + valueToSet = channelConfig.chValueOff; + if (channelConfig.chRepeatDays == 0) { + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.Active`, false, true); } else { // chRepeatDays present, change start and stop time accordingly - this.adapter.setStateAsync( - `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StartTime`, - format( - addDays(this.adapter.config.CalculatorList[channel].chStartTime, this.adapter.config.CalculatorList[channel].chRepeatDays), - "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", - ), + void this.adapter.setState( + `Homes.${channelConfig.chHomeID}.Calculations.${channel}.StartTime`, + format(addDays(channelConfig.chStartTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true, ); - this.adapter.setStateAsync( - `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StopTime`, - format( - addDays(this.adapter.config.CalculatorList[channel].chStopTime, this.adapter.config.CalculatorList[channel].chRepeatDays), - "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", - ), + channelConfig.chStartTime = addDays(channelConfig.chStartTime, channelConfig.chRepeatDays); + void this.adapter.setState( + `Homes.${channelConfig.chHomeID}.Calculations.${channel}.StopTime`, + format(addDays(channelConfig.chStopTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true, ); + channelConfig.chStopTime = addDays(channelConfig.chStopTime, channelConfig.chRepeatDays); } } else { - // chActive -> choose desired value - const pricesToday: IPrice[] = JSON.parse( - await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.PricesToday.jsonBYpriceASC`), - ); - + // chActive and inside LTF -> choose desired value + const pricesToday: IPrice[] = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesToday.json`)); let filteredPrices: IPrice[] = pricesToday; if (modeLTF) { // Limited Time Frame mode - const pricesTomorrow: IPrice[] = JSON.parse( - await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.PricesTomorrow.json`), - ); - const startTime: Date = this.adapter.config.CalculatorList[channel].chStartTime; - const stopTime: Date = this.adapter.config.CalculatorList[channel].chStopTime; + const pricesTomorrow: IPrice[] = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesTomorrow.json`)); + //WiP 600 + const pricesYesterday: IPrice[] = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesYesterday.json`)); + //WiP 600 + const startTime: Date = channelConfig.chStartTime; + const stopTime: Date = channelConfig.chStopTime; // Merge prices if pricesTomorrow is not empty let mergedPrices: IPrice[] = pricesToday; if (pricesTomorrow.length !== 0) { mergedPrices = [...pricesToday, ...pricesTomorrow]; } + //WiP 600 + if (pricesYesterday.length !== 0) { + mergedPrices = [...pricesYesterday, ...mergedPrices]; + } + //WiP 600 // filter objects to time frame - filteredPrices = mergedPrices.filter((price) => { + filteredPrices = mergedPrices.filter(price => { const priceDate = new Date(price.startsAt); return priceDate >= startTime && priceDate < stopTime; }); } + //WIP + filteredPrices.sort((a, b) => a.total - b.total); // get first n entries und test for matching hour - const n = this.adapter.config.CalculatorList[channel].chAmountHours; + const n = channelConfig.chAmountHours; const result: boolean[] = filteredPrices.slice(0, n).map((entry: IPrice) => checkHourMatch(entry)); // identify if any element is true - if (result.some((value) => value)) { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOn; + if (result.some(value => value)) { + valueToSet = channelConfig.chValueOn; } else { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; + valueToSet = channelConfig.chValueOff; } } //set value to foreign state, if defined - let sOutState: string = ""; + let sOutState = ""; if ( - this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive") + channelConfig?.chTargetState && + channelConfig.chTargetState.length > 10 && + !channelConfig.chTargetState.startsWith("choose your state to drive") ) { - sOutState = this.adapter.config.CalculatorList[channel].chTargetState; - this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); + sOutState = channelConfig.chTargetState; + void this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); } else { - sOutState = `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Output`; - this.adapter.setStateAsync(sOutState, convertValue(valueToSet), true); + sOutState = `Homes.${channelConfig.chHomeID}.Calculations.${channel}.Output`; + void this.adapter.setState(sOutState, convertValue(valueToSet), true); } this.adapter.log.debug(`calculator channel: ${channel} - best single hours ${modeLTF ? "LTF" : ""}; setting state: ${sOutState} to ${valueToSet}`); } catch (error) { @@ -760,74 +832,82 @@ export class TibberCalculator extends TibberHelper { } } - private async executeCalculatorBestHoursBlock(channel: number, modeLTF: boolean = false): Promise { + private async executeCalculatorBestHoursBlock(channel: number, modeLTF = false): Promise { try { - let valueToSet: string = ""; + let valueToSet = ""; const now = new Date(); - if (!this.adapter.config.CalculatorList[channel].chActive) { + const channelConfig = this.adapter.config.CalculatorList[channel]; + if (!channelConfig.chActive) { // not active -> choose chValueOff - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - this.setup_chBlockStartFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); - this.setup_chBlockEndFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); - } else if (modeLTF && now < this.adapter.config.CalculatorList[channel].chStartTime) { + valueToSet = channelConfig.chValueOff; + this.setup_chBlockStartFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockEndFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockStart(channelConfig.chHomeID, channel, true); + this.setup_chBlockEnd(channelConfig.chHomeID, channel, true); + } else if (modeLTF && now < channelConfig.chStartTime) { // chActive but before LTF -> choose chValueOff - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - this.setup_chBlockStartFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); - this.setup_chBlockEndFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); - } else if (modeLTF && now > this.adapter.config.CalculatorList[channel].chStopTime) { + valueToSet = channelConfig.chValueOff; + this.setup_chBlockStartFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockEndFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockStart(channelConfig.chHomeID, channel, true); + this.setup_chBlockEnd(channelConfig.chHomeID, channel, true); + } else if (modeLTF && now > channelConfig.chStopTime) { // chActive but after LTF -> choose chValueOff and disable channel or generate new running period - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - this.setup_chBlockStartFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); - this.setup_chBlockEndFullHour(this.adapter.config.CalculatorList[channel].chHomeID, channel, true); - if (this.adapter.config.CalculatorList[channel].chRepeatDays == 0) { - this.adapter.setStateAsync(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Active`, false, true); + valueToSet = channelConfig.chValueOff; + this.setup_chBlockStartFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockEndFullHour(channelConfig.chHomeID, channel, true); + this.setup_chBlockStart(channelConfig.chHomeID, channel, true); + this.setup_chBlockEnd(channelConfig.chHomeID, channel, true); + if (channelConfig.chRepeatDays == 0) { + void this.adapter.setState(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.Active`, false, true); } else { - this.adapter.setStateAsync( - `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StartTime`, - format( - addDays(this.adapter.config.CalculatorList[channel].chStartTime, this.adapter.config.CalculatorList[channel].chRepeatDays), - "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", - ), + void this.adapter.setState( + `Homes.${channelConfig.chHomeID}.Calculations.${channel}.StartTime`, + format(addDays(channelConfig.chStartTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true, ); - this.adapter.setStateAsync( - `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.StopTime`, - format( - addDays(this.adapter.config.CalculatorList[channel].chStopTime, this.adapter.config.CalculatorList[channel].chRepeatDays), - "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", - ), + channelConfig.chStartTime = addDays(channelConfig.chStartTime, channelConfig.chRepeatDays); + void this.adapter.setState( + `Homes.${channelConfig.chHomeID}.Calculations.${channel}.StopTime`, + format(addDays(channelConfig.chStopTime, channelConfig.chRepeatDays), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true, ); + channelConfig.chStopTime = addDays(channelConfig.chStopTime, channelConfig.chRepeatDays); } } else { - const pricesToday: IPrice[] = JSON.parse( - await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.PricesToday.json`), - ); - + // chActive and inside LTF -> choose desired value + const pricesToday: IPrice[] = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesToday.json`)); let filteredPrices: IPrice[] = pricesToday; if (modeLTF) { // Limited Time Frame mode, modify filteredPrices accordingly - const pricesTomorrow: IPrice[] = JSON.parse( - await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.PricesTomorrow.json`), - ); - const startTime: Date = this.adapter.config.CalculatorList[channel].chStartTime; - const stopTime: Date = this.adapter.config.CalculatorList[channel].chStopTime; + const pricesTomorrow: IPrice[] = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesTomorrow.json`)); + //WiP 600 + const pricesYesterday: IPrice[] = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesYesterday.json`)); + //WiP 600 + const startTime: Date = channelConfig.chStartTime; + const stopTime: Date = channelConfig.chStopTime; // Merge prices if pricesTomorrow is not empty let mergedPrices: IPrice[] = pricesToday; if (pricesTomorrow.length !== 0) { mergedPrices = [...pricesToday, ...pricesTomorrow]; } + //WiP 600 + if (pricesYesterday.length !== 0) { + mergedPrices = [...pricesYesterday, ...mergedPrices]; + } + //WiP 600 // filter objects to time frame - filteredPrices = mergedPrices.filter((price) => { + filteredPrices = mergedPrices.filter(price => { const priceDate = new Date(price.startsAt); return priceDate >= startTime && priceDate < stopTime; }); } + //#region *** Find cheapest block *** let minSum = Number.MAX_VALUE; let startIndex = 0; - const n = Math.min(this.adapter.config.CalculatorList[channel].chAmountHours, filteredPrices.length); + const n = Math.min(channelConfig.chAmountHours, filteredPrices.length); for (let i = 0; i < filteredPrices.length - n + 1; i++) { let sum = 0; @@ -841,52 +921,70 @@ export class TibberCalculator extends TibberHelper { } const minSumEntries: boolean[] = filteredPrices.slice(startIndex, startIndex + n).map((entry: IPrice) => checkHourMatch(entry)); // identify if any element is true - if (minSumEntries.some((value) => value)) { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOn; + if (minSumEntries.some(value => value)) { + valueToSet = channelConfig.chValueOn; } else { - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; + valueToSet = channelConfig.chValueOff; } + //#endregion // calculate average cost of determined block of hours, write to data point - this.checkAndSetValueNumber( - this.getStatePrefix(this.adapter.config.CalculatorList[channel].chHomeID, `Calculations.${channel}`, `AverageTotalCost`), + void this.checkAndSetValueNumber( + `Homes.${channelConfig.chHomeID}.Calculations.${channel}.AverageTotalCost`, Math.round(1000 * (minSum / n)) / 1000, `average total cost in determined block`, undefined, false, false, ); - // write start and stop time of determined block to data points + //#region *** Write start and stop time of determined block to data points *** const beginDate = new Date(filteredPrices[startIndex].startsAt); - const endDate = new Date(filteredPrices[startIndex + n - 1].startsAt); - this.checkAndSetValue( - this.getStatePrefix(this.adapter.config.CalculatorList[channel].chHomeID, `Calculations.${channel}`, `BlockStartFullHour`), + void this.checkAndSetValue( + `Homes.${channelConfig.chHomeID}.Calculations.${channel}.BlockStartFullHour`, format(beginDate, "H"), `first hour of determined block`, false, false, ); - this.checkAndSetValue( - this.getStatePrefix(this.adapter.config.CalculatorList[channel].chHomeID, `Calculations.${channel}`, `BlockEndFullHour`), + void this.checkAndSetValue( + `Homes.${channelConfig.chHomeID}.Calculations.${channel}.BlockStart`, + filteredPrices[startIndex].startsAt, + `start date string of determined block`, + false, + false, + ); + const endDate = new Date(filteredPrices[startIndex + n - 1].startsAt); + void this.checkAndSetValue( + `Homes.${channelConfig.chHomeID}.Calculations.${channel}.BlockEndFullHour`, format(addHours(endDate, 1), "H"), `end hour of determined block`, false, false, ); + void this.checkAndSetValue( + `Homes.${channelConfig.chHomeID}.Calculations.${channel}.BlockEnd`, + filteredPrices[startIndex + n].startsAt, + `stop date string of determined block`, + false, + false, + ); + //#endregion } - //set value to foreign state, if defined - let sOutState: string = ""; + //#region *** set value to foreign state, if defined, or use internal Output *** + let sOutState = ""; if ( - this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive") + channelConfig?.chTargetState && + channelConfig.chTargetState.length > 10 && + !channelConfig.chTargetState.startsWith("choose your state to drive") ) { - sOutState = this.adapter.config.CalculatorList[channel].chTargetState; - this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); + sOutState = channelConfig.chTargetState; + void this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); } else { - sOutState = `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Output`; - this.adapter.setStateAsync(sOutState, convertValue(valueToSet), true); + sOutState = `Homes.${channelConfig.chHomeID}.Calculations.${channel}.Output`; + void this.adapter.setState(sOutState, convertValue(valueToSet), true); } this.adapter.log.debug(`calculator channel: ${channel} - best hours block ${modeLTF ? "LTF" : ""}; setting state: ${sOutState} to ${valueToSet}`); + //#endregion } catch (error) { this.adapter.log.warn(this.generateErrorMessage(error, `execute calculator for best hours block ${modeLTF ? "LTF " : ""}in channel ${channel}`)); } @@ -924,23 +1022,19 @@ export class TibberCalculator extends TibberHelper { */ //#endregion try { - let valueToSet: string = ""; - let valueToSet2: string = ""; - if (!this.adapter.config.CalculatorList[channel].chActive) { + let valueToSet = ""; + let valueToSet2 = ""; + const channelConfig = this.adapter.config.CalculatorList[channel]; + + if (!channelConfig.chActive) { // Not Active - disable battery charging (OFF-1) and also disable feed into home energy system (OFF-2) - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - valueToSet2 = this.adapter.config.CalculatorList[channel].chValueOff2; + valueToSet = channelConfig.chValueOff; + valueToSet2 = channelConfig.chValueOff2; } else { // chActive -> choose desired values - const pricesToday: IPrice[] = JSON.parse( - await this.getStateValue(`Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.PricesToday.json`), - ); - const maxCheapCount: number = await this.getStateValue( - `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.AmountHours`, - ); - const efficiencyLoss: number = await this.getStateValue( - `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.EfficiencyLoss`, - ); + const pricesToday: IPrice[] = JSON.parse(await this.getStateValue(`Homes.${channelConfig.chHomeID}.PricesToday.json`)); + const maxCheapCount: number = await this.getStateValue(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.AmountHours`); + const efficiencyLoss: number = await this.getStateValue(`Homes.${channelConfig.chHomeID}.Calculations.${channel}.EfficiencyLoss`); // sort by total price pricesToday.sort((a, b) => a.total - b.total); @@ -961,7 +1055,7 @@ export class TibberCalculator extends TibberHelper { cheapIndex++; } - const maxCheapTotal = Math.max(...cheapHours.map((hour) => hour.total)); + const maxCheapTotal = Math.max(...cheapHours.map(hour => hour.total)); for (const hour of pricesToday) { if (!cheapHours.includes(hour)) { @@ -973,26 +1067,26 @@ export class TibberCalculator extends TibberHelper { } } - this.adapter.log.debug(`calculator channel ${channel} SBB-type result - cheap hours: ${cheapHours.map((hour) => hour.total)}`); - this.adapter.log.debug(`calculator channel ${channel} SBB-type result - normal hours: ${normalHours.map((hour) => hour.total)}`); - this.adapter.log.debug(`calculator channel ${channel} SBB-type result - expensive hours: ${expensiveHours.map((hour) => hour.total)}`); + this.adapter.log.debug(`calculator channel ${channel} SBB-type result - cheap hours: ${cheapHours.map(hour => hour.total).join(", ")}`); + this.adapter.log.debug(`calculator channel ${channel} SBB-type result - normal hours: ${normalHours.map(hour => hour.total).join(", ")}`); + this.adapter.log.debug(`calculator channel ${channel} SBB-type result - expensive hours: ${expensiveHours.map(hour => hour.total).join(", ")}`); const resultCheap: boolean[] = cheapHours.map((entry: IPrice) => checkHourMatch(entry)); const resultNormal: boolean[] = normalHours.map((entry: IPrice) => checkHourMatch(entry)); const resultExpensive: boolean[] = expensiveHours.map((entry: IPrice) => checkHourMatch(entry)); // identify if an element is true and generate output - if (resultCheap.some((value) => value)) { + if (resultCheap.some(value => value)) { // Cheap Hours - enable battery charging (ON-1) and disable feed into home energy system (OFF-2) - valueToSet = this.adapter.config.CalculatorList[channel].chValueOn; - valueToSet2 = this.adapter.config.CalculatorList[channel].chValueOff2; - } else if (resultNormal.some((value) => value)) { + valueToSet = channelConfig.chValueOn; + valueToSet2 = channelConfig.chValueOff2; + } else if (resultNormal.some(value => value)) { // Normal Hours - disable battery charging (OFF-1) and also disable feed into home energy system (OFF-2) - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - valueToSet2 = this.adapter.config.CalculatorList[channel].chValueOff2; - } else if (resultExpensive.some((value) => value)) { + valueToSet = channelConfig.chValueOff; + valueToSet2 = channelConfig.chValueOff2; + } else if (resultExpensive.some(value => value)) { // Expensive Hours - disable battery charging (OFF-1) and enable feed into home energy system (ON-2) - valueToSet = this.adapter.config.CalculatorList[channel].chValueOff; - valueToSet2 = this.adapter.config.CalculatorList[channel].chValueOn2; + valueToSet = channelConfig.chValueOff; + valueToSet2 = channelConfig.chValueOn2; } else { this.adapter.log.warn( this.generateErrorMessage(`no result found for SBB`, `execute calculator for smart battery buffer in channel ${channel}`), @@ -1006,27 +1100,25 @@ export class TibberCalculator extends TibberHelper { } } //set value to foreign states, if defined - let sOutState: string = ""; + let sOutState = ""; if ( - this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive") + channelConfig?.chTargetState && + channelConfig.chTargetState.length > 10 && + !channelConfig.chTargetState.startsWith("choose your state to drive") ) { - sOutState = this.adapter.config.CalculatorList[channel].chTargetState; - this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); + sOutState = channelConfig.chTargetState; + void this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet)); } else { - sOutState = `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Output`; - this.adapter.setStateAsync(sOutState, convertValue(valueToSet), true); + sOutState = `Homes.${channelConfig.chHomeID}.Calculations.${channel}.Output`; + void this.adapter.setState(sOutState, convertValue(valueToSet), true); } - sOutState = ""; - if ( - this.adapter.config.CalculatorList[channel].chTargetState.length > 10 && - !this.adapter.config.CalculatorList[channel].chTargetState.startsWith("choose your state to drive") - ) { - sOutState = this.adapter.config.CalculatorList[channel].chTargetState; - this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet2)); + sOutState = ""; // reinit for output 2 + if (channelConfig.chTargetState2.length > 10 && !channelConfig.chTargetState2.startsWith("choose your state to drive")) { + sOutState = channelConfig.chTargetState2; + void this.adapter.setForeignStateAsync(sOutState, convertValue(valueToSet2)); } else { - sOutState = `Homes.${this.adapter.config.CalculatorList[channel].chHomeID}.Calculations.${channel}.Output2`; - this.adapter.setStateAsync(sOutState, convertValue(valueToSet2), true); + sOutState = `Homes.${channelConfig.chHomeID}.Calculations.${channel}.Output2`; + void this.adapter.setState(sOutState, convertValue(valueToSet2), true); } } catch (error) { this.adapter.log.warn(this.generateErrorMessage(error, `execute calculator for smart battery buffer in channel ${channel}`)); @@ -1034,20 +1126,34 @@ export class TibberCalculator extends TibberHelper { } } -// function to check for equal hour values of given to current +/** + * Checks if the current hour matches the hour of a given entry's start time. + * This method compares the hour of the current date and time with the hour extracted from the `startsAt` property of the provided `entry` object. + * If the hours match, the function returns `true`, otherwise `false`. + * + * @param entry - An object of type `IPrice` containing a `startsAt` property that represents the start time as a date string. + * @returns A boolean indicating whether the current hour matches the hour of the `startsAt` time. + */ function checkHourMatch(entry: IPrice): boolean { const currentDateTime = new Date(); const startDateTime = new Date(entry.startsAt); return currentDateTime.getHours() === startDateTime.getHours(); } +/** + * Converts a string value to its corresponding boolean, number, or string representation. + * This method attempts to convert the input string into a boolean if it matches "true" or "false" (case-insensitive). + * If the string can be parsed as a number, it is converted to a number. Otherwise, the original string is returned. + * + * @param Value - The string to be converted into a boolean, number, or returned as a string. + * @returns A boolean if the string is "true" or "false", a number if the string represents a valid numeric value, or the original string if no conversion is possible. + */ function convertValue(Value: string): boolean | number | string { if (Value.toLowerCase() === "true") { return true; } else if (Value.toLowerCase() === "false") { return false; - } else { - const numericValue = parseFloat(Value); - return isNaN(numericValue) ? Value : numericValue; } + const numericValue = parseFloat(Value); + return isNaN(numericValue) ? Value : numericValue; } diff --git a/src/lib/tibberLocal.ts b/src/lib/tibberLocal.ts index 415a883d..ee0bd253 100644 --- a/src/lib/tibberLocal.ts +++ b/src/lib/tibberLocal.ts @@ -1,40 +1,59 @@ -import * as utils from "@iobroker/adapter-core"; -import axios, { AxiosRequestConfig, AxiosResponse } from "axios"; +import type * as utils from "@iobroker/adapter-core"; +import axios, { type AxiosRequestConfig, type AxiosResponse } from "axios"; import { format, formatDuration, intervalToDuration } from "date-fns"; -import { TibberHelper } from "./tibberHelper"; +import { ProjectUtils } from "./projectUtils"; -export class TibberLocal extends TibberHelper { +/** + * TibberLocal + */ +export class TibberLocal extends ProjectUtils { intervalList: NodeJS.Timeout[]; - TestData: string = ""; - TestMode: boolean = false; - MetricsDataInterval: number = 60000; - RawDataInterval: number = 2000; - meterMode: number = 0; + TestData = ""; + // example HEX strings - meter mode 3 e.g. for "ISKRA ISK00 7034" meters + // TestData: string = `1b1b1b1b01010101760512923b426200620072630101760101050630be6c0b090149534b0004316b61010163a9b600760512923b43620062007263070177010b090149534b0004316b61070100620affff726201650b7415f27a77078181c78203ff010101010449534b0177070100000009ff010101010b090149534b0004316b610177070100010800ff65000101a001621e52ff59000000000ee32fcb0177070100010801ff0101621e52ff59000000000ee32fcb0177070100010802ff0101621e52ff5900000000000000000177070100020800ff0101621e52ff590000000007318ead0177070100020801ff0101621e52ff590000000007318ead0177070100020802ff0101621e52ff5900000000000000000177070100100700ff0101621b520055fffffff10177078181c78205ff010101018302268dd6b5bfb5760a1b2c763b034bd3af9863ea9000593a8da767ec1ba01e9b6e8d52fa200e7ec7517fc100295699650b01010163d03800760512923b4462006200726302017101630a84001b1b1b1b1a00a9f2`; + // example HEX strings - meter mode 3??? WiP e.g. for "EasyMeter Q3AA2064" meters + // TestData: string = `1b1b1b1b01010101760b455359416ebd0ac96831620062007263010176010445535908455359781168310b09014553591103bf6ebd0101638b0d00760b455359416ebd0ac96832620062007263070177010b09014553591103bf6ebd080100620affff0072620165039878117677078181c78203ff01010101044553590177070100000009ff010101010b09014553591103bf6ebd0177070100010800ff6400008001621e52fc5900000007fdd4f5c60177070100020800ff6400008001621e52fc5900000000002009db0177070100100700ff0101621b52fe5900000000000028d60177078181c7f006ff010101010401003e0101016305d800760b455359416ebd0ac968336200620072630201710163c13b000000001b1b1b1b1a032b3e`; + TestMode = false; + MetricsDataInterval = 60000; + meterMode = 0; //negSignPattern: string = "77070100010800ff6301a"; + /** + * + * @param adapter - ioBroker adapter instance + */ constructor(adapter: utils.AdapterInstance) { super(adapter); this.intervalList = []; } - async setupOnePulseLocal(pulse: number): Promise { + /** + * setupOnePulseLocal + * + * @param pulse - ID of the Tibber Pulse + */ + setupOnePulseLocal(pulse: number): void { try { if (this.adapter.config.PulseList[pulse].puName === undefined) { this.adapter.config.PulseList[pulse].puName = `Pulse Local`; } + const interval = this.adapter.config.PulseList[pulse].tibberBridgeRawDataInterval; + if (interval === undefined || interval === null || isNaN(interval) || interval < 1000) { + this.adapter.config.PulseList[pulse].tibberBridgeRawDataInterval = 2000; + } if (!this.TestMode) { - let firstMetricsRun: boolean = true; - let firstDataRun: boolean = true; + let firstMetricsRun = true; + let firstDataRun = true; //#region *** get Tibber Bridge metrics first time this.getPulseData(pulse) - .then((response) => { + .then(response => { this.adapter.log.debug( `Polled local Tibber Bridge metrics${firstMetricsRun ? " for the first time" : ""}: ${JSON.stringify(response)}`, ); this.fetchPulseInfo(pulse, response, "", firstMetricsRun); firstMetricsRun = false; }) - .catch((e) => { + .catch(e => { this.adapter.log.error(`Error while polling and parsing Tibber Bridge metrics: ${e}`); }); //#endregion @@ -42,24 +61,26 @@ export class TibberLocal extends TibberHelper { //#region *** setup Tibber Bridge metrics job const jobBridgeMetrics = setInterval(() => { this.getPulseData(pulse) - .then((response) => { + .then(response => { this.adapter.log.debug(`Polled local Tibber Bridge metrics: ${JSON.stringify(response)}`); this.fetchPulseInfo(pulse, response, "", firstMetricsRun); firstMetricsRun = false; }) - .catch((e) => { + .catch(e => { this.adapter.log.error(`Error polling and parsing Tibber Bridge metrics: ${e}`); }); }, this.MetricsDataInterval); - if (jobBridgeMetrics) this.intervalList.push(jobBridgeMetrics); + if (jobBridgeMetrics) { + this.intervalList.push(jobBridgeMetrics); + } //#endregion //#region *** setup Tibber Pulse data job const jobPulseLocal = setInterval(() => { // poll data and log as HEX string this.getDataAsHexString(pulse) - .then((hexString) => { + .then(hexString => { this.adapter.log.debug(`got HEX data from local pulse: ${hexString}`); // log data as HEX string - this.checkAndSetValue(this.getStatePrefixLocal(pulse, "SMLDataHEX"), hexString, this.adapter.config.PulseList[pulse].puName); + void this.checkAndSetValue(`LocalPulse.${pulse}.SMLDataHEX`, hexString, this.adapter.config.PulseList[pulse].puName); this.adapter.log.debug(`trying to parse meter mode ${this.meterMode}`); switch (this.meterMode) { case 1: @@ -76,14 +97,18 @@ export class TibberLocal extends TibberHelper { } firstDataRun = false; }) - .catch((e) => { - this.adapter.log.warn(`Error local polling of Tibber Pulse RAW data: ${e}`); + .catch(error => { + this.adapter.log.warn(`Error local polling of Tibber Pulse RAW data: ${error}`); }); - }, this.RawDataInterval); - if (jobPulseLocal) this.intervalList.push(jobPulseLocal); + }, this.adapter.config.PulseList[pulse].tibberBridgeRawDataInterval); + if (jobPulseLocal) { + this.intervalList.push(jobPulseLocal); + } //#endregion } else { - const parsedMessages = this.extractAndParseSMLMessages(99, this.TestData); + // test mode + this.adapter.log.error(`RUNNING IN TEST MODE`); + const parsedMessages = void this.extractAndParseSMLMessages(0, this.TestData); this.adapter.log.warn(`Parsed messages from test data ${parsedMessages}`); } } catch (error) { @@ -96,10 +121,8 @@ export class TibberLocal extends TibberHelper { * * This method iterates over all interval jobs stored in `this.intervalList` and clears each one. * If an error occurs during this process, it logs a warning message. - * - * @returns A promise that resolves when all intervals have been cleared. */ - async clearIntervals(): Promise { + clearIntervals(): void { try { // Here we must clear all intervals that may still be active for (const intervalJob of this.intervalList) { @@ -180,7 +203,7 @@ export class TibberLocal extends TibberHelper { * @param prefix - An optional string prefix to prepend to state keys (default is an empty string). * @param firstTime - A boolean indicating if this is the first time fetching the information (default is false). */ - private fetchPulseInfo(pulse: number, obj: any, prefix: string = "", firstTime: boolean = false): void { + private fetchPulseInfo(pulse: number, obj: any, prefix = "", firstTime = false): void { if (!obj || typeof obj !== "object") { this.adapter.log.warn(`Got bad Pulse info data to fetch!: ${obj}`); // } @@ -190,11 +213,12 @@ export class TibberLocal extends TibberHelper { } else { switch (key) { case "timestamp": + // eslint-disable-next-line no-case-declarations const TimeValue = this.isValidUnixTimestampAndConvert(obj[key]); if (TimeValue) { obj[key] = TimeValue; - this.checkAndSetValue( - this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), + void this.checkAndSetValue( + `LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, false, @@ -205,8 +229,8 @@ export class TibberLocal extends TibberHelper { break; case "node_temperature": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber( - this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), + void this.checkAndSetValueNumber( + `LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, Math.round(obj[key] * 10) / 10, `Temperature of this Tibber Pulse unit`, "°C", @@ -218,8 +242,8 @@ export class TibberLocal extends TibberHelper { break; case "meter_mode": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber( - this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), + void this.checkAndSetValueNumber( + `LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, Math.round(obj[key] * 10) / 10, `Mode of your Pulse to grid-meter communication`, "", @@ -235,8 +259,8 @@ export class TibberLocal extends TibberHelper { break; case "node_battery_voltage": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber( - this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), + void this.checkAndSetValueNumber( + `LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, Math.round(obj[key] * 100) / 100, `Temperature of this Tibber Pulse unit`, "V", @@ -248,8 +272,8 @@ export class TibberLocal extends TibberHelper { break; case "node_uptime_ms": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber( - this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), + void this.checkAndSetValueNumber( + `LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], `Uptime of your Tibber Pulse in ms`, "ms", @@ -266,8 +290,8 @@ export class TibberLocal extends TibberHelper { return parts.slice(0, 6).join(" "); // slice(0, 4) um die ersten zwei Blöcke (jeweils Einheit und Wert) zu erhalten // Output: "229 days 3 hours 17 minutes" } - this.checkAndSetValue( - this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}node_uptime`), + void this.checkAndSetValue( + `LocalPulse.${pulse}.PulseInfo.${prefix}node_uptime`, formatMilliseconds(obj[key]), `Uptime of your Tibber Pulse`, false, @@ -278,8 +302,8 @@ export class TibberLocal extends TibberHelper { break; case "time_in_em0_ms": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber( - this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), + void this.checkAndSetValueNumber( + `LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, "ms", @@ -291,8 +315,8 @@ export class TibberLocal extends TibberHelper { break; case "time_in_em1_ms": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber( - this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), + void this.checkAndSetValueNumber( + `LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, "ms", @@ -304,8 +328,8 @@ export class TibberLocal extends TibberHelper { break; case "time_in_em2_ms": if (typeof obj[key] === "number") { - this.checkAndSetValueNumber( - this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), + void this.checkAndSetValueNumber( + `LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, "ms", @@ -317,8 +341,8 @@ export class TibberLocal extends TibberHelper { break; default: if (typeof obj[key] === "string") { - this.checkAndSetValue( - this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), + void this.checkAndSetValue( + `LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, false, @@ -326,8 +350,8 @@ export class TibberLocal extends TibberHelper { firstTime, ); } else { - this.checkAndSetValueNumber( - this.getStatePrefixLocal(pulse, `PulseInfo.${prefix}${key}`), + void this.checkAndSetValueNumber( + `LocalPulse.${pulse}.PulseInfo.${prefix}${key}`, obj[key], this.adapter.config.PulseList[pulse].puName, "", @@ -373,14 +397,27 @@ export class TibberLocal extends TibberHelper { * Extracts and parses Mode 3 energy meter messages from a hexadecimal string. * * @param pulse - An identifier for the pulse. - * @param transfer - A string representing the hexadecimal Mode 3 messages to be parsed. + * @param transfer - A string representing the hexadecimal mode 3 message to be parsed. * @param forceMode - An optional boolean indicating whether to force the mode (default is false). - * @returns A Promise that resolves when the parsing and processing are complete. */ - private async extractAndParseSMLMessages(pulse: number, transfer: string, forceMode: boolean = false): Promise { + private extractAndParseSMLMessages(pulse: number, transfer: string, forceMode = false): void { + /** + * Represents the result of parsing a pulse signal. + */ interface PulseParseResult { + /** + * The name or identifier of the pulse signal. + */ name: string; + + /** + * The numeric value of the pulse. + */ value: number; + + /** + * The unit of measurement for the pulse value (optional). + */ unit?: string; } const messages = transfer.matchAll( @@ -389,12 +426,14 @@ export class TibberLocal extends TibberHelper { const output: string[] = []; for (const match of messages) { const result: PulseParseResult = { name: "", value: 0 }; - //this.adapter.log.debug(`overall compliance: ${match[0]}`); - //this.adapter.log.debug(`group 1: ${match[1]}`); - //this.adapter.log.debug(`group 2: ${match[2]}`); - //this.adapter.log.debug(`group 3: $[match[3]}`); - //this.adapter.log.debug(`group 4: $[match[4]}`); - //this.adapter.log.debug(`group 5: ${match[5]}`); + if (this.TestMode) { + this.adapter.log.debug(`parse SML overall compliance: ${match[0]}`); + this.adapter.log.debug(`parse SML group 1: ${match[1]}`); + this.adapter.log.debug(`parse SML group 2: ${match[2]}`); + this.adapter.log.debug(`parse SML group 3: ${match[3]}`); + this.adapter.log.debug(`parse SML group 4: ${match[4]}`); + this.adapter.log.debug(`parse SML group 5: ${match[5]}`); + } result.name = findObisCodeName(match[1]); if (result.name.startsWith(`Found invalid OBIS-Code:`)) { @@ -409,11 +448,12 @@ export class TibberLocal extends TibberHelper { const decimalCode = parseInt(match[2], 16); result.unit = findDlmsUnitByCode(decimalCode); - if (match[3].toLowerCase() == "ff") { - result.value = result.value / 10; - } else if (match[3].toLowerCase() == "fe") { - result.value = result.value / 100; + const scalingFactors = { ff: 10, fe: 100, fd: 1000, fc: 10000 }; + const scaleFactor = scalingFactors[match[3].toLowerCase()]; + if (scaleFactor) { + result.value /= scaleFactor; } + //#region *** negSignPattern /* if ("negSignPattern" in TibberConfig && this.negSignPattern.length > 2) { @@ -429,19 +469,27 @@ export class TibberLocal extends TibberHelper { } */ //#endregion - if (result.value > 1000000000 || result.value < -1000000000) { - this.adapter.log.debug(`Result.value < or > 1.000.000.000 skiped!`); + if (result.value < -1000000000) { + this.adapter.log.debug(`Result.value < -1.000.000.000 skiped!`); this.adapter.log.debug(JSON.stringify(result)); this.adapter.log.debug(`overall compliance: ${match[0]}`); this.adapter.log.debug(`RAW: ${transfer}`); continue; } + if (result.value > 1000000000) { + this.adapter.log.debug(`Result.value > 1.000.000.000 skiped!`); + this.adapter.log.debug(JSON.stringify(result)); + this.adapter.log.debug(`overall compliance: ${match[0]}`); + this.adapter.log.debug(`RAW: ${transfer}`); + continue; + } + if (result.unit == "Wh") { result.unit = "kWh"; - result.value = Math.round(result.value / 100) / 10; + result.value = Math.round(result.value / 10) / 100; } - this.checkAndSetValueNumber( - this.getStatePrefixLocal(pulse, result.name), + void this.checkAndSetValueNumber( + `LocalPulse.${pulse}.${result.name}`, result.value, this.adapter.config.PulseList[pulse].puName, result.unit, @@ -453,7 +501,9 @@ export class TibberLocal extends TibberHelper { const formattedMatch = match[0].replace(/(..)/g, "$1 ").trim(); output.push(`${getCurrentTimeFormatted()}: ${formattedMatch}\n`); } - if (output.length > 0) this.adapter.log.debug(`Format for https://tasmota-sml-parser.dicp.net :\n ${output.join("")}`); + if (output.length > 0) { + this.adapter.log.debug(`Format for https://tasmota-sml-parser.dicp.net :\n ${output.join("")}`); + } } /** @@ -466,18 +516,33 @@ export class TibberLocal extends TibberHelper { * @param pulse - An identifier for the pulse. * @param transfer - A string representing the hexadecimal Mode 1 or 4 messages to be parsed. * @param forceMode - An optional boolean indicating whether to force the mode (default is false). - * @returns A Promise that resolves when the parsing and processing are complete. */ - private async extractAndParseMode1_4Messages(pulse: number, transfer: string, forceMode: boolean = false): Promise { + private extractAndParseMode1_4Messages(pulse: number, transfer: string, forceMode = false): void { + /** + * Represents the result of parsing a pulse signal. + */ interface PulseParseResult { + /** + * The name or identifier of the pulse signal. + */ name: string; + + /** + * The numeric value of the pulse. + */ value: number; + + /** + * The unit of measurement for the pulse value (optional). + */ unit?: string; } + const PulseParseResults: PulseParseResult[] = []; // example HEX strings - meter mode 1 e.g. for "ZPA GH305" meters // transfer = `2f5a50413547483330352e76322d32302e30302d470d0a0d0a02312d303a432e312e302a32353528315a504130303235313337353738290d0a312d303a312e382e302a323535283031383131362e333030322a6b5768290d0a312d303a312e382e312a323535283030303030302e303030302a6b5768290d0a312d303a312e382e322a323535283031383131362e333030322a6b5768290d0a312d303a322e382e302a323535283031393330362e303938392a6b5768290d0a312d303a31362e372e302a323535282d3030333039342a57290d0a312d303a33322e372e302a323535283233332e352a56290d0a312d303a35322e372e302a323535283233332e332a56290d0a312d303a37322e372e302a323535283233332e392a56290d0a312d303a33312e372e302a323535283030322e39382a41290d0a312d303a35312e372e302a323535283030352e33302a41290d0a312d303a37312e372e302a323535283030352e33302a41290d0a312d303a38312e372e312a323535283132302a646567290d0a312d303a38312e372e322a323535283234302a646567290d0a312d303a38312e372e342a323535283139342a646567290d0a312d303a38312e372e31352a323535283138362a646567290d0a312d303a38312e372e32362a323535283139342a646567290d0a312d303a31342e372e302a3235352835302e302a487a290d0a312d303a302e322e302a323535287665722e32302c44363841393343372c3230323030343039290d0a312d303a432e39302e322a323535284436384139334337290d0a312d303a462e462a32353528303030303030290d0a312d303a432e352e302a323535283030314337393034290d0a312d303a33362e372e302a323535282d3030303637332a57290d0a312d303a35362e372e302a323535282d3030313232322a57290d0a312d303a37362e372e302a323535282d3030313139312a57290d0a312d303a312e382e302a39362830303030392e382a6b5768290d0a312d303a312e382e302a39372830303037362e302a6b5768290d0a312d303a312e382e302a39382830303334372e342a6b5768290d0a312d303a312e382e302a39392830383136392e312a6b5768290d0a312d303a312e382e302a3130302831383131362e332a6b5768290d0a210d0a033c`; // transfer = `2f5a50413547483330352e76322d32302e30302d470d0a0d0a02312d303a432e312e302a32353528315a504130303235313337353738290d0a312d303a312e382e302a323535283031383138332e363136372a6b5768290d0a312d303a312e382e312a323535283030303030302e303030302a6b5768290d0a312d303a312e382e322a323535283031383138332e363136372a6b5768290d0a312d303a322e382e302a323535283031393336372e343232382a6b5768290d0a312d303a31362e372e302a323535282d3030303032362a57290d0a312d303a33322e372e302a323535283233302e312a56290d0a312d303a35322e372e302a323535283232392e302a56290d0a312d303a37322e372e302a323535283232392e382a56290d0a312d303a33312e372e302a323535283030322e30382a41290d0a312d303a35312e372e302a323535283030312e31322a41290d0a312d303a37312e372e302a323535283030322e30302a41290d0a312d303a38312e372e312a323535283132302a646567290d0a312d303a38312e372e322a323535283234302a646567290d0a312d303a38312e372e342a323535283139382a646567290d0a312d303a38312e372e31352a323535283332312a646567290d0a312d303a38312e372e32362a323535283330302a646567290d0a312d303a31342e372e302a3235352835302e302a487a290d0a312d303a302e322e302a323535287665722e32302c44363841393343372c3230323030343039290d0a312d303a432e39302e322a323535284436384139334337290d0a312d303a462e462a32353528303030303030290d0a312d303a432e352e302a323535283030314331393034290d0a312d303a33362e372e302a323535282d3030303432332a57290d0a312d303a35362e372e302a323535283030303138372a57290d0a312d303a37362e372e302a323535283030303232312a57290d0a312d303a312e382e302a39362830303030342e302a6b5768290d0a312d303a312e382e302a39372830303037392e342a6b5768290d0a312d303a312e382e302a39382830303339392e362a6b5768290d0a312d303a312e382e302a39392830383138312e352a6b5768290d0a312d303a312e382e302a3130302831383138332e362a6b5768290d0a210d0a0334`; + // example HEX string - meter mode 4 e.g. for "eBZ DD3" meters // transfer = `2f45425a35444433325230364454415f3130370d0a312d303a302e302e302a323535283145425a30313031303033313331290d0a312d303a39362e312e302a323535283145425a30313031303033313331290d0a312d303a312e382e302a323535283030373435392e37383437313635322a6b5768290d0a312d303a312e382e312a323535283030303030312e3030332a6b5768290d0a312d303a312e382e322a323535283030373435382e3738312a6b5768290d0a312d303a322e382e302a323535283032373532312e33393931323739342a6b5768290d0a312d303a31362e372e302a323535283030303030322e36392a57290d0a312d303a33362e372e302a323535283030303133352e39352a57290d0a312d303a35362e372e302a323535283030303233392e39312a57290d0a312d303a37362e372e302a323535282d3030303337332e31372a57290d0a312d303a33322e372e302a323535283233362e312a56290d0a312d303a35322e372e302a323535283233352e372a56290d0a312d303a37322e372e302a323535283233392e312a56290d0a312d303a39362e352e302a323535283030314334313034290d0a302d303a39362e382e302a323535283036344641453235290d0a210d0a`; @@ -506,8 +571,8 @@ export class TibberLocal extends TibberHelper { // Push the parsed measurement into the measurements array PulseParseResults.push({ name, value, unit }); - this.checkAndSetValueNumber( - this.getStatePrefixLocal(pulse, name), + void this.checkAndSetValueNumber( + `LocalPulse.${pulse}.${name}`, value, this.adapter.config.PulseList[pulse].puName, unit, @@ -533,7 +598,7 @@ export class TibberLocal extends TibberHelper { if (typeof n !== "number" || n < 0 || n > currentTime || !Number.isInteger(n)) { return false; } - // Konvertiere zu deutschem Zeitformat + // convert to German format const date = new Date(n * 1000); return date.toLocaleString("de-DE"); // WiP: use system string instead of always German; use date-fns } @@ -565,22 +630,34 @@ function parseSignedHex(hexStr: string): number { const bitLength = hexStr.length * 4; if (bitLength <= 4) { // Behandlung als 4-Bit-Zahl - if (num > 0x7) num = num - 0x1n; + if (num > 0x7) { + num = num - 0x1n; + } } else if (bitLength <= 8) { // Behandlung als 8-Bit-Zahl - if (num > 0x7f) num = num - 0x100n; + if (num > 0x7f) { + num = num - 0x100n; + } } else if (bitLength <= 16) { // Behandlung als 16-Bit-Zahl - if (num > 0x7fff) num = num - 0x10000n; + if (num > 0x7fff) { + num = num - 0x10000n; + } } else if (bitLength <= 24) { // Behandlung als 16-Bit-Zahl - if (num > 0x7fffff) num = num - 0x1000000n; + if (num > 0x7fffff) { + num = num - 0x1000000n; + } } else if (bitLength <= 32) { // Behandlung als 32-Bit-Zahl - if (num > 0x7fffffff) num = num - 0x100000000n; + if (num > 0x7fffffff) { + num = num - 0x100000000n; + } } else { // Behandlung als 64-Bit-Zahl - if (num > 0x7fffffffffffffffn) num = num - 0x10000000000000000n; + if (num > 0x7fffffffffffffffn) { + num = num - 0x10000000000000000n; + } } return Number(num.toString()); } @@ -670,7 +747,7 @@ function findDlmsUnitByCode(decimalCode: number): string { { code: 0x42, unit: "(unitless)", quantity: "no unit, unitless, count", unitName: "", siDefinition: "" }, { code: 0x0, unit: "", quantity: "", unitName: "", siDefinition: "stop condition for iterator" }, ]; - const found = dlmsUnits.find((item) => item.code === decimalCode); + const found = dlmsUnits.find(item => item.code === decimalCode); return found ? found.unit : ""; } @@ -678,7 +755,6 @@ function findDlmsUnitByCode(decimalCode: number): string { * Finds the name corresponding to a given OBIS code. * * @param code - A string representing the OBIS code to look up. - * @param obisCodesWithNames - An array of objects where each object contains a `code` and `name` property. * @returns A string representing the name associated with the OBIS code, or "Unknown" if the code is not found. */ function findObisCodeName(code: string): string { @@ -747,8 +823,8 @@ function findObisCodeName(code: string): string { * - Hexadecimal format: exactly 12 hexadecimal characters. * - Decimal format: three groups of digits separated by dots. * - * @param {string} code - The OBIS code to be validated. - * @returns {boolean} - Returns true if the code matches either the hexadecimal or decimal format, false otherwise. + * @param code - The OBIS code to be validated. + * @returns Returns true if the code matches either the hexadecimal or decimal format, false otherwise. */ function isValidObisCode(code: string): boolean { // Regex for hexadecimal format: exactly 12 hexadecimal characters diff --git a/src/lib/tibberPulse.ts b/src/lib/tibberPulse.ts index de928d05..30506d08 100644 --- a/src/lib/tibberPulse.ts +++ b/src/lib/tibberPulse.ts @@ -1,16 +1,28 @@ -import * as utils from "@iobroker/adapter-core"; -import { IConfig, TibberFeed, TibberQuery } from "tibber-api"; -import { ILiveMeasurement } from "tibber-api/lib/src/models/ILiveMeasurement"; -import { TibberHelper } from "./tibberHelper"; +import type * as utils from "@iobroker/adapter-core"; +import { TibberFeed, TibberQuery, type IConfig } from "tibber-api"; +import type { ILiveMeasurement } from "tibber-api/lib/src/models/ILiveMeasurement"; +import { ProjectUtils } from "./projectUtils"; -export class TibberPulse extends TibberHelper { +/** + * TibberPulse + */ +export class TibberPulse extends ProjectUtils { tibberConfig: IConfig; tibberQuery: TibberQuery; tibberFeed: TibberFeed; httpQueryUrl: string; - reconnectTime: number = 6000; - maxReconnectTime: number = 900000; + reconnectTime = 6000; + maxReconnectTime = 900000; + countedFeedDisconnects = 0; + lastFeedWarningTime: Date | null = null; + deltaFeedWarningTime = 0; + /** + * constructor + * + * @param tibberConfig - The Tibber config object + * @param adapter - ioBroker adapter instance + */ constructor(tibberConfig: IConfig, adapter: utils.AdapterInstance) { super(adapter); this.tibberConfig = tibberConfig; @@ -20,6 +32,9 @@ export class TibberPulse extends TibberHelper { this.addEventHandlerOnFeed(this.tibberFeed); } + /** + * ConnectPulseStream + */ async ConnectPulseStream(): Promise { try { await this.tibberFeed.connect(); @@ -28,6 +43,9 @@ export class TibberPulse extends TibberHelper { } } + /** + * DisconnectPulseStream + */ DisconnectPulseStream(): void { try { this.tibberFeed.close(); @@ -40,34 +58,79 @@ export class TibberPulse extends TibberHelper { private addEventHandlerOnFeed(currentFeed: TibberFeed): void { // Set info.connection state for event "connected" - currentFeed.on("connected", (data) => { + currentFeed.on("connected", data => { this.adapter.log.debug(`Tibber feed connected: ${data.toString()}`); - this.adapter.setState("info.connection", true, true); + void this.adapter.setState("info.connection", true, true); }); - // Set info.connection state for event "disconnected" - currentFeed.on("disconnected", (data) => { - this.adapter.setState("info.connection", false, true); - if (this.adapter.config.HomesList.some((info) => info.feedActive)) { - this.adapter.log.warn(`A feed was disconnected. I try to reconnect with incremental delay - Tibber error text: ${data.toString()}`); - this.reconnect(); + /** + * Handles the disconnection of a data feed and manages reconnection attempts with incremental delays. + * + * This method is triggered when the data feed gets disconnected. It updates the connection state (`info.connection` to `false`) and monitors the frequency of disconnection attempts to avoid excessive reconnections. + * + * The following logic is applied: + * - **Disconnection count (`countedFeedDisconnects`)**: Tracks the number of disconnections. Warnings are logged when the feed disconnects 5 or 25 times. At 25 disconnections, an error is logged instead of a warning. + * - **Warning time interval (`deltaFeedWarningTime`)**: Measures the time (in minutes) since the last disconnection warning. If more than 60 minutes have passed, the warning counter resets. + * - If the feed disconnects frequently within a **30-minute window**, it logs a warning and resets the disconnection counter. + * - After each disconnection, the system tries to reconnect, logging the result. If disconnections occur too often, warnings or errors are logged based on the number of reconnection attempts. + * + * @param data - The error message sent by Tibber upon disconnection, which is logged for diagnostic purposes. + */ + currentFeed.on("disconnected", data => { + void this.adapter.setState("info.connection", false, true); + if (this.adapter.config.HomesList.some(info => info.feedActive)) { + this.deltaFeedWarningTime = 0; + if (this.lastFeedWarningTime !== null) { + this.deltaFeedWarningTime = (new Date().getTime() - this.lastFeedWarningTime.getTime()) / 1000 / 60; // timedifference in minutes + } + if (this.countedFeedDisconnects < 25 && this.deltaFeedWarningTime > 60) { + this.countedFeedDisconnects = 0; + this.lastFeedWarningTime = null; + this.deltaFeedWarningTime = 0; + } + + this.countedFeedDisconnects++; + const loggingTextBlock = ` to reconnect with incremental delay - Error text sent by Tibber: ${data.toString()}`; + + if (this.deltaFeedWarningTime > 30) { + this.countedFeedDisconnects = 0; + this.lastFeedWarningTime = null; + this.adapter.log.warn(`A feed was disconnected very often. I keep trying${loggingTextBlock}`); + } else { + if (this.countedFeedDisconnects == 5) { + this.lastFeedWarningTime = new Date(); + this.adapter.log.warn(`A feed was disconnected very often. I keep trying${loggingTextBlock}`); + } else if (this.countedFeedDisconnects == 25) { + this.adapter.log.error(`A feed was disconnected very often. I keep trying${loggingTextBlock}`); + } else { + this.adapter.log.debug(`A feed was disconnected. I try to${loggingTextBlock}`); + } + } + void this.reconnect(); } }); // Add error handler on connection - currentFeed.on("error", (error) => { + currentFeed.on("error", error => { let errorMessage = ""; if (error instanceof Error) { - if (error.message) errorMessage = error.message; - else if (error.name) errorMessage = error.name; - else errorMessage = "Unspecified error"; - } else if (typeof error === "string") errorMessage = error; - else errorMessage = "Unknown error"; + if (error.message) { + errorMessage = error.message; + } else if (error.name) { + errorMessage = error.name; + } else { + errorMessage = "Unspecified error"; + } + } else if (typeof error === "string") { + errorMessage = error; + } else { + errorMessage = "Unknown error"; + } this.adapter.log.warn(`Error on Tibber feed: ${errorMessage}`); }); // Add data receiver - currentFeed.on("data", (data) => { + currentFeed.on("data", data => { const receivedData: ILiveMeasurement = data; this.fetchLiveMeasurement("LiveMeasurement", receivedData); }); @@ -75,7 +138,9 @@ export class TibberPulse extends TibberHelper { private fetchLiveMeasurement(objectDestination: string, liveMeasurement: ILiveMeasurement): void { let power = 0; - if (liveMeasurement.powerProduction === undefined || liveMeasurement.powerProduction === null) liveMeasurement.powerProduction = 0; // fix wrong data from Tibber in edge cases + if (liveMeasurement.powerProduction === undefined || liveMeasurement.powerProduction === null) { + liveMeasurement.powerProduction = 0; + } // fix wrong data from Tibber in edge cases if (liveMeasurement.power > 0) { power = liveMeasurement.power; } else if (liveMeasurement.powerProduction > 0) { @@ -84,154 +149,154 @@ export class TibberPulse extends TibberHelper { // "minpower" should be called "minpowerConsumption" - in fact there is no correct minpower yet, // when we think about minpower and maxpower should be linked to "power" (positive and negative power) if (this.tibberConfig.homeId !== undefined) { - this.checkAndSetValue( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "timestamp"), + void this.checkAndSetValue( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.timestamp`, liveMeasurement.timestamp, "Timestamp when usage occurred", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "power"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.power`, power, "Powerlevel measured at the moment +/-", "W", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "lastMeterConsumption"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.lastMeterConsumption`, Math.round(1000 * liveMeasurement.lastMeterConsumption) / 1000, "Latest consumption meter state", "kWh", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedConsumption"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedConsumption`, Math.round(1000 * liveMeasurement.accumulatedConsumption) / 1000, "Energy consumed since midnight", "kWh", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedProduction"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedProduction`, Math.round(1000 * liveMeasurement.accumulatedProduction) / 1000, "Energy feed into grid since midnight", "kWh", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedConsumptionLastHour"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedConsumptionLastHour`, Math.round(1000 * liveMeasurement.accumulatedConsumptionLastHour) / 1000, "Energy consumed since since last hour shift", "kWh", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedProductionLastHour"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedProductionLastHour`, Math.round(1000 * liveMeasurement.accumulatedProductionLastHour) / 1000, "Energy produced since last hour shift", "kWh", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedCost"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedCost`, liveMeasurement.accumulatedCost, "Accumulated cost since midnight; requires active Tibber power deal", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "accumulatedReward"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.accumulatedReward`, liveMeasurement.accumulatedReward, "Accumulated reward since midnight; requires active Tibber power deal", ); - this.checkAndSetValue( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "currency"), + void this.checkAndSetValue( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.currency`, liveMeasurement.currency, "Currency of displayed cost; requires active Tibber power deal", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "minPower"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.minPower`, liveMeasurement.minPower, "Min consumption since midnight", "W", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "averagePower"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.averagePower`, liveMeasurement.averagePower, "Average consumption since midnight", "W", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "maxPower"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.maxPower`, liveMeasurement.maxPower, "Peak consumption since midnight", "W", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "powerConsumption"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.powerConsumption`, liveMeasurement.power, "Net consumption (A+) at the moment", "W", ); if (this.adapter.config.FeedConfigPowerProduction) { - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "powerProduction"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.powerProduction`, liveMeasurement.powerProduction, "Net grid feed-in (A-) at the moment", "W", ); } - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "minPowerProduction"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.minPowerProduction`, liveMeasurement.minPowerProduction, "Min net grid feed-in since midnight", "W", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "maxPowerProduction"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.maxPowerProduction`, liveMeasurement.maxPowerProduction, "Max net grid feed-in since midnight", "W", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "lastMeterProduction"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.lastMeterProduction`, Math.round(1000 * liveMeasurement.lastMeterProduction) / 1000, "Latest grid feed-in meter state", "kWh", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "powerFactor"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.powerFactor`, liveMeasurement.powerFactor, "Power factor (active power / apparent power)", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "signalStrength"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.signalStrength`, liveMeasurement.signalStrength, "Device signal strength (Pulse - dB; Watty - percent)", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "voltagePhase1"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.voltagePhase1`, liveMeasurement.voltagePhase1, "Voltage on phase 1; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "V", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "voltagePhase2"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.voltagePhase2`, liveMeasurement.voltagePhase2, "Voltage on phase 2; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "V", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "voltagePhase3"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.voltagePhase3`, liveMeasurement.voltagePhase3, "Voltage on phase 3; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "V", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "currentL1"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.currentL1`, liveMeasurement.currentL1, "Current on L1; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "A", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "currentL2"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.currentL2`, liveMeasurement.currentL2, "Current on L2; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "A", ); - this.checkAndSetValueNumber( - this.getStatePrefix(this.tibberConfig.homeId, objectDestination, "currentL3"), + void this.checkAndSetValueNumber( + `Homes.${this.tibberConfig.homeId}.${objectDestination}.currentL3`, liveMeasurement.currentL3, "Current on L3; on some meters this value is not part of every data frame therefore the value is null at some timestamps", "A", diff --git a/src/lib/tools.ts b/src/lib/tools.ts index 9b6ac9f9..7d07db3e 100644 --- a/src/lib/tools.ts +++ b/src/lib/tools.ts @@ -1,10 +1,11 @@ import axios from "axios"; /** - * Tests whether the given variable is a real object and not an Array - * @param it The variable to test + * Tests whether the given variable is a real object and not an Array. + * + * @param it The variable to test. */ -export function isObject(it: unknown): it is Record { +export function isObject(it: unknown): it is Record { // This is necessary because: // typeof null === 'object' // typeof [] === 'object' @@ -14,15 +15,19 @@ export function isObject(it: unknown): it is Record { /** * Tests whether the given variable is really an Array + * * @param it The variable to test */ -export function isArray(it: unknown): it is any[] { - if (Array.isArray != null) return Array.isArray(it); +export function isArray(it: unknown): it is unknown[] { + if (Array.isArray != null) { + return Array.isArray(it); + } return Object.prototype.toString.call(it) === "[object Array]"; } /** * Translates text using the Google Translate API + * * @param text The text to translate * @param targetLang The target languate * @param yandexApiKey The yandex API key. You can create one for free at https://translate.yandex.com/developers @@ -35,13 +40,14 @@ export async function translateText(text: string, targetLang: string, yandexApiK } if (yandexApiKey) { return translateYandex(text, targetLang, yandexApiKey); - } else { - return translateGoogle(text, targetLang); } + return "DISABLED"; + //return translateGoogle(text, targetLang); } /** * Translates text with Yandex API + * * @param text The text to translate * @param targetLang The target languate * @param apiKey The yandex API key. You can create one for free at https://translate.yandex.com/developers @@ -52,36 +58,12 @@ async function translateYandex(text: string, targetLang: string, apiKey: string) } try { const url = `https://translate.yandex.net/api/v1.5/tr.json/translate?key=${apiKey}&text=${encodeURIComponent(text)}&lang=en-${targetLang}`; - const response = await axios.request({ url, timeout: 15000 }); + const response = await axios.request({ url, timeout: 15000 }); if (isArray(response.data?.text)) { return response.data.text[0]; } throw new Error(`Invalid response for translate request`); - } catch (e: any) { + } catch (e) { throw new Error(`Could not translate to "${targetLang}": ${e}`); } } - -/** - * Translates text with Google API - * @param text The text to translate - * @param targetLang The target languate - */ -async function translateGoogle(text: string, targetLang: string): Promise { - try { - // prettier-ignore - const url = `http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=${targetLang}&dt=t&q=${encodeURIComponent(text)}&ie=UTF-8&oe=UTF-8`; - const response = await axios.request({ url, timeout: 15000 }); - if (isArray(response.data)) { - // we got a valid response - return response.data[0][0][0]; - } - throw new Error(`Invalid response for translate request`); - } catch (e: any) { - if (e.response?.status === 429) { - throw new Error(`Could not translate to "${targetLang}": Rate-limited by Google Translate`); - } else { - throw new Error(`Could not translate to "${targetLang}": ${e}`); - } - } -} diff --git a/src/main.ts b/src/main.ts index b04dcac7..3d6a0a67 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,20 +1,15 @@ // The adapter-core module gives you access to the core ioBroker functions you need to create an adapter import * as utils from "@iobroker/adapter-core"; import { CronJob } from "cron"; -import { format } from "date-fns"; -import { IConfig } from "tibber-api"; +import { addDays, differenceInDays, format, isSameDay, parseISO } from "date-fns"; +import type { IConfig } from "tibber-api"; +import type { IHomeInfo } from "./lib/projectUtils"; import { TibberAPICaller } from "./lib/tibberAPICaller"; import { TibberCalculator } from "./lib/tibberCalculator"; -import { IHomeInfo } from "./lib/tibberHelper"; import { TibberLocal } from "./lib/tibberLocal"; import { TibberPulse } from "./lib/tibberPulse"; class Tibberlink extends utils.Adapter { - cronList: CronJob[]; - homeInfoList: IHomeInfo[] = []; - queryUrl: string = ""; - tibberCalculator = new TibberCalculator(this); - public constructor(options: Partial = {}) { super({ ...options, @@ -30,6 +25,11 @@ class Tibberlink extends utils.Adapter { this.queryUrl = "https://api.tibber.com/v1-beta/gql"; } + private cronList: CronJob[]; + private homeInfoList: IHomeInfo[] = []; + private queryUrl = ""; + private tibberCalculator = new TibberCalculator(this); + /** * Is called when databases are connected and adapter received configuration. */ @@ -38,7 +38,7 @@ class Tibberlink extends utils.Adapter { if (!this.config.TibberAPIToken) { // No Token defined in configuration this.log.error(`Missing API Token - please check configuration`); - this.setState(`info.connection`, false, true); + void this.setState(`info.connection`, false, true); } else { // Need 2 configs - API and Feed (feed changed query url) const tibberConfigAPI: IConfig = { @@ -46,7 +46,7 @@ class Tibberlink extends utils.Adapter { apiEndpoint: { apiKey: this.config.TibberAPIToken, queryUrl: this.queryUrl, - userAgent: `${this.config.TibberAPIToken.slice(5, 20).split("").reverse().join("")}${Date.now}`, + userAgent: `${this.config.TibberAPIToken.slice(5, 20).split("").reverse().join("")}${Date.now()}`, }, }; // Now read homes list from API @@ -59,14 +59,14 @@ class Tibberlink extends utils.Adapter { //set data in homeinfolist according to config data const result: any[] = []; for (const home of this.config.HomesList) { - const matchingHomeInfo = this.homeInfoList.find((info) => info.ID === home.homeID); + const matchingHomeInfo = this.homeInfoList.find(info => info.ID === home.homeID); if (!matchingHomeInfo) { this.log.error( `Configured feed for Home ID: ${home.homeID} not found in current data from Tibber server - delete the configuration line or verify any faults in your Tibber connection`, ); continue; } - if (result.some((info) => info.ID === matchingHomeInfo.ID)) { + if (result.some(info => info.ID === matchingHomeInfo.ID)) { this.log.warn( `Double configuration of Home ID: ${home.homeID} found - please remove obsolete line in config - data of first instance will be used`, ); @@ -76,12 +76,12 @@ class Tibberlink extends utils.Adapter { matchingHomeInfo.PriceDataPollActive = home.priceDataPollActive; result.push(matchingHomeInfo); } - for (const index in this.homeInfoList) { + for (const homeInfo of this.homeInfoList) { this.log.debug( - `Feed Config for Home: ${this.homeInfoList[index].NameInApp} (${this.homeInfoList[index].ID}) - realtime data available: ${this.homeInfoList[index].RealTime} - feed configured as active: ${this.homeInfoList[index].FeedActive}`, + `Feed Config for Home: ${homeInfo.NameInApp} (${homeInfo.ID}) - realtime data available: ${homeInfo.RealTime} - feed configured as active: ${homeInfo.FeedActive}`, ); this.log.debug( - `Price Poll Config for Home: ${this.homeInfoList[index].NameInApp} (${this.homeInfoList[index].ID}) - poll configured as active: ${this.homeInfoList[index].PriceDataPollActive}`, + `Price Poll Config for Home: ${homeInfo.NameInApp} (${homeInfo.ID}) - poll configured as active: ${homeInfo.PriceDataPollActive}`, ); } } @@ -90,17 +90,17 @@ class Tibberlink extends utils.Adapter { `No configuration of Tibber Pulse feeds found! Please configure to get live data - or configure your home(s) to discard live data`, ); } - } catch (error: any) { + } catch (error: unknown) { this.log.error(tibberAPICaller.generateErrorMessage(error, `pull of homes from Tibber-Server`)); } // if feed is not used - set info.connection if data received - if (this.config.HomesList?.every((info) => !info.feedActive)) { + if (this.config.HomesList?.every(info => !info.feedActive)) { if (this.homeInfoList.length > 0) { - this.setState("info.connection", true, true); + void this.setState("info.connection", true, true); this.log.debug(`Connection Check: Feed not enabled and I received home list from api - good connection`); } else { - this.setState("info.connection", false, true); + void this.setState("info.connection", false, true); this.log.debug(`Connection Check: Feed not enabled and I do not get home list from api - bad connection`); } } @@ -110,9 +110,13 @@ class Tibberlink extends utils.Adapter { const sentryInstance = this.getPluginInstance("sentry"); const today = new Date(); const last = await this.getStateAsync("info.LastSentryLogDay"); + const lastDate = last?.val ? parseISO(last.val as string) : null; const pulseLocal = this.config.UseLocalPulseData ? 1 : 0; - if (last?.val != (await today.getDate())) { - await this.tibberCalculator.updateCalculatorUsageStats(); + + // Verify if 3 or more days in the past + if (!lastDate || differenceInDays(today, lastDate) >= 3) { + // WiP 4.0.0 if (last?.val != today.getDate()) { + this.tibberCalculator.updateCalculatorUsageStats(); if (sentryInstance) { const Sentry = sentryInstance.getSentryObject(); Sentry && @@ -128,11 +132,10 @@ class Tibberlink extends utils.Adapter { scope.setTag("numBestSingleHours", this.tibberCalculator.numBestSingleHours); scope.setTag("numBestSingleHoursLTF", this.tibberCalculator.numBestSingleHoursLTF); scope.setTag("numSmartBatteryBuffer", this.tibberCalculator.numSmartBatteryBuffer); - //scope.setTag("usedAdminAdapter", version); - Sentry.captureMessage("Adapter TibberLink started", "info"); // Level "info" + Sentry.captureMessage("Adapter TibberLink started", "info"); }); } - this.setStateAsync("info.LastSentryLogDay", { val: today.getDate(), ack: true }); + void this.setState("info.LastSentryLogDay", { val: today.getDate(), ack: true }); } } @@ -154,7 +157,7 @@ class Tibberlink extends utils.Adapter { for (const channel in this.config.CalculatorList) { await tibberCalculator.setupCalculatorStates(this.config.CalculatorList[channel].chHomeID, parseInt(channel)); } - } catch (error: any) { + } catch (error: unknown) { this.log.warn(tibberAPICaller.generateErrorMessage(error, `setup of calculator states`)); } } @@ -166,25 +169,25 @@ class Tibberlink extends utils.Adapter { try { this.log.info(`Setting up local poll of consumption data for ${this.config.PulseList.length} pulse module(s)`); for (const pulse in this.config.PulseList) { - await tibberLocal.setupOnePulseLocal(parseInt(pulse)); + tibberLocal.setupOnePulseLocal(parseInt(pulse)); } - } catch (error: any) { + } catch (error: unknown) { this.log.warn(tibberAPICaller.generateErrorMessage(error, `setup of local Pulse data poll`)); } } //Local Bridge Call // (force) get current prices and start calculator tasks once for the FIRST time - if (!(await tibberAPICaller.updateCurrentPriceAllHomes(this.homeInfoList, true))) { - } - this.jobPricesTodayLOOP(tibberAPICaller); - this.jobPricesTomorrowLOOP(tibberAPICaller); - tibberCalculator.startCalculatorTasks(false, true); + await tibberAPICaller.updateCurrentPriceAllHomes(this.homeInfoList, true); + + void this.jobPricesTodayLOOP(tibberAPICaller); + void this.jobPricesTomorrowLOOP(tibberAPICaller); + void tibberCalculator.startCalculatorTasks(false, true); // Get consumption data for the first time - tibberAPICaller.updateConsumptionAllHomes(); + void tibberAPICaller.updateConsumptionAllHomes(); const jobCurrentPrice = CronJob.from({ - cronTime: "20 57 * * * *", //"20 57 * * * *" = 3 minuten vor 00:00:20 jede Stunde + cronTime: "20 57 * * * *", //"20 58 * * * *" = 2 minutes before 00:00:20 jede Stunde => 00:01:20 - 00:03:20 onTick: async () => { let okPrice = false; do { @@ -192,35 +195,39 @@ class Tibberlink extends utils.Adapter { okPrice = await tibberAPICaller.updateCurrentPriceAllHomes(this.homeInfoList); this.log.debug(`Cron job CurrentPrice - okPrice: ${okPrice}`); } while (!okPrice); - tibberCalculator.startCalculatorTasks(); - tibberAPICaller.updateConsumptionAllHomes(); + void tibberCalculator.startCalculatorTasks(); + void tibberAPICaller.updateConsumptionAllHomes(); }, start: true, timeZone: "system", runOnInit: false, }); - if (jobCurrentPrice) this.cronList.push(jobCurrentPrice); + if (jobCurrentPrice) { + this.cronList.push(jobCurrentPrice); + } const jobPricesToday = CronJob.from({ - cronTime: "20 56 23 * * *", //"20 56 23 * * *" = 5 minuten vor 00:01:20 + cronTime: "20 56 23 * * *", //"20 56 23 * * *" = 5 minutes before 00:01:20 => 00:00:20 - 00:02:20 for first try onTick: async () => { let okPrice = false; do { await this.delay(this.getRandomDelay(4, 6)); + await tibberAPICaller.updatePricesTomorrowAllHomes(this.homeInfoList); okPrice = await tibberAPICaller.updatePricesTodayAllHomes(this.homeInfoList); this.log.debug(`Cron job PricesToday - okPrice: ${okPrice}`); } while (!okPrice); - await tibberAPICaller.updatePricesTomorrowAllHomes(this.homeInfoList); - tibberCalculator.startCalculatorTasks(); + void tibberCalculator.startCalculatorTasks(); }, start: true, timeZone: "system", runOnInit: true, }); - if (jobPricesToday) this.cronList.push(jobPricesToday); + if (jobPricesToday) { + this.cronList.push(jobPricesToday); + } const jobPricesTomorrow = CronJob.from({ - cronTime: "20 56 12 * * *", //"20 56 12 * * *" = 5 minuten vor 13:01:20 + cronTime: "20 56 12 * * *", //"20 56 12 * * *" = 5 minutes before 13:01:20 => 13:00:20 - 13:02:20 for first try onTick: async () => { let okPrice = false; do { @@ -228,16 +235,18 @@ class Tibberlink extends utils.Adapter { okPrice = await tibberAPICaller.updatePricesTomorrowAllHomes(this.homeInfoList); this.log.debug(`Cron job PricesTomorrow - okPrice: ${okPrice}`); } while (!okPrice); - tibberCalculator.startCalculatorTasks(); + void tibberCalculator.startCalculatorTasks(); }, start: true, timeZone: "system", runOnInit: true, }); - if (jobPricesTomorrow) this.cronList.push(jobPricesTomorrow); + if (jobPricesTomorrow) { + this.cronList.push(jobPricesTomorrow); + } //#region *** If user uses live feed - start feed connection *** - if (this.homeInfoList.some((info) => info.FeedActive)) { + if (this.homeInfoList.some(info => info.FeedActive)) { // array with configs of feeds, init with base data set const tibberFeedConfigs: IConfig[] = Array.from({ length: this.homeInfoList.length }, () => { return { @@ -245,17 +254,18 @@ class Tibberlink extends utils.Adapter { apiEndpoint: { apiKey: this.config.TibberAPIToken, queryUrl: this.queryUrl, - userAgent: `${this.config.TibberAPIToken.slice(5, 20).split("").reverse().join("")}${Date.now}`, + userAgent: `${this.config.TibberAPIToken.slice(5, 20).split("").reverse().join("")}${Date.now()}`, }, timestamp: true, }; }); const tibberPulseInstances = new Array(this.homeInfoList.length); // array for TibberPulse-instances - if (!this.homeInfoList.some((homeInfo) => homeInfo.ID == `None available - restart adapter after entering token`)) { - this.delObjectAsync(`Homes.None available - restart adapter after entering token`, { recursive: true }); + if (!this.homeInfoList.some(homeInfo => homeInfo.ID == `None available - restart adapter after entering token`)) { + await this.delObjectAsync(`Homes.None available - restart adapter after entering token`, { recursive: true }); } + // eslint-disable-next-line @typescript-eslint/no-for-in-array for (const index in this.homeInfoList) { if (!this.homeInfoList[index].FeedActive || !this.homeInfoList[index].RealTime) { this.log.warn(`skipping feed of live data - no Pulse configured for this home according to Tibber server`); @@ -266,29 +276,75 @@ class Tibberlink extends utils.Adapter { // define the fields for datafeed tibberFeedConfigs[index].homeId = this.homeInfoList[index].ID; tibberFeedConfigs[index].power = true; - if (this.config.FeedConfigLastMeterConsumption) tibberFeedConfigs[index].lastMeterConsumption = true; - if (this.config.FeedConfigAccumulatedConsumption) tibberFeedConfigs[index].accumulatedConsumption = true; - if (this.config.FeedConfigAccumulatedProduction) tibberFeedConfigs[index].accumulatedProduction = true; - if (this.config.FeedConfigAccumulatedConsumptionLastHour) tibberFeedConfigs[index].accumulatedConsumptionLastHour = true; - if (this.config.FeedConfigAccumulatedProductionLastHour) tibberFeedConfigs[index].accumulatedProductionLastHour = true; - if (this.config.FeedConfigAccumulatedCost) tibberFeedConfigs[index].accumulatedCost = true; - if (this.config.FeedConfigAccumulatedCost) tibberFeedConfigs[index].accumulatedReward = true; - if (this.config.FeedConfigCurrency) tibberFeedConfigs[index].currency = true; - if (this.config.FeedConfigMinPower) tibberFeedConfigs[index].minPower = true; - if (this.config.FeedConfigAveragePower) tibberFeedConfigs[index].averagePower = true; - if (this.config.FeedConfigMaxPower) tibberFeedConfigs[index].maxPower = true; - if (this.config.FeedConfigPowerProduction) tibberFeedConfigs[index].powerProduction = true; - if (this.config.FeedConfigMinPowerProduction) tibberFeedConfigs[index].minPowerProduction = true; - if (this.config.FeedConfigMaxPowerProduction) tibberFeedConfigs[index].maxPowerProduction = true; - if (this.config.FeedConfigLastMeterProduction) tibberFeedConfigs[index].lastMeterProduction = true; - if (this.config.FeedConfigPowerFactor) tibberFeedConfigs[index].powerFactor = true; - if (this.config.FeedConfigVoltagePhase1) tibberFeedConfigs[index].voltagePhase1 = true; - if (this.config.FeedConfigVoltagePhase2) tibberFeedConfigs[index].voltagePhase2 = true; - if (this.config.FeedConfigVoltagePhase3) tibberFeedConfigs[index].voltagePhase3 = true; - if (this.config.FeedConfigCurrentL1) tibberFeedConfigs[index].currentL1 = true; - if (this.config.FeedConfigCurrentL2) tibberFeedConfigs[index].currentL2 = true; - if (this.config.FeedConfigCurrentL3) tibberFeedConfigs[index].currentL3 = true; - if (this.config.FeedConfigSignalStrength) tibberFeedConfigs[index].signalStrength = true; + if (this.config.FeedConfigLastMeterConsumption) { + tibberFeedConfigs[index].lastMeterConsumption = true; + } + if (this.config.FeedConfigAccumulatedConsumption) { + tibberFeedConfigs[index].accumulatedConsumption = true; + } + if (this.config.FeedConfigAccumulatedProduction) { + tibberFeedConfigs[index].accumulatedProduction = true; + } + if (this.config.FeedConfigAccumulatedConsumptionLastHour) { + tibberFeedConfigs[index].accumulatedConsumptionLastHour = true; + } + if (this.config.FeedConfigAccumulatedProductionLastHour) { + tibberFeedConfigs[index].accumulatedProductionLastHour = true; + } + if (this.config.FeedConfigAccumulatedCost) { + tibberFeedConfigs[index].accumulatedCost = true; + } + if (this.config.FeedConfigAccumulatedCost) { + tibberFeedConfigs[index].accumulatedReward = true; + } + if (this.config.FeedConfigCurrency) { + tibberFeedConfigs[index].currency = true; + } + if (this.config.FeedConfigMinPower) { + tibberFeedConfigs[index].minPower = true; + } + if (this.config.FeedConfigAveragePower) { + tibberFeedConfigs[index].averagePower = true; + } + if (this.config.FeedConfigMaxPower) { + tibberFeedConfigs[index].maxPower = true; + } + if (this.config.FeedConfigPowerProduction) { + tibberFeedConfigs[index].powerProduction = true; + } + if (this.config.FeedConfigMinPowerProduction) { + tibberFeedConfigs[index].minPowerProduction = true; + } + if (this.config.FeedConfigMaxPowerProduction) { + tibberFeedConfigs[index].maxPowerProduction = true; + } + if (this.config.FeedConfigLastMeterProduction) { + tibberFeedConfigs[index].lastMeterProduction = true; + } + if (this.config.FeedConfigPowerFactor) { + tibberFeedConfigs[index].powerFactor = true; + } + if (this.config.FeedConfigVoltagePhase1) { + tibberFeedConfigs[index].voltagePhase1 = true; + } + if (this.config.FeedConfigVoltagePhase2) { + tibberFeedConfigs[index].voltagePhase2 = true; + } + if (this.config.FeedConfigVoltagePhase3) { + tibberFeedConfigs[index].voltagePhase3 = true; + } + if (this.config.FeedConfigCurrentL1) { + tibberFeedConfigs[index].currentL1 = true; + } + if (this.config.FeedConfigCurrentL2) { + tibberFeedConfigs[index].currentL2 = true; + } + if (this.config.FeedConfigCurrentL3) { + tibberFeedConfigs[index].currentL3 = true; + } + if (this.config.FeedConfigSignalStrength) { + tibberFeedConfigs[index].signalStrength = true; + } tibberPulseInstances[index] = new TibberPulse(tibberFeedConfigs[index], this); // add new instance to array tibberPulseInstances[index].ConnectPulseStream(); } catch (error) { @@ -303,6 +359,8 @@ class Tibberlink extends utils.Adapter { /** * subfunction to loop till prices today for all homes are got from server - adapter startup-phase + * + * @param tibberAPICaller - TibberAPICaller */ private async jobPricesTodayLOOP(tibberAPICaller: TibberAPICaller): Promise { let okPrice = false; @@ -315,6 +373,8 @@ class Tibberlink extends utils.Adapter { /** * subfunction to loop till prices tomorrow for all homes are got from server - adapter startup-phase + * + * @param tibberAPICaller - TibberAPICaller */ private async jobPricesTomorrowLOOP(tibberAPICaller: TibberAPICaller): Promise { let okPrice = false; @@ -333,13 +393,17 @@ class Tibberlink extends utils.Adapter { * @returns delay - milliseconds as integer */ private getRandomDelay = (minMinutes: number, maxMinutes: number): number => { - if (minMinutes >= maxMinutes) throw new Error("minMinutes should be less than maxMinutes"); + if (minMinutes >= maxMinutes) { + throw new Error("minMinutes should be less than maxMinutes"); + } const randomMinutes = Math.random() * (maxMinutes - minMinutes) + minMinutes; return Math.floor(randomMinutes * 60 * 1000); }; /** * Is called from adapter config screen + * + * @param obj - any */ private onMessage(obj: any): void { if (obj) { @@ -351,7 +415,7 @@ class Tibberlink extends utils.Adapter { this.sendTo( obj.from, obj.command, - this.homeInfoList.map((item) => ({ + this.homeInfoList.map(item => ({ label: `${item.NameInApp} (${item.ID})`, value: item.ID, })), @@ -361,7 +425,7 @@ class Tibberlink extends utils.Adapter { this.log.warn(`No Homes available to config TibberLink`); this.sendTo(obj.from, obj.command, [{ label: "None available", value: "None available" }], obj.callback); } - } catch (error) { + } catch { this.sendTo(obj.from, obj.command, [{ label: "None available", value: "None available" }], obj.callback); } } @@ -373,7 +437,7 @@ class Tibberlink extends utils.Adapter { this.sendTo( obj.from, obj.command, - this.homeInfoList.map((item) => ({ + this.homeInfoList.map(item => ({ //label: `${item.NameInApp} (${item.ID.substring(item.ID.lastIndexOf("-") + 1)})`, label: `${item.NameInApp} (...${item.ID.slice(-8)})`, value: item.ID, @@ -384,7 +448,7 @@ class Tibberlink extends utils.Adapter { this.log.warn(`No Homes available to config TibberLink Calculator`); this.sendTo(obj.from, obj.command, [{ label: "None available", value: "None available" }], obj.callback); } - } catch (error) { + } catch { this.sendTo(obj.from, obj.command, [{ label: "None available", value: "None available" }], obj.callback); } } @@ -395,6 +459,8 @@ class Tibberlink extends utils.Adapter { /** * Is called when adapter shuts down - callback has to be called under any circumstances! + * + * @param callback - void */ private onUnload(callback: () => void): void { try { @@ -403,11 +469,9 @@ class Tibberlink extends utils.Adapter { cronJob.stop(); } if (this.config.UseLocalPulseData) { - //tibberLocal - //WiP call shutdown in tibberLocale + //WiP call shutdown in tibberLocal } - // info.connect to false, when adapter is shut down - this.setState("info.connection", false, true); + void this.setState("info.connection", false, true); callback(); } catch (e) { this.log.warn((e as Error).message); @@ -417,6 +481,9 @@ class Tibberlink extends utils.Adapter { /** * Is called if a subscribed state changes + * + * @param id - state ID + * @param state - ioBroker state object */ private onStateChange(id: string, state: ioBroker.State | null | undefined): void { try { @@ -424,6 +491,7 @@ class Tibberlink extends utils.Adapter { // The state was changed // this.adapter.subscribeStates(`Homes.${homeId}.Calculations.${channel}.*`); if (!state.ack) { + this.log.debug(`state change detected and parsing for id: ${id} - state: ${state.val}`); if (id.includes(`.Calculations.`)) { const statePath = id.split("."); const homeIDToMatch = statePath[3]; @@ -439,7 +507,7 @@ class Tibberlink extends utils.Adapter { this.log.debug( `calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to Active: ${this.config.CalculatorList[calcChannel].chActive}`, ); - this.setStateAsync(id, state.val, true); // set acknowledge true + void this.setState(id, state.val, true); // set acknowledge true } else { this.log.warn(`Wrong type for channel: ${calcChannel} - chActive: ${state.val}`); } @@ -451,7 +519,7 @@ class Tibberlink extends utils.Adapter { this.log.debug( `calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to TriggerPrice: ${this.config.CalculatorList[calcChannel].chTriggerPrice}`, ); - this.setStateAsync(id, state.val, true); + void this.setState(id, state.val, true); } else { this.log.warn(`Wrong type for channel: ${calcChannel} - chTriggerPrice: ${state.val}`); } @@ -463,7 +531,7 @@ class Tibberlink extends utils.Adapter { this.log.debug( `calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to AmountHours: ${this.config.CalculatorList[calcChannel].chAmountHours}`, ); - this.setStateAsync(id, state.val, true); + void this.setState(id, state.val, true); } else { this.log.warn(`Wrong type for channel: ${calcChannel} - chAmountHours: ${state.val}`); } @@ -485,7 +553,7 @@ class Tibberlink extends utils.Adapter { "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", )}`, ); - this.setStateAsync(id, format(dateWithTimeZone, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + void this.setState(id, format(dateWithTimeZone, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); } else { this.log.warn( `Invalid ISO-8601 format or missing timezone offset for channel: ${calcChannel} - chStartTime: ${state.val}`, @@ -506,13 +574,28 @@ class Tibberlink extends utils.Adapter { // floor to hour dateWithTimeZone.setMinutes(0, 0, 0); this.config.CalculatorList[calcChannel].chStopTime = dateWithTimeZone; + + // WIP 3.5.4 START Warn long LTF + // Get StartTime directly as a Date object + const startTime = this.config.CalculatorList[calcChannel].chStartTime; + // Check if StopTime is not the same day or the next day as StartTime + if (!isSameDay(dateWithTimeZone, startTime) && !isSameDay(dateWithTimeZone, addDays(startTime, 1))) { + this.log.warn( + `StopTime for channel ${calcChannel} is not the same or next day as StartTime! StartTime: ${startTime.toISOString()}, StopTime: ${dateWithTimeZone.toISOString()}`, + ); + this.log.warn( + `Setting StopTime outside the feasible range (same or next day as StartTime) can lead to errors in calculations or unexpected behavior. Please verify your configuration.`, + ); + } + // WIP 3.5.4 STOP + this.log.debug( `calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to StopTime: ${format( dateWithTimeZone, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", )}`, ); - this.setStateAsync(id, format(dateWithTimeZone, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); + void this.setState(id, format(dateWithTimeZone, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"), true); } else { this.log.warn( `Invalid ISO-8601 format or missing timezone offset for channel: ${calcChannel} - chStopTime: ${state.val}`, @@ -529,7 +612,7 @@ class Tibberlink extends utils.Adapter { this.log.debug( `calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to RepeatDays: ${this.config.CalculatorList[calcChannel].chRepeatDays}`, ); - this.setStateAsync(id, state.val, true); + void this.setState(id, state.val, true); } else { this.log.warn(`Wrong type for channel: ${calcChannel} - chRepeatDays: ${state.val}`); } @@ -541,7 +624,7 @@ class Tibberlink extends utils.Adapter { this.log.debug( `calculator settings state in home: ${homeIDToMatch} - channel: ${calcChannel} - changed to EfficiencyLoss: ${this.config.CalculatorList[calcChannel].chEfficiencyLoss}`, ); - this.setStateAsync(id, state.val, true); + void this.setState(id, state.val, true); } else { this.log.warn(`Wrong type for channel: ${calcChannel} - chEfficiencyLoss: ${state.val}`); } @@ -549,7 +632,7 @@ class Tibberlink extends utils.Adapter { default: this.log.debug(`unknown value for setting type: ${settingType}`); } - this.tibberCalculator.startCalculatorTasks(true); + void this.tibberCalculator.startCalculatorTasks(true); } else { this.log.debug(`wrong index values in state ID or missing value for settingType`); } diff --git a/test/mocha.setup.js b/test/mocha.setup.js index 2b8c50ee..192a80da 100644 --- a/test/mocha.setup.js +++ b/test/mocha.setup.js @@ -8,7 +8,7 @@ process.env.TS_NODE_PROJECT = "tsconfig.json"; process.env.TS_NODE_FILES = "TRUE"; // Don't silently swallow unhandled rejections -process.on("unhandledRejection", (e) => { +process.on("unhandledRejection", e => { throw e; }); diff --git a/test/tsconfig.json b/test/tsconfig.json index 3d5bb6b8..3ebc81b6 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -3,5 +3,7 @@ "compilerOptions": { "noImplicitAny": false }, - "include": ["./**/*.js"] + "include": [ + "./**/*.js" + ] } diff --git a/tsconfig.build.json b/tsconfig.build.json index 41d6e9ee..1f040ce1 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -7,6 +7,10 @@ "noEmit": false, "declaration": false }, - "include": ["src/**/*.ts"], - "exclude": ["src/**/*.test.ts"] + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/**/*.test.ts" + ] } diff --git a/tsconfig.json b/tsconfig.json index 3e68d5f9..ab28f3ac 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,9 +20,9 @@ // this is necessary for the automatic typing of the adapter config "resolveJsonModule": true, - // Set this to false if you want to disable the very strict rules (not recommended) - "strict": true, - // Or enable some of those features for more fine-grained control + // If you want to disable the stricter type checks (not recommended), uncomment the following line + // "strict": false, + // And enable some of those features for more fine-grained control // "strictNullChecks": true, // "strictPropertyInitialization": true, // "strictBindCallApply": true, @@ -32,13 +32,13 @@ // Uncomment this if you want the old behavior of catch variables being `any` // "useUnknownInCatchVariables": false, - // Consider targetting es2019 or higher if you only support Node.js 12+ - "target": "es2020", + // Consider targetting ES2022 or higher if you only support Node.js 18+ + "target": "ES2022", "sourceMap": true, - "inlineSourceMap": false, + "inlineSourceMap": false // "watch": false }, - "include": ["src/**/*.ts", "admin/**/*.ts", "admin/**/*.tsx"], - "exclude": ["build/**", "node_modules/**"] + "include": ["src/**/*.ts", "test/**/*.ts", "admin/**/*.ts", "admin/**/*.tsx", "eslint.config.mjs", "prettier.config.mjs"], + "exclude": ["build/**", "node_modules/**", "widgets/**"] }