# Project: Home Assistant
## Preparing the host
<s>I'll be using a [Raspberry Pi Zero W](https://www.raspberrypi.org/products/raspberry-pi-zero-w/).
To get started, I followed the standard headless-ssh procedure:
### Headless ssh
1. Download the [Raspberry OS image](https://www.raspberrypi.org/software/operating-systems/)
2. Flash using for example [Rufus](https://rufus.ie/) or [balenaEtcher](https://www.balena.io/etcher/)
3. Add a `ssh` file to the boot partition to enable ssh on boot (as per [raspberrypi.org](https://www.raspberrypi.org/documentation/remote-access/ssh/))
4. Idem for `wpa_supplicant.conf` ([docs](https://www.raspberrypi.org/documentation/configuration/wireless/headless.md))
</s>
I wasn't able to get Home Assistant working on the Zero W (ARMv6) and so I switched to a [MinnowBoard Turbot B](https://store.netgate.com/Turbot4.aspx).

### Installing debian
I installed debian using the netinstaller from https://www.debian.org/CD/netinst/
After installation I updated and upgraded the system and installed the openssh-server:
```
sudo apt update
sudo apt upgrade
sudo apt install openssh-server
```
Afterwards I added my public key and disable password authentication.
## Docker
To install docker I ran:
```
sudo apt install \
apt-transport-https \
ca-certificates \
curl gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
# Check fingerprint:
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
```
## Home Assistant
To install Home Assistant I created a simple docker-compose file as per https://www.home-assistant.io/docs/installation/docker/:
```yaml=
version: '3'
services:
homeassistant:
container_name: home-assistant
image: homeassistant/amd64-homeassistant:stable
volumes:
- /home/skippy/hass/config:/config
environment:
- TZ=Europe/Brussels
restart: always
network_mode: host
```
To run this on system startup I used a systemd unit:
```
[Unit]
Description=Home Assistant
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=10s
Restart=no
WorkingDirectory=/home/skippy/hass
ExecStart=/usr/local/bin/docker-compose
[Install]
WantedBy=multi-user.target
```
On first startup I created a user and I was greated by an empty dashboard:

## MQTT
As the central message broker I chose [Mosquitto](https://mosquitto.org/).
To install it, I simply ran:
```
apt install mosquitto
```
And to create the user database and add the relevant users:
```
mosquitto_passwd -c /etc/mosquitto/passwd hass
mosquitto_passwd /etc/mosquitto/passwd esp_relays
mosquitto_passwd /etc/mosquitto/passwd esp_photoresistor
```
After registering the MQTT broker with all devices (see below), the topics in a client look something like this:

## Adding some integrations
To add integrations (services Home Assistant can talk to), go to `Configuration > Integrations`:

## ESPHome
Similar to [Tasmota](https://tasmota.github.io/docs/), [ESPHome](https://esphome.io/) is a mini operating system-like firmware for the family of [Arduino](https://www.arduino.cc/), WiFi enabled devices, like the ESP8266 and ESP32. ESPHome uses a python script to craft a custom firmware bin for each of your devices, starting from a yaml config file. Tasmota on the other hand is more of an all-in-one solution. I used ESPHome for this project and created two config files:
`relays.yaml` for an all-in-one relay board:
```yaml=
esphome:
name: relays
platform: ESP32
board: nodemcu-32s
wifi:
ssid: "<SSID>"
password: "<PASS>"
ap:
ssid: "Desk Fallback Hotspot"
password: "<PASS>"
captive_portal:
# Enable logging
logger:
mqtt:
broker: 192.168.1.70
username: esp_relays
password: <PASS>
ota:
password: "<PASS>"
switch:
- platform: gpio
name: "Relay 1"
pin: 33
- platform: gpio
name: "Relay 2"
pin: 25
- platform: gpio
name: "Relay 3"
pin: 26
- platform: gpio
name: "Relay 4"
pin: 27
```

And `photoresistor.yaml` for an ESP8266 dev board with a photoresistor circuit:
```yaml=
esphome:
name: dimmer
platform: ESP8266
board: thingdev
wifi:
ssid: "<SSID>"
password: "<PASS>"
ap:
ssid: "Dimmer Fallback Hotspot"
password: "<PASS>"
captive_portal:
# Enable logging
logger:
mqtt:
broker: 192.168.1.70
username: esp_photoresistor
password: <PASS>
ota:
password: "<PASS>"
i2c:
ttp229_lsf:
sensor:
- platform: resistance
sensor: source_sensor
configuration: UPSTREAM
resistor: 32kOhm
reference_voltage: 1V
name: Resistance Sensor
# Example source sensor:
- platform: adc
id: source_sensor
pin: A0
```

I then, after installing ESPHome using pip, uploaded the firmware using:
```
esphome ... .yaml run
```
## Dashboard
After adding cards for all the integrations my final [Lovelace dashboard](https://www.home-assistant.io/lovelace/) looks like this:
