diff --git a/.eslintrc.json b/.eslintrc.json index ef39dc699..d1b21bcfb 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -30,6 +30,6 @@ ] }, "parserOptions": { - "ecmaVersion": 2018 + "ecmaVersion": 2022 } } \ No newline at end of file diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index a3b65aa2a..129faa3d8 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -19,15 +19,19 @@ on: jobs: check: + if: | + github.repository == 'ioBroker/ioBroker.repositories' + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - run: npm i - run: npm run check env: OWN_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + IOBBOT_GITHUB_TOKEN: ${{ secrets.IOBBOT_GITHUB_TOKEN }} GITHUB_REF: ${{ env.GITHUB_REF }} GITHUB_EVENT_PATH: ${{ env.GITHUB_EVENT_PATH }} diff --git a/.github/workflows/checkArchived.yml b/.github/workflows/checkArchived.yml index 9e279f1e0..e95dd4d4c 100644 --- a/.github/workflows/checkArchived.yml +++ b/.github/workflows/checkArchived.yml @@ -1,6 +1,8 @@ name: Check archived repostories on: + workflow_dispatch: + schedule: # * is a special character in YAML, so you have to quote this string # every sunday at 3:33 @@ -8,10 +10,14 @@ on: jobs: check: + name: check archived + if: | + github.repository == 'ioBroker/ioBroker.repositories' + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - run: npm i diff --git a/.github/workflows/checkNpm.yml b/.github/workflows/checkNpm.yml index f66af56e6..90c99d506 100644 --- a/.github/workflows/checkNpm.yml +++ b/.github/workflows/checkNpm.yml @@ -1,6 +1,8 @@ name: Check npm access on: + workflow_dispatch: + schedule: # * is a special character in YAML, so you have to quote this string # daily at 2:2 @@ -8,10 +10,14 @@ on: jobs: check-npms: + name: check npm access + if: | + github.repository == 'ioBroker/ioBroker.repositories' + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - run: npm i diff --git a/.github/workflows/checkRepositoryFiles.yml b/.github/workflows/checkRepositoryFiles.yml new file mode 100644 index 000000000..9cc84acff --- /dev/null +++ b/.github/workflows/checkRepositoryFiles.yml @@ -0,0 +1,36 @@ +name: Check repository files + +on: + workflow_dispatch: + + schedule: + # * is a special character in YAML, so you have to quote this string + # every day + - cron: '45 */6 * * *' + + push: + branches: + - master + + pull_request: {} + +concurrency: + group: stable-${{ github.head_ref }} + cancel-in-progress: true + +jobs: + check: + name: check repository files + if: | + github.repository == 'ioBroker/ioBroker.repositories' + + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 14 + - run: npm i + - run: npm run test + env: + OWN_GITHUB_TOKEN: ${{ secrets.OWN_GITHUB_TOKEN }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 60e1f321b..50871b036 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -28,18 +28,18 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} queries: +security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/dependabot-auto-merge.yml b/.github/workflows/dependabot-auto-merge.yml index fc331f148..baeae23b5 100644 --- a/.github/workflows/dependabot-auto-merge.yml +++ b/.github/workflows/dependabot-auto-merge.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Check if PR should be auto-merged uses: ahmadnassri/action-dependabot-auto-merge@v2 diff --git a/.github/workflows/handleReminder.yml b/.github/workflows/handleReminder.yml new file mode 100644 index 000000000..6d05215d7 --- /dev/null +++ b/.github/workflows/handleReminder.yml @@ -0,0 +1,40 @@ +# This workflow will triage pull requests and apply a label based on the +# paths that are modified in the pull request. + +name: Handle Reminder + +on: + pull_request_target: + types: [labeled] + + issue_comment: + + workflow_dispatch: + + schedule: + # * is a special character in YAML, so you have to quote this string + # every day + - cron: '0 1 * * *' + +# avoid concurrengt runs +#concurrency: +# group: check-reminder +# cancel-in-progress: true + +jobs: + handleReminder: + name: handlereminder + if: | + github.repository == 'ioBroker/ioBroker.repositories' + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 18 + - run: npm i + - run: npm run handleReminder + env: + OWN_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/manualAction.yml b/.github/workflows/manualAction.yml index 580bceb8f..593d2cf14 100644 --- a/.github/workflows/manualAction.yml +++ b/.github/workflows/manualAction.yml @@ -3,16 +3,31 @@ name: Manual action # configure manual trigger on: workflow_dispatch: - + inputs: + action: + type: choice + description: action to perform + options: + - closeIssue + - reopenIssue + required: true + repository: + type: string + issue: + type: string + jobs: manual-action: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - run: npm i - run: npm run manualAction env: OWN_GITHUB_TOKEN: ${{ secrets.OWN_GITHUB_TOKEN }} + ACTION: ${{ github.event.inputs.action }} + REPOSITORY: ${{ github.event.inputs.repository }} + ISSUE: ${{ github.event.inputs.issue }} diff --git a/.github/workflows/newPrComment.yml b/.github/workflows/newPrComment.yml new file mode 100644 index 000000000..ddf65e167 --- /dev/null +++ b/.github/workflows/newPrComment.yml @@ -0,0 +1,26 @@ +name: New PR comment + +on: issue_comment + +jobs: + pr_commented: + # This job only runs for pull request comments + name: PR comment + if: | + github.repository == 'ioBroker/ioBroker.repositories' && + github.event.issue.pull_request && + github.event.comment.user.login != 'mcm1957' + + runs-on: ubuntu-latest + + steps: + - run: echo user ${{github.event.comment.user.login}} + - uses: actions/github-script@v7 + with: + script: | + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ["*📬"] + }) diff --git a/.github/workflows/readyForStable.yml b/.github/workflows/readyForStable.yml index 966fd003b..8b80f7ed5 100644 --- a/.github/workflows/readyForStable.yml +++ b/.github/workflows/readyForStable.yml @@ -1,22 +1,28 @@ name: Check ready for stable on: + workflow_dispatch: + schedule: # * is a special character in YAML, so you have to quote this string # every day - cron: '33 3 * * *' - workflow_dispatch: - jobs: ready-for-stable: + name: check ready for stable + if: | + github.repository == 'ioBroker/ioBroker.repositories' + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - run: npm i - run: npm run stable env: OWN_GITHUB_TOKEN: ${{ secrets.OWN_GITHUB_TOKEN }} + IOBBOT_GITHUB_TOKEN: ${{ secrets.IOBBOT_GITHUB_TOKEN }} + diff --git a/.github/workflows/setLabels.yml b/.github/workflows/setLabels.yml index 7268dbef5..f53c2d696 100644 --- a/.github/workflows/setLabels.yml +++ b/.github/workflows/setLabels.yml @@ -17,12 +17,15 @@ on: jobs: setLabels: + name: set labels + if: | + github.repository == 'ioBroker/ioBroker.repositories' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - run: npm i diff --git a/.github/workflows/setStableTag.yml b/.github/workflows/setStableTag.yml new file mode 100644 index 000000000..e7ab8cc4c --- /dev/null +++ b/.github/workflows/setStableTag.yml @@ -0,0 +1,38 @@ +# +# This workflow scans a dedicated list of adapters (hardcode at setStableTag.js) and ensures that the release number listed +# at sources-dist-stable.json and the release tagged as 'stable' at npm are identical. If a difference is detected, the dist-tag +# at npmjs is changed to meet the contents of sources-dist-stable.json. +# +# This workflow is triggered by any push and additionally runs once a day +# + +name: Set stable tag + +on: + workflow_dispatch: + + push: + branches: [ "master" ] + + schedule: + # * is a special character in YAML, so you have to quote this string + # every day at 1:00:00 + - cron: '0 1 * * *' + +jobs: + set-stable-tag: + name: set stable tag + if: | + github.repository == 'ioBroker/ioBroker.repositories' + + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 18 + - run: npm i + - run: npm run setStableTag + env: + OWN_GITHUB_TOKEN: ${{ secrets.OWN_GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TAG }} diff --git a/.github/workflows/setTag.yml b/.github/workflows/setTag.yml new file mode 100644 index 000000000..ba9d29510 --- /dev/null +++ b/.github/workflows/setTag.yml @@ -0,0 +1,31 @@ +name: Set tag + +# set tag +on: + workflow_dispatch: + inputs: + tag: + type: choice + description: select tag to set + options: + - dev + - latest + - next + - stable + required: true + adapter: + type: string + required: true + release: + type: string + required: true + +jobs: + set-tag: + runs-on: ubuntu-latest + steps: + - uses: actions/setup-node@v4 + with: + node-version: 18 + - run: npm dist-tag list iobroker.${{ github.event.inputs.adapter }} + - run: npm --//registry.npmjs.org/:_authToken=${{secrets.NPM_TAG}} dist-tag add iobroker.${{ github.event.inputs.adapter }}@${{ github.event.inputs.release }} ${{ github.event.inputs.tag }} diff --git a/.github/workflows/stable0DayPrInfo.yml b/.github/workflows/stable0DayPrInfo.yml new file mode 100644 index 000000000..e18f06404 --- /dev/null +++ b/.github/workflows/stable0DayPrInfo.yml @@ -0,0 +1,32 @@ +# This workflow will triage pull requests and apply a label based on the +# paths that are modified in the pull request. + +name: Stable 0-Day PR Info + +# +# WARNING: +# ** Do NOT run untrusted code when using pull_request_target ** +# pull_request_target is needed as pull_request does not provide secrets and so no +# labeling of PR is possible. +# +on: + pull_request_target: + types: [labeled, unlabeled] + +jobs: + stableBrandNewInfo: + name: stable brand new info + if: | + github.repository == 'ioBroker/ioBroker.repositories' + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 18 + - run: npm i + - run: npm run stable0DayPrInfo + env: + OWN_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/stableBrandNewInfo.yml b/.github/workflows/stableBrandNewInfo.yml new file mode 100644 index 000000000..0ef4eaa7e --- /dev/null +++ b/.github/workflows/stableBrandNewInfo.yml @@ -0,0 +1,32 @@ +# This workflow will triage pull requests and apply a label based on the +# paths that are modified in the pull request. + +name: Stable Brand-New Info + +# +# WARNING: +# ** Do NOT run untrusted code when using pull_request_target ** +# pull_request_target is needed as pull_request does not provide secrets and so no +# labeling of PR is possible. +# +on: + pull_request_target: + types: [labeled, unlabeled] + +jobs: + stableBrandNewInfo: + name: stable brand new info + if: | + github.repository == 'ioBroker/ioBroker.repositories' + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 18 + - run: npm i + - run: npm run stableBrandNewInfo + env: + OWN_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 9f5ae140a..000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1 +0,0 @@ -name: Check stable versions on: push: branches: - master pull_request: {} concurrency: group: stable-${{ github.head_ref }} cancel-in-progress: true jobs: check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: 14 - run: npm i - run: npm run test env: OWN_GITHUB_TOKEN: ${{ secrets.OWN_GITHUB_TOKEN }} \ No newline at end of file diff --git a/LICENSE b/LICENSE index f6264220c..004a660fe 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017-2022 +Copyright (c) 2017-2024 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 1f750b51c..67a869bba 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ This is GitHub project for storage of latest and stable repositories. 5. Create a PR ## Add a new adapter to the latest repository (web frontend) -1. Go to iobroker.dev +1. Go to [iobroker.dev](https://www.iobroker.dev/) 2. Log in with GitHub 3. Open the new adapter 4. Click on manage @@ -31,7 +31,7 @@ This is GitHub project for storage of latest and stable repositories. 3. `title` in `io-package.json` (`common`) is simple short name of adapter in english. `titleLang` is object that consists short names in many languages. `Lang` ist not german `Länge`, but english `LANGuages`. 4. Adapter needs to have a `README.md` with description, detail information and changelog. English is mandatory. Other languages are welcome. See [Example of README.md](#example-of-readme-md). - **In `README.md`, there must be a link to the device or the manufacturer's website. Devices must have a photo. Services do not require a photo, but are still welcome.** + **In `README.md`, there must be a link to the device or the manufacturer's website. Devices must have a photo. Services do not require a photo but are still welcome.** 5. Adapter must have a predefined license. 6. Please remove `www`, `widgets` and `docs` directories (`admin/tab_m.html`, `admin/custom_m.html`) if not used. 7. Adapter needs to have at least Adapter basic testing (installing, running) using GitHub actions. More information in Forum from `apollon77` (Just take from other adapters the samples) @@ -66,7 +66,7 @@ This is GitHub project for storage of latest and stable repositories. * If you have an older implementation that uses encrypt/decrypt functions in `index(_m).html` and in `main.js` you can just convert to this by removing the extra encrypt/decrypt usages in all places and do the above. * add all editable fields from `index_m.html` to `io-package.json` `native` with their default values * **You need to make sure to clean up ALL resources in `unload`. Clear all Timers, Intervals, close serial ports and servers and end everything. Else this will break the compact mode** (or also see next point!) -* Use `adapter.setTimeout/setInterval` and corresponding clear Methods to create timers and intervals that are automatically cleaned up when the adapter gets unloaded and make sure to not start new timers/intervals after adapter is stopped already. This can help in many cases and is near to a drop in replacement for Timers from `Node.js` (but it is NOT an object, so the methods on Timer objects will not work!) +* Use `adapter.setTimeout/setInterval` and corresponding clear Methods to create timers and intervals that are automatically cleaned up when the adapter gets unloaded and make sure to not start new timers/intervals after adapter is stopped already. This can help in many cases and is near to a drop-in replacement for Timers from `Node.js` (but it is NOT an object, so the methods on Timer objects will not work!) * **Please test in compact mode!** Especially starting, running, stopping adapter and verify that nothing runs any longer and no logs are triggered and also a new start works. * Be careful with `setObject` because it overwrites the object and (especially in `js-controller < 2.2`) custom settings like history may be removed by this! Use `setObjectNotExists` or read the object to detect if it exists and use `extendObject` to update. * get familiar with the `ack` concept of ioBroker. Adapters normally set all "final" values with `ack=true` and these are mostly ignored in `onStateChange` handlers. `ack=false` are commands that normally are handled by Adapters. @@ -78,10 +78,11 @@ This is GitHub project for storage of latest and stable repositories. * Consider using ESLint or other JavaScript code and type checker to see errors in your code before releasing a new version. * **Please activate adapter testing with at least package- and integration-tests on GitHub Actions** * The adapter testing using GitHub Actions is not for us - it is for you! Please check it after pushing changes to GitHub and before telling it to users or publish an NPM package. If testing is "red" you should check the testing log to see what is broken. -* If you like to increase testing you can start implementing adapter specific tests that always run when you push changes to GitHub. -* You can/should use https://translator.iobroker.in/ to auto translate all relevant texts into all needed languages by providing the english text -* If an adapter instance wants to generate an object structure, it should use objects from the type device, channel or folder to define sub-structures and provide objects of type state only on the last "level". Different levels can be separated by a ".". An object of the type "state" should never have more objects below it. The allowed fields for the relevant object types are documented in https://github.com/ioBroker/ioBroker.docs/blob/master/docs/en/dev/objectsschema.md#core-concept +* If you like to increase testing, you can start implementing adapter specific tests that always run when you push changes to GitHub. +* You can/should use https://translator.iobroker.in/ to auto translate all relevant texts into all necessary languages by providing the english text +* If an adapter instance wants to generate an object structure, it should use objects from the type device, channel or folder to define substructures and provide objects of type state only on the last "level". Different levels can be separated by a ".". An object of the type "state" should never have more objects below it. The allowed fields for the relevant object types are documented in https://github.com/ioBroker/ioBroker.docs/blob/master/docs/en/dev/objectsschema.md#core-concept * If an adapter opens a port or bind socket to some IP-address, the attributes must be called `port` and `bind` (`v6bind` for IPv6). +* If an adapter connects to some IP-address, the IP attribute may be not called `bind` (use `ip` for that). ## Add a new adapter to the stable repository 1. Fork this repo and clone your fork @@ -100,6 +101,13 @@ Additionally, to all above listed points: 3. Some feedback on [forum](http://forum.iobroker.net). 4. **Important** Discovery function! If a device can be found automatically (USB, IP) it should be implemented in discovery adapter after (Discovery PR will be merged after stable acceptance). +## Common Rules and Requirements for Commercial Adapters Requiring a License +ioBroker GmbH sponsors all infrastructure and services necessary for the smooth functioning of the ioBroker world. This encompasses the repository, central components, and platforms such as the Forum. While the usage of open-source "non-commercial" adapters is entirely free, the scenario changes when adapters necessitate a purchase. + +For an optimal experience, it is recommended to procure licenses through the official ioBroker Website. The ioBroker GmbH facilitates license management and provides secure components for seamless integration into the adapter. In return for this service, a standard share of 30% of revenues is remitted to ioBroker GmbH. For further information or inquiries, please reach out to info@iobroker.net. + +In cases where purchases are managed by the developer directly, and the adapter is intended for inclusion in the repository, a service fee of typically 15% of the revenue is applicable. For details and negotiations regarding this arrangement, please also contact info@iobroker.net. + ## How-to ### How to publish on npm @@ -126,6 +134,8 @@ If the command does not work, just add `bluefox` as an owner. `npm owner add bluefox iobroker.` +Attention: bluefox must accept the invite. This might last a day or two. So please be patient until the invite has been accepted. If invite expires, please retry (send a second invite). + ### Example of README.md https://github.com/ioBroker/ioBroker.admin/blob/master/README.md @@ -159,7 +169,9 @@ Of course, you can add your own licenses, even WTFPL. You must, of course, take in count the licenses of components that are used in your adapter. E.g., if you use the main packet under GPLv2 license, you cannot make CC-BY-NC from that. ### Testing -The Adapter Creator will create all needed files and deps for the testing, see also https://github.com/ioBroker/ioBroker.example/tree/master/JavaScript/test . Tests are then run by GitHub Action (also pre-generated) +The Adapter Creator will create all necessary files and deps for the testing, +see also https://github.com/ioBroker/ioBroker.example/tree/master/JavaScript/test . +Tests are then run by GitHub Action (also pre-generated) ### Types The `io-package.json` must have an attribute type in common part. @@ -190,7 +202,7 @@ An example can be seen [here](https://github.com/ioBroker/ioBroker.template/blob - `utility` - different help adapters. Like backup, export/import - `vehicle` - cars - `visualization` - visualisation, like vis, material, mobile -- `visualization-icons` - icons for visualisation +- `visualization-icons` - icons for visualization - `visualization-widgets` - iobroker.vis widgets - `weather` - weather info, air quality, environment statistics @@ -215,7 +227,7 @@ Define `dataSource` in `common` as: * `vuplus` - multimedia ### Authors -Please define following attributes in `package.json` : +Please define the following attributes in `package.json` : - https://github.com/ioBroker/ioBroker.template/blob/master/JavaScript/package.json#L5 (Only one author) - https://github.com/ioBroker/ioBroker.template/blob/master/JavaScript/package.json#L9 (Many contributors) - https://github.com/ioBroker/ioBroker.template/blob/master/JavaScript/io-package.json#L32 (Same here, but you can set many authors/contributors if desired) @@ -223,7 +235,7 @@ Please define following attributes in `package.json` : ### Samples For **latest** (sources-dist.json): -``` +```json "admin": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/admin/admin.png", @@ -233,7 +245,7 @@ For **latest** (sources-dist.json): For **stable** (sources-dist-stable.json): -``` +```json "admin": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/admin/admin.png", @@ -242,7 +254,7 @@ For **stable** (sources-dist-stable.json): }, ``` -*Note*: stable has always a specific version. +*Note*: stable always has a specific version. ## Automatic pull request checker On every pull request to the repository, the GitHub Action will be triggered (see [check.yml](.github/workflows/check.yml) ). It will check the following things: @@ -253,3 +265,8 @@ On every pull request to the repository, the GitHub Action will be triggered (se ## Issues to move the latest version of adapter to stable Every night the GitHub Action will be triggered at 3:15 (see [stable.yml](.github/workflows/stable.yml) ). It will check the following things: - If the latest version is good enough for stable and will create an issue if yes (See [lib/readyForStable.js](lib/readyForStable.js)) + +## How is the repository build? +The repository is build executing `npm run build`. However, this is currently only done on a dedicated server running on AWS. +However, before build, the repository is pulled and thus uses the code from the repository. Hence, modifications to how the repo is +built should be made against this repository. diff --git a/REVIEW_CHECKLIST.md b/REVIEW_CHECKLIST.md index 447d4d4e5..245195333 100644 --- a/REVIEW_CHECKLIST.md +++ b/REVIEW_CHECKLIST.md @@ -14,7 +14,7 @@ This file contains a checklist for adapter reviews * Adapter is described roughly in english * Changelog included * License included -* If Sentry is used a note is included on top of Readme +* If Sentry is used, a note is included on top of Readme ## Check package.json * notice `adapter-core` dependency and check `js.controller` dependency in `io-package.json` @@ -29,7 +29,7 @@ This file contains a checklist for adapter reviews * password fields? encrypted? `protectedNative/encryptedNative` used? * rough check/fly over rest * check that `port` attribute called really as `port` in code. The same is for all web settings: - - `bind` - IPv4 or IPv6 bind address, + - `bind` - IPv4 or IPv6 bind address. `bind` cannot be used for description of other devices. Only for own server. - `v6bind` - explicit IPv6 bind address, - `secure` - if HTTPS used, - `certPrivate` - name of private certificate, diff --git a/lib/build.js b/lib/build.js index b325c8698..2a9cad04b 100644 --- a/lib/build.js +++ b/lib/build.js @@ -18,8 +18,8 @@ // --logos folderName - save all logos of all adapters into specified folder under logo-adapter.png const tools = require('./tools.js'); -const fs = require('fs'); -require('events').EventEmitter.prototype._maxListeners = 300; +const fs = require('node:fs'); +require('node:events').EventEmitter.prototype._maxListeners = 300; process.setMaxListeners(0); const axios = require('axios'); @@ -38,7 +38,7 @@ function getImages(list, destination, callback) { callback && callback(); } else { const name = list.pop(); - if (!fs.existsSync(destination + name.name + '.svg')) { + if (!fs.existsSync(`${destination + name.name}.svg`)) { console.log('IMG: ' + name.name); axios(`http://img.shields.io/npm/v/iobroker.${name.name}.svg?style=flat-square`, {responseType: 'arraybuffer'}) .then(response => { @@ -208,7 +208,7 @@ function processRepository(data, argv, cb) { // process: https://raw.githubusercontent.com/ioBroker/ioBroker.socketio/master/io-package.json const parts = data[l].meta.split('/'); - _list.push(parts[3] + '/' + parts[4]); + _list.push(`${parts[3]}/${parts[4]}`); } waitEnd++; if (!fs.existsSync(argv[a + 1])) { @@ -302,9 +302,9 @@ if (module.exports && module.parent) { // save stable fs.writeFileSync(process.argv[pos + 1], JSON.stringify(latest, null, 2)); } else { - fs.writeFileSync(__dirname + '/../sources-dist.json', JSON.stringify(latest, null, 2)); + fs.writeFileSync(`${__dirname}/../sources-dist.json`, JSON.stringify(latest, null, 2)); } - fs.writeFileSync(__dirname + '/../sources-dist.old.json', JSON.stringify(latest, null, 2)); + fs.writeFileSync(`${__dirname}/../sources-dist.old.json`, JSON.stringify(latest, null, 2)); // save stable pos = process.argv.indexOf('--stable'); @@ -312,9 +312,9 @@ if (module.exports && module.parent) { // save stable fs.writeFileSync(process.argv[pos + 1], JSON.stringify(stable, null, 2)); } else { - fs.writeFileSync(__dirname + '/../sources-dist-stable.json', JSON.stringify(stable, null, 2)); + fs.writeFileSync(`${__dirname}/../sources-dist-stable.json`, JSON.stringify(stable, null, 2)); } - fs.writeFileSync(__dirname + '/../sources-dist-stable.old.json', JSON.stringify(latest, null, 2)); + fs.writeFileSync(`${__dirname}/../sources-dist-stable.old.json`, JSON.stringify(latest, null, 2)); processRepository(latest, process.argv, () => process.exit()); diff --git a/lib/check.js b/lib/check.js index d87332599..8fb47cf57 100644 --- a/lib/check.js +++ b/lib/check.js @@ -1,5 +1,7 @@ 'use strict'; const fs = require('fs'); +const axios = require('axios'); + const { addComment, addLabel, @@ -13,6 +15,8 @@ let checker; const TEXT_RECHECK = 'RE-CHECK!'; const TEXT_COMMENT_TITLE = '## Automated adapter checker'; +const ONE_DAY = 3600000 * 24; + function getPullRequestNumber() { if (process.env.GITHUB_REF && process.env.GITHUB_REF.match(/refs\/pull\/\d+\/merge/)) { const result = /refs\/pull\/(\d+)\/merge/g.exec(process.env.GITHUB_REF); @@ -48,6 +52,8 @@ function executeOneAdapterCheck(adapter) { console.error(JSON.stringify(context.errors, null, 2)); } console.log(JSON.stringify(data, null, 2));*/ + context.errors = context.errors.sort(); + context.warnings = context.warnings.sort(); resolve({adapter, context}); } @@ -136,7 +142,7 @@ async function detectChanges(commit) { //console.log('---'); adapters = adapters.filter(a => !deleteds.includes(a)); - + console.log('adapters filtered:'); adapters.forEach(a => console.log(a)); console.log('---'); @@ -238,7 +244,7 @@ function decorateLine(line) { // line.adapter = 'ioBroker.adapter' if (line.adapter) { const shortName = line.adapter.replace('ioBroker.', ''); - if (line.text.includes(' ' + shortName + '.js')) { + if (line.text.includes(` ${shortName}.js`)) { line.text = line.text.replace(` ${shortName}.js`, ` [${shortName}.js](${line.link}/blob/master/${shortName}.js)`); } } @@ -246,6 +252,22 @@ function decorateLine(line) { return line.text; } +function triggerRepoCheck(owner, adapter) { + const url = `${owner}/${adapter}`; + console.log(`trigger repo checker for ${url}`); + // curl -L -X POST -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ghp_xxxxxxxx" https://api.github.com/repos/iobroker-bot-orga/check-tasks/dispatches -d "{\"event_type\": \"check-repository\", \"client_payload\": {\"url\": \"mcm1957/iobroker.weblate-test\"}}" + return axios.post(`https://api.github.com/repos/iobroker-bot-orga/check-tasks/dispatches`, {"event_type": "check-repository", "client_payload": {"url": url}}, + { + headers: { + Authorization: `bearer ${process.env.IOBBOT_GITHUB_TOKEN}`, + Accept: 'application/vnd.github+json', + 'user-agent': 'Action script' + }, + }) + .then(response => response.data) + .catch(e => console.error(e)); +} + async function doIt() { const prID = getPullRequestNumber(); @@ -267,14 +289,34 @@ async function doIt() { return Promise.reject('Cannot find PR'); } + const files = await getGithub(`https://api.github.com/repos/ioBroker/ioBroker.repositories/pulls/${prID}/files`); + let fileNames = []; + files.forEach( f=>{fileNames.push(f.filename)}); + + console.log('Files changed:'); + fileNames.forEach( f=>{console.log(` ${f}`)}); + + const isLatest = fileNames.includes('sources-dist.json'); + const isStable = fileNames.includes('sources-dist-stable.json') + const links = await detectAffectedAdapter(prID); const comments = [{text: TEXT_COMMENT_TITLE}]; let someChecked = false; let errorsFound = false; for (let i = 0; i < links.length; i++) { + const data = await executeOneAdapterCheck(links[i]); const parts = data.adapter.split('/'); const adapter = parts.pop().replace('iobroker.', 'ioBroker.'); + const adapterName = adapter.split('.')[1]; + const owner = parts.pop(); + const link = `https://github.com/${owner}/${adapter}`; + + console.log (``); + console.log (`checking ${owner}/${adapter}`); + + triggerRepoCheck(owner, adapter); + try { const latestSVG = await getUrl(`http://iobroker.live/badges/${adapter.replace('ioBroker.', '')}-installed.svg`); data.badgeLatest = (latestSVG || '').toString().startsWith(' comments.push({text: `- [ ] :eyes: ${warn}`, link, owner, adapter})); } } + + if (isStable) { + const latest = await getUrl('http://repo.iobroker.live/sources-dist-latest.json'); + const stable = await getUrl('http://repo.iobroker.live/sources-dist.json'); + const statistic = await getUrl('https://www.iobroker.net/data/statistics.json'); + + comments.push({text:`\n`, noDecorate: true}); + comments.push({text:`Adapter releases: https://www.iobroker.dev/adapter/${adapterName}/releases`, noDecorate: true}); + comments.push({text:`Adapter statistic: https://www.iobroker.dev/adapter/${adapterName}/statistics`, noDecorate: true}); + + const now = new Date(); + const totalUser = statistic['adapters'][adapterName]; + + const latestRelease = latest[adapterName].version; + const latestTime = new Date(latest[adapterName].versionDate); + const latestTimeStr = latestTime.getDate() +'.'+ (latestTime.getMonth()+1) +'.'+ latestTime.getFullYear(); + const latestDaysOld = Math.floor((now.getTime() - latestTime.getTime()) / ONE_DAY); + const latestUser = statistic['versions'][adapterName][latestRelease]; + const latestUserPercent = (latestUser/totalUser * 100).toFixed(2); + + comments.push({text:``, noDecorate: true}); + comments.push({text:`**History and usage information for release ${latestRelease}:**`, noDecorate: true}); + + comments.push({text:``, noDecorate: true}); + comments.push({text:`${latestRelease} created ${latestTimeStr} (${latestDaysOld} days old)`, noDecorate: true}); + comments.push({text:`${latestUser} users (${latestUserPercent}%)`, noDecorate: true}); + + if (stable[adapterName]) { + + const stableRelease = latest[adapterName].stable; + const stableTime = new Date(stable[adapterName].versionDate); + const stableTimeStr = stableTime.getDate() +'.'+ (stableTime.getMonth()+1) +'.'+ stableTime.getFullYear(); + const stableDaysOld = Math.floor((now.getTime() - stableTime.getTime()) / ONE_DAY); + const stableUser = statistic['versions'][adapterName][stableRelease]; + const stableUserPercent = (stableUser/totalUser * 100).toFixed(2); + + comments.push({text:``, noDecorate: true}); + comments.push({text:`${stableRelease} (stable) created ${stableTimeStr} (${stableDaysOld} days old)`, noDecorate: true}); + comments.push({text:`${stableUser} users (stable) (${stableUserPercent}%)`, noDecorate: true}); + + } else { + + comments.push({text:``, noDecorate: true}); + comments.push({text:`stable release not yet available`, noDecorate: true}); + + } + + + comments.push({text:``, noDecorate: true}); + comments.push({text:`**Please verify that this PR really tries to update to release ${latestRelease}!**\n`, noDecorate: true}); + } } if (!someChecked) { comments.push({text: 'No changed adapters found', noDecorate: true}); @@ -362,7 +455,7 @@ async function doIt() { } // activate for debugging purposes -//process.env.GITHUB_REF = 'refs/pull/2298/merge'; +// process.env.GITHUB_REF = 'refs/pull/3305/merge'; //process.env.OWN_GITHUB_TOKEN = 'add-token-here'; // process.env.GITHUB_EVENT_PATH = __dirname + '/../event.json'; diff --git a/lib/checkArchived.js b/lib/checkArchived.js index ca5e3894a..493ff6440 100644 --- a/lib/checkArchived.js +++ b/lib/checkArchived.js @@ -2,15 +2,15 @@ /* * - * This script scans all adapters listed at latest and stable repository and varifies that - * - all adapters listed at stabel repository are also listed at latest repository - * - github adapter repositories are accessible - * - github adapter repositories are not archived + * This script scans all adapters listed at latest and stable repository and verifies that + * - all adapters listed at stable repository are also listed at latest repository + * - GitHub adapter repositories are accessible + * - GitHub adapter repositories are not archived * * If any of those checks fails an issue is created at ioBroker.repositories requesting a fix * - * Note: - * Running this script locally requires environmant variable OWN_GITHUB_TOKEN to be set to avoid hitting rate limits + * Note: + * Running this script locally requires environment variable OWN_GITHUB_TOKEN to be set to avoid hitting rate limits * */ @@ -45,13 +45,13 @@ async function checkRepos(latest, stable, stats) { idx = idx + 1; if (adapter.startsWith('_')) { console.log (`SKIPPING ${adapter} (${idx}/${count})`); - } else { + } else { const parts = stable[adapter].meta.split('/'); const owner = parts[3]; console.log (`checking ${adapter} (${idx}/${count})`); if (!latest[adapter]) { console.log(` *** ${adapter} only in stable repository`); - const item = { + const item = { adapter: adapter, owner: owner, installs: stats.adapters[adapter], @@ -71,7 +71,7 @@ async function checkRepos(latest, stable, stats) { idx = idx + 1; if (adapter.startsWith('_')) { console.log (`SKIPPING ${adapter} (${idx}/${count})`); - } else { + } else { const parts = latest[adapter].meta.split('/'); const owner = parts[3]; console.log (`checking ${adapter} (${idx}/${count}) - ${owner}/ioBroker.${adapter}`); @@ -79,7 +79,7 @@ async function checkRepos(latest, stable, stats) { try { const json = await getGithub(`https://api.github.com/repos/${owner}/ioBroker.${adapter}`); if (json.archived) { - const item = { + const item = { adapter: adapter, owner: owner, installs: stats.adapters[adapter], @@ -91,22 +91,22 @@ async function checkRepos(latest, stable, stats) { } catch (e) { console.log (` *** error retrieving infos for ${adapter}`); console.log (` *** ${e}`); - const item = { + const item = { adapter: adapter, owner: owner, installs: stats.adapters[adapter], error: true, e: e, }; - result.push(item); + result.push(item); } } - }; + }; return result; } async function generateIssue(adapter, stableFile) { - let issues; + let issues; issues = await getGithub(`https://api.github.com/repos/ioBroker/ioBroker.repositories/issues`); const title = `[CHECK] Adapter ${adapter.adapter} needs verification`; @@ -135,8 +135,15 @@ async function generateIssue(adapter, stableFile) { body += `- [ ] check if adapter has been migrated but links are not yet updated at repository\n`; body += ` fix links at repository if this is causing the problem\n`; body += `- [ ] decide if adapter should (and can) be moved to community-adapters (current usage ${adapter.installs} installs)\n`; - body += `- [ ] move adapter to iobroker-community-adapters or \n`; - body += ` remove adapter from repositories\n`; + body += `- [ ] move adapter to iobroker-community-adapters\n`; + body += `\n`, + body += ` or \n`, + body += `\n`, + body += `- [ ] create deprecation news at admin iF required\n`; + body += `- [ ] set reminder to remove from stable (typical after 14 day up to one months)\n`; + body += `- [ ] remove from stable\n`; + body += `- [ ] set reminder to remove from latest (typical after 3 months)\n`; + body += `- [ ] remove from latest\n`; }; if ( adapter.error) { body += `- [ ] check repository ${adapter.owner}\ioBroker.${adapter.adapter}\n`; @@ -149,7 +156,7 @@ async function generateIssue(adapter, stableFile) { try { await createIssue('ioBroker', 'ioBroker.repositories', {title, body}); - } catch (e) { + } catch (e) { console.log(`error: Cannot create issue for adapter ${adapter.adapter}:`); console.log(` ${e}`); }; @@ -167,7 +174,7 @@ async function doIt() { console.log (`The following adapters should be checked:`); for (const adapter of result) { - console.log (` ${adapter.owner}/ioBroker.${adapter.adapter}`); + console.log (` ${adapter.owner}/ioBroker.${adapter.adapter}`); } for (const adapter of result) { await generateIssue(adapter); diff --git a/lib/checkNpm.js b/lib/checkNpm.js index 9a8d80b9a..1bb3dd68d 100644 --- a/lib/checkNpm.js +++ b/lib/checkNpm.js @@ -6,13 +6,13 @@ * - all adapters are available at npm * - all adapters are at npm have granted access to bluefox * - * - If any of those checks fails an issue is created/updated at ioBroker.repositories repository listing the problems + * - If any of those checks fails, an issue is created/updated at ioBroker.repositories repository listing the problems * (*)If any of those checks fails an issue is created at adapters repository requesting a fix * * (*) planned for future * - * Note: - * Running this script locally requires environmant variable OWN_GITHUB_TOKEN to be set to avoid hitting rate limits + * Note: + * Running this script locally requires environment variable OWN_GITHUB_TOKEN to be set to avoid hitting rate limits * */ @@ -41,15 +41,14 @@ async function getStats() { } async function checkNpm(adapter) { - - //console.log (`checking ${adapter}`); + // console.log (`checking ${adapter}`); let response; try { response = await axios(`https://registry.npmjs.org/iobroker.${adapter}`) - } catch (e) {; + } catch (e) { console.log (`${e}`); - console.log (`https://registry.npmjs.org/iobroker.${adapter}`); + console.log (`https://registry.npmjs.org/iobroker.${adapter}`); } // bug in NPM some modules could be accessed via normal web page, but not by API @@ -58,27 +57,27 @@ async function checkNpm(adapter) { response = await axios(`https://www.npmjs.com/package/iobroker.${adapter}`); } catch (e) { console.log(`${e}`); - console.log(`https://www.npmjs.com/package/iobroker.${adapter}`); + console.log(`https://www.npmjs.com/package/iobroker.${adapter}`); return 'Not found on npm. Please publish'; } - + if (!response.data) { return 'Adapter not found on npm. Please publish'; } - + const body = response.data; if (!body.includes('href="/~bluefox"') && body.includes('href="/~iobluefox"')) { return `Bluefox was not found in the collaborators on NPM!. Please execute in adapter directory: "npm owner add bluefox iobroker.${adapter}"`; } - - return ''; // OK - } else { + return ''; // OK + } - const body = response.data; - if (!body.maintainers || - !body.maintainers.length) { - return `Bluefox was not found in the collaborators on NPM!.\nPlease execute in adapter directory: "npm owner add bluefox iobroker.${adapter}"`; + const body = response.data; + if (!body.maintainers || + !body.maintainers.length + ) { + return `Bluefox was not found in the collaborators on NPM!.\nPlease execute in adapter directory: "npm owner add bluefox iobroker.${adapter}"`; } let ret =''; @@ -87,52 +86,50 @@ async function checkNpm(adapter) { for (const user of body.maintainers) { ret += ` ${user.name} <${user.email}>\n`; - } - ret += '\n'; } - return ret; - }; - // never reach area + ret += '\n'; + } + + return ret; } async function mergeRepos(latest, stable, stats) { const adapters = []; - console.log (''); - console.log ('reading STABLE repository'); + console.log(''); + console.log('reading STABLE repository'); for (const adapter in stable) { if (adapter.startsWith('_')) { - console.log (`SKIPPING ${adapter}`); - } else { - const parts = stable[adapter].meta.split('/'); + console.log(`SKIPPING ${adapter}`); + } else { + const parts = stable[adapter].meta.split('/'); const owner = parts[3]; - const item = { - adapter: adapter, - owner: owner + const item = { + adapter, + owner }; - console.log (`adding ${adapter}`); + console.log(`adding ${adapter}`); adapters.push(item); } } - console.log ('reading LATEST repository'); + console.log('reading LATEST repository'); for (const adapter in latest) { if (adapter.startsWith('_')) { - console.log (`SKIPPING ${adapter}`); - } else { - const parts = latest[adapter].meta.split('/'); + console.log(`SKIPPING ${adapter}`); + } else { + const parts = latest[adapter].meta.split('/'); const owner = parts[3]; - if (adapters.find(e => e.adapter === adapter)) { - } else { + if (!adapters.find(e => e.adapter === adapter)) { const item = { - adapter: adapter, - owner: owner - }; - console.log (`adding ${adapter}`); + adapter, + owner + }; + console.log(`adding ${adapter}`); adapters.push(item); } } - }; + } return adapters; } @@ -142,23 +139,24 @@ async function checkRepos(adapters) { let idx; count = Object.keys(adapters).length; - idx=0; - console.log (''); - console.log ('processing adapter list ...'); - for (const adapter of adapters) { + idx = 0; + console.log(''); + console.log('processing adapter list ...'); + for (const adapter of adapters) { idx = idx + 1; - console.log (`checking ${adapter.adapter} (${idx}/${count})`); + console.log(`checking ${adapter.adapter} (${idx}/${count})`); const error = await checkNpm(adapter.adapter); - if (error !== '' ) { - console.log( error ); - const ret = { - adapter : adapter.adapter, - owner : adapter.owner, - error: error - }; - result.push( ret ); + if (error !== '') { + console.log(error); + const ret = { + adapter: adapter.adapter, + owner: adapter.owner, + error + }; + result.push(ret); } - }; + } + ; return result; } @@ -166,41 +164,41 @@ async function generateIssue(adapter) { let issues; try { issues = await getGithub(`https://api.github.com/repos/${adapter.owner}/ioBroker.${adapter.adapter}/issues`); - } catch(e) { + } catch (e) { console.log(`warning: error retrieving issue info for ${adapter.owner}/ioBroker.${adapter.adapter}`); console.log(` ${e}`); return; } - + const title = `Please correct npm maintainers configuration.`; issues = issues.filter(i => i.state === 'open' && i.title.includes(title)); if (!issues.length) { let body = `## ioBroker adapter checker for npm access\n\n`; body += `Access right check for adapter ${adapter.adapter} returned the following issue:\n\n`; - body += adapter.error; + body += adapter.error; body += `\nPlease fix the above error as soon as possible.\n`; - body += `All adapters listed at ioBroker repositories must have 'bluefox' added as maintainer.\n\n`; - body += `Future version updates at the repositories will be suspended until this problem is fixed.\n`; - body += `\nIf you sent an npm invite to bluefox some time ago, please send a new one as it might have expired.\n`; - body += `\nWhen adding a comment to this isse, please note @apollon77 and @mcm1957 explicitly.\n`; + body += `All adapters listed at ioBroker repositories must have 'bluefox' added as maintainer.\n\n`; + body += `Future version updates at the repositories will be suspended until this problem is fixed.\n`; + body += `\nIf you sent an npm invite to bluefox some time ago, please send a new one as it might have expired.\n`; + body += `\nWhen adding a comment to this issue, please note @apollon77 and @mcm1957 explicitly.\n`; //console.log(`\n`); //console.log(`CREATE ISSUE for ioBroker.${adapter.adapter}:\n ${title}\n`); //console.log(`${body}`); - - console.log(`create issue for ioBroker.${adapter.adapter}`); + + console.log(`create issue for ioBroker.${adapter.adapter}`); try { await createIssue(adapter.owner, `iobroker.${adapter.adapter}`, {title, body}); - } catch (e) { + } catch (e) { console.log(`error: Cannot create issue for adapter ${adapter.adapter}:`); console.log(` ${e}`); - }; + } } else { - console.log(`issue for ioBroker.${adapter.adapter} already exists`); + console.log(`issue for ioBroker.${adapter.adapter} already exists`); } } @@ -210,54 +208,54 @@ async function updateSummaryIssue(adapters) { let issues; const title = `[CHECK] npm maintainers check results evidence report`; - issues = await getGithub(`https://api.github.com/repos/ioBroker/ioBroker.repositories/issues`); + issues = await getGithub(`https://api.github.com/repos/ioBroker/ioBroker.repositories/issues?state=open&page=1&per_page=100`); issues = issues.filter(i => i.state === 'open' && i.title.includes(title)); if (!issues.length) { + console.log('warning: Could not locate base issue "${title}", will create one'); let body = `# ioBroker adapter checker for npm access\n\n`; body += `Please see following comments for a list of adapters which do not have access granted for 'bluefox'\n`; -et try { await createIssue('iobroker', 'iobroker.repositories', {title, body}); - } catch (e) { + } catch (e) { console.log(`error: Cannot create base issue "${title}"`); console.log(` ${e}`); - }; + } } - issues = await getGithub(`https://api.github.com/repos/ioBroker/ioBroker.repositories/issues`); + issues = await getGithub(`https://api.github.com/repos/ioBroker/ioBroker.repositories/issues?state=open&page=1&per_page=100`); issues = issues.filter(i => i.state === 'open' && i.title.includes(title)); if (!issues.length) { console.log(`error: Could not create or locate base issue "${title}"`); return; } - if (issues.length !==1 ) { + if (issues.length !== 1) { console.log(`warning: multiple issues match title "${title}"`); // for ( let ii=1; ii < issues.length; ii++) { -// +// // } } - - const issueId=issues[0].number; - console.log(`updateing issue ${issueId}`); + + const issueId = issues[0].number; + console.log(`updating issue ${issueId}`); // remove previous comment let oldList = []; let newList = []; try { let done = false; - while ( !done ) { + while (!done) { const gitComments = await getAllComments(issueId); let exists = gitComments.find(comment => comment.body.includes('## ioBroker adapter checker')); if (exists) { - let body = exists.body.split('\n'); - body = body.filter(l=>l.startsWith('- [ ]')); - body.forEach(a => !oldList.includes(a) && oldList.push(a)); + let body = exists.body.split('\n'); + body = body.filter(l => l.startsWith('- [ ]')); + body.forEach(a => !oldList.includes(a) && oldList.push(a)); console.log(`deleting comment ${exists.id} from issue ${issueId}`); await deleteComment(issueId, exists.id); } else { - done = true; + done = true; } } } catch (e) { @@ -270,10 +268,11 @@ et for (const adapter of adapters) { if (old.startsWith(`- [ ] [${adapter.adapter} (`)) { newList.push(old); - adapter.old=true; + adapter.old = true; } - } - }; + } + } + ; // add new comment const date = new Date(); @@ -281,7 +280,7 @@ et body += `The following adapters do not have access granted for 'bluefox':\n`; if (newList.length) { - body += '\nAdapter repositories already registered as faulty:\n'; + body += '\nAdapter repositories already registered as faulty:\n'; for (const n of newList) { body += `${n}\n`; } @@ -289,8 +288,9 @@ et body += '\nAdapter repositories detected as faulty at this run:\n'; for (const adapter of adapters) { - if (!adapter.old) - body += `- [ ] [${adapter.adapter} (${adapter.owner})](https://github.com/${adapter.owner}/ioBroker.${adapter.adapter}) since ${date.toLocaleString('de-DE').split(',')[0]}\n`; + if (!adapter.old) { + body += `- [ ] [${adapter.adapter} (${adapter.owner})](https://github.com/${adapter.owner}/ioBroker.${adapter.adapter}) since ${date.toLocaleString('de-DE').split(',')[0]}\n`; + } } console.log(`adding new comment:`); @@ -298,10 +298,10 @@ et try { await addComment(issueId, body); - } catch (e) { + } catch (e) { console.error(`warning: cannot add comment to issue ${issueId}:`); console.log(` ${e}`); - }; + } } @@ -318,7 +318,7 @@ async function doIt() { console.log (`\nThe following adapters should be checked:`); for (const adapter of result) { - console.log (` ${adapter.owner}/ioBroker.${adapter.adapter}`); + console.log (` ${adapter.owner}/ioBroker.${adapter.adapter}`); } await updateSummaryIssue(result); diff --git a/lib/common.js b/lib/common.js index d82c4b6bb..3c65b09ea 100644 --- a/lib/common.js +++ b/lib/common.js @@ -15,27 +15,64 @@ function addLabel(prID, labels) { } function deleteLabel(prID, label) { - return axios.delete(`https://api.github.com/repos/ioBroker/ioBroker.repositories/issues/${prID}/labels/${label}`, + let url = `labels/${label}`; + if (prID) { + url= `issues/${prID}/labels/${label}` + } + return axios.delete(`https://api.github.com/repos/ioBroker/ioBroker.repositories/${url}`, { + headers: { + Authorization: process.env.OWN_GITHUB_TOKEN ? `token ${process.env.OWN_GITHUB_TOKEN}` : 'none', + 'user-agent': 'Action script' + } + }) + .then(response => response.data); +} + +function getLabels(prID) { + let url = `labels`; + if (prID) { + url= `issues/${prID}/labels` + } + return axios(`https://api.github.com/repos/ioBroker/ioBroker.repositories/${url}`, { headers: { Authorization: process.env.OWN_GITHUB_TOKEN ? `token ${process.env.OWN_GITHUB_TOKEN}` : 'none', 'user-agent': 'Action script' } }) - .then(response => response.data); + .then(response => response.data ) } -function getLabels(prID) { - return axios(`https://api.github.com/repos/ioBroker/ioBroker.repositories/issues/${prID}/labels`, +function createLabel(name, description, color) { + return axios.post(`https://api.github.com/repos/ioBroker/ioBroker.repositories/labels`, + { + 'name': `${name}`, + 'description': `${description}`, + 'color': `${color}` + }, { headers: { Authorization: process.env.OWN_GITHUB_TOKEN ? `token ${process.env.OWN_GITHUB_TOKEN}` : 'none', 'user-agent': 'Action script' } }) - .then(response => response.data ) + .then(response => response.data); } +function updateLabel(name, description, color) { + return axios.patch(`https://api.github.com/repos/ioBroker/ioBroker.repositories/labels/${name}`, + { + 'description': `${description}`, + 'color': `${color}` + }, + { + headers: { + Authorization: process.env.OWN_GITHUB_TOKEN ? `token ${process.env.OWN_GITHUB_TOKEN}` : 'none', + 'user-agent': 'Action script' + } + }) + .then(response => response.data); +} function addComment(prID, body) { return axios.post(`https://api.github.com/repos/ioBroker/ioBroker.repositories/issues/${prID}/comments`, {body}, { @@ -49,7 +86,7 @@ function addComment(prID, body) { function getAllComments(prID) { ///repos/:owner/:repo/issues/:issue_number/comments - return axios(`https://api.github.com/repos/ioBroker/ioBroker.repositories/issues/${prID}/comments`, { + return axios(`https://api.github.com/repos/ioBroker/ioBroker.repositories/issues/${prID}/comments?per_page=100`, { headers: { Authorization: process.env.OWN_GITHUB_TOKEN ? `token ${process.env.OWN_GITHUB_TOKEN}` : 'none', 'user-agent': 'Action script' @@ -123,11 +160,13 @@ function getUrl(url, asText) { module.exports = { addComment, addLabel, + createLabel, + deleteLabel, + updateLabel, getGithub, getUrl, createIssue, deleteComment, - deleteLabel, getAllComments, getLabels }; diff --git a/lib/handleReminder.js b/lib/handleReminder.js new file mode 100644 index 000000000..cab57d361 --- /dev/null +++ b/lib/handleReminder.js @@ -0,0 +1,233 @@ +'use strict'; +const fs = require('node:fs'); +const { + addLabel, + createLabel, + deleteLabel, + updateLabel, + getLabels, + getAllComments, + getGithub, +} = require('./common'); + +const usedLabels = []; + +function getPullRequestNumber() { + if (process.env.GITHUB_REF && process.env.GITHUB_REF.match(/refs\/pull\/\d+\/merge/)) { + const result = /refs\/pull\/(\d+)\/merge/g.exec(process.env.GITHUB_REF); + if (result) { + return result[1]; + } + } + if (process.env.GITHUB_EVENT_PATH) { + const event = JSON.parse(fs.readFileSync(process.env.GITHUB_EVENT_PATH, 'utf8')); + return event.pull_request ? event.pull_request.number : (event.issue ? event.issue.number : ''); + } + + return ''; +} + +async function cleanupLabels(){ + let labels = await getLabels(''); + labels.forEach( (l)=> { + const result = /^(\d?\d)\.(\d?\d)\.(\d\d\d\d)$/g.exec(l.name); + if (result) { + let targetTs=new Date(result[3], result[2]-1, result[1], 0, 0, 0).getTime(); + const nowTs = new Date().getTime(); + if ( nowTs > targetTs + 2* 24*60*60*1000) { + if (usedLabels.includes( l.name )) { + console.log(` ${l.name} is outdated but still in use`); + } + else { + console.log(` ${l.name} is outdated and will be removed`); + deleteLabel('', l.name); + } + } + }; + }); +} + +async function cleanupIssueLabels( pIssues ){ + for (const issue of pIssues ) { + console.log(`cleanup PR ${issue.number}`); + issue.labels.forEach((l) => { + const result = /^(\d?\d)\.(\d?\d)\.(\d\d\d\d)$/g.exec(l.name); + if (result) { + if (usedLabels.includes( `${issue.number}-${l.name}` )) { + console.log(` ${l.name} still valid`); + } else { + console.log(` ${l.name} will be removed`); + deleteLabel(issue.number, l.name); + } + } + }) + } +} + +async function addUsedLabels( issueNumber, label ) { + if (! usedLabels.includes( label ) ) { + usedLabels.push( label ); + }; + if (! usedLabels.includes( `${issueNumber}-${label}` ) ) { + usedLabels.push( `${issueNumber}-${label}` ); + }; +} + +async function addLabelToIssue( label, issue ) { + let labels = await getLabels(''); + labels = labels.filter( (f) => { return f.name===`${label}`} ); + if (!labels.length) { + console.log(` will create label ${label}`); + await createLabel(`${label}`, `remind after ${label}`, `ffffff`); + } + + await addUsedLabels( issue.number, label ); + await addLabel( issue.number, [`${label}`] ); + +} + +async function handleBrandNew( pIssues ){ + for (const issue of pIssues ) { + if (issue.labels.find(label => label.name === 'STABLE - brand new')) { + console.log(`checking PR ${issue.number}`); + const comments= await getAllComments( issue.number ); + + let found=false; + let comment; + + comment = comments.findLast( c => /created (\d+\.\d+\.\d+)/g.exec(c.body)); + if (comment) { + const result = /created (\d+)\.(\d+)\.(\d+)/g.exec(comment.body); + if (result) { + let targetTs=new Date(result[3], result[2]-1, result[1], 0, 0, 0).getTime(); + targetTs += (7 * 86400 * 1000); + const dateStr = new Date(targetTs).toLocaleDateString('de-DE', {year: 'numeric', month: 'numeric', day: 'numeric',}); + const nowTs = new Date().getTime(); + const label = `${dateStr}`; + + await addLabelToIssue( label, issue ); + + if ( nowTs < targetTs ) { + console.log(` will merged after ${dateStr}`); + await updateLabel(`${label}`, `remind after ${dateStr}`, `ffffff`); + } else { + console.log(` should be merged now (deadline ${dateStr})`); + await updateLabel(`${label}`, `remind after ${dateStr}`, `ff0000`); + await addLabel(issue.number, ['⚠️check']); + } + } + found=true; + } + + comment = comments.findLast( c => /reminder (\d+\.\d+\.\d+)/g.exec(c.body)); + if (comment) { + const result = /reminder (\d+)\.(\d+)\.(\d+)/g.exec(comment.body); + if (result) { + let targetTs=new Date(result[3], result[2]-1, result[1], 0, 0, 0).getTime(); + const dateStr = new Date(targetTs).toLocaleDateString('de-DE', {year: 'numeric', month: 'numeric', day: 'numeric',}); + const nowTs = Date.now(); + const label = `${dateStr}`; + + await addLabelToIssue( label, issue ); + + if ( nowTs < targetTs ) { + console.log(` will remind at ${dateStr}`); + await updateLabel(`${label}`, `remind after ${dateStr}`, `ffffff`); + } else { + console.log(` should be checked now (deadline ${dateStr})`); + await updateLabel(`${label}`, `remind after ${dateStr}`, `ff0000`); + await addLabel(issue.number, ['⚠️check']); + } + } + found = true; + } + + if (!found) { + console.log(` no date found`); + await addLabel( issue.number, ['⚠️check']); + } + } + } +} + +async function handleOthers(pIssues){ + for (const issue of pIssues ) { + if (! issue.labels.find(label => label.name === 'STABLE - brand new')) { + console.log(`checking PR ${issue.number}`); + const comments= await getAllComments( issue.number ); + + let comment = comments.findLast( c => /reminder (\d+\.\d+\.\d+)/g.exec(c.body)); + if (comment) { + const result = /reminder (\d+)\.(\d+)\.(\d+)/g.exec(comment.body); + if (result) { + let targetTs=new Date(result[3], result[2]-1, result[1], 0, 0, 0).getTime(); + const dateStr = new Date(targetTs).toLocaleDateString('de-DE', {year: 'numeric', month: 'numeric', day: 'numeric',}); + const nowTs = Date.now(); + const label = `${dateStr}`; + + await addLabelToIssue( label, issue ); + + if ( nowTs < targetTs ) { + console.log(` will remind at ${dateStr}`); + await updateLabel(`${label}`, `remind after ${dateStr}`, `ffffff`); + } else { + console.log(` should be checked now (deadline ${dateStr})`); + await updateLabel(`${label}`, `remind after ${dateStr}`, `ff0000`); + } + } + } + } + } +} + +async function doIt() { + // read all issues + let issues = await getGithub(`https://api.github.com/repos/iobroker/ioBroker.repositories/issues?per_page=100`); + + // check if we have a prId + const prID = getPullRequestNumber(); + if ( prID ) { + console.log(`processing PR ${prID}`); + issues = issues.filter( (issue) => issue.number == prID ); + } else { + console.log(`process all Issues`); + } + + // process STABLE-brand new tagged issues + console.log (''); + console.log ('process STABLE-brand-new issues'); + await handleBrandNew( issues ); + + // process other reminders + console.log (''); + console.log ('process normal issues'); + await handleOthers( issues ); + + // cleanup labels + console.log (''); + console.log ('cleanup labels already set'); + await cleanupIssueLabels( issues ); + + console.log (''); + if ( prID ) { + console.log ('check for outdated labels skipped'); + } else { + console.log ('checking for outdated labels'); + await cleanupLabels(); + } + + return 'done'; +} + +// activate for debugging purposes +// process.env.GITHUB_REF = 'refs/pull/3003/merge'; +// process.env.OWN_GITHUB_TOKEN = 'insert here'; +// process.env.GITHUB_EVENT_PATH = __dirname + '/../event.json'; + +console.log(`process.env.GITHUB_REF = ${process.env.GITHUB_REF}`); +console.log(`process.env.GITHUB_EVENT_PATH = ${process.env.GITHUB_EVENT_PATH}`); +console.log(`process.env.OWN_GITHUB_TOKEN = ${(process.env.OWN_GITHUB_TOKEN || '').length}`); + +doIt() + .then(result => console.log(result)) + .catch(e => console.error(e)); diff --git a/lib/manualAction.js b/lib/manualAction.js index 230aefd3c..77f18c6c7 100644 --- a/lib/manualAction.js +++ b/lib/manualAction.js @@ -4,9 +4,9 @@ const axios = require('axios'); function closeIssue(owner, adapter, id) { return axios.patch(`https://api.github.com/repos/${owner}/ioBroker.${adapter}/issues/${id}`, - { + { 'state' : 'close' - }, + }, { headers: { Authorization: process.env.OWN_GITHUB_TOKEN ? `token ${process.env.OWN_GITHUB_TOKEN}` : 'none', @@ -17,5 +17,5 @@ function closeIssue(owner, adapter, id) { } console.log ('manual action started'); -closeIssue( 'Mic-M', 'ioBroker.logparser', '41'); +closeIssue( 'xXBJXx', 'tractive-gps', '2'); console.log ('manual action finished'); diff --git a/lib/readyForStable.js b/lib/readyForStable.js index e4cdd7551..2ad5f7a24 100644 --- a/lib/readyForStable.js +++ b/lib/readyForStable.js @@ -12,6 +12,11 @@ const TITLE = 'Update stable version in repo'; const ONE_DAY = 3600000 * 24; +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} function getLatestRepo() { return getUrl('http://repo.iobroker.live/sources-dist-latest.json'); } @@ -28,6 +33,22 @@ function getStats() { return getUrl('https://www.iobroker.net/data/statistics.json'); } +function triggerRepoCheck(adapter) { + const url = `${adapter.owner}/ioBroker.${adapter.adapter}`; + console.log(`trigger rep checker for ${url}`); + // curl -L -X POST -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ghp_xxxxxxxx" https://api.github.com/repos/iobroker-bot-orga/check-tasks/dispatches -d "{\"event_type\": \"check-repository\", \"client_payload\": {\"url\": \"mcm1957/iobroker.weblate-test\"}}" + return axios.post(`https://api.github.com/repos/iobroker-bot-orga/check-tasks/dispatches`, {"event_type": "check-repository", "client_payload": {"url": url}}, + { + headers: { + Authorization: `bearer ${process.env.IOBBOT_GITHUB_TOKEN}`, + Accept: 'application/vnd.github+json', + 'user-agent': 'Action script' + }, + }) + .then(response => response.data) + .catch(e => console.error(e)); +} + function addComment(owner, adapter, id, body) { return axios.post(`https://api.github.com/repos/${owner}/ioBroker.${adapter}/issues/${id}/comments`, {body}, { @@ -41,9 +62,9 @@ function addComment(owner, adapter, id, body) { function closeIssue(owner, adapter, id) { return axios.patch(`https://api.github.com/repos/${owner}/ioBroker.${adapter}/issues/${id}`, - { + { 'state' : 'close' - }, + }, { headers: { Authorization: process.env.OWN_GITHUB_TOKEN ? `token ${process.env.OWN_GITHUB_TOKEN}` : 'none', @@ -55,19 +76,36 @@ function closeIssue(owner, adapter, id) { async function checkIssues(latest, stable, stats, result) { for (const adapter in latest) { - if (!adapter.startsWith('_') ) { - const parts = latest[adapter].meta.split('/'); + if (!adapter.startsWith('_')) { + //console.log (`\n[DEBUG] checking ${latest[adapter].meta}\n`); + const parts = latest[adapter].meta.split('/'); const owner = parts[3]; let issues = await getGithub(`https://api.github.com/repos/${owner}/ioBroker.${adapter}/issues`); issues = issues.filter(i => i.state === 'open' && i.title.includes(TITLE)); - for (const issue of issues){ - const issueId=issues[0].number; - console.log(`\n${adapter}: [ https://www.github.com/${owner}/iobroker.${adapter} ]`); + for (const issue of issues) { + const issueId = issues[0].number; + console.log(`\n${adapter}: [ https://www.github.com/${owner}/iobroker.${adapter} ]`); const res = result.filter(r => r.adapter === adapter); - let newTitle = ''; - if (res.length) newTitle = `${TITLE} from ${res[0].stable.version} to ${res[0].latest.version}`; - if (issue.title === newTitle) { + let newTitle = ''; + if (res.length) newTitle = `${TITLE} from ${res[0].stable.version} to ${res[0].latest.version}`; + if (issue.title === newTitle) { console.log(` ${issue.title} detected - issue still valid`); + const labels = await getGithub(`https://api.github.com/repos/${owner}/ioBroker.${adapter}/issues/${issueId}/labels`); + for (let i = 0; i < labels.length; i++) { + if (labels[i].name === 'stale') { + console.log(` issue marked as stale, will try to refresh`); + const comment = `This issue seems to be still valid. So it should not be flagged stale.\n` + + `Please consider processing the issue\n`+ + `@mcm1957 for evidence`; + try { + addComment(owner, adapter, issueId, comment); + } catch (e) { + console.log(`error adding comment to ${issueId}`); + console.log(e.toString()); + } + console.log(` comment added to ${issueId}`); + } + } } else { console.log(` ${issue.title} detected`); // "Update stable version in repo from 1.0.1 to 1.0.2" @@ -76,51 +114,53 @@ async function checkIssues(latest, stable, stats, result) { issue.from = matches[2]; issue.to = matches[3]; - if ( stable[adapter] && semver.gte( stable[adapter].version, issue.to)) { + if (stable[adapter] && semver.gte(stable[adapter].version, issue.to)) { console.log(` adapter is already at stable version ${stable[adapter].version}`); - const comment = `This issue seems to be outdated.\n\n` + - `This issue suggests to update the stable version of this adapter to ${issue.to} but the current ` + + const comment = `This issue seems to be outdated.\n\n` + + `This issue suggests to update the stable version of this adapter to ${issue.to} but the current ` + `stable version is already ${stable[adapter].version}.\n\n` + - `So this issue should be closed.`; + `So this issue should be closed.\n\n` + + `@mcm1957 for evidence`; try { addComment(owner, adapter, issueId, comment); } catch (e) { - console.log(`error adding comment to ${issueId}`); - console.log(e.toString()); + console.log(`error adding comment to ${issueId}`); + console.log(e.toString()); } console.log(` comment added to ${issueId}`); try { closeIssue(owner, adapter, issueId); } catch (e) { - console.log(`error closing issue ${issueId}`); - console.log(e.toString()); + console.log(`error closing issue ${issueId}`); + console.log(e.toString()); } console.log(` issue ${issueId} closed`); - } else if ( res.length && semver.gt( res[0].latest.version, issue.to)) { + } else if (res.length && semver.gt(res[0].latest.version, issue.to) && res[0].latest.version.match(/^\d+\.\d+\.\d+$/)) { // ignore -alpha.x console.log(` adapter should be updated to ${res[0].latest.version} now`); - const comment = `This issue seems to be outdated.\n\n` + - `This issue suggests to update the stable version of this adapter to ${issue.to} but in the meantime ` + + const comment = `This issue seems to be outdated.\n\n` + + `This issue suggests to update the stable version of this adapter to ${issue.to} but in the meantime ` + `an update to version ${res[0].latest.version} is suggested.\n\n` + - `So this issue will be closed and replaced by an updated one.`; + `So this issue will be closed and replaced by an updated one.\n\n` + + `@mcm1957 for evidence`; try { addComment(owner, adapter, issueId, comment); } catch (e) { - console.log(`error adding comment to ${issueId}`); - console.log(e.toString()); + console.log(`error adding comment to ${issueId}`); + console.log(e.toString()); } console.log(` comment added to ${issueId}`); try { closeIssue(owner, adapter, issueId); } catch (e) { - console.log(`error closing issue ${issueId}`); - console.log(e.toString()); + console.log(`error closing issue ${issueId}`); + console.log(e.toString()); } console.log(` issue ${issueId} closed`); - } else { + } else { console.log(` adapter should still be updated as requested to ${issue.to}`); } - } else { - console.log(` cannot parse issue title please check manually`); + } else { + console.log(` cannot parse issue title please check manually`); } } } @@ -134,23 +174,21 @@ async function getDiff(latest, stable, stats) { Object.keys(latest) .forEach(adapter => { if (!adapter.startsWith('_') && !stable[adapter] ) { - - if ( !stats.versions[adapter] ) { console.log(`\nWARNING: Adapter ${adapter} not yet provides statistics`); return; - }; - + } + const now = new Date(); const latestTime = new Date(latest[adapter].versionDate); //const stableTime = new Date(stable[adapter].versionDate); //const daysDiff = Math.floor((latestTime.getTime() - stableTime.getTime()) / ONE_DAY); - + const parts = latest[adapter].meta.split('/'); const item = { adapter, installs: stats.adapters[adapter], - owner: parts[parts.length - 4], + owner: parts[3], latest: { installs: stats.versions[adapter][latest[adapter].version], percent: Math.round((stats.versions[adapter][latest[adapter].version] / stats.adapters[adapter]) * 10000) / 100, @@ -168,18 +206,19 @@ async function getDiff(latest, stable, stats) { daysDiff: null }; -console.log(`\nchecking ioBroker.${adapter} [ https://github.com/${item.owner}/ioBroker.${item.adapter} ] ...`); -console.log(` Adapter not yet listed at stable repository`); -console.log(` Version: stable=${item.stable.version} (${item.stable.old} days old) => latest=${item.latest.version} (${item.latest.old} days old)`); -console.log(` Installs: stable=${item.stable.installs} (${item.stable.percent}%), latest=${item.latest.installs} (${item.latest.percent}%), total=${item.installs}`); + console.log(`\nchecking ioBroker.${adapter} [ https://github.com/${item.owner}/ioBroker.${item.adapter} ] ...`); + console.log(` Adapter not yet listed at stable repository`); + console.log(` Version: stable=${item.stable.version} (${item.stable.old} days old) => latest=${item.latest.version} (${item.latest.old} days old)`); + console.log(` Installs: stable=${item.stable.installs} (${item.stable.percent}%), latest=${item.latest.installs} (${item.latest.percent}%), total=${item.installs}`); // ---- CONDITIONS for stable 1-3 if (// 1. if the latest version is older than 30 days - (now.getTime() - latestTime.getTime()) > 30 * ONE_DAY) { -console.log(' + should be published'); - result.push(item); + (now.getTime() - latestTime.getTime()) > 30 * ONE_DAY + ) { + console.log(' + should be published'); + result.push(item); } else { -console.log(' - too young for publishing'); + console.log(' - too young for publishing'); } } }); @@ -192,12 +231,12 @@ console.log(' - too young for publishing'); const latestTime = new Date(latest[adapter].versionDate); const stableTime = new Date(stable[adapter].versionDate); const daysDiff = Math.floor((latestTime.getTime() - stableTime.getTime()) / ONE_DAY); - + const parts = latest[adapter].meta.split('/'); const item = { adapter, installs: stats.adapters[adapter], - owner: parts[parts.length - 4], + owner: parts[3], latest: { installs: stats.versions[adapter][latest[adapter].version], percent: Math.round((stats.versions[adapter][latest[adapter].version] / stats.adapters[adapter]) * 10000) / 100, @@ -215,9 +254,9 @@ console.log(' - too young for publishing'); daysDiff }; -console.log(`\nchecking ioBroker.${adapter} [ https://github.com/${item.owner}/ioBroker.${item.adapter} ] ...`); -console.log(` Version: stable=${item.stable.version} (${item.stable.old} days old) => latest=${item.latest.version} (${item.latest.old} days old)`); -console.log(` Installs: stable=${item.stable.installs} (${item.stable.percent}%), latest=${item.latest.installs} (${item.latest.percent}%), total=${item.installs}`); + console.log(`\nchecking ioBroker.${adapter} [ https://github.com/${item.owner}/ioBroker.${item.adapter} ] ...`); + console.log(` Version: stable=${item.stable.version} (${item.stable.old} days old) => latest=${item.latest.version} (${item.latest.old} days old)`); + console.log(` Installs: stable=${item.stable.installs} (${item.stable.percent}%), latest=${item.latest.installs} (${item.latest.percent}%), total=${item.installs}`); // ---- CONDITIONS for stable 1-3 if (// 1. if the latest version is older than two weeks @@ -228,15 +267,16 @@ console.log(` Installs: stable=${item.stable.installs} (${item.stable.percent // 3a. if the latest version is used by more than 5 percent of the users // 3b. or if the latest version is older 30 days - if ((item.latest.percent > 5) || - ((now.getTime() - latestTime.getTime()) > 30 * ONE_DAY)) { -console.log(' + should be updated'); + if ((item.latest.percent > 5) || + ((now.getTime() - latestTime.getTime()) > 30 * ONE_DAY) + ) { + console.log(' + should be updated'); result.push(item); } else { -console.log(' - too few users (percent limit missed)'); + console.log(' - too few users (percent limit missed)'); } } else { -console.log(' - too young for update'); + console.log(' - too young for update'); } } }); @@ -273,13 +313,20 @@ function generateIssue(adapter, stableFile) { body += `# Think about update stable version to ${adapter.latest.version}\n`; } body += `**Version**: stable=**${adapter.stable.version}** (${adapter.stable.old} days old) => latest=**${adapter.latest.version}** (${adapter.latest.old} days old)\n`; - body += `**Installs**: stable=**${adapter.stable.installs}** (${adapter.stable.percent}%), latest=**${adapter.latest.installs}** (${adapter.latest.percent}%), total=**${adapter.installs}**\n`; + body += `**Installs**: stable=**${adapter.stable.installs}** (${adapter.stable.percent}%), latest=**${adapter.latest.installs}** (${adapter.latest.percent}%), total=**${adapter.installs}**\n\n`; + body += `Click to use [developer portal](https://www.iobroker.dev/adapter/${adapter.adapter}/releases)\n`; if (num !== undefined) { body += `Click to [edit](https://github.com/ioBroker/ioBroker.repositories/edit/master/sources-dist-stable.json#L${num})\n`; } else { body += `Click to [edit](https://github.com/ioBroker/ioBroker.repositories/edit/master/sources-dist-stable.json)\n`; } - + body += '\n'; + body += '**Do not close this issue manually as a new issue will be created if condition for update still exists.**\n'; + body += '\n'; + body += `Please drop a comment if any reason exists which blocks updating to version ${adapter.latest.version} at this time.\n`; + body += '\n\n'; + body += 'Note: This is an automatically generated message and not personally authored by bluefox!\n'; + body += ' @mcm1957 for evidence'; console.log(`CREATE ISSUE for ioBroker.${adapter.adapter} [ https://www.github.com/${adapter.owner}/ioBroker.${adapter.adapter} ]:`); console.log(`${TITLE} from ${adapter.stable.version} to ${adapter.latest.version}\n\n ${body}`); console.log(``); @@ -287,8 +334,8 @@ function generateIssue(adapter, stableFile) { return createIssue(adapter.owner, `ioBroker.${adapter.adapter}`, { title: `${TITLE} from ${adapter.stable.version} to ${adapter.latest.version}`, body - }).catch(e => - console.error(`Cannot create issue for "${adapter.adapter}": ${e}`)); + }) + .catch(e => console.error(`Cannot create issue for "${adapter.adapter}": ${e}`)); } }); } @@ -300,17 +347,24 @@ async function doIt() { const master = await getMasterStableAsTextFile(); const result = await getDiff(latest, stable, stats); - console.log( `\nchecking issues...`); + console.log(`\nchecking issues...`); await checkIssues(latest, stable, stats, result); - console.log( `\ncreating issues...`); + console.log(`\ncreating issues...`); for (const adapter of result) { await generateIssue(adapter, master); } + console.log(`\ntrigger repository checks...`); + for (const adapter of result) { + await triggerRepoCheck(adapter); + console.log('waiting 60s ...'); + await sleep(60000); // limit to 1 call per minute + } + return ('done'); } doIt() .then(result => console.log(result)) - .catch(e => console.error(e)); + .catch(e => { console.error(e); exit(-1)}); diff --git a/lib/setLabels.js b/lib/setLabels.js index daa00930f..a4cd1719e 100644 --- a/lib/setLabels.js +++ b/lib/setLabels.js @@ -1,11 +1,10 @@ 'use strict'; -const fs = require('fs'); +const fs = require('node:fs'); const { addLabel, deleteLabel, getLabels, getGithub, - getUrl, } = require('./common'); function getPullRequestNumber() { @@ -15,31 +14,32 @@ function getPullRequestNumber() { throw new Error('Reference not found.'); } return result[1]; - } else if (process.env.GITHUB_EVENT_PATH) { + } + if (process.env.GITHUB_EVENT_PATH) { const event = JSON.parse(fs.readFileSync(process.env.GITHUB_EVENT_PATH, 'utf8')); return event.pull_request ? event.pull_request.number : (event.issue ? event.issue.number : ''); - } else { - throw new Error('Reference not found. process.env.GITHUB_REF and process.env.GITHUB_EVENT_PATH are not set!'); } + + throw new Error('Reference not found. process.env.GITHUB_REF and process.env.GITHUB_EVENT_PATH are not set!'); } async function addLabels(prID, labels) { - labels.forEach( l=> { - console.log (`adding label ${l}`); - addLabel( prID, [l]) - }) + for (let l = 0; l < labels.length; l++) { + console.log(`adding label ${labels[l]}`); + await addLabel(prID, [labels[l]]); + } } async function delLabels(prID, labels) { - getLabels(prID) - .then ( gl => labels.forEach( l=> gl.forEach( cgl => { - if (cgl.name === l) { - console.log (`deleting label ${l}`); - deleteLabel( prID, l) - } - }) - ) - ) + const gl = await getLabels(prID); + for (let l = 0; l < labels.length; l++) { + for (let i = 0; i < gl.length; i++) { + if (gl[i].name === labels[l]) { + console.log(`deleting label ${labels[l]}`); + await deleteLabel(prID, labels[l]); + } + } + } } async function doIt() { @@ -64,23 +64,23 @@ async function doIt() { const isStable = fileNames.includes('sources-dist-stable.json') const fileCnt = fileNames.length; - if ( fileCnt === 1 && isLatest) { - console.log (' is LATEST PR'); - await delLabels(prID, ['Stable', 'STABLE - brand new', 'CHANGES-BOTH-REPOSITORIES']); - } else if ( fileCnt === 1 && isStable) { - console.log (' is STABLE PR'); - await delLabels(prID, ['CHANGES-BOTH-REPOSITORIES']); - await addLabels(prID, ['Stable']); - } else if ( fileCnt === 2 && isLatest && isStable) { - console.log (' is DOUBLE PR'); + if (fileCnt === 1 && isLatest) { + console.log(' is LATEST PR'); + await delLabels(prID, ['Stable', 'STABLE - brand new', 'CHANGES-BOTH-REPOSITORIES']); + } else if (fileCnt === 1 && isStable) { + console.log(' is STABLE PR'); + await delLabels(prID, ['CHANGES-BOTH-REPOSITORIES']); + await addLabels(prID, ['Stable']); + } else if (fileCnt === 2 && isLatest && isStable) { + console.log(' is DOUBLE PR'); await delLabels(prID, ['Stable']); - await addLabels(prID, ['CHANGES-BOTH-REPOSITORIES']); + await addLabels(prID, ['CHANGES-BOTH-REPOSITORIES']); } else if (fileCnt === 0 ) { - console.log (' is NOP PR'); - await delLabels(prID, ['Stable', 'STABLE - brand new', 'CHANGES-BOTH-REPOSITORIES']); + console.log(' is NOP PR'); + await delLabels(prID, ['Stable', 'STABLE - brand new', 'CHANGES-BOTH-REPOSITORIES']); } else { - console.log (' is OTHER PR'); - await delLabels(prID, ['Stable', 'STABLE - brand new', 'CHANGES-BOTH-REPOSITORIES']); + console.log(' is OTHER PR'); + await delLabels(prID, ['Stable', 'STABLE - brand new', 'CHANGES-BOTH-REPOSITORIES']); } return 'done'; diff --git a/lib/setStableTag.js b/lib/setStableTag.js new file mode 100644 index 000000000..7de335705 --- /dev/null +++ b/lib/setStableTag.js @@ -0,0 +1,69 @@ +'use strict'; +const execSync = require('node:child_process').execSync; + +const { + getUrl, +} = require('./common'); + +const ADAPTER_LIST = [ + 'admin', + 'discovery', + 'js-controller', + 'backitup' +]; + +async function getStableRepo() { + return await getUrl('https://raw.githubusercontent.com/ioBroker/ioBroker.repositories/master/sources-dist-stable.json'); +} + +async function getNpmMeta( pAdapter ) { + return await getUrl(`https://registry.npmjs.org/iobroker.${pAdapter}`); +} + +async function getNpmDistTags(pAdapter) { + const npmMeta = await getNpmMeta( pAdapter ); + return npmMeta['dist-tags']; +} + +async function doIt() { + const stable = await getStableRepo(); + for (const adapter in stable) { + if (ADAPTER_LIST.includes(adapter)) { + console.log (`\nchecking ${adapter} ...`); + + const npmTags = await getNpmDistTags(adapter); + const repoRelease = stable[adapter].version; + const npmRelease = npmTags.stable; + //console.log( `repo: ${repoRelease} - npm: ${npmRelease}`); + if (repoRelease === npmRelease) { + console.log (`${adapter} ${repoRelease} correctly tagged as stable`) + } else { + console.log (`${adapter} ${repoRelease} need to be tagged as stable`); + console.log( `executing npm --//registry.npmjs.org/:_authToken=*** dist-tag add iobroker.${adapter}@${repoRelease} stable`); + const cmd = `npm --//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN} dist-tag add iobroker.${adapter}@${repoRelease} stable`; + try { + const result = execSync(cmd, { encoding: 'utf-8' }); + console.log(result); + } catch (_e) { + // console.log (JSON.stringify(e)); + } + } + } + } + + return 'done'; +} + +// activate for debugging purposes +//process.env.GITHUB_REF = 'refs/pull/2298/merge'; +//process.env.OWN_GITHUB_TOKEN = 'add-token-here'; +//process.env.GITHUB_EVENT_PATH = __dirname + '/../event.json'; + +//console.log(`process.env.GITHUB_REF = ${process.env.GITHUB_REF}`); +//console.log(`process.env.GITHUB_EVENT_PATH = ${process.env.GITHUB_EVENT_PATH}`); +console.log(`process.env.OWN_GITHUB_TOKEN = ${(process.env.OWN_GITHUB_TOKEN || '').length}`); +console.log(`process.env.NPM_TOKEN = ${(process.env.NPM_TOKEN || '').length}`); + +doIt() + .then(result => console.log(result)) + .catch(e => console.error(e)); diff --git a/lib/stable0DayPrInfo.js b/lib/stable0DayPrInfo.js new file mode 100644 index 000000000..3a7467c8e --- /dev/null +++ b/lib/stable0DayPrInfo.js @@ -0,0 +1,111 @@ +'use strict'; +const fs = require('node:fs'); +const { + addComment, + deleteComment, + getLabels, + getAllComments, +} = require('./common'); + +function getPullRequestNumber() { + if (process.env.GITHUB_REF && process.env.GITHUB_REF.match(/refs\/pull\/\d+\/merge/)) { + const result = /refs\/pull\/(\d+)\/merge/g.exec(process.env.GITHUB_REF); + if (!result) { + throw new Error('Reference not found.'); + } + return result[1]; + } + if (process.env.GITHUB_EVENT_PATH) { + const event = JSON.parse(fs.readFileSync(process.env.GITHUB_EVENT_PATH, 'utf8')); + return event.pull_request ? event.pull_request.number : (event.issue ? event.issue.number : ''); + } + + throw new Error('Reference not found. process.env.GITHUB_REF and process.env.GITHUB_EVENT_PATH are not set!'); +} + +async function checkLabel(prID, label) { + const lbls = await getLabels(prID); + for ( const lbl of lbls) { + if (lbl.name === label) { + return true; + } + } + return false; +} + +async function doIt() { + const prID = getPullRequestNumber(); + + console.log(`Process PR ${prID}`); + + if (!prID) { + console.error('Cannot find PR'); + return Promise.reject('Cannot find PR'); + } + + const labelIsSet = await checkLabel (prID, 'STABLE - 0-Day PR'); + console.log (`label STABLE - 0-Day PR is ${labelIsSet ? '' : 'NOT '}set.`); + + const gitComments = await getAllComments(prID); + let exists = gitComments.find(comment => comment.body.includes('## ioBroker repository information about STABLE-0-Day-PR tagging')); + console.log (`informational comment ${labelIsSet ? 'exists' : 'does NOT exist.'}`); + + if (exists && !labelIsSet) { + try { + console.log(`deleting comment ${exists.id} from PR ${prID}`); + await deleteComment(prID, exists.id); + } catch (e) { + console.error(`warning: cannot delete comment from PR ${prID}:`); + console.log(` ${e}`); + } + } + + if (!exists && labelIsSet) { + let body = `## ioBroker repository information about STABLE-0-Day-PR tagging\n\n`; + + + body += `Your PR has been tagged with the label STABLE-0-day-PR. This indicates that the release requested to be added `; + body += `to the stable repository has been created within one day after releasing the new version. `; + body += `Currently this release has not even been published at LATEST repository. `; + body += `So this release is too young for immediate processing.\n\n`; + + body += `Normally, a release should be available at LATEST repository for at least one or two weeks without any serious new issues `; + body += `detected within this timeframe. `; + body += `**Your PR will be closed for now. Please create a new PR after the new version has been available at LATEST repository `; + body += `for at least one or two weeks, has a considerable number of installations and no serious new issues.**\n\n`; + + body += `**IMPORTANT:**\n`; + body += `Of course, it is possible to release a new version immediately if it is a hotfix for a serious problem, i.e. some errors `; + body += `cause adapter crashes or incompatible api changes of external websites blocking normal usage. In this case, `; + body += `please indicate this fact as a comment and mention mcm1957 and eventually Apollon77 explicitly. Please describe the reason `; + body += `(i.e. by referencing an issue). Hotfixes should minimize the changes, even dependency updates should be avoided if `; + body += `not related to the fix. New functionality and major (breaking) updates are most likely never a hotfix.\n\n`; + body += `Please note that ANY (even hotfixes) should be available at LATEST repository for at least 1 day and have some (few) installations `; + body += `to avoid hotfixes with serious problems at stable repository. Exceptions to this minimal delay must be discussed `; + body += `individually.\n\n`; + body += `Feel free to contact me (mcm1957) if you have any more questions.`; + + try { + console.log(`adding information comment to PR ${prID}`); + await addComment(prID, body); + } catch (e) { + console.error(`warning: cannot add comment to PR ${prID}:`); + console.log(` ${e}`); + }; + } + + return 'done'; +} + +// activate for debugging purposes +// process.env.GITHUB_REF = 'refs/pull/2725/merge'; +// process.env.OWN_GITHUB_TOKEN = 'insert token'; +// process.env.GITHUB_EVENT_PATH = __dirname + '/../event.json'; + +console.log(`process.env.GITHUB_REF = ${process.env.GITHUB_REF}`); +console.log(`process.env.GITHUB_EVENT_PATH = ${process.env.GITHUB_EVENT_PATH}`); +console.log(`process.env.OWN_GITHUB_TOKEN = ${(process.env.OWN_GITHUB_TOKEN || '').length}`); + +doIt() + .then(result => console.log(result)) + .catch(e => console.error(e)); diff --git a/lib/stableBrandNewInfo.js b/lib/stableBrandNewInfo.js new file mode 100644 index 000000000..8658b8b88 --- /dev/null +++ b/lib/stableBrandNewInfo.js @@ -0,0 +1,104 @@ +'use strict'; +const fs = require('node:fs'); +const { + addComment, + deleteComment, + getLabels, + getAllComments, +} = require('./common'); + +function getPullRequestNumber() { + if (process.env.GITHUB_REF && process.env.GITHUB_REF.match(/refs\/pull\/\d+\/merge/)) { + const result = /refs\/pull\/(\d+)\/merge/g.exec(process.env.GITHUB_REF); + if (!result) { + throw new Error('Reference not found.'); + } + return result[1]; + } + if (process.env.GITHUB_EVENT_PATH) { + const event = JSON.parse(fs.readFileSync(process.env.GITHUB_EVENT_PATH, 'utf8')); + return event.pull_request ? event.pull_request.number : (event.issue ? event.issue.number : ''); + } + + throw new Error('Reference not found. process.env.GITHUB_REF and process.env.GITHUB_EVENT_PATH are not set!'); +} + +async function checkLabel(prID, label) { + const lbls = await getLabels(prID); + for ( const lbl of lbls) { + if (lbl.name === label) { + return true; + } + } + return false; +} + +async function doIt() { + const prID = getPullRequestNumber(); + + console.log(`Process PR ${prID}`); + + if (!prID) { + console.error('Cannot find PR'); + return Promise.reject('Cannot find PR'); + } + + const labelIsSet = await checkLabel (prID, 'STABLE - brand new'); + console.log (`label STABLE - BRAND NEW is ${labelIsSet ? '' : 'NOT '}set.`); + + const gitComments = await getAllComments(prID); + let exists = gitComments.find(comment => comment.body.includes('## ioBroker repository information about STABLE-BRAND-NEW tagging')); + console.log (`informational comment ${labelIsSet ? 'exists' : 'does NOT exist.'}`); + + if (exists && !labelIsSet) { + try { + console.log(`deleting comment ${exists.id} from PR ${prID}`); + await deleteComment(prID, exists.id); + } catch (e) { + console.error(`warning: cannot delete comment from PR ${prID}:`); + console.log(` ${e}`); + } + } + + if (!exists && labelIsSet) { + let body = `## ioBroker repository information about STABLE-BRAND-NEW tagging\n\n`; + body += `Your PR has been tagged with the label STABLE - BRAND NEW. This indicates that the release requested to be added to the `; + body += `stable repository seems to be too young for immediate processing.\n\n`; + body += `Normally, a release should be available at LATEST repository for at least one or two weeks without any serious issues `; + body += `detected within this timeframe. Your release seems to be younger than 7 days.`; + body += `Your PR will be kept in evidence and will be merged approximately one week after creation of the release without any further `; + body += `action required by you.\n\n`; + body += `**IMPORTANT:**\n`; + body += `Of course, it is possible to release a new version immediately if it is a hotfix for a serious problem, i.e. some errors `; + body += `cause adapter crashes or incompatible api changes of external websites blocking normal usage. In this case, `; + body += `please indicate this fact as a comment and mention mcm1957 and eventually Apollon77 explicitly. Please describe the reason `; + body += `(i.e. by referencing an issue). Hotfixes should minimize the changes, even dependency updates should be avoided if `; + body += `not related to the fix. New functionality and major (breaking) updates are most likely never a hotfix.\n\n`; + body += `Please note that ANY (even hotfixes) should be available at latest repository for at least 1 day and have some (few) installations `; + body += `to avoid hotfixes with serious problems at stable repository. Exceptions to this minimal delay must be discussed `; + body += `individually.\n\n`; + body += `Feel free to contact me (mcm1957) if you have any more questions.`; + try { + console.log(`adding information comment to PR ${prID}`); + await addComment(prID, body); + } catch (e) { + console.error(`warning: cannot add comment to PR ${prID}:`); + console.log(` ${e}`); + }; + } + + return 'done'; +} + +// activate for debugging purposes +// process.env.GITHUB_REF = 'refs/pull/2725/merge'; +// process.env.OWN_GITHUB_TOKEN = 'insert token'; +// process.env.GITHUB_EVENT_PATH = __dirname + '/../event.json'; + +console.log(`process.env.GITHUB_REF = ${process.env.GITHUB_REF}`); +console.log(`process.env.GITHUB_EVENT_PATH = ${process.env.GITHUB_EVENT_PATH}`); +console.log(`process.env.OWN_GITHUB_TOKEN = ${(process.env.OWN_GITHUB_TOKEN || '').length}`); + +doIt() + .then(result => console.log(result)) + .catch(e => console.error(e)); diff --git a/lib/tools.js b/lib/tools.js index e5b524cfc..5547b1340 100644 --- a/lib/tools.js +++ b/lib/tools.js @@ -1,7 +1,7 @@ -const fs = require('fs'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const semver = require('semver'); -require('events').EventEmitter.prototype._maxListeners = 100; +require('node:events').EventEmitter.prototype._maxListeners = 100; const axios = require('axios'); let extend; let password; @@ -67,7 +67,7 @@ function decryptPhrase(password, data, callback) { } }); decipher.on('error', error => { - console.error('Cannot decode secret: ' + error); + console.error(`Cannot decode secret: ${error}`); callback(null); }); decipher.on('end', function () { @@ -77,7 +77,7 @@ function decryptPhrase(password, data, callback) { decipher.write(data, 'hex'); decipher.end(); } catch (e) { - console.error('Cannot decode secret: ' + e); + console.error(`Cannot decode secret: ${e}`); callback(null); } } @@ -90,7 +90,7 @@ function getAppName() { function rmdirRecursiveSync(path) { if (fs.existsSync(path)) { fs.readdirSync(path).forEach(function (file/*, index*/) { - const curPath = path + '/' + file; + const curPath = `${path}/${file}`; if (fs.statSync(curPath).isDirectory()) { // recurse rmdirRecursiveSync(curPath); @@ -103,13 +103,13 @@ function rmdirRecursiveSync(path) { try { fs.rmdirSync(path); } catch (e) { - console.log('Cannot delete directory ' + path + ': ' + e.toString()); + console.log(`Cannot delete directory ${path}: ${e.toString()}`); } } } function findIPs() { - const ifaces = require('os').networkInterfaces(); + const ifaces = require('node:os').networkInterfaces(); const ipArr = []; for (const dev in ifaces) { if (!ifaces.hasOwnProperty(dev)) { @@ -148,7 +148,7 @@ function getMac(callback) { const zeroRegex = /(?:[0]{2}[:-]){5}[0]{2}/; const command = process.platform.indexOf('win') === 0 ? 'getmac' : 'ifconfig || ip link'; - require('child_process').exec(command, (err, stdout) => { + require('node:child_process').exec(command, (err, stdout) => { if (err) { callback(err); } else { @@ -183,7 +183,7 @@ function uuid(givenMac, callback) { let u; if (mac === '') { - const ifaces = require('os').networkInterfaces(); + const ifaces = require('node:os').networkInterfaces(); // Find first not empty MAC for (const n in ifaces) { @@ -208,7 +208,7 @@ function uuid(givenMac, callback) { } if (mac) { - const md5sum = require('crypto').createHash('md5'); + const md5sum = require('node:crypto').createHash('md5'); md5sum.update(mac); mac = md5sum.digest('hex'); u = `${mac.substring(0, 8)}-${mac.substring(8, 12)}-${mac.substring(12, 16)}-${mac.substring(16, 20)}-${mac.substring(20)}`; @@ -231,7 +231,7 @@ function createUuid(_objects, callback) { let _uuid; _objects.getObject('system.user.admin', (err, obj) => { if (err || !obj) { - password = password || require(__dirname + '/password'); + password = password || require(`${__dirname}/password`); // Default Password for user 'admin' is application name in lower case password(getAppName()).hash(null, null, (err, res) => { @@ -297,7 +297,7 @@ function createUuid(_objects, callback) { // Download file to tmp or return file name directly function getFile(urlOrPath, fileName, callback) { - // If object was read + // If an object was read if (urlOrPath.substring(0, 'http://'.length) === 'http://' || urlOrPath.substring(0, 'https://'.length) === 'https://' ) { @@ -330,7 +330,7 @@ function getFile(urlOrPath, fileName, callback) { // Return content of the json file. Download it or read directly function getJson(urlOrPath, callback) { let sources = {}; - // If object was read + // If an object was read if (urlOrPath && typeof urlOrPath === 'object') { callback && callback(urlOrPath); } else @@ -385,16 +385,47 @@ function getJson(urlOrPath, callback) { } } -// Get list of all installed adapters and controller version on this host + +/** + * Extract the license from io-package or package.json +* +* @param {{ ioPackJson: Record, packJson: Record }} options io-package.json and package.json contents +* @return {{ license: string, link?: string, type?: string }} +*/ +function extractLicenseInfo(options) { + const { ioPackJson, packJson} = options; + if (ioPackJson.common.licenseInformation) { + return ioPackJson.common.licenseInformation; + } + + if (packJson.license) { + return { license: packJson.license }; + } + + // hint: pack.licenses is deprecated https://docs.npmjs.com/cli/v10/configuring-npm/package-json#license + if (packJson.licenses?.length) { + return { license: packJson.licenses[0].type, link: packJson.licenses[0].url }; + } + + if (ioPackJson.common.license) { + return { license: ioPackJson.common.license }; + } + + return { license: '' }; +} + +// Get a list of all installed adapters and controller version on this host function getInstalledInfo(hostRunningVersion) { let i; const result = {}; - let path = __dirname + '/../'; + let path = `${__dirname}/../`; // Get info about host let ioPackage = JSON.parse(fs.readFileSync(path + 'io-package.json')); - let package_ = fs.existsSync(path + 'package.json') ? JSON.parse(fs.readFileSync(path + 'package.json')) : {}; + let package_ = fs.existsSync(`${path}package.json`) ? JSON.parse(fs.readFileSync(`${path}package.json`)) : {}; const regExp = new RegExp(`^${module.exports.appName}\\.`, 'i'); + const licenseInfo = extractLicenseInfo({ packJson: package_, ioPackJson: ioPackage }); + //noinspection JSUnresolvedVariable result[ioPackage.common.name] = { controller: true, @@ -406,8 +437,10 @@ function getInstalledInfo(hostRunningVersion) { keywords: ioPackage.common.keywords, readme: ioPackage.common.readme, runningVersion: hostRunningVersion, - license: ioPackage.common.license ? ioPackage.common.license : ((package_.licenses && package_.licenses.length) ? package_.licenses[0].type : ''), - licenseUrl: (package_.licenses && package_.licenses.length) ? package_.licenses[0].url : '' + licenseInformation: licenseInfo, + // license and licenseUrl now contained in licenseInfo, but keep it for backward compatibility (14.02.2024) + license: licenseInfo.license, + licenseUrl: licenseInfo.link ?? '' }; let dirs; if (fs.existsSync(__dirname + '/../node_modules')) { @@ -415,9 +448,9 @@ function getInstalledInfo(hostRunningVersion) { for (i = 0; i < dirs.length; i++) { try { path = `${__dirname}/../node_modules/${dirs[i]}/`; - if (regExp.test(dirs[i]) && fs.existsSync(path + 'io-package.json')) { - ioPackage = JSON.parse(fs.readFileSync(path + 'io-package.json')); - package_ = fs.existsSync(path + 'package.json') ? JSON.parse(fs.readFileSync(path + 'package.json')) : {}; + if (regExp.test(dirs[i]) && fs.existsSync(`${path}io-package.json`)) { + ioPackage = JSON.parse(fs.readFileSync(`${path}io-package.json`)); + package_ = fs.existsSync(path + 'package.json') ? JSON.parse(fs.readFileSync(`${path}package.json`)) : {}; //noinspection JSUnresolvedVariable result[ioPackage.common.name] = { controller: false, @@ -429,8 +462,10 @@ function getInstalledInfo(hostRunningVersion) { keywords: ioPackage.common.keywords, readme: ioPackage.common.readme, type: ioPackage.common.type, - license: ioPackage.common.license ? ioPackage.common.license : ((package_.licenses && package_.licenses.length) ? package_.licenses[0].type : ''), - licenseUrl: (package_.licenses && package_.licenses.length) ? package_.licenses[0].url : '' + licenseInformation: licenseInfo, + // license and licenseUrl now contained in licenseInfo, but keep it for backward compatibility for older admin (14.02.2024) + license: licenseInfo.license, + licenseUrl: licenseInfo.link ?? '' }; } } catch (e) { @@ -440,14 +475,14 @@ function getInstalledInfo(hostRunningVersion) { } if (fs.existsSync(`${__dirname}/../../../node_modules/${module.exports.appName.toLowerCase()}.js-controller`) || fs.existsSync(`${__dirname}/../../../node_modules/${module.exports.appName}.js-controller`)) { - dirs = fs.readdirSync(__dirname + '/../..'); + dirs = fs.readdirSync(`${__dirname}/../..`); for (i = 0; i < dirs.length; i++) { try { - path = __dirname + '/../../' + dirs[i] + '/'; + path = `${__dirname}/../../${dirs[i]}/`; if (regExp.test(dirs[i]) && dirs[i].substring(module.exports.appName.length + 1) !== 'js-controller' && fs.existsSync(path + 'io-package.json')) { - ioPackage = JSON.parse(fs.readFileSync(path + 'io-package.json')); - package_ = fs.existsSync(path + 'package.json') ? JSON.parse(fs.readFileSync(path + 'package.json')) : {}; + ioPackage = JSON.parse(fs.readFileSync(`${path}io-package.json`)); + package_ = fs.existsSync(`${path}package.json`) ? JSON.parse(fs.readFileSync(`${path}package.json`)) : {}; //noinspection JSUnresolvedVariable result[ioPackage.common.name] = { controller: false, @@ -459,8 +494,10 @@ function getInstalledInfo(hostRunningVersion) { keywords: ioPackage.common.keywords, readme: ioPackage.common.readme, type: ioPackage.common.type, - license: ioPackage.common.license ? ioPackage.common.license : ((package_.licenses && package_.licenses.length) ? package_.licenses[0].type : ''), - licenseUrl: (package_.licenses && package_.licenses.length) ? package_.licenses[0].url : '' + licenseInformation: licenseInfo, + // license and licenseUrl now contained in licenseInfo, but keep it for backward compatibility for older admin (14.02.2024) + license: licenseInfo.license, + licenseUrl: licenseInfo.link ?? '' }; } } catch (e) { @@ -477,12 +514,12 @@ function getInstalledInfo(hostRunningVersion) { * @param {(err: Error | null, version: string) => void} [callback] */ function getNpmVersion(adapter, callback) { - adapter = adapter ? module.exports.appName + '.' + adapter : module.exports.appName; + adapter = adapter ? `${module.exports.appName}.${adapter}` : module.exports.appName; adapter = adapter.toLowerCase(); const cliCommand = `npm view ${adapter}@latest version`; - const exec = require('child_process').exec; + const exec = require('node:child_process').exec; exec(cliCommand, {timeout: 2000}, (error, stdout) => { let version; if (error) { @@ -506,8 +543,8 @@ function getIoPack(sources, name, callback) { getJson(packUrl, pack => { const version = sources[name].version; const type = sources[name].type; - // If installed from git or something else - // js-controller is exception, because can be installed from npm and from git + // If installed from git or something else. + // js-controller is an exception because it can be installed from npm and from git if (sources[name].url && name !== 'js-controller') { if (ioPack && ioPack.common) { sources[name] = extend(true, sources[name], ioPack.common); @@ -607,7 +644,7 @@ function _getRepositoryFile(sources, path, callback) { if (sources[name].icon) sources[name].icon = findPath(path, sources[name].icon); if (!sources[name].name && sources[name].meta) { - console.log('Read ' + name + '...'); + console.log(`Read ${name}...`); getIoPack(sources, name, () => { if (sources._helper) { if (sources._helper.failCounter.length > 10) { @@ -636,7 +673,7 @@ function _getRepositoryFile(sources, path, callback) { if (sources._helper) { let err; if (sources._helper.failCounter.length) { - err = 'Following packages cannot be read: ' + sources._helper.failCounter.join(', '); + err = `Following packages cannot be read: ${sources._helper.failCounter.join(', ')}`; } clearTimeout(sources._helper.timeout); delete sources._helper; @@ -673,12 +710,12 @@ function getRepositoryFile(urlOrPath, additionalInfo, callback) { } else if (!urlOrPath) { try { - sources = JSON.parse(fs.readFileSync(getDefaultDataDir() + 'sources.json')); + sources = JSON.parse(fs.readFileSync(`${getDefaultDataDir()}sources.json`)); } catch (e) { sources = {}; } try { - const sourcesDist = JSON.parse(fs.readFileSync(__dirname + '/../conf/sources-dist.json')); + const sourcesDist = JSON.parse(fs.readFileSync(`${__dirname}/../conf/sources-dist.json`)); sources = extend(true, sourcesDist, sources); } catch (e) { @@ -691,7 +728,7 @@ function getRepositoryFile(urlOrPath, additionalInfo, callback) { } _getRepositoryFile(sources, path, err => { - if (err) console.error('[' + new Date() + '] ' + err); + if (err) console.error(`[${new Date()}] ${err}`); callback && callback(err, sources); }); } else { @@ -716,7 +753,7 @@ function getRepositoryFile(urlOrPath, additionalInfo, callback) { } function sendDiagInfo(obj, callback) { - axios.post(`http://download.${module.exports.appName}.net/diag.php`,'data=' + JSON.stringify(obj), { + axios.post(`http://download.${module.exports.appName}.net/diag.php`, `data=${JSON.stringify(obj)}`, { headers: {'content-type': 'application/x-www-form-urlencoded'}, timeout: 2000 }) @@ -767,14 +804,14 @@ function getHostName() { try { const configName = getConfigFileName(); const config = JSON.parse(fs.readFileSync(configName)); - return config.system ? config.system.hostname || require('os').hostname() : require('os').hostname(); + return config.system ? config.system.hostname || require('node:os').hostname() : require('node:os').hostname(); } catch (err) { - return require('os').hostname(); + return require('node:os').hostname(); } } /** - * Read version of system npm + * Read a version of system npm * * @alias getSystemNpmVersion * @memberof Tools @@ -786,10 +823,10 @@ function getHostName() { * */ function getSystemNpmVersion(callback) { - const exec = require('child_process').exec; + const exec = require('node:child_process').exec; - // remove local node_modules\.bin dir from path - // or we potentially get a wrong npm version + // remove local node_modules\.bin dir from a path + // or we potentially get the wrong npm version const newEnv = Object.assign({}, process.env); newEnv.PATH = (newEnv.PATH || newEnv.Path || newEnv.path) .split(path.delimiter) @@ -812,7 +849,7 @@ function getSystemNpmVersion(callback) { /** * Collects information about host and available adapters * - * Following info will be collected: + * The following info will be collected: * - available adapters * - node.js --version * - npm --version @@ -828,7 +865,7 @@ function getSystemNpmVersion(callback) { * */ function getHostInfo(objects, callback) { - const os = require('os'); + const os = require('node:os'); const cpus = os.cpus(); const data = { 'Platform': os.platform(), @@ -844,7 +881,7 @@ function getHostInfo(objects, callback) { task++; objects.getObject('system.config', (err, systemConfig) => { objects.getObject('system.repositories', (err, repos) => { - // Check if repositories exists + // Check if repositories exist if (!err && repos && repos.native && repos.native.repositories) { const repo = repos.native.repositories[systemConfig.common.activeRepo]; if (repo && repo.json) { diff --git a/localNpmRepo/gulpfile.js b/localNpmRepo/gulpfile.js index 8322eb7c5..fd6fc4b14 100644 --- a/localNpmRepo/gulpfile.js +++ b/localNpmRepo/gulpfile.js @@ -160,7 +160,7 @@ function activateLocalNpm(done) { console.log('install all latest packages...'); fs.writeFileSync(`${__dirname}/ioBroker/package.json`, fs.readFileSync(`${__dirname}/ioBroker/package-stable.json`)); callInstall(() => { - // work with result + // work with a result console.log('npm set registry remote...'); exec('npm set registry https://registry.npmjs.org', err => { if (err) { @@ -193,4 +193,4 @@ gulp.task('1-createRepo', ['0-clean'], createRepo); gulp.task('2-activateLocalNpm', ['1-createRepo'], activateLocalNpm); -gulp.task('default', ['0-clean', '1-createRepo', '2-activateLocalNpm']); \ No newline at end of file +gulp.task('default', ['0-clean', '1-createRepo', '2-activateLocalNpm']); diff --git a/package.json b/package.json index facb1fa84..d6cfe426f 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,12 @@ "checkNpm": "node lib/checkNpm.js", "manualAction": "node lib/manualAction.js", "setLabels": "node lib/setLabels.js", - "stable": "node lib/readyForStable.js" + "setStableTag": "node lib/setStableTag.js", + "setTag": "node lib/setTag.js", + "stable": "node lib/readyForStable.js", + "stable0DayPrInfo": "node lib/stable0DayPrInfo.js", + "stableBrandNewInfo": "node lib/stableBrandNewInfo.js", + "handleReminder": "node lib/handleReminder.js" }, "bugs": { "url": "https://github.com/ioBroker/ioBroker.repositories/issues" @@ -43,16 +48,15 @@ "bluefox " ], "devDependencies": { - "@iobroker/repochecker": "^2.1.10", - "axios": "^1.5.0", - "chai": "^4.3.8", - "eslint": "^8.48.0", - "gulp": "^4.0.2", - "image-size": "^1.0.2", + "@iobroker/repochecker": "^3.0.7", + "axios": "^1.7.7", + "chai": "^4.5.0", + "eslint": "^9.11.0", + "image-size": "^1.1.1", "minimist": "^1.2.8", - "mocha": "^10.2.0", - "node.extend": "^2.0.2", - "semver": "^7.5.4", - "unzipper": "^0.10.14" + "mocha": "^10.7.3", + "node.extend": "^2.0.3", + "semver": "^7.6.3", + "unzipper": "^0.12.3" } } diff --git a/sources-dist-stable.json b/sources-dist-stable.json index 3db9ea401..a70a05935 100644 --- a/sources-dist-stable.json +++ b/sources-dist-stable.json @@ -18,13 +18,13 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.accuweather/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.accuweather/master/admin/accuweather.png", "type": "weather", - "version": "1.2.4" + "version": "1.5.0" }, "acme": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.acme/main/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.acme/main/admin/acme.png", "type": "general", - "version": "0.1.0" + "version": "1.0.1" }, "adb": { "meta": "https://raw.githubusercontent.com/om2804/ioBroker.adb/master/io-package.json", @@ -39,10 +39,10 @@ "version": "0.0.8" }, "admin": { - "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/io-package.json", - "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/admin/admin.png", + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/packages/admin/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/packages/admin/admin/admin.png", "type": "general", - "version": "6.8.0" + "version": "7.1.2" }, "aio": { "meta": "https://raw.githubusercontent.com/Newan/ioBroker.aio/master/io-package.json", @@ -50,6 +50,12 @@ "type": "energy", "version": "0.1.1" }, + "air-q": { + "meta": "https://raw.githubusercontent.com/CorantGmbH/ioBroker.air-q/main/io-package.json", + "icon": "https://raw.githubusercontent.com/CorantGmbH/ioBroker.air-q/main/admin/air-q.png", + "type": "weather", + "version": "1.0.3" + }, "airconwithme": { "meta": "https://raw.githubusercontent.com/weggetor/ioBroker.airconwithme/main/io-package.json", "icon": "https://raw.githubusercontent.com/weggetor/ioBroker.airconwithme/main/admin/airconwithme.png", @@ -66,37 +72,37 @@ "meta": "https://raw.githubusercontent.com/misanorot/ioBroker.alarm/master/io-package.json", "icon": "https://raw.githubusercontent.com/misanorot/ioBroker.alarm/master/admin/alarm.png", "type": "alarm", - "version": "3.3.12" + "version": "3.6.1" }, "alexa-shoppinglist": { "meta": "https://raw.githubusercontent.com/MiRo1310/ioBroker.alexa-shoppinglist/main/io-package.json", "icon": "https://raw.githubusercontent.com/MiRo1310/ioBroker.alexa-shoppinglist/main/admin/alexa-shoppinglist.png", "type": "logic", - "version": "0.1.5" + "version": "1.0.0" }, "alexa-timer-vis": { "meta": "https://raw.githubusercontent.com/MiRo1310/ioBroker.alexa-timer-vis/main/io-package.json", "icon": "https://raw.githubusercontent.com/MiRo1310/ioBroker.alexa-timer-vis/main/admin/alexa-timer-vis.png", "type": "logic", - "version": "0.2.0" + "version": "1.0.0" }, "alexa2": { "meta": "https://raw.githubusercontent.com/Apollon77/ioBroker.alexa2/master/io-package.json", "icon": "https://raw.githubusercontent.com/Apollon77/ioBroker.alexa2/master/admin/alexa.png", "type": "iot-systems", - "version": "3.24.1" + "version": "3.26.5" }, "alias-manager": { "meta": "https://raw.githubusercontent.com/sbormann/ioBroker.alias-manager/master/io-package.json", "icon": "https://raw.githubusercontent.com/sbormann/ioBroker.alias-manager/master/admin/alias-manager.png", "type": "general", - "version": "1.2.4" + "version": "1.2.6" }, "alpha-ess": { "meta": "https://raw.githubusercontent.com/Gaspode69/ioBroker.alpha-ess/main/io-package.json", "icon": "https://raw.githubusercontent.com/Gaspode69/ioBroker.alpha-ess/main/admin/alpha-ess.png", "type": "energy", - "version": "1.0.0" + "version": "2.1.4" }, "alpha2": { "meta": "https://raw.githubusercontent.com/Eisbaeeer/ioBroker.alpha2/master/io-package.json", @@ -110,6 +116,12 @@ "type": "hardware", "version": "1.2.0" }, + "amtronwallbox": { + "meta": "https://raw.githubusercontent.com/rg-engineering/ioBroker.amtronwallbox/master/io-package.json", + "icon": "https://raw.githubusercontent.com/rg-engineering/ioBroker.amtronwallbox/master/admin/amtronwallbox.png", + "type": "energy", + "version": "0.2.16" + }, "anelhut": { "meta": "https://raw.githubusercontent.com/dan1-de/ioBroker.anelhut/main/io-package.json", "icon": "https://raw.githubusercontent.com/dan1-de/ioBroker.anelhut/main/admin/anelhut.png", @@ -117,16 +129,16 @@ "version": "1.0.15" }, "apcups": { - "meta": "https://raw.githubusercontent.com/xhunter74/ioBroker.apcups/master/io-package.json", - "icon": "https://raw.githubusercontent.com/xhunter74/ioBroker.apcups/master/admin/ups.png", + "meta": "https://raw.githubusercontent.com/XHunter74/ioBroker.apcups/master/io-package.json", + "icon": "https://raw.githubusercontent.com/XHunter74/ioBroker.apcups/master/admin/ups.png", "type": "hardware", - "version": "1.0.15" + "version": "4.0.0" }, - "apple-find-me": { - "meta": "https://raw.githubusercontent.com/PfisterDaniel/ioBroker.apple-find-me/master/io-package.json", - "icon": "https://raw.githubusercontent.com/PfisterDaniel/ioBroker.apple-find-me/master/admin/find-me.png", - "type": "geoposition", - "version": "0.0.14" + "apg-info": { + "meta": "https://raw.githubusercontent.com/HGlab01/ioBroker.apg-info/main/io-package.json", + "icon": "https://raw.githubusercontent.com/HGlab01/ioBroker.apg-info/main/admin/apg-info.png", + "type": "general", + "version": "0.1.9" }, "artnet": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.artnet/master/io-package.json", @@ -134,6 +146,12 @@ "type": "lighting", "version": "1.2.2" }, + "artnet-recorder": { + "meta": "https://raw.githubusercontent.com/Bannsaenger/ioBroker.artnet-recorder/master/io-package.json", + "icon": "https://raw.githubusercontent.com/Bannsaenger/ioBroker.artnet-recorder/master/admin/artnet-recorder.png", + "type": "lighting", + "version": "0.0.5" + }, "asterisk": { "meta": "https://raw.githubusercontent.com/schmupu/ioBroker.asterisk/master/io-package.json", "icon": "https://raw.githubusercontent.com/schmupu/ioBroker.asterisk/master/admin/asterisk.png", @@ -146,12 +164,24 @@ "type": "hardware", "version": "1.0.1" }, + "atlas-scientific-ezo-i2c": { + "meta": "https://raw.githubusercontent.com/Buzze11/ioBroker.atlas-scientific-ezo-i2c/master/io-package.json", + "icon": "https://raw.githubusercontent.com/Buzze11/ioBroker.atlas-scientific-ezo-i2c/master/admin/atlas-scientific-ezo-i2c.png", + "type": "hardware", + "version": "2.3.0" + }, "awattar": { "meta": "https://raw.githubusercontent.com/sirjojo69/ioBroker.awattar/master/io-package.json", "icon": "https://raw.githubusercontent.com/sirjojo69/ioBroker.awattar/master/admin/awattar.png", "type": "utility", "version": "1.0.6" }, + "awtrix-light": { + "meta": "https://raw.githubusercontent.com/klein0r/ioBroker.awtrix-light/master/io-package.json", + "icon": "https://raw.githubusercontent.com/klein0r/ioBroker.awtrix-light/master/admin/awtrix-light.png", + "type": "iot-systems", + "version": "1.3.0" + }, "b-control-em": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.b-control-em/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.b-control-em/master/admin/bcontrol.png", @@ -162,25 +192,25 @@ "meta": "https://raw.githubusercontent.com/simatec/ioBroker.backitup/master/io-package.json", "icon": "https://raw.githubusercontent.com/simatec/ioBroker.backitup/master/admin/backitup.png", "type": "general", - "version": "2.6.23" + "version": "3.0.22" }, "beckhoff": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.beckhoff/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.beckhoff/master/admin/beckhoff.png", "type": "hardware", - "version": "1.5.2" + "version": "1.6.0" }, "benchmark": { "meta": "https://raw.githubusercontent.com/foxriver76/ioBroker.benchmark/main/io-package.json", "icon": "https://raw.githubusercontent.com/foxriver76/ioBroker.benchmark/main/admin/benchmark.png", "type": "utility", - "version": "1.1.4" + "version": "1.3.0" }, "benq": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.benq/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.benq/master/admin/benq.png", "type": "multimedia", - "version": "0.2.5" + "version": "0.3.0" }, "bestway": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.bestway/master/io-package.json", @@ -192,25 +222,25 @@ "meta": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.bidirectional-counter/main/io-package.json", "icon": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.bidirectional-counter/main/admin/bidirectional-counter.png", "type": "misc-data", - "version": "2.1.0" + "version": "2.2.0" }, "birthdays": { "meta": "https://raw.githubusercontent.com/klein0r/ioBroker.birthdays/master/io-package.json", "icon": "https://raw.githubusercontent.com/klein0r/ioBroker.birthdays/master/admin/birthdays.png", "type": "date-and-time", - "version": "2.3.1" + "version": "3.0.1" }, "ble": { "meta": "https://raw.githubusercontent.com/AlCalzone/ioBroker.ble/master/io-package.json", "icon": "https://raw.githubusercontent.com/AlCalzone/ioBroker.ble/master/admin/ble.png", "type": "hardware", - "version": "0.13.4" + "version": "0.14.0" }, "blebox": { "meta": "https://raw.githubusercontent.com/ka-vaNu/ioBroker.blebox/master/io-package.json", "icon": "https://raw.githubusercontent.com/ka-vaNu/ioBroker.blebox/master/admin/blebox.png", "type": "iot-systems", - "version": "2.0.1" + "version": "2.1.0" }, "bluelink": { "meta": "https://raw.githubusercontent.com/Newan/ioBroker.bluelink/master/io-package.json", @@ -218,59 +248,53 @@ "type": "vehicle", "version": "2.3.6" }, - "bmw": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.bmw/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.bmw/master/admin/bmw.png", - "type": "vehicle", - "version": "2.5.7" - }, - "bosch-ebike": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.bosch-ebike/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.bosch-ebike/master/admin/bosch-ebike.png", - "type": "vehicle", - "version": "0.0.3" + "boschindego": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.boschindego/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.boschindego/main/admin/boschindego.png", + "type": "garden", + "version": "1.2.0" }, "bosesoundtouch": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.bosesoundtouch/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.bosesoundtouch/master/admin/bosesoundtouch.png", "type": "multimedia", - "version": "0.10.3" + "version": "0.11.1" }, "botslab360": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.botslab360/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.botslab360/master/admin/botslab360.png", + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.botslab360/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.botslab360/main/admin/botslab360.png", "type": "household", "version": "0.0.2" }, "botvac": { - "meta": "https://raw.githubusercontent.com/Pmant/ioBroker.botvac/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pmant/ioBroker.botvac/master/admin/botvac.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.botvac/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.botvac/master/admin/botvac.png", "type": "household", - "version": "1.0.0" + "version": "2.2.0" }, "bring": { "meta": "https://raw.githubusercontent.com/foxriver76/ioBroker.bring/master/io-package.json", "icon": "https://raw.githubusercontent.com/foxriver76/ioBroker.bring/master/admin/bring.png", "type": "household", - "version": "1.8.1" + "version": "1.8.4" }, "broadlink2": { - "meta": "https://raw.githubusercontent.com/frankjoke/ioBroker.broadlink2/master/io-package.json", - "icon": "https://raw.githubusercontent.com/frankjoke/ioBroker.broadlink2/master/admin/broadlink.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.broadlink2/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.broadlink2/master/admin/broadlink.png", "type": "iot-systems", - "version": "2.1.5" + "version": "2.3.0" }, "bsblan": { "meta": "https://raw.githubusercontent.com/hacki11/ioBroker.bsblan/master/io-package.json", "icon": "https://raw.githubusercontent.com/hacki11/ioBroker.bsblan/master/admin/bsblan.png", "type": "climate-control", - "version": "0.2.2" + "version": "0.3.4" }, "bshb": { "meta": "https://raw.githubusercontent.com/holomekc/ioBroker.bshb/master/io-package.json", "icon": "https://raw.githubusercontent.com/holomekc/ioBroker.bshb/master/admin/bshb-logo.jpg", "type": "iot-systems", - "version": "0.2.4" + "version": "0.2.8" }, "bwt": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.bwt/master/io-package.json", @@ -282,13 +306,19 @@ "meta": "https://raw.githubusercontent.com/arteck/ioBroker.bydbatt/master/io-package.json", "icon": "https://raw.githubusercontent.com/arteck/ioBroker.bydbatt/master/admin/byd-batterybox.png", "type": "household", - "version": "1.0.8" + "version": "1.1.0" }, "bydhvs": { "meta": "https://raw.githubusercontent.com/ChristianH17/ioBroker.bydhvs/master/io-package.json", "icon": "https://raw.githubusercontent.com/ChristianH17/ioBroker.bydhvs/master/admin/bydhvs.png", "type": "energy", - "version": "1.4.0" + "version": "1.5.0" + }, + "cameras": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.cameras/master/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.cameras/master/admin/cameras.png", + "type": "multimedia", + "version": "2.1.2" }, "canbus": { "meta": "https://raw.githubusercontent.com/crycode-de/ioBroker.canbus/master/io-package.json", @@ -300,37 +330,37 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.cec2/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.cec2/master/admin/cec2.png", "type": "multimedia", - "version": "0.1.0" + "version": "0.1.3" }, "chromecast": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.chromecast/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.chromecast/master/admin/chromecast.png", "type": "multimedia", - "version": "3.0.3" + "version": "3.4.1" }, "cleveron": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.cleveron/main/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.cleveron/main/admin/cleveron.png", "type": "climate-control", - "version": "0.0.5" + "version": "0.1.0" }, "cloud": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.cloud/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.cloud/master/admin/cloud.png", "type": "communication", - "version": "4.4.1" + "version": "5.0.1" }, "cloudflare": { "meta": "https://raw.githubusercontent.com/Marco15453/ioBroker.cloudflare/main/io-package.json", "icon": "https://raw.githubusercontent.com/Marco15453/ioBroker.cloudflare/main/admin/cloudflare.png", "type": "infrastructure", - "version": "1.1.1" + "version": "1.2.1" }, "comfoair": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.comfoair/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.comfoair/master/admin/comfoair.png", "type": "climate-control", - "version": "1.1.8" + "version": "1.2.2" }, "contactid": { "meta": "https://raw.githubusercontent.com/schmupu/ioBroker.contactid/master/io-package.json", @@ -342,13 +372,13 @@ "meta": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.coronavirus-statistics/main/io-package.json", "icon": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.coronavirus-statistics/main/admin/coronavirus-statistics.png", "type": "health", - "version": "0.8.7" + "version": "0.9.0" }, "countdown": { "meta": "https://raw.githubusercontent.com/jack-blackson/ioBroker.countdown/master/io-package.json", "icon": "https://raw.githubusercontent.com/jack-blackson/ioBroker.countdown/master/admin/countdown.png", "type": "misc-data", - "version": "2.0.1" + "version": "2.2.0" }, "cul": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.cul/master/io-package.json", @@ -366,37 +396,37 @@ "meta": "https://raw.githubusercontent.com/Apollon77/ioBroker.daikin-cloud/master/io-package.json", "icon": "https://raw.githubusercontent.com/Apollon77/ioBroker.daikin-cloud/master/admin/daikin-cloud.jpg", "type": "climate-control", - "version": "0.3.0" + "version": "0.4.8" }, "daswetter": { "meta": "https://raw.githubusercontent.com/rg-engineering/ioBroker.daswetter/master/io-package.json", "icon": "https://raw.githubusercontent.com/rg-engineering/ioBroker.daswetter/master/admin/daswettercom.png", "type": "weather", - "version": "3.1.10" + "version": "3.1.16" }, "deconz": { "meta": "https://raw.githubusercontent.com/Jey-Cee/ioBroker.deconz/master/io-package.json", "icon": "https://raw.githubusercontent.com/Jey-Cee/ioBroker.deconz/master/admin/deconz.png", "type": "hardware", - "version": "1.3.21" + "version": "1.4.1" }, "denon": { "meta": "https://raw.githubusercontent.com/foxriver76/ioBroker.denon/master/io-package.json", "icon": "https://raw.githubusercontent.com/foxriver76/ioBroker.denon/master/admin/denon.png", "type": "multimedia", - "version": "1.15.4" + "version": "1.15.12" }, "device-reminder": { "meta": "https://raw.githubusercontent.com/xenon-s/ioBroker.device-reminder/master/io-package.json", - "icon": "https://raw.githubusercontent.com/xenon-s/ioBroker.device-reminder/master/admin/icon.png", - "type": "energy", - "version": "1.2.9" + "icon": "https://raw.githubusercontent.com/xenon-s/ioBroker.device-reminder/master/admin/device-reminder.png", + "type": "logic", + "version": "3.1.2" }, "device-watcher": { - "meta": "https://raw.githubusercontent.com/ciddi89/ioBroker.device-watcher/main/io-package.json", - "icon": "https://raw.githubusercontent.com/ciddi89/ioBroker.device-watcher/main/admin/device-watcher.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.device-watcher/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.device-watcher/main/admin/device-watcher.png", "type": "misc-data", - "version": "2.9.3" + "version": "2.12.1" }, "devices": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.devices/master/io-package.json", @@ -408,7 +438,7 @@ "meta": "https://raw.githubusercontent.com/raschy/ioBroker.deyeidc/main/io-package.json", "icon": "https://raw.githubusercontent.com/raschy/ioBroker.deyeidc/main/admin/deyeidc.png", "type": "energy", - "version": "0.0.11" + "version": "0.1.0" }, "digitalstrom": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.digitalstrom/master/io-package.json", @@ -420,19 +450,19 @@ "meta": "https://raw.githubusercontent.com/crycode-de/ioBroker.discord/main/io-package.json", "icon": "https://raw.githubusercontent.com/crycode-de/ioBroker.discord/main/admin/discord.png", "type": "messaging", - "version": "1.1.6" + "version": "2.4.0" }, "discovergy": { "meta": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.discovergy/main/io-package.json", "icon": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.discovergy/main/admin/discovergy.png", "type": "energy", - "version": "0.5.8" + "version": "0.5.13" }, "discovery": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.discovery/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.discovery/master/admin/discovery.png", "type": "general", - "version": "3.1.0" + "version": "5.0.0" }, "divera247": { "meta": "https://raw.githubusercontent.com/TKnpl/ioBroker.divera247/master/io-package.json", @@ -444,25 +474,25 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.doorbird/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.doorbird/master/admin/doorbird.png", "type": "iot-systems", - "version": "1.2.3" + "version": "1.7.0" }, "doorio": { "meta": "https://raw.githubusercontent.com/Bettman66/ioBroker.doorio/master/io-package.json", "icon": "https://raw.githubusercontent.com/Bettman66/ioBroker.doorio/master/admin/doorio.png", "type": "communication", - "version": "2.1.4" + "version": "2.1.5" }, "drag-indicator": { "meta": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.drag-indicator/main/io-package.json", "icon": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.drag-indicator/main/admin/drag-indicator.png", "type": "misc-data", - "version": "2.1.0" + "version": "2.2.0" }, "ds18b20": { "meta": "https://raw.githubusercontent.com/crycode-de/ioBroker.ds18b20/master/io-package.json", "icon": "https://raw.githubusercontent.com/crycode-de/ioBroker.ds18b20/master/admin/ds18b20.png", "type": "hardware", - "version": "2.0.4" + "version": "2.0.5" }, "dwd": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.dwd/master/io-package.json", @@ -474,13 +504,19 @@ "meta": "https://raw.githubusercontent.com/Grizzelbee/ioBroker.dysonairpurifier/master/io-package.json", "icon": "https://raw.githubusercontent.com/Grizzelbee/ioBroker.dysonairpurifier/master/admin/dyson_logo.svg", "type": "climate-control", - "version": "2.5.9" + "version": "3.2.3" }, "e3dc-rscp": { "meta": "https://raw.githubusercontent.com/git-kick/ioBroker.e3dc-rscp/master/io-package.json", "icon": "https://raw.githubusercontent.com/git-kick/ioBroker.e3dc-rscp/master/admin/e3dc-rscp.png", "type": "energy", - "version": "1.2.3" + "version": "1.2.6" + }, + "e3oncan": { + "meta": "https://raw.githubusercontent.com/MyHomeMyData/ioBroker.e3oncan/main/io-package.json", + "icon": "https://raw.githubusercontent.com/MyHomeMyData/ioBroker.e3oncan/main/admin/e3oncan_small.png", + "type": "iot-systems", + "version": "0.9.4" }, "easee": { "meta": "https://raw.githubusercontent.com/Newan/ioBroker.easee/master/io-package.json", @@ -492,25 +528,25 @@ "meta": "https://raw.githubusercontent.com/rg-engineering/ioBroker.ebus/master/io-package.json", "icon": "https://raw.githubusercontent.com/rg-engineering/ioBroker.ebus/master/admin/ebus.png", "type": "hardware", - "version": "3.2.2" + "version": "3.3.6" }, "echarts": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.echarts/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.echarts/master/admin/echarts.png", "type": "visualization", - "version": "1.5.1" + "version": "1.9.2" }, "ecovacs-deebot": { "meta": "https://raw.githubusercontent.com/mrbungle64/ioBroker.ecovacs-deebot/master/io-package.json", "icon": "https://raw.githubusercontent.com/mrbungle64/ioBroker.ecovacs-deebot/master/admin/ecovacs-deebot.png", "type": "household", - "version": "1.4.13" + "version": "1.4.15" }, - "egigeozone": { - "meta": "https://raw.githubusercontent.com/BasGo/ioBroker.egigeozone/master/io-package.json", - "icon": "https://raw.githubusercontent.com/BasGo/ioBroker.egigeozone/master/admin/egigeozone.png", + "egigeozone2": { + "meta": "https://raw.githubusercontent.com/obakuhl/ioBroker.egigeozone2/master/io-package.json", + "icon": "https://raw.githubusercontent.com/obakuhl/ioBroker.egigeozone2/master/admin/egigeozone.png", "type": "geoposition", - "version": "0.1.2" + "version": "1.0.6" }, "ekey": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.ekey/master/io-package.json", @@ -524,23 +560,47 @@ "type": "iot-systems", "version": "0.5.2" }, + "elgato-key-light": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.elgato-key-light/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.elgato-key-light/main/admin/elgato-key-light.png", + "type": "lighting", + "version": "1.1.0" + }, "email": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.email/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.email/master/admin/email.png", "type": "messaging", - "version": "1.2.0" + "version": "1.3.1" }, "emby": { - "meta": "https://raw.githubusercontent.com/thewhobox/ioBroker.emby/master/io-package.json", - "icon": "https://raw.githubusercontent.com/thewhobox/ioBroker.emby/master/admin/emby.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.emby/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.emby/master/admin/emby.png", "type": "multimedia", - "version": "1.0.2" + "version": "1.2.0" + }, + "emporia": { + "meta": "https://raw.githubusercontent.com/Chris-656/ioBroker.emporia/main/io-package.json", + "icon": "https://raw.githubusercontent.com/Chris-656/ioBroker.emporia/main/admin/emporia.png", + "type": "energy", + "version": "0.0.12" }, "ems-esp": { "meta": "https://raw.githubusercontent.com/tp1de/ioBroker.ems-esp/main/io-package.json", "icon": "https://raw.githubusercontent.com/tp1de/ioBroker.ems-esp/main/admin/ems-esp.png", "type": "climate-control", - "version": "2.2.0" + "version": "4.8.0" + }, + "energiefluss": { + "meta": "https://raw.githubusercontent.com/SKB-CGN/ioBroker.energiefluss/main/io-package.json", + "icon": "https://raw.githubusercontent.com/SKB-CGN/ioBroker.energiefluss/main/admin/energiefluss.png", + "type": "visualization", + "version": "3.6.0" + }, + "energiefluss-erweitert": { + "meta": "https://raw.githubusercontent.com/SKB-CGN/ioBroker.energiefluss-erweitert/main/io-package.json", + "icon": "https://raw.githubusercontent.com/SKB-CGN/ioBroker.energiefluss-erweitert/main/admin/energiefluss-erweitert.png", + "type": "visualization", + "version": "0.4.1" }, "energymanager": { "meta": "https://raw.githubusercontent.com/unltdnetworx/ioBroker.energymanager/master/io-package.json", @@ -554,11 +614,17 @@ "type": "iot-systems", "version": "1.0.1" }, + "enigma2": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.enigma2/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.enigma2/master/admin/enigma2.png", + "type": "multimedia", + "version": "2.1.1" + }, "envertech-pv": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.envertech-pv/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.envertech-pv/master/admin/envertech-pv.png", "type": "energy", - "version": "1.0.2" + "version": "1.3.2" }, "epson_ecotank_et_2750": { "meta": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.epson_ecotank_et_2750/master/io-package.json", @@ -567,40 +633,46 @@ "version": "0.0.12" }, "epson_stylus_px830": { - "meta": "https://raw.githubusercontent.com/Pix---/ioBroker.epson_stylus_px830/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pix---/ioBroker.epson_stylus_px830/master/admin/epson_stylus_px830.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.epson_stylus_px830/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.epson_stylus_px830/master/admin/epson_stylus_px830.png", "type": "infrastructure", - "version": "0.2.1" + "version": "0.3.0" }, - "epson_xp540": { - "meta": "https://raw.githubusercontent.com/tikodu/ioBroker.epson_xp540/master/io-package.json", - "icon": "https://raw.githubusercontent.com/tikodu/ioBroker.epson_xp540/master/admin/epson_xp540.png", - "type": "infrastructure", - "version": "1.0.6" + "espresense": { + "meta": "https://raw.githubusercontent.com/ticaki/ioBroker.espresense/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ticaki/ioBroker.espresense/main/admin/espresense.png", + "type": "geoposition", + "version": "0.4.4" }, "eusec": { "meta": "https://raw.githubusercontent.com/bropat/ioBroker.eusec/master/io-package.json", "icon": "https://raw.githubusercontent.com/bropat/ioBroker.eusec/master/admin/eusec.png", "type": "alarm", - "version": "1.1.2" + "version": "1.2.1" }, "evcc": { "meta": "https://raw.githubusercontent.com/Newan/ioBroker.evcc/main/io-package.json", "icon": "https://raw.githubusercontent.com/Newan/ioBroker.evcc/main/admin/evcc.png", "type": "energy", - "version": "0.0.10" + "version": "0.1.1" }, "eventlist": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.eventlist/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.eventlist/master/admin/eventlist.png", "type": "visualization", - "version": "1.2.3" + "version": "2.0.1" }, "exchangerates": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.exchangerates/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.exchangerates/master/admin/exchangerates.png", "type": "misc-data", - "version": "0.0.14" + "version": "0.1.0" + }, + "extron": { + "meta": "https://raw.githubusercontent.com/Bannsaenger/ioBroker.extron/master/io-package.json", + "icon": "https://raw.githubusercontent.com/Bannsaenger/ioBroker.extron/master/admin/extron.png", + "type": "hardware", + "version": "0.2.15" }, "fahrplan": { "meta": "https://raw.githubusercontent.com/gaudes/ioBroker.fahrplan/master/io-package.json", @@ -612,25 +684,31 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fakeroku/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fakeroku/master/admin/fakeroku.png", "type": "multimedia", - "version": "0.2.2" + "version": "0.3.0" }, "fb-checkpresence": { "meta": "https://raw.githubusercontent.com/afuerhoff/ioBroker.fb-checkpresence/master/io-package.json", "icon": "https://raw.githubusercontent.com/afuerhoff/ioBroker.fb-checkpresence/master/admin/fb-checkpresence.png", "type": "infrastructure", - "version": "1.2.2" + "version": "1.2.4" }, "feiertage": { - "meta": "https://raw.githubusercontent.com/Pix---/ioBroker.feiertage/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pix---/ioBroker.feiertage/master/admin/feiertage.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.feiertage/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.feiertage/master/admin/feiertage.png", "type": "date-and-time", - "version": "1.1.0" + "version": "1.2.0" + }, + "fenecon": { + "meta": "https://raw.githubusercontent.com/sg-app/ioBroker.fenecon/main/io-package.json", + "icon": "https://raw.githubusercontent.com/sg-app/ioBroker.fenecon/main/admin/fenecon.png", + "type": "energy", + "version": "0.5.0" }, "fhem": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fhem/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fhem/master/admin/fhem.png", "type": "iot-systems", - "version": "2.0.5" + "version": "3.0.0" }, "fiat": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.fiat/master/io-package.json", @@ -642,13 +720,13 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.firetv/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.firetv/master/admin/firetv.png", "type": "multimedia", - "version": "1.0.0" + "version": "2.1.0" }, "fitbit-fitness": { "meta": "https://raw.githubusercontent.com/Chris-656/ioBroker.fitbit-fitness/main/io-package.json", "icon": "https://raw.githubusercontent.com/Chris-656/ioBroker.fitbit-fitness/main/admin/fitbit-fitness.png", "type": "health", - "version": "0.4.10" + "version": "0.5.0" }, "flot": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.flot/master/io-package.json", @@ -660,37 +738,37 @@ "meta": "https://raw.githubusercontent.com/HGlab01/ioBroker.followthesun/main/io-package.json", "icon": "https://raw.githubusercontent.com/HGlab01/ioBroker.followthesun/main/admin/followthesun.png", "type": "geoposition", - "version": "0.4.2" + "version": "0.5.1" }, "foobar2000": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.foobar2000/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.foobar2000/master/admin/foobar2000.png", "type": "multimedia", - "version": "2.0.4" + "version": "2.2.0" }, "ford": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.ford/master/io-package.json", "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.ford/master/admin/ford.png", "type": "vehicle", - "version": "0.0.14" + "version": "1.0.4" }, "frigate": { - "meta": "https://raw.githubusercontent.com/Bettman66/ioBroker.frigate/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Bettman66/ioBroker.frigate/master/admin/frigate.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.frigate/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.frigate/main/admin/frigate.png", "type": "alarm", - "version": "0.2.5" + "version": "1.2.0" }, "fritzbox": { - "meta": "https://raw.githubusercontent.com/ruhr70/ioBroker.fritzbox/master/io-package.json", - "icon": "https://raw.githubusercontent.com/ruhr70/ioBroker.fritzbox/master/admin/fritzbox.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fritzbox/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fritzbox/master/admin/fritzbox.png", "type": "infrastructure", - "version": "0.2.1" + "version": "0.6.0" }, "fritzdect": { "meta": "https://raw.githubusercontent.com/foxthefox/ioBroker.fritzdect/master/io-package.json", "icon": "https://raw.githubusercontent.com/foxthefox/ioBroker.fritzdect/master/admin/fritzdect_logo.png", "type": "hardware", - "version": "2.3.1" + "version": "2.5.11" }, "froeling": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.froeling/master/io-package.json", @@ -702,7 +780,7 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fronius/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fronius/master/admin/fronius.png", "type": "energy", - "version": "1.1.3" + "version": "2.1.1" }, "fronius-solarweb": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.fronius-solarweb/master/io-package.json", @@ -714,31 +792,31 @@ "meta": "https://raw.githubusercontent.com/tim2zg/ioBroker.fronius-wattpilot/main/io-package.json", "icon": "https://raw.githubusercontent.com/tim2zg/ioBroker.fronius-wattpilot/main/admin/fronius-wattpilot.png", "type": "vehicle", - "version": "4.6.2" + "version": "4.6.3" }, "frontier_silicon": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.frontier_silicon/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.frontier_silicon/master/admin/radio.png", "type": "multimedia", - "version": "0.0.11" + "version": "0.3.0" }, "fuelpricemonitor": { "meta": "https://raw.githubusercontent.com/HGlab01/ioBroker.fuelpricemonitor/main/io-package.json", "icon": "https://raw.githubusercontent.com/HGlab01/ioBroker.fuelpricemonitor/main/admin/fuelpricemonitor.png", "type": "vehicle", - "version": "0.3.6" + "version": "0.4.1" }, "fullcalendar": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.fullcalendar/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.fullcalendar/master/admin/fullcalendar.png", "type": "date-and-time", - "version": "1.2.0" + "version": "2.4.2" }, "fullybrowser": { "meta": "https://raw.githubusercontent.com/arteck/ioBroker.fullybrowser/master/io-package.json", "icon": "https://raw.githubusercontent.com/arteck/ioBroker.fullybrowser/master/admin/fully.png", "type": "utility", - "version": "2.1.2" + "version": "3.0.12" }, "g-homa": { "meta": "https://raw.githubusercontent.com/AlCalzone/ioBroker.g-homa/master/io-package.json", @@ -747,8 +825,8 @@ "version": "0.5.3" }, "garmin": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.garmin/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.garmin/master/admin/garmin.png", + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.garmin/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.garmin/main/admin/garmin.png", "type": "health", "version": "0.0.3" }, @@ -758,35 +836,53 @@ "type": "geoposition", "version": "1.2.4" }, - "gigaset-elements": { - "meta": "https://raw.githubusercontent.com/matthsc/ioBroker.gigaset-elements/main/io-package.json", - "icon": "https://raw.githubusercontent.com/matthsc/ioBroker.gigaset-elements/main/admin/gigaset-elements.png", - "type": "alarm", - "version": "0.3.0" + "gira-iot": { + "meta": "https://raw.githubusercontent.com/klein0r/ioBroker.gira-iot/master/io-package.json", + "icon": "https://raw.githubusercontent.com/klein0r/ioBroker.gira-iot/master/admin/gira-iot.png", + "type": "iot-systems", + "version": "0.5.0" }, "go-e": { - "meta": "https://raw.githubusercontent.com/MK-2001/ioBroker.go-e/master/io-package.json", - "icon": "https://raw.githubusercontent.com/MK-2001/ioBroker.go-e/master/admin/go-echarger.png", + "meta": "https://raw.githubusercontent.com/MK-2001/ioBroker.go-e/main/io-package.json", + "icon": "https://raw.githubusercontent.com/MK-2001/ioBroker.go-e/main/admin/go-echarger.png", "type": "vehicle", - "version": "1.0.27" + "version": "1.0.29" + }, + "gotify-ws": { + "meta": "https://raw.githubusercontent.com/simatec/ioBroker.gotify-ws/master/io-package.json", + "icon": "https://raw.githubusercontent.com/simatec/ioBroker.gotify-ws/master/admin/gotify-ws.png", + "type": "messaging", + "version": "0.1.5" + }, + "govee-local": { + "meta": "https://raw.githubusercontent.com/boergegrunicke/ioBroker.govee-local/main/io-package.json", + "icon": "https://raw.githubusercontent.com/boergegrunicke/ioBroker.govee-local/main/admin/govee-local.png", + "type": "lighting", + "version": "0.2.7" + }, + "gree-hvac": { + "meta": "https://raw.githubusercontent.com/XHunter74/ioBroker.gree-hvac/master/io-package.json", + "icon": "https://raw.githubusercontent.com/XHunter74/ioBroker.gree-hvac/master/admin/air-conditioner.png", + "type": "climate-control", + "version": "1.1.0" }, "growatt": { "meta": "https://raw.githubusercontent.com/PLCHome/ioBroker.growatt/master/io-package.json", "icon": "https://raw.githubusercontent.com/PLCHome/ioBroker.growatt/master/admin/growatt.png", "type": "energy", - "version": "3.1.2" + "version": "3.2.5" }, "gruenbeck": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.gruenbeck/master/io-package.json", "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.gruenbeck/master/admin/gruenbeck.png", "type": "household", - "version": "0.0.42" + "version": "0.0.43" }, "gsmsms": { "meta": "https://raw.githubusercontent.com/forelleblau/ioBroker.gsmsms/main/io-package.json", "icon": "https://raw.githubusercontent.com/forelleblau/ioBroker.gsmsms/main/admin/gsmsms.png", "type": "messaging", - "version": "0.0.4" + "version": "0.0.6" }, "haassohn": { "meta": "https://raw.githubusercontent.com/marvingrieger/ioBroker.haassohn/master/io-package.json", @@ -804,7 +900,7 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.haier/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.haier/master/admin/haier.png", "type": "climate-control", - "version": "1.0.4" + "version": "1.1.0" }, "ham": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.ham/master/io-package.json", @@ -819,10 +915,10 @@ "version": "3.0.2" }, "harmony": { - "meta": "https://raw.githubusercontent.com/Pmant/ioBroker.harmony/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pmant/ioBroker.harmony/master/admin/harmony.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.harmony/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.harmony/master/admin/harmony.png", "type": "multimedia", - "version": "1.2.2" + "version": "1.5.0" }, "hass": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.hass/master/io-package.json", @@ -834,13 +930,13 @@ "meta": "https://raw.githubusercontent.com/hausbus/ioBroker.hausbus_de/main/io-package.json", "icon": "https://raw.githubusercontent.com/hausbus/ioBroker.hausbus_de/main/admin/hausbusde.png", "type": "iot-systems", - "version": "1.2.11" + "version": "1.4.6" }, "heatingcontrol": { "meta": "https://raw.githubusercontent.com/rg-engineering/ioBroker.heatingcontrol/master/io-package.json", "icon": "https://raw.githubusercontent.com/rg-engineering/ioBroker.heatingcontrol/master/admin/heatingcontrol.png", "type": "climate-control", - "version": "2.11.1" + "version": "2.12.10" }, "heizoel": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.heizoel/master/io-package.json", @@ -848,6 +944,18 @@ "type": "misc-data", "version": "1.0.3" }, + "heizoel24-mex": { + "meta": "https://raw.githubusercontent.com/ltspicer/ioBroker.heizoel24-mex/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ltspicer/ioBroker.heizoel24-mex/main/admin/heizoel24-mex.png", + "type": "metering", + "version": "1.3.5" + }, + "heizungssteuerung": { + "meta": "https://raw.githubusercontent.com/jbeenenga/ioBroker.heizungssteuerung/main/io-package.json", + "icon": "https://raw.githubusercontent.com/jbeenenga/ioBroker.heizungssteuerung/main/admin/heizungssteuerung.png", + "type": "climate-control", + "version": "1.7.0" + }, "hekr": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.hekr/master/io-package.json", "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.hekr/master/admin/hekr.png", @@ -858,13 +966,13 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.helios/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.helios/master/admin/helios.png", "type": "climate-control", - "version": "0.0.3" + "version": "0.1.0" }, "heos": { "meta": "https://raw.githubusercontent.com/withstu/ioBroker.heos/main/io-package.json", "icon": "https://raw.githubusercontent.com/withstu/ioBroker.heos/main/admin/heos.png", "type": "multimedia", - "version": "2.1.0" + "version": "2.2.1" }, "heytech": { "meta": "https://raw.githubusercontent.com/Jey-Cee/ioBroker.heytech/master/io-package.json", @@ -876,7 +984,7 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hid-community/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hid-community/master/admin/hid.png", "type": "utility", - "version": "0.3.0" + "version": "0.4.0" }, "hikvision-alarmserver": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hikvision-alarmserver/main/io-package.json", @@ -884,35 +992,41 @@ "type": "alarm", "version": "0.1.0" }, + "hiob": { + "meta": "https://raw.githubusercontent.com/moba15/ioBroker.hiob/main/io-package.json", + "icon": "https://raw.githubusercontent.com/moba15/ioBroker.hiob/main/admin/hiob.png", + "type": "visualization", + "version": "0.1.6" + }, "history": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.history/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.history/master/admin/history.png", "type": "storage", - "version": "2.2.6" + "version": "3.0.1" }, "hm-rega": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.hm-rega/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.hm-rega/master/admin/homematic.png", "type": "iot-systems", - "version": "3.0.47" + "version": "5.0.0" }, "hm-rpc": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.hm-rpc/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.hm-rpc/master/admin/homematic.png", "type": "iot-systems", - "version": "1.15.19" + "version": "1.17.0" }, "hmip": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hmip/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hmip/master/admin/homematic.png", "type": "hardware", - "version": "1.20.0" + "version": "1.23.3" }, "homeconnect": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.homeconnect/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.homeconnect/master/admin/homeconnect.png", "type": "household", - "version": "1.1.1" + "version": "1.4.1" }, "homee": { "meta": "https://raw.githubusercontent.com/Apollon77/ioBroker.homee/master/io-package.json", @@ -924,7 +1038,7 @@ "meta": "https://raw.githubusercontent.com/Apollon77/ioBroker.homekit-controller/main/io-package.json", "icon": "https://raw.githubusercontent.com/Apollon77/ioBroker.homekit-controller/main/admin/homekit-controller.png", "type": "iot-systems", - "version": "0.5.8" + "version": "0.5.10" }, "homenet": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.homenet/master/io-package.json", @@ -936,11 +1050,11 @@ "meta": "https://raw.githubusercontent.com/Pix---/ioBroker.homepilot/master/io-package.json", "icon": "https://raw.githubusercontent.com/Pix---/ioBroker.homepilot/master/admin/homepilot.png", "type": "iot-systems", - "version": "1.1.6" + "version": "1.2.3" }, "hoover": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.hoover/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.hoover/master/admin/hoover.png", + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.hoover/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.hoover/main/admin/hoover.png", "type": "household", "version": "0.0.7" }, @@ -954,25 +1068,25 @@ "meta": "https://raw.githubusercontent.com/arteck/ioBroker.hs100/master/io-package.json", "icon": "https://raw.githubusercontent.com/arteck/ioBroker.hs100/master/admin/hs100.png", "type": "hardware", - "version": "2.1.2" + "version": "2.2.0" }, "hue": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hue/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hue/master/admin/hue.jpeg", "type": "lighting", - "version": "3.9.5" - }, - "hue-extended": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hue-extended/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hue-extended/master/admin/hue-extended.png", - "type": "lighting", - "version": "2.0.0" + "version": "3.12.0" }, "huum-sauna": { "meta": "https://raw.githubusercontent.com/Chris-656/ioBroker.huum-sauna/main/io-package.json", "icon": "https://raw.githubusercontent.com/Chris-656/ioBroker.huum-sauna/main/admin/huum-sauna.png", "type": "climate-control", - "version": "0.4.4" + "version": "0.4.5" + }, + "hydrawise": { + "meta": "https://raw.githubusercontent.com/SentiQ/ioBroker.hydrawise/main/io-package.json", + "icon": "https://raw.githubusercontent.com/SentiQ/ioBroker.hydrawise/main/admin/hydrawise.jpg", + "type": "garden", + "version": "1.0.0" }, "i2c": { "meta": "https://raw.githubusercontent.com/UncleSamSwiss/ioBroker.i2c/master/io-package.json", @@ -984,7 +1098,7 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.ical/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.ical/master/admin/ical.png", "type": "date-and-time", - "version": "1.13.3" + "version": "1.15.0" }, "iceroad": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.iceroad/main/io-package.json", @@ -1004,12 +1118,24 @@ "type": "visualization-icons", "version": "0.1.0" }, + "icons-eclipse-smarthome-classic": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-eclipse-smarthome-classic/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-eclipse-smarthome-classic/main/admin/icons-eclipse-smarthome-classic.png", + "type": "visualization-icons", + "version": "1.0.0" + }, "icons-fatcow-hosting": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-fatcow-hosting/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-fatcow-hosting/master/admin/icons-fatcow-hosting.png", "type": "visualization-icons", "version": "0.1.0" }, + "icons-freepic": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-freepic/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-freepic/main/admin/icons-freepic.png", + "type": "visualization-icons", + "version": "1.0.0" + }, "icons-icons8": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-icons8/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-icons8/master/admin/icons8.png", @@ -1032,13 +1158,13 @@ "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-mfd-png/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-mfd-png/master/admin/icons-mfd-png.png", "type": "visualization-icons", - "version": "1.1.0" + "version": "1.2.1" }, "icons-mfd-svg": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-mfd-svg/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-mfd-svg/master/admin/icons-mfd-svg.png", "type": "visualization-icons", - "version": "1.1.0" + "version": "1.2.0" }, "icons-open-icon-library-png": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-open-icon-library-png/master/io-package.json", @@ -1046,6 +1172,12 @@ "type": "visualization-icons", "version": "0.1.2" }, + "icons-smarthome": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-smarthome/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-smarthome/main/admin/icons-smarthome.png", + "type": "visualization-icons", + "version": "1.0.0" + }, "icons-ultimate-png": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-ultimate-png/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-ultimate-png/master/admin/icons-ultimate-png.png", @@ -1058,23 +1190,17 @@ "type": "household", "version": "1.0.1" }, - "imow": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.imow/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.imow/master/admin/imow.png", - "type": "garden", - "version": "0.0.2" + "imap": { + "meta": "https://raw.githubusercontent.com/Lucky-ESA/ioBroker.imap/master/io-package.json", + "icon": "https://raw.githubusercontent.com/Lucky-ESA/ioBroker.imap/master/admin/imap.png", + "type": "messaging", + "version": "0.2.0" }, "influxdb": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.influxdb/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.influxdb/master/admin/influxdb.png", "type": "storage", - "version": "3.2.0" - }, - "info": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.info/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.info/master/admin/info.png", - "type": "misc-data", - "version": "1.9.26" + "version": "4.0.2" }, "innogy-smarthome": { "meta": "https://raw.githubusercontent.com/PArns/ioBroker.innogy-smarthome/master/io-package.json", @@ -1086,19 +1212,25 @@ "meta": "https://raw.githubusercontent.com/matthsc/ioBroker.innoxel/main/io-package.json", "icon": "https://raw.githubusercontent.com/matthsc/ioBroker.innoxel/main/admin/innoxel.png", "type": "iot-systems", - "version": "0.3.1" + "version": "0.4.2" }, "intex": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.intex/master/io-package.json", "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.intex/master/admin/intex.png", "type": "household", - "version": "0.1.0" + "version": "0.1.7" + }, + "iopooleco": { + "meta": "https://raw.githubusercontent.com/mule1972/ioBroker.iopooleco/main/io-package.json", + "icon": "https://raw.githubusercontent.com/mule1972/ioBroker.iopooleco/main/admin/iopooleco.png", + "type": "metering", + "version": "0.5.1" }, "iot": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.iot/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.iot/master/admin/iot.png", "type": "communication", - "version": "1.14.5" + "version": "3.3.0" }, "iqontrol": { "meta": "https://raw.githubusercontent.com/sbormann/ioBroker.iqontrol/master/io-package.json", @@ -1110,60 +1242,67 @@ "meta": "https://raw.githubusercontent.com/iwg-vpn/ioBroker.iwg-vpn/main/io-package.json", "icon": "https://raw.githubusercontent.com/iwg-vpn/ioBroker.iwg-vpn/main/admin/iwg-vpn.png", "type": "communication", - "version": "1.0.1" + "version": "3.0.0" + }, + "jablotron": { + "meta": "https://raw.githubusercontent.com/DEV2DEV-DE/ioBroker.jablotron/main/io-package.json", + "icon": "https://raw.githubusercontent.com/DEV2DEV-DE/ioBroker.jablotron/main/admin/jablotron.png", + "type": "alarm", + "version": "0.1.3" }, "janitza-gridvis": { "meta": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.janitza-gridvis/main/io-package.json", "icon": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.janitza-gridvis/main/admin/janitza-gridvis.png", "type": "energy", - "version": "3.1.2" + "version": "3.3.0" }, "jarvis": { "meta": "https://raw.githubusercontent.com/Zefau/ioBroker.jarvis/master/io-package.json", "icon": "https://raw.githubusercontent.com/Zefau/ioBroker.jarvis/master/admin/jarvis.png", "type": "visualization", - "version": "3.1.2" + "version": "3.1.8" }, "javascript": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.javascript/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.javascript/master/admin/javascript.png", "type": "logic", - "version": "7.0.3" + "version": "8.7.6" }, "jeelink": { "meta": "https://raw.githubusercontent.com/foxthefox/ioBroker.jeelink/master/io-package.json", "icon": "https://raw.githubusercontent.com/foxthefox/ioBroker.jeelink/master/admin/jeelab_logo.png", "type": "hardware", - "version": "0.1.4" + "version": "1.2.5" }, "js-controller": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.js-controller/master/packages/controller/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.js-controller/master/iobroker.png", "type": "general", - "version": "4.0.24" + "version": "6.0.11" }, "judoisoft": { "meta": "https://raw.githubusercontent.com/arteck/ioBroker.judoisoft/master/io-package.json", "icon": "https://raw.githubusercontent.com/arteck/ioBroker.judoisoft/master/admin/judo.png", "type": "household", - "version": "1.0.15" + "version": "1.1.0" }, "kecontact": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.kecontact/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.kecontact/master/admin/kecontact.png", "type": "hardware", - "version": "2.0.1" + "version": "2.2.0" + }, + "kisshome-research": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.kisshome-research/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.kisshome-research/main/admin/kisshome-research.png", + "type": "utility", + "version": "1.0.7" }, "klf200": { "meta": "https://raw.githubusercontent.com/MiSchroe/ioBroker.klf200/master/io-package.json", "icon": "https://raw.githubusercontent.com/MiSchroe/ioBroker.klf200/master/admin/klf200.png", "type": "hardware", - "version": "1.0.1" - }, - "km200": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.km200/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.km200/master/admin/km200.png", - "type": "climate-control", - "version": "2.0.3" + "version": "1.2.0" }, "knmi-weather": { "meta": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.knmi-weather/main/io-package.json", @@ -1175,37 +1314,31 @@ "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.knx/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.knx/master/admin/knx.png", "type": "iot-systems", - "version": "2.0.17" + "version": "2.0.28" }, "kodi": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.kodi/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.kodi/master/admin/kodi.png", "type": "multimedia", - "version": "2.0.9" + "version": "3.1.0" }, "kostal-piko-ba": { "meta": "https://raw.githubusercontent.com/hombach/ioBroker.kostal-piko-ba/master/io-package.json", "icon": "https://raw.githubusercontent.com/hombach/ioBroker.kostal-piko-ba/master/admin/picoba.png", "type": "energy", - "version": "3.0.6" + "version": "4.2.0" }, "lametric": { "meta": "https://raw.githubusercontent.com/klein0r/ioBroker.lametric/master/io-package.json", "icon": "https://raw.githubusercontent.com/klein0r/ioBroker.lametric/master/admin/lametric.png", "type": "hardware", - "version": "2.4.1" - }, - "landroid": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.landroid/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.landroid/master/admin/landroid.png", - "type": "garden", - "version": "1.0.3" + "version": "3.3.0" }, "lcn": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.lcn/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.lcn/master/admin/lcn.png", "type": "iot-systems", - "version": "1.1.1" + "version": "2.0.1" }, "legrand-ecocompteur": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.legrand-ecocompteur/master/io-package.json", @@ -1223,25 +1356,25 @@ "meta": "https://raw.githubusercontent.com/Morluktom/ioBroker.lg-ess-home/master/io-package.json", "icon": "https://raw.githubusercontent.com/Morluktom/ioBroker.lg-ess-home/master/admin/lg-ess-home.png", "type": "energy", - "version": "0.2.3" + "version": "0.3.0" }, "lg-thinq": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.lg-thinq/master/io-package.json", "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.lg-thinq/master/admin/lg-thinq.png", "type": "household", - "version": "0.1.4" + "version": "1.0.1" }, "lgtv": { - "meta": "https://raw.githubusercontent.com/SebastianSchultz/ioBroker.lgtv/master/io-package.json", - "icon": "https://raw.githubusercontent.com/SebastianSchultz/ioBroker.lgtv/master/admin/lgtv.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.lgtv/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.lgtv/master/admin/lgtv.png", "type": "multimedia", - "version": "1.1.12" + "version": "2.2.0" }, "lgtv-rs": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.lgtv-rs/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.lgtv-rs/master/admin/lg.png", "type": "multimedia", - "version": "0.1.1" + "version": "0.2.0" }, "lgtv11": { "meta": "https://raw.githubusercontent.com/SebastianSchultz/ioBroker.lgtv11/master/io-package.json", @@ -1249,23 +1382,17 @@ "type": "multimedia", "version": "1.0.5" }, - "libre": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.libre/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.libre/master/admin/libre.png", - "type": "health", - "version": "0.0.4" - }, "lifx": { "meta": "https://raw.githubusercontent.com/foxthefox/ioBroker.lifx/master/io-package.json", "icon": "https://raw.githubusercontent.com/foxthefox/ioBroker.lifx/master/admin/lifx_logo.png", "type": "lighting", - "version": "1.0.1" + "version": "1.0.7" }, "lightcontrol": { "meta": "https://raw.githubusercontent.com/Schmakus/ioBroker.lightcontrol/main/io-package.json", "icon": "https://raw.githubusercontent.com/Schmakus/ioBroker.lightcontrol/main/admin/lightcontrol.png", "type": "lighting", - "version": "0.3.0" + "version": "0.8.0" }, "lightify": { "meta": "https://raw.githubusercontent.com/soef/ioBroker.lightify/master/io-package.json", @@ -1307,7 +1434,7 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.logparser/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.logparser/master/admin/logparser.png", "type": "logic", - "version": "2.2.0" + "version": "2.2.2" }, "loqed": { "meta": "https://raw.githubusercontent.com/foxriver76/ioBroker.loqed/main/io-package.json", @@ -1315,17 +1442,23 @@ "type": "hardware", "version": "0.3.1" }, + "lorawan": { + "meta": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.lorawan/main/io-package.json", + "icon": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.lorawan/main/admin/lorawan.png", + "type": "protocols", + "version": "1.3.1" + }, "lovelace": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.lovelace/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.lovelace/master/admin/lovelace.png", "type": "visualization", - "version": "3.0.1" + "version": "4.1.10" }, "lowpass-filter": { "meta": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.lowpass-filter/main/io-package.json", "icon": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.lowpass-filter/main/admin/lowpass-filter.png", "type": "misc-data", - "version": "2.2.1" + "version": "2.3.0" }, "loxone": { "meta": "https://raw.githubusercontent.com/UncleSamSwiss/ioBroker.loxone/master/io-package.json", @@ -1337,7 +1470,7 @@ "meta": "https://raw.githubusercontent.com/klein0r/ioBroker.luftdaten/master/io-package.json", "icon": "https://raw.githubusercontent.com/klein0r/ioBroker.luftdaten/master/admin/luftdaten.png", "type": "weather", - "version": "3.0.0" + "version": "4.0.0" }, "lupusec": { "meta": "https://raw.githubusercontent.com/schmupu/ioBroker.lupusec/master/io-package.json", @@ -1349,7 +1482,7 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.luxtronik1/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.luxtronik1/master/admin/luxtronik1.png", "type": "climate-control", - "version": "0.3.5" + "version": "0.4.1" }, "material": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.material/master/io-package.json", @@ -1385,25 +1518,25 @@ "meta": "https://raw.githubusercontent.com/Apollon77/ioBroker.mbus/master/io-package.json", "icon": "https://raw.githubusercontent.com/Apollon77/ioBroker.mbus/master/admin/mbus.png", "type": "energy", - "version": "2.4.0" + "version": "2.7.0" }, "mclighting": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mclighting/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mclighting/master/admin/mclighting.png", "type": "lighting", - "version": "0.1.2" + "version": "0.2.0" }, "meater": { "meta": "https://raw.githubusercontent.com/Standarduser/ioBroker.meater/main/io-package.json", "icon": "https://raw.githubusercontent.com/Standarduser/ioBroker.meater/main/admin/meater.png", "type": "household", - "version": "1.0.0" + "version": "1.1.1" }, "mediola-gateway": { "meta": "https://raw.githubusercontent.com/oelison/ioBroker.mediola-gateway/main/io-package.json", "icon": "https://raw.githubusercontent.com/oelison/ioBroker.mediola-gateway/main/admin/mediola-gateway.png", "type": "multimedia", - "version": "1.0.1" + "version": "1.1.0" }, "megad": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.megad/master/io-package.json", @@ -1427,31 +1560,25 @@ "meta": "https://raw.githubusercontent.com/Black-Thunder/ioBroker.melcloud/master/io-package.json", "icon": "https://raw.githubusercontent.com/Black-Thunder/ioBroker.melcloud/master/admin/melcloud.png", "type": "climate-control", - "version": "1.3.5" - }, - "mercedesme": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.mercedesme/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.mercedesme/master/admin/mercedesme.png", - "type": "vehicle", - "version": "0.1.1" + "version": "2.0.2" }, "mercury": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mercury/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mercury/master/admin/mercury.png", "type": "energy", - "version": "0.1.6" + "version": "0.2.1" }, "meross": { "meta": "https://raw.githubusercontent.com/Apollon77/ioBroker.meross/master/io-package.json", "icon": "https://raw.githubusercontent.com/Apollon77/ioBroker.meross/master/admin/meross.png", "type": "iot-systems", - "version": "1.15.1" + "version": "1.17.0" }, "meteoalarm": { "meta": "https://raw.githubusercontent.com/jack-blackson/ioBroker.meteoalarm/master/io-package.json", "icon": "https://raw.githubusercontent.com/jack-blackson/ioBroker.meteoalarm/master/admin/meteoalarm.png", "type": "weather", - "version": "2.3.6" + "version": "3.0.3" }, "micronova": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.micronova/master/io-package.json", @@ -1475,7 +1602,7 @@ "meta": "https://raw.githubusercontent.com/Grizzelbee/ioBroker.mielecloudservice/master/io-package.json", "icon": "https://raw.githubusercontent.com/Grizzelbee/ioBroker.mielecloudservice/master/admin/mielecloudservice.svg", "type": "household", - "version": "6.5.4" + "version": "6.5.6" }, "mihome": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.mihome/master/io-package.json", @@ -1484,8 +1611,8 @@ "version": "1.4.0" }, "mihome-cloud": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.mihome-cloud/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.mihome-cloud/master/admin/mihome-cloud.png", + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.mihome-cloud/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.mihome-cloud/main/admin/mihome-cloud.png", "type": "iot-systems", "version": "0.1.0" }, @@ -1499,25 +1626,25 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mihome-plug/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mihome-plug/master/admin/mihome-plug.png", "type": "hardware", - "version": "0.2.1" + "version": "0.4.0" }, "mihome-vacuum": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mihome-vacuum/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mihome-vacuum/master/admin/mihome-vacuum.png", "type": "household", - "version": "3.11.0" + "version": "4.2.0" }, "mikrotik": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mikrotik/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mikrotik/master/admin/mikrotik.png", "type": "hardware", - "version": "1.1.1" + "version": "1.2.1" }, "milight": { "meta": "https://raw.githubusercontent.com/foxthefox/ioBroker.milight/master/io-package.json", "icon": "https://raw.githubusercontent.com/foxthefox/ioBroker.milight/master/admin/easybulb_logo.png", "type": "lighting", - "version": "0.3.6" + "version": "0.4.0" }, "milight-smart-light": { "meta": "https://raw.githubusercontent.com/Steiger04/ioBroker.milight-smart-light/master/io-package.json", @@ -1529,7 +1656,7 @@ "meta": "https://raw.githubusercontent.com/minukodu/ioBroker.minuvis/master/io-package.json", "icon": "https://raw.githubusercontent.com/minukodu/ioBroker.minuvis/master/admin/minuvis.png", "type": "visualization", - "version": "2.2.0" + "version": "2.3.3" }, "mobile": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.mobile/master/io-package.json", @@ -1541,7 +1668,7 @@ "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.modbus/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.modbus/master/admin/modbus.png", "type": "protocols", - "version": "5.0.11" + "version": "6.2.3" }, "moma": { "meta": "https://raw.githubusercontent.com/AWhiteKnight/ioBroker.moma/master/io-package.json", @@ -1553,31 +1680,31 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mpd/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mpd/master/admin/mpd.png", "type": "multimedia", - "version": "1.1.1" + "version": "2.1.0" }, "mqtt": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.mqtt/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.mqtt/master/admin/mqtt.png", "type": "protocols", - "version": "4.1.1" + "version": "5.2.0" }, "mqtt-client": { - "meta": "https://raw.githubusercontent.com/Pmant/ioBroker.mqtt-client/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pmant/ioBroker.mqtt-client/master/admin/mqtt-client.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mqtt-client/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mqtt-client/master/admin/mqtt-client.png", "type": "protocols", - "version": "1.6.3" + "version": "2.0.0" }, "musiccast": { "meta": "https://raw.githubusercontent.com/foxthefox/ioBroker.musiccast/master/io-package.json", "icon": "https://raw.githubusercontent.com/foxthefox/ioBroker.musiccast/master/admin/musiccast.png", "type": "multimedia", - "version": "1.1.0" + "version": "1.1.4" }, "mydlink": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mydlink/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mydlink/master/admin/mydlink.png", "type": "iot-systems", - "version": "1.3.4" + "version": "1.3.6" }, "myenergi": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.myenergi/master/io-package.json", @@ -1591,17 +1718,17 @@ "type": "iot-systems", "version": "3.0.0" }, - "mystrom": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.mystrom/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.mystrom/master/admin/mystrom.png", - "type": "iot-systems", - "version": "0.0.14" + "myuplink": { + "meta": "https://raw.githubusercontent.com/sebilm/ioBroker.myuplink/main/io-package.json", + "icon": "https://raw.githubusercontent.com/sebilm/ioBroker.myuplink/main/admin/myuplink.png", + "type": "climate-control", + "version": "0.8.1" }, "myvbus": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.myvbus/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.myvbus/master/admin/myvbus.png", "type": "climate-control", - "version": "0.2.5" + "version": "0.4.0" }, "nanoleaf-lightpanels": { "meta": "https://raw.githubusercontent.com/daniel-2k/ioBroker.nanoleaf-lightpanels/master/io-package.json", @@ -1613,7 +1740,7 @@ "meta": "https://raw.githubusercontent.com/Jey-Cee/ioBroker.net-tools/master/io-package.json", "icon": "https://raw.githubusercontent.com/Jey-Cee/ioBroker.net-tools/master/admin/net-tools.png", "type": "network", - "version": "0.2.0" + "version": "1.0.11" }, "netatmo": { "meta": "https://raw.githubusercontent.com/PArns/ioBroker.netatmo/master/io-package.json", @@ -1631,13 +1758,13 @@ "meta": "https://raw.githubusercontent.com/Homemade-Disaster/ioBroker.netatmo-energy/master/io-package.json", "icon": "https://raw.githubusercontent.com/Homemade-Disaster/ioBroker.netatmo-energy/master/admin/netatmo-energy.png", "type": "climate-control", - "version": "2.6.1" + "version": "2.7.3" }, "nibeuplink": { "meta": "https://raw.githubusercontent.com/sebilm/ioBroker.nibeuplink/master/io-package.json", "icon": "https://raw.githubusercontent.com/sebilm/ioBroker.nibeuplink/master/admin/nibeuplink.png", "type": "climate-control", - "version": "1.2.2" + "version": "1.3.1" }, "nina": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.nina/master/io-package.json", @@ -1649,7 +1776,7 @@ "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.nissan/master/io-package.json", "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.nissan/master/admin/nissan.png", "type": "vehicle", - "version": "0.0.12" + "version": "0.1.4" }, "niu": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.niu/master/io-package.json", @@ -1661,31 +1788,31 @@ "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.node-red/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.node-red/master/admin/node-red.png", "type": "logic", - "version": "4.0.3" + "version": "5.2.1" }, "notification-manager": { "meta": "https://raw.githubusercontent.com/foxriver76/ioBroker.notification-manager/main/io-package.json", "icon": "https://raw.githubusercontent.com/foxriver76/ioBroker.notification-manager/main/admin/notification-manager.png", "type": "utility", - "version": "0.1.1" + "version": "1.1.2" }, "nsclient": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.nsclient/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.nsclient/master/admin/nsclient.png", + "meta": "https://raw.githubusercontent.com/mcm4iob/ioBroker.nsclient/master/io-package.json", + "icon": "https://raw.githubusercontent.com/mcm4iob/ioBroker.nsclient/master/admin/nsclient.png", "type": "infrastructure", - "version": "0.1.2" + "version": "0.2.3" }, "nuki": { "meta": "https://raw.githubusercontent.com/smaragdschlange/ioBroker.nuki/master/io-package.json", "icon": "https://raw.githubusercontent.com/smaragdschlange/ioBroker.nuki/master/admin/nuki-logo.png", "type": "hardware", - "version": "1.6.0" + "version": "2.0.0" }, "nuki-extended": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.nuki-extended/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.nuki-extended/master/admin/nuki-extended.png", "type": "hardware", - "version": "2.6.5" + "version": "2.7.0" }, "nut": { "meta": "https://raw.githubusercontent.com/Apollon77/ioBroker.nut/master/io-package.json", @@ -1703,31 +1830,31 @@ "meta": "https://raw.githubusercontent.com/klein0r/ioBroker.octoprint/master/io-package.json", "icon": "https://raw.githubusercontent.com/klein0r/ioBroker.octoprint/master/admin/octoprint.png", "type": "hardware", - "version": "4.0.0" + "version": "5.1.0" }, "odl": { "meta": "https://raw.githubusercontent.com/crycode-de/ioBroker.odl/master/io-package.json", "icon": "https://raw.githubusercontent.com/crycode-de/ioBroker.odl/master/admin/odl.png", "type": "misc-data", - "version": "2.0.5" + "version": "3.0.1" }, "oekofen-json": { "meta": "https://raw.githubusercontent.com/chaozmc/ioBroker.oekofen-json/main/io-package.json", "icon": "https://raw.githubusercontent.com/chaozmc/ioBroker.oekofen-json/main/admin/oekofen-json.png", "type": "climate-control", - "version": "1.0.3" + "version": "1.0.5" }, "oilfox": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.oilfox/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.oilfox/master/admin/oilfox.png", "type": "hardware", - "version": "4.1.2" + "version": "4.3.0" }, "omnicomm-lls": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.omnicomm-lls/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.omnicomm-lls/master/admin/omnicomm-lls.png", "type": "metering", - "version": "0.0.7" + "version": "0.1.1" }, "onkyo": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.onkyo/master/io-package.json", @@ -1736,46 +1863,52 @@ "version": "2.1.2" }, "onvif": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.onvif/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.onvif/master/admin/onvif.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.onvif/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.onvif/main/admin/onvif.png", "type": "infrastructure", - "version": "1.0.5" + "version": "1.1.4" + }, + "opcua": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.opcua/master/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.opcua/master/admin/opcua.png", + "type": "protocols", + "version": "1.1.0" }, "opendtu": { "meta": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.opendtu/main/io-package.json", "icon": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.opendtu/main/admin/opendtu.png", "type": "energy", - "version": "0.1.7" + "version": "2.0.0" }, "openhab": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.openhab/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.openhab/master/admin/openhab.png", "type": "iot-systems", - "version": "1.1.0" + "version": "1.2.0" }, "openknx": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.openknx/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.openknx/master/admin/openknx.png", "type": "iot-systems", - "version": "0.5.3" + "version": "0.9.0" }, "openligadb": { - "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.openligadb/master/io-package.json", - "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.openligadb/master/admin/openligadb_b.png", + "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.openligadb/main/io-package.json", + "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.openligadb/main/admin/openligadb_n.png", "type": "misc-data", - "version": "1.2.4" + "version": "1.4.11" }, "openweathermap": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.openweathermap/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.openweathermap/master/admin/openweathermap.png", "type": "weather", - "version": "0.3.9" + "version": "1.1.2" }, "operating-hours": { "meta": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.operating-hours/main/io-package.json", "icon": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.operating-hours/main/admin/operating-hours.png", "type": "metering", - "version": "1.0.4" + "version": "1.1.0" }, "opi": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.opi/master/io-package.json", @@ -1799,31 +1932,25 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.owntracks/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.owntracks/master/admin/owntracks.png", "type": "geoposition", - "version": "1.0.5" + "version": "1.1.0" }, "panasonic-comfort-cloud": { - "meta": "https://raw.githubusercontent.com/marc2016/ioBroker.panasonic-comfort-cloud/master/io-package.json", - "icon": "https://raw.githubusercontent.com/marc2016/ioBroker.panasonic-comfort-cloud/master/admin/panasonic-comfort-cloud.png", + "meta": "https://raw.githubusercontent.com/marc2016/ioBroker.panasonic-comfort-cloud/main/io-package.json", + "icon": "https://raw.githubusercontent.com/marc2016/ioBroker.panasonic-comfort-cloud/main/admin/panasonic-comfort-cloud.png", "type": "climate-control", - "version": "2.2.0" + "version": "3.0.2" }, "panasonic-viera": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.panasonic-viera/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.panasonic-viera/master/admin/panasonic-viera.png", "type": "multimedia", - "version": "2.0.0" - }, - "parcel": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.parcel/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.parcel/master/admin/parcel.png", - "type": "misc-data", - "version": "0.0.27" + "version": "2.1.0" }, "parser": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.parser/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.parser/master/admin/parser.png", "type": "logic", - "version": "1.3.2" + "version": "2.2.2" }, "paw": { "meta": "https://raw.githubusercontent.com/bondrogeen/ioBroker.paw/master/io-package.json", @@ -1835,13 +1962,13 @@ "meta": "https://raw.githubusercontent.com/simatec/ioBroker.pegelalarm/master/io-package.json", "icon": "https://raw.githubusercontent.com/simatec/ioBroker.pegelalarm/master/admin/pegelalarm.png", "type": "weather", - "version": "1.3.0" + "version": "1.3.3" }, "ph803w": { "meta": "https://raw.githubusercontent.com/Apollon77/ioBroker.ph803w/main/io-package.json", "icon": "https://raw.githubusercontent.com/Apollon77/ioBroker.ph803w/main/admin/ph803w_icon.png", "type": "metering", - "version": "1.1.1" + "version": "1.2.0" }, "phantomjs": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.phantomjs/master/io-package.json", @@ -1853,13 +1980,13 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.philips-air/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.philips-air/master/admin/philips-air.png", "type": "household", - "version": "1.0.3" + "version": "1.1.0" }, "philips-tv": { "meta": "https://raw.githubusercontent.com/AlCalzone/ioBroker.philips-tv/master/io-package.json", "icon": "https://raw.githubusercontent.com/AlCalzone/ioBroker.philips-tv/master/admin/philips-tv.png", "type": "multimedia", - "version": "0.5.3" + "version": "0.5.4" }, "pi-hole": { "meta": "https://raw.githubusercontent.com/unltdnetworx/ioBroker.pi-hole/master/io-package.json", @@ -1867,6 +1994,12 @@ "type": "network", "version": "1.3.6" }, + "pid": { + "meta": "https://raw.githubusercontent.com/mcm4iob/ioBroker.pid/master/io-package.json", + "icon": "https://raw.githubusercontent.com/mcm4iob/ioBroker.pid/master/admin/pid.png", + "type": "general", + "version": "1.1.3" + }, "piface": { "meta": "https://raw.githubusercontent.com/eisbaeeer/ioBroker.piface/master/io-package.json", "icon": "https://raw.githubusercontent.com/eisbaeeer/ioBroker.piface/master/admin/piface.png", @@ -1889,13 +2022,13 @@ "meta": "https://raw.githubusercontent.com/pixelit-project/ioBroker.pixelit/master/io-package.json", "icon": "https://raw.githubusercontent.com/pixelit-project/ioBroker.pixelit/master/admin/pixelit.png", "type": "hardware", - "version": "1.1.1" + "version": "1.1.3" }, "places": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.places/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.places/master/admin/places.png", "type": "geoposition", - "version": "1.1.2" + "version": "1.2.0" }, "plenticore": { "meta": "https://raw.githubusercontent.com/StrathCole/ioBroker.plenticore/master/io-package.json", @@ -1907,7 +2040,7 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.plex/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.plex/master/admin/plex.jpg", "type": "multimedia", - "version": "1.0.5" + "version": "1.1.4" }, "plexconnect": { "meta": "https://raw.githubusercontent.com/eisbaeeer/ioBroker.plexconnect/master/io-package.json", @@ -1916,10 +2049,10 @@ "version": "0.0.7" }, "pollenflug": { - "meta": "https://raw.githubusercontent.com/schmupu/ioBroker.pollenflug/master/io-package.json", - "icon": "https://raw.githubusercontent.com/schmupu/ioBroker.pollenflug/master/admin/pollenflug.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pollenflug/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pollenflug/master/admin/pollenflug.png", "type": "weather", - "version": "1.0.6" + "version": "2.0.0" }, "porsche": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.porsche/master/io-package.json", @@ -1928,22 +2061,22 @@ "version": "0.0.3" }, "powerfox2": { - "meta": "https://raw.githubusercontent.com/Ax-LED/ioBroker.powerfox2/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Ax-LED/ioBroker.powerfox2/master/admin/powerfox2.png", + "meta": "https://raw.githubusercontent.com/Ax-LED/ioBroker.powerfox2/main/io-package.json", + "icon": "https://raw.githubusercontent.com/Ax-LED/ioBroker.powerfox2/main/admin/powerfox2.png", "type": "energy", - "version": "0.0.12" + "version": "0.0.14" }, "procon-ip": { "meta": "https://raw.githubusercontent.com/ylabonte/ioBroker.procon-ip/master/io-package.json", "icon": "https://raw.githubusercontent.com/ylabonte/ioBroker.procon-ip/master/admin/procon-ip.png", "type": "iot-systems", - "version": "1.4.0" + "version": "1.5.4" }, "proxmox": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.proxmox/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.proxmox/master/admin/logo.png", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.proxmox/master/admin/proxmox.png", "type": "infrastructure", - "version": "1.3.5" + "version": "2.3.0" }, "proxy": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.proxy/master/io-package.json", @@ -1951,53 +2084,59 @@ "type": "network", "version": "1.3.2" }, - "psa": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.psa/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.psa/master/admin/psa.png", - "type": "vehicle", - "version": "0.0.11" - }, "puppeteer": { "meta": "https://raw.githubusercontent.com/foxriver76/ioBroker.puppeteer/main/io-package.json", "icon": "https://raw.githubusercontent.com/foxriver76/ioBroker.puppeteer/main/admin/puppeteer.png", "type": "utility", - "version": "0.2.7" + "version": "0.3.0" }, "pushbullet": { - "meta": "https://raw.githubusercontent.com/Jens1809/ioBroker.pushbullet/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Jens1809/ioBroker.pushbullet/master/admin/pushbullet.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pushbullet/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pushbullet/master/admin/pushbullet.png", "type": "messaging", - "version": "0.0.11" + "version": "2.1.0" }, "pushover": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.pushover/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.pushover/master/admin/pushover.png", "type": "messaging", - "version": "3.0.3" + "version": "4.1.0" }, "pushsafer": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.pushsafer/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.pushsafer/master/admin/pushsafer.png", "type": "messaging", - "version": "1.0.3" + "version": "1.1.0" }, "pvforecast": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pvforecast/main/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pvforecast/main/admin/pvforecast.png", "type": "energy", - "version": "2.7.1" + "version": "3.0.0" }, "pvoutputorg": { "meta": "https://raw.githubusercontent.com/rg-engineering/ioBroker.pvoutputorg/master/io-package.json", "icon": "https://raw.githubusercontent.com/rg-engineering/ioBroker.pvoutputorg/master/admin/pvoutputorg.png", "type": "energy", - "version": "1.8.9" + "version": "1.8.13" + }, + "pylontech": { + "meta": "https://raw.githubusercontent.com/PLCHome/ioBroker.pylontech/master/io-package.json", + "icon": "https://raw.githubusercontent.com/PLCHome/ioBroker.pylontech/master/admin/pylontech.png", + "type": "energy", + "version": "0.0.10" + }, + "radar-trap": { + "meta": "https://raw.githubusercontent.com/Steiger04/ioBroker.radar-trap/main/io-package.json", + "icon": "https://raw.githubusercontent.com/Steiger04/ioBroker.radar-trap/main/admin/radar-trap.png", + "type": "geoposition", + "version": "2.2.1" }, "radar2": { - "meta": "https://raw.githubusercontent.com/frankjoke/ioBroker.radar2/master/io-package.json", - "icon": "https://raw.githubusercontent.com/frankjoke/ioBroker.radar2/master/admin/radar2.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.radar2/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.radar2/master/admin/radar2.png", "type": "network", - "version": "2.0.7" + "version": "2.2.0" }, "radiohead": { "meta": "https://raw.githubusercontent.com/crycode-de/ioBroker.radiohead/master/io-package.json", @@ -2005,35 +2144,53 @@ "type": "protocols", "version": "1.3.0" }, - "renault": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.renault/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.renault/master/admin/renault.png", - "type": "vehicle", - "version": "0.0.15" + "rainbird": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.rainbird/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.rainbird/master/admin/rainbird.png", + "type": "garden", + "version": "1.0.1" + }, + "rct": { + "meta": "https://raw.githubusercontent.com/aruttkamp/ioBroker.rct/main/io-package.json", + "icon": "https://raw.githubusercontent.com/aruttkamp/ioBroker.rct/main/admin/rct-logo.square.png", + "type": "energy", + "version": "1.2.13" + }, + "renacidc": { + "meta": "https://raw.githubusercontent.com/raschy/ioBroker.renacidc/main/io-package.json", + "icon": "https://raw.githubusercontent.com/raschy/ioBroker.renacidc/main/admin/renacidc.png", + "type": "energy", + "version": "0.1.2" + }, + "reolink": { + "meta": "https://raw.githubusercontent.com/aendue/ioBroker.reolink/main/io-package.json", + "icon": "https://raw.githubusercontent.com/aendue/ioBroker.reolink/main/admin/reolink_logo.png", + "type": "alarm", + "version": "1.1.1" }, "residents": { "meta": "https://raw.githubusercontent.com/jpawlowski/ioBroker.residents/main/io-package.json", "icon": "https://raw.githubusercontent.com/jpawlowski/ioBroker.residents/main/admin/residents.svg", "type": "logic", - "version": "0.1.0" + "version": "1.0.0" }, "resol": { "meta": "https://raw.githubusercontent.com/Grizzelbee/ioBroker.resol/master/io-package.json", "icon": "https://raw.githubusercontent.com/grizzelbee/ioBroker.resol/master/admin/resol.svg", "type": "energy", - "version": "1.1.6" + "version": "1.3.0" }, "rest-api": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.rest-api/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.rest-api/master/admin/rest-api.png", "type": "communication", - "version": "1.1.0" + "version": "2.0.3" }, "rflink": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.rflink/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.rflink/master/admin/rflink.png", "type": "iot-systems", - "version": "2.1.6" + "version": "2.1.12" }, "rickshaw": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.rickshaw/master/io-package.json", @@ -2045,91 +2202,97 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.ring/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.ring/master/admin/ring.png", "type": "hardware", - "version": "3.2.2" + "version": "5.1.0" }, "robonect": { "meta": "https://raw.githubusercontent.com/Grizzelbee/ioBroker.robonect/master/io-package.json", "icon": "https://raw.githubusercontent.com/Grizzelbee/ioBroker.robonect/master/admin/robonect.png", "type": "garden", - "version": "0.1.4" + "version": "1.3.6" }, "roborock": { "meta": "https://raw.githubusercontent.com/copystring/ioBroker.roborock/main/io-package.json", "icon": "https://raw.githubusercontent.com/copystring/ioBroker.roborock/main/admin/roborock.png", "type": "household", - "version": "0.3.1" + "version": "0.6.4" }, "roomba": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.roomba/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.roomba/master/admin/roomba.png", "type": "household", - "version": "1.1.4" + "version": "1.3.0" }, "rpi2": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.rpi2/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.rpi2/master/admin/rpi.png", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.rpi2/master/admin/rpi2.png", "type": "hardware", "version": "1.3.2" }, "rssfeed": { - "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.rssfeed/master/io-package.json", - "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.rssfeed/master/admin/rssfeed-logo.png", + "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.rssfeed/main/io-package.json", + "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.rssfeed/main/admin/rssfeed.png", "type": "misc-data", - "version": "2.6.1" + "version": "3.1.0" }, "s7": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.s7/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.s7/master/admin/s7.png", "type": "iot-systems", - "version": "1.3.15" + "version": "1.4.3" }, "sainlogic": { "meta": "https://raw.githubusercontent.com/phifogg/ioBroker.sainlogic/master/io-package.json", "icon": "https://raw.githubusercontent.com/phifogg/ioBroker.sainlogic/master/admin/sainlogic.png", "type": "weather", - "version": "0.10.5" + "version": "0.11.4" }, "samsung": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.samsung/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.samsung/master/admin/samsung.png", "type": "multimedia", - "version": "0.5.11" + "version": "0.6.0" + }, + "samsung_tizen": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.samsung_tizen/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.samsung_tizen/master/admin/samsung.png", + "type": "multimedia", + "version": "1.1.0" }, "sanext": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.sanext/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.sanext/master/admin/sanext.png", "type": "energy", - "version": "0.0.5" + "version": "0.1.0" }, "sayit": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.sayit/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.sayit/master/admin/sayit.png", "type": "multimedia", - "version": "3.0.5" + "version": "5.0.0" }, "sbfspot": { "meta": "https://raw.githubusercontent.com/rg-engineering/ioBroker.sbfspot/master/io-package.json", "icon": "https://raw.githubusercontent.com/rg-engineering/ioBroker.sbfspot/master/admin/sbfspot.png", "type": "hardware", - "version": "4.1.6" + "version": "4.3.4" }, "scenes": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.scenes/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.scenes/master/admin/scenes.png", "type": "logic", - "version": "2.3.9" + "version": "3.2.1" }, "scheduler": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.scheduler/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.scheduler/master/admin/scheduler.png", "type": "logic", - "version": "1.1.9" + "version": "1.4.1" }, "schoolfree": { "meta": "https://raw.githubusercontent.com/simatec/ioBroker.schoolfree/master/io-package.json", "icon": "https://raw.githubusercontent.com/simatec/ioBroker.schoolfree/master/admin/schoolfree.png", "type": "date-and-time", - "version": "1.1.1" + "version": "1.1.4" }, "schwoerer-ventcube": { "meta": "https://raw.githubusercontent.com/Excodibur/ioBroker.schwoerer-ventcube/master/io-package.json", @@ -2147,17 +2310,23 @@ "meta": "https://raw.githubusercontent.com/Rintrium/ioBroker.selverf/master/io-package.json", "icon": "https://raw.githubusercontent.com/Rintrium/ioBroker.selverf/master/admin/selverf.png", "type": "iot-systems", - "version": "0.6.2" + "version": "0.6.3" }, "semp": { "meta": "https://raw.githubusercontent.com/rg-engineering/ioBroker.semp/master/io-package.json", "icon": "https://raw.githubusercontent.com/rg-engineering/ioBroker.semp/master/admin/semp.png", "type": "energy", - "version": "1.3.4" + "version": "1.4.7" + }, + "senec": { + "meta": "https://raw.githubusercontent.com/nobl/ioBroker.senec/master/io-package.json", + "icon": "https://raw.githubusercontent.com/nobl/ioBroker.senec/master/admin/senec.png", + "type": "energy", + "version": "1.6.14" }, "seq": { - "meta": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.seq/master/io-package.json", - "icon": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.seq/master/admin/seq.png", + "meta": "https://raw.githubusercontent.com/arteck/ioBroker.seq/master/io-package.json", + "icon": "https://raw.githubusercontent.com/arteck/ioBroker.seq/master/admin/seq.png", "type": "logic", "version": "0.3.0" }, @@ -2165,13 +2334,13 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.shelly/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.shelly/master/admin/shelly.png", "type": "iot-systems", - "version": "6.4.1" + "version": "7.0.0" }, "shuttercontrol": { "meta": "https://raw.githubusercontent.com/simatec/ioBroker.shuttercontrol/master/io-package.json", "icon": "https://raw.githubusercontent.com/simatec/ioBroker.shuttercontrol/master/admin/shuttercontrol.png", "type": "climate-control", - "version": "1.6.1" + "version": "1.7.3" }, "sia": { "meta": "https://raw.githubusercontent.com/schmupu/ioBroker.sia/master/io-package.json", @@ -2191,53 +2360,53 @@ "type": "messaging", "version": "0.3.0" }, + "signifylights": { + "meta": "https://raw.githubusercontent.com/disaster123/ioBroker.signifylights/main/io-package.json", + "icon": "https://raw.githubusercontent.com/disaster123/ioBroker.signifylights/main/admin/signifylights.png", + "type": "lighting", + "version": "0.3.1" + }, "simple-api": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.simple-api/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.simple-api/master/admin/simple-api.png", "type": "communication", - "version": "2.7.2" + "version": "2.8.0" }, "sma-em": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.sma-em/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.sma-em/master/admin/sma-em.png", "type": "energy", - "version": "1.0.0" + "version": "1.1.0" }, "smappee": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.smappee/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.smappee/master/admin/smappee.png", "type": "energy", - "version": "0.2.6" - }, - "smart-eq": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.smart-eq/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.smart-eq/master/admin/smart-eq.png", - "type": "vehicle", - "version": "0.0.4" + "version": "0.3.0" }, "smartcontrol": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.smartcontrol/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.smartcontrol/master/admin/smartcontrol.png", "type": "logic", - "version": "1.3.2" + "version": "2.0.1" }, "smartgarden": { "meta": "https://raw.githubusercontent.com/jpgorganizer/ioBroker.smartgarden/master/io-package.json", "icon": "https://raw.githubusercontent.com/jpgorganizer/ioBroker.smartgarden/master/admin/smartgarden.png", "type": "garden", - "version": "2.0.0" + "version": "2.0.1" }, "smartmeter": { "meta": "https://raw.githubusercontent.com/Apollon77/ioBroker.smartmeter/master/io-package.json", "icon": "https://raw.githubusercontent.com/Apollon77/ioBroker.smartmeter/master/admin/smartmeter.png", "type": "energy", - "version": "3.3.4" + "version": "3.4.0" }, - "smartthings": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.smartthings/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.smartthings/master/admin/smartthings.png", - "type": "household", - "version": "0.0.4" + "smoothed": { + "meta": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.smoothed/main/io-package.json", + "icon": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.smoothed/main/admin/smoothed.png", + "type": "logic", + "version": "1.1.0" }, "snips": { "meta": "https://raw.githubusercontent.com/unltdnetworx/ioBroker.snips/master/io-package.json", @@ -2249,73 +2418,85 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.snmp/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.snmp/master/admin/snmp.png", "type": "infrastructure", - "version": "2.4.11" + "version": "3.2.0" }, "socketio": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.socketio/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.socketio/master/admin/socketio.png", "type": "communication", - "version": "6.5.3" + "version": "6.7.1" + }, + "solaredge": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.solaredge/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.solaredge/master/admin/solaredge.png", + "type": "energy", + "version": "1.4.1" }, "solarlog": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.solarlog/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.solarlog/master/admin/solarlog.png", "type": "energy", - "version": "2.2.6" + "version": "2.3.0" }, "solarmanpv": { "meta": "https://raw.githubusercontent.com/raschy/ioBroker.solarmanpv/main/io-package.json", "icon": "https://raw.githubusercontent.com/raschy/ioBroker.solarmanpv/main/admin/solarmanpv.png", "type": "energy", - "version": "0.5.0" + "version": "0.6.1" }, "solarviewdatareader": { "meta": "https://raw.githubusercontent.com/afuerhoff/ioBroker.solarviewdatareader/master/io-package.json", "icon": "https://raw.githubusercontent.com/afuerhoff/ioBroker.solarviewdatareader/master/admin/solarviewdatareader.png", "type": "energy", - "version": "1.0.7" + "version": "1.1.1" }, "solarwetter": { - "meta": "https://raw.githubusercontent.com/Pix---/ioBroker.solarwetter/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pix---/ioBroker.solarwetter/master/admin/solarwetter.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.solarwetter/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.solarwetter/master/admin/solarwetter.png", "type": "weather", - "version": "1.0.0" + "version": "1.2.0" }, "solax": { "meta": "https://raw.githubusercontent.com/simatec/ioBroker.solax/master/io-package.json", "icon": "https://raw.githubusercontent.com/simatec/ioBroker.solax/master/admin/solax.png", "type": "energy", - "version": "0.7.6" + "version": "0.9.9" + }, + "soliscloud": { + "meta": "https://raw.githubusercontent.com/Trixx34/ioBroker.soliscloud/main/io-package.json", + "icon": "https://raw.githubusercontent.com/Trixx34/ioBroker.soliscloud/main/admin/solis.png", + "type": "energy", + "version": "1.4.2" }, "sonnen": { "meta": "https://raw.githubusercontent.com/foxriver76/ioBroker.sonnen/master/io-package.json", "icon": "https://raw.githubusercontent.com/foxriver76/ioBroker.sonnen/master/admin/sonnen.png", "type": "energy", - "version": "1.16.0" + "version": "1.18.1" }, "sonoff": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.sonoff/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.sonoff/master/admin/sonoff.png", "type": "lighting", - "version": "2.5.3" + "version": "3.1.0" }, "sonos": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.sonos/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.sonos/master/admin/sonos.png", "type": "multimedia", - "version": "2.3.1" + "version": "3.0.0" }, "sony-bravia": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.sony-bravia/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.sony-bravia/master/admin/sony-bravia.png", "type": "multimedia", - "version": "1.0.9" + "version": "1.1.0" }, "spotify-premium": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.spotify-premium/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.spotify-premium/master/admin/spotify-premium.png", "type": "multimedia", - "version": "1.2.2" + "version": "1.5.0" }, "sprinklecontrol": { "meta": "https://raw.githubusercontent.com/Dirk-Peter-md/ioBroker.sprinklecontrol/master/io-package.json", @@ -2327,11 +2508,11 @@ "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.sql/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.sql/master/admin/sql.png", "type": "storage", - "version": "2.2.0" + "version": "3.0.1" }, "squeezeboxrpc": { - "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.squeezeboxrpc/master/io-package.json", - "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.squeezeboxrpc/master/admin/squeezeboxrpc.png", + "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.squeezeboxrpc/main/io-package.json", + "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.squeezeboxrpc/main/admin/squeezeboxrpc.png", "type": "multimedia", "version": "1.3.9" }, @@ -2339,13 +2520,13 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.starline/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.starline/master/admin/starline.png", "type": "vehicle", - "version": "1.1.3" + "version": "1.2.0" }, "statistics": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.statistics/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.statistics/master/admin/statistics.png", "type": "misc-data", - "version": "2.3.0" + "version": "2.4.0" }, "stiebel-isg": { "meta": "https://raw.githubusercontent.com/unltdnetworx/ioBroker.stiebel-isg/master/io-package.json", @@ -2353,65 +2534,83 @@ "type": "climate-control", "version": "1.7.7" }, + "sun2000": { + "meta": "https://raw.githubusercontent.com/bolliy/ioBroker.sun2000/main/io-package.json", + "icon": "https://raw.githubusercontent.com/bolliy/ioBroker.sun2000/main/admin/sun2000.png", + "type": "energy", + "version": "0.11.0" + }, + "sun2000-modbus": { + "meta": "https://raw.githubusercontent.com/daolis/ioBroker.sun2000-modbus/main/io-package.json", + "icon": "https://raw.githubusercontent.com/daolis/ioBroker.sun2000-modbus/main/admin/sun2000-modbus.png", + "type": "energy", + "version": "0.1.3" + }, "sureflap": { "meta": "https://raw.githubusercontent.com/Sickboy78/ioBroker.sureflap/master/io-package.json", "icon": "https://raw.githubusercontent.com/Sickboy78/ioBroker.sureflap/master/admin/sureflap.png", "type": "iot-systems", - "version": "1.2.0" + "version": "2.2.1" }, "swiss-weather-api": { "meta": "https://raw.githubusercontent.com/baerengraben/ioBroker.swiss-weather-api/master/io-package.json", "icon": "https://raw.githubusercontent.com/baerengraben/ioBroker.swiss-weather-api/master/admin/swiss-weather-api.png", "type": "weather", - "version": "2.0.3" + "version": "2.1.0" }, "synochat": { "meta": "https://raw.githubusercontent.com/phoeluga/ioBroker.synochat/master/io-package.json", "icon": "https://raw.githubusercontent.com/phoeluga/ioBroker.synochat/master/admin/synochat.png", "type": "messaging", - "version": "1.2.1" + "version": "1.3.1" }, "synology": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.synology/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.synology/master/admin/synology.png", "type": "infrastructure", - "version": "2.1.13" + "version": "3.1.0" }, "systeminfo": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.systeminfo/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.systeminfo/master/admin/systeminfo.png", "type": "misc-data", - "version": "1.0.0" + "version": "1.2.0" }, "tado": { "meta": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.tado/main/io-package.json", "icon": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.tado/main/admin/tado.png", "type": "climate-control", - "version": "0.4.8" + "version": "0.5.6" }, "tahoma": { "meta": "https://raw.githubusercontent.com/Excodibur/ioBroker.tahoma/master/io-package.json", "icon": "https://raw.githubusercontent.com/Excodibur/ioBroker.tahoma/master/admin/tahoma.png", "type": "iot-systems", - "version": "0.10.2" + "version": "0.10.4" }, "tankerkoenig": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tankerkoenig/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tankerkoenig/master/admin/tankerkoenig.png", "type": "vehicle", - "version": "3.3.7" + "version": "3.4.0" }, - "tapo": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.tapo/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.tapo/master/admin/tapo.png", - "type": "iot-systems", - "version": "0.0.8" + "tedee": { + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.tedee/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.tedee/main/admin/tedee.png", + "type": "hardware", + "version": "0.3.2" }, "telegram": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.telegram/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.telegram/master/admin/telegram.png", "type": "messaging", - "version": "1.16.0" + "version": "3.9.0" + }, + "telegram-menu": { + "meta": "https://raw.githubusercontent.com/MiRo1310/ioBroker.telegram-menu/main/io-package.json", + "icon": "https://raw.githubusercontent.com/MiRo1310/ioBroker.telegram-menu/main/admin/telegram-menu.png", + "type": "messaging", + "version": "2.0.0" }, "terminal": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.terminal/master/io-package.json", @@ -2429,19 +2628,25 @@ "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.text2command/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.text2command/master/admin/text2command.png", "type": "logic", - "version": "3.0.2" + "version": "3.0.3" }, "tibberlink": { "meta": "https://raw.githubusercontent.com/hombach/ioBroker.tibberlink/master/io-package.json", "icon": "https://raw.githubusercontent.com/hombach/ioBroker.tibberlink/master/admin/tibberlink.png", "type": "energy", - "version": "0.2.6" + "version": "3.4.8" }, "tinker": { "meta": "https://raw.githubusercontent.com/simatec/ioBroker.tinker/master/io-package.json", "icon": "https://raw.githubusercontent.com/simatec/ioBroker.tinker/master/admin/tinker.png", "type": "hardware", - "version": "1.2.0" + "version": "1.3.2" + }, + "tinymqttbroker": { + "meta": "https://raw.githubusercontent.com/HGlab01/ioBroker.tinymqttbroker/main/io-package.json", + "icon": "https://raw.githubusercontent.com/HGlab01/ioBroker.tinymqttbroker/main/admin/tinymqttbroker.png", + "type": "protocols", + "version": "0.1.1" }, "toyota": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.toyota/master/io-package.json", @@ -2453,13 +2658,19 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tr-064/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tr-064/master/admin/tr-064.png", "type": "infrastructure", - "version": "4.2.18" + "version": "4.3.0" }, "traccar": { - "meta": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.traccar/master/io-package.json", - "icon": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.traccar/master/admin/traccar.png", + "meta": "https://raw.githubusercontent.com/arteck/ioBroker.traccar/master/io-package.json", + "icon": "https://raw.githubusercontent.com/arteck/ioBroker.traccar/master/admin/traccar.png", "type": "geoposition", - "version": "0.0.12" + "version": "1.1.4" + }, + "tractive-gps": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tractive-gps/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tractive-gps/main/admin/tractive-gps.png", + "type": "geoposition", + "version": "2.0.1" }, "tradfri": { "meta": "https://raw.githubusercontent.com/AlCalzone/ioBroker.tradfri/master/io-package.json", @@ -2471,7 +2682,7 @@ "meta": "https://raw.githubusercontent.com/klein0r/ioBroker.trashschedule/master/io-package.json", "icon": "https://raw.githubusercontent.com/klein0r/ioBroker.trashschedule/master/admin/trashschedule.png", "type": "date-and-time", - "version": "2.2.0" + "version": "3.3.0" }, "trivum": { "meta": "https://raw.githubusercontent.com/TheBam1990/ioBroker.trivum/main/io-package.json", @@ -2495,7 +2706,7 @@ "meta": "https://raw.githubusercontent.com/Apollon77/ioBroker.tuya/master/io-package.json", "icon": "https://raw.githubusercontent.com/Apollon77/ioBroker.tuya/master/admin/tuya.png", "type": "iot-systems", - "version": "3.14.2" + "version": "3.16.0" }, "tvprogram": { "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.tvprogram/master/io-package.json", @@ -2504,10 +2715,10 @@ "version": "1.1.2" }, "tvspielfilm": { - "meta": "https://raw.githubusercontent.com/Pix---/ioBroker.tvspielfilm/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pix---/ioBroker.tvspielfilm/master/admin/tvspielfilm.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tvspielfilm/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tvspielfilm/master/admin/tvspielfilm.png", "type": "misc-data", - "version": "2.0.4" + "version": "2.1.0" }, "twinkly": { "meta": "https://raw.githubusercontent.com/patrickbs96/ioBroker.twinkly/master/io-package.json", @@ -2519,7 +2730,13 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.unifi/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.unifi/master/admin/unifi.png", "type": "network", - "version": "0.6.6" + "version": "0.7.0" + }, + "unifi-protect": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.unifi-protect/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.unifi-protect/master/admin/unifi-protect.png", + "type": "alarm", + "version": "1.0.1" }, "upnp": { "meta": "https://raw.githubusercontent.com/Jey-Cee/ioBroker.upnp/master/io-package.json", @@ -2531,13 +2748,7 @@ "meta": "https://raw.githubusercontent.com/simatec/ioBroker.uv-protect/master/io-package.json", "icon": "https://raw.githubusercontent.com/simatec/ioBroker.uv-protect/master/admin/uv-protect.png", "type": "weather", - "version": "0.4.1" - }, - "vaillant": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.vaillant/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.vaillant/master/admin/vaillant.png", - "type": "climate-control", - "version": "0.1.2" + "version": "0.6.0" }, "valloxmv": { "meta": "https://raw.githubusercontent.com/hacki11/ioBroker.valloxmv/master/io-package.json", @@ -2549,13 +2760,7 @@ "meta": "https://raw.githubusercontent.com/Omega236/ioBroker.valuetrackerovertime/master/io-package.json", "icon": "https://raw.githubusercontent.com/Omega236/ioBroker.valuetrackerovertime/master/admin/valuetrackerovertime.png", "type": "misc-data", - "version": "1.0.0" - }, - "vcard": { - "meta": "https://raw.githubusercontent.com/hometm/ioBroker.vcard/master/io-package.json", - "icon": "https://raw.githubusercontent.com/hometm/ioBroker.vcard/master/admin/vcard.png", - "type": "misc-data", - "version": "0.0.9" + "version": "1.0.1" }, "vds2465-server": { "meta": "https://raw.githubusercontent.com/Hirsch-DE/ioBroker.vds2465-server/main/io-package.json", @@ -2567,25 +2772,19 @@ "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.velux/master/io-package.json", "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.velux/master/admin/velux.png", "type": "household", - "version": "0.0.7" - }, - "vesync": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.vesync/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.vesync/master/admin/vesync.png", - "type": "climate-control", - "version": "0.0.3" + "version": "0.0.8" }, "viessmann": { "meta": "https://raw.githubusercontent.com/misanorot/ioBroker.viessmann/master/io-package.json", "icon": "https://raw.githubusercontent.com/misanorot/ioBroker.viessmann/master/admin/viessmann.png", "type": "climate-control", - "version": "1.4.4" + "version": "1.4.7" }, "viessmannapi": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.viessmannapi/master/io-package.json", "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.viessmannapi/master/admin/viessmannapi.png", "type": "climate-control", - "version": "2.0.9" + "version": "2.3.0" }, "virtualpowermeter": { "meta": "https://raw.githubusercontent.com/Omega236/ioBroker.virtualpowermeter/master/io-package.json", @@ -2597,7 +2796,55 @@ "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis/master/admin/vis.png", "type": "visualization", - "version": "1.4.16" + "version": "1.5.6" + }, + "vis-2": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2/master/packages/iobroker.vis-2/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2/master/packages/iobroker.vis-2/admin/vis-2.png", + "type": "visualization", + "version": "2.9.32" + }, + "vis-2-widgets-energy": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-energy/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-energy/main/admin/vis-2-widgets-energy.png", + "type": "visualization-widgets", + "version": "1.0.0" + }, + "vis-2-widgets-gauges": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-gauges/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-gauges/main/admin/vis-2-widgets-gauges.png", + "type": "visualization-widgets", + "version": "1.1.0" + }, + "vis-2-widgets-inventwo": { + "meta": "https://raw.githubusercontent.com/inventwo/ioBroker.vis-2-widgets-inventwo/main/io-package.json", + "icon": "https://raw.githubusercontent.com/inventwo/ioBroker.vis-2-widgets-inventwo/main/admin/vis-2-widgets-inventwo.png", + "type": "visualization-widgets", + "version": "0.1.11" + }, + "vis-2-widgets-jaeger-design": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-jaeger-design/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-jaeger-design/main/admin/vis-2-widgets-jaeger-design.png", + "type": "visualization-widgets", + "version": "1.2.7" + }, + "vis-2-widgets-material": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-material/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-material/main/admin/vis-2-widgets-material.png", + "type": "visualization-widgets", + "version": "1.4.8" + }, + "vis-2-widgets-radar-trap": { + "meta": "https://raw.githubusercontent.com/Steiger04/ioBroker.vis-2-widgets-radar-trap/main/io-package.json", + "icon": "https://raw.githubusercontent.com/Steiger04/ioBroker.vis-2-widgets-radar-trap/main/admin/vis-2-widgets-radar-trap.png", + "type": "visualization-widgets", + "version": "2.2.0" + }, + "vis-2-widgets-rssfeed": { + "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.vis-2-widgets-rssfeed/main/io-package.json", + "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.vis-2-widgets-rssfeed/main/admin/vis-2-widgets-rssfeed.png", + "type": "visualization-widgets", + "version": "0.3.5" }, "vis-bars": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-bars/master/io-package.json", @@ -2635,35 +2882,41 @@ "type": "visualization-widgets", "version": "1.0.0" }, + "vis-homekittiles": { + "meta": "https://raw.githubusercontent.com/Standarduser/ioBroker.vis-homekittiles/main/io-package.json", + "icon": "https://raw.githubusercontent.com/Standarduser/ioBroker.vis-homekittiles/main/admin/vis-homekittiles.png", + "type": "visualization-widgets", + "version": "0.3.1" + }, "vis-hqwidgets": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-hqwidgets/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-hqwidgets/master/admin/hqwidgets.png", "type": "visualization-widgets", - "version": "1.4.0" + "version": "1.5.1" }, "vis-icontwo": { "meta": "https://raw.githubusercontent.com/inventwo/ioBroker.vis-icontwo/master/io-package.json", "icon": "https://raw.githubusercontent.com/inventwo/ioBroker.vis-icontwo/master/admin/icontwo.png", "type": "visualization-icons", - "version": "0.96.0" + "version": "1.5.0" }, "vis-inventwo": { "meta": "https://raw.githubusercontent.com/inventwo/ioBroker.vis-inventwo/master/io-package.json", "icon": "https://raw.githubusercontent.com/inventwo/ioBroker.vis-inventwo/master/admin/inventwo.png", "type": "visualization-widgets", - "version": "3.3.3" + "version": "3.3.4" }, "vis-jqui-mfd": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-jqui-mfd/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-jqui-mfd/master/admin/jqui-mfd.png", "type": "visualization-widgets", - "version": "1.0.12" + "version": "1.1.1" }, "vis-justgage": { - "meta": "https://raw.githubusercontent.com/Pmant/ioBroker.vis-justgage/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pmant/ioBroker.vis-justgage/master/admin/justgage.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vis-justgage/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vis-justgage/master/admin/justgage.png", "type": "visualization-widgets", - "version": "1.0.2" + "version": "2.1.7" }, "vis-keyboard": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-keyboard/master/io-package.json", @@ -2681,13 +2934,25 @@ "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-map/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-map/master/admin/vis-map.png", "type": "visualization-widgets", - "version": "1.0.4" + "version": "1.1.2" + }, + "vis-material": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vis-material/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vis-material/master/admin/material.png", + "type": "visualization-widgets", + "version": "0.1.3" }, "vis-material-advanced": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vis-material-advanced/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vis-material-advanced/master/admin/vis-material-advanced.png", "type": "visualization-widgets", - "version": "1.7.2" + "version": "1.7.4" + }, + "vis-materialdesign": { + "meta": "https://raw.githubusercontent.com/Scrounger/ioBroker.vis-materialdesign/master/io-package.json", + "icon": "https://raw.githubusercontent.com/Scrounger/ioBroker.vis-materialdesign/master/admin/vis-materialdesign.png", + "type": "visualization-widgets", + "version": "0.5.9" }, "vis-metro": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-metro/master/io-package.json", @@ -2723,7 +2988,7 @@ "meta": "https://raw.githubusercontent.com/rg-engineering/ioBroker.vis-weather/master/io-package.json", "icon": "https://raw.githubusercontent.com/rg-engineering/ioBroker.vis-weather/master/admin/vis-weather.png", "type": "visualization-widgets", - "version": "2.5.6" + "version": "2.5.9" }, "voltoplus": { "meta": "https://raw.githubusercontent.com/Jey-Cee/ioBroker.voltoplus/main/io-package.json", @@ -2735,13 +3000,13 @@ "meta": "https://raw.githubusercontent.com/a-i-ks/ioBroker.volumio/master/io-package.json", "icon": "https://raw.githubusercontent.com/a-i-ks/ioBroker.volumio/master/admin/volumio.png", "type": "multimedia", - "version": "0.1.2" + "version": "0.2.0" }, "volvo": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.volvo/master/io-package.json", "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.volvo/master/admin/volvo.png", "type": "vehicle", - "version": "0.1.0" + "version": "0.1.2" }, "vr200": { "meta": "https://raw.githubusercontent.com/Eisbaeeer/ioBroker.vr200/master/io-package.json", @@ -2749,12 +3014,6 @@ "type": "household", "version": "1.0.0" }, - "vw-connect": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.vw-connect/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.vw-connect/master/admin/vw-connect.png", - "type": "vehicle", - "version": "0.0.67" - }, "wallpanel": { "meta": "https://raw.githubusercontent.com/xXBJXx/ioBroker.wallpanel/main/io-package.json", "icon": "https://raw.githubusercontent.com/xXBJXx/ioBroker.wallpanel/main/admin/wallpanel.png", @@ -2767,6 +3026,12 @@ "type": "vehicle", "version": "1.2.2" }, + "weather-warnings": { + "meta": "https://raw.githubusercontent.com/ticaki/ioBroker.weather-warnings/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ticaki/ioBroker.weather-warnings/main/admin/weather-warnings.png", + "type": "weather", + "version": "0.6.7" + }, "weatherflow_udp": { "meta": "https://raw.githubusercontent.com/woessmich/ioBroker.weatherflow_udp/master/io-package.json", "icon": "https://raw.githubusercontent.com/woessmich/ioBroker.weatherflow_udp/master/admin/weatherflow_udp.png", @@ -2777,13 +3042,25 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.weatherunderground/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.weatherunderground/master/admin/wu.png", "type": "weather", - "version": "3.4.2" + "version": "3.7.0" }, "web": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.web/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.web/master/admin/web.png", "type": "general", - "version": "6.1.1" + "version": "6.2.5" + }, + "webcal": { + "meta": "https://raw.githubusercontent.com/dirkhe/ioBroker.webcal/master/io-package.json", + "icon": "https://raw.githubusercontent.com/dirkhe/ioBroker.webcal/master/admin/webcal.png", + "type": "date-and-time", + "version": "1.3.8" + }, + "webui": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.webui/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.webui/master/admin/logo.png", + "type": "visualization", + "version": "1.11.3" }, "webuntis": { "meta": "https://raw.githubusercontent.com/Newan/ioBroker.webuntis/main/io-package.json", @@ -2797,15 +3074,21 @@ "type": "climate-control", "version": "0.0.15" }, + "welcome": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.welcome/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.welcome/main/admin/welcome.png", + "type": "general", + "version": "0.3.0" + }, "whatsapp-cmb": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.whatsapp-cmb/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.whatsapp-cmb/master/admin/whatsapp-cmb.png", "type": "messaging", - "version": "0.2.3" + "version": "0.3.0" }, "wiegand-tcpip": { "meta": "https://raw.githubusercontent.com/kBrausew/ioBroker.wiegand-tcpip/master/io-package.json", - "icon": "https://raw.githubusercontent.com/kbrausew/iobroker.wiegand-tcpip/master/admin/wiegand-tcpip.png", + "icon": "https://raw.githubusercontent.com/kBrausew/ioBroker.wiegand-tcpip/master/admin/wiegand-tcpip.png", "type": "hardware", "version": "0.4.6" }, @@ -2819,7 +3102,7 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.wifilight/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.wifilight/master/admin/wifilight.png", "type": "lighting", - "version": "1.1.4" + "version": "1.2.2" }, "windows-control": { "meta": "https://raw.githubusercontent.com/Mic-M/ioBroker.windows-control/master/io-package.json", @@ -2831,19 +3114,19 @@ "meta": "https://raw.githubusercontent.com/Bettman66/ioBroker.wiobrowser/master/io-package.json", "icon": "https://raw.githubusercontent.com/Bettman66/ioBroker.wiobrowser/master/admin/wiobrowser.png", "type": "communication", - "version": "2.0.1" + "version": "2.0.2" }, "wireguard": { "meta": "https://raw.githubusercontent.com/Grizzelbee/ioBroker.wireguard/main/io-package.json", "icon": "https://raw.githubusercontent.com/Grizzelbee/ioBroker.wireguard/main/admin/wireguard.svg", "type": "infrastructure", - "version": "1.5.10" + "version": "1.6.4" }, "wireless-mbus": { "meta": "https://raw.githubusercontent.com/lvogt/ioBroker.wireless-mbus/master/io-package.json", "icon": "https://raw.githubusercontent.com/lvogt/ioBroker.wireless-mbus/master/admin/wireless-mbus.png", "type": "energy", - "version": "0.9.1" + "version": "0.9.3" }, "withings": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.withings/master/io-package.json", @@ -2861,13 +3144,13 @@ "meta": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.wled/main/io-package.json", "icon": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.wled/main/admin/wled.png", "type": "lighting", - "version": "0.6.7" + "version": "0.7.2" }, "wmswebcontrol": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.wmswebcontrol/master/io-package.json", "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.wmswebcontrol/master/admin/wmswebcontrol.png", "type": "iot-systems", - "version": "0.0.5" + "version": "0.1.0" }, "wolf": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.wolf/master/io-package.json", @@ -2879,25 +3162,31 @@ "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.wolf-smartset/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.wolf-smartset/master/admin/wolf-smartset.png", "type": "climate-control", - "version": "1.1.1" + "version": "1.2.3" }, "worx": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.worx/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.worx/master/admin/worx.png", "type": "garden", - "version": "2.3.2" + "version": "3.0.2" }, "ws": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.ws/main/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.ws/main/admin/ws.png", "type": "communication", - "version": "2.5.4" + "version": "2.6.2" + }, + "x-touch": { + "meta": "https://raw.githubusercontent.com/Bannsaenger/ioBroker.x-touch/master/io-package.json", + "icon": "https://raw.githubusercontent.com/Bannsaenger/ioBroker.x-touch/master/admin/x-touch.png", + "type": "hardware", + "version": "0.6.5" }, "xbox": { "meta": "https://raw.githubusercontent.com/foxriver76/ioBroker.xbox/master/io-package.json", "icon": "https://raw.githubusercontent.com/foxriver76/ioBroker.xbox/master/admin/xbox.png", "type": "multimedia", - "version": "1.0.2" + "version": "1.1.0" }, "xs1": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.xs1/master/io-package.json", @@ -2909,7 +3198,7 @@ "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.xterm/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.xterm/master/admin/xterm.png", "type": "utility", - "version": "1.1.0" + "version": "2.0.1" }, "yahka": { "meta": "https://raw.githubusercontent.com/jensweigele/ioBroker.yahka/master/io-package.json", @@ -2921,25 +3210,25 @@ "meta": "https://raw.githubusercontent.com/Newan/ioBroker.yahoo-stock-market/main/io-package.json", "icon": "https://raw.githubusercontent.com/Newan/ioBroker.yahoo-stock-market/main/admin/yahoo-stock-market.png", "type": "misc-data", - "version": "0.0.5" + "version": "0.0.7" }, "yamaha": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.yamaha/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.yamaha/master/admin/yamaha.png", "type": "multimedia", - "version": "0.5.3" + "version": "0.5.4" }, "yeelight-2": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.yeelight-2/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.yeelight-2/master/admin/yeelight.png", "type": "lighting", - "version": "1.2.1" + "version": "1.4.0" }, "youtube": { "meta": "https://raw.githubusercontent.com/klein0r/ioBroker.youtube/master/io-package.json", "icon": "https://raw.githubusercontent.com/klein0r/ioBroker.youtube/master/admin/youtube.png", "type": "misc-data", - "version": "4.2.1" + "version": "5.0.0" }, "yr": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.yr/master/io-package.json", @@ -2953,17 +3242,23 @@ "type": "climate-control", "version": "0.0.7" }, + "zendure-solarflow": { + "meta": "https://raw.githubusercontent.com/nograx/ioBroker.zendure-solarflow/main/io-package.json", + "icon": "https://raw.githubusercontent.com/nograx/ioBroker.zendure-solarflow/main/admin/zendure-solarflow.png", + "type": "energy", + "version": "1.8.5" + }, "zigbee": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.zigbee/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.zigbee/master/admin/zigbee.png", "type": "hardware", - "version": "1.8.23" + "version": "1.10.3" }, "zigbee2mqtt": { - "meta": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.zigbee2mqtt/main/io-package.json", - "icon": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.zigbee2mqtt/main/admin/zigbee2mqtt.png", + "meta": "https://raw.githubusercontent.com/arteck/ioBroker.zigbee2mqtt/main/io-package.json", + "icon": "https://raw.githubusercontent.com/arteck/ioBroker.zigbee2mqtt/main/admin/zigbee2mqtt.png", "type": "hardware", - "version": "2.9.0" + "version": "2.13.6" }, "zont": { "meta": "https://raw.githubusercontent.com/kirovilya/ioBroker.zont/master/io-package.json", @@ -2975,6 +3270,6 @@ "meta": "https://raw.githubusercontent.com/AlCalzone/ioBroker.zwave2/master/io-package.json", "icon": "https://raw.githubusercontent.com/AlCalzone/ioBroker.zwave2/master/admin/zwave2.svg?sanitize=true", "type": "hardware", - "version": "3.0.5" + "version": "3.1.0" } } diff --git a/sources-dist.json b/sources-dist.json index 84b2705be..4df4937aa 100644 --- a/sources-dist.json +++ b/sources-dist.json @@ -20,8 +20,8 @@ "type": "network" }, "admin": { - "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/io-package.json", - "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/admin/admin.png", + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/packages/admin/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/packages/admin/admin/admin.png", "type": "general" }, "aio": { @@ -29,6 +29,11 @@ "icon": "https://raw.githubusercontent.com/Newan/ioBroker.aio/master/admin/aio.png", "type": "energy" }, + "air-q": { + "meta": "https://raw.githubusercontent.com/CorantGmbH/ioBroker.air-q/main/io-package.json", + "icon": "https://raw.githubusercontent.com/CorantGmbH/ioBroker.air-q/main/admin/air-q.png", + "type": "weather" + }, "airconwithme": { "meta": "https://raw.githubusercontent.com/weggetor/ioBroker.airconwithme/main/io-package.json", "icon": "https://raw.githubusercontent.com/weggetor/ioBroker.airconwithme/main/admin/airconwithme.png", @@ -79,14 +84,19 @@ "icon": "https://raw.githubusercontent.com/PArns/ioBroker.amazon-dash/master/admin/amazon-dash.png", "type": "hardware" }, + "amtronwallbox": { + "meta": "https://raw.githubusercontent.com/rg-engineering/ioBroker.amtronwallbox/master/io-package.json", + "icon": "https://raw.githubusercontent.com/rg-engineering/ioBroker.amtronwallbox/master/admin/amtronwallbox.png", + "type": "energy" + }, "anelhut": { "meta": "https://raw.githubusercontent.com/dan1-de/ioBroker.anelhut/main/io-package.json", "icon": "https://raw.githubusercontent.com/dan1-de/ioBroker.anelhut/main/admin/anelhut.png", "type": "iot-systems" }, "apcups": { - "meta": "https://raw.githubusercontent.com/xhunter74/ioBroker.apcups/master/io-package.json", - "icon": "https://raw.githubusercontent.com/xhunter74/ioBroker.apcups/master/admin/ups.png", + "meta": "https://raw.githubusercontent.com/XHunter74/ioBroker.apcups/master/io-package.json", + "icon": "https://raw.githubusercontent.com/XHunter74/ioBroker.apcups/master/admin/ups.png", "type": "hardware" }, "apg-info": { @@ -94,11 +104,6 @@ "icon": "https://raw.githubusercontent.com/HGlab01/ioBroker.apg-info/main/admin/apg-info.png", "type": "general" }, - "apple-find-me": { - "meta": "https://raw.githubusercontent.com/PfisterDaniel/ioBroker.apple-find-me/master/io-package.json", - "icon": "https://raw.githubusercontent.com/PfisterDaniel/ioBroker.apple-find-me/master/admin/find-me.png", - "type": "geoposition" - }, "artnet": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.artnet/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.artnet/master/admin/artnet.png", @@ -149,6 +154,16 @@ "icon": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.bambulab/main/admin/bambulab.png", "type": "hardware" }, + "bascloud": { + "meta": "https://raw.githubusercontent.com/bascloud/ioBroker.bascloud/main/io-package.json", + "icon": "https://raw.githubusercontent.com/BAScloud/ioBroker.bascloud/main/admin/bascloud.png", + "type": "communication" + }, + "batrium-bms": { + "meta": "https://raw.githubusercontent.com/bembelstemmer/ioBroker.batrium-bms/main/io-package.json", + "icon": "https://raw.githubusercontent.com/bembelstemmer/ioBroker.batrium-bms/main/admin/batrium-bms.png", + "type": "energy" + }, "beckhoff": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.beckhoff/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.beckhoff/master/admin/beckhoff.png", @@ -204,19 +219,24 @@ "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.bosch-ebike/master/admin/bosch-ebike.png", "type": "vehicle" }, + "boschindego": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.boschindego/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.boschindego/main/admin/boschindego.png", + "type": "garden" + }, "bosesoundtouch": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.bosesoundtouch/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.bosesoundtouch/master/admin/bosesoundtouch.png", "type": "multimedia" }, "botslab360": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.botslab360/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.botslab360/master/admin/botslab360.png", + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.botslab360/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.botslab360/main/admin/botslab360.png", "type": "household" }, "botvac": { - "meta": "https://raw.githubusercontent.com/Pmant/ioBroker.botvac/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pmant/ioBroker.botvac/master/admin/botvac.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.botvac/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.botvac/master/admin/botvac.png", "type": "household" }, "bring": { @@ -225,8 +245,8 @@ "type": "household" }, "broadlink2": { - "meta": "https://raw.githubusercontent.com/frankjoke/ioBroker.broadlink2/master/io-package.json", - "icon": "https://raw.githubusercontent.com/frankjoke/ioBroker.broadlink2/master/admin/broadlink.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.broadlink2/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.broadlink2/master/admin/broadlink.png", "type": "iot-systems" }, "bsblan": { @@ -277,7 +297,7 @@ "chargemaster": { "meta": "https://raw.githubusercontent.com/hombach/ioBroker.chargemaster/master/io-package.json", "icon": "https://raw.githubusercontent.com/hombach/ioBroker.chargemaster/master/admin/chargemaster.png", - "type": "vehicle" + "type": "energy" }, "chromecast": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.chromecast/master/io-package.json", @@ -366,12 +386,12 @@ }, "device-reminder": { "meta": "https://raw.githubusercontent.com/xenon-s/ioBroker.device-reminder/master/io-package.json", - "icon": "https://raw.githubusercontent.com/xenon-s/ioBroker.device-reminder/master/admin/icon.png", - "type": "energy" + "icon": "https://raw.githubusercontent.com/xenon-s/ioBroker.device-reminder/master/admin/device-reminder.png", + "type": "logic" }, "device-watcher": { - "meta": "https://raw.githubusercontent.com/ciddi89/ioBroker.device-watcher/main/io-package.json", - "icon": "https://raw.githubusercontent.com/ciddi89/ioBroker.device-watcher/main/admin/device-watcher.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.device-watcher/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.device-watcher/main/admin/device-watcher.png", "type": "misc-data" }, "devices": { @@ -444,6 +464,11 @@ "icon": "https://raw.githubusercontent.com/git-kick/ioBroker.e3dc-rscp/master/admin/e3dc-rscp.png", "type": "energy" }, + "e3oncan": { + "meta": "https://raw.githubusercontent.com/MyHomeMyData/ioBroker.e3oncan/main/io-package.json", + "icon": "https://raw.githubusercontent.com/MyHomeMyData/ioBroker.e3oncan/main/admin/e3oncan_small.png", + "type": "iot-systems" + }, "easee": { "meta": "https://raw.githubusercontent.com/Newan/ioBroker.easee/master/io-package.json", "icon": "https://raw.githubusercontent.com/Newan/ioBroker.easee/master/admin/easee.png", @@ -469,9 +494,9 @@ "icon": "https://raw.githubusercontent.com/mrbungle64/ioBroker.ecovacs-deebot/master/admin/ecovacs-deebot.png", "type": "household" }, - "egigeozone": { - "meta": "https://raw.githubusercontent.com/BasGo/ioBroker.egigeozone/master/io-package.json", - "icon": "https://raw.githubusercontent.com/BasGo/ioBroker.egigeozone/master/admin/egigeozone.png", + "egigeozone2": { + "meta": "https://raw.githubusercontent.com/obakuhl/ioBroker.egigeozone2/master/io-package.json", + "icon": "https://raw.githubusercontent.com/obakuhl/ioBroker.egigeozone2/master/admin/egigeozone.png", "type": "geoposition" }, "ekey": { @@ -484,21 +509,41 @@ "icon": "https://raw.githubusercontent.com/marc2016/ioBroker.elero-usb-transmitter/master/admin/elero-usb-transmitter.png", "type": "iot-systems" }, + "elgato-key-light": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.elgato-key-light/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.elgato-key-light/main/admin/elgato-key-light.png", + "type": "lighting" + }, "email": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.email/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.email/master/admin/email.png", "type": "messaging" }, "emby": { - "meta": "https://raw.githubusercontent.com/thewhobox/ioBroker.emby/master/io-package.json", - "icon": "https://raw.githubusercontent.com/thewhobox/ioBroker.emby/master/admin/emby.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.emby/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.emby/master/admin/emby.png", "type": "multimedia" }, + "emporia": { + "meta": "https://raw.githubusercontent.com/Chris-656/ioBroker.emporia/main/io-package.json", + "icon": "https://raw.githubusercontent.com/Chris-656/ioBroker.emporia/main/admin/emporia.png", + "type": "energy" + }, "ems-esp": { "meta": "https://raw.githubusercontent.com/tp1de/ioBroker.ems-esp/main/io-package.json", "icon": "https://raw.githubusercontent.com/tp1de/ioBroker.ems-esp/main/admin/ems-esp.png", "type": "climate-control" }, + "energiefluss": { + "meta": "https://raw.githubusercontent.com/SKB-CGN/ioBroker.energiefluss/main/io-package.json", + "icon": "https://raw.githubusercontent.com/SKB-CGN/ioBroker.energiefluss/main/admin/energiefluss.png", + "type": "visualization" + }, + "energiefluss-erweitert": { + "meta": "https://raw.githubusercontent.com/SKB-CGN/ioBroker.energiefluss-erweitert/main/io-package.json", + "icon": "https://raw.githubusercontent.com/SKB-CGN/ioBroker.energiefluss-erweitert/main/admin/energiefluss-erweitert.png", + "type": "visualization" + }, "energymanager": { "meta": "https://raw.githubusercontent.com/unltdnetworx/ioBroker.energymanager/master/io-package.json", "icon": "https://raw.githubusercontent.com/unltdnetworx/ioBroker.energymanager/master/admin/energymanager.png", @@ -530,13 +575,8 @@ "type": "infrastructure" }, "epson_stylus_px830": { - "meta": "https://raw.githubusercontent.com/Pix---/ioBroker.epson_stylus_px830/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pix---/ioBroker.epson_stylus_px830/master/admin/epson_stylus_px830.png", - "type": "infrastructure" - }, - "epson_xp540": { - "meta": "https://raw.githubusercontent.com/tikodu/ioBroker.epson_xp540/master/io-package.json", - "icon": "https://raw.githubusercontent.com/tikodu/ioBroker.epson_xp540/master/admin/epson_xp540.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.epson_stylus_px830/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.epson_stylus_px830/master/admin/epson_stylus_px830.png", "type": "infrastructure" }, "esphome": { @@ -544,6 +584,11 @@ "icon": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.esphome/main/admin/esphome.png", "type": "hardware" }, + "espresense": { + "meta": "https://raw.githubusercontent.com/ticaki/ioBroker.espresense/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ticaki/ioBroker.espresense/main/admin/espresense.png", + "type": "geoposition" + }, "eusec": { "meta": "https://raw.githubusercontent.com/bropat/ioBroker.eusec/master/io-package.json", "icon": "https://raw.githubusercontent.com/bropat/ioBroker.eusec/master/admin/eusec.png", @@ -585,10 +630,15 @@ "type": "infrastructure" }, "feiertage": { - "meta": "https://raw.githubusercontent.com/Pix---/ioBroker.feiertage/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pix---/ioBroker.feiertage/master/admin/feiertage.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.feiertage/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.feiertage/master/admin/feiertage.png", "type": "date-and-time" }, + "fenecon": { + "meta": "https://raw.githubusercontent.com/sg-app/ioBroker.fenecon/main/io-package.json", + "icon": "https://raw.githubusercontent.com/sg-app/ioBroker.fenecon/main/admin/fenecon.png", + "type": "energy" + }, "fhem": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fhem/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fhem/master/admin/fhem.png", @@ -630,13 +680,13 @@ "type": "vehicle" }, "frigate": { - "meta": "https://raw.githubusercontent.com/Bettman66/ioBroker.frigate/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Bettman66/ioBroker.frigate/master/admin/frigate.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.frigate/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.frigate/main/admin/frigate.png", "type": "alarm" }, "fritzbox": { - "meta": "https://raw.githubusercontent.com/ruhr70/ioBroker.fritzbox/master/io-package.json", - "icon": "https://raw.githubusercontent.com/ruhr70/ioBroker.fritzbox/master/admin/fritzbox.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fritzbox/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.fritzbox/master/admin/fritzbox.png", "type": "infrastructure" }, "fritzdect": { @@ -690,8 +740,8 @@ "type": "iot-systems" }, "garmin": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.garmin/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.garmin/master/admin/garmin.png", + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.garmin/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.garmin/main/admin/garmin.png", "type": "health" }, "geofency": { @@ -699,36 +749,46 @@ "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.geofency/master/admin/geofency.png", "type": "geoposition" }, - "gigaset-elements": { - "meta": "https://raw.githubusercontent.com/matthsc/ioBroker.gigaset-elements/main/io-package.json", - "icon": "https://raw.githubusercontent.com/matthsc/ioBroker.gigaset-elements/main/admin/gigaset-elements.png", - "type": "alarm" - }, "gira-iot": { "meta": "https://raw.githubusercontent.com/klein0r/ioBroker.gira-iot/master/io-package.json", "icon": "https://raw.githubusercontent.com/klein0r/ioBroker.gira-iot/master/admin/gira-iot.png", "type": "iot-systems" }, "go-e": { - "meta": "https://raw.githubusercontent.com/MK-2001/ioBroker.go-e/master/io-package.json", - "icon": "https://raw.githubusercontent.com/MK-2001/ioBroker.go-e/master/admin/go-echarger.png", + "meta": "https://raw.githubusercontent.com/MK-2001/ioBroker.go-e/main/io-package.json", + "icon": "https://raw.githubusercontent.com/MK-2001/ioBroker.go-e/main/admin/go-echarger.png", "type": "vehicle" }, + "google-spreadsheet": { + "meta": "https://raw.githubusercontent.com/ThomasPohl/ioBroker.google-spreadsheet/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ThomasPohl/ioBroker.google-spreadsheet/main/admin/google-spreadsheet.png", + "type": "storage" + }, "googleauth": { "meta": "https://raw.githubusercontent.com/Vertumnus/ioBroker.googleauth/master/io-package.json", "icon": "https://raw.githubusercontent.com/Vertumnus/ioBroker.googleauth/master/admin/logo-google.svg", "type": "utility" }, - "govee-local": { - "meta": "https://raw.githubusercontent.com/boergegrunicke/ioBroker.govee-local/main/io-package.json", - "icon": "https://raw.githubusercontent.com/boergegrunicke/ioBroker.govee-local/master/admin/govee-local.png", - "type": "lighting" - }, "gotify": { "meta": "https://raw.githubusercontent.com/ThomasPohl/ioBroker.gotify/main/io-package.json", "icon": "https://raw.githubusercontent.com/ThomasPohl/ioBroker.gotify/main/admin/gotify.png", "type": "messaging" }, + "gotify-ws": { + "meta": "https://raw.githubusercontent.com/simatec/ioBroker.gotify-ws/master/io-package.json", + "icon": "https://raw.githubusercontent.com/simatec/ioBroker.gotify-ws/master/admin/gotify-ws.png", + "type": "messaging" + }, + "govee-local": { + "meta": "https://raw.githubusercontent.com/boergegrunicke/ioBroker.govee-local/main/io-package.json", + "icon": "https://raw.githubusercontent.com/boergegrunicke/ioBroker.govee-local/main/admin/govee-local.png", + "type": "lighting" + }, + "gree-hvac": { + "meta": "https://raw.githubusercontent.com/XHunter74/ioBroker.gree-hvac/master/io-package.json", + "icon": "https://raw.githubusercontent.com/XHunter74/ioBroker.gree-hvac/master/admin/air-conditioner.png", + "type": "climate-control" + }, "growatt": { "meta": "https://raw.githubusercontent.com/PLCHome/ioBroker.growatt/master/io-package.json", "icon": "https://raw.githubusercontent.com/PLCHome/ioBroker.growatt/master/admin/growatt.png", @@ -770,8 +830,8 @@ "type": "iot-systems" }, "harmony": { - "meta": "https://raw.githubusercontent.com/Pmant/ioBroker.harmony/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pmant/ioBroker.harmony/master/admin/harmony.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.harmony/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.harmony/master/admin/harmony.png", "type": "multimedia" }, "hass": { @@ -804,6 +864,11 @@ "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.heizoel/master/admin/heizoel.png", "type": "misc-data" }, + "heizoel24-mex": { + "meta": "https://raw.githubusercontent.com/ltspicer/ioBroker.heizoel24-mex/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ltspicer/ioBroker.heizoel24-mex/main/admin/heizoel24-mex.png", + "type": "metering" + }, "heizungssteuerung": { "meta": "https://raw.githubusercontent.com/jbeenenga/ioBroker.heizungssteuerung/main/io-package.json", "icon": "https://raw.githubusercontent.com/jbeenenga/ioBroker.heizungssteuerung/main/admin/heizungssteuerung.png", @@ -844,6 +909,11 @@ "icon": "https://raw.githubusercontent.com/bondrogeen/iobroker.hilink/master/admin/hilink.png", "type": "hardware" }, + "hiob": { + "meta": "https://raw.githubusercontent.com/moba15/ioBroker.hiob/main/io-package.json", + "icon": "https://raw.githubusercontent.com/moba15/ioBroker.hiob/main/admin/hiob.png", + "type": "visualization" + }, "history": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.history/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.history/master/admin/history.png", @@ -895,8 +965,8 @@ "type": "iot-systems" }, "hoover": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.hoover/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.hoover/master/admin/hoover.png", + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.hoover/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.hoover/main/admin/hoover.png", "type": "household" }, "hp-ilo": { @@ -914,11 +984,6 @@ "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hue/master/admin/hue.jpeg", "type": "lighting" }, - "hue-extended": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hue-extended/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.hue-extended/master/admin/hue-extended.png", - "type": "lighting" - }, "hue-sync-box": { "meta": "https://raw.githubusercontent.com/xXBJXx/ioBroker.hue-sync-box/main/io-package.json", "icon": "https://raw.githubusercontent.com/xXBJXx/ioBroker.hue-sync-box/main/admin/hueSyncBox.png", @@ -930,15 +995,10 @@ "type": "climate-control" }, "hydrawise": { - "meta": "https://raw.githubusercontent.com/SentiQ/ioBroker.hydrawise/master/io-package.json", - "icon": "https://raw.githubusercontent.com/SentiQ/ioBroker.hydrawise/master/admin/hydrawise.jpg", + "meta": "https://raw.githubusercontent.com/SentiQ/ioBroker.hydrawise/main/io-package.json", + "icon": "https://raw.githubusercontent.com/SentiQ/ioBroker.hydrawise/main/admin/hydrawise.jpg", "type": "garden" }, - "hyperion": { - "meta": "https://raw.githubusercontent.com/ruhigundrelaxed/ioBroker.hyperion/master/io-package.json", - "icon": "https://raw.githubusercontent.com/ruhigundrelaxed/ioBroker.hyperion/master/admin/hyperion.png", - "type": "lighting" - }, "hyperion_ng": { "meta": "https://raw.githubusercontent.com/felixganzer/ioBroker.hyperion_ng/master/io-package.json", "icon": "https://raw.githubusercontent.com/felixganzer/ioBroker.hyperion_ng/master/admin/hyperion_ng.png", @@ -969,11 +1029,21 @@ "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-addictive-flavour-png/master/admin/icons-addictive-flavour-png.png", "type": "visualization-icons" }, + "icons-eclipse-smarthome-classic": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-eclipse-smarthome-classic/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-eclipse-smarthome-classic/main/admin/icons-eclipse-smarthome-classic.png", + "type": "visualization-icons" + }, "icons-fatcow-hosting": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-fatcow-hosting/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-fatcow-hosting/master/admin/icons-fatcow-hosting.png", "type": "visualization-icons" }, + "icons-freepic": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-freepic/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-freepic/main/admin/icons-freepic.png", + "type": "visualization-icons" + }, "icons-icons8": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-icons8/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-icons8/master/admin/icons8.png", @@ -1005,6 +1075,11 @@ "url": "https://github.com/ioBroker/ioBroker.icons-open-icon-library-png/tarball/master", "type": "visualization-icons" }, + "icons-smarthome": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-smarthome/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.icons-smarthome/main/admin/icons-smarthome.png", + "type": "visualization-icons" + }, "icons-ultimate-png": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-ultimate-png/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.icons-ultimate-png/master/admin/icons-ultimate-png.png", @@ -1021,8 +1096,8 @@ "type": "messaging" }, "imow": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.imow/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.imow/master/admin/imow.png", + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.imow/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.imow/main/admin/imow.png", "type": "garden" }, "influxdb": { @@ -1030,11 +1105,6 @@ "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.influxdb/master/admin/influxdb.png", "type": "storage" }, - "info": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.info/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.info/master/admin/info.png", - "type": "misc-data" - }, "innogy-smarthome": { "meta": "https://raw.githubusercontent.com/PArns/ioBroker.innogy-smarthome/master/io-package.json", "icon": "https://raw.githubusercontent.com/PArns/ioBroker.innogy-smarthome/master/admin/innogy-smarthome.png", @@ -1055,6 +1125,11 @@ "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.intex/master/admin/intex.png", "type": "household" }, + "iopooleco": { + "meta": "https://raw.githubusercontent.com/mule1972/ioBroker.iopooleco/main/io-package.json", + "icon": "https://raw.githubusercontent.com/mule1972/ioBroker.iopooleco/main/admin/iopooleco.png", + "type": "metering" + }, "iot": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.iot/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.iot/master/admin/iot.png", @@ -1070,6 +1145,11 @@ "icon": "https://raw.githubusercontent.com/iwg-vpn/ioBroker.iwg-vpn/main/admin/iwg-vpn.png", "type": "communication" }, + "jablotron": { + "meta": "https://raw.githubusercontent.com/DEV2DEV-DE/ioBroker.jablotron/main/io-package.json", + "icon": "https://raw.githubusercontent.com/DEV2DEV-DE/ioBroker.jablotron/main/admin/jablotron.png", + "type": "alarm" + }, "janitza-gridvis": { "meta": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.janitza-gridvis/main/io-package.json", "icon": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.janitza-gridvis/main/admin/janitza-gridvis.png", @@ -1092,7 +1172,7 @@ }, "js-controller": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.js-controller/master/packages/controller/io-package.json", - "url": "https://github.com/ioBroker/ioBroker.js-controller/tarball/master", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.js-controller/master/iobroker.png", "type": "general" }, "judoisoft": { @@ -1105,16 +1185,16 @@ "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.kecontact/master/admin/kecontact.png", "type": "hardware" }, + "kisshome-research": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.kisshome-research/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.kisshome-research/main/admin/kisshome-research.png", + "type": "utility" + }, "klf200": { "meta": "https://raw.githubusercontent.com/MiSchroe/ioBroker.klf200/master/io-package.json", "icon": "https://raw.githubusercontent.com/MiSchroe/ioBroker.klf200/master/admin/klf200.png", "type": "hardware" }, - "km200": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.km200/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.km200/master/admin/km200.png", - "type": "climate-control" - }, "knmi-weather": { "meta": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.knmi-weather/main/io-package.json", "icon": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.knmi-weather/main/admin/knmi-weather.png", @@ -1140,11 +1220,6 @@ "icon": "https://raw.githubusercontent.com/klein0r/ioBroker.lametric/master/admin/lametric.png", "type": "hardware" }, - "landroid": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.landroid/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.landroid/master/admin/landroid.png", - "type": "garden" - }, "lcn": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.lcn/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.lcn/master/admin/lcn.png", @@ -1171,8 +1246,8 @@ "type": "household" }, "lgtv": { - "meta": "https://raw.githubusercontent.com/SebastianSchultz/ioBroker.lgtv/master/io-package.json", - "icon": "https://raw.githubusercontent.com/SebastianSchultz/ioBroker.lgtv/master/admin/lgtv.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.lgtv/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.lgtv/master/admin/lgtv.png", "type": "multimedia" }, "lgtv-rs": { @@ -1240,6 +1315,11 @@ "icon": "https://raw.githubusercontent.com/foxriver76/ioBroker.loqed/main/admin/loqed.png", "type": "hardware" }, + "lorawan": { + "meta": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.lorawan/main/io-package.json", + "icon": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.lorawan/main/admin/lorawan.png", + "type": "protocols" + }, "lovelace": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.lovelace/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.lovelace/master/admin/lovelace.png", @@ -1363,9 +1443,7 @@ "meteoalarm": { "meta": "https://raw.githubusercontent.com/jack-blackson/ioBroker.meteoalarm/master/io-package.json", "icon": "https://raw.githubusercontent.com/jack-blackson/ioBroker.meteoalarm/master/admin/meteoalarm.png", - "type": "weather", - "published": "2019-08-12T18:00:00.00Z", - "versionDate": "2019-08-12T18:00:00.000Z" + "type": "weather" }, "micronova": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.micronova/master/io-package.json", @@ -1398,8 +1476,8 @@ "type": "climate-control" }, "mihome-cloud": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.mihome-cloud/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.mihome-cloud/master/admin/mihome-cloud.png", + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.mihome-cloud/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.mihome-cloud/main/admin/mihome-cloud.png", "type": "iot-systems" }, "mihome-lamp": { @@ -1473,8 +1551,8 @@ "type": "protocols" }, "mqtt-client": { - "meta": "https://raw.githubusercontent.com/Pmant/ioBroker.mqtt-client/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pmant/ioBroker.mqtt-client/master/admin/mqtt-client.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mqtt-client/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.mqtt-client/master/admin/mqtt-client.png", "type": "protocols" }, "multicast": { @@ -1517,6 +1595,11 @@ "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.mytime/master/admin/mytime.png", "type": "visualization" }, + "myuplink": { + "meta": "https://raw.githubusercontent.com/sebilm/ioBroker.myuplink/main/io-package.json", + "icon": "https://raw.githubusercontent.com/sebilm/ioBroker.myuplink/main/admin/myuplink.png", + "type": "climate-control" + }, "myvbus": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.myvbus/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.myvbus/master/admin/myvbus.png", @@ -1572,6 +1655,11 @@ "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.niu/master/admin/niu.png", "type": "vehicle" }, + "nmea": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.nmea/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.nmea/main/admin/nmea.png", + "type": "protocols" + }, "node-red": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.node-red/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.node-red/master/admin/node-red.png", @@ -1587,9 +1675,14 @@ "icon": "https://raw.githubusercontent.com/foxriver76/ioBroker.notification-manager/main/admin/notification-manager.png", "type": "utility" }, + "notificationforandroidtv": { + "meta": "https://raw.githubusercontent.com/DNAngelX/ioBroker.notificationforandroidtv/main/io-package.json", + "icon": "https://raw.githubusercontent.com/DNAngelX/ioBroker.notificationforandroidtv/main/admin/notificationforandroidtv.png", + "type": "messaging" + }, "nsclient": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.nsclient/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.nsclient/master/admin/nsclient.png", + "meta": "https://raw.githubusercontent.com/mcm4iob/ioBroker.nsclient/master/io-package.json", + "icon": "https://raw.githubusercontent.com/mcm4iob/ioBroker.nsclient/master/admin/nsclient.png", "type": "infrastructure" }, "nuki": { @@ -1648,8 +1741,8 @@ "type": "multimedia" }, "onvif": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.onvif/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.onvif/master/admin/onvif.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.onvif/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.onvif/main/admin/onvif.png", "type": "infrastructure" }, "opcua": { @@ -1673,10 +1766,15 @@ "type": "iot-systems" }, "openligadb": { - "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.openligadb/master/io-package.json", - "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.openligadb/master/admin/openligadb_b.png", + "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.openligadb/main/io-package.json", + "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.openligadb/main/admin/openligadb_n.png", "type": "misc-data" }, + "opensmartcity": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.opensmartcity/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.opensmartcity/main/admin/opensmartcity.png", + "type": "weather" + }, "opentherm": { "meta": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.opentherm/main/io-package.json", "icon": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.opentherm/main/admin/opentherm.png", @@ -1718,8 +1816,8 @@ "type": "climate-control" }, "panasonic-comfort-cloud": { - "meta": "https://raw.githubusercontent.com/marc2016/ioBroker.panasonic-comfort-cloud/master/io-package.json", - "icon": "https://raw.githubusercontent.com/marc2016/ioBroker.panasonic-comfort-cloud/master/admin/panasonic-comfort-cloud.png", + "meta": "https://raw.githubusercontent.com/marc2016/ioBroker.panasonic-comfort-cloud/main/io-package.json", + "icon": "https://raw.githubusercontent.com/marc2016/ioBroker.panasonic-comfort-cloud/main/admin/panasonic-comfort-cloud.png", "type": "climate-control" }, "panasonic-viera": { @@ -1773,8 +1871,8 @@ "type": "network" }, "pid": { - "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pid/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pid/master/admin/pid.png", + "meta": "https://raw.githubusercontent.com/mcm4iob/ioBroker.pid/master/io-package.json", + "icon": "https://raw.githubusercontent.com/mcm4iob/ioBroker.pid/master/admin/pid.png", "type": "general" }, "piface": { @@ -1823,8 +1921,8 @@ "type": "multimedia" }, "pollenflug": { - "meta": "https://raw.githubusercontent.com/schmupu/ioBroker.pollenflug/master/io-package.json", - "icon": "https://raw.githubusercontent.com/schmupu/ioBroker.pollenflug/master/admin/pollenflug.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pollenflug/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pollenflug/master/admin/pollenflug.png", "type": "weather" }, "porsche": { @@ -1833,8 +1931,8 @@ "type": "vehicle" }, "powerfox2": { - "meta": "https://raw.githubusercontent.com/Ax-LED/ioBroker.powerfox2/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Ax-LED/ioBroker.powerfox2/master/admin/powerfox2.png", + "meta": "https://raw.githubusercontent.com/Ax-LED/ioBroker.powerfox2/main/io-package.json", + "icon": "https://raw.githubusercontent.com/Ax-LED/ioBroker.powerfox2/main/admin/powerfox2.png", "type": "energy" }, "procon-ip": { @@ -1844,7 +1942,7 @@ }, "proxmox": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.proxmox/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.proxmox/master/admin/logo.png", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.proxmox/master/admin/proxmox.png", "type": "infrastructure" }, "proxy": { @@ -1852,19 +1950,14 @@ "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.proxy/master/admin/proxy.png", "type": "network" }, - "psa": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.psa/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.psa/master/admin/psa.png", - "type": "vehicle" - }, "puppeteer": { "meta": "https://raw.githubusercontent.com/foxriver76/ioBroker.puppeteer/main/io-package.json", "icon": "https://raw.githubusercontent.com/foxriver76/ioBroker.puppeteer/main/admin/puppeteer.png", "type": "utility" }, "pushbullet": { - "meta": "https://raw.githubusercontent.com/Jens1809/ioBroker.pushbullet/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Jens1809/ioBroker.pushbullet/master/admin/pushbullet.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pushbullet/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.pushbullet/master/admin/pushbullet.png", "type": "messaging" }, "pushover": { @@ -1887,24 +1980,29 @@ "icon": "https://raw.githubusercontent.com/rg-engineering/ioBroker.pvoutputorg/master/admin/pvoutputorg.png", "type": "energy" }, - "radar2": { - "meta": "https://raw.githubusercontent.com/frankjoke/ioBroker.radar2/master/io-package.json", - "icon": "https://raw.githubusercontent.com/frankjoke/ioBroker.radar2/master/admin/radar2.png", - "type": "network" + "pylontech": { + "meta": "https://raw.githubusercontent.com/PLCHome/ioBroker.pylontech/master/io-package.json", + "icon": "https://raw.githubusercontent.com/PLCHome/ioBroker.pylontech/master/admin/pylontech.png", + "type": "energy" }, "radar-trap": { "meta": "https://raw.githubusercontent.com/Steiger04/ioBroker.radar-trap/main/io-package.json", "icon": "https://raw.githubusercontent.com/Steiger04/ioBroker.radar-trap/main/admin/radar-trap.png", "type": "geoposition" }, + "radar2": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.radar2/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.radar2/master/admin/radar2.png", + "type": "network" + }, "radiohead": { "meta": "https://raw.githubusercontent.com/crycode-de/ioBroker.radiohead/master/io-package.json", "icon": "https://raw.githubusercontent.com/crycode-de/ioBroker.radiohead/master/admin/radiohead.png", "type": "protocols" }, "rainbird": { - "meta": "https://raw.githubusercontent.com/StrathCole/ioBroker.rainbird/master/io-package.json", - "icon": "https://raw.githubusercontent.com/StrathCole/ioBroker.rainbird/master/admin/rainbird.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.rainbird/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.rainbird/master/admin/rainbird.png", "type": "garden" }, "rct": { @@ -1912,11 +2010,26 @@ "icon": "https://raw.githubusercontent.com/aruttkamp/ioBroker.rct/main/admin/rct-logo.square.png", "type": "energy" }, + "remeha-home": { + "meta": "https://raw.githubusercontent.com/simatec/ioBroker.remeha-home/master/io-package.json", + "icon": "https://raw.githubusercontent.com/simatec/ioBroker.remeha-home/master/admin/remeha-home.png", + "type": "climate-control" + }, + "renacidc": { + "meta": "https://raw.githubusercontent.com/raschy/ioBroker.renacidc/main/io-package.json", + "icon": "https://raw.githubusercontent.com/raschy/ioBroker.renacidc/main/admin/renacidc.png", + "type": "energy" + }, "renault": { "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.renault/master/io-package.json", "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.renault/master/admin/renault.png", "type": "vehicle" }, + "reolink": { + "meta": "https://raw.githubusercontent.com/aendue/ioBroker.reolink/main/io-package.json", + "icon": "https://raw.githubusercontent.com/aendue/ioBroker.reolink/main/admin/reolink_logo.png", + "type": "alarm" + }, "residents": { "meta": "https://raw.githubusercontent.com/jpawlowski/ioBroker.residents/main/io-package.json", "icon": "https://raw.githubusercontent.com/jpawlowski/ioBroker.residents/main/admin/residents.svg", @@ -1952,9 +2065,14 @@ "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.ring/master/admin/ring.png", "type": "hardware" }, + "rmb-bhkw": { + "meta": "https://raw.githubusercontent.com/satchafunkilus/ioBroker.rmb-bhkw/master/io-package.json", + "icon": "https://raw.githubusercontent.com/satchafunkilus/ioBroker.rmb-bhkw/master/admin/rmb-bhkw.png", + "type": "energy" + }, "roadtraffic": { - "meta": "https://raw.githubusercontent.com/BuZZy1337/ioBroker.roadtraffic/master/io-package.json", - "icon": "https://raw.githubusercontent.com/BuZZy1337/ioBroker.roadtraffic/master/admin/roadtraffic.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.roadtraffic/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.roadtraffic/master/admin/roadtraffic.png", "type": "misc-data" }, "robonect": { @@ -1974,12 +2092,12 @@ }, "rpi2": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.rpi2/master/io-package.json", - "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.rpi2/master/admin/rpi.png", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.rpi2/master/admin/rpi2.png", "type": "hardware" }, "rssfeed": { - "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.rssfeed/master/io-package.json", - "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.rssfeed/master/admin/rssfeed-logo.png", + "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.rssfeed/main/io-package.json", + "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.rssfeed/main/admin/rssfeed.png", "type": "misc-data" }, "s7": { @@ -1997,6 +2115,11 @@ "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.samsung/master/admin/samsung.png", "type": "multimedia" }, + "samsung_tizen": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.samsung_tizen/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.samsung_tizen/master/admin/samsung.png", + "type": "multimedia" + }, "sanext": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.sanext/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.sanext/master/admin/sanext.png", @@ -2058,8 +2181,8 @@ "type": "weather" }, "seq": { - "meta": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.seq/master/io-package.json", - "icon": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.seq/master/admin/seq.png", + "meta": "https://raw.githubusercontent.com/arteck/ioBroker.seq/master/io-package.json", + "icon": "https://raw.githubusercontent.com/arteck/ioBroker.seq/master/admin/seq.png", "type": "logic" }, "shelly": { @@ -2087,6 +2210,11 @@ "icon": "https://raw.githubusercontent.com/derAlff/ioBroker.signal-cmb/master/admin/signal-cmb.png", "type": "messaging" }, + "signifylights": { + "meta": "https://raw.githubusercontent.com/disaster123/ioBroker.signifylights/main/io-package.json", + "icon": "https://raw.githubusercontent.com/disaster123/ioBroker.signifylights/main/admin/signifylights.png", + "type": "lighting" + }, "simple-api": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.simple-api/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.simple-api/master/admin/simple-api.png", @@ -2132,6 +2260,11 @@ "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.smartthings/master/admin/smartthings.png", "type": "household" }, + "smoothed": { + "meta": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.smoothed/main/io-package.json", + "icon": "https://raw.githubusercontent.com/BenAhrdt/ioBroker.smoothed/main/admin/smoothed.png", + "type": "logic" + }, "snips": { "meta": "https://raw.githubusercontent.com/unltdnetworx/ioBroker.snips/master/io-package.json", "icon": "https://raw.githubusercontent.com/unltdnetworx/ioBroker.snips/master/admin/snips.png", @@ -2148,8 +2281,8 @@ "type": "communication" }, "solaredge": { - "meta": "https://raw.githubusercontent.com/92lleo/ioBroker.solaredge/master/io-package.json", - "icon": "https://raw.githubusercontent.com/92lleo/ioBroker.solaredge/master/admin/solaredge.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.solaredge/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.solaredge/master/admin/solaredge.png", "type": "energy" }, "solarlog": { @@ -2168,8 +2301,8 @@ "type": "energy" }, "solarwetter": { - "meta": "https://raw.githubusercontent.com/Pix---/ioBroker.solarwetter/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pix---/ioBroker.solarwetter/master/admin/solarwetter.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.solarwetter/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.solarwetter/master/admin/solarwetter.png", "type": "weather" }, "solax": { @@ -2177,11 +2310,21 @@ "icon": "https://raw.githubusercontent.com/simatec/ioBroker.solax/master/admin/solax.png", "type": "energy" }, + "soliscloud": { + "meta": "https://raw.githubusercontent.com/Trixx34/ioBroker.soliscloud/main/io-package.json", + "icon": "https://raw.githubusercontent.com/Trixx34/ioBroker.soliscloud/main/admin/solis.png", + "type": "energy" + }, "sonnen": { "meta": "https://raw.githubusercontent.com/foxriver76/ioBroker.sonnen/master/io-package.json", "icon": "https://raw.githubusercontent.com/foxriver76/ioBroker.sonnen/master/admin/sonnen.png", "type": "energy" }, + "sonnen-charger": { + "meta": "https://raw.githubusercontent.com/ChrisWbb/ioBroker.sonnen-charger/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ChrisWbb/ioBroker.sonnen-charger/main/admin/sonnen-charger.png", + "type": "energy" + }, "sonoff": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.sonoff/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.sonoff/master/admin/sonoff.png", @@ -2228,10 +2371,15 @@ "type": "storage" }, "squeezeboxrpc": { - "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.squeezeboxrpc/master/io-package.json", - "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.squeezeboxrpc/master/admin/squeezeboxrpc.png", + "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.squeezeboxrpc/main/io-package.json", + "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.squeezeboxrpc/main/admin/squeezeboxrpc.png", "type": "multimedia" }, + "srm": { + "meta": "https://raw.githubusercontent.com/stephan1827/ioBroker.srm/main/io-package.json", + "icon": "https://raw.githubusercontent.com/stephan1827/ioBroker.srm/main/admin/srm.png", + "type": "hardware" + }, "starline": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.starline/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.starline/master/admin/starline.png", @@ -2252,6 +2400,16 @@ "icon": "https://raw.githubusercontent.com/waoler/iobroker.stockmarket/master/admin/stockmarket.png", "type": "misc-data" }, + "sun2000": { + "meta": "https://raw.githubusercontent.com/bolliy/ioBroker.sun2000/main/io-package.json", + "icon": "https://raw.githubusercontent.com/bolliy/ioBroker.sun2000/main/admin/sun2000.png", + "type": "energy" + }, + "sun2000-modbus": { + "meta": "https://raw.githubusercontent.com/daolis/ioBroker.sun2000-modbus/main/io-package.json", + "icon": "https://raw.githubusercontent.com/daolis/ioBroker.sun2000-modbus/main/admin/sun2000-modbus.png", + "type": "energy" + }, "sureflap": { "meta": "https://raw.githubusercontent.com/Sickboy78/ioBroker.sureflap/master/io-package.json", "icon": "https://raw.githubusercontent.com/Sickboy78/ioBroker.sureflap/master/admin/sureflap.png", @@ -2293,10 +2451,15 @@ "type": "vehicle" }, "tapo": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.tapo/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.tapo/master/admin/tapo.png", + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.tapo/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.tapo/main/admin/tapo.png", "type": "iot-systems" }, + "tedee": { + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.tedee/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.tedee/main/admin/tedee.png", + "type": "hardware" + }, "telegram": { "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.telegram/master/io-package.json", "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.telegram/master/admin/telegram.png", @@ -2387,13 +2550,13 @@ "type": "infrastructure" }, "traccar": { - "meta": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.traccar/master/io-package.json", - "icon": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.traccar/master/admin/traccar.png", + "meta": "https://raw.githubusercontent.com/arteck/ioBroker.traccar/master/io-package.json", + "icon": "https://raw.githubusercontent.com/arteck/ioBroker.traccar/master/admin/traccar.png", "type": "geoposition" }, "tractive-gps": { - "meta": "https://raw.githubusercontent.com/xXBJXx/ioBroker.tractive-gps/main/io-package.json", - "icon": "https://raw.githubusercontent.com/xXBJXx/ioBroker.tractive-gps/main/admin/tractive-gps.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tractive-gps/main/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tractive-gps/main/admin/tractive-gps.png", "type": "geoposition" }, "tradfri": { @@ -2432,8 +2595,8 @@ "type": "misc-data" }, "tvspielfilm": { - "meta": "https://raw.githubusercontent.com/Pix---/ioBroker.tvspielfilm/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pix---/ioBroker.tvspielfilm/master/admin/tvspielfilm.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tvspielfilm/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.tvspielfilm/master/admin/tvspielfilm.png", "type": "misc-data" }, "twinkly": { @@ -2447,8 +2610,8 @@ "type": "network" }, "unifi-protect": { - "meta": "https://raw.githubusercontent.com/peterbaumert/ioBroker.unifi-protect/master/io-package.json", - "icon": "https://raw.githubusercontent.com/peterbaumert/ioBroker.unifi-protect/master/admin/unifi-protect.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.unifi-protect/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.unifi-protect/master/admin/unifi-protect.png", "type": "alarm" }, "upnp": { @@ -2476,10 +2639,10 @@ "icon": "https://raw.githubusercontent.com/Omega236/ioBroker.valuetrackerovertime/master/admin/valuetrackerovertime.png", "type": "misc-data" }, - "vcard": { - "meta": "https://raw.githubusercontent.com/hometm/ioBroker.vcard/master/io-package.json", - "icon": "https://raw.githubusercontent.com/hometm/ioBroker.vcard/master/admin/vcard.png", - "type": "misc-data" + "vbus-gw": { + "meta": "https://raw.githubusercontent.com/pdbjjens/ioBroker.vbus-gw/main/io-package.json", + "icon": "https://raw.githubusercontent.com/pdbjjens/ioBroker.vbus-gw/main/admin/vbus-gw.png", + "type": "network" }, "vds2465-server": { "meta": "https://raw.githubusercontent.com/Hirsch-DE/ioBroker.vds2465-server/main/io-package.json", @@ -2497,8 +2660,8 @@ "type": "household" }, "vesync": { - "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.vesync/master/io-package.json", - "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.vesync/master/admin/vesync.png", + "meta": "https://raw.githubusercontent.com/TA2k/ioBroker.vesync/main/io-package.json", + "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.vesync/main/admin/vesync.png", "type": "climate-control" }, "viessmann": { @@ -2522,8 +2685,8 @@ "type": "visualization" }, "vis-2": { - "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2/master/io-package.json", - "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2/master/admin/vis-2.png", + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2/master/packages/iobroker.vis-2/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2/master/packages/iobroker.vis-2/admin/vis-2.png", "type": "visualization" }, "vis-2-widgets-energy": { @@ -2536,6 +2699,11 @@ "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-gauges/main/admin/vis-2-widgets-gauges.png", "type": "visualization-widgets" }, + "vis-2-widgets-inventwo": { + "meta": "https://raw.githubusercontent.com/inventwo/ioBroker.vis-2-widgets-inventwo/main/io-package.json", + "icon": "https://raw.githubusercontent.com/inventwo/ioBroker.vis-2-widgets-inventwo/main/admin/vis-2-widgets-inventwo.png", + "type": "visualization-widgets" + }, "vis-2-widgets-jaeger-design": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-jaeger-design/main/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-jaeger-design/main/admin/vis-2-widgets-jaeger-design.png", @@ -2546,6 +2714,31 @@ "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-material/main/admin/vis-2-widgets-material.png", "type": "visualization-widgets" }, + "vis-2-widgets-ovarious": { + "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.vis-2-widgets-ovarious/main/io-package.json", + "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.vis-2-widgets-ovarious/main/admin/vis-2-widgets-ovarious.png", + "type": "visualization-widgets" + }, + "vis-2-widgets-radar-trap": { + "meta": "https://raw.githubusercontent.com/Steiger04/ioBroker.vis-2-widgets-radar-trap/main/io-package.json", + "icon": "https://raw.githubusercontent.com/Steiger04/ioBroker.vis-2-widgets-radar-trap/main/admin/vis-2-widgets-radar-trap.png", + "type": "visualization-widgets" + }, + "vis-2-widgets-rssfeed": { + "meta": "https://raw.githubusercontent.com/oweitman/ioBroker.vis-2-widgets-rssfeed/main/io-package.json", + "icon": "https://raw.githubusercontent.com/oweitman/ioBroker.vis-2-widgets-rssfeed/main/admin/vis-2-widgets-rssfeed.png", + "type": "visualization-widgets" + }, + "vis-2-widgets-sweethome3d": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-sweethome3d/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-2-widgets-sweethome3d/main/admin/vis-2-widgets-sweethome3d.png", + "type": "visualization-widgets" + }, + "vis-2-widgets-weather-and-heating": { + "meta": "https://raw.githubusercontent.com/rg-engineering/ioBroker.vis-2-widgets-weather-and-heating/master/io-package.json", + "icon": "https://raw.githubusercontent.com/rg-engineering/ioBroker.vis-2-widgets-weather/master/admin/vis-2-widgets-weather-and-heating.png", + "type": "visualization-widgets" + }, "vis-3dmodel": { "meta": "https://raw.githubusercontent.com/Excodibur/ioBroker.vis-3dmodel/master/io-package.json", "icon": "https://raw.githubusercontent.com/Excodibur/ioBroker.vis-3dmodel/master/admin/vis-3dmodel.png", @@ -2581,6 +2774,11 @@ "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-history/master/admin/vis-history.png", "type": "visualization-widgets" }, + "vis-homekittiles": { + "meta": "https://raw.githubusercontent.com/Standarduser/ioBroker.vis-homekittiles/main/io-package.json", + "icon": "https://raw.githubusercontent.com/Standarduser/ioBroker.vis-homekittiles/main/admin/vis-homekittiles.png", + "type": "visualization-widgets" + }, "vis-hqwidgets": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-hqwidgets/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.vis-hqwidgets/master/admin/hqwidgets.png", @@ -2602,8 +2800,8 @@ "type": "visualization-widgets" }, "vis-justgage": { - "meta": "https://raw.githubusercontent.com/Pmant/ioBroker.vis-justgage/master/io-package.json", - "icon": "https://raw.githubusercontent.com/Pmant/ioBroker.vis-justgage/master/admin/justgage.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vis-justgage/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vis-justgage/master/admin/justgage.png", "type": "visualization-widgets" }, "vis-keyboard": { @@ -2622,8 +2820,8 @@ "type": "visualization-widgets" }, "vis-material": { - "meta": "https://raw.githubusercontent.com/nisiode/ioBroker.vis-material/master/io-package.json", - "icon": "https://raw.githubusercontent.com/nisiode/ioBroker.vis-material/master/admin/material.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vis-material/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vis-material/master/admin/material.png", "type": "visualization-widgets" }, "vis-material-advanced": { @@ -2677,8 +2875,8 @@ "type": "multimedia" }, "vofo-speedtest": { - "meta": "https://raw.githubusercontent.com/peterbaumert/ioBroker.vofo-speedtest/master/io-package.json", - "icon": "https://raw.githubusercontent.com/peterbaumert/ioBroker.vofo-speedtest/master/admin/vofo-speedtest.png", + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vofo-speedtest/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.vofo-speedtest/master/admin/vofo-speedtest.png", "type": "network" }, "voltoplus": { @@ -2721,6 +2919,16 @@ "icon": "https://raw.githubusercontent.com/pottio/ioBroker.warp/main/admin/warp.png", "type": "vehicle" }, + "waterkotte-easycon": { + "meta": "https://raw.githubusercontent.com/theknut/ioBroker.waterkotte-easycon/main/io-package.json", + "icon": "https://raw.githubusercontent.com/theknut/ioBroker.waterkotte-easycon/main/admin/waterkotte-easycon.png", + "type": "climate-control" + }, + "weather-warnings": { + "meta": "https://raw.githubusercontent.com/ticaki/ioBroker.weather-warnings/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ticaki/ioBroker.weather-warnings/main/admin/weather-warnings.png", + "type": "weather" + }, "weatherflow_udp": { "meta": "https://raw.githubusercontent.com/woessmich/ioBroker.weatherflow_udp/master/io-package.json", "icon": "https://raw.githubusercontent.com/woessmich/ioBroker.weatherflow_udp/master/admin/weatherflow_udp.png", @@ -2741,11 +2949,21 @@ "icon": "https://raw.githubusercontent.com/DrozmotiX/ioBroker.web-speedy/main/admin/web-speedy.png", "type": "network" }, + "webcal": { + "meta": "https://raw.githubusercontent.com/dirkhe/ioBroker.webcal/master/io-package.json", + "icon": "https://raw.githubusercontent.com/dirkhe/ioBroker.webcal/master/admin/webcal.png", + "type": "date-and-time" + }, "weblogin": { "meta": "https://raw.githubusercontent.com/Vertumnus/ioBroker.weblogin/master/io-package.json", "icon": "https://raw.githubusercontent.com/Vertumnus/ioBroker.weblogin/master/admin/logo-login.png", "type": "utility" }, + "webui": { + "meta": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.webui/master/io-package.json", + "icon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.webui/master/admin/logo.png", + "type": "visualization" + }, "webuntis": { "meta": "https://raw.githubusercontent.com/Newan/ioBroker.webuntis/main/io-package.json", "icon": "https://raw.githubusercontent.com/Newan/ioBroker.webuntis/main/admin/webuntis.png", @@ -2756,6 +2974,11 @@ "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.weishaupt-wem/master/admin/weishaupt-wem.png", "type": "climate-control" }, + "welcome": { + "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.welcome/main/io-package.json", + "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.welcome/main/admin/welcome.png", + "type": "general" + }, "whatsapp-cmb": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.whatsapp-cmb/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.whatsapp-cmb/master/admin/whatsapp-cmb.png", @@ -2763,7 +2986,7 @@ }, "wiegand-tcpip": { "meta": "https://raw.githubusercontent.com/kBrausew/ioBroker.wiegand-tcpip/master/io-package.json", - "icon": "https://raw.githubusercontent.com/kbrausew/iobroker.wiegand-tcpip/master/admin/wiegand-tcpip.png", + "icon": "https://raw.githubusercontent.com/kBrausew/ioBroker.wiegand-tcpip/master/admin/wiegand-tcpip.png", "type": "hardware" }, "wiffi-wz": { @@ -2896,14 +3119,19 @@ "icon": "https://raw.githubusercontent.com/TA2k/ioBroker.zehnder-cloud/master/admin/zehnder-cloud.png", "type": "climate-control" }, + "zendure-solarflow": { + "meta": "https://raw.githubusercontent.com/nograx/ioBroker.zendure-solarflow/main/io-package.json", + "icon": "https://raw.githubusercontent.com/nograx/ioBroker.zendure-solarflow/main/admin/zendure-solarflow.png", + "type": "energy" + }, "zigbee": { "meta": "https://raw.githubusercontent.com/ioBroker/ioBroker.zigbee/master/io-package.json", "icon": "https://raw.githubusercontent.com/ioBroker/ioBroker.zigbee/master/admin/zigbee.png", "type": "hardware" }, "zigbee2mqtt": { - "meta": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.zigbee2mqtt/main/io-package.json", - "icon": "https://raw.githubusercontent.com/o0shojo0o/ioBroker.zigbee2mqtt/main/admin/zigbee2mqtt.png", + "meta": "https://raw.githubusercontent.com/arteck/ioBroker.zigbee2mqtt/main/io-package.json", + "icon": "https://raw.githubusercontent.com/arteck/ioBroker.zigbee2mqtt/main/admin/zigbee2mqtt.png", "type": "hardware" }, "zoe2": { diff --git a/gulpfile.js b/tasks.js similarity index 79% rename from gulpfile.js rename to tasks.js index 092b5ac61..00c0f6009 100644 --- a/gulpfile.js +++ b/tasks.js @@ -1,67 +1,58 @@ -const gulp = require('gulp'); -const axios = require('axios'); - -// check if all adapters in stable have the version attribute -// and published attribute -gulp.task('init', done => { - const scripts = require('./lib/scripts'); - scripts.init().then(() => done()); -}); - -gulp.task('stable', done => { - const build = require('./lib/build'); - const tools = require('./lib/tools'); - tools.getRepositoryFile(`https://raw.githubusercontent.com/${tools.appName}/${tools.appName}.repositories/master/sources-dist-stable.json`, (err, data) => { - if (err) { - console.error(err); - if (!data) process.exit(1); - } - build.getStats((err, stats) => { - if (stats) { - for (const adapter in stats) { - if (stats.hasOwnProperty(adapter) && data[adapter]) { - data[adapter].stat = stats[adapter]; - } - } - } - build.processRepository(data, ['--file', '/var/www/download/sources-dist-latest.json'], () => - done()); - }); - }); -}); - -gulp.task('latest', done => { - const build = require('./lib/build'); - const tools = require('./lib/tools'); - axios(`https://raw.githubusercontent.com/${tools.appName}/${tools.appName}.repositories/master/sources-dist-stable.json`) - .then(response => { - const latest = response.data; - tools.getRepositoryFile(`https://raw.githubusercontent.com/${tools.appName}/${tools.appName}.repositories/master/sources-dist.json`, latest, (err, data) => { - if (err) { - console.error(err); - !data && process.exit(1); - } - build.getStats((err, stats) => { - if (stats) { - Object.keys(stats).forEach(adapter => { - if (data[adapter]) { - data[adapter].stat = stats[adapter]; - } - }); - } - build.processRepository(data, ['--file', '/var/www/download/sources-dist.json', '--shields', '/var/www/download/img'], () => - done()); - }); - }); - }); -}); - -gulp.task('sort', done => { - const scripts = require('./lib/scripts'); - scripts.sort().then(done); -}); - -gulp.task('nodates', done => { - const scripts = require('./lib/scripts'); - scripts.nodates().then(done); -}); +const axios = require('axios'); + +// check if all adapters in stable have the version attribute +// and published attribute +if (process.argv.includes('--init')) { + const scripts = require('./lib/scripts'); + scripts.init().catch(e => console.error(e)); +} else if (process.argv.includes('--stable')) { + const build = require('./lib/build'); + const tools = require('./lib/tools'); + tools.getRepositoryFile(`https://raw.githubusercontent.com/${tools.appName}/${tools.appName}.repositories/master/sources-dist-stable.json`, (err, data) => { + if (err) { + console.error(err); + if (!data) { + process.exit(1); + } + } + build.getStats((err, stats) => { + if (stats) { + for (const adapter in stats) { + if (stats.hasOwnProperty(adapter) && data[adapter]) { + data[adapter].stat = stats[adapter]; + } + } + } + build.processRepository(data, ['--file', '/var/www/download/sources-dist-latest.json'], () => {}); + }); + }); +} else if (process.argv.includes('--latest')) { + const build = require('./lib/build'); + const tools = require('./lib/tools'); + axios(`https://raw.githubusercontent.com/${tools.appName}/${tools.appName}.repositories/master/sources-dist-stable.json`) + .then(response => { + const latest = response.data; + tools.getRepositoryFile(`https://raw.githubusercontent.com/${tools.appName}/${tools.appName}.repositories/master/sources-dist.json`, latest, (err, data) => { + if (err) { + console.error(err); + !data && process.exit(1); + } + build.getStats((err, stats) => { + if (stats) { + Object.keys(stats).forEach(adapter => { + if (data[adapter]) { + data[adapter].stat = stats[adapter]; + } + }); + } + build.processRepository(data, ['--file', '/var/www/download/sources-dist.json', '--shields', '/var/www/download/img'], () => {}); + }); + }); + }); +} else if (process.argv.includes('--sort')) { + const scripts = require('./lib/scripts'); + scripts.sort().catch(e => console.error(e)); +} else if (process.argv.includes('--nodates')) { + const scripts = require('./lib/scripts'); + scripts.nodates().catch(e => console.error(e)); +}