From 04d89fd157f156fb280fdd1e891cf4a3d3e9ea23 Mon Sep 17 00:00:00 2001 From: Administrator Date: Sun, 18 Feb 2024 08:54:49 +0100 Subject: [PATCH] docs: update homeassistant/HA_part_1 --- homeassistant/HA_part_1.md | 10149 +---------------------------------- 1 file changed, 173 insertions(+), 9976 deletions(-) diff --git a/homeassistant/HA_part_1.md b/homeassistant/HA_part_1.md index 45e0f26..56cad9c 100644 --- a/homeassistant/HA_part_1.md +++ b/homeassistant/HA_part_1.md @@ -2,7 +2,7 @@ title: Homeassistant Part 1 description: published: 1 -date: 2024-02-09T21:51:00.217Z +date: 2024-02-18T07:54:46.237Z tags: editor: markdown dateCreated: 2024-02-03T20:23:54.798Z @@ -12,10017 +12,214 @@ dateCreated: 2024-02-03T20:23:54.798Z Need to access time sensor - - alternatively, use now - - template: - trigger: -- platform: time_pattern -seconds: "/1" -sensor: -- name: time -state: "{{ now().strftime('%H:%M:%S') }}" + - platform: time_pattern + seconds: "/1" + sensor: + - name: time + state: "{{ now().strftime('%H:%M:%S') }}" {{ now().strftime("%I:%M %p") }} -{{ as_timestamp(state_attr("device_tracker.android_9050f88e39898022", -"last_time_reachable")) | timestamp_local }} -{##{{ state_attr("device_tracker.android_9050f88e39898022", -"last_time_reachable").strftime('%H:%M:%S') }}##} - -- condition: template -value_template: '"{{ now().timestamp()+300 < -(as_timestamp(state_attr("device_tracker.android_9050f88e39898022", -"last_time_reachable")) | float) -}}"' - - - - +{{ as_timestamp(state_attr("device_tracker.android_9050f88e39898022", "last_time_reachable")) | timestamp_local }} +{##{{ state_attr("device_tracker.android_9050f88e39898022", "last_time_reachable").strftime('%H:%M:%S') }}##} + - condition: template + value_template: '"{{ now().timestamp()+300 < (as_timestamp(state_attr("device_tracker.android_9050f88e39898022", "last_time_reachable")) | float) + }}"' Change attribute value via automation - - - - -\- id: automation 3 - -trigger: - -platform: time_pattern - -minutes: '/1' - -action: - -service: python_script.set_state - -data_template: - -entity_id: sensor.cold_water_rate - -state: 42 - - - - - - - - - - - - - - - -# new HA OS on RaPi4 {#new-ha-os-on-rapi4 .western} - -http://192.168.178.52:8123/ - -- [create user]{style="background: #e8f2a1"} - - - [user: bora, pass: bora]{style="background: #e8f2a1"} - -- [select location]{style="background: #e8f2a1"} - -- activate advanced mode under profile settings - -- install add ons - - - [Samba share]{style="background: #e8f2a1"} - - - [username: homeassistant, password: bora, workgroup: - WORKGROUP]{style="background: #e8f2a1"} - - - [add a new network location: - \\\\192.168.178.52\\config]{style="background: #e8f2a1"} - - - [file editor]{style="background: #e8f2a1"} - - - [duckdns]{style="background: #e8f2a1"} - - - [domains: - \- habora.duckdns.org - token: 799093a4-0b34-454f-99cb-25a4637bf404 - aliases: [] - lets_encrypt: - accept_terms: true - algo: secp384r1 - certfile: fullchain.pem - keyfile: privkey.pem - seconds: 300]{style="background: #e8f2a1"} - - - - [MariaDB]{style="background: #e8f2a1"} - - - [databases: - \- homeassistant - logins: - \- username: homeassistant - password: password1234 - \- username: read_only_user - password: password1234 - rights: - \- username: homeassistant - database: homeassistant - \- username: read_only_user - database: homeassistant - privileges: - \- SELECT]{style="background: #e8f2a1"} - - - [recorder: - db_url: - mysql://homeassistant:password@core-mariadb/homeassistant?charset=utf8mb4]{style="background: #e8f2a1"} - - - - [Nginx Proxy Manager]{style="background: #e8f2a1"} - - - [Open WebUI → admin@example.com / - changeme]{style="background: #e8f2a1"} - - - [Hosts -- Proxy Hosts → Add Proxy - Host]{style="background: #e8f2a1"} - - - [Domain Names: - habora.duckdns.org]{style="background: #e8f2a1"} - - - [Als Scheme wählt Ihr http, unter „Forward Hostname / IP" - tragt Ihr die IP eures Home Assistant ein. → - 192.168.178.52]{style="background: #e8f2a1"} - - - [Bei Forward Port gebt Ihr den Port ein, unter dem euer Home - Assistant erreichbar ist. (Standardmäßig ist das der Port - 8123)]{style="background: #e8f2a1"} - - - [Aktiviert abschließend noch den Punkt „Websockets - Support„.]{style="background: #e8f2a1"} - - - [Anschließend wechselt Ihr auf den Reiter - SSL.]{style="background: #e8f2a1"} - - - [Hier wählt ihr unter „SSL Certificate" den Eintrag „Request - a new SSL Certificate" um ein neues Zertifikat zu erstellen - aus.]{style="background: #e8f2a1"} - - - [Aktiviert nun den Punkt „Force SSL„, tragt eine gültige - Email-Adresse für eure Zertifikat ein und akzeptiert die - Let's Encrypt Bedingungen durch aktivieren der Option am - unteren Rand der Dialog.]{style="background: #e8f2a1"} - - - [Bestätigt nun die Eingaben durch einen Klick auf „Save" und - wartet, bis der Vorgang abgeschlossen - ist.]{style="background: #e8f2a1"} - - - [Dann werden im Hintergrund die Zertifikate von Let's - Encrypt generiert. Das kann einen Augenblick in Anspruch - nehmen.]{style="background: #e8f2a1"} - - - [Das registrieren des Zertifikates funktioniert nur, wenn - die eingetragene Domain auch auf eure externe IP zeigt, und - die Ports 80 und 443 auf die Home Assistant IP - weitergeleitet sind.]{style="background: #e8f2a1"} - - - [![](Home_assistant_html_eeaf4fb9a08969e4.png){#Image51 - align="bottom" width="547" height="113" border="0"} - ]{style="background: #e8f2a1"} - ![home_assistant_html_eeaf4fb9a08969e4.png](/pictures/home_assistant_html_eeaf4fb9a08969e4.png) - - - [configuration.yaml]{style="background: #e8f2a1"} - - - [http:]{style="background: #e8f2a1"} - - - [ use_x_forwarded_for: - true]{style="background: #e8f2a1"} - - - [ trusted_proxies:]{style="background: #e8f2a1"} - - - [ - 127.0.0.1]{style="background: #e8f2a1"} - - - [ - 172.30.33.0/24]{style="background: #e8f2a1"} - - - [ - ::1]{style="background: #e8f2a1"} - - - [Let\'s Encrypt]{style="background: transparent"} - - - [domains:\ - - habora.duckdns.org\ - email: boraers@googlemail.com\ - keyfile: privkey.pem\ - certfile: fullchain.pem\ - challenge: http\ - dns: {}]{style="background: transparent"} - - - [add to configuration.aml\ - http:\ - ssl_certificate: /ssl/fullchain.pem\ - ssl_key: /ssl/privkey.pem]{style="background: transparent"} - - - [influxdb]{style="background: #e8f2a1"} - - - [no adaptation of configuration was - needed]{style="background: #e8f2a1"} - - - []{style="background: #e8f2a1"} - - - []{style="background: #e8f2a1"} - - - [create database: - home_assistant]{style="background: #e8f2a1"} - - - [create user: homeassistant, pass: homeassistant, - permissions: ALL]{style="background: #e8f2a1"} - - - [mosquitto]{style="background: #e8f2a1"} - - - [Logins:\ - - username: note4\ - password: note4]{style="background: #e8f2a1"} - - - [MQTT integration configuration:\ - 127.0.0.1 ← not core-mosquitto\ - 1883\ - note4\ - note4\ - MQTT protocol: 5]{style="background: #e8f2a1"} - - - [Grafana]{style="background: #e8f2a1"} - - - [env_vars:\ - - name: GF_SECURITY_ALLOW_EMBEDDING\ - value: \"true\"\ - - name: GF_AUTH_ANONYMOUS_ORG_NAME\ - value: Main Org.\ - - name: GF_AUTH_ANONYMOUS_ENABLED\ - value: \"true\"\ - - name: GF_AUTH_DISABLE_LOGIN_FORM\ - value: \"false\"]{style="background: #e8f2a1"} - - - [SSL: false or true, depending on having ssl set - up]{style="background: #e8f2a1"} - - - [Network:\ - 3000]{style="background: #e8f2a1"} - - - []{style="background: #e8f2a1"} - - - [in web panel]{style="background: #e8f2a1"} - - - [add data source: InfluxDB]{style="background: #e8f2a1"} - - - [URL: - [http://](http://a0d7b954-influxdb:8086/)[a0d7b954](http://192.168.178.52:8123/hassio/ingress/a0d7b954_influxdb)[-influxdb:8086](http://a0d7b954-influxdb:8086/)]{style="background: #e8f2a1"} - - - [database, user, pass]{style="background: #e8f2a1"} - - - - - - [Terminal and SSH]{style="background: #e8f2a1"} - -- integrations - - - HACS - - - github credentials required - - - OpenWeatherMap - - - API Ke: - - - solarman - -- re-use old config files - - - automations - - - blueprints - - - bosch_shc - - - custom_components - - - group - - - images - - - python_scripts - - - www - - - alarm_control_panel.yaml - - - automations.yaml - - - climate.yaml - - - configuration.yaml - - - influxdb.yaml - - - mqtt.yaml - - - scenes.yaml - - - scripts.yaml - - - secrets.yaml - - - sensor.yaml - -- move to external SSD - -- che - -\ - -![](Home_assistant_html_8c01be9bb611f888.png){#Image48 align="left" -width="561" height="677" border="0"}\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# Home-Assistant script template {#home-assistant-script-template .western} - -\ - -{## Imitate available variables: ##}\ -{% set my_test_json = {\ -\"temperature\": 25,\ -\"unit\": \"°C\"\ -} %}\ -\ -The temperature is {{ my_test_json.temperature }} {{ my_test_json.unit -}}.\ -\ -{% if is_state(\"sun.sun\", \"above_horizon\") -%}\ -The sun rose {{ relative_time(states.sun.sun.last_changed) }} ago.\ -{%- else -%}\ -The sun will rise at {{ as_timestamp(state_attr(\"sun.sun\", -\"next_rising\")) \| timestamp_local }}.\ -{%- endif %}\ -\ -For loop example getting entity values in the weather domain:\ -\ -{% for state in states.weather -%}\ -{%- if loop.first %}The {% elif loop.last %} and the {% else %}, the {% -endif -%}\ -{{ state.name \| lower }} is {{state.state_with_unit}}\ -{%- endfor %}.\ -\ -{% set tado_temp = -states(\'sensor.tado_wohnzimmer_temperature\')\|float(20) %}\ -{% set room_temp = -states(\'sensor.meter_plus_90b4_temperature\')\|float(20) %}\ -{% set current_offset = state_attr(\'climate.tado_wohnzimmer\',\ -\'offset_celsius\') %}\ -{{ tado_temp\|round(1) }}\ -{{ room_temp\|round(1) }}\ -{{ current_offset\|round(1) }}\ -{{ (-(tado_temp - room_temp) + current_offset)\|round(1) }}\ -{{ (tado_temp - current_offset)\|round(1) }}\ -\ - -\ -{% set average_temp = 0 %}\ -{% set active_rooms = 0 %}\ -{% set temp_bedroom = -states(\'sensor.radiator_thermostat_bedroom_temperature\')\|float(15) -%}\ -{% set climate_bedroom = states(\'climate.room_climate_bedroom\') %}\ -{% set temp_top = -states(\'sensor.radiator_thermostat_child_top_temperature\')\|float(15) -%}\ -{% set climate_top = states(\'climate.room_climate_child_s_room_1_top\') -%}\ -{% set temp_bottom = -states(\'sensor.radiator_thermostat_bottom_temperature\')\|float(15) %}\ -{% set climate_bottom = -states(\'climate.room_climate_child_s_room_2_botto\') %}\ -\ -{% if climate_bedroom not in (\"unavailable\", \"unknown\", \"off\") %}\ -{% set active_rooms = active_rooms + 1 %}\ -{% set average_temp = average_temp + temp_bedroom %}\ -{% endif %}\ -\ -{{ average_temp/active_rooms\|round(1) if active_rooms\>0 else 77 }}\ -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ -\ - -\ -\ - -# Python Scripts {#python-scripts .western} - - - -\ - -## Example 1 {#example-1 .western} - - - -Scripts are placed in a python_scripts folder under the configuration -directory, in my case it is -/home/homeassistant/.homeassistant/python_scripts. You then need to -either restart Home Assistant or click RELOAD SCRIPTS under -Configuration, General, Configuration Reloading. - -\ - -For what it's worth, I have been hunting for a solution to this problem -and I finally decided to make a small script: - -\# python_scripts/set_state.py - -\ - -#================================================================================================== - -\# python_scripts/set_state.py - -#================================================================================================== - -\ - -#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-- - -\# Set the state or other attributes for the entity specified in the -Automation Action - -#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-- - -\ - -inputEntity = data.get(\'entity_id\') - -if inputEntity is None: - -logger.warning(\"===== entity_id is required if you want to set -something.\") - -else: - -inputStateObject = hass.states.get(inputEntity) - -inputState = inputStateObject.state - -inputAttributesObject = inputStateObject.attributes.copy() - -\ - -for item in data: - -newAttribute = data.get(item) - -logger.debug(\"===== item = {0}; value = -{1}\".format(item,newAttribute)) - -if item == \'entity_id\': - -continue \# already handled - -elif item == \'state\': - -inputState = newAttribute - -else: - -inputAttributesObject\[item\] = newAttribute - -hass.states.set(inputEntity, inputState, inputAttributesObject) - -\ - -\ - -\ - -With this script in place, the action could be: - -\ - -action: - -service: python_script.set_state - -data_template: - -entity_id: Binary_sensor.sensor1 - -state: ON - -\ - -\ - -\ - -## Example 2 {#example-2 .western} - - - -\ - -Start by enabling the Python script and create the first script. - -- [[[[Add - to ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - `configuration.yaml`{.western}[[[[: ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - `python_script:`{.western} -- [[[[Create - folder ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - `/python_scripts`{.western} -- [[[[Create a - file ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - `/python_scripts/hello_world.py`{.western}[[[[ in the folder - and give it this - content:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -``` {.western style="line-height: 150%; text-align: left; orphans: 2; widows: 2; border: 1px solid #cccccc; padding: 0.02in; background: #ffffff"} -# `data` is available as builtin and is a dictionary with the input data. -name = data.get("name", "world") -# `logger` and `time` are available as builtin without the need of explicit import. -logger.info("Hello {} at {}".format(name, time.time())) -``` - -\ - -- Start Home Assistant to reload the script configuration. - -- [[[[Call your - new ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - `python_script.hello_world`{.western}[[[[ service (with parameters) - from - the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[Services]{style="font-weight: normal"}]{.underline}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}](https://my.home-assistant.io/redirect/developer_services){target="_blank"}[[[[, - using the YAML - mode.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -``` {.western style="line-height: 150%; text-align: left; orphans: 2; widows: 2; border: 1px solid #cccccc; padding: 0.02in; background: #ffffff"} -service: python_script.hello_world -data: - name: "Input-Text" -``` - -[[[[Running this script show absolutely no output on the screen, but it -logs with -level ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -`info`{.western}[[[[. You must have -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[Logger]{style="font-weight: normal"}]{.underline}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}](https://www.home-assistant.io/integrations/logger/)[[[[ enabled -at least for -level ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -`info`{.western}[[[[.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[[[Your ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -`confiuration.yaml`{.western}[[[[ should include something like -this.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -``` {.western style="line-height: 150%; text-align: left; orphans: 2; widows: 2; border: 1px solid #cccccc; padding: 0.02in; background: #ffffff"} -logger: - default: info -``` - -\ - -\ - -\ - -\ - -\ - -# Flash ESPhome on ESP32 ESP2866 NodeMCU board {#flash-esphome-on-esp32-esp2866-nodemcu-board .western} - - - -\ - -Install using esphome-flasher: - -1. download compiled firmware: In the Install menu click Manual - Download. The compilation will now start and the .bin file will - download when ready. - -2. [[[[Go to the esphome-flasher GitHub page and download the flasher - for the OS you're using. There is a esp home flash tool for macOS, - Ubuntu and Windows :\ - ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[**[https://github.com/esphome/esphome-flasher/releases]{style="background: transparent"}**]{.underline}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}](https://github.com/esphome/esphome-flasher/releases) - -3. Connect your ESP board with USB to your laptop. - -4. Open the flasher tool - -- **[[[**Serial - port**]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}**[[[[: - select COM port where the board is connected (there is probably only - one option - 😊).]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -- **[[[**Firmware**]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}**[[[[: - Browse to the location where you downloaded your compiled firmware - and select your - firmware.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -- [[[[Click]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}**[[[[ ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[**Flash - ESP **]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}**[[[[and - wait]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -5. The ESP will be flashed now, you can follow the progress in the - console window. When finished writing the firmware the ESP will - restart and connect to your WiFi. - -![](Home_assistant_html_c35888ec30af40ce.png){#Image1 align="bottom" -width="302" height="190" border="0"} The ESP will be ready after it -states that it's **ready for Over-The-Air Updates** and **that he API -server is ready**. - -\ - -\ - -# Measuring DHT22 {#measuring-dht22 .western} - - - -1. ***[***Note: ***]{style="letter-spacing: normal"}**[*[Step 1 and 2 - have been changed with new UI and features in both Home Assistant - and ESPHome. Read - the ]{style="font-weight: normal"}*]{style="letter-spacing: normal"}[[*[**[updated - article to flash ESPhome on your ESP32 / ESP2866 NodeMCU - board]{style="background: transparent"}**]{.underline}*]{style="letter-spacing: normal"}](https://www.pieterbrinkman.com/2022/01/01/2022-update-flash-esphome-on-esp32-esp2866-nodemcu-board/)*[[ ]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[and - skip step 1 and 2 - below.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -3\. Wire the PMS5003 Particular Matter sensor and DHT22 to the ESP board - -- Wiring the DHT sensor is straight forward. - - - Connect the GND to any free GND pin on the ESP - - - Connect the VSS to any free 3V3 pin on the ESP - - - Connect the DATA to D4 on the ESP - -**[[[**4.** -]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[Configure -ESPHome to read the measurements and supply them to Home -Assistant]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}** - -Now it's time to expose the measurement values to Home Assistant. - -Open ESPHome and click EDIT on your node. The ESPHome configuration -editor will now show. Add the following configuration at the bottom of -the configuration. - -``` {.western style="line-height: 160%; orphans: 2; widows: 2; border: none; padding: 0in; background: #f9f9f9"} -uart: - tx_pin: D6 - rx_pin: D7 - baud_rate: 9600 - -sensor: - - platform: pmsx003 - type: PMSX003 - pm_1_0: - name: "Particulate Matter <1.0µm Concentration" - pm_2_5: - name: "Particulate Matter <2.5µm Concentration" - pm_10_0: - name: "Particulate Matter <10.0µm Concentration" - - platform: dht - pin: D4 - temperature: - name: "Air quality meter Temperature" - humidity: - name: "Air quality meter Humidity" - update_interval: 20s -``` - -When ready, press the Upload button and ESPHome will flash the new -firmware OTA. Wait till ready and you should be good to go. [===\> this -can be done wirelessl now]{style="background: #ffff00"} - -You can verify the new switch and interval by going to Home Assistant -and open the device. You will see that it will have a Start Measuring -switch. Enable the switch and notice that the measurements value start -changing.   - -Wait a two minutes and notice that the switch will be turned on for 20 -seconds and then turned off again. - -![](Home_assistant_html_6645eb4607246ee.png){#Image2 align="bottom" -width="276" height="39" border="0"} - -Now add the some graph to your dashboard. - -**6. Add air quality measurements to Home Assistant** - -[[[[For viewing the measurements in my lovelace dashboard I used a -custom card -called ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[**[mini-graph-card]{style="background: transparent"}**]{.underline}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}](https://github.com/kalkih/mini-graph-card){target="_blank"}[[[[, -this card can be easily installed using HACS. I used the following -Lovelace -configuration.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -``` {.western style="font-variant: normal; letter-spacing: normal; font-style: normal; font-weight: normal; line-height: 160%; orphans: 2; widows: 2; background: #f9f9f9"} -type: 'custom:mini-graph-card' -name: Air quality inside -icon: 'mdi:server' -line_width: 2 -animate: true -hours_to_show: 24 -points_per_hour: 1.5 -entities: - - entity: sensor.particulate_matter_1_0um_concentration - name: 1 µm > - - entity: sensor.particulate_matter_2_5um_concentration - name: 2.5 µm > - - entity: sensor.particulate_matter_10_0um_concentration - name: 10 µm > -``` - -### Adding measurements of outside air {#adding-measurements-of-outside-air .western style="font-variant: normal; letter-spacing: normal; font-style: normal; font-weight: normal; line-height: 140%; orphans: 2; widows: 2; margin-top: 0in; margin-bottom: 0in; border: none; padding: 0in"} - -[[[[To create additional context I also -use]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[[ ]{style="background: transparent"}]{style="font-weight: normal"}]{.underline}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}](https://www.home-assistant.io/integrations/luftdaten/){target="_blank"}[[[[[**[Luftdaten -integration]{style="background: transparent"}**]{.underline}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}](https://www.home-assistant.io/integrations/luftdaten/){target="_blank"}[[[[ to -get outside air quality measurements nearby. This way you could automate -opening windows or triggering ventilation to get better quality air from -outside.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -Luftdaten is making the world a better place through community driven, -open environmental data. The coverage within northern Europe is -impressive. - -![](Home_assistant_html_b7a34d7754cb750c.png){#Image3 align="bottom" -width="819" height="367" border="0"} - -Exposing both inside and outside air quality with a vertical stack card -will provide a nice comparison view. - -![](Home_assistant_html_99d77d30d22d0a29.png){#Image4 align="bottom" -width="322" height="369" border="0"} - -That's it. Now it's time to start measuring and learn more about the air -quality in your house. Let me know if you have any questions and if you -managed to make it work! - -\ - -\ - -# Working DHT11 on Berrbase NodeMCU ESP32 {#working-dht11-on-berrbase-nodemcu-esp32 .western} - - - -ESP32 NodeMCU Development Board - -Artikel-Nr.: NMCU-ESP32 - -\| - -EAN: 4251266700609 - -\ - -\ - -## Connection {#connection .western} - -DHT on breakout board with SMD resistors and LED was used → might need -10 kOhm resistor for bare DHT11 - -\ - -12 = GPIO12 - -VCC = 3.3V - -GND = Gnd - -\ - -\ - -## test-esp32nmcu.yaml → test-esp32nmcu\_\_\_working_20221211.bin {#test-esp32nmcu.yaml-test-esp32nmcu___working_20221211.bin .western} - -[esphome:]{style="background: #fffffe"} - -[  [name]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[test-esp32nmcu]{style="font-weight: normal"}]{style="background: #fffffe"} - -\ - -[esp32:]{style="background: #fffffe"} - -[  [board]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[esp32dev]{style="font-weight: normal"}]{style="background: #fffffe"} - -[  -[framework]{style="font-weight: normal"}[:]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    [type]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[arduino]{style="font-weight: normal"}]{style="background: #fffffe"} - -\ - -[\# Enable logging]{style="background: #fffffe"} - -[logger:]{style="background: #fffffe"} - -\ - -[\# Enable Home Assistant API]{style="background: #fffffe"} - -[api:]{style="background: #fffffe"} - -[  -[encryption]{style="font-weight: normal"}[:]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    [key]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[\"MI1DnjQWboPRECsx7PlLQS4BiR7SQQSpYczCuzpupS4=\"]{style="font-weight: normal"}]{style="background: #fffffe"} - -\ - -[ota:]{style="background: #fffffe"} - -[  [password]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[\"bb47b47929f02cd349e51eddd8602edb\"]{style="font-weight: normal"}]{style="background: #fffffe"} - -\ - -[wifi:]{style="background: #fffffe"} - -[  [#ssid: !secret -wifi_ssid]{style="font-weight: normal"}]{style="background: #fffffe"} - -[  [#password: !secret -wifi_password]{style="font-weight: normal"}]{style="background: #fffffe"} - -[  [#ssid: \"FRITZ!Box -Gastzugang\"]{style="font-weight: normal"}]{style="background: #fffffe"} - -[  [#password: -\"zakihasalittlewiener\"]{style="font-weight: normal"}]{style="background: #fffffe"} - -[  [ssid]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[\"FRITZ!Box 7530 -GD\"]{style="font-weight: normal"}]{style="background: #fffffe"} - -[  [password]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[\"78302839617779115068\"]{style="font-weight: normal"}]{style="background: #fffffe"} - -\ - -[  [\# Optional manual -IP]{style="font-weight: normal"}]{style="background: #fffffe"} - -[  -[manual_ip]{style="font-weight: normal"}[:]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    [static_ip]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[192.168.178.42]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    [gateway]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[192.168.178.1]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    [subnet]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[255.255.255.0]{style="font-weight: normal"}]{style="background: #fffffe"} - -\ - -[  [\# Enable fallback hotspot (captive portal) in case wifi connection -fails]{style="font-weight: normal"}]{style="background: #fffffe"} - -[  -[ap]{style="font-weight: normal"}[:]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    [ssid]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[\"Test-Esp32Nmcu Fallback -Hotspot\"]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    [password]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[\"pJDTx6ABN80C\"]{style="font-weight: normal"}]{style="background: #fffffe"} - -\ - -[captive_portal:]{style="background: #fffffe"} - -\ - -[sensor:]{style="background: #fffffe"} - -[  [- -]{style="font-weight: normal"}[platform]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[dht]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    [pin]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[12]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    -[temperature]{style="font-weight: normal"}[:]{style="font-weight: normal"}]{style="background: #fffffe"} - -[      [name]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[\"Air quality meter -Temperature\"]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    -[humidity]{style="font-weight: normal"}[:]{style="font-weight: normal"}]{style="background: #fffffe"} - -[      [name]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[\"Air quality meter -Humidity\"]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    [update_interval]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[10s]{style="font-weight: normal"}]{style="background: #fffffe"} - -[    [model]{style="font-weight: normal"}[: -]{style="font-weight: normal"}[DHT11]{style="font-weight: normal"}]{style="background: #fffffe"} - -\ - -\ - -\ - -## flashing using ESPHome-Flasher-1.4.0-Windows-x64 {#flashing-using-esphome-flasher-1.4.0-windows-x64 .western} - -\ - -see above - -\ - -\ - -\ - -## activate the sensor in HA {#activate-the-sensor-in-ha .western} - -after some minutes, the ESP32 should appear under Integrations with the -initiall assigned name - -![](Home_assistant_html_3f1f9bd2d382bd8b.png){#Image5 align="left" -width="362" height="212" border="0"}\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -![](Home_assistant_html_3736a24f705ebf1f.png){#Image6 align="left" -width="643" height="151" border="0"} -![](Home_assistant_html_da20b167c94ec7a9.png){#Image7 align="left" -width="643" height="422" border="0"}\ - -\ - -\ - -\ - -# How to integrate full functionality of Bosch smart home components {#how-to-integrate-full-functionality-of-bosch-smart-home-components .western} - - - -\ - -shc11d14d - -192.168.178.34 - -\ - -\ - -## Connect via Samba share {#connect-via-samba-share .western} - -\ - -add a Network Location in Windows Explorer - -\ - -LAN: [\\\\192.168.178.32\\config](smb://192.168.178.32/config) - -WLAN: -[\\\\192.168.17](smb://192.168.179.43/config)[9](smb://192.168.179.43/config)[.](smb://192.168.179.43/config)[4](smb://192.168.179.43/config)[3\\config](smb://192.168.179.43/config) -→ not working?? - -\ - -user: homeassistant - -pass: bora - -\ - -\ - -## cop following folders into the config folder on RaPi: {#cop-following-folders-into-the-config-folder-on-rapi .western} - -- custom_components - -- images - -- tests - -\ - -## after restarting HA all components and functions should be available {#after-restarting-ha-all-components-and-functions-should-be-available .western} - -\ - -\ - -\ - -\ - -\ - -# Dashboard individualization {#dashboard-individualization .western} - - - -[[[[If you have not enabled custom themes already, add this to -your ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}**[[[**configuration.yaml**]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}**[[[[ file -and reboot Home -Assistant:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -``` {.western style="orphans: 2; widows: 2; border: none; padding: 0in; background: #eeeeee"} -frontend: - themes: !include_dir_merge_named themes -``` - -\ -\ - -\ -\ - -\ -\ - -# Guest access {#guest-access .western} - -create a dedicated account for gests: - -user: Guest - -pass: guest - -[[[[open -http://]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[192.168.178.32]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}](smb://192.168.178.32/config)[[[[:8123]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -\ -\ - -\ -\ - -[[[[[https://community.home-assistant.io/t/configuring-a-real-guest-user-an-alternative-approach/455910]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}](https://community.home-assistant.io/t/configuring-a-real-guest-user-an-alternative-approach/455910) - -Hi, I'd like to share the way I approached the configuration of a guest -user in my HA and how I worked around some well-known limitations, -especially those related to the lack of a global sidebar / default -dashboard configuration. - -My requirements: - -1. Guest user allowed to login only from the internal network - -2. Only specific views available to the guest user - -3. **[[[**No need for the guest user to switch to a different dashboard - once logged - in**]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}** - -4. **[[[**No unnecessary items to show up in the sidebar for the guest - user (including logbook, media, history, - etc)**]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}** - -[[[[Basically a sort of kiosk mode without using frontend hacks -(]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[[https://github.com/maykar/kiosk-mode ]{style="background: transparent"}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="text-decoration: none"}]{style="font-variant: normal"}](https://github.com/maykar/kiosk-mode) - -[2](https://github.com/maykar/kiosk-mode)[[[[ is now -deprecated, ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[[https://github.com/Villhellm/custom-sidebar]{style="background: transparent"}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="text-decoration: none"}]{style="font-variant: normal"}](https://github.com/Villhellm/custom-sidebar)[[[[ is -no more working in latest HA -versions, ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[[https://github.com/galloween/custom-sidebar-v2]{style="background: transparent"}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="text-decoration: none"}]{style="font-variant: normal"}](https://github.com/galloween/custom-sidebar-v2)[[[[ works -only for admin -users).]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[[[Requirement #1 is the simplest: just create a guest user with a -simple password and toggle -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`Can only log in from the local network`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ option.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[[[Requirement #2 is also stright-forward: create a dashboard, add a -View for the guest user, -under ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`Visibility`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ allow -the guest user only to access that view, disable the guest user to -access any other view of the -dashboard.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[[[Requirement #3 is tricky. As we know there is no global default -dashboard configuration, it -is ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}*[[[[per-user]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}*[[[[ / ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}*[[[[per-device]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}*[[[[.\ -This means the guest user, upon the first login, lands in the -over-complicated ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`Overview`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ dashboard -and should go in his profile to change the default dashboard. Not -something I want them to do neither I want to do it on their behalf.\ -After reading tons of posts here, the simplest approach I found is to -take control of -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`Overview`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ dashboard -(if I need the same content I can always create a brand new admin-only -dashboard) and put all my views there (both for regular and guest -users).\ -True, the name of -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`Overview`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ dashboard -cannot be change as well as the icon but at least in this way every user -(guests or not), when logging in, will land to a dashboard populated -with the contents I -want.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[[[Requirement #4 was also a challenge. As we know also the order in -which the items show up in the sidebar and which one is hidden or not -is ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}*[[[[per-user]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}*[[[[ / ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}*[[[[per-device]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}*[[[[. -The way I approched it was the -following:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -- [[[[I migrated all my dashbaords into views in order to have a - single dashboard only - (the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`Overview`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ one). - This is not mandatory of course, just an implementation choice, to - avoid taking care of the order in which dashbaords are listed in the - sidebar]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -- [[[[I disabled in my - configuration ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`Energy`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[, ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`Map`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ and ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`Media`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ since - not using them at all - (Ref. ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[[How - can I hide the Energy/Media/Map tabs from the sidebar? - #9 by - petro ]{style="background: transparent"}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="text-decoration: none"}]{style="font-variant: normal"}](https://community.home-assistant.io/t/how-can-i-hide-the-energy-media-map-tabs-from-the-sidebar/433297/9) - [5](https://community.home-assistant.io/t/how-can-i-hide-the-energy-media-map-tabs-from-the-sidebar/433297/9)[[[[) - resulting in the entries to disappear from the sidebar. This - required switching - from ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`default_config`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ to - a long list taken - from ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[[Default - Config - Home - Assistant ]{style="background: transparent"}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="text-decoration: none"}]{style="font-variant: normal"}](https://www.home-assistant.io/integrations/default_config/) - [1](https://www.home-assistant.io/integrations/default_config/)[[[[ and - commeting out those not - needed]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -- [[[[For ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`Logbook`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ and ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`History`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[, - which are something I need as an admin but don't want the other - users to access and see, I made them available for admin users only, - opting for the approach described - in ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[[Admin - only access for Logbook and History menus - #44 by - dan_mc ]{style="background: transparent"}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="text-decoration: none"}]{style="font-variant: normal"}](https://community.home-assistant.io/t/admin-only-access-for-logbook-and-history-menus/187722/44) - [8](https://community.home-assistant.io/t/admin-only-access-for-logbook-and-history-menus/187722/44)[[[[. - This required to copy the code of the two components - from ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`/usr/src/homeassistant/homeassistant/components`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ or ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[core/homeassistant/components - at master · home-assistant/core · - GitHub ](https://github.com/home-assistant/core/tree/master/homeassistant/components) - [3](https://github.com/home-assistant/core/tree/master/homeassistant/components)[[[[ into ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`config/custom_components`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[, - add ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`version`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ to - the manifest file and making the views admin-only - in ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`async_register_built_in_panel()`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[ as - described in the other post. Of course maintenance of this could be - time-consuming since theoretically the code should be updated upon - each - upgrade]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -In this way not only guest user but also any user on any deice, has no -need to touch the sidebar, hide unnecessary entries or set a default -dashboard\ -Hope can be helpful - -Thanks - -\ -\ - -\ -\ - -\ -\ - -\ -\ - -# Influx DB storing of Arduino data {#influx-db-storing-of-arduino-data .western} - -Example 1 - - - -\ -\ - -[Example 2]{style="background: #ffff00"} - -[[http://www.iotsharing.com/2021/01/building-smart-home-system-with-home.html]{style="background: #ffff00"}](http://www.iotsharing.com/2021/01/building-smart-home-system-with-home.html) - -\ -\ - -Example 3 - - - - - -\ -\ - -Example 4 - - - -\ -\ - - - -ssh into rapi via PUTT: - - - -\ -\ - - - - - - - -\ -\ - -\ -\ - -https://www.youtube.com/watch?v=U8f5FcnKdyw - -\ - -[Example 5]{style="background: transparent"} - -[[https://www.dummylabs.com/post/2019-01-13-influxdb-part1/]{style="background: transparent"}](https://www.dummylabs.com/post/2019-01-13-influxdb-part1/) - -\ - -\ - -\ - -\ - -\ - -\ - -# Home Assistant with InfluxDB on Synology {#home-assistant-with-influxdb-on-synology .western} - - - - - - - -\ - -\ - -\ - -# Home Assistant on Linux VM with Docker, reverse proxy, MQTT and Node Red {#home-assistant-on-linux-vm-with-docker-reverse-proxy-mqtt-and-node-red .western} - -[[https://selmi.medium.com/home-assistant-in-docker-the-ultimate-setup-16d4669dcb7]{style="background: #ffff00"}](https://selmi.medium.com/home-assistant-in-docker-the-ultimate-setup-16d4669dcb7) - -\ - -\ - -\ - -\ - -# Presence detection options {#presence-detection-options .western} - - - - - -\ - -\ - -# Automation of dumb devices {#automation-of-dumb-devices .western} - - - -\ - -\ - -\ - -\ - -# Using external Data Disk {#using-external-data-disk .western} - - - -\ -\ - -\ -\ - -Home Assistant Operating System supports storing most data on an -external storage medium (e.g. USB attached SSD or HDD). This data disk -contains not only user data but also most of the Home Assistant software -as well (Core, Supervisor etc.). This means a fast data disk will make -the system overall much faster. - -![Graphics showing the architecture of the data disk -feature](Home_assistant_html_eb38d3613d558289.png){#Image8 -align="bottom" width="762" height="353" border="2"} - -[[[[The data disk feature can be used on an existing installation -without losing data: The system will move existing data to the external -data disk automatically. However, it is recommended to create and -download a -full ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[Backup]{style="font-weight: normal"}]{.underline}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}](https://www.home-assistant.io/common-tasks/os/#backups)[[[[ before -proceeding!]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[All data on the target disk will be -overwritten!]{style="background: #f7f9e1"}]{style="display: inline-block; border: none; padding: 0in"} - -[[The storage capacity of the external data disk must be larger than the -storage capacity of the existing (boot) -disk.]{style="background: #e7f2fa"}]{style="display: inline-block; border: none; padding: 0in"} - -[[[[[If you have been using a data disk previously with Home Assistant -Operating System, you need to use your host computer to delete all -partitions ]{style="font-variant: normal"}]{style="background: #e7f2fa"}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"} - -[*before*[[[[[ using it as a data disk -again.]{style="font-variant: normal"}]{style="background: #e7f2fa"}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="background: #e7f2fa"} - -### USING UI TO MOVE THE DATA PARTITION {#using-ui-to-move-the-data-partition .western align="left" style="font-variant: normal; font-style: normal; font-weight: normal; line-height: 100%; orphans: 2; widows: 2; border: none; padding: 0in"} - -1. Connect the data disk to your system. - -2. [[[[Go - to ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}**[[[[[**Settings - \> System \> - Storage**]{.underline}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}](https://my.home-assistant.io/redirect/storage){target="_blank"}**[[[[ in - the - UI.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -3. Press the three dots on the top right and choose "Move datadisk" - -4. Select the data disk from the list of available devices. - -5. Press "Move". - -![Screenshot of the "Move datadisk" -feature](Home_assistant_html_bb6004c436b08021.png){#Image9 width="481" -height="248" border="2"} - -### USING CLI TO MOVE THE DATA PARTITION {#using-cli-to-move-the-data-partition .western align="left" style="font-variant: normal; font-style: normal; font-weight: normal; line-height: 100%; orphans: 2; widows: 2; border: none; padding: 0in"} - -To see the current data disk use: - -``` {.western style="line-height: 150%; text-align: left; orphans: 2; widows: 2; border: 1px solid #cccccc; padding: 0.02in; background: #ffffff"} -$ ha os info -... -data_disk: /dev/mmcblk1p4 -... -``` - -[Sh]{style="display: inline-block; border: none; padding: 0in"} - -Copy - -[[[[To get a list of potential targets which can be used -by ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -`datadisk`{.western}[[[[:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -``` {.western style="line-height: 150%; text-align: left; orphans: 2; widows: 2; margin-bottom: 0.2in; border: 1px solid #cccccc; padding: 0.02in; background: #ffffff"} -ha os datadisk list -``` - -[Sh]{style="display: inline-block; border: none; padding: 0in"} - -Copy - -[[[[To initiate the move to the new data disk use -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -`move`{.western}[[[[ command:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -``` {.western style="line-height: 150%; text-align: left; orphans: 2; widows: 2; margin-bottom: 0.2in; border: 1px solid #cccccc; padding: 0.02in; background: #ffffff"} -ha os datadisk move /dev/sdx -``` - -[Sh]{style="display: inline-block; border: none; padding: 0in"} - -Copy - -The system will prepare the data disk and immediately reboot. The reboot -will take 10 minutes or more depending on the speed of the new data -disk; please be patient! - -[[Using an USB attached SSD can draw quite some power. For instance on -Raspberry Pi 3 the official Raspberry Pi power supply (PSU) only -provides 2.5A which can be too tight. Use a more powerful power supply -if you experience issues. Alternatively use a powered USB hub. Connect -the Hub to one of the USB slots of your Raspberry Pi, and connect the -SSD to the Hub. In this setup the power supply of the Hub will power the -attached -device(s).]{style="background: #e7f2fa"}]{style="display: inline-block; border: none; padding: 0in"} - -\ -\ -\ - -\ - -\ - -# Save DB on USB stick/drive (Hassio) {#save-db-on-usb-stickdrive-hassio .western} - - - -\ - -\ - -\ - -# Running Home Assistant on a Raspberry Pi 3 from an external hard drive {#running-home-assistant-on-a-raspberry-pi-3-from-an-external-hard-drive .western} - - - -\ - -\ - - - -\ - -\ - -\ - -\ - -# MQTT with RP2040 {#mqtt-with-rp2040 .western} - - - - - - - -\ - -\ - -\ - -\ - -\ - -\ - -# Weather {#weather .western} - -## accuweather {#accuweather .western} - -BoraEr - -ineedweather_90 - -Follow instruction here to create new App: - - -app: ha_weather - -API key: GV0GKNtlJZNUHYZ5YNW6YGySLVVz0Huq - -\ - -search location key: - -\ - -Leinfelden: 2604235, - - -\ - -\ - -create a sensor from the weather attributes to plot the data: - - - -\ -\# Temperatur-Attribut als Extra-Wert - -sensor\ -- platform: template\ -sensors:\ -norwegian_temperature:\ -friendly_name: \"met.no Temperatur Vorhersage\"\ -unit_of_measurement: \'°C\'\ -value_template: \"{{ state_attr(\'weather.home_musberg\', -\'temperature\') }}\" - -\ - -## openweathermap {#openweathermap .western} - - - -\ - -BoraEr - -ineedweather_90 - -\ - -\ - -\ - -## animated icons in weather card {#animated-icons-in-weather-card .western} - - - - - -\ - -\ - -\ - -\ - -# read content of DB {#read-content-of-db .western} - - - -\ - -\ - -\ - -\ - -\ - -# InfluxDB: Removing or deleting data {#influxdb-removing-or-deleting-data .western} - - - -\ - -\ - -# Read external InfluxDB in Home Assistant as a sensor {#read-external-influxdb-in-home-assistant-as-a-sensor .western} - - - -\ - -# Using both MariaDB and InfluxDB {#using-both-mariadb-and-influxdb .western} - - - -\ - -\ - -# InfluxDB hassio add-on: changing default database location {#influxdb-hassio-add-on-changing-default-database-location .western} - - - - - -\ - -\ - -location of influxdb database: - - -\ - -\ - -\ - -\ - -# Remote access {#remote-access .western} - - - -\ -\ - - - - - -\ - -## [create ]{style="font-weight: normal"}[DuckDNS ]{style="font-weight: normal"}[subdomain]{style="font-weight: normal"}[:]{style="font-weight: normal"} {#create-duckdns-subdomain .western} - -Duckdns.org - -account boraers@googlemail.com - -type free - -token 799093a4-0b34-454f-99cb-25a4637bf404 - -Domain: https://habora.duckdns.org - -\ - -[attention: if router is restartet, configuration of duckdns has to be -updated!]{style="background: #ffff00"} - -\ - -to be accessed via the HA app: - -[https://habora.duckdns.org:](https://habora.duckdns.org:8123/)[8123/](https://habora.duckdns.org:8123/) - -\ - -https://192.168.178.32:8123/ - -\ - -https://habora.duckdns.org - -habora.duckdns.org - -duckdns.org - -## edit configuration of DuckDNS addon: {#edit-configuration-of-duckdns-addon .western} - -domains:\ -- https://habora.duckdns.org\ -token: 799093a4-0b34-454f-99cb-25a4637bf404\ -aliases: \[\]\ -lets_encrypt:\ -accept_terms: true\ -algo: secp384r1\ -certfile: fullchain.pem\ -keyfile: privkey.pem\ -seconds: 300 - -\ - -\ - -## install Let\'s Encrypt addon {#install-lets-encrypt-addon .western} - -\ -\ - -domains:\ -- habora.duckdns.org\ -email: boraers@googlemail.com\ -keyfile: privkey.pem\ -certfile: fullchain.pem\ -challenge: http\ -dns: {} - -\ - -## port forwarding in fritz.box {#port-forwarding-in-fritz.box .western} - -![](Home_assistant_html_382f235fa92119d6.png){#Image10 align="bottom" -width="270" height="286" border="0"} - -\ - -![](Home_assistant_html_b6f47a768db3e3a0.png){#Image13 align="bottom" -width="285" height="305" border="0"} - -\ - -![](Home_assistant_html_aa3e230b366baeb8.png){#Image11 align="bottom" -width="643" height="205" border="0"} - -\ - -\ - -## Start Let\'s Encrypt addon {#start-lets-encrypt-addon .western} - -\ - -![](Home_assistant_html_b50f5b35e0e18814.png){#Image12 align="bottom" -width="643" height="460" border="0"} - -\ - -\ - -## check access via calling the subomain (no https yet) {#check-access-via-calling-the-subomain-no-https-yet .western} - - - -→ this can be done already from the internet - -→ the login screen of HA should appear - -\ - -\ - -## Enable HTTPS on your HA Install {#enable-https-on-your-ha-install .western} - -\ - -edit configuration.yaml: - -http: - -ssl_certificate: /ssl/fullchain.pem - -ssl_key: /ssl/privkey.pem - -\ - -\ - -attention: different HA installation need other paths: - - - -Home Assistant OS or Supervised: → Let\'s Encrypt addon must be -installed! - -http: - -ssl_certificate: /ssl/fullchain.pem - -ssl_key: /ssl/privkey.pem - -\ - -Home Assistant Container: - -You'll need to mount the location with your SSL keys and certificates to -/ssl/ in the container. - -http: - -ssl_certificate: /ssl/fullchain.pem - -ssl_key: /ssl/privkey.pem - -\ - -Home Assistant Core: - -http: - -ssl_certificate: /etc/letsencrypt/live/hass.example.com/fullchain.pem - -ssl_key: /etc/letsencrypt/live/hass.example.com/privkey.pem - -\ - -\ - -## restart HA {#restart-ha .western} - -after restart, HA should only be available via https: - -internall: - -externall: - -\ - -\ - -\ - -## Harden the Home Assistant Remote Access Security more {#harden-the-home-assistant-remote-access-security-more .western} - -Harden the Home Assistant remote access even more by enabling MFA - -\ - -Activating ip_ban_option and Multi-factor Authentication Modules is a -must if you enable your Home Assistant Remote Access in the way that i'm -showing with the port forwarding and SSL. So don't skip this! - -\ - - - -\ - -\ - -\ - -\ - -## Fritz Box Aktualisierungsanforderung mit DuckDNS {#fritz-box-aktualisierungsanforderung-mit-duckdns .western} - - - -1. Klicken Sie in der Benutzeroberfläche der FRITZ!Box auf - \"Internet\". - -2. Klicken Sie im Menü \"Internet\" auf \"Freigaben\". - -3. Klicken Sie auf die Registerkarte \"DynDNS\". - -4. Aktivieren Sie die Option \"DynDNS benutzen\". - -5. Tragen Sie im Feld \"Update-URL\" die Update-URL für Ihren Anbieter - ein. Falls die Aktualisierungsanforderung sowohl für IPv4 als auch - für IPv6 durchgeführt werden soll und Ihr Anbieter für IPv4 und IPv6 - verschiedene Update-URLs erwartet, tragen Sie beide Update-URLs mit - einem Leerzeichen getrennt ein. - - 1. Hinweis:Beispiele für Update-URLs verschiedener Anbieter finden - Sie unten in dieser Anleitung. Falls Ihr Anbieter da nicht - genannt wird, können Sie die Update-URL wie im Abschnitt - \"Update-URL selbst erstellen\" beschrieben selbst erstellen. - -6. Tragen Sie im Feld \"Domainnamen\" den Domainnamen ein, den Sie bei - Ihrem Anbieter festgelegt haben. - -7. Tragen Sie im Feld \"Benutzername\" den Benutzernamen Ihres - Benutzerkontos beim Anbieter ein. - -8. Tragen Sie im Feld \"Kennwort\" das Kennwort Ihres Benutzerkontos - beim Anbieter ein. - -9. Klicken Sie zum Speichern der Einstellungen auf \"Übernehmen\". - -10. Jetzt übermittelt die FRITZ!Box nach dem Herstellen jeder - Internetverbindung ihre jeweils aktuellen IP-Adressen an den - Anbieter und ist somit immer unter ihrem individuellen - Dynamic-DNS-Domainnamen erreichbar. - -\ - -\ - -DuckDNS.org - -Die Update-URL für die IPv4- und die IPv6-Adresse: - -https://www.duckdns.org/update?domains=\&token=\&ip=\&ipv6=\ - -\ - -\ - -\ - -\ - -# GoogleNest TTS issues after setting up ssl {#googlenest-tts-issues-after-setting-up-ssl .western} - - - -\ - - - -\ - -DNS-Rebind-Schutz - - - -\ - -\ - -\ - -\ - -\ - -# formatting of dates {#formatting-of-dates .western} - -\ - -filename: /Data/cams/{{ now().strftime(\"%Y-%m-%d %H.%M.%S\") }} {{ -entity_id.name }}.jpg - -filename: '/tmp/armcrest_camera\_{{ now().strftime(\"%Y%m%d-%H%M%S\") -}}.jpg' - -filename: \'/home/homeassistant/.homeassistant/www/armcrest_camera\_{{ -now().strftime(\"%Y%m%d-%H%M%S\") }}.jpg\' - -\ - -filename: \>-\ -/config/www/rtsp_esp32\_{{ \"%04d\"\|format(now().year) }}\_{{\ -\"%02d\"\|format(now().month) }}\_{{ \"%02d\"\|format(now().day)\ -}}\_{{ \"%02d\"\|format(now().hour) }}\_{{ -\"%02d\"\|format(now().minute) }}\_{{ \"%02d\"\|format(now().second) -}}.jpeg - -\ - -\ - -\ - -# HA Examples {#ha-examples .western} - - - -\ - -\ - -\ - -\ - -\ - -\ - -# Müllkalender {#müllkalender .western} - - - -Der folgende Eintrag muss in die configuration.yaml - -waste_collection_schedule: - -sources: - -\- name: ics - -args: - -file: \"www/abfall.ics\" - -customize: - -\- type: Restabfall - -alias: Restabfall - -icon: mdi:trash-can - -\- type: Papiertonne - -alias: Papiertonne - -icon: mdi:trash-can - -\- type: Bioabfall - -alias: Bioabfall - -icon: mdi:trash-can - -fetch_time: \"04:00\" - -day_switch_time: \"10:00\" - -\ - -sensor: - -\- platform: waste_collection_schedule - -name: Papierabfall_date - -value_template: \'{{value.date.strftime(\"%d.%m.%Y\")}}\' - -types: - -\- Papiertonne - -\- platform: waste_collection_schedule - -name: Papierabfall_collection - -value_template: \"{{value.daysTo}}\" - -types: - -\- Papiertonne - -\- platform: waste_collection_schedule - -name: Restmuelltonne_date - -value_template: \'{{value.date.strftime(\"%d.%m.%Y\")}}\' - -types: - -\- Restabfall - -\- platform: waste_collection_schedule - -name: Restmuelltonne_collection - -value_template: \"{{value.daysTo}}\" - -types: - -\- Restabfall - -\- platform: waste_collection_schedule - -name: Biotonne_date - -value_template: \'{{value.date.strftime(\"%d.%m.%Y\")}}\' - -types: - -\- Bioabfall - -\- platform: waste_collection_schedule - -name: Biotonne_collection - -value_template: \"{{value.daysTo}}\" - -types: - -\- Bioabfall - -\- platform: waste_collection_schedule - -name: next_waste_collection_daysto - -details_format: upcoming - -value_template: \'{{value.types\|join(\", \")}} in {{value.daysTo}} -Tagen\' - -#button-card# - -\- platform: waste_collection_schedule - -name: MyButtonCardSensor - -value_template: \'{{value.types\|join(\", -\")}}\|{{value.daysTo}}\|{{value.date.strftime(\"%d.%m.%Y\")}}\|{{value.date.strftime(\"%a\")}}\' - -\ - -\ - -Folgende Integrationen aus dem HACS Store sind dafür notwendig: - -custom-cards/button-card - -custom:multiple-entity-row - -\ - -type: entities - -entities: - -\- entity: sensor.restmuelltonne_date - -style: \| - -:host { - -color: grey; - -} - -icon: \'mdi:delete-empty\' - -show_state: false - -type: \'custom:multiple-entity-row\' - -name: Schwarze Tonne - -secondary_info: last-changed - -entities: - -\- entity: sensor.restmuelltonne_collection - -name: Abholung in - -unit: Tage(n) - -\- entity: sensor.restmuelltonne_date - -name: Datum - -\- entity: sensor.biotonne_date - -style: \| - -:host { - -color: brown; - -} - -icon: \'mdi:bio\' - -show_state: false - -type: \'custom:multiple-entity-row\' - -name: Braune Tonne - -secondary_info: last-changed - -entities: - -\- entity: sensor.biotonne_collection - -name: Abholung in - -unit: Tage(n) - -\- entity: sensor.biotonne_date - -name: Datum - -\- entity: sensor.papierabfall_date - -style: \| - -:host { - -color: blue - -} - -icon: \'mdi:tree\' - -show_state: false - -type: \'custom:multiple-entity-row\' - -name: Blaue Tonne - -secondary_info: last-changed - -entities: - -\- entity: sensor.papierabfall_collection - -name: Abholung in - -unit: Tage(n) - -\- entity: sensor.papierabfall_date - -name: Datum - -\- entity: sensor.mybuttoncardsensor - -type: \'custom:button-card\' - -layout: icon_name_state2nd - -show_label: true - -label: \| - -\[\[\[ - -var days_to = entity.state.split(\"\|\")\[1\] - -if (days_to == 0) - -{ return \"Heute\" } - -else if (days_to == 1) - -{ return \"Morgen\" } - -else - -{ return \"in \" + days_to + \" Tagen\" } - -\]\]\] - -show_name: true - -name: \| - -\[\[\[ - -return entity.state.split(\"\|\")\[0\] - -\]\]\] - -state: - -\- color: red - -operator: template - -value: \'\[\[\[ return entity.state.split(\"\|\")\[1\] == 0 \]\]\]\' - -\- color: orange - -operator: template - -value: \'\[\[\[ return entity.state.split(\"\|\")\[1\] == 1 \]\]\]\' - -\- value: default - -\ - -\ - -\ - -\ - -\ - -\ - -# connect LED strip {#connect-led-strip .western} - - - -**Connection step:** - -The app name is \"Smart Life\", please search for and install the app on -Google Play or Apple Store. - -Step 1: Scan code download APP - -Step 2: Make sure your phone is connected to wifi - -Step 3: Press \"+\" to add the button and select \"Lighting\" - -Step 4: Long press the controller to make the light flash - -Step 5: Press the Confirm Flash button on your phone - -Step 6: Enter the WiFi password and confirm - -Step 7: Wait for the connection to succeed - -Step 8: Start using - -\ - -boraers@gmail.com - -tuyaforsmarthome_90 - -\ - -\ - - - -Cloud \> Development \> - -\ - - - -boraers@googlemail.com - -tuyaforsmarthome_90 - -\ - -UserID: boraers@gmail.com - -\ - -Access ID/Client ID: 9wk4ecspwhveyycxev3r - -Access Secret/Client Secret: 2c0ee61b3377443a88a94a611e1563e1 - -Project Code: p1671915179957wxkk7v - -\ - -\ - -→ tuya integration in HA should recognize device → enter credentials - -\ - -\ - -\ - - - -Add smart life to Home Assistant - -You probably know us, we don't want to use more apps. we want to control -everything from one central home automation platform: Home Assistant in -our case. - -As told before: Make sure to can devices added in Smart Life before you -can add them into Home Assistant. - -\ - -For all the parameters and settings: -https://www.home-assistant.io/components/tuya/ - -\ - -A sample configuration from me. 31 is the country code of The -Netherlands. You can find your country codes in the second column of -this site. The entry smart_life is the Tuya platform where I am -registered. Add this into your own configuration.yaml and restart your -Home Assistant instance. After starting it collects the compatible -devices from Tuya. In my case only the Blitzwolf light. - -\ - -tuya: - -username: xxx - -password: xxx - -country_code: 49 - -platform: smart_life - -After changing your configuration, restart and check out Unused devices. -In my case I have 2 products in Smart Life and only one is supported for -now in Home Assistant: the Blitzwolf Led Light strip. - -\ - -\ - -\ - -\ - -\ - -# Use local Tuya {#use-local-tuya .western} - - - - - -Add your bulbs as new devices with the following settings: - -ID: 20 - -Brightness: 22 - -Color Temperature: 23 - -Brightness Lower Value: 0 - -Brightness Upper Value: 1000 - -Color Mode: 21 - -Color: 24 - -Minimum Color Temperature: 2701 - -Maximum Color Temperature: 6499 - -Scene: 25 - -\ - -\ - -## Get local key tuya since June 2022: {#get-local-key-tuya-since-june-2022 .western} - - - - - -\ - -\ - -45625580bcddc2a2bf27: \"local_key\": \"4b1e7572e8b54ca3\", Hama_LED - -bf3d5d9718ef1b2a8c5asm: \"local_key\": \"67426b621cacaf5f\", Treppe - -\ - -\ - -\ - -Issue: Connection to device succeeded but no datapoints found, please -try again. Create a new issue and include debug logs if problem persists - - - -Adding in config manual works. - -``` {.western style="line-height: 145%; orphans: 2; widows: 2; border: none; padding: 0in"} -localtuya: - - host: 192.168.1.215 - device_id: xxx - local_key: xxx - friendly_name: Tuya Device - protocol_version: "3.3" - entities: - - - platform: sensor - friendly_name: Plug Voltage - id: 20 - scaling: 0.1 # Optional - device_class: voltage # Optional - unit_of_measurement: "V" # Optional -``` - -\ - -\ - -\ - -\ - -\ - -\ - -# Flash Tasmota on Hama LED {#flash-tasmota-on-hama-led .western} - -\ - -Check compatibilit - - - -\ - -\ - -\ - -\ - -**Flashing:** - - - - - - - -\ - - - -sudo apt-get update - -sudo apt-get upgrade - -sudo apt-get install git - -cd \~ - -git clone https://github.com/ct-Open-Source/tuya-convert - -cd tuya-convert - -sudo ./install_prereq.sh - -sudo ./start_flash.sh - -\ - -**[How To Use Tuya Convert On Raspberry Pi (Step-by-step -Guide)]{style="background: #ffff00"}** - - - -sudo apt-get update - -sudo apt-get upgrade - -sudo raspi-config → network options → select WiFi and enter your -location and credentials → finish - -rfkill unblock wifi - -sudo apt-get install git - -cd \~ - -git clone https://github.com/ct-Open-Source/tuya-convert - -cd tuya-convert && sudo su - -sudo ./install_prereq.sh - -sudo ./start_flash.sh - -\ - -→ using tasmota-xxxxx SSID → 192.168.4.1 - -\ - -\ - -**timeout issue with latest Ri OS version!** - - - - - -solution: install old version: - - -\ - -**issue**: N: This must be accepted explicitly before updates for this -repository can be applied. See apt-secure(8) manpage for details. - -**solution**: apt-get \--allow-releaseinfo-change update - - - -\ - -\ - -\ - -\ - -\ - -\ - - - - - -Hama 10W 806lm RGBW Bulb (00176547) - -{\"NAME\":\"Hama Smart -WiF\",\"GPIO\":\[0,0,0,0,37,40,0,0,38,0,39,0,0\],\"FLAG\":0,\"BASE\":18} - -\ - -In order to turn on discovery mode so that Home Assistant can auto -discover our device, we must turn on SetOption 19. Simply enter the -following command in the Tasmota console. - -**SetOption19 onws** - -\ - -\ - -\ - -\ - -**Whether your wireless card support Access Point mode.** - - - -sudo apt-get update - -sudo apt-get -y install aptitude - -sudo aptitude install iw - -iw list - -→ Look for supported interface section, where it should be a entry -called AP like below - -\ - -**updateBroadcom wifi driver** - - - - - -sudo lshw -C network - -sudo apt install firmware-b43-installer - -sudo apt install linux-firmware - -sudo reboot - -\ - -\ - -# simulate sunrise {#simulate-sunrise .western} - -Sunrise: - - - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# RP2040 Micropython {#rp2040-micropython .western} - -## PIR sensor + MQTT {#pir-sensor-mqtt .western} - - - -\ - -\ - -install MicroPython firmware: - - - - - -1\. Download the MicroPython UF2 file for your model of Raspberry Pi -Pico. - -\ - -2\. Push and hold the BOOTSEL button on the Pico, then connect to your -computer using a micro USB cable. Release BOOTSEL once the drive RPI-RP2 -appears on your computer. - -\ - -3\. Drag and drop the UF2 file on to the RPI-RP2 drive. The Raspberry Pi -Pico will reboot and will now run MicroPython. - -\ - -\ - -\ - -## Ultrasonic sensor {#ultrasonic-sensor .western} - - - -\ - -\ - -\ - -\ - -\ - -## Adafruit QT Py RP2040 {#adafruit-qt-py-rp2040 .western} - - - -\ - -Micopthon formware: - - - -\ - -\ - -\ - -\ - -# Seeed Xiao ESP32C3 {#seeed-xiao-esp32c3 .western} - - - -\ - -\ - -\ - -\ - -\ - -# Force influxdb to update in regular intervals {#force-influxdb-to-update-in-regular-intervals .western} - - - - - -\ - -\ - -\ - -# water meter; AI-on-the-edge {#water-meter-ai-on-the-edge .western} - - - - - - - - - - - -\ - -\ - - - - - - - -\ - - - -\ - -\ - - - -\ - -\ - -\ - -# water meter with image recognition on PC {#water-meter-with-image-recognition-on-pc .western} - -\ - - - - - - - -\ - - - - - -tesseract input.txt output.txt -l eng \--psm 3 - -\ - -\ - - - -[need to add esseract to sstempath!!!]{style="background: #ffff00"} - -cd C:\\Users\\Bora_2\\Downloads - -tesseract ziffer4.jpg stdout -l eng - -tesseract ziffer4.jpg output.txt - -tesseract input.txt output.txt -l eng - -\ - -\ - - - -\ - -[[https://github.com/tesseract-ocr/tesstrain]{style="background: #ffff00"}](https://github.com/tesseract-ocr/tesstrain) - -make training MODEL_NAME=test-model DATA_DIR=/data -GROUND_TRUTH_DIR=/data/foo-ground-truth - -\ - -\ - -install GNU make on Win10 - - - - - -1. install software - -2. add to PATH - - 1. C:\\Program Files (x86)\\GnuWin32\\bin - - 2. Copy the path and jump to edit environment variables from - windows search - - 3. Click Environment Variables. - - 4. Under user variables, find Path and click Edit. - - 5. Hit New, paste the copied path and hit Ok. - - 6. Hit OK on all other windows also. - -3. Now open a fresh CMD/Terminal and type make and and hit Enter. - -4. - -\ - -\ - - - -pip install pytesseract - -pip install numpy - -pip install opencv-python - -\ - -\ - -\$ tesseract --help-psm - -Page segmentation modes: - -0 Orientation and script detection (OSD) only. - -1 Automatic page segmentation with OSD. - -2 Automatic page segmentation, but no OSD, or OCR. (not implemented) - -3 Fully automatic page segmentation, but no OSD. (Default) - -4 Assume a single column of text of variable sizes. - -5 Assume a single uniform block of vertically aligned text. - -6 Assume a single uniform block of text. - -7 Treat the image as a single text line. - -8 Treat the image as a single word. - -9 Treat the image as a single word in a circle. - -10 Treat the image as a single character. - -11 Sparse text. Find as much text as possible in no particular order. - -12 Sparse text with OSD. - -13 Raw line. Treat the image as a single text line, - -bypassing hacks that are Tesseract-specific. - -\ - -\$ tesseract \--help-oem - -OCR Engine modes: - -0 Legacy engine only. - -1 Neural nets LSTM engine only. - -2 Legacy + LSTM engines. - -3 Default, based on what is available. - -\ - -\ - -\ - -## Training Tesseract on custom data {#training-tesseract-on-custom-data .western} - - - -\ - - - -\ - -\ - -\ - -\ - -# Edge Impulse {#edge-impulse .western} - - - - - -\ - - - -\ - -[[https://www.survivingwithandroid.com/tinyml-esp32-cam-edge-image-classification-with-edge-impulse/]{style="background: #ffff00"}](https://www.survivingwithandroid.com/tinyml-esp32-cam-edge-image-classification-with-edge-impulse/) - -\ - - - -\ - - - -\ - -\ - -\ - -\ - -# Tensorflow Lite {#tensorflow-lite .western} - - - -\ - - - -\ - - - -\ - - - -\ - - - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# Alarm system {#alarm-system .western} - - - - - - - -\ - -\ - -\ - -\ - -\ - -\ - -# MICRO PYTHON ON ESP32 (HUZZAH32) {#micro-python-on-esp32-huzzah32 .western} - - - - - - - -\ - -\ - -\ - -\ - -\ - -\ - -# install HACS {#install-hacs .western} - - - -1. install addon Terminal & SSH - -2. enter follwing code into WEB UI: wget -q -O - - https://install.hacs.xyz \| bash - - -3. Restart Server - -4. search for integration hacs - - 1. select all 4 check boxes - - 2. enter github credentials - -5. You can further enable AppDaemon and NetDaemon apps discovery & - tracking. In simple words these are more option to customize your - Home Assistant. - -6. - -\ - -\ - -\ - -\ - -# Camera {#camera .western} - -## M5Stack Timer Camera X {#m5stack-timer-camera-x .western} - -### Arduino {#arduino .western} - - - - - - - -\ - -\ - -\ - -\ - - - -Kamera Fernsteuern: -http://\/control?var=\&val=\ - -http://192.168.178.42/control?var=framesize&val=3 - -http://192.168.178.42:81/stream - -[commands work with web_cam example! → -web_cam_M5Stack_Timer-CAM_working]{style="background: #ffff00"} - -\ - - - -\ - -\ - -\ - -\ - -entity_id: camera.cam1 - -filename: /config/www/snapshot.jpg - -\ - -\ - -![](Home_assistant_html_b0a3a1c1e3c3da03.jpg){#Image52 align="bottom" -width="261" height="727" border="0"} - -\ - -alias: take periodic pictures\ -description: \"\"\ -trigger:\ -- platform: time_pattern\ -minutes: /1\ -condition: \[\]\ -action:\ -- service: camera.snapshot\ -data:\ -filename: \>-\ -/config/Timelapse/Plants\_{{ \"%04d\"\|format(now().year) }}\_{{\ -\"%02d\"\|format(now().month) }}\_{{ \"%02d\"\|format(now().day)\ -}}\_{{ \"%02d\"\|format(now().hour) }}\_{{ -\"%02d\"\|format(now().minute) }}\_{{ \"%02d\"\|format(now().second) -}}.jpeg\ -target:\ -entity_id: camera.esp32cam_1\ -mode: single - -\ - -\ - -### Micropython {#micropython .western} - - - - - - - -\ - -due to missing PSRAM, the micropython code does not work\... - -\ - -\ - -\ - -\ - -\ - -\ - -# Android controller for ESP32 {#android-controller-for-esp32 .western} - - - - - - - -\ - - - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# Python on Win10 {#python-on-win10 .western} - -Install via Microsoft store - -\ -\ - - - -create new venv: - -- python -m venv "D:\\Home Assistant\\Micropython\\myenv" - -\ - -activate in command prompt to install packages: - -- D:\\"Home Assistant"\\Python\\myenv\\Scripts\\activate.bat - -- pip install \... - -- deactivate - -\ - -to see the new venv in VSCode: - -1. Python: Select Interpreter → D:\\Home - Assistant\\Micropython\\myenv\\Scripts\\python.exe - -2. then, restart VSCode - -\ - -\ - -\ - -\ - -\ - -\ - -# using password manager {#using-password-manager .western} - -## KepassXC {#kepassxc .western} - - - -\ - -\ - -\ - -Use Yubico: - - -Database \> Database Security \> Add Additional protection... \> Add -Challenge-Response → choose Yubikey from the drop-down menu - -\ - -### browser plugin: {#browser-plugin .western} - - - -\ - -\ - -\ - -## keepass for Android {#keepass-for-android .western} - -[KeePass2Android]{style="background: #ffff00"} or KeePassDX - -\ - -\ - -\ - -\ - -## Syncthing {#syncthing .western} - -Download: - -Getting started: - - -Default Folder: C:\\Users\\Bora_2\\Sync - -\ - -Device Identification -- BoraNB: -3YHOKRG-D57OAYW-QW7Z23T-MQPGWLJ-ZGR4UCV-DUB-LX1: KOVYWX3-M6CXGFE-M4UQSQQ - -VOHODHG-KXFA7RQ-5NQ6LM3-3HLMSXC-6XMN4BH-XCIA7GC-LBZGX2G-N4APPQJ - -\ - -Starting Syncthing Automatically: - - -Windows: - -- create shortcut in following folder - - - folder: %APPDATA%\\Microsoft\\Windows\\Start - Menu\\Programs\\Startup - - - Alternatively, in newer versions of Windows, open - shell:startup from the Run command (Win+R). - - - path: \"D:\\Home - Assistant\\syncthing-windows-amd64-v1.22.2\\syncthing.exe\" - \--no-console \--no-browser - -- open: [http://localhost:8384](http://localhost:8384/) - -Linux - -- - -- - -\ - -\ - -\ - -\ - -\ - -# Soil sensor {#soil-sensor .western} - - - -\ - -3D models for assembling Adafruit soil sensor: - - - - - -\ - -\ - -\ - -\ - -\ - -\ - -# use wildcard for mqtt topics in automations {#use-wildcard-for-mqtt-topics-in-automations .western} - - - -topic: \"stat/+/RESULT\" - -\ - - - -As you have already discovered, this is not an acceptable way to use a -wildcard (#) in an MQTT topic: - -\ - -topic: \"#/batt\" - -The \# wildcard can appear at the end of a topic, like this: - -\ - -topic: \"home/sensors/#\" - -or alone: - -\ - -topic: \"#\" - -You didn't mention the format of the battery topic but maybe the + -wildcard can be useful. It is designed to allow for any sub-topic like -this: - -\ - -topic: \"home/OpenMQTTGateway/BttoMQTT/+/batt\" - -\ - -\ - -\ - - - -\ - -data_template: - -message: "{{ trigger.payload }}" - -title: From mqtt_notifier - -service: persistent_notification.create - -\ - -\ - -\ - -# Tutorial to fix 401: Unauthorised Error with Grafana for mobile devices {#tutorial-to-fix-401-unauthorised-error-with-grafana-for-mobile-devices .western} - - - -\ - -it works! - -port forward router:\ -443 to 8123 tcp\ -and\ -80 to 3000 tcp\ -and grafana setings: - -``` {.western style="orphans: 2; widows: 2"} -plugins: [] -env_vars: - - name: GF_AUTH_ANONYMOUS_ORG_NAME - value: Main Org. - - name: GF_AUTH_ANONYMOUS_ENABLED - value: 'true' - - name: GF_AUTH_DISABLE_LOGIN_FORM - value: 'false' -ssl: false -certfile: fullchain.pem -keyfile: privkey.pem -``` - -\ - -\ - -\ - -\ - -# Shelly configuration via web interface {#shelly-configuration-via-web-interface .western} - - - -192.168.33.1 - -Id: A8032AB82968 - -bedroom: shellyplus1pm-a8032ab82968 → 192.168.178.53 - -top child room: shellyplus1pm-a8032abba0b0 → 192.168.178.54 - -living room: shellyplusi4-a8032ab1d7d0 → 192.168.178.55 - -bed room: shellyplusi4-a8032ab1c9e0 → 192.168.178.56 - -shellyrgbw2-E0AC83 → 192.168.178.76 - -\ -\ - -![](Home_assistant_html_64332a2908217e72.png){#Image50 align="bottom" -width="508" height="284" border="0"} - -\ -\ - -\ -\ - -FRITZ!Box 7530 GD - -78302839617779115068 - -\ -\ - -MQTT credentials: - -192.168.178.32:1883 → 192.168.178.52:1883 - -note4 - -note4 - -![](Home_assistant_html_c2e67b530b770151.png){#Image49 align="bottom" -width="332" height="413" border="0"} - -\ -\ - -\ -\ - -\ -\ - -\ -\ - - - -shellyplus1pm-a8032ab82968/rpc - -shellyplus1pm-a8032ab82968/events/rpc - -shellyplusi4-a8032ab1d7d0/events/rpc - -shellyplusi4-a8032ab1c9e0/events/rpc - -shellyrgbw2-E0AC83/events/rpc - -\ - -\ - - - -Generation 2 devices use the values btn_down, btn_up, single_push, -double_push and long_push as click_type. - -\ - -\ - -\ - - - -\ - -power consumption LED (green channel stuck at 100%; red LEDs not -connected on one strip; in total ca. 250 LEDs): - -green 100%: 7.7 W - -green+blue 100%: 16.3 W - -green+red 100%: 18.7 W - -white = green+blue+red 100%: 26.4 W - -green 100%+blue 50%+red 50%: 17.8 W - -green 100%+blue 1%+red 1%: 9.7 W - -\ - -\ - -\ - -nice automations: - - - -\ - -\ - -\ - -\ - -\ - -example to send command to shell: - -service: mqtt.publish - -data: - -topic: homeassistant/shellyplus1pm-fgfloodlights/rpc - -payload: \>- - -{{ {'id': 1, 'src':'homeassistant/shellyplus1pm-fgfloodlights/status', - -'method':'Shelly.GetStatus'} \| to_json }} - -\ - -\ - -\ - -# Shelly integration via MQTT {#shelly-integration-via-mqtt .western} - - - -[\ = shellyplus1pm]{style="background: #ffff00"} - -\ - -\ - - - -Shelly1/1PM: MQTT - -\ - -Shelly1 and Shelly1PM uses the following topics, where \ is -either shelly1 or shelly1pm: - -\ - -shellies/\-\/relay/0 to report status: on, off or -overpower (the latter only for Shelly1PM) - -shellies/\-\/relay/0/command accepts on, off or -toggle and applies accordingly - -shellies/\-\/input/0 reports the state of the SW -terminal - -shellies/\-\/longpush/0 reports longpush state as 0 -(shortpush) or 1 (longpush) - -shellies/\-\/input_event/0 reports input event and -event counter, e.g.: {\"event\":\"S\",\"event_cnt\":2} see /status for -details - -\ - -Shelly1PM adds: - -\ - -shellies/shelly1pm-\/relay/0/power reports instantaneous -power in Watts - -shellies/shelly1pm-\/relay/0/energy reports an incrementing -energy counter in Watt-minute - -shellies/shelly1pm-\/temperature reports internal device -temperature in °C - -shellies/shelly1pm-\/temperature_f reports internal device -temperature in °F - -shellies/shelly1pm-\/overtemperature reports 1 when device -has overheated, normally 0 - -shellies/shelly1pm-\/temperature_status reports Normal, High, -Very High - -shellies/shelly1pm-\/relay/0/overpower_value reports the -value in Watts, on which an overpower condition is detected - -\ - -\ - -\ - -\ - -\ - -\ - -\ - - - -mqtt: - -switch: - -\- name: \"Garage: Heat pump switch\" - -state_topic: \"garage-heat-pump-switch-pm/status/switch:0\" - -value_template: \"{{ value_json.output }}\" - -state_on: true - -state_off: false - -command_topic: \"garage-heat-pump-switch-pm/rpc\" - -payload_on: \'{\"id\":1, \"src\": \"homeassistant\", \"method\": -\"Switch.Set\", \"params\":{\"id\":0,\"on\":true}}\' - -payload_off: \'{\"id\":1, \"src\": \"homeassistant\", \"method\": -\"Switch.Set\", \"params\":{\"id\":0,\"on\":false}}\' - -optimistic: false - -qos: 1 - -retain: false - -sensor: - -\- name: \"Garage: Heat pump switch temperature\" - -unique_id: 4ca71dd5-645d-48e5-a387-a655cc7dd42e - -state_topic: \"garage-heat-pump-switch-pm/status/switch:0\" - -value_template: \"{{ value_json.temperature.tC }}\" - -unit_of_measurement: \"°C\" - -device_class: temperature - -\- name: \"Garage: Heat pump switch current power\" - -unique_id: 44f6d6de-be45-4697-8ff9-882fae91c6a2 - -state_topic: \"garage-heat-pump-switch-pm/status/switch:0\" - -value_template: \"{{ value_json.apower }}\" - -unit_of_measurement: \"W\" - -device_class: power - -\- name: \"Garage: Heat pump switch total power\" - -unique_id: 44f6d6de-be45-4697-8ff9-882fae91c6a1 - -state_topic: \"garage-heat-pump-switch-pm/status/switch:0\" - -value_template: \"{{ value_json.aenergy.total }}\" - -unit_of_measurement: \"W\" - -device_class: power - -\ - -\ - -\ - -\ - - - -Hi folkes,\ -I am a bit inpatient and cannot waiting for the Shelly binding to cover -the new devices and I read that due to the new ESP32 and new API, Shelly -devices can now run cloud and MQTT in parallel. So if you start -controlling your new devices (e.g. the Shelly Plus 1PM) via MQTT, you -are not missing out on anything else. So here is my thing code for the -Shelly Plus 1PM: - -``` {.western style="orphans: 2; widows: 2"} -UID: mqtt:topic:5d0f79cab1:b0df524d88 -label: MQTT Shelly Plus 1PM -thingTypeUID: mqtt:topic -configuration: - payloadNotAvailable: off - payloadAvailable: on -bridgeUID: mqtt:broker:5d0f79cab1 -location: MQTT -channels: - - id: id - channelTypeUID: mqtt:number - label: ID - description: "" - configuration: - stateTopic: shellyplus1pm-44179393f8d0/status/switch:0 - transformationPattern: JSONPATH:$.id - - id: source - channelTypeUID: mqtt:string - label: Quelle - description: "" - configuration: - stateTopic: shellyplus1pm-44179393f8d0/status/switch:0 - transformationPattern: JSONPATH:$.source - - id: output - channelTypeUID: mqtt:string - label: Ausgang - description: "" - configuration: - stateTopic: shellyplus1pm-44179393f8d0/status/switch:0 - transformationPattern: JSONPATH:$.output - - id: apower - channelTypeUID: mqtt:number - label: Leistung - description: "" - configuration: - unit: W - formatBeforePublish: "%.2f" - stateTopic: shellyplus1pm-44179393f8d0/status/switch:0 - transformationPattern: JSONPATH:$.apower - - id: voltage - channelTypeUID: mqtt:number - label: Spannung - description: null - configuration: - unit: V - formatBeforePublish: "%.2f" - stateTopic: shellyplus1pm-44179393f8d0/status/switch:0 - transformationPattern: JSONPATH:$.voltage - - id: current - channelTypeUID: mqtt:number - label: Strom - description: null - configuration: - unit: A - formatBeforePublish: "%.2f" - stateTopic: shellyplus1pm-44179393f8d0/status/switch:0 - transformationPattern: JSONPATH:$.current - - id: aenergy - channelTypeUID: mqtt:number - label: Energie - description: null - configuration: - unit: Wh - formatBeforePublish: "%.2f" - stateTopic: shellyplus1pm-44179393f8d0/status/switch:0 - transformationPattern: JSONPATH:$.aenergy.total - - id: temperature - channelTypeUID: mqtt:number - label: Temperatur - description: null - configuration: - unit: °C - formatBeforePublish: "%.2f" - stateTopic: shellyplus1pm-44179393f8d0/status/switch:0 - transformationPattern: JSONPATH:$.temperature.tC - - id: input - channelTypeUID: mqtt:switch - label: Input - description: "" - configuration: - stateTopic: shellyplus1pm-44179393f8d0/status/input:0 - transformationPattern: JSONPATH:$.state - off: "false" - on: "true" - - id: control - channelTypeUID: mqtt:switch - label: Schalter - description: null - configuration: - commandTopic: shellyplus1pm-44179393f8d0/rpc - formatBeforePublish: '{"src":"openhab", "method":"Switch.Set", "params":{"id":0,"on":%s}}' - stateTopic: shellyplus1pm-44179393f8d0/status/switch:0 - transformationPattern: JSONPATH:$.output - off: "false" - on: "true" - - id: online - channelTypeUID: mqtt:switch - label: Verbunden - description: "" - configuration: - stateTopic: shellyplus1pm-44179393f8d0/online - off: "false" - on: "true" - - id: cloud - channelTypeUID: mqtt:switch - label: Cloud - description: "" - configuration: - stateTopic: shellyplus1pm-44179393f8d0/status/cloud - transformationPattern: JSONPATH:$.connected - off: flase - on: "true" - - id: mqtt - channelTypeUID: mqtt:switch - label: MQTT - description: "" - configuration: - stateTopic: shellyplus1pm-44179393f8d0/status/cloud - transformationPattern: JSONPATH:$.connected - off: "false" - on: "true" - - id: kvs1 - channelTypeUID: mqtt:string - label: KVS1 - description: null - configuration: - commandTopic: shellyplus1pm-44179393f8d0/rpc - postCommand: true - formatBeforePublish: '{"src":"openhab","method":"KVS.Get","params":{"id":1,"key":"admin"}}' - stateTopic: shellyplus1pm-44179393f8d0/openhab/rpc - transformationPattern: JSONPATH:$.params.value -``` - -\ -\ -\ - -\ -\ - -\ -\ - - - -\## /sensors/room_x/lamp.yaml - -\ -\ - -\# Input type - -\- platform: mqtt - -name: Room X - lamp - input - -expire_after: 86400 - -qos: 1 - -state_topic: shellies/shelly1pm-\[SHELLY ID\]/input_event/0 - -\# Device temperature °C - -\- platform: mqtt - -name: Room X - lamp - temperature - -expire_after: 86400 - -qos: 1 - -device_class: temperature - -unit_of_measurement: \'°C\' - -icon: mdi:temperature-celcius - -state_topic: shellies/shelly1pm-\[SHELLY ID\]/temperature - -\# Device temperature °F - -\- platform: mqtt - -name: Room X - lamp - temperature F - -expire_after: 86400 - -qos: 1 - -device_class: temperature - -unit_of_measurement: \'°F\' - -icon: mdi:temperature-fahrenheit - -state_topic: shellies/shelly1pm-\[SHELLY ID\]/temperature_f - -\# Power consumption (live) - -\- platform: mqtt - -name: Room X - lamp - power - -expire_after: 86400 - -qos: 1 - -device_class: power - -unit_of_measurement: \'W\' - -icon: mdi:lightning-bolt-outline - -state_topic: shellies/shelly1pm-\[SHELLY ID\]/relay/0/power - -\# Power consumption (since reboot) - -\- platform: mqtt - -name: Room X - lamp - energy - -expire_after: 86400 - -qos: 1 - -device_class: energy - -state_class: total_increasing - -unit_of_measurement: \'Wh\' - -value_template: \"{{ value \| float / 60 }}\" - -icon: mdi:lightning-bolt - -state_topic: shellies/shelly1pm-\[SHELLY ID\]/relay/0/energy - -\# Overpower - -\- platform: mqtt - -name: Room X - lamp - overpower - -expire_after: 86400 - -qos: 1 - -device_class: power - -unit_of_measurement: \'W\' - -icon: mdi:flash-alert - -state_topic: shellies/shelly1pm-\[SHELLY ID\]/overpower_value - -\ -\ - -\ -\ - -\ -\ - -## rgbw2 via mqtt {#rgbw2-via-mqtt .western} - - - - - - - -shellies/shellyrgbw2-E0AC83/white/3/status - -shellies/shellyrgbw2-E0AC83/color/0/status - -\ -\ - -\ -\ - -\ -\ - -\ -\ - -\ -\ - -\ - -\ - -# Shelly integration via ESPHome {#shelly-integration-via-esphome .western} - - - -\ - -\ - -\ - -\ - -# Shelly firmware update {#shelly-firmware-update .western} - -## Via MQTT {#via-mqtt .western} - - - -in configuration.yaml, add the rest integration and configure like so: - -\ - -rest_command: - -update_shelly: - -url: \'http://{{ shelly_ip }}/ota?update=true\' - -\ - -\ - -create a new automation, eg. shellyupdate.yaml that looks like this: - -\ - -\- alias: \"Shelly New Firmware Notification\" - -id: \'snfn\' - -trigger: - -platform: mqtt - -topic: shellies/announce - -condition: - -condition: template - -value_template: \"{{ trigger.payload_json\[\'new_fw\'\] == true }}\" - -action: - -\- service: persistent_notification.create - -data_template: - -title: \"New Shelly Firmware Update Released. Update will be -attempted.\" - -message: Update will be attempted\" - -notification_id: \"{{ trigger.payload_json\[\'id\'\] }}\" - -\- service: rest_command.update_shelly - -data: - -shelly_ip: \"{{ trigger.payload_json\[\'ip\'\] }}\" - -\- alias: \"Shelly New Firmware Notification Removal\" - -id: \'snfnr\' - -trigger: - -platform: mqtt - -topic: shellies/announce - -condition: - -condition: template - -value_template: \"{{ trigger.payload_json\[\'new_fw\'\] == false }}\" - -action: - -service: persistent_notification.dismiss - -data_template: - -notification_id: \"{{ trigger.payload_json\[\'id\'\] }}\" - -\ - -\ - -\ - -## Via REST API {#via-rest-api .western} - - - -http://\[IP-OF-SHELLY/ota?update=1 does the trick - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# Node Red {#node-red .western} - - - -\ - - - -\ - -\ - -\ - -\ - -\ - -\ - -# Deye Wechselrichter {#deye-wechselrichter .western} - -Solarman? - -See KeePassXC - -\ -\ - -\ -\ - -\ -\ - -\ -\ - -\ -\ - -\ -\ - -\ -\ - -\ -\ - -# Using Wemos Lolin ESP32 boards {#using-wemos-lolin-esp32-boards .western} - -## C3 Mini {#c3-mini .western} - - - -\ - - - -static const uint8_t LED_BUILTIN = 7; - -#define BUILTIN_LED LED_BUILTIN // backward compatibility - -static const uint8_t TX = 21; - -static const uint8_t RX = 20; - -static const uint8_t SDA = 8; - -static const uint8_t SCL = 10; - -static const uint8_t SS = 5; - -static const uint8_t MOSI = 4; - -static const uint8_t MISO = 3; - -static const uint8_t SCK = 2; - -static const uint8_t A0 = 0; - -static const uint8_t A1 = 1; - -static const uint8_t A2 = 2; - -static const uint8_t A3 = 3; - -static const uint8_t A4 = 4; - -static const uint8_t A5 = 5; - -\ - -Wifi funktioniert nicht → Wifi TX auf 8,5 dBm setzen: - -WiFi.setTxPower(WIFI_POWER_8_5dBm); - -\ - -### Arduino: {#arduino-1 .western} - -- Configure Board - - - Use lastest esp32 arduino package - - - Choose board LOLIN C3 MINI - -- Upload Code - - - Make C3 boards into Device Firmware Upgrade (DFU) mode. - - - Hold on Button 9 - - - Press Button Reset - - - Release Button 9 When you hear the prompt tone on usb - reconnection - -\ - -\ - -\ - -\ - -## Wemos S2 Pico {#wemos-s2-pico .western} - -- D:\\"Home Assistant"\\Python\\myenv\\Scripts\\activate.bat - -- pip install esptool - -\ - -- Make S2 boards into Device Firmware Upgrade (DFU) mode. - -- - -- Hold on Button 0 - - - Press Button Reset - - - Release Button 0 When you hear the prompt tone on usb - reconnection - -- Flash using esptool.py - - - esptool.py \--port PORT_NAME erase_flash - - - esptool.py \--port COM20 erase_flash - - - esptool.py \--port PORT_NAME \--baud 1000000 write_flash -z - 0x1000 FIRMWARE.bin - - - esptool.py \--port PORT_NAME \--baud 1000000 write_flash -z - 0x1000 FIRMWARE.bin - -\ - -\ - - - -\ - -\ - - - -## []{#h-ssd1306-oled-micropython-library} SSD1306 OLED MicroPython Library {#ssd1306-oled-micropython-library .western style="font-variant: normal; letter-spacing: normal; font-style: normal; font-weight: normal"} - -**We will have to install the SSD1306 OLED library for MicroPython to -continue with our project.** - -- [[[**To successfully do that, open your Thonny IDE with your - Raspberry Pi Pico plugged in your system. Go - to **]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - **Tools \> Manage Packages**[[[**. This will open up the Thonny - Package - Manager.**]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -\ -\ - -- **Search for "ssd1306" in the search bar by typing its name and - clicking the button 'Search on PyPI.'** - -\ -\ - -- **From the following search results click on the one highlighted - below: micropython-ssd1306** - -\ -\ - -**Install this library.** - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# Home Assistant presence simulation {#home-assistant-presence-simulation .western} - - - -\ - -\ - -\ - -\ - - - -\ - -[[[[I created an toggle helper -called ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -`input_boolean.holidaymode`{.western}[[[[:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -1. [[[[Go - to ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Settings*[[[[ then ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Devices & Services* -2. [[[[Click on - the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Helpers *[[[[tab (in the web interace this will be at the top, on - the Android app it\'s an icon at the - bottom]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -3. [[[[Click ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *create helper* -4. [[[[Choose ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Toggle* -5. [[[[Type a name - (e.g., ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - `HolidayMode`{.western}[[[[) and choose an icon - (e.g., ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - `mdi:beach`{.western}[[[[) and - click ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Create* -6. [[[[The list of helpers will now - include ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - `input_boolean.holidaymode`{.western} - -[[[[As the automation stores the light it is going to change (switch on -or off) in the -\"]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -*light to switch*[[[[\" variable, we need to create -that.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -1. [[[[Go - to ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Settings*[[[[ then ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Devices & Services* -2. [[[[Click on - the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Helpers *[[[[tab (in the web interace this will be at the top, on - the Android app it\'s an icon at the - bottom]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -3. [[[[Click ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *create helper* -4. [[[[Choose ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Text* -5. [[[[For name, - type ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - `light_to_switch`{.western}[[[[ and leave the other options as their - defaults]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -6. [[[[Click ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Create* -7. [[[[The list of helpers will now - include ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - `input_text.light_to_switch`{.western} - -Once we\'ve created the light group we\'ll be referencing it by name in -the automation. - -1. [[[[Go - to ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Settings*[[[[ then ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Devices & Services* - -2. [[[[Click on - the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Helpers *[[[[tab (in the web interace this will be at the top, on - the Android app it\'s an icon at the - bottom]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -3. [[[[Click ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *create helper* - -4. [[[[Choose ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Group*[[[[ (a circle with three dots in - it)]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -5. [[[[When asked what type of group this is, - choose ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Light group* - -6. Give your group a name (e.g., \"Presence simulation lights\") and - choose the members to include in the group - -7. [[[[Click ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Submit* - -8. [[[[In the helpers list you\'ll see a group - called ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - `light.presence_simulation_lights`{.western}[[[[ - copy this name - exactly as we\'ll need it in the - automation]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -Create automation - random lights on - -``` western -alias: "Holiday mode: Presence simulation" -trigger: - - platform: time_pattern - minutes: /30 -condition: - - condition: state - entity_id: input_boolean.holidaymode - state: "on" - - condition: sun - after: sunset - after_offset: "-00:30:00" - - condition: time - before: "22:00:00" -action: - - delay: 00:{{ '{:02}'.format(range(0,30) | random | int) }}:00 - - service: input_text.set_value - data_template: - entity_id: input_text.light_to_switch - value: "{{ state_attr('light.presence_simulation_lights','entity_id') | random }}" - - service: homeassistant.toggle - data_template: - entity_id: "{{states('input_text.light_to_switch')}}" -initial_state: true -hide_entity: false -``` - -\ - -Create automation - lights off at random bedtime - -``` western -alias: "Holiday mode: Turning off all toggled lights" -description: "" -trigger: - - platform: time - at: "23:00:00" -condition: - - condition: state - entity_id: input_boolean.holidaymode - state: "on" -action: - - delay: 00:{{ range(15,59) | random | int }}:00 - - service: homeassistant.turn_off - data: {} - target: - entity_id: light.presence_simulation_lights -initial_state: true -hide_entity: false -mode: single -``` - -\ - -\ - -\ - -\ - -\ - -\ - - - -\ -\ - -Add the following script in your scripts configuration file (ie  - -`scripts.yaml`{.western}) - -[COPY]{style="display: inline-block; border: none; padding: 0in"} - -``` {.western style="border: none; padding: 0in"} -light_duration: - mode: parallel - description: "Turns on a light for a while, and then turns it off" - fields: - light: - description: "A specific light" - example: "light.bedroom" - duration: - description: "How long the light should be on in minutes" - example: "25" - sequence: - - service: homeassistant.turn_on - data: - entity_id: "{{ light }}" - - delay: "{{ duration }}" - - service: homeassistant.turn_off - data: - entity_id: "{{ light }}" -``` - -\ - -The automation will then start the script providing the correct -parameters. - -[COPY]{style="display: inline-block; border: none; padding: 0in"} - -``` {.western style="border: none; padding: 0in"} -- id: random_away_lights - alias: "Random Away Lights" - mode: parallel +https://community.home-assistant.io/t/how-to-manually-set-state-value-of-sensor/43975/21 +- id: automation 3 trigger: - - platform: time_pattern - minutes: "/30" - condition: - - condition: state - entity_id: input_boolean.away - state: "on" - - condition: sun - after: sunset - after_offset: "-00:30:00" - - condition: time - before: "23:59:00" + platform: time_pattern + minutes: '/1' action: - service: script.light_duration - data: - light: "{{states.group.simulation_lights.attributes.entity_id | random}}" - duration: "00:{{ '{:02}'.format(range(5,30) | random | int) }}:00" -``` - -\ - -I created a group with a list of lights I want to use to simulate the -presence. I put only the lights within the rooms visible from the -outside. - -[COPY]{style="display: inline-block; border: none; padding: 0in"} - -``` {.western style="border: none; padding: 0in"} -simulation_lights: - name: Lights Presence Simulation - entities: - - light.salle_manger - - light.cuisine_table - - light.bureau_marco - - light.salon_corner -``` - -\ - -\ - -\ - -## scheduler-component {#scheduler-component .western} - - - - - -\ -\ - -\ - -\ - -\ - -\ - -# reduce size of database {#reduce-size-of-database .western} - - - -recorder: - -purge_keep_days: 5 - -db_url: sqlite:////home/user/.homeassistant/test - -\ - -\ - -\ - - - -1. [[[[open up a terminal (SSH or via web, I use this extension for - this - purpose ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[[https://github.com/hassio-addons/addon-ssh ]{style="background: transparent"}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="text-decoration: none"}]{style="font-variant: normal"}](https://github.com/hassio-addons/addon-ssh) - [130](https://github.com/hassio-addons/addon-ssh)[[[[)]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -2. [[[[change directory to - config ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`cd ~/config`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -3. [[[[open sqlite - shell ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`sqlite3 home-assistant_v2.db`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -4. [[[[enter the following commands in the shell:\ - ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`.header on`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[\ - ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`.mode column`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[\ - ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`.width 50, 10,`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[\ - ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`SELECT entity_id, COUNT(*) as count FROM states GROUP BY entity_id ORDER BY count DESC LIMIT 20;`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -\ - -\ - - - -homeassistant: - -allowlist_external_dirs: - -\- /config - -sensor: - -\- platform: filesize - -file_paths: - -\- /config/home-assistant_v2.db - -\ - -\ - -![](Home_assistant_html_1a71f91fe23da888.png){#Image14 align="left" -width="643" height="339" border="0"}\ - -\ - -\ - -\ - -\ - -\ - -# WIZ light scenes {#wiz-light-scenes .western} - - - -SCENES = { - -1: \"Ocean\", - -2: \"Romance\", - -3: \"Sunset\", - -4: \"Party\", - -5: \"Fireplace\", - -6: \"Cozy\", - -7: \"Forest\", - -8: \"Pastel Colors\", - -9: \"Wake up\", - -10: \"Bedtime\", - -11: \"Warm White\", - -12: \"Daylight\", - -13: \"Cool white\", - -14: \"Night light\", - -15: \"Focus\", - -16: \"Relax\", - -17: \"True colors\", - -18: \"TV time\", - -19: \"Plantgrowth\", - -20: \"Spring\", - -21: \"Summer\", - -22: \"Fall\", - -23: \"Deepdive\", - -24: \"Jungle\", - -25: \"Mojito\", - -26: \"Club\", - -27: \"Christmas\", - -28: \"Halloween\", - -29: \"Candlelight\", - -30: \"Golden white\", - -31: \"Pulse\", - -32: \"Steampunk\", - -1000: \"Rhythm\", - -} - -\ - -\ - -\ - -# ESP32 Wifi repeater {#esp32-wifi-repeater .western} - - - -\ - -download repository and flash tool: - - - - - -\ - -run the tool and select the three files in the folder D:\\Home -Assistant\\ESP32_wifi_repeater\\esp32_nat_router-master\\build\\esp32: -bootloader.bin, firmware.bin, partitions.bin - -\ - -Now, we also need to specify the hex code indicating where the files -are. For the bootloader type 0x1000, for esp32 nat router file type -0x10000, and for partition file type 0x8000. - -\ - -Press and hold the boot button on your ESP32 board and click on the -start button to start flashing firmware. - -\ - -![](Home_assistant_html_a271954676b4d389.png){#Image15 align="bottom" -width="422" height="670" border="0"} - -\ - -\ - -After the first boot, it provides an open WiFi SSID "ESP32_NAT_Router". -Connect to this WiFi network and perform basic configuration via a -simple web interface. - -\ - -The web interface allows for the configuration of all the parameters -required for basic forwarding functionality. Open your web browser and -enter the following address: "**http://192.168.4.1**". Now you should -see the following page. - -\ - -Firstly, in the "STA Settings" enter the correct WiFi credentials of -your main WiFi network that you want to extend. Leave the password field -for open networks. Click on "Connect". The ESP32 reboots and will -connect to your WiFi router. You should see the status LED ON after a -few seconds. - -\ - -You can now reload the page and change the "AP Settings". Enter New SSID -and Password and click "Set" and again the ESP reboots. Now it is ready -for forwarding traffic over the newly configured Access Point. - -\ - -**SSID: ESP32_NAT_Router** - -**pass: mysupersecurepassword** - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# install home assistant in docker {#install-home-assistant-in-docker .western} - -\ - -\ - -\ - -## install Docker {#install-docker .western} - -192.168.178.52 - -pi - -raspberry - -\ - - - -[sudo apt update]{style="background: #ffff00"} - -[sudo apt upgrade -y]{style="background: #ffff00"} - -[sudo reboot]{style="background: #ffff00"} - -[curl -sSL https://get.docker.com \| sh]{style="background: #ffff00"} - -Allow Docker to be used without being a root → So, here is the command -to add the current user to the docker group: sudo usermod -aG docker -\$USER → [sudo usermod -aG docker -]{style="background: #ffff00"}[pi]{style="background: #ffff00"} - -Exit your SSH session, or restart the Raspberry Pi, and you should then -be able to run any docker command without sudo. → docker ps → If it -works, you are ready to move forward. - -Test your Docker setup: [docker run -hello-world]{style="background: #ffff00"} - -\ - -### Docker commands you need to know {#docker-commands-you-need-to-know .western} - -- Monitor the running containers: - - - docker ps - -- Display the current version of Docker: - - - docker version - -- Download a new image: - - - docker pull \[IMAGE\] - -- Run an image (and download it if not existing on your local system): - - - docker run \[IMAGE\] - -- Search for an image in the Docker repository: - - - docker search \[X\] - -- Show the usage statistics: - - - docker stats - -- Display the list of all the Docker commands: - - - docker help - -\ - -\ - -\ - -\ - -## install HA on docker {#install-ha-on-docker .western} - - - -docker run -d \\ - -\--name homeassistant \\ - -\--privileged \\ - -\--restart=unless-stopped \\ - --e TZ=[Europe/Berlin]{style="background: #ffff00"} \\ - --v /PATH_TO_YOUR_CONFIG:[/config]{style="background: #ffff00"} \\ - -\--network=host \\ - -ghcr.io/home-assistant/home-assistant:stable - -\ - -Once the Home Assistant Container is running Home Assistant should be -accessible using http://\:8123 - -http://192.168.178.52:8123 - -\ - -\ - -\ - -RESTART HOME ASSISTANT - -docker restart homeassistant - -\ - -\ - -\ - -\ - -\ - -\ - -## configuration {#configuration .western} - - - -cd \~/docker - -mkdir configurator - -cd configurator - -sudo nano docker-compose.yaml - -\ - -**version: \"3.5\"** - -**services:** - -**configurator:** - -**container_name: configurator** - -**image: causticlab/hass-configurator-docker:latest** - -**restart: always** - -**network_mode: host** - -**labels:** - -**- \"com.centurylinklabs.watchtower.enable=true\" \# for Watchtower -automatic updates** - -**ports:** - -**- \"3218:3218/tcp\"** - -**volumes:** - -**- \${HASSIODIR}/:/config \# map this volume to your hassio config -directory** - -**environment:** - -**- HC_BASEPATH=/config** - -**- HC_HASS_API_PASSWORD=\${CONFIGURATORPSWD} #Create a Long-Lived -Access Token** - -**- HC_IGNORE_SSL=True** - -**- PUID=\${PUID}** - -**- PGID=\${PGID}** - -**- TZ=\${TZ}\'** - -\ - -docker-compose up -d - -\ - -[http://192.168.178.52:3218]{style="background: #ffff00"} - -\ - -\ - - - -edit configuration.yaml: - -**http:** - -**base_url: https://myhomeassistant.com:8123** - -**ssl_certificate: /config/fullchain.pem** - -**ssl_key: /config/privkey.pem** - -\ - -create certifactes: - -cd /PATH_TO_YOUR_CONFIG - -sudo openssl req -sha256 -addext \"subjectAltName = IP:192.168.178.52\" --newkey rsa:4096 -nodes -keyout privkey.pem -x509 -days 730 -out -fullchain.pem - -\ - -\ - -\ - -## install Nginx on docker {#install-nginx-on-docker .western} - -Home Assistant in Docker with Nginx and Let\'s Encrypt on Raspberry Pi - -\ - -cd \~/docker - -mkdir proxy - -cd proxy - -sudo nano docker-compose.yaml - -\ - -**version: \'3\'** - -**services:** - -**nginx:** - -**image: arm64v8/nginx** - -**ports:** - -**- \"80:80\"** - -**volumes:** - -**- ./data/nginx:/etc/nginx/conf.d:ro** - -**- ./data/wwwroot:/var/www/root:ro** - -\ - -mkdir data - -cd data - -mkdir nginx - -cd nginx - -sudo nano app.conf - -\ - -**server {** - -**listen 80;** - -**server_name [habora]{style="background: #ffff00"}.duckdns.org; -#replace this** - -**location / {** - -**root /var/www/root;** - -**}** - -**}** - -\ - -cd .. - -mkdir wwwroot - -cd wwwroot - -sudo nano index.html - -\ - -**\** - -**\** - -**\Welcome\** - -**It works!** - -**\T** - -\ - -cd \~/docker/proxy - -docker-compose up -d - -\ - -http://192.168.178.52:80/ - -\ - -cd \~/docker/proxy - -sudo nano docker-compose.yaml - -\ - -**version: \'3\'** - -**services:** - -**nginx:** - -**image: arm64v8/nginx** - -**ports:** - -**- \"80:80\"** - -**- \"443:443\" \# added** - -**volumes:** - -**- ./data/nginx:/etc/nginx/conf.d:ro** - -**- ./data/wwwroot:/var/www/root:ro** - -**- ./data/certbot/conf:/etc/letsencrypt:ro \# added** - -**- ./data/certbot/www:/var/www/certbot:ro \# added** - -\ - -**certbot: \# added** - -**image: certbot/certbot:arm64v8-latest \# added** - -**volumes: \# added** - -**- ./data/certbot/conf:/etc/letsencrypt \# added** - -**- ./data/certbot/www:/var/www/certbot \# added** - -\ - -\ - -cd \~/docker/proxy/data/nginx - -sudo nano app.conf - -\ - -**server {** - -**listen 80;** - -**server_name [habora]{style="background: #ffff00"}.duckdns.org; \# -replace this** - -**location /.well-known/acme-challenge/ { \# added** - -**root /var/www/certbot; \# added** - -**} \# added** - -**location / {** - -**root /var/www/root;** - -**}** - -**}** - -**server {** - -**listen 443 ssl;** - -**server_name [habora]{style="background: #ffff00"}.duckdns.org;** - -\ - -**location / {** - -**root /var/www/root;** - -**}** - -\ - -**ssl_certificate -/etc/letsencrypt/live/[habora.duckdns.org]{style="background: #ffff00"}/fullchain.pem;** - -**ssl_certificate_key -/etc/letsencrypt/live/[habora.duckdns.org]{style="background: #ffff00"}/privkey.pem;** - -**#Optional: Only works with Philipp\'s script (see below)** - -**include /etc/letsencrypt/options-ssl-nginx.conf;** - -**ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;** - -**}** - -\ - -cd \~/docker/proxy - -curl -L -https://raw.githubusercontent.com/wmnnd/nginx-certbot/master/init-letsencrypt.sh -\> init-letsencrypt.sh - -\ - -sudo nano init-letsencrypt.sh - -**Edit the script to add in your domain(s) and your email address. If -you've changed the directories of the shared Docker volumes, make sure -you also adjust the data_path variable as well.** - -**Email:** **, -[https://habora.duckdns.org](https://habora.duckdns.org/)** - -\ - -chmod +x init-letsencrypt.sh - -sudo ./init-letsencrypt.sh - -\ - -docker-compose up -d - -http://habora.duckdns.org:80/ - -\ - -rm docker-compose.yaml - -sudo nano docker-compose.yaml - -\ - -**version: \'3\'** - -**services:** - -**nginx:** - -**image: arm64v8/nginx** - -**ports:** - -**- \"80:80\"** - -**- \"443:443\"** - -**volumes:** - -**- ./data/nginx:/etc/nginx/conf.d:ro** - -**- ./data/wwwroot:/var/www/root:ro** - -**- ./data/certbot/conf:/etc/letsencrypt:ro** - -**- ./data/certbot/www:/var/www/certbot:ro** - -**command: \"/bin/sh -c \'while :; do sleep 6h & wait \$\${!}; nginx -s -reload; done & nginx -g \\\"daemon off;\\\"\'\"** - -**certbot:** - -**image: certbot/certbot:arm64v8-latest** - -**volumes:** - -**- ./data/certbot/conf:/etc/letsencrypt** - -**- ./data/certbot/www:/var/www/certbot** - -**entrypoint: \"/bin/sh -c \'trap exit TERM; while :; do certbot renew; -sleep 12h & wait \$\${!}; done;\'\"** - -\ - -\ - -\ - -\ - -\ - -\ - - - -http://192.168.178.52:9000/ - -\ - -\ - -\ - -### working procedure: {#working-procedure .western} - -[[https://nginxproxymanager.com/guide/#quick-setup]{style="background: #ffff00"}](https://nginxproxymanager.com/guide/#quick-setup) - -cd \~/docker/proxy - -sudo rm \* -R - -sudo nano docker-compose.yml - -\ - -**version: \'3\'** - -**services:** - -**app:** - -**image: \'jc21/nginx-proxy-manager:latest\'** - -**restart: unless-stopped** - -**ports:** - -**- \'80:80\'** - -**- \'81:81\'** - -**- \'443:443\'** - -**volumes:** - -**- ./data:/data** - -**- ./letsencrypt:/etc/letsencrypt** - -\ - -docker-compose up -d - -\ - -[[https://theprivatesmarthome.com/how-to/set-up-nginx-proxy-manager-in-home-assistant/]{style="background: #ffff00"}](https://theprivatesmarthome.com/how-to/set-up-nginx-proxy-manager-in-home-assistant/) - -open the admin page: - -http://127.0.0.1:81 - -http://192.168.178.52:81 - -Email: admin@example.com - -Password: changeme - -\ - -add prox host: - -- domain names: habora.duckdns.org - -- scheme: http - -- forward hostname / ip: 192.168.178.52:8123 - -- forward port: 8123 - -- ache asset: false - -- block common explots: true - -- websockets support: true - -- access list: publicl accessible - -- SSL - - - "request a new ssl certificate" - - - force SSL: true - - - - -\ - -edit configuration.yaml - -**http:** - -**use_x_forwarded_for: true** - -**trusted_proxies:** - -**- 172.16.0.0/12** - -\ - -\ - -these options work now ==\> - -http://192.168.178.52:8123/lovelace/0 - -https://habora.duckdns.org/lovelace/0 - -\ - -\ - -\ - -## install duckdns containers {#install-duckdns-containers .western} - - - -\ - -STEP 1: SET UP A DUCKDNS ACCOUNT. - -The First thing to do will be to set up a DuckDNS account which is easy. - -Just navigate to their homepage and log in using one of the many sign in -options they offer. In our example we use Google. - -![](Home_assistant_html_91538cd5f68befa0.png){#Image36 align="bottom" -width="819" height="461" border="0"} - -[]{#Frame1 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -[]{#Frame2 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -[]{#Frame3 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -https://www.duckdns.org - -[]{#Step_2_Enter_a_Duckdns_subdomain} STEP 2: ENTER A DUCKDNS SUBDOMAIN. - -Once logged in we are going to create a subdomain by entering into the -white box a name you would like to use for your service. - -*Note: You will need to create a new subdomain for each docker container -service you host.* - -[[[[In our example, we just put in -"]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**a2t**[[[[". Then click on the green "add domain" -button.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![](Home_assistant_html_389f1c0b6fc30dbf.png){#Image37 align="bottom" -width="819" height="461" border="0"} - -[[[[This now gives us a domain name to use. In our case it -is ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**a2t.duckdns.org**[[[[.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -The DuckDNS service will automatically take the public IP address you -are currently on and add this to the IP field. If you are using a VPN, -proxy or are using any other network that is different from the one you -want to host your service on you will need to update this IP manually to -start with to ensure the correct IP address is used. (This will be -auto-updated later by our DuckDNS container either way). - -[]{#Step_3_Create_and_deploy_the_Duckdns_container_using_a_stack} STEP -3: CREATE AND DEPLOY THE DUCKDNS CONTAINER USING A STACK. - -[[[[Now we have our subdomain we are going -to]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -** "** - -**log in"**[[[[ to our -"]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Portainer" **[[[[dashboard on our Raspberry Pi and navigate to the -"]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Stacks" **[[[[page:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[]{#Frame4 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -[]{#Frame5 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -[]{#Frame6 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -http://192.168.2.5:9000/#!/1/docker/stacks - -![](Home_assistant_html_e860aebf32582055.png){#Image38 align="bottom" -width="819" height="461" border="0"} - -[[[[From there we are going click on -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**"** - -**Add -stack"**[[[[ button.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[[[This will open up a new Stack creation window. We will then name our -stack -"]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**duckdns**[[[["]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![](Home_assistant_html_369856bc9da6e51a.png){#Image39 align="bottom" -width="819" height="461" border="0"} - -[[[[Then in -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Web editor**[[[[ we will paste the following Docker compose data into -the empty -field.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[]{#Docker_Compose_Stack} DOCKER COMPOSE STACK: - -[]{#Frame7 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -[]{#Frame8 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -[]{#Frame9 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -\-\-- - -[version: -\"2.1\"]{style="display: inline-block; border: none; padding: 0in"} - -[services:]{style="display: inline-block; border: none; padding: 0in"} - -[duckdns:]{style="display: inline-block; border: none; padding: 0in"} - -[image: -ghcr.io/linuxserver/duckdns]{style="display: inline-block; border: none; padding: 0in"} - -[container_name: -duckdns]{style="display: inline-block; border: none; padding: 0in"} - -[environment:]{style="display: inline-block; border: none; padding: 0in"} - -[- PUID=1000 -#optional]{style="display: inline-block; border: none; padding: 0in"} - -[- PGID=1000 -#optional]{style="display: inline-block; border: none; padding: 0in"} - -[- -TZ=Europe/London]{style="display: inline-block; border: none; padding: 0in"} - -[- -SUBDOMAINS=subdomain1,subdomain2]{style="display: inline-block; border: none; padding: 0in"} - -[- -TOKEN=token]{style="display: inline-block; border: none; padding: 0in"} - -[- LOG_FILE=**false** -#optional]{style="display: inline-block; border: none; padding: 0in"} - -[volumes:]{style="display: inline-block; border: none; padding: 0in"} - -[- /path/to/appdata/config:/config -#optional]{style="display: inline-block; border: none; padding: 0in"} - -[restart: -unless-stopped]{style="display: inline-block; border: none; padding: 0in"} - -**\-\--** - -**version: \"2.1\"** - -**services:** - -**duckdns:** - -**image: ghcr.io/linuxserver/duckdns** - -**container_name: duckdns** - -**environment:** - -**#- PUID=1000 #optional** - -**#- PGID=1000 #optional** - -**- TZ= [Europe/Berlin]{style="background: #ffff00"}** - -**- SUBDOMAINS=habora #subdomain1,subdomain2** - -**- TOKEN=799093a4-0b34-454f-99cb-25a4637bf404** - -**- LOG_FILE=false #optional** - -**volumes:** - -**- /path/to/appdata/config:/config #optional** - -**restart: unless-stopped** - -\ - -\ - -[[[[You will then need to change the fields to match your installation. -If you would like to use a specific user account then you will need to -find -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**PUID **[[[[and ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**GUID **[[[[of that user account. We have shown how to do this in our -Youtube Video so please watch that. If you would like to go with the -defaults just remove both these fields as they are -optional.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[[[Set your timezone -"]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**TZ**[[[[" to your current -location.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[[[Add your subdomain name to the -"]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**SUBDOMAIN**[[[[" field. If you have more than one you will need to add -an entry for each subdomain you wish to use and separate them with a -comma.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -*Note you do not need to add the full domain name only the subdomain -part. In our example, we would only put "* - -*a2t* - -*" into the "* - -*SUBDOMAIN* - -*" field. not a2t.duckdns.org.* - -[[[[Add your Token to -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**TOKEN **[[[[field, which can be found on the Duckdns subdomain -creation page at the top right. This is unique to every user and only -needs to be put in once regardless of how many subdomains you -use.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![](Home_assistant_html_f30863f684b0ca6f.png){#Image40 align="bottom" -width="819" height="461" border="0"} - -[[[[If you would like to use logs then you can change the field to -"]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**true**[[[[" this is -optional.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -Under Volumes add the location of where you install all your Docker -data. - -Now you have set them fields your Docker compose Stack should look -something like this: - -![](Home_assistant_html_ee45f619877bd165.png){#Image41 align="bottom" -width="819" height="461" border="0"} - -[[[[Now you have confirmed all is set up correctly you can press the -"]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Deploy the stack**[[[[" -button.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![](Home_assistant_html_c47f69cff7760f16.png){#Image42 align="bottom" -width="819" height="461" border="0"} - -[[[[You can now check the Portainer containers page to confirm the -"]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**duckdns**[[[[" container has been created -correctly.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![](Home_assistant_html_464c08548a198f9f.png){#Image43 align="bottom" -width="819" height="461" border="0"} - -Press the Logs button to check all is as expected. It should look like -this: - -![](Home_assistant_html_67e1fbd7fa00d5ad.png){#Image44 align="bottom" -width="819" height="461" border="0"} - -To confirm your domain is working correctly you can open a browser -window and enter your domain name into the address field. - -[]{#Frame10 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -[]{#Frame11 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -[]{#Frame12 dir="ltr" -style="position: absolute; width: 1.17in; border: none; padding: 0in; background: #ffffff"} - -\ -\ - -http://a2t.duckdns.org - -You should now see this: - -![](Home_assistant_html_6cab1c59d3acac74.png){#Image45 align="bottom" -width="819" height="461" border="0"} - -\ - -\ - -\ - -\ - -\ - -## Mosquitto (MQTT broker) on Raspberry Pi / Docker {#mosquitto-mqtt-broker-on-raspberry-pi-docker .western} - - - -Install Docker on Raspberry Pi - -curl -sSL https://get.docker.com \| sh - -\ - -Add user pi to group docker: - -sudo usermod -aG docker pi - -\ - -Install Docker Compose (first install Python and Pip) - -sudo apt-get install libffi-dev libssl-dev python3-dev python3 -python3-pip -y - -sudo pip3 install docker-compose - -\ - -sudo reboot - -\ - -\ - -Create the following directory tree - -sudo mkdir /docker - -sudo mkdir /docker/mosquitto - -sudo mkdir /docker/mosquitto/config - -\ - -Create the config file for Mosquitto with the following content: - -sudo nano /docker/mosquitto/config/mosquitto.conf - -**\# Config file for mosquito** - -**listener 1883** - -**#protocol websockets** - -**persistence true** - -**persistence_location /mosquitto/data/** - -**log_dest file /mosquitto/log/mosquitto.log** - -**allow_anonymous false** - -\ - -\ - -Create the config file for docker-compose with the following content -(pay attention to the indentation of the lines in the YAML file, use 4 -spaces per indentation, no tabs): - -cd /docker - -sudo nano docker-compose.yaml - -\ - -**version: \'3\'** - -\ - -**services:** - -**mosquitto:** - -**container_name: mosquitto** - -**restart: always** - -**image: eclipse-mosquitto** - -**ports:** - -**- \"1883:1883\"** - -**- \"9001:9001\"** - -**volumes:** - -**- ./mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf** - -**- ./mosquitto/data:/mosquitto/data** - -**- ./mosquitto/log:/mosquitto/log** - -**networks:** - -**- default** - -\ - -**networks:** - -**default:** - -\ - -\ - -**version: \"3\"** - -\ - -**services:** - -**mosquitto:** - -**image: eclipse-mosquitto** - -**network_mode: host** - -**volumes:** - -**- ./conf:/mosquitto/conf** - -**- ./data:/mosquitto/data** - -**- ./log:/mosquitto/log** - -\ - -\ - -\ - -\ - -sudo nano /docker/mosquitto/config/mosquitto.conf - -\ - -**\## Config file for mosquito** - -**listener 1883** - -**#protocol websockets** - -**persistence true** - -**persistence_location /mosquitto/data/** - -**log_dest file /mosquitto/log/mosquitto.log** - -**#allow_anonymous false** - -**password_file /mosquitto/config/mosquitto.conf** - -\ - -\ - -\ - -\ - -docker-compose exec mosquitto mosquitto_passwd -c -/mosquitto/config/mosquitto.passwd mosquitto - -\ - -\ - -\ - -[sudo apt install docker-compose]{style="background: #ffff00"} - -[pip3 install \--upgrade requests]{style="background: #ffff00"} - -\ - -\ - -docker run -d -p 8080:80 \--name webserver nginx - -docker rm mosquitto - -sudo docker run -d -it \--name mosquitto -p 127.0.0.1:1883:1883 -eclipse-mosquitto - -sudo docker run -d -it \--name mosquitto -p 8001:8001 myserver_new - - - -\ - -\ - -Now you can install and start Mosquitto: - -docker-compose up -d - -\ - -Check if Mosquitto is running: - -docker ps - -\ - -\ - -\ - -\ - - - -docker pull eclipse-mosquitto - -\ - -\ - -### working approach {#working-approach .western} - -[[https://medium.com/himinds/mqtt-broker-with-secure-tls-and-docker-compose-708a6f483c92]{style="background: #ffff00"}](https://medium.com/himinds/mqtt-broker-with-secure-tls-and-docker-compose-708a6f483c92) - -[[https://www.diyhobi.com/install-mqtt-and-openhab-3-in-docker-raspberry-pi-4/]{style="background: #ffff00"}](https://www.diyhobi.com/install-mqtt-and-openhab-3-in-docker-raspberry-pi-4/) - -curl -sSL https://get.docker.com \| sh - -sudo usermod -aG docker pi - -sudo apt-get install libffi-dev libssl-dev python3-dev python3 -python3-pip -y - -sudo pip3 install docker-compose - -sudo reboot - -cd - -mkdir docker - -cd docker - -mkdir smarthome - -mkdir smarthome/mqtt - -mkdir smarthome/mqtt/config - -\ - -sudo nano smarthome/mqtt/config/mosquitto.conf - -**\# Config file for mosquitto** - -\ - -**listener 1883** - -\ - -**persistence true** - -\ - -**persistence_location /mosquitto/data/** - -\ - -**log_dest file /mosquitto/log/mosquitto.log** - -\ - -**allow_anonymous false** - -\ - -\ - -cd smarthome - -nano docker-compose.yaml - -\ - -**version: -\'[3.]{style="background: #ffff00"}[5]{style="background: #ffff00"}\'** - -\ - -**services:** - -**#mqtt** - -**mosquitto:** - -**container_name: mqtt** - -**#hostname: mosquitto** - -**restart: always** - -**image: eclipse-mosquitto** - -**ports:** - -**- \"[8883:8883]{style="background: #ffff00"}\"** - -**- \"9001:9001\"** - -**volumes:** - -**- ./mqtt/config/mosquitto.conf:/mosquitto/config/mosquitto.conf** - -**- ./mqtt/data:/mosquitto/data** - -**- ./mqtt/log:/mosquitto/log** - -**networks:** - -**- default** - -\ - -\ - -**networks:** - -**default:** - -\ - -\ - -\ - -docker-compose up -d - -\ - -docker ps - -cd \~/docker/smarthome - -sudo rm \* -R - -\ - -cd mqtt - -cd config - -ls - -sudo rm mosquitto.conf -R - -\ - -sudo nano mosquitto.conf - -\ - -**\# Config file for mosquitto** - -\ - -**listener 1883** - -\ - -**persistence true** - -\ - -**persistence_location /mosquitto/data/** - -\ - -**log_dest file /mosquitto/log/mosquitto.log** - -\ - -**allow_anonymous false** - -\ - -\ - -cd \~/docker/smarthome - -\ - -docker-compose up -d - -\ - -\ - -\ - -\ - -docker exec -it mqtt sh - -mosquitto_passwd -c /mosquitto/data/pwfile mymqtt - -[Username: mymqtt, Password: mypassword]{style="background: #ffff00"} - -\ - -exit - -\ - -sudo nano \~/docker/smarthome/mqtt/config/mosquitto.conf - -Paste this at the bottom: **password_file /mosquitto/data/pwfile** - -\ - -docker start mqtt - -docker ps - -\ - -\ - -\ - -[192.168.178.52:1883]{style="background: #ffff00"} - -\ - -\ - -\ - -## Installation of portainer {#installation-of-portainer .western} - - - -docker volume create portainer_data - -docker run -d -p 8000:8000 -p 9443:9443 \--name portainer -\--restart=always -v /var/run/docker.sock:/var/run/docker.sock -v -portainer_data:/data portainer/portainer-ce:latest - -docker ps - -\ - -[https://IP-DEINES-RASPBERRYS:9443](https://IP-DEINES-RASPBERRYS:9443/) -→ [https://192.168.178.52:9443]{style="background: #ffff00"} - -user: admin, pass: password1234 - -\ - -\ - -\ - -\ - -## install influxdb {#install-influxdb .western} - -sudo mkdir /opt/influxdb - -sudo mkdir /opt/grafana - -sudo chmod 775 /opt/influxdb/ /opt/grafana/ - -\ - -influxdb:1.8 - -8086 - -/var/lib/influxdb - -\ - -grafana/grafana - + service: python_script.set_state + data_template: + entity_id: sensor.cold_water_rate + state: 42 + + + + + + + + + + + + + + + +new HA OS on RaPi4 +http://192.168.178.52:8123/ + • ==create user + ◦ user: bora, pass: bora + • select location== + • activate advanced mode under profile settings + • install add ons + ◦ Samba share + ▪ username: homeassistant, password: bora, workgroup: WORKGROUP + ▪ add a new network location: \\192.168.178.52\config + ◦ file editor + ◦ duckdns + ▪ domains: + - habora.duckdns.org +token: 799093a4-0b34-454f-99cb-25a4637bf404 +aliases: [] +lets_encrypt: + accept_terms: true + algo: secp384r1 + certfile: fullchain.pem + keyfile: privkey.pem +seconds: 300 + • + ◦ MariaDB + ▪ databases: + - homeassistant +logins: + - username: homeassistant + password: password1234 + - username: read_only_user + password: password1234 +rights: + - username: homeassistant + database: homeassistant + - username: read_only_user + database: homeassistant + privileges: + - SELECT + ▪ recorder: + db_url: mysql://homeassistant:password@core-mariadb/homeassistant?charset=utf8mb4 + ▪ + ◦ Nginx Proxy Manager + ▪ Open WebUI → admin@example.com / changeme + ▪ Hosts – Proxy Hosts → Add Proxy Host + ▪ Domain Names: habora.duckdns.org + ▪ Als Scheme wählt Ihr http, unter „Forward Hostname / IP“ tragt Ihr die IP eures Home Assistant ein. → 192.168.178.52 + ▪ Bei Forward Port gebt Ihr den Port ein, unter dem euer Home Assistant erreichbar ist. (Standardmäßig ist das der Port 8123) + ▪ Aktiviert abschließend noch den Punkt „Websockets Support„. + ▪ Anschließend wechselt Ihr auf den Reiter SSL. + ▪ Hier wählt ihr unter „SSL Certificate“ den Eintrag „Request a new SSL Certificate“ um ein neues Zertifikat zu erstellen aus. + ▪ Aktiviert nun den Punkt „Force SSL„, tragt eine gültige Email-Adresse für eure Zertifikat ein und akzeptiert die Let’s Encrypt Bedingungen durch aktivieren der Option am unteren Rand der Dialog. + ▪ Bestätigt nun die Eingaben durch einen Klick auf „Save“ und wartet, bis der Vorgang abgeschlossen ist. + ▪ Dann werden im Hintergrund die Zertifikate von Let’s Encrypt generiert. Das kann einen Augenblick in Anspruch nehmen. + ▪ Das registrieren des Zertifikates funktioniert nur, wenn die eingetragene Domain auch auf eure externe IP zeigt, und die Ports 80 und 443 auf die Home Assistant IP weitergeleitet sind. + • PICTURE +![home_assistant_html_eeaf4fb9a08969e4.png](/pictures/home_assistant_html_eeaf4fb9a08969e4.png) + ▪ configuration.yaml + • http: + • use_x_forwarded_for: true + • trusted_proxies: + • - 127.0.0.1 + • - 172.30.33.0/24 + • - ::1 + ◦ Let's Encrypt + ▪ domains: + - habora.duckdns.org +email: boraers@googlemail.com +keyfile: privkey.pem +certfile: fullchain.pem +challenge: http +dns: {} + ▪ add to configuration.aml +http: + ssl_certificate: /ssl/fullchain.pem + ssl_key: /ssl/privkey.pem + ◦ influxdb + ▪ no adaptation of configuration was needed + ▪ http://192.168.178.52:8123/api/hassio_ingress/FJZMGvrT7OnlTzBKdUP9jKiKEe4yp4V4D5VT4zHP5cQ/sources/0/hosts + ▪ http://192.168.178.52:8123/hassio/ingress/a0d7b954_influxdb + ▪ create database: home_assistant + ▪ create user: homeassistant, pass: homeassistant, permissions: ALL + ◦ mosquitto + ▪ Logins: +- username: note4 + password: note4 + ▪ MQTT integration configuration: +127.0.0.1 ← not core-mosquitto +1883 +note4 +note4 +MQTT protocol: 5 + ◦ Grafana + ▪ env_vars: +- name: GF_SECURITY_ALLOW_EMBEDDING + value: "true" +- name: GF_AUTH_ANONYMOUS_ORG_NAME + value: Main Org. +- name: GF_AUTH_ANONYMOUS_ENABLED + value: "true" +- name: GF_AUTH_DISABLE_LOGIN_FORM + value: "false" + ▪ SSL: false or true, depending on having ssl set up + ▪ Network: 3000 + ▪ http://192.168.178.52:8123/hassio/ingress/a0d7b954_grafana + ▪ in web panel + • add data source: InfluxDB + • URL: http://a0d7b954-influxdb:8086 + • database, user, pass + • + ◦ Terminal and SSH + • integrations + ◦ HACS + ▪ github credentials required + ◦ OpenWeatherMap + ▪ API Ke: + ◦ solarman + • re-use old config files + ◦ automations + ◦ blueprints + ◦ bosch_shc + ◦ custom_components + ◦ group + ◦ images + ◦ python_scripts + ◦ www + ◦ alarm_control_panel.yaml + ◦ automations.yaml + ◦ climate.yaml + ◦ configuration.yaml + ◦ influxdb.yaml + ◦ mqtt.yaml + ◦ scenes.yaml + ◦ scripts.yaml + ◦ secrets.yaml + ◦ sensor.yaml + • move to external SSD + • che -/var/lib/grafana (was leider nur auf der Grafana Seite direkt steht und -nicht hier) +PICTURE +![Home_assistant_html_8c01be9bb611f888.png](/pictures/home_assistant_html_8c01be9bb611f888.png) -\ -\ -\ -\ -[[[[Starte, am besten in einem neuen Tab, deine Portainer-Umgebung -(]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -**https://IP-DES_RASPBERRY:9443**[[[[) und logge dich ein.\ -In der linken Menüseite wähle den Punkt -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -**Containers**[[[[" und dann klicke auf den Button -" ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -**+ Add -container**[[[[„:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -![Raspberry Pi Monitoring - Portainer - -Container](Home_assistant_html_66e29c76134aef0a.png){#Image16 -align="bottom" width="819" height="196" border="0"} -Lass dich von den Einstellungen nicht erschlagen. Nicht alle benötigen -wir, und alle anderen werden nach und nach klarer. -![Raspberry Pi Monitoring - Portainer -Einstellungen](Home_assistant_html_3cd0de6670758b76.png){#Image17 -align="bottom" width="819" height="497" border="0"} -- [[[[Als Erstes geben wir unserem Container - einen ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Namen(1)*[[[[: ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - **influxDB** -- [[[[Dann suchen wir das - entsprechende ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Image (2) *[[[[bei - „]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - **DockerHub**[[[[" - : ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - **influxdb:1.8** -- [[[[Jetzt klickst du auf - den ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Button * - **publish a new network port**[[[[(3) und trägst - bei ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Host(4) *[[[[und ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - *Container(5)*[[[[ jeweils den - Port ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - **8086 **[[[[ein]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -![image 42](Home_assistant_html_3352870c1d946201.png){#Image18 -align="bottom" width="648" height="414" border="0"} -[[[[Unter dem -Punk ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -**„** -**Command & logging"**[[[[ solltest du für -die ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -**Console**[[[[ ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -**„** -**Interactive & -TTY"**[[[[ auswählen.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![image 16](Home_assistant_html_eec6b1679e52d3b.png){#Image19 -align="bottom" width="819" height="366" border="0"} - -[[[[Etwas weiter unten klickst du jetzt auf -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Volumes(1)**[[[[„, dann auf -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**map additional volume(2)**[[[[" sowie auf den Button -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Bind(3)**[[[[„.\ -Du erinnerst dich noch an den Pfad, den wir auf der hub.docker Seite -unter influxDB in der Beschreibung gesehen haben?\ -Denn diesen müssen wir jetzt bei -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**container(4)**[[[[" -eintragen: ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**/var/lib/influxdb**[[[[.\ -Bei -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Host(5)**[[[[" kommt jetzt das Gegenstück dazu rein, nämlich der -Ordner, den wir für die persistenten Daten auf unserem Raspberry -angelegt -haben: ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**/opt/influxdb** - -[[[[Im Reiter -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Restart policy"**[[[[ geben wir noch an, wie sich unser Container -verhalten soll, falls der Raspberry mal neu startet oder der Container -selbst sich mit einem Fehler beendet hat. Hier wählen wir -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Always**[[[[" -- er soll also immer wieder selbst neu -starten.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![image 38](Home_assistant_html_62c4cec3debb56a8.png){#Image20 -align="bottom" width="819" height="123" border="0"} - -[[[[\ -Nun haben wir soweit alles angegeben was wir benötigen und können, -wieder etwas weiter oben, auf den Button -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Deploy the container**[[[[" klicken.\ -Das Ganze dauert dann ein wenig, da zu erst das Image heruntergeladen, -entpackt und der Container entsprechend angelegt werden muss. Beim -nächsten Deploy des Containers würde es deutlich schneller -gehen:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![image 18](Home_assistant_html_cfe66c1744a9018f.png){#Image21 -align="bottom" width="819" height="470" border="0"} - -Hiermit hast du jetzt influxDB erfolgreich als Container gestartet. -Prüfen kannst du das natürlich auch. Im Menüpunkt Containers wirst du in -der Übersicht einen neuen influxDB Container im Status running sehen. -Schaue auch ruhig einmal in die Logs. - -\ - -\ - -\ - -\ - -[[http://192.168.178.52:8086/]{style="background: #ffff00"}](http://192.168.178.52:8086/) - -[user:bora, pass:password1234, orga:home, -bucket:influxdb_rapi4]{style="background: #ffff00"} - -token_01: - -**GK_kb2fTPaEknWQ7c9c5VRU5c5GeRXv8is3_e0qhn9qXLOdbxHkdAfqYZNrfn1jexfQ-RVKYtX7Co9HvKgIJqg==** - -\ - -\ - -\ - -### **subscribe to MQTT broker** {#subscribe-to-mqtt-broker .western} - -**https://diyi0t.com/visualize-mqtt-data-with-influxdb-and-grafana/** - -![](Home_assistant_html_4202aa273ecf0532.png){#Image46 align="left" -width="643" height="285" border="0"}\ - -\ - -**https://thenewstack.io/python-mqtt-tutorial-store-iot-metrics-with-influxdb/** - -![](Home_assistant_html_faa23644238e228c.png){#Image47 align="left" -width="643" height="301" border="0"}\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -## Install Grafana {#install-grafana .western} - - - -![Raspberry Pi Monitoring - Portainer - Container -deploy](Home_assistant_html_571f817e4c9a0b99.png){#Image22 -align="bottom" width="819" height="753" border="0"} - -\(1\) -- Name des Containers: „Grafana„ - -\(2\) -- Name des Image: „grafana/grafana„ - -\(3\) -- Anklicken um neue Ports eingeben/binden zu können - -\(4\) -- Port des Hosts(Raspberry): 3000 - -\(5\) -- Port des Containers: 3000 - -\(6\) -- Button „Volumes" anklicken - -\(7\) -- Den Button bei Volume mapping klicken damit wir die Pfade -eingeben können - -\(8\) -- Button „Bind" anklicken - -\(9\) -- Pfad des Containers: /var/lib/grafana - -\(10\) -- Pfad auf dem Host(Raspberry) dazu: /opt/grafana - -Im Reiter „Restart policy" geben wir jetzt noch an, wie sich unser -Container verhalten soll, falls der Raspberry mal neu startet oder der -Container selbst sich mit einem Fehler beendet hat. Hier wählen wir -„Always" -- er soll also immer wieder selbst neu starten. - -Unter dem Punk „Command & logging" solltest du für die Console -„Interactive & TTY" auswählen. - -\(11\) -- Button „Deploy the container" klicken - -\ - -[http://IP-DEINES-RASPBERRY:3000](http://IP-DEINES-RASPBERRY:3000/) → -[http://192.168.178.52:3000]{style="background: #ffff00"} - -\ - -Mit dem Default User und Passwort (admin/admin) kannst du dich einloggen -und direkt das Passwort ändern. - -\ - -\ - -\ - -## InfluxDB mit Grafana verbinden {#influxdb-mit-grafana-verbinden .western} - -[[[[Wir loggen uns jetzt wieder in der Grafana WebGui auf dem Raspberry -ein ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**(IP-DEINES_RASPBERRYS:3000)**[[[[.\ -Hier wählen wir auf der linken Seite das Zahnrad und -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Data sources**[[[[" aus, dann klicken wir auf den Button -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Add data source**[[[[" und sagen zum Schluss wir wollen -eine ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**InfluxDB **[[[[hinzufügen:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![image 31](Home_assistant_html_88f4515c8b37e4e0.png){#Image23 -align="bottom" width="623" height="403" border="0"} ![image -32](Home_assistant_html_c6fcf1a7b5e5300d.png){#Image24 align="bottom" -width="819" height="248" border="0"} ![image -33](Home_assistant_html_cbbc33380bd08951.png){#Image25 align="bottom" -width="819" height="331" border="0"} - -Jetzt müssen wir nur noch ein paar Angaben zu der Datenbank machen. -Damit es einfacher zu handhaben ist, verzichte ich hier vollkommen auf -Username / Passwörter. Bedeutet die Datenbank ist frei zugänglich. Da -dies alles nur in unserem Netzwerk läuft, ist das kein Problem. Bedenke -aber das man unter anderen Umständen immer User und Passwörter vergeben -sollte. - -[[[[Zurück zu unseren Einstellungen.\ -Unter ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Name **[[[[kannst du einen Namen vergeben der dann später als Quelle -in deinem Dashboard auswählbar ist.\ -Im -Bereich ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**HTTP**[[[[ und ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**URL **[[[[gibst du -die ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**IP deines Raspberrys**[[[[ ein auf dem die Datenbank läuft, gefolgt -von -dem ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Port 8086**[[[[\ -Die restlichen Einstellungen können so -bleiben.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![image 34](Home_assistant_html_994478788c5d893a.png){#Image26 -align="bottom" width="819" height="546" border="0"} - -[[[[Etwas weiter unten musst du noch -den ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Datenbank Namen **[[[[angeben aus dem die Daten gelesen werden sollen. -Du erinnerst dich? Wir haben diesen weiter oben in die telegraf.conf -eingetragen. In meinem Fall als -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**raspberry_live**[[[[„.\ -Über den Button -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Save & test**[[[[" prüfen wir die Verbindung. Ein grüner Haken -und ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**„** - -**Data source is working**[[[[„, zeigt uns an, das alles funktioniert -hat:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![image 35](Home_assistant_html_73e5e602e1634f7e.png){#Image27 -align="bottom" width="819" height="594" border="0"} - -### []{#Dashboard_fur_Grafana_besorgen}Dashboard für Grafana besorgen {#dashboard-für-grafana-besorgen .western} - -[[[[Was wäre ein Raspberry Pi Monitoring ohne ein Dashboard?\ -Damit wir bei Grafana ein solches sehen können, müssten wir uns selbst -eins erstellen oder -- was ich hier bevorzuge -- ein fertiges Dashboard -importieren.\ -Du kannst dir auf -der ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[Grafana Labs -Seite](https://grafana.com/grafana/){target="_blank"}[[[[ alle -verfügbaren Dashboards ansehen und entsprechend suchen. Wir wollen ja -ein speziell für einen Raspberry Pi erstelltes nutzen, daher suchen wir -auch nach „Raspberry".\ -Ich denke du wirst dann bei deiner Suche direkt auf dieses hier -treffen: ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[Raspberry Pi -Monitoring](https://grafana.com/grafana/dashboards/10578){target="_blank"} - -![Raspberry Pi Monitoring - Grafana -Dashboard](Home_assistant_html_674b29325fbfed7e.png){#Image28 -align="bottom" width="819" height="513" border="0"} - -[[[[Dieses nehmen wir auch direkt. Wie?! Ganz einfach: Kopiere dir die -ID oben Rechts -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**10578**[[[[„.\ -Dann öffnest du bei dir deine Grafana Umgebung -(IP-DEINES_RASPBERRYS:3000) und gehst über den Menüpunkt -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Dashboards**[[[[" auf -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**+ -Import**[[[[„:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![image 28](Home_assistant_html_602ea3a9161f69e7.png){#Image29 -align="bottom" width="447" height="481" border="0"} - -[[[[Hier trägst du die gerade kopierte oder gemerkte ID des Dashboards -ein -(]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**10578**[[[[) und betätigst den -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Load**[[[[" -Button.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![image 29](Home_assistant_html_cef0de278724e1e6.png){#Image30 -align="bottom" width="819" height="622" border="0"} - -[[[[Jetzt könntest du den Namen des Dashboards ändern und musst auf -jeden Fall die Verbindung zu den Daten -- also zu der influxDB -- -angeben.\ -Diese hatten wir ja gerade eingerichtet und du solltest sie in dem -Drop-Down-Feld auswählen können. In meinem Fall -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Raspberry Pi Monitoring"** - -![image 36](Home_assistant_html_efaf97c53f6a42c7.png){#Image31 -align="bottom" width="819" height="710" border="0"} - -[[[[Ist alles eingestellt, klicken wir auf den -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Import"**[[[[ Button und sehen einige Sekunden später bereits unser -Dashboard mit Daten.\ -Ab jetzt kannst du dich einfach mal in Ruhe durch alle Punkte klicken -und dir das Dashboard anschauen. Je länger dein Raspberry läuft, je mehr -Daten erscheinen. Oben Rechts kannst du die Aktualisierungsrate -einstellen. Default ist 1 -Minute.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -Herzlichen Glückwunsch, dein Raspberry Pi Monitoring ist somit fertig -und funktionsfähig. Viel Spaß damit! - -![image 37](Home_assistant_html_81b8624523f575e7.png){#Image32 -align="bottom" width="819" height="419" border="0"}\ -\ -\ - -\ - -### Grafana with influxdb 2.x {#grafana-with-influxdb-2.x .western} - - - -- the influxdb data explorer, select a quer and cop from the script - editor - -\ - -\ - -\ - -\ - -\ - -\ - -## Install telegraf {#install-telegraf .western} - - - -Willkommen zurück! Na?! Kopf wieder etwas abgekühlt und aufnahmefähig? -🙂\ -Dann lass uns direkt weitermachen und die letzten paar Dinge erledigen. - -Was jetzt kommt, wird wieder direkt auf dem Raspberry installiert. Also -nicht als Container.\ -Dazu wie immer per SSH mit deinem pi verbinden. - -Damit wir Zugriff auf die Quelle von influxDB haben, um uns Pakete -herunterladen zu können, besorgen wir uns einen Key und speichern ihn -auf dem Raspberry: - -[[wget -q -https://repos.influxdata.com/influxdata-archive_compat.key]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[cat influxdata-archive_compat.key **\|** gpg \--dearmor **\|** sudo -tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg **\>** -/dev/**null**]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[echo \'deb -\[signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg\] -https://repos.influxdata.com/debian stable main\' **\|** sudo tee -/etc/apt/sources.list.d/influxdata.list]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[sudo rm -f -/etc/apt/trusted.gpg.d/influxdb.gpg]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -Dann aktualisieren wir unsere Quellen und installieren -apt-transport-https, was wir für den weiteren Schritt benötigen. - -[[sudo apt-get update **&&** sudo apt-get install -apt-transport-https]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -Um später auch Updates erhalten zu können, fügen wir noch einen Eintrag -in unserer Paketquelle hinzu: - -[[sudo echo \'deb \[signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg\] -https://repos.influxdata.com/debian stable main\' **\|** sudo tee -/etc/apt/sources.list.d/influxdata.list]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -Final installieren wir endlich Telegraf: - -[[sudo apt-get update **&&** sudo apt-get install -telegraf]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -![Raspberry Pi Monitoring - Telegraf -installieren](Home_assistant_html_fd6e56b57f85084.png){#Image33 -align="bottom" width="819" height="377" border="0"} - -[[[[Es sollte jetzt von repos.influxdata.com das Paket für telegraf -heruntergeladen und installiert werden.\ -Für mehr Informationen, und weiterführende Konfigurationen, schaue dir -die ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[Installationsanleitung von -Telegraf](https://docs.influxdata.com/telegraf/v1.23/install/){target="_blank"}[[[[ an.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -\ - -### []{#telegraf_konfigurieren} [telegraf konfigurieren]{style="display: inline-block; border: none; padding: 0in"} {#telegraf-konfigurieren .western style="font-variant: normal; letter-spacing: normal; font-style: normal; font-weight: normal; orphans: 2; widows: 2; margin-top: 0in; margin-bottom: 0in; border: none; padding: 0in"} - -Uns fehlen noch ein paar Konfigurationen, damit wir für unser Raspberry -Pi Monitoring auch alle benötigten Informationen bekommen, und in -unserer Datenbank speichern können.\ -Dafür öffnen wir eine config Datei von telegraf: - -[[sudo nano -/etc/telegraf/telegraf.conf]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -Viel Spaß beim scrollen.... ja diese Datei ist WIRKLICH gefühlt -unendlich lang. Aber keine Sorge, wir machen da nicht sehr viel mit und -müssen es auch für unsere Anforderungen nicht. - -[[[[Suche mal nach -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**OUTPUT PLUGINS**[[[[" und dann -nach ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**\[\[output.influxdb\]\]**[[[[. Unter diesem Punkt geben wir jetzt an, -wo sich unsere influxdb-Datenbank befindet.\ -Bei dem letzten auskommentierten (#) urls Eintrag entfernen wir einfach -die Raute(#) und können es im Prinzip so lassen. Die 127er IP ist der -localhost. Da die influxdb ja direkt auf dem Raspberry läuft, kann diese -so erreicht werden.\ -Falls du noch einen zweiten Raspberry hast, würdest du bei diesem hier -die IP des Hosts eingeben, auf dem die influxdb-Datenbank -läuft.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[[[Ein wenig unter diesem Eintrag entfernen wir auch die Raute(#) vor -dem -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**database = **[[[[" und geben unserer Datenbank einen Namen.\ -Diese wird dann später automatisch angelegt und wir brauchen uns da -nicht selbst drum kümmern.\ -Ich habe meine hier -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**raspberry_live**[[[[" genannt, damit ich später weiß von welchem -meiner raspberrys die Daten sind. Bei einem weiteren pi würde ich zum -Beispiel „raspberry_test" oder sowas -nehmen.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -![Raspberry Pi Monitoring - Telegraf -config](Home_assistant_html_929274bda173b557.png){#Image34 -align="bottom" width="778" height="434" border="0"} - -[[[[Ich greife jetzt einen Schritt vor, denn ich nutze für mein -Raspberry Pi Monitoring bei Grafana ein fertiges Dashboard. Und der -Entwickler gibt noch ein paar Parameter an, die man in die telegraf.conf -eintragen sollte. Daher scrollen wir jetzt sehr weit nach unten bis du -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**INPUT PLUGINS**[[[[" sehen kannst. Direkt da drunter fügst du dann -folgendes -ein:]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[#In order to monitor both Network interfaces, eth0 and wlan0, -uncomment, or add the -next:]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[**\[\[**inputs.net**\]\]**]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[**\[\[**inputs.netstat**\]\]**]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[**\[\[**inputs.file**\]\]**]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[files = -**\[**\"/sys/class/thermal/thermal_zone0/temp\"**\]**]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[name_override = -\"cpu_temperature\"]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[data_format = -\"value\"]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[data_type = -\"integer\"]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[**\[\[**inputs.exec**\]\]**]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[commands = **\[**\"/opt/vc/bin/vcgencmd -measure_temp\"**\]**]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[name_override = -\"gpu_temperature\"]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[data_format = -\"grok\"]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -[[grok_patterns = -**\[**\"%{NUMBER:value:float}\"**\]**]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -![image 30](Home_assistant_html_794dd4d02d310efd.png){#Image35 -align="bottom" width="819" height="767" border="0"} - -Jetzt speichere die Datei und verlasse sie. Denn hier sind wir erstmal -mit fertig.\ -Damit wir auf dem Raspberry auch auf die Werte von GPU usw. zugreifen -dürfen, müssen wir den telegraf User noch in eine Gruppe hinzufügen: - -[[sudo usermod -G video -telegraf]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -Noch haben unsere Änderungen keine Wirkung, daher starten wir den -Service telegraf einmal neu: - -[[sudo service telegraf -restart]{style="background: #282a36"}]{style="display: inline-block; border: none; padding: 0in"} - -Ab jetzt sollten Daten gesammelt und in die Datenbank geschrieben -werden.\ -Was weiterhin fehlt ist das Dashboard, damit wir auch etwas sehen, und -die Konfiguration zur Datenbank, damit Grafana auch weiß woher die Daten -kommen sollen! - -\ - -\ - -\ - -### Telegraf with influxdb 2.x {#telegraf-with-influxdb-2.x .western} - - - -\ - -- create database/bucket in influxdb - -- then, edit telegraf.conf as described in section above but use - bucket, token, etc. - -- need a section \[\[output.influxdb_v2\]\] - -- - -\ - -\ - -\ - -\ - -# add csv data to influxdb / grafana {#add-csv-data-to-influxdb-grafana .western} - - - -\ - -manual entry: - -Nutrition,measurement=Water,unit=grams value=2000 1645750800000000000 - -Consumption,measurement=Gas,unit=kWh value=2000 1645750800000000000 - -Consumption,measurement=Electricity,unit=kWh value=2000 -1645750800000000000 - -Consumption,measurement=Electricity,unit=kWh value=3000 -1687377128078000000 - -\ - - - -Timestamp 1687377128 - -Timestamp in milliseconds 1687377128078 + 000000 - -ISO 8601 2023-06-21T19:52:08.078Z - -Date Time (UTC) 21. Juni 2023, 19:52:08 - -Date Time (your time zone) 21. Juni 2023, 21:52:08 - -\ - -\ - -\ - -\ - - - -\ - -Operations performed on date data should be automatic provided that the -cells are formatted as as a user defined DD.MM.YYYY HH:MM:SS in the -\'Format\' \> \'Cells\' \> \'Numbers\' tab. - -\ - -If you\'re using the standard settings, LibreOffice Calc uses 12/30/1899 -as it\'s default date. So the first step is getting the number of days -between 12/30/1899 and 1/1/1970: - -\ - -=(DATE(1970,1,1) - DATE(1899,12,30)) = 25569 - -Number of seconds in a day: - -\ - -=(60 \* 60 \* 24) = 86400 - -If, for example, in cell A2 you have the date 03.12.2013 14:01:49. I -subtract the difference between Calc\'s default date and the Unix Epoch -we just calculated, and multiply it by the number of seconds in a day: - -\ - -[=(A2 - 25569) \* 86400]{style="background: #ffff00"} - -The result is a value of 1363096909 which is the Epoch time in seconds. -If you need it in milliseconds, multiply the equation by 1000. - -\ - -\ - -\ - -\ - -\ - -\ - -# NOUS A1T with homeassistant {#nous-a1t-with-homeassistant .western} - - - -\ - -\ - - - -\ - -\ - - - -integrate via MQTT → Zum Schluss über die Tasmota Console noch folgenden -Befehl senden: SetOption19 1 - -[integrate via Tasmota Integration → SetOption19 -0]{style="background: #ffff00"} - -\ - -\ - -[http://192.168.4.1/](http://192.168.4.1/#p) - -FRITZ!Box 7530 GD - -78302839617779115068 - -\ - - - -tasmota-832BEA-3050 with IP address 192.168.178.50 - -tasmota-836841-2113 with IP address 192.168.178.49 - -tasmota-8386C8-1736 with IP address 192.168.178.47 - -tasmota-C68576-1398 with IP address 192.168.178.48 - -tasmota-833CA2-7330 with IP address 192.168.178.61 - -tasmota-836841-7745 with IP address 192.168.178.60 - -tasmota-83310D-4365 with IP address 192.168.178.62 - -tasmota-837743-5955 with IP address 192.168.178.63 - -\ - -[voltageset 220]{style="background: #ffff00"} - -\ - -192.168.178.52 - -User: note4 - -Password: note4 - -\ - -stat/tasmota_832BEA/RESULT - -tele/tasmota_832BEA/STATE - -tele/tasmota_832BEA/SENSOR - -\ - -\ - - - -[TelePeriod 10]{style="background: #ffff00"} - -\ - -\ - -\ - -how to keep smart plug powered off after unplugging and re-plugging? - - - -0 / OFF = keep power(s) OFF after power up → [PowerOnState -]{style="background: #ffff00"}[0]{style="background: #ffff00"} - -1 / ON = turn power(s) ON after power up - -\ - -disable use of button - -SetOption73 Detach buttons from relays and send multi-press and hold -MQTT messages instead - -0 = disable (default) - -1 = enable → [SetOption73 1]{style="background: #ffff00"} - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# configure network storage (fritz.nas) in home assistant: {#configure-network-storage-fritz.nas-in-home-assistant .western} - -\ - - - -\ - -\\\\192.168.178.1\\FRITZ.NAS\\USB-SanDisk3-2Gen1-01 - -http://fritz.box/nas?sid=41098e807aea021b - -\ - -\ - -\ - -\ - -\ - -\ - - - -user: homeassistant - -password: bhasfonworf34534thb - -fritz.nas/USB-SanDisk3-2Gen1-01/Data - -\ - -![](Home_assistant_html_2dcb84b3a68c1c0c.png){#Image53 align="bottom" -width="567" height="421" border="0"} - -![](Home_assistant_html_5aabcbff64f7c4de.png){#Image54 align="bottom" -width="562" height="466" border="0"} - -![](Home_assistant_html_389f84a162b43d24.png){#Image55 align="bottom" -width="643" height="90" border="0"} - -\ - -\ - -\ - -\ - -\ - -\ - -# Zeitpläne nutzen, um mehrere Temperaturen in Home Assistant zu steuern {#zeitpläne-nutzen-um-mehrere-temperaturen-in-home-assistant-zu-steuern .western} - - - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# use Raspberry Pi as WiFi repeater {#use-raspberry-pi-as-wifi-repeater .western} - - - - - -\ - -\ - -\ - -\ - -\ - -\ - -# Timercard (Ein-Aus-Zeit) in HomeAssistant {#timercard-ein-aus-zeit-in-homeassistant .western} - - - -\ - -\ - -[[[[Ähnlich wie -beim ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[[[[Lichtwecker -zum -Aufstehen ]{style="background: transparent"}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="text-decoration: none"}]{style="font-variant: normal"}](https://smarthomeyourself.de/wiki/homeassistant/lichtwecker-in-homeassistant-erstellen/)[[[[erstellen -wir eine Timercard mit On-Off-Time (ideal für die Gartenbewässerung oder -ähnliches)]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[]{#more-7101} Als erstes benötigen wir wieder einige Helfer: - -``` {.western style="line-height: 150%; text-align: left; orphans: 2; widows: 2; border-top: none; border-bottom: none; border-left: 6.00pt solid #358ccb; border-right: none; padding-top: 0in; padding-bottom: 0in; padding-left: 0.02in; padding-right: 0in; background: transparent"} -#- -# _ _ _ _ -# (_)_ __ _ __ _ _| |_ | |__ ___ ___ | | ___ __ _ _ __ ___ -# | | '_ \| '_ \| | | | __| | '_ \ / _ \ / _ \| |/ _ \/ _` | '_ \/ __| -# | | | | | |_) | |_| | |_ | |_) | (_) | (_) | | __/ (_| | | | \__ \ -# |_|_| |_| .__/ \__,_|\__|___|_.__/ \___/ \___/|_|\___|\__,_|_| |_|___/ -# |_| |_____| -# -#- - -## DAYS / WEEKENDS ############################################################## -timer_1_mon: - name: Montag - #initial: off - icon: mdi:calendar -timer_1_tue: - name: Dienstag - #initial: off - icon: mdi:calendar -timer_1_wed: - name: Mittwoch - #initial: off - icon: mdi:calendar -timer_1_thu: - name: Donnerstag - #initial: off - icon: mdi:calendar -timer_1_fri: - name: Freitag - #initial: off - icon: mdi:calendar -timer_1_sat: - name: Samstag - #initial: off - icon: mdi:calendar -timer_1_sun: - name: Sonntag - #initial: off -#- -# _ _ _ -# (_)_ __ _ __ _ _| |_ _ __ _ _ _ __ ___ | |__ ___ _ __ ___ -# | | '_ \| '_ \| | | | __| | '_ \| | | | '_ ` _ \| '_ \ / _ \ '__/ __| -# | | | | | |_) | |_| | |_ | | | | |_| | | | | | | |_) | __/ | \__ \ -# |_|_| |_| .__/ \__,_|\__|___|_| |_|\__,_|_| |_| |_|_.__/ \___|_| |___/ -# |_| |_____| -# -#- - - -## START TIME ################################################################### -timer_1_start_hour: - name: Stunden - icon: mdi:timer - #initial: 6 - min: 0 - max: 23 - step: 1 - -timer_1_start_minutes: - name: Minuten - icon: mdi:timer - #initial: 30 - min: 0 - max: 59 - -## FINISH TIME ################################################################# -timer_1_finish_hour: - name: Stunden - icon: mdi:timer - #initial: 6 - min: 0 - max: 23 - step: 1 - -timer_1_finish_minutes: - name: Minuten - icon: mdi:timer - #initial: 30 - min: 0 - max: 59 - step: 1 -``` - ------------------------------------------------------------------------- - -Im Gegensatz zum Lichtwecker benötigen wir hier nun 2 Sensoren -- einen -für die Startzeit und einen wo Beendet werden soll - -``` {.western style="line-height: 150%; text-align: left; orphans: 2; widows: 2; border-top: none; border-bottom: none; border-left: 6.00pt solid #358ccb; border-right: none; padding-top: 0in; padding-bottom: 0in; padding-left: 0.02in; padding-right: 0in; background: transparent"} -####################################################### -# # -# SCRSENSOR # -# # -# # -####################################################### - - -## START TIME ################################################################### -- platform: template - sensors: - timer_1_start_time: - friendly_name: 'Start Time' - value_template: >- - {{ "%0.02d:%0.02d" | format(states("input_number.timer_1_start_hour") | int, states("input_number.timer_1_start_minutes") | int) }} - -## FINISH TIME ################################################################# -- platform: template - sensors: - timer_1_finish_time: - friendly_name: 'Finish Time' - value_template: >- - {{ "%0.02d:%0.02d" | format(states("input_number.timer_1_finish_hour") | int, states("input_number.timer_1_finish_minutes") | int) }} -``` - ------------------------------------------------------------------------- - -Und zum Schluss wieder ein Paar Automatisierung, damit alles -funktioniert. - -``` {.western style="line-height: 150%; text-align: left; orphans: 2; widows: 2; border-top: none; border-bottom: none; border-left: 6.00pt solid #358ccb; border-right: none; padding-top: 0in; padding-bottom: 0in; padding-left: 0.02in; padding-right: 0in; background: transparent"} -alias: Timer 1 Starttime -description: '' -trigger: - - platform: time - at: '00:01:00' -condition: - - condition: template - value_template: >- - {{ is_state('input_boolean.timer_1_' ~ - ['mon','tue','wed','thu','fri','sat','sun'][now().weekday()], - 'on') }} - - condition: template - value_template: '{{ now().strftime("%H:%M") == states.sensor.timer_1_start_time.state }}' -action: - - service: switch.turn_on - data: - entity_id: - - switch.tp_link_01 -hide_entity: true -mode: single -alias: Timer 1 Finishtime -description: '' -trigger: - - platform: time - at: '00:01:00' -condition: - - condition: template - value_template: >- - {{ is_state('input_boolean.timer_1_' ~ - ['mon','tue','wed','thu','fri','sat','sun'][now().weekday()], - 'on') }} - - condition: template - value_template: '{{ now().strftime("%H:%M") == states.sensor.timer_1_finish_time.state }}' -action: - - service: switch.turn_off - data: - entity_id: - - switch.tp_link_01 -hide_entity: true -mode: single -``` - ------------------------------------------------------------------------- - -Zum Schluss alles ins Dashboard.... - -[ [![](Home_assistant_html_acb0022453d57fa7.png){#Image56 align="bottom" -width="630" height="509" -border="0"}](https://smarthomeyourself.de/wp-content/uploads/2022/05/Bildschirmfoto-2022-05-01-um-11.41.37.png) -]{style="background: transparent"} - -``` {.western style="line-height: 150%; text-align: left; orphans: 2; widows: 2; border-top: none; border-bottom: none; border-left: 6.00pt solid #358ccb; border-right: none; padding-top: 0in; padding-bottom: 0in; padding-left: 0.02in; padding-right: 0in; background: transparent"} -type: vertical-stack -cards: - - type: entities - show_header_toggle: false - entities: - - entity: switch.tp_link_01 - - entity: sensor.timer_1_start_time - icon: mdi:clock-start - name: Starten um... - - type: custom:fold-entity-row - padding: 0 - group_config: - toggle: false - type: custom:slider-entity-row - head: - label: Uhrzeit - type: section - items: - - entity: input_number.timer_1_start_hour - - entity: input_number.timer_1_start_minutes - - entity: sensor.timer_1_finish_time - name: Beenden um.... - icon: mdi:clock-end - - type: custom:fold-entity-row - padding: 0 - group_config: - toggle: false - type: custom:slider-entity-row - head: - label: Uhrzeit - type: section - items: - - entity: input_number.timer_1_finish_hour - - entity: input_number.timer_1_finish_minutes - - type: horizontal-stack - cards: - - type: custom:button-card - name: Mo - entity: input_boolean.timer_1_mon - icon: mdi:checkbox-blank-circle - color: rgb(25, 155, 20) - state: - - value: 'off' - icon: mdi:checkbox-blank-circle-outline - color: rgb(61,61,61) - - type: custom:button-card - name: Di - entity: input_boolean.timer_1_tue - icon: mdi:checkbox-blank-circle - color: rgb(25, 155, 20) - state: - - value: 'off' - icon: mdi:checkbox-blank-circle-outline - color: rgb(61,61,61) - - type: custom:button-card - name: Mi - entity: input_boolean.timer_1_wed - icon: mdi:checkbox-blank-circle - color: rgb(25, 155, 20) - state: - - value: 'off' - icon: mdi:checkbox-blank-circle-outline - color: rgb(61,61,61) - - type: custom:button-card - name: Do - entity: input_boolean.timer_1_thu - icon: mdi:checkbox-blank-circle - color: rgb(25, 155, 20) - state: - - value: 'off' - icon: mdi:checkbox-blank-circle-outline - color: rgb(61,61,61) - - type: custom:button-card - name: Fr - entity: input_boolean.timer_1_fri - icon: mdi:checkbox-blank-circle - color: rgb(25, 155, 20) - state: - - value: 'off' - icon: mdi:checkbox-blank-circle-outline - color: rgb(61,61,61) - - type: custom:button-card - name: Sa - entity: input_boolean.timer_1_sat - icon: mdi:checkbox-blank-circle - color: rgb(25, 155, 20) - state: - - value: 'off' - icon: mdi:checkbox-blank-circle-outline - color: rgb(61,61,61) - - type: custom:button-card - name: So - entity: input_boolean.timer_1_sun - icon: mdi:checkbox-blank-circle - color: rgb(25, 155, 20) - state: - - value: 'off' - icon: mdi:checkbox-blank-circle-outline - color: rgb(61,61,61) -``` - -\# -https://smarthomeyourself.de/wiki/homeassistant/naechsten-ausfuehrungszeitpunkt-von-aktiven-zeitplaenen-der-scheduler-card-mit-einem-template-sensor-ermitteln/ - -\- platform: template - -sensors: - -next_scheduler: - -friendly_name: \"Nächster Scheduler\" - -state: \> - -{%- set x = states.switch \| selectattr(\'entity_id\', \'in\', -state_attr(\'group.schedulers\', \'entity_id\'))\| -selectattr(\'state\',\'eq\',\'on\')\|list -%} - -{% if x \| count \> 0 %} - -{{ x\[0\].name }} - -{% else %} - -Kein Eintrag in der Liste - -{%- endif -%} - -attributes: - -next_run: \> - -{%- set x = states.switch \| selectattr(\'entity_id\', \'in\', -state_attr(\'group.schedulers\', \'entity_id\'))\| -selectattr(\'state\',\'eq\',\'on\')\|list -%} - -{% if x \| count \> 0 %} - -{{ as_timestamp( x\[0\].attributes.next_trigger ) \| -timestamp_custom(\"%d.%m.%Y, %H:%M Uhr\") }} - -{% else %} - -Kein Eintrag in der Liste - -{%- endif -%} - -\ - -\ - -\ - -\ - -\ - -# ESP32-CAM PIR Motion Detector with Photo Capture {#esp32-cam-pir-motion-detector-with-photo-capture .western} - - - -![](Home_assistant_html_f9a46a8b6be4893.png){#Image59 align="bottom" -width="643" height="243" border="0"} - -\ - -\ - -\ - - - -\ - -[PIR is connected via a transistor!!]{style="background: #ffff00"} - -\ - -For this project, you'll need the following parts: - -\ - -ESP32-CAM with OV2640 -- read Best ESP32-CAM Dev Boards - -MicroSD card - -PIR motion sensor - -2N3904 transistor - -FTDI programmer - -Female-to-female jumper wires - -5V power supply for ESP32-CAM or power bank (optional) - -\ - -![](Home_assistant_html_69b921e4cd60a802.png){#Image57 align="bottom" -width="554" height="403" border="0"} - -![](Home_assistant_html_569811fbb614e552.png){#Image58 align="bottom" -width="643" height="306" border="0"} - -\ - -\ - -``` western -/********* - Rui Santos - Complete project details at https://RandomNerdTutorials.com/esp32-cam-pir-motion-detector-photo-capture/ - - IMPORTANT!!! - - Select Board "AI Thinker ESP32-CAM" - - GPIO 0 must be connected to GND to upload a sketch - - After connecting GPIO 0 to GND, press the ESP32-CAM on-board RESET button to put your board in flashing mode - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. -*********/ - -#include "esp_camera.h" -#include "Arduino.h" -#include "FS.h" // SD Card ESP32 -#include "SD_MMC.h" // SD Card ESP32 -#include "soc/soc.h" // Disable brownour problems -#include "soc/rtc_cntl_reg.h" // Disable brownour problems -#include "driver/rtc_io.h" -#include // read and write from flash memory -// define the number of bytes you want to access -#define EEPROM_SIZE 1 - -RTC_DATA_ATTR int bootCount = 0; - -// Pin definition for CAMERA_MODEL_AI_THINKER -#define PWDN_GPIO_NUM 32 -#define RESET_GPIO_NUM -1 -#define XCLK_GPIO_NUM 0 -#define SIOD_GPIO_NUM 26 -#define SIOC_GPIO_NUM 27 -#define Y9_GPIO_NUM 35 -#define Y8_GPIO_NUM 34 -#define Y7_GPIO_NUM 39 -#define Y6_GPIO_NUM 36 -#define Y5_GPIO_NUM 21 -#define Y4_GPIO_NUM 19 -#define Y3_GPIO_NUM 18 -#define Y2_GPIO_NUM 5 -#define VSYNC_GPIO_NUM 25 -#define HREF_GPIO_NUM 23 -#define PCLK_GPIO_NUM 22 - -int pictureNumber = 0; - -void setup() { - WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector - Serial.begin(115200); - - Serial.setDebugOutput(true); - - camera_config_t config; - config.ledc_channel = LEDC_CHANNEL_0; - config.ledc_timer = LEDC_TIMER_0; - config.pin_d0 = Y2_GPIO_NUM; - config.pin_d1 = Y3_GPIO_NUM; - config.pin_d2 = Y4_GPIO_NUM; - config.pin_d3 = Y5_GPIO_NUM; - config.pin_d4 = Y6_GPIO_NUM; - config.pin_d5 = Y7_GPIO_NUM; - config.pin_d6 = Y8_GPIO_NUM; - config.pin_d7 = Y9_GPIO_NUM; - config.pin_xclk = XCLK_GPIO_NUM; - config.pin_pclk = PCLK_GPIO_NUM; - config.pin_vsync = VSYNC_GPIO_NUM; - config.pin_href = HREF_GPIO_NUM; - config.pin_sscb_sda = SIOD_GPIO_NUM; - config.pin_sscb_scl = SIOC_GPIO_NUM; - config.pin_pwdn = PWDN_GPIO_NUM; - config.pin_reset = RESET_GPIO_NUM; - config.xclk_freq_hz = 20000000; - config.pixel_format = PIXFORMAT_JPEG; - - pinMode(4, INPUT); - digitalWrite(4, LOW); - rtc_gpio_hold_dis(GPIO_NUM_4); - - if(psramFound()){ - config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA - config.jpeg_quality = 10; - config.fb_count = 2; - } else { - config.frame_size = FRAMESIZE_SVGA; - config.jpeg_quality = 12; - config.fb_count = 1; - } - - // Init Camera - esp_err_t err = esp_camera_init(&config); - if (err != ESP_OK) { - Serial.printf("Camera init failed with error 0x%x", err); - return; - } - - Serial.println("Starting SD Card"); - - delay(500); - if(!SD_MMC.begin()){ - Serial.println("SD Card Mount Failed"); - //return; - } - - uint8_t cardType = SD_MMC.cardType(); - if(cardType == CARD_NONE){ - Serial.println("No SD Card attached"); - return; - } - - camera_fb_t * fb = NULL; - - // Take Picture with Camera - fb = esp_camera_fb_get(); - if(!fb) { - Serial.println("Camera capture failed"); - return; - } - // initialize EEPROM with predefined size - EEPROM.begin(EEPROM_SIZE); - pictureNumber = EEPROM.read(0) + 1; - - // Path where new picture will be saved in SD Card - String path = "/picture" + String(pictureNumber) +".jpg"; - - fs::FS &fs = SD_MMC; - Serial.printf("Picture file name: %s\n", path.c_str()); - - File file = fs.open(path.c_str(), FILE_WRITE); - if(!file){ - Serial.println("Failed to open file in writing mode"); - } - else { - file.write(fb->buf, fb->len); // payload (image), payload length - Serial.printf("Saved file to path: %s\n", path.c_str()); - EEPROM.write(0, pictureNumber); - EEPROM.commit(); - } - file.close(); - esp_camera_fb_return(fb); - - delay(1000); - - // Turns off the ESP32-CAM white on-board LED (flash) connected to GPIO 4 - pinMode(4, OUTPUT); - digitalWrite(4, LOW); - rtc_gpio_hold_en(GPIO_NUM_4); - - esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 0); - - Serial.println("Going to sleep now"); - delay(1000); - esp_deep_sleep_start(); - Serial.println("This will never be printed"); -} - -void loop() { - -} -``` - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# ESP32-CAM Video Streaming Web Server (works with Home Assistant) {#esp32-cam-video-streaming-web-server-works-with-home-assistant .western} - - - -\ - -\ - -``` western -/********* - Rui Santos - Complete project details at https://RandomNerdTutorials.com/esp32-cam-video-streaming-web-server-camera-home-assistant/ - - IMPORTANT!!! - - Select Board "AI Thinker ESP32-CAM" - - GPIO 0 must be connected to GND to upload a sketch - - After connecting GPIO 0 to GND, press the ESP32-CAM on-board RESET button to put your board in flashing mode - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files. - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. -*********/ - -#include "esp_camera.h" -#include -#include "esp_timer.h" -#include "img_converters.h" -#include "Arduino.h" -#include "fb_gfx.h" -#include "soc/soc.h" //disable brownout problems -#include "soc/rtc_cntl_reg.h" //disable brownout problems -#include "esp_http_server.h" - -//Replace with your network credentials -const char* ssid = "REPLACE_WITH_YOUR_SSID"; -const char* password = "REPLACE_WITH_YOUR_PASSWORD"; - -#define PART_BOUNDARY "123456789000000000000987654321" - -// This project was tested with the AI Thinker Model, M5STACK PSRAM Model and M5STACK WITHOUT PSRAM -#define CAMERA_MODEL_AI_THINKER -//#define CAMERA_MODEL_M5STACK_PSRAM -//#define CAMERA_MODEL_M5STACK_WITHOUT_PSRAM - -// Not tested with this model -//#define CAMERA_MODEL_WROVER_KIT - -#if defined(CAMERA_MODEL_WROVER_KIT) - #define PWDN_GPIO_NUM -1 - #define RESET_GPIO_NUM -1 - #define XCLK_GPIO_NUM 21 - #define SIOD_GPIO_NUM 26 - #define SIOC_GPIO_NUM 27 - - #define Y9_GPIO_NUM 35 - #define Y8_GPIO_NUM 34 - #define Y7_GPIO_NUM 39 - #define Y6_GPIO_NUM 36 - #define Y5_GPIO_NUM 19 - #define Y4_GPIO_NUM 18 - #define Y3_GPIO_NUM 5 - #define Y2_GPIO_NUM 4 - #define VSYNC_GPIO_NUM 25 - #define HREF_GPIO_NUM 23 - #define PCLK_GPIO_NUM 22 - -#elif defined(CAMERA_MODEL_M5STACK_PSRAM) - #define PWDN_GPIO_NUM -1 - #define RESET_GPIO_NUM 15 - #define XCLK_GPIO_NUM 27 - #define SIOD_GPIO_NUM 25 - #define SIOC_GPIO_NUM 23 - - #define Y9_GPIO_NUM 19 - #define Y8_GPIO_NUM 36 - #define Y7_GPIO_NUM 18 - #define Y6_GPIO_NUM 39 - #define Y5_GPIO_NUM 5 - #define Y4_GPIO_NUM 34 - #define Y3_GPIO_NUM 35 - #define Y2_GPIO_NUM 32 - #define VSYNC_GPIO_NUM 22 - #define HREF_GPIO_NUM 26 - #define PCLK_GPIO_NUM 21 - -#elif defined(CAMERA_MODEL_M5STACK_WITHOUT_PSRAM) - #define PWDN_GPIO_NUM -1 - #define RESET_GPIO_NUM 15 - #define XCLK_GPIO_NUM 27 - #define SIOD_GPIO_NUM 25 - #define SIOC_GPIO_NUM 23 - - #define Y9_GPIO_NUM 19 - #define Y8_GPIO_NUM 36 - #define Y7_GPIO_NUM 18 - #define Y6_GPIO_NUM 39 - #define Y5_GPIO_NUM 5 - #define Y4_GPIO_NUM 34 - #define Y3_GPIO_NUM 35 - #define Y2_GPIO_NUM 17 - #define VSYNC_GPIO_NUM 22 - #define HREF_GPIO_NUM 26 - #define PCLK_GPIO_NUM 21 - -#elif defined(CAMERA_MODEL_AI_THINKER) - #define PWDN_GPIO_NUM 32 - #define RESET_GPIO_NUM -1 - #define XCLK_GPIO_NUM 0 - #define SIOD_GPIO_NUM 26 - #define SIOC_GPIO_NUM 27 - - #define Y9_GPIO_NUM 35 - #define Y8_GPIO_NUM 34 - #define Y7_GPIO_NUM 39 - #define Y6_GPIO_NUM 36 - #define Y5_GPIO_NUM 21 - #define Y4_GPIO_NUM 19 - #define Y3_GPIO_NUM 18 - #define Y2_GPIO_NUM 5 - #define VSYNC_GPIO_NUM 25 - #define HREF_GPIO_NUM 23 - #define PCLK_GPIO_NUM 22 -#else - #error "Camera model not selected" -#endif - -static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY; -static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n"; -static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n"; - -httpd_handle_t stream_httpd = NULL; - -static esp_err_t stream_handler(httpd_req_t *req){ - camera_fb_t * fb = NULL; - esp_err_t res = ESP_OK; - size_t _jpg_buf_len = 0; - uint8_t * _jpg_buf = NULL; - char * part_buf[64]; - - res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE); - if(res != ESP_OK){ - return res; - } - - while(true){ - fb = esp_camera_fb_get(); - if (!fb) { - Serial.println("Camera capture failed"); - res = ESP_FAIL; - } else { - if(fb->width > 400){ - if(fb->format != PIXFORMAT_JPEG){ - bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len); - esp_camera_fb_return(fb); - fb = NULL; - if(!jpeg_converted){ - Serial.println("JPEG compression failed"); - res = ESP_FAIL; - } - } else { - _jpg_buf_len = fb->len; - _jpg_buf = fb->buf; - } - } - } - if(res == ESP_OK){ - size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len); - res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen); - } - if(res == ESP_OK){ - res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len); - } - if(res == ESP_OK){ - res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); - } - if(fb){ - esp_camera_fb_return(fb); - fb = NULL; - _jpg_buf = NULL; - } else if(_jpg_buf){ - free(_jpg_buf); - _jpg_buf = NULL; - } - if(res != ESP_OK){ - break; - } - //Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len)); - } - return res; -} - -void startCameraServer(){ - httpd_config_t config = HTTPD_DEFAULT_CONFIG(); - config.server_port = 80; - - httpd_uri_t index_uri = { - .uri = "/", - .method = HTTP_GET, - .handler = stream_handler, - .user_ctx = NULL - }; - - //Serial.printf("Starting web server on port: '%d'\n", config.server_port); - if (httpd_start(&stream_httpd, &config) == ESP_OK) { - httpd_register_uri_handler(stream_httpd, &index_uri); - } -} - -void setup() { - WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector - - Serial.begin(115200); - Serial.setDebugOutput(false); - - camera_config_t config; - config.ledc_channel = LEDC_CHANNEL_0; - config.ledc_timer = LEDC_TIMER_0; - config.pin_d0 = Y2_GPIO_NUM; - config.pin_d1 = Y3_GPIO_NUM; - config.pin_d2 = Y4_GPIO_NUM; - config.pin_d3 = Y5_GPIO_NUM; - config.pin_d4 = Y6_GPIO_NUM; - config.pin_d5 = Y7_GPIO_NUM; - config.pin_d6 = Y8_GPIO_NUM; - config.pin_d7 = Y9_GPIO_NUM; - config.pin_xclk = XCLK_GPIO_NUM; - config.pin_pclk = PCLK_GPIO_NUM; - config.pin_vsync = VSYNC_GPIO_NUM; - config.pin_href = HREF_GPIO_NUM; - config.pin_sscb_sda = SIOD_GPIO_NUM; - config.pin_sscb_scl = SIOC_GPIO_NUM; - config.pin_pwdn = PWDN_GPIO_NUM; - config.pin_reset = RESET_GPIO_NUM; - config.xclk_freq_hz = 20000000; - config.pixel_format = PIXFORMAT_JPEG; - - if(psramFound()){ - config.frame_size = FRAMESIZE_UXGA; - config.jpeg_quality = 10; - config.fb_count = 2; - } else { - config.frame_size = FRAMESIZE_SVGA; - config.jpeg_quality = 12; - config.fb_count = 1; - } - - // Camera init - esp_err_t err = esp_camera_init(&config); - if (err != ESP_OK) { - Serial.printf("Camera init failed with error 0x%x", err); - return; - } - // Wi-Fi connection - WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - Serial.println(""); - Serial.println("WiFi connected"); - - Serial.print("Camera Stream Ready! Go to: http://"); - Serial.print(WiFi.localIP()); - - // Start streaming web server - startCameraServer(); -} - -void loop() { - delay(1); -} -``` - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# ESP32-CAM with Tasmota {#esp32-cam-with-tasmota .western} - - - -\ - - - - - -use webinstaller to flash webcam firmware - -\ - -connect to AP and open 192.168.4.1 - -\ - -\ - -\ - - - -\ - -how can i activte the rtsp stream? - -Enter on console: - -wcrtsp 1 - -[wcrtsp 0]{style="background: #ffff00"} - -\ - -wcstream 0 stops the HTTP stream - -\ - -\ - -==\> rtsp://IP_der_Kamera:8554/mjpeg/1 - -rtsp://192.168.178.76:8554/mjpeg/1 - -\ - -\ - - - -http://192.168.178.76:81/stream - -[http://192.168.178.76:81/cam.mjpeg]{style="background: #ffff00"} - -\ - -\ - -\ - - - -**(4g) Tasmota Einstellungen - Sende- und Abrufintervall, Zeitzone und -Home Assistant** - -1\. Configure other (Configuration -\> Configure Other):  - -- MQTT = enabled - -- Device Name = MT175 (oder wählt einen anderen Namen) - -2\. Sende/Abruf Intervall einstellen (Configuration -\> Configure -Logging) - -- Telemetry period\ - (Wie oft soll der Wert an HA geschickt werden z.B. 60s) - -4\. Main Menu -\> Console: - -- [[[[Wenn ihr - die ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}**[[[[[**Tasmota - Home Assistant - Integration**]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="text-decoration: none"}]{style="font-variant: normal"}](https://www.home-assistant.io/integrations/tasmota/){target="_blank"}**[[[[ nutzen - wollt müsst nicht nichts ändern, da SetOption19 bereits auf 0 - eingestellt - ist]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -- Wenn ihr verhindern wollt, dass Tasmota rebootet wenn euer WLAN - Router mal nicht verfügbar ist dann folgendes eintippen: WifiConfig - 5\ - (wait until selected AP is available again without rebooting) - -- Falls ihr Probleme mit der Uhrzeit/Zeitumstellung habt, folgendes - eingeben: - - - Backlog0 Timezone 99; TimeStd 0,0,10,1,3,60; TimeDst - 0,0,3,1,2,120 - -- Skript bezogene Einstellungen findet ihr direkt im Skript ganz oben - erklärt (englisch) - -\ - -\ - - - -\ - -+-------------+--------+---------------------------------------------+ -| SetOption19 | 1 / on | [aktiviert die automatische Erkennung von | -| | | Home-Assistant Komponenten (auch: Domoticz | -| | | MQTT Discovery).\ | -| | | ]{style="font-weight: normal"}* | -| | | *[Achtung]{style="font-weight: normal"}**[: | -| | | Setoption19 1 ändert die Reihenfolge der | -| | | MQTT-Topics | -| | | auf %topi | -| | | c%/%prefix%/ (Standard: %prefix%/%topic%/). | -| | | Dies lässt sich auch nicht durch einen | -| | | entsprechenden Konsolenbefehl fulltopic | -| | | %prefix%/%topic | -| | | %/ erzwingen.]{style="font-weight: normal"} | -+-------------+--------+---------------------------------------------+ - -\ - -\ - -SetOption19 0 - -\ - -\ - -\ - - - -\ - -+------------------------+--------------------------------------------+ -| []{#wcstream} WcStream | `1`{.western}[ = start webcam stream at | -| | http://\:81/stream or | -| | http://\:81/cam.mjpeg\ | -| | ]{style="font-weight: normal"} | -| | | -| | `0`{.western}[ = stop | -| | stream]{style="font-weight: normal"} | -+------------------------+--------------------------------------------+ - -\ - -[]{#wcstream1}[WcStream 1]{style="background: #ffff00"} - -\ - -+--------------------------------+------------------------------------+ -| []{#wcresolution} WcResolution | [Set camera resolution.\ | -| | ]{style="font-weight: normal"} | -| | | -| | `0`{.western}[ = 96x96 (96x96)\ | -| | ]{style="font-weight: normal"} | -| | | -| | `1`{.western}[ = QQVGA2 (128x160)\ | -| | ]{style="font-weight: normal"} | -| | | -| | `2`{.western}[ = QCIF (176x144)\ | -| | ]{style="font-weight: normal"} | -| | | -| | `3`{.western}[ = HQVGA (240x176)\ | -| | ]{style="font-weight: normal"} | -| | | -| | `4`{.western}[ = QVGA (320x240)\ | -| | ]{style="font-weight: normal"} | -| | | -| | `5`{.western}[ = CIF (400x296)\ | -| | ]{style="font-weight: normal"} | -| | | -| | `6`{.western}[ = VGA (640x480)\ | -| | ]{style="font-weight: normal"} | -| | | -| | `7`{.western}[ = SVGA (800x600)\ | -| | ]{style="font-weight: normal"} | -| | | -| | `8`{.western}[ = XGA (1024x768)\ | -| | ]{style="font-weight: normal"} | -| | | -| | `9`{.western}[ = SXGA (1280x1024)\ | -| | ]{style="font-weight: normal"} | -| | | -| | `10`{.western}[ = UXGA | -| | (1600x1 | -| | 200)]{style="font-weight: normal"} | -+--------------------------------+------------------------------------+ - -\ - -[]{#wcresolution1}[WcResolution 10 → XGA -(1024x768)]{style="background: transparent"} - -[]{#wcresolution11}[WcResolution 12 → UXGA -(1600x1200)]{style="background: #ffff00"} - -\ - -WcClock 200 - -\ - -\ - -\ - - - -\ - -ON \ DO \ \[ENDON \| BREAK\] - -\ - - - -\ - - ----------------------------- ------------------------------------------------------ - []{#TimeMinute} Time#Minute every minute - Time#Minute\|5 every five minutes - Time#Minute=241 every day once at 04:01 (241 minutes after midnight) - ----------------------------- ------------------------------------------------------ - -\ - -**Restart at specific time each da of the week:** - -[Timer1 -{\"Enable\":1,\"Mode\":0,\"Time\":\"04:0\",\"Window\":0,\"Days\":\"1111111\",\"Repeat\":1,\"Action\":3}]{style="background: #ffff00"} - -[Rule1 ON clock#Timer=1 DO Restart 1 ENDON]{style="background: #ffff00"} - -[Rule1 1]{style="background: #ffff00"} - -\ - -**[Restart every 5 min:]{style="background: transparent"}** - -[Rule1 ON [Time#Minute\|5]{style="font-weight: normal"} DO Restart 5 -ENDON]{style="background: transparent"} - -[Rule1 1]{style="background: transparent"} - -\ - -\ - -\ - -\ - -\ - -\ - -# Petoneer Smart Dot Add-on {#petoneer-smart-dot-add-on .western} - - - - - -add repository: https://github.com/marcomow/hass-addons - -\ - -\ - -\ - -modification for tasmota - - - -\ - -\ - -\ - -\ - -\ - -# Install Petkit devices {#install-petkit-devices .western} - -\ - -Account email: - -account password: - -\ - -\ - -\ - -\ - -# perfboard design with fritzing {#perfboard-design-with-fritzing .western} - - - -\ - - - -Select breadboard view (probably delete the breadboard to reduce -clutter) then in the parts window on the right select core and move down -to the category breadboard view near the bottom. There select the type -of perfboard you want and drag it to the breadboard window. Once it is -in the window the inspector window on the bottom right will let you -change various things about it such as size and prefboard / stripboard. - -\ - -\ - -\ - -\ - -\ - -\ - -# Frigate {#frigate .western} - - - -\ - -attention to frame size configuration and ffmpeg declaration! - -\ - -\ - -LINKS: - -\ - -\ - -Frigate repository: https://github.com/blakeblackshear/fr\... - -\ - -Go2RTC repository: https://github.com/AlexxIT/hassio-addons - -\ - -\ - -Frigate configuration: https://docs.frigate.video/configurat\... - -\ - -Go2RTC: https://github.com/AlexxIT/go2rtc - -\ - -\ - -Go2RTC.yaml: https://pastebin.com/Fagfm1sC - -\ - -Frigate.yml: - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -## stream Tapo C220 with Frigate {#stream-tapo-c220-with-frigate .western} - -tapo: - -ffmpeg: - -inputs: - -\# Für 1080P (1920\*1080) stream: rtsp://username:password@IP -Address:554/stream1 - -\# Für 360P (640\*360) stream: rtsp://username:password@IP -Address:554/stream2 - -\- path: -rtsp://tapocam:watchmyhome90@192.168.178.21:554/stream2?video&audio=all - -roles: - -\- detect - -detect: - -width: 640 - -height: 360 - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# operating touch button with Arduino {#operating-touch-button-with-arduino .western} - - - -\ - - - -\ - - - -\ - -\ - -\ - -\ - -\ - -# control Duux Whisper Flex Ultimate {#control-duux-whisper-flex-ultimate .western} - -Add Duux to Tuya Smart Life app - -add Tuya integration to homeassistant, which should automatically -identif device - -create scene in app and reload integration - -\ - -\ - -\ - -\ - -# use ESP32 as BLE hub or repeater {#use-esp32-as-ble-hub-or-repeater .western} - - - -Hier fügst du folgende URL hinzu: -https://dl.espressif.com/dl/package_esp32_index.json - -\ - -Als nächstes müssen zusätzliche Bibliotheken installiert werden. Hier -die Übersicht, welche das sind: - -\ - -NimBLEDevice - -EspMQTTClient - -ArduinoJson - -CRC32 library (by Christopher Baker) - -ArduinoQueue - -\ - -Sind Arduino Vorbereitungen erledigt kannst du den Projektcode vom -Github herunter laden. - - - -\ - -[[[[Die Zip Datei wird entpackt und die -Datei ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**SwitchBot-BLE2MQTT-ESP32.ino**[[[[ in Arduino geöffnet. Im -Bereich ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**„** - -**Configurations to change"**[[[[ müssen nun noch ein paar Einstellungen -vorgenommen -werden.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -1. Zunächst werden im ersten Abschnitt deine WLAN Daten eingetragen - -2. Danach folgen die Angaben zu deinem MQTT Broker - -3. [[[[Als nächsten werden die BLE Adressen - der ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - [Switchbot](https://amzn.to/39MJeTa){target="_blank"}[[[[ Geräte - hinterlegt und die Bereiche entsprechend - einkommentiert.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[![Arduino Projektcode -anpassen](Home_assistant_html_b50bb11cf20b1254.png){#Image60 -align="bottom" width="806" height="330" border="0"} [[Arduino -Projektcode]{style="font-weight: normal"}]{style="font-style: normal"}]{style="display: inline-block; border: none; padding: 0in"} - -Zum Schluss noch definieren ob dein Board eine LED hat oder nicht. Im -Falle des von mir verwendeten ESP32 ist das folgende Einstellung - -[![ESP32 LED on Board oder -nicht.](Home_assistant_html_f5f44e841889b68c.png){#Image61 -align="bottom" width="806" height="158" border="0"} [[ESP32 -LED]{style="font-weight: normal"}]{style="font-style: normal"}]{style="display: inline-block; border: none; padding: 0in"} - -[[[[Nun kann der Sketch kompiliert und auf -den ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[ESP32](https://amzn.to/3NiZ3i6){target="_blank"}[[[[ geflasht -werden.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[![ESP32 Switchbot Sketch -kompilieren](Home_assistant_html_1386d908c9ebed2b.png){#Image62 -align="bottom" width="757" height="227" border="0"} [[ESP32 Sketch -kompilieren]{style="font-weight: normal"}]{style="font-style: normal"}]{style="display: inline-block; border: none; padding: 0in"} - -**Switchbot Geräte per MQTT in Home Assistant** - -[[[[Nach einem Neustart -des ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[ESP32](https://amzn.to/3NiZ3i6){target="_blank"}[[[[ sollten alle -erreichbaren Switchbot Geräte per Auto-Discovery in der MQTT Karte in -Home Assistant zu sehen -sein.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -\ - -\ - -\ - -\ - -\ - -\ - -# Best thermostat to control tado {#best-thermostat-to-control-tado .western} - -\ - -RU4251787008: wall thermostat - -IB1670717952: internet bridge; connected to router - -\ - -\ - -\ - -Definition of entity_id: climate.tado_wohnzimmer: - -tado integration - -\ - -correct tado temperature: - -/config/sensor/templates.yaml - -\ - -calculate average temperature of thermostates: - -/config/sensor/temp_indoors_average.yaml - -\ - -adjust temperature of tado with another sensor.sensor1: - -/config/automations/automations.yaml - -alias: Trigger if the state of either thermostat changes - -standard is 0.5 °C delta - -\ - -adjust dynamics of temperature controller - -\ - -\ - -turn off central heater or single thermostat based on presence: - -/config/automations/home-away.yaml - -\ - -\ - -\ - -\ - -\ - -\ - -# Fritz box: detect new devices in homeassistant {#fritz-box-detect-new-devices-in-homeassistant .western} - - - -\- platform: event - -id: \"state\" - -event_type: entity_registry_updated - -event_data: - -action: create - -\ - -trigger.event.data.entity_id - -\ - -\- \"{{trigger.event.data.entity_id.startswith(\'device_tracker\')}}\" - -\ - -\ - -\ - -\ - -\ - -# install Conbee III {#install-conbee-iii .western} - -\ - -/dev/serial/by-id/usb-dresden_elektronik_ConBee_III_DE03188934-if00-port0 - -\ - -ls /dev/serial/by-id - -\ - -\ - -\ - -\ - - - -List your devices... - -``` {.western style="orphans: 2; widows: 2; margin-bottom: 0.2in"} -ls /dev > ~/devices.txt -``` - -\ -[[[[NOW plug in ConBee II to USB Port (via USB extension -cable)]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -- Reboot. - -Find the ConBee II device - -``` {.western style="orphans: 2; widows: 2"} -ls /dev > ~/devices2.txt -diff ~/devices.txt ~/devices2.txt -``` - -[[[[This will show the new device.\ -In my case it -was ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`/dev/ttyACM0`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -\ -\ -\ - -\ - -\ - - - -\ - - - -\ - -\ - - - -\ - -\ - -\ - -## firmware update {#firmware-update .western} - - - -GCFFlasher -l - -GCFFlasher -d COM29 -t 60 -f deCONZ_ConBeeIII_0x264f0900.bin.GCF - -\ - -in case of powershell: - -.\\GCFFlasher -l - -.\\GCFFlasher -d COM29 -t 60 -f deCONZ_ConBeeIII_0x264f0900.bin.GCF - -\ - -\ - -## Connect Philips Hue bulb to Conbee {#connect-philips-hue-bulb-to-conbee .western} - -1. It seems as if activation of both ZHA and deConz leads to - interferences → ZHA alone seems to work - -2. Delete bulb in the app - -3. if lamp is not immediately recognized, searching for devices with - ZHA or deConz will find device automatically - -\ - -\ - -## Connect Philips Motion Sensor {#connect-philips-motion-sensor .western} - -1. delete the sensor from the app - -2. push the reset button for 10 s - -3. once the orange LED blinks, the device is read for pairing - -4. - -\ - -\ - -## Connect Bosch Smart radiatorThermostate to Conbee {#connect-bosch-smart-radiatorthermostate-to-conbee .western} - -Thermostate 1: - -18FC2600000615BD - -FC32-9603-E07B - -5182-1390-11E8 - -209B-5433-A9D3 - -service: zha.permit\ -data:\ -duration: 60\ -ieee: 00:21:2e:ff:ff:0e:1d:f6\ -source_ieee: 18:fc:26:00:00:06:15:bd\ -install_code: FC32-9603-E07B-5182-1390-11E8-209B-5433-A9D3 - -\ - -Via HACS install ZHA toolkit - -1. In configuration.yaml add a line zha_toolkit: - -2. On the battery cap or on the radiator behind the batteries note the - ZigBee EUI-64 code ('Source IEEE') and the Install Code. - -3. Go to Developer tools, services, service: Zigbee Home Automation: - Permit - -4. Enter the Source IEEE code and the install code in the UI. INSTALL - -5. YAML looks like this: - -6. service: zha.permit - -7. data: - -8. install_code: 379E-1234-ABCD-E529-1234-E6FE-ABCD-A70F-1234 - -9. source_ieee: 18:fc:26:00:00:dc:ba:ab - -10. After INSTALL, go to Settings, Intergrations, Zigbee Home - Automation. Your device should be listed now - -11. Done. - -\ - - - -Via HACS install ZHA toolkit - -1. [[[[In configuration.yaml add a - line ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`zha_toolkit:`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -2. On the battery cap or on the radiator behind the batteries note the - ZigBee EUI-64 code ('Source IEEE') and the Install Code. - -3. [[[[Go to Developer tools, services, - service: ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`Zigbee Home Automation: Permit`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -4. Enter the Source IEEE code and the install code in the UI. INSTALL - -5. [[[[YAML looks like this:\ - service: zha.permit\ - data:\ - install_code: ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[`379E-1234-ABCD-E529-1234-E6FE-ABCD-A70F-1234`{.western}]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}[[[[\ - source_ieee: - 18:fc:26:00:00:dc:ba:ab]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -6. After INSTALL, go to Settings, Intergrations, Zigbee Home - Automation. Your device should be listed now - -7. Done. - -\ - -\ - -\ - -\ - -\ - -\ - - - -Wie setze ich das Bosch Smart Home Heizkörper-Thermostat II auf die -Werkseinstellungen zurück (Zurücksetzen)? - -Um das Bosch Smart Home Heizkörper-Thermostat II auf die -Werkseinstellungen zurückzusetzen gehen Sie wie folgt vor: - -\ - -Entfernen Sie eine Batterie. Während Sie die Bedientaste (\"o\") -gedrückt halten, setzen Sie die Batterie wieder ein. Halten Sie die -Taste solange gedrückt bis die Status-LED orange blinkt und auf dem -Display \"RES\" steht. Lassen Sie die Taste nun kurz los und drücken Sie -die Taste erneut solange bis die Status-LED grün aufleuchtet. Das Bosch -Smart Home Heizkörper-Thermostat II wird nun auf die Werkseinstellungen -zurückgesetzt. - -Bitte beachten Sie, dass hierbei nur die Daten auf dem Bosch Smart Home -Heizkörper-Thermostat II selbst, aber nicht auf dem Bosch Smart Home -Controller gelöscht werden. Um die Daten auf dem Bosch Smart Home -Controller zu löschen, öffnen Sie die Geräteeinstellungen in der Bosch -Smart Home App und löschen dort das entsprechende Gerät. - -\ - -Bitte beachten Sie hierzu auch unser Reset-Video in diesem Artikel. -Sollte es Probleme bei der Darstellung des Videos geben, dann finden Sie -unsere Installations- und Reset-Videos auch auf unserem Bosch Smart Home -Youtube Channel unter folgendem Link. - -\ - -\ - -\ - - - -[[[[To add new devices to the network, call -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -`permit`{.western}[[[[ service on -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -`zha`{.western}[[[[ domain. Do this by clicking the Service icon in -Developer tools and -typing ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -`zha.permit`{.western}[[[[ in -the ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}**[[[**Service**]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}**[[[[ dropdown -box. Next, follow the device instructions for adding, scanning or -factory -reset.]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"}\ -\ -\ - -\ - -\ - -\ - -\ - -## Use REST client {#use-rest-client .western} - - - -\ - -Talend API Tester - Free Edition - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -# install proxmox server {#install-proxmox-server .western} - -\ - -\ - - - - - -\ - -\ - -\ - -\ - -Proxmox - -[https://www.cyberithub.com/how-to-install-proxmox-ve-step-by-step-guide/](https://www.cyberithub.com/how-to-install-proxmox-ve-step-by-step-guide/#Step_4_Install_Proxmox_VE)[#Step_4_Install_Proxmox_VE](https://www.cyberithub.com/how-to-install-proxmox-ve-step-by-step-guide/#Step_4_Install_Proxmox_VE) - -\ - -\ - -Nextcloud - -ttek - -\ - -\ - -Homeassistant - -ttek - - - - - -\ - -\ - -mqtt - -ttek - -\ - -Mariadb - -ttek - -\ - -\ - -influx db - -ttek - - - -\ - -\ - -grafana - -ttek - -\ - -\ - -adguard - -ttek - -\ - -\ - -Node-RED - -ttek - -\ - -Visual Studio Code - -tte - -\ - -\ - -frigate - - - -\ - -\ - -Vaultwarden - -ttek - -\ - -Nginx Proxy Manager - -ttek - -\ - -Syncthing - -ttek - -\ - -\ - -Wiki.js - -ttek - - - -\ - -\ - -WireGuard - -ttek - -\ - -\ - -deCONZ - -ttek - -\ - -grocy - -ttek - - - - - -\ - -\ - -\ - -\ - -\ - -\ - -# Win tips {#win-tips .western} - -## open disk manager as admin {#open-disk-manager-as-admin .western} - -Open Run from the Start menu or Apps screen. Type diskmgmt.msc and press -Enter. - -\ - -\ - -## Formatting disk via command prompt → dangerous!!! {#formatting-disk-via-command-prompt-dangerous .western} - - - -Die Windows-Eingabeaufforderung hat ähnliche Funktionen wie die -Datenträgerverwaltung, erfordert jedoch hervorragende Fähigkeiten, -insbesondere in den Befehlszeilen. Es kann einige USB-Probleme lösen, -indem es mit verschiedenen Befehlen formatiert wird. Befolgen Sie die -Schritte, um zu sehen, wie Sie dieses Tool zum Formatieren von -USB-Sticks verwenden. - -[[[[Schritt 1. Geben Sie -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**cmd**[[[[" in die Suchleiste ein, klicken Sie mit der rechten -Maustaste auf -die ]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Eingabeaufforderung **[[[[und wählen Sie -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Als Administrator -ausführen**[[[[".]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[[[Schritt 2. Geben Sie nacheinander die folgenden Befehlszeilen ein -und drücken Sie jedes Mal -„]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -**Enter**[[[[":]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -- **diskpart** -- **list disk** -- **select disk n**[[[[ (n ist die Nummer des - USB-Sticks)]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} -- **clean** -- **create partition primary** -- **format fs=fat32 quick**[[[[ (Sie können fat32 durch ntfs oder - exfat - ersetzen.)]{style="font-weight: normal"}]{style="font-style: normal"}]{style="letter-spacing: normal"}]{style="font-variant: normal"} - -[[ [![USB-Stick formatieren mit -Eingabeaufforderung](Home_assistant_html_9b588e9199f4f42.png){#Image63 -align="bottom" width="406" height="375" -border="1"}](https://www.diskpart.com/screenshot/de/windows-tools/cmd/format-hard-drive-from-command-prompt-in-windows.png){target="_blank"} -]{style="background: transparent"}]{style="display: inline-block; border: none; padding: 0in"} - -\ -\ -\ - -\ - -\ - -\ - -\ - -# Mycropython IDEs {#mycropython-ides .western} - -## [Thonny]{style="background: #81d41a"} {#thonny .western} - - - -\ - - - - - -sudo apt install python3-tk thonny - -\ - -\ - -## [VSCode]{style="background: #c9211e"} {#vscode .western} - - - - - -\ - -\ - -\ - -https://www.bordergate.co.uk/configuring-an-esp32-in-ubuntu-22-04/ - -First plug the device in, and check it's recognised by the operating -system using the lsusb command. You should see an entry similar to the -following: - -\>\>lsusb - -Bus 001 Device 006: ID 303a:4001 Espressif Systems Espressif Device - -\ - -Using the dmesg command, you should be able to see the device being -allocated a TTY: - -\>\> sudo dmesg - -cdc_acm 1-4:1.0: ttyACM0: USB ACM device - -\ - -\>\>screen /dev/ttyACM0 115200 - -\ - -You may need to add the user to the "dialout" and "tty" groups to access -the TTY device: - -\>\>sudo usermod -a -G dialout \ - -\>\>sudo usermod -a -G tty \ - -\ - -Log out after making the usermod change. Next attempt to connect to the -device using screen: - -\>\>screen /dev/ttyACM0 115200 - -\ - -If the device is working, you should get a blank screen. If you receive -an error about screen terminating, something has went wrong... - -\ - - - -ls -l /dev/ttyACM0 - -\ - -sudo usermod -aG dialout \$USER - -sudo usermod -aG tty \$USER - -\ - -sudo adduser \$USER dialout - -sudo chmod a+rw /dev/ttyACM0 - -\ - -**==\> need to reboot for effects to take place!!** - -\ - -\ - -## Flashing Mycropython firmware {#flashing-mycropython-firmware .western} - -See also esptool.txt document - - - -pip install esptool - -pip install setuptools - -python -m esptool - -\ - -**e.g., T-Display-S3:** - -cd \"/home/bora/Documents/Home Assistant/Micropython\" - -python -u -m esptool \--chip esp32s3 \--port /dev/ttyACM0 erase_flash - -python -u -m esptool \--chip esp32s3 \--port /dev/ttyACM0 write_flash -z -0x0 firmware_t-display-s3_st7789s3_esp_lcd_v1.20.1.bin - -==\> several trials with pushing the BOOT button might be required! - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\ - -\