From f6ad5379cc3a7895e4005fbd58a4dcbdfa31e89d Mon Sep 17 00:00:00 2001 From: "Community Hass.io Add-ons Bot" Date: Thu, 28 Jan 2021 20:00:31 +0000 Subject: [PATCH] :tada: Release of add-on Z-Wave JS to MQTT 0.1.0 --- README.md | 23 +++++ zwavejs2mqtt/CHANGELOG.md | 11 +++ zwavejs2mqtt/DOCS.md | 182 ++++++++++++++++++++++++++++++++++++++ zwavejs2mqtt/README.md | 60 +++++++++++++ zwavejs2mqtt/config.json | 30 +++++++ zwavejs2mqtt/icon.png | Bin 0 -> 6136 bytes zwavejs2mqtt/logo.png | Bin 0 -> 11491 bytes 7 files changed, 306 insertions(+) create mode 100644 zwavejs2mqtt/CHANGELOG.md create mode 100644 zwavejs2mqtt/DOCS.md create mode 100644 zwavejs2mqtt/README.md create mode 100644 zwavejs2mqtt/config.json create mode 100644 zwavejs2mqtt/icon.png create mode 100644 zwavejs2mqtt/logo.png diff --git a/README.md b/README.md index 9393dcd3..6a6c0663 100644 --- a/README.md +++ b/README.md @@ -531,6 +531,19 @@ Fast, modern, secure VPN tunnel [:books: WireGuard add-on documentation][addon-doc-wireguard] +### ✓ [Z-Wave JS to MQTT][addon-zwavejs2mqtt] + +![Latest Version][zwavejs2mqtt-version-shield] +![Supports armhf Architecture][zwavejs2mqtt-armhf-shield] +![Supports armv7 Architecture][zwavejs2mqtt-armv7-shield] +![Supports aarch64 Architecture][zwavejs2mqtt-aarch64-shield] +![Supports amd64 Architecture][zwavejs2mqtt-amd64-shield] +![Supports i386 Architecture][zwavejs2mqtt-i386-shield] + +Fully configurable Z-Wave JS to MQTT gateway and control panel + +[:books: Z-Wave JS to MQTT add-on documentation][addon-doc-zwavejs2mqtt] + ### ✓ [Z-Wave to MQTT][addon-zwave2mqtt] ![Latest Version][zwave2mqtt-version-shield] @@ -663,6 +676,7 @@ on the correct GitHub repository matching the add-on. - [Open an issue for the add-on: UniFi Controller][unifi-issue] - [Open an issue for the add-on: Visual Studio Code][vscode-issue] - [Open an issue for the add-on: WireGuard][wireguard-issue] +- [Open an issue for the add-on: Z-Wave JS to MQTT][zwavejs2mqtt-issue] - [Open an issue for the add-on: Z-Wave to MQTT][zwave2mqtt-issue] - [Open an issue for the add-on: ZeroTier One][zerotier-issue] - [Open an issue for the add-on: chrony][chrony-issue] @@ -1057,6 +1071,15 @@ SOFTWARE. [wireguard-armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg [wireguard-armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg [wireguard-i386-shield]: https://img.shields.io/badge/i386-yes-green.svg +[addon-zwavejs2mqtt]: https://github.com/hassio-addons/addon-zwavejs2mqtt/tree/v0.1.0 +[addon-doc-zwavejs2mqtt]: https://github.com/hassio-addons/addon-zwavejs2mqtt/blob/v0.1.0/README.md +[zwavejs2mqtt-issue]: https://github.com/hassio-addons/addon-zwavejs2mqtt/issues +[zwavejs2mqtt-version-shield]: https://img.shields.io/badge/version-v0.1.0-blue.svg +[zwavejs2mqtt-aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[zwavejs2mqtt-amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[zwavejs2mqtt-armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[zwavejs2mqtt-armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg +[zwavejs2mqtt-i386-shield]: https://img.shields.io/badge/i386-yes-green.svg [addon-zwave2mqtt]: https://github.com/hassio-addons/addon-zwave2mqtt/tree/v0.9.0 [addon-doc-zwave2mqtt]: https://github.com/hassio-addons/addon-zwave2mqtt/blob/v0.9.0/README.md [zwave2mqtt-issue]: https://github.com/hassio-addons/addon-zwave2mqtt/issues diff --git a/zwavejs2mqtt/CHANGELOG.md b/zwavejs2mqtt/CHANGELOG.md new file mode 100644 index 00000000..c4cdea74 --- /dev/null +++ b/zwavejs2mqtt/CHANGELOG.md @@ -0,0 +1,11 @@ +## Whatโ€™s changed + +The initial release of the Z-Wave JS to MQTT add-on ๐ŸŽ‰ + +## โœจ New features + +- Add initial add-on code @frenck (#1) + +## ๐Ÿ“š Documentation + +- Extend setup instructions @frenck (#2) diff --git a/zwavejs2mqtt/DOCS.md b/zwavejs2mqtt/DOCS.md new file mode 100644 index 00000000..0bab822d --- /dev/null +++ b/zwavejs2mqtt/DOCS.md @@ -0,0 +1,182 @@ +# Home Assistant Community Add-on: Z-Wave JS to MQTT + +The Z-Wave JS to MQTT add-on allows you to decouple your Z-Wave network from +your Home Assistant instance by leveraging your MQTT broker. It ships with +a web-based control panel, allowing you to configure every aspect of your +Z-Wave network and how they are published in MQTT. + +Some advantages and use-cases for this are: + +- Compatible with the Home Assistant Z-Wave JS integration. +- Your Z-Wave network will keep running between Home Assistant restarts. +- You can directly use things like Node-RED with your Z-Wave network, while + it is available for Home Assistant at the same time. +- Allow [ESPHome.io][esphome] based ESP devices to directly respond or work + with your Z-Wave network. + +This add-on uses the [Zwavejs2Mqtt][zwavejs2mqtt] software. + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Home Assistant add-on. + +1. Search for the "Z-Wave JS to MQTT" add-on in the Supervisor add-on store + and install it. +1. Start the "Z-Wave JS to MQTT" add-on. +1. Check the logs of the "Z-Wave JS to MQTT" add-on to see if everything went + well. +1. Click the "OPEN WEB UI" button. +1. Enjoy the add-on! + +**NOTE**: The upstream project has documentation on using the software itself: + + +## Setting up the Home Assistant Z-Wave JS integration + +By default the Home Assistant Z-Wave JS integration will try to set up the +official "Z-Wave JS" add-on from the official add-on store. + +**It is recommended to use the official add-on instead of this one!** + +However, this add-on will provide an add-on UI and has the ability to +send/receive data over MQTT as well. So, if that is your thing, this +add-on might be for you. + +After starting the add-on successfully, it is time to hook it up with +Home Assistant. + +To do this: + +1. Open the Z-Wave JS to MQTT control panel by clikcing the "OPEN WEB UI" + button on the add-on page in the Supervisor. +1. In the control panel, go to "Settings" in the menu and click on the "Zwave" + bar that shows up on the right. +1. Enter the following information: + - Serial Port (e.g., `/dev/serial/by-id/usb-0658_0200_if00`) + - Network Key (e.g., `2232666D100F795E5BB17F0A1BB7A146`) + - **Enable the WS Server** checkbox! + +You can check the "Disable Gateway" box for now, as you can set up MQTT +later (if you like that is). + +Now click the "SAVE" button and navigate to the "Control Panel" in the menu. +If you had devices paired already, you should see the showing up slowly. + +Now it is time to set up Home Assistant: + +1. Go to the Configuration panel and click "Integrations". +1. In the bottom left, click "+ Add Integration". +1. Select the "Z-Wave JS" integration from the list. +1. A dialog box will show, asking to use the add-on: + - **UNCHECK** that box, it will install the officia add-on. + - Again, the official add-on is recommended, so... +1. In the next dialog it will ask for the server. Enter: + `ws://a0d7b954-zwavejs2mqtt:3000` +1. Confirm and done! + +## Configuration + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```yaml +log_level: info +``` + +### Option: `log_level` + +The `log_level` option controls the level of log output by the addon and can +be changed to be more or less verbose, which might be useful when you are +dealing with an unknown issue. Possible values are: + +- `trace`: Show every detail, like all called internal functions. +- `debug`: Shows detailed debug information. +- `info`: Normal (usually) interesting events. +- `warning`: Exceptional occurrences that are not errors. +- `error`: Runtime errors that do not require immediate action. +- `fatal`: Something went terribly wrong. Add-on becomes unusable. + +Please note that each level automatically includes log messages from a +more severe level, e.g., `debug` also shows `info` messages. By default, +the `log_level` is set to `info`, which is the recommended setting unless +you are troubleshooting. + +## Known issues and limitations + +- Z-Wave JS to MQTT supports Home Assistant Discovery over MQTT. It is + **STRONGLY** recommended **NOT** to use that option. Use the Z-Wave JS + integration as documented above instead. + +## Changelog & Releases + +This repository keeps a change log using [GitHub's releases][releases] +functionality. + +Releases are based on [Semantic Versioning][semver], and use the format +of `MAJOR.MINOR.PATCH`. In a nutshell, the version will be incremented +based on the following: + +- `MAJOR`: Incompatible or major changes. +- `MINOR`: Backwards-compatible new features and enhancements. +- `PATCH`: Backwards-compatible bugfixes and package updates. + +## Support + +Got questions? + +You have several options to get them answered: + +- The [Home Assistant Community Add-ons Discord chat server][discord] for add-on + support and feature requests. +- The [Home Assistant Discord chat server][discord-ha] for general Home + Assistant discussions and questions. +- The Home Assistant [Community Forum][forum]. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +You could also [open an issue here][issue] GitHub. + +## Authors & contributors + +The original setup of this repository is by [Franck Nijhof][frenck]. + +For a full list of all authors and contributors, +check [the contributor's page][contributors]. + +## License + +MIT License + +Copyright (c) 2021 Franck Nijhof + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +[contributors]: https://github.com/hassio-addons/addon-zwavejs2mqtt/graphs/contributors +[discord-ha]: https://discord.gg/c5DvZ4e +[discord]: https://discord.me/hassioaddons +[esphome]: https://esphome.io/components/mqtt.html#on-message-trigger +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/?u=frenck +[frenck]: https://github.com/frenck +[issue]: https://github.com/hassio-addons/addon-zwavejs2mqtt/issues +[reddit]: https://reddit.com/r/homeassistant +[releases]: https://github.com/hassio-addons/addon-zwavejs2mqtt/releases +[semver]: http://semver.org/spec/v2.0.0.htm +[zwavejs2mqtt]: https://github.com/zwave-js/zwavejs2mqtt diff --git a/zwavejs2mqtt/README.md b/zwavejs2mqtt/README.md new file mode 100644 index 00000000..db15b603 --- /dev/null +++ b/zwavejs2mqtt/README.md @@ -0,0 +1,60 @@ +# Home Assistant Community Add-on: Z-Wave JS to MQTT + +[![Release][release-shield]][release] ![Project Stage][project-stage-shield] ![Project Maintenance][maintenance-shield] + +[![Discord][discord-shield]][discord] [![Community Forum][forum-shield]][forum] + +[![Sponsor Frenck via GitHub Sponsors][github-sponsors-shield]][github-sponsors] + +[![Support Frenck on Patreon][patreon-shield]][patreon] + +Fully configurable Z-Wave JS to MQTT gateway and control panel. + +![Z-Wave JS to MQTT][logo] + +## About + +The Z-Wave JS to MQTT add-on allows you to decouple your Z-Wave network from +your Home Assistant instance by leveraging your MQTT broker. It ships with +a web-based control panel, allowing you to configure every aspect of your +Z-Wave network and how they are published in MQTT. + +Some advantages and use-cases for this are: + +- Compatible with the Home Assistant Z-Wave JS integration. +- Your Z-Wave network will keep running between Home Assistant restarts. +- You can directly use things like Node-RED with your Z-Wave network, while + it is available for Home Assistant at the same time. +- Allow [ESPHome.io][esphome] based ESP devices to directly respond or work + with your Z-Wave network. + +## WARNING! THIS IS A BETA VERSION! + +This Home Assistant Add-ons repository contains beta releases of add-ons. + +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. + +If you are more interested in stable releases of our add-ons: + + + +[discord-shield]: https://img.shields.io/discord/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[esphome]: https://esphome.io/components/mqtt.html#on-message-trigger +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/?u=frenck +[github-sponsors-shield]: https://frenck.dev/wp-content/uploads/2019/12/github_sponsor.png +[github-sponsors]: https://github.com/sponsors/frenck +[logo]: https://github.com/hassio-addons/addon-zwavejs2mqtt/raw/main/zwavejs2mqtt/logo.png +[maintenance-shield]: https://img.shields.io/maintenance/yes/2021.svg +[patreon-shield]: https://frenck.dev/wp-content/uploads/2019/12/patreon.png +[patreon]: https://www.patreon.com/frenck +[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[release-shield]: https://img.shields.io/badge/version-v0.1.0-blue.svg +[release]: https://github.com/hassio-addons/addon-zwavejs2mqtt/tree/v0.1.0 \ No newline at end of file diff --git a/zwavejs2mqtt/config.json b/zwavejs2mqtt/config.json new file mode 100644 index 00000000..068c0a2f --- /dev/null +++ b/zwavejs2mqtt/config.json @@ -0,0 +1,30 @@ +{ + "name": "Z-Wave JS to MQTT", + "version": "0.1.0", + "slug": "zwavejs2mqtt", + "description": "Fully configurable Z-Wave JS to MQTT gateway and control panel", + "url": "https://github.com/hassio-addons/addon-zwavejs2mqtt", + "ingress": true, + "panel_title": "Z-Wave JS", + "panel_icon": "mdi:z-wave", + "startup": "system", + "init": false, + "arch": [ + "aarch64", + "amd64", + "armhf", + "armv7", + "i386" + ], + "discovery": [ + "zwave_js" + ], + "auto_uart": true, + "map": [ + "share:rw" + ], + "schema": { + "log_level": "list(trace|debug|info|notice|warning|error|fatal)?" + }, + "image": "ghcr.io/hassio-addons/zwavejs2mqtt/{arch}" +} \ No newline at end of file diff --git a/zwavejs2mqtt/icon.png b/zwavejs2mqtt/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..360d704d5e5df6947575eedd1a9703d866ed14e0 GIT binary patch literal 6136 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 literal 0 HcmV?d00001 diff --git a/zwavejs2mqtt/logo.png b/zwavejs2mqtt/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a5933418b9a2054abcc132c272a34c2330b9a47a GIT binary patch literal 11491 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 Y*|R{g%c9!eUtF)Oq$0RR+%Wk60A9L9r~m)} literal 0 HcmV?d00001