From 5e635e409a402843a689367cd8c2a1973f01640e Mon Sep 17 00:00:00 2001 From: joBr99 <29555657+joBr99@users.noreply.github.com> Date: Mon, 7 Mar 2022 00:11:34 +0100 Subject: [PATCH] rewrite docs --- .github/workflows/hassfest.yaml | 14 --- README.md | 170 +++++++++++++++++++++++++++++++- doc-pics/hass-add-on-store.png | Bin 0 -> 13574 bytes hacs.json | 4 +- info.md | 2 +- 5 files changed, 171 insertions(+), 19 deletions(-) delete mode 100644 .github/workflows/hassfest.yaml create mode 100644 doc-pics/hass-add-on-store.png diff --git a/.github/workflows/hassfest.yaml b/.github/workflows/hassfest.yaml deleted file mode 100644 index cfa0f62f..00000000 --- a/.github/workflows/hassfest.yaml +++ /dev/null @@ -1,14 +0,0 @@ -name: Validate with hassfest - -on: - push: - pull_request: - schedule: - - cron: '0 0 * * *' - -jobs: - validate: - runs-on: "ubuntu-latest" - steps: - - uses: "actions/checkout@v2" - - uses: "home-assistant/actions/hassfest@master" \ No newline at end of file diff --git a/README.md b/README.md index 118a3b5c..d80c7e3e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,174 @@ -# NSPanel Lovelance UI +# NSPanel Lovelace UI -This is a custom UI for the NSPanel, with HomeAssistant Lovelance UI Design. +This is a custom UI for the NSPanel, with HomeAssistant Lovelace UI Design. + +![hacs validation](https://github.com/joBr99/nspanel-lovelace-ui/actions/workflows/hacs-validation.yaml/badge.svg) + +NsPanel Lovelace UI is a Firmware for the nextion screen inside of NSPanel in the Design of [HomeAssistant](https://www.home-assistant.io/)'s Lovelace UI Design. + +It works with [Tasmota](https://tasmota.github.io/docs/) over MQTT. +To control the panel and update it with content from HomeAssistant there is an [AppDeamon](https://github.com/AppDaemon/appdaemon) App. + +- [How It Works](#how-it-works) +- [Requirements](#requirements) + +- [Installation - Home Automation Part](#installation-home-automation-part) + - [Installing Home Assistant](#installing-home-assistant) + - [Installing an MQTT Broker](#installing-an-mqtt-broker) + - [Installing AppDaemon](#installing-appdaemon) + - [Installing Studio Code Server (optional, recommended)](#installing-studio-code-server-optional-recommended) + - [Installing HACS (optional, recommended)](#installing-hacs-optional-recommended) + - [Installing AppDeamon Backend Application](#installing-appdeamon-backend-application) + - [With HACS (recommended)](#with-hacs-recommended) + - [Manually](#manually) + - [Installing Tasmota to your NSPanel](#installing-tasmota-to-your-nspanel) + +- [Installation - NSPanel Part](#installation-nspanel-part) + - [Flash Tasmota to your NSPanel](#flash-tasmota-to-your-nspanel) + - [Configure Tasmota Template for NSPanel](#configure-tasmota-template-for-nspanel) + - [Setup your MQTT Server in Tasmota](#setup-your-mqtt-server-in-tasmota) + - [Upload Berry Driver to Tasmota](#upload-berry-driver-to-tasmota) + - [Flash Firmware to Nextion Screen](#flash-firmware-to-nextion-screen) + +- [Configuration](#configuration) + - [Configuring the MQTT integration in AppDaemon](#configuring-the-mqtt-integration-in-appdaemon) + - [Configure your NSPanel in AppDaemon](#configure-your-nspanel-in-appdaemon) + + + +## How It Works + +## Requirements + +## Installation - Home Automation Part + +### Installing Home Assistant + +You can get to the [Home Assistant documentation for installation](https://www.home-assistant.io/installation/) +page in order to setup Home Assistant for your needs. + +### Installing an MQTT Broker + +You will require a working MQTT broker alongside your HomeAssistant +installation. HomeAssistant provides [documentation on how to install +and configure an MQTT broker](https://www.home-assistant.io/docs/mqtt/broker). + +### Installing AppDaemon + +The recommended backend application for this firmware is written in a python for [AppDeamon](https://github.com/AppDaemon/appdaemon). +This means it requires a working and running version of AppDaemon. + +The easiest way to install it is through HomeAssistant's Supervisor Add-on Store, it will be automaticly connected to your HomeAssistant Instance. + +![hass-add-on-store](doc-pics/hass-add-on-store.png) + +### Installing Studio Code Server (optional, recommended) + +You will need a way a way to edit the `apps.yaml` config file in the appdeamon folder. +Install Studio Code Server from ome Assistant's Supervisor Add-on Store to easily edit configuration Files on your HomeAssistant Instance. + +### Installing HACS (optional, recommended) + +HACS is the Home Assistant Community Store and allows for community integrations and +automations to be updated cleanly and easily from the Home Assistant web user interface. +It's simple to install the appdeamon app without HACS, but keeping up to date requires +manual steps that HACS will handle for you: you will be notified of updates, and they +can be installed by a click on a button. + +If you want to use HACS, you will have to follow [their documentation on how to install HACS](https://hacs.xyz/docs/setup/download). + +### Installing AppDeamon Backend Application + +#### With HACS (recommended) + +To install Qolsys Gateway with HACS, you will need to make sure that you enabled +AppDaemon automations in HACS, as these are not enabled by default: + +1. Click on `Configuration` on the left menu bar in Home Assistant Web UI +2. Select `Devices & Services` +3. Select `Integrations` +4. Find `HACS` and click on `Configure` +5. In the window that opens, make sure that `Enable AppDaemon apps discovery & tracking` + is checked, or check it and click `Submit` +6. If you just enabled this (or just installed HACS), you might have to wait a few minutes + as all repositories are being fetched; you might hit a GitHub rate limit, which might + then require you to wait a few hours for HACS to be fully configured. In this case, + you won't be able to proceed to the next steps until HACS is ready. + +The Backend Application for this project is not yet in the default applications available in HACS. +You will need to add Qolsys Gateway as a custom repository in HACS. In order +to do so: + +1. Click on `HACS` on the left menu bar in Home Assistant Web UI +2. Click on `Automations` in the right panel +3. Click on the three dots in the top right corner +4. Select `Custom repositories` +5. In the form that appears, write `joBr99/nspanel-lovelace-ui` as repository, + and select `AppDaemon` as category +6. Click on `ADD` +7. Qolsys Gateway is now available to be installed and managed with HACS + +Now, to install Qolsys Gateway with HACS, follow these steps: + +1. Click on `HACS` on the left menu bar in Home Assistant Web UI +2. Click on `Automations` in the right panel +3. Click on `Explore & download repositories` in the bottom right corner +4. Search for `nspanel-lovelace-ui`, and click on `NSPanel Lovelance UI` in the list that appears +5. In the bottom right corner of the panel that appears, click on + `Download this repository with HACS` +6. A confirmation panel will appear, click on `Download`, and wait for HACS to + proceed with the download +6. The Backend Application is now installed, and HACS will inform you when updates are available + +#### Manually + +Installing the Backend Application manually can be summarized by putting the content of the +`apps/` directory of this repository (the `qolsysgw/` directory) into the `apps/` +directory of your AppDaemon installation. + + +## Installation - NSPanel Part + +### Flash Tasmota to your NSPanel + +### Configure Tasmota Template for NSPanel + +### Setup your MQTT Server in Tasmota + +### Upload Berry Driver to Tasmota + +### Flash Firmware to Nextion Screen + + +## Configuration + +### Configuring the MQTT integration in AppDaemon + +### Configure your NSPanel in AppDaemon + + + + + + + + + + + + + + + + + + + +# Old Docs + + The general idea is that the Nextion Display cycles though a page counter and the esp32 tells the display what to do. If you are changeing the page the nextion display will send and event to the esp32 and it has to answer with the messages, that will update the current page with it's desired components. This enables easy changes, without touching the HMI Project. diff --git a/doc-pics/hass-add-on-store.png b/doc-pics/hass-add-on-store.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9d5458913592f18fb353dd9efa0892ded0b001 GIT binary patch literal 13574 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