refactor: moved to hugo
BIN
content/blog/2020/12/01/november/image.jpg
Normal file
After Width: | Height: | Size: 987 KiB |
150
content/blog/2020/12/01/november/index.md
Normal file
|
@ -0,0 +1,150 @@
|
|||
+++
|
||||
title = "November 2020"
|
||||
date = 2020-12-01
|
||||
+++
|
||||
|
||||
Checking my images it seems this month I didn't have anything remarkable from the outside so... I just
|
||||
wanted to share that this month I have given myself some very nice meals and I improved the
|
||||
Katsu Curry recipe quite a bit. I'm not good at cooking by any means, but the relax you get
|
||||
from listening to music while cooking some healthy food is pretty good.
|
||||
|
||||
[](image.jpg)
|
||||
|
||||
<!--more-->
|
||||
|
||||
## Projects
|
||||
|
||||
- [**Switch games json**](https://github.com/fmartingr/switch-games-json)
|
||||
|
||||
I made a simple script to parse and expose the Nintendo Switch game list in JSON including the encrypted title ID
|
||||
field that is used on the screenshots on the system. The JSON list is generated every day from the Switchbrew wiki
|
||||
and exposed via Github pages.
|
||||
|
||||
The main problem here is that not every game is present on Switchbrew, so I'm unsure how to automate this without
|
||||
asking people to pull request missing games or doing that myself (for the ones missing). I need to check if the same
|
||||
title ID filed that is required to get the proper encrypted field is present on the eShop's API. If that's the case
|
||||
it would be possible to get the list for all games _easily_.
|
||||
|
||||
- [**Games Screenshot Manager**](https://github.com/fmartingr/games-screenshot-manager)
|
||||
|
||||
Related to the one above, an application to fetch and sort all screenshots found from several providers and games.
|
||||
Currently working for Steam, Nintendo Switch and some games on several operating systems. I'm starting to like this
|
||||
_golang_ thing. :D
|
||||
|
||||
- [**Butterrobot**](https://github.com/fmartingr/butterrobot)
|
||||
|
||||
I've been making slow progress with the admin interface. I'm trying to keep it as simple as possible: a way to
|
||||
check which channels and plugins there are available and an option to enable plugins with channels allowing a
|
||||
JSON configuration to be used with them, since the same plugin on a different channel would require a different
|
||||
output. I hope to have something useful on December if my time allows.
|
||||
|
||||
- I've also spent some time playing with:
|
||||
- **My Raspberries**: Playing with different OSs, booting from USB, setting up Home Assistant properly, ...
|
||||
- **Firewalla**: Setting up my network devices, assigning IPs and understanding it's inner workflows a bit. I've
|
||||
also setup Pi-Hole inside it as main DNS server replacing the one they use.
|
||||
- **Alpine Linux**: On the Pis and containers to understand the difference with other OSs.
|
||||
- **Arch Linux**: I'm currently starting from scratch my Dell XPS 13 using Arch Linux base, and while it's more work
|
||||
than a _Next, next, next, finish_ install I'm enjoying it quite a lot since the result you get is a minimal install.
|
||||
|
||||
|
||||
- I'm working on blog posts for the Arch Linux installation, Alpine on Raspberry and self-hosting my smart devices
|
||||
using Home Assistant so the blog have more content than the monthly updates. Another mini-posts for the tools I
|
||||
self-host myself will
|
||||
|
||||
- Infra side it seems that my docker services via an VPS as door from the internet through an SDN to my home server
|
||||
keep achieving 100% uptime from some months now, only going down if I test something on a dev service.
|
||||
|
||||
Problem is that even if it _works_, the containerized setup with two load balancers, SDN and so on seems both
|
||||
complex from my use case and useful if something goes wrong.
|
||||
|
||||
I'm considering either moving to a simpler approach (non-containerized) or go all-in containerd and use something
|
||||
like [k3s](https://k3s.io) to orchestrate the server at home. I would have an excuse to add some Pis and clusterize
|
||||
everything properly.
|
||||
|
||||
I still don't know the path I'm going to take with this.
|
||||
|
||||
## Books
|
||||
|
||||
- [**The Magicians' Guild**](https://www.goodreads.com/book/show/28249.The_Magicians_Guild) (_Trudi Canavan_)
|
||||
|
||||
Ongoing. I try to read a chapter a day if time or focus allows. I'm actually enjoying the story so far, even if
|
||||
reading anything magic related after Mistborn seems dull.
|
||||
|
||||
## TVShows and Movies
|
||||
|
||||
- [**Star wars: Rebels**](https://www.disneyplus.com/series/star-wars-rebels/64MCZgAzY0Zw)
|
||||
- [**Rogue One: A star-wars Story**](https://www.disneyplus.com/movies/rogue-one-a-star-wars-story/14CV6eSbygOA)
|
||||
- [**Star Wars: A new hope**](https://www.disneyplus.com/movies/star-wars-a-new-hope-episode-iv/12fVeZxD2fWJ)
|
||||
- [**Star Wars: The empire strikes back**](https://www.disneyplus.com/movies/star-wars-the-empire-strikes-back-episode-v/iqtDTZAewwYl)
|
||||
|
||||
Star Wars Marathon continues!
|
||||
|
||||
- [**Bones**](https://www.primevideo.com/detail/0HBVL22LMA40B0XBY30RUOC9EH/)
|
||||
|
||||
Slowly and steady our _joker_ when we don't know what to put on TV over meals.
|
||||
|
||||
- [**Mandalorian**](https://www.disneyplus.com/series/the-mandalorian/3jLIGMDYINqD)
|
||||
|
||||
It's back! This is why I look forward to Fridays now.
|
||||
|
||||
- [**The Blacklist**](https://www.netflix.com/title/70281312)
|
||||
|
||||
I discovered this randomly because the trailer poped up on my Netflix feed. The premise seemed interesting
|
||||
and James Spader is such a great actor... Not sure how I managed to convince the Player 2 to watch this but
|
||||
it seems she's enjoying it too. Kinda different from what we usually watch together, but welcome nevertheless.
|
||||
|
||||
## Games
|
||||
|
||||
- [**Forager**](https://store.steampowered.com/app/751780/Forager/)
|
||||
|
||||
I completed all the achievements a while ago, but the author decided to add more... so I just fire this up
|
||||
from time to time to try and maintain Forager on my Steam Perfect Games list.
|
||||
|
||||
- [**Minecraft**](https://minecraft.net)
|
||||
|
||||
Oh my, this again? It seems so. Some friends wanted to get on the _blocky_ train again. I have been out of
|
||||
Minecraft for a good while (years!) and it seems interesting to come back after all this time. There are
|
||||
some new things to explore and since I didn't really "finish" the game back in the day... let's see how
|
||||
this goes.
|
||||
|
||||
Spoiler alert: We spent more time constructing stuff rather than _progressing_ through the game.
|
||||
|
||||
- [**Pyramida**](https://store.steampowered.com/app/1390010/pyramida/)
|
||||
|
||||
From Sokpop, the creators of Simmiland. A simple village builder game that seems minimalistic and fun in
|
||||
the same way their other games are. I don't play this often since a play session can last a while (as it happened
|
||||
with Simmiland) but let's see if I manage to get every achievement.
|
||||
|
||||
- [**The legend of Zelda: Age of Calamity**](https://www.nintendo.es/Juegos/Nintendo-Switch/Hyrule-Warriors-La-era-del-cataclismo-1838129.html)
|
||||
|
||||
The Nintendo game for this month, already going strong on my Switch. I wasn't really sure if I would enjoy a
|
||||
_musou_ game even if it was Nintendo related, but so far is looking really good. I didn't though that cutting
|
||||
through hordes of bokoblins would be so satisfactory and fun! I'm still not sure if the lore is "_canon_" or if
|
||||
it truly precedes Breath of the Wild as <span class="spoiler">it seems to happen on a parallel timeline created
|
||||
by a time traveler</span>, but I'm eager to know how it ends, even if the finale is the same as the sequel.
|
||||
|
||||
- [**Magic: The gathering (physical)**](https://magic.wizards.com/en)
|
||||
|
||||
This refers to the physical version of the game. We bought a starter kit and play against each other from
|
||||
time to time. It's new for both of us so this is an interesting learning curve to share.
|
||||
|
||||
## [Articles](https://t.me/fmartingr_articles)
|
||||
|
||||
- [What is this Gemini thing anyway, and why am I excited about it?](https://drewdevault.com/2020/11/01/What-is-Gemini-anyway.html)
|
||||
- [Raspberry Pi 400: Teardown and Review](https://www.jeffgeerling.com/blog/2020/raspberry-pi-400-teardown-and-review)
|
||||
- [(podcast) Self-Hosted Show](https://podcasts.google.com/?feed=aHR0cHM6Ly9zZWxmaG9zdGVkLnNob3cvcnNz)
|
||||
- [Why Arcades Are Still Thriving In Japan](https://www.youtube.com/watch?v=LWyAtbOhW2w)
|
||||
- [Your computer isn't yours](https://sneak.berlin/20201112/your-computer-isnt-yours/)
|
||||
- [Does Apple really log every app you run? A technical look – Jacopo Jannone - blog](https://blog.jacopo.io/en/post/apple-ocsp/)
|
||||
- [Response from Apple](https://social.wildeboer.net/@jwildeboer/105219402213708346)
|
||||
- [We can do better than DuckDuckGo](https://drewdevault.com/2020/11/17/Better-than-DuckDuckGo.html)
|
||||
- [No, "Open Source" does not mean "Includes Free Support"](https://raccoon.onyxbits.de/blog/bugreport-free-support/)
|
||||
- [random(7)](https://man7.org/linux/man-pages/man7/random.7.html)
|
||||
- [GETRANDOM syscall](https://security.stackexchange.com/questions/162507/getrandom-syscalls-relation-to-kernel-entropy-pool-state/175771#175771)
|
||||
- [Even faster bash startup](https://work.lisk.in/2020/11/20/even-faster-bash-startup.html)
|
||||
- (Spanish) [La Revolución Mandaloriana que va a cambiar el cine](https://youtu.be/FOxUAMuBtMM)
|
||||
- [Booting from a vinyl record](http://boginjr.com/it/sw/dev/vinyl-boot/)
|
||||
- [When too much concurrency slows you down (golang)](https://medium.com/@_orcaman/when-too-much-concurrency-slows-you-down-golang-9c144ca305a)
|
||||
- [TIL: eBPF is awesome](https://filipnikolovski.com/posts/ebpf/)
|
||||
- [SQLite as a document database](https://dgl.cx/2020/06/sqlite-json-support)
|
||||
- [Blogging vs. blog setups](https://rakhim.org/honestly-undefined/19/)
|
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 34 KiB |
|
@ -0,0 +1,311 @@
|
|||
+++
|
||||
title = "Self-hosting my home with Home Assistant (part 1)"
|
||||
date = 2020-12-20
|
||||
+++
|
||||
|
||||
Even if I've been a Home Assistant's user for quite some time I have never dedicated myself to have a truly stable and dedicated service at home. I always treated it more like a pet project than anything else, but this is changing now.
|
||||
|
||||
I have a fair amount of _Smart Devices_ around the house and just as you come to expect they come from different companies, protocols and sizes. Each day it passes I'm more and more concerned about my privacy and the value of the hardware I do not truly own.
|
||||
|
||||
With this in mind I have started **the journey of self-hosting!** Which to put it simply is... every device that is in my home (with a few exceptions that you'll see later) will be controlled by this Home Assistance instance.
|
||||
|
||||
<!--more-->
|
||||
|
||||
> Note: I wanted to install this on a USB Drive, but apparently that's still not supported for _Home Assistant OS_, so I'm stuck with an SD Card for now. Some time after starting working on this I heard about [`datactl`](https://www.home-assistant.io/blog/2020/12/13/home-assistant-os-release-5/#external-data-disk) but I will setup that sometime later.
|
||||
|
||||
## Base Home Assistant OS using an SD Card
|
||||
|
||||
For this just stick to the [official documentation](https://www.home-assistant.io/hassio/installation/). Only download the latest release [from github](https://github.com/home-assistant/operating-system/releases) and copy the _img_ card to your SD Card with `dd`, Balena or the tool of choice.
|
||||
|
||||
Put the SD Card on your Pi, turn it on and let's get started.
|
||||
|
||||
## Base installation
|
||||
|
||||
After booting, you will be welcome with a wizard installation. Just follow the basic instructions to generate the main user/account, and the name and location for your home assistant.
|
||||
|
||||
Bonus: Use some website [like this](https://www.freemaptools.com/elevation-finder.htm) to get your elevation if you're feeling picky.
|
||||
|
||||
After that, you will be greeted by something similar to this:
|
||||
|
||||
[](base.png)
|
||||
|
||||
## Update the system
|
||||
|
||||
Go to your Supervisor tab and check if you have any pending updates.
|
||||
|
||||
## Moving to MariaDB
|
||||
|
||||
The default database backend is SQLite, and that has it's limitations, so let's move everything to MariaDB before any other configuration.
|
||||
|
||||
1. Install the File editor addon from **Supervisor > Add-ons > File editor** and start it.
|
||||
2. Install the MySQL addon from **Supervisor > Add-ons > MariaDB**
|
||||
3. Once installed, go to the configuration tab and set a password
|
||||
4. Under the Info tab start the MariaDB Service and enable the Watchdog service
|
||||
5. Go to the file editor interface and edit the `configuration.yaml` file.
|
||||
6. Add the configuration for the [`recorder`](https://www.home-assistant.io/integrations/recorder/) integration:
|
||||
```yaml
|
||||
recorder:
|
||||
db_url: mysql://homeassistant:<password>@core-mariadb/homeassistant?charset=utf8
|
||||
commit_interval: 5
|
||||
purge_keep_days: 90
|
||||
|
||||
history:
|
||||
```
|
||||
|
||||
In this case I also set data to be stored for 90 days and a 5s delay between disk writes (since I'm using an SD Card and their lifespan is not very long with abundant I/O).
|
||||
|
||||
More information on the documentation: [`recorder`](https://www.home-assistant.io/integrations/recorder/), [`history`](https://www.home-assistant.io/integrations/history/)
|
||||
7. Restart Home Assistant for the changes to take effect under **Configuration > Server Constrols > Restart**.
|
||||
|
||||
## Backups
|
||||
|
||||
Now another if not the most important of them all, automatic snapshots in case something goes wrong.
|
||||
|
||||
Go to **Configuration > Automations > Add automation**, and in top-right hamburger menu press **Edit as YAML**.
|
||||
|
||||
This configuration will perform a Weekly Snapshot every Monday at 3.00 AM. It is a sensible default once Home Assistant is running, but if you're going to play with it you may need to consider more frequent backups.
|
||||
|
||||
``` yaml
|
||||
alias: Weekly Snapshot
|
||||
description: 'Performs a weekly snapshot'
|
||||
mode: single
|
||||
trigger:
|
||||
- platform: time
|
||||
at: '03:00'
|
||||
condition:
|
||||
- condition: time
|
||||
weekday:
|
||||
- mon
|
||||
action:
|
||||
- service: hassio.snapshot_full
|
||||
data:
|
||||
name: 'weekly_{{ now().strftime(''%Y-%m-%d'') }}'
|
||||
```
|
||||
|
||||
Keep in mind that this snapshots are stored on the `/backup` folder on the Home Assistant instance, you need to create a way of moving that **out** of the system. You can use other automation, SCP from another machine or any compatible tool of your choice.
|
||||
|
||||
## Setting up accounts and users that will use the system
|
||||
|
||||
This used to be more complex a while ago, now you only need to go to **Configuration > People** and add the users you need.
|
||||
|
||||
Now you can even add the avatar directly from the interface! Back in the day you required to upload the file and fiddling with YAMLs.
|
||||
|
||||
Also, for some options and add-ons to display, you need to enable "Advanced mode" on your user profile page.
|
||||
|
||||

|
||||
|
||||
## SSH Access
|
||||
|
||||
Easily handled by an integration, as almost everything with Home Assistant.
|
||||
|
||||
> For this add-on to show up you need to enable Advanced mode as shown in the previous step.
|
||||
|
||||
Just install the **Terminal and SSH** addon, add your ssh key under the configuration tab under the `authorized_keys` property, and expose a port for the SSH server on the host. After that Start the service and enable the Watchdog to monitor it in case it fails.
|
||||
|
||||
## Enable SSL
|
||||
|
||||
Even if my home assistant installation is going to be LAN only (using a VPN to have external access) I always setup SSL in all my services and while there are some options when setting this up with Home Assistant, I went the nginx way since that's what I'm more comfortable with.
|
||||
|
||||
Go to **Supervisor > Add-on Store** and install the **NGINX Home Assistant SSL proxy**.
|
||||
|
||||
Put your files under `/ssl` connecting to the instance via SSH or using any file editor addon on the store.
|
||||
|
||||
Under its **Configuration** tab, set up the domain and path to the certificate and key files.
|
||||
|
||||
``` yaml
|
||||
domain: homeassistant.local
|
||||
certfile: nginx/homeassistant.local/homeassistant.crt # Relative to /ssl
|
||||
keyfile: nginx/homeassistant.local/homeassistant.key # Relative to /ssl
|
||||
```
|
||||
|
||||
There are a number of guides out there to generate self-signed certificates. I have my own Certificate Authority that use to sign certificates for my local services, that way I can just trust my own CA and every dependant certificate will work out of the box.
|
||||
|
||||
As a note, for this to work with the companion apps on iOS you need to generate the certificates with [pretty specific requisites](https://support.apple.com/en-us/HT210176). Android worked as a charm.
|
||||
|
||||
## Getting the Home Assistant Companion
|
||||
|
||||
Download the application from your phone's store and after logging in you can setup the sensors to be sent to Home Assistant, this will be linked to your account so you could perform automation with them on the server.
|
||||
|
||||
Apart from using the app to control your home devices, the sensors will be useful to generate automation in the future.
|
||||
|
||||
Another useful thing to setup here is the local (LAN) address to use when the phone is connected to Wifi at home, using an external hostname when connecting via VPN/RemoteControl.
|
||||
|
||||
## The first automation: tell me about updates
|
||||
|
||||
I use an script to send notifications to all devices (persons) on the house, with the `title` and `message` parameter:
|
||||
|
||||
``` yaml
|
||||
alias: Send Notifications
|
||||
sequence:
|
||||
- service: notify.mobile_app_oneplus6
|
||||
data:
|
||||
title: '{{ title }}'
|
||||
message: '{{ message }}'
|
||||
# Insert more notifcations into sequence
|
||||
mode: single
|
||||
variables:
|
||||
title: null
|
||||
message: null
|
||||
```
|
||||
|
||||
And this automation will check when there are any updates and send a notification using the previous script with the version number that just came in:
|
||||
|
||||
``` yaml
|
||||
alias: Update notification
|
||||
description: "Notify everyone when there's an update available"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.updater
|
||||
from: 'off'
|
||||
to: 'on'
|
||||
condition: []
|
||||
action:
|
||||
- service: script.send_notifications
|
||||
data:
|
||||
title: New Home Assistant Release
|
||||
message: >-
|
||||
Home Assistant {{ state_attr('binary_sensor.updater', 'newest_version')
|
||||
}} is now available.
|
||||
mode: single
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Add system sensors
|
||||
|
||||
I want to control how the Raspberry is doing, so I'm going to enable some system sensors using the [`systemmonitor`](https://www.home-assistant.io/integrations/systemmonitor) sensor.
|
||||
|
||||
Edit the `configuration.yaml` file and add the following:
|
||||
|
||||
``` yaml
|
||||
sensor:
|
||||
- platform: systemmonitor
|
||||
resources:
|
||||
- type: disk_use_percent
|
||||
- type: memory_use_percent
|
||||
- type: swap_use_percent
|
||||
- type: load_1m
|
||||
- type: load_5m
|
||||
- type: load_15m
|
||||
- type: processor_use
|
||||
- type: processor_temperature
|
||||
- type: last_boot
|
||||
- type: throughput_network_in
|
||||
arg: eth0
|
||||
- type: throughput_network_out
|
||||
arg: eth0
|
||||
```
|
||||
|
||||
This requires a Home Assistant restart for the changes to take effect.
|
||||
|
||||
I also added a custom lovelace dashboard to monitor everything easily, here is the YAML configuration:
|
||||
|
||||
``` yaml
|
||||
views:
|
||||
- title: Overview
|
||||
path: overview
|
||||
icon: 'mdi:eye'
|
||||
visible:
|
||||
- user: be3b6f5bc71c49ff9be6830d545cb4e0
|
||||
badges: []
|
||||
cards:
|
||||
- type: grid
|
||||
cards:
|
||||
- type: gauge
|
||||
entity: sensor.processor_use_percent
|
||||
min: 0
|
||||
max: 100
|
||||
name: Processor
|
||||
severity:
|
||||
green: 50
|
||||
yellow: 75
|
||||
red: 80
|
||||
- type: gauge
|
||||
entity: sensor.memory_use_percent
|
||||
min: 0
|
||||
max: 100
|
||||
severity:
|
||||
green: 50
|
||||
yellow: 65
|
||||
red: 75
|
||||
name: Memory
|
||||
- type: gauge
|
||||
entity: sensor.disk_use_percent
|
||||
min: 0
|
||||
max: 100
|
||||
name: Disk usage
|
||||
severity:
|
||||
green: 50
|
||||
yellow: 60
|
||||
red: 75
|
||||
- type: gauge
|
||||
entity: sensor.processor_temperature
|
||||
min: 0
|
||||
severity:
|
||||
green: 45
|
||||
yellow: 50
|
||||
red: 55
|
||||
max: 70
|
||||
name: Temperature
|
||||
- type: gauge
|
||||
entity: sensor.load_5m
|
||||
min: 0
|
||||
max: 4
|
||||
severity:
|
||||
green: 1
|
||||
yellow: 2
|
||||
red: 3
|
||||
title: System
|
||||
```
|
||||
|
||||
And here's a preview:
|
||||
|
||||

|
||||
|
||||
## Adding integrations
|
||||
|
||||
At this point if you already have devices on your network your Home Assistant will send you a notification like this:
|
||||
|
||||
[](notification.png)
|
||||
|
||||
So I'm going to setup the base integrations with the server to start controlling some devices.
|
||||
|
||||
### Chromecast
|
||||
|
||||
> But you said self-hosted! Yeah, yeah... And I want to, but there's no real alternative to the Cast protocol to self host, the speakers with Chromecast devices are just so convenient...
|
||||
|
||||
One of the simplest things to set up, just go to your integrations and add it. It will prompt you to select in which rooms each Chromecast device is and that's it.
|
||||
|
||||
[](chromecast.png)
|
||||
|
||||
### Weather (OpenWeatherMap)
|
||||
|
||||
I'm going to use the [`OpenWeatherMap`](https://www.home-assistant.io/integrations/openweathermap/) integration because it provides more sensors than the one setup by default.
|
||||
|
||||
You just need to [register to the service](https://openweathermap.org/) and enable the integration under **Configuration > Integrations > OpenWeatherMap**, supply your API key and set the mode to __onecall_hourly__ which will download 3h forecasts each hour, enough for the free tier.
|
||||
|
||||
> I had to wait for an hour or so until the API Key was valid for the integration to use, it keep saying **Invalid API Key** until I received a confirmation email for my account.
|
||||
|
||||
### Phillips Hue
|
||||
|
||||
Linking the Phillips Hue is super easy, you only need to add the Hue integration, select the bridge IP from the dropdown (or input one manually) and press the button on the bridge to confirm.
|
||||
|
||||
After selecting in which area the bridge and bulbs are in, you're good to go.
|
||||
|
||||
> **BONUS:** Since the comunication is done via LAN with the bridge, the bridge itself doesn't need internet access to work (as I have mine blocked in my firewall). Also in my case this is only temporal since I will move every Zigbee device to a cluster controlled by Home Assistant.
|
||||
|
||||
### Tuya (Smart Things)
|
||||
|
||||
This is one of the dependencies I have that I'm most eager to get rid off, but for now there are some smart plugs at home that I need to control.
|
||||
|
||||
Going to **Configuration > Integrations > Add** the **Tuya** is on the list; you need to enter your username, password and country code for the integration to communicate with the Tuya API, so your devices will require internet connection.
|
||||
|
||||
The plan is to try and flash the plugs with Tasmota to free them from the _cloud_ and any new ones I'm getting will be Zigbee compatbile with the hopes on having only Zigbee smart plugs at home.
|
||||
|
||||
## Closing
|
||||
|
||||
That was easy!
|
||||
|
||||
The folks at Home Assistant have been working on this so good that almost everything can be done from the interface now. I see any _normal_ user working with this mostly plug and play from the UI which is amazing in my opinion.
|
||||
|
||||
In future post I will dive into my Zigbee configuration, InfluxDB, ESPHome, Alarms ... there's so much to do!
|
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 30 KiB |