Introduction
If you have a dedicated server that you want to set up Home Assistant on and would like to run it natively (not in a container), then this is the tutorial for you. This tutorial focuses on using CentOS 8 because I am personally familiar with RedHat based products. But those who chose to use Ubuntu, Debian, Alpine, Arch, etc should be able to benefit from a good chunk of the information explained here too.
Minimum Requirements
While Home Assistant works awesome on a Raspberry Pi for simple things, it can start to get sluggish and feel under-powered over time as you get addicted like the rest of us and continue to add automations to it. It specifically takes a hard it once you start adding automations that involve video and get fancy with others.
Thus, if you’re a hobbyist who plans on continuing to evolve your homes automation over time, a Raspberry Pi is not good enough. A small PC (and this tutorial of course π ) is the best way to go.
I am personally using a very old (outdated) model of an Intel Nuc that works great. But even if you just have an old PC lying around in the corner, that would be a fantastic choice too! Despite the official requirements identified here, for the most optimal experience (in my opinion), your Home Assistant PC should have:
Type | My Suggested Minimum Requirement |
---|---|
RAM | 8GB |
CPU | >= Intel i5 |
Network | >=100Mbit/s It’s strongly recommended that the server you choose to set up Home Assistant utilize a physical network cable and not WiFi. |
Storage | >=32GB Storage is only really important if you plan on installing home surveillance (specifically video cameras). If you do, then target your storage to be at least 512GB or more instead. This will allow you to record with them and save the content locally (should you choose to do this). |
Here is the breakdown of where the storage all goes (with respect to this tutorial):
Path | Size | Details |
---|---|---|
/etc/homeassistant/ | 1GB | Your configuration files are small (less then 256KB), however Home Assistant maintains what is called a Recorder which tracks itself in an SQLite database. This SQLite database tends to grow over time in size (which you can control). This is also the location of your homeassistant.log file which can also grow in size as well. By giving yourself (at least) 1GB here, you just provide enough room for future growth that will never interrupt your setup over time. More on the contents of this directory is discussed near the end of this blog. |
/opt/homeassistant/ | 2GB | The entire installation of Home Assistant will sit here once you’ve completed this tutorial. The actual installation (with most bells and whistles) is just under 1GB. 2GB is just a suggested size because it will leave you with plenty of room for future growth. |
/ | 6GB | Your root filesystem and all the core directories that go with it such as /boot, /tmp, /home, /usr, /var, … etc. 6GB is more than enough to host the Linux operating system and all of it’s needs while still leaving you ample space for growth. |
/opt/homeassistant/video/ | >128GB | I’m just throwing this in here… Those who don’t have video recording cameras at their home (inside and out) can ignore this. But consider at LEAST 32GB per camera depending on how much you want to record. You may also want to plan for an expansion down the road too; I said >=512GB earlier and I meant it. Storage is cheap these days, so plan properly at the start. |
Download the latest copy of CentOS 8 and stick it on a spare USB Drive you have and/or burn it to a DVD so that you can install it onto your PC.
The Base Home Assistant Setup
It is assumed at this point that you’ve set up your server or already had one running. Let’s set up a working environment that Home Assistant can work in. It’s important to have root or sudo privileges prior to running the commands below in each section.
General Server Preparation
The safest way to run Home Assistant is with it’s own dedicated user and permissions. The following will set up a working environment for us to build further onto:
# Again.. our basic layout will be: # User: homeassistant # HA Config: /etc/homeassistant # HA Core: /opt/homeassistant # Prepare our user: sudo useradd -rm homeassistant \ --home-dir /opt/homeassistant # The dialout group allows us to access our external USB # devices such as the Aeotec Z-Stick Series 5 (which is # what I use). We want to add our user to this group: sudo usermod -aG dialout homeassistant # Prepare our configuration directory sudo mkdir /etc/homeassistant # Adjust our permissions sudo chown -R homeassistant:homeassistant \ /opt/homeassistant /etc/homeassistant # Some of the packages later installed with pip3 # require that they are compiled in your environment # (or it will not work) so the following is also # required: sudo dnf install -y gcc make gcc-c++ systemd-devel \ unzip tar
Python 3.8 Setup
We need to setup Python 3.8 into our CentOS environment because it is the minimum requirement for Home Assistant to work. So basically we have 2 options here: Take the most stable version of v3.8, or take the one manged by CentOS which is sometimes outdated. Either way, I’ve explained both below:
- Option 1: The CentOS Maintained Version:
# Simply install the module sudo dnf module -y install python38 python38-devel # That's it... you're done :)
- Option 2: The Latest Stable Version:
sudo dnf install -y bzip2-devel expat-devel gdbm-devel \ libuuid-devel libffi-devel\ ncurses-devel openssl-devel readline-devel \ sqlite-devel tk-devel xz-devel zlib-devel wget \ gcc make gcc-c++ tar # At the time this blog was written, the current # version was v3.8.5: VERSION=3.8.5 # # Acquire # wget https://www.python.org/ftp/python/${VERSION}/Python-${VERSION}.tgz tar -xf Python-${VERSION}.tgz # # Configure # cd Python-${VERSION} ./configure --enable-optimizations # # Build # # This step can take a while - so be patient! make -j 4 # # Install # # This is very safe and will not over-write # existing Python that ships with CentOS sudo make altinstall
Regardless of which route you chose to take, you can test the version out to see if you were successful:
# Test the version out: python3.8 -V
Surveillance Video Camera Setup
Run the following commands if you have or plan on having surveillance cameras installed into your environment. Feel free to run this at a later time if you want. Basically you need a copy of ffmpeg available if you plan on accessing your camera stream in Home Assistant.
sudo dnf install -y epel-release dnf-utils yum-config-manager --set-enabled PowerTools sudo yum-config-manager \ --add-repo=https://negativo17.org/repos/epel-multimedia.repo sudo dnf install -y ffmpeg
Home Assistant Installation
Assuming you’ve followed the sections Python 3.8 Setup and General Server Preparation above, we can now install Home Assistant:
# First we switch to our new homeassistant user we created: sudo -u homeassistant -H -s # Optional SSH Keygen Setup [ ! -f ~/.ssh/id_rsa.pub ] && \ ssh-keygen -f ~/.ssh/id_rsa -C "Home Assistant" -q -N "" # Change to our home directory (if we're not there already) cd /opt/homeassistant # Prepare our virtual environment python3.8 -m venv . # It's always VERY important you activate your # environment before you start running pip3 # commands . ./bin/activate # Perform our installation: pip3 install homeassistant home-assistant-frontend \ homeassistant-pyozw colorlog flask-sqlalchemy # Return back to our root user exit
Finally we must create an System D Startup file to make it easy to start/stop our instance of Home Assistant:
# the following will drop us in a startup script we can use with our environment sudo bash <<EOF cat << _EOF > /usr/lib/systemd/system/home-assistant.service [Unit] Description=Home Assistant After=network-online.target [Service] Type=simple User=homeassistant ExecStart=/opt/homeassistant/bin/hass -c "/etc/homeassistant" WorkingDirectory=/opt/homeassistant PrivateTmp=true Restart=on-failure [Install] WantedBy=multi-user.target _EOF EOF # Pick up our new configuration sudo systemctl daemon-reload # Make it so Home Assistant starts even after a # server reboot sudo systemctl enable home-assistant # Let's start it up now sudo systemctl start home-assistant
The final piece of the puzzle is to expose port 8123 to our network so that we can access our instance of Home Assistant:
sudo bash <<EOF cat << _EOF > /usr/lib/firewalld/services/home-assistant.xml <?xml version="1.0" encoding="utf-8"?> <service> <short>Home Assistant</short> <description>Home Assistant Web Portal</description> <port protocol="tcp" port="8123"/> </service> _EOF EOF # Reload our firewall so it can find our recently # created configuration file (defined above) sudo firewall-cmd --reload # Now we'll add our new firewall service sudo firewall-cmd --zone=public \ --add-service=home-assistant --permanent # once again reload our firewall to open our newly # declared port: sudo firewall-cmd --reload
Finalizing Your Installation
You can now visit your new Home Assistant server at http://ip.to.your.server:8123 and start setting up your account for the first time.
When you first access the page you will be able to create the first system user (also the administrator account) that you can build automations with.
Home Assistant Upgrades
You’ll find that Home Assistant is rapidly expanding and always fixing issues and adding more cool features you can play with. Upgrading Home Assistant is as easy as this:
# Switch to our home assistant user: sudo -u homeassistant -H -s # Change to our home directory (if we're not there already) cd /opt/homeassistant # It's always VERY important you activate your # environment before you start running pip3 # commands . ./bin/activate # Switch to our homeassistant user pip3 install --upgrade homeassistant # Return to our user with sudoer's permission exit # Restart Home Assistant sudo systemctl restart home-assistant
A Quick Overview
At this point you should be all set up with a running copy of Home Assistant to play with. Here are some general files and directories that will begin appearing in your server’s filesystem in the /etc/homeassistant/ directory that you may want to know about:
homeassistant.log
All of the logs associated with Home Assistant will show up here. This is a fantastic location to begin your troubleshooting should you run into problems.
configuration.yaml
This is the core configuration that will drive your entire Home Assistant application from this point forward. Any changes to this file will require you to restart Home Assistant for the changes to take effect.
home-assistant_v2.db
This is the Home Assistant Recorder. From within your Home Assistant Dashboard, you can click on History button off of the dashboard to see the contents.
secrets.yaml
This is a simple file that allows you to map key/value pairs. The idea is to keep all of your passwords and/or tokens that you otherwise want to keep from prying eyes. This file should be given very strict permissions:
# protect this file if you intend to use it chmod 600 /etc/homeassistant/secrets.yaml
For example, you might use Apprise to send you an email notification. In order to send an email Apprise needs your personal email information. As an example, in your configuration.yaml file you might do this:
# /etc/homeassistant/configuration.yaml # ... notify: name: apprise platform: apprise url: !secret apprise_url
Then in your secrets.yaml file you now need an entry for a new keyword you created called apprise_url. Your entry in the secrets.yaml file might look like this:
# /etc/homeassistant/secrets.yaml # Define your Apprise details in a secure location: apprise_url: mailto://myuser:mypassword@gmail.com
More details on how secrets work can be found here in the Home Assistant documentation. Also, check out the Apprise wiki to see all of the different services you can notify with it.
automations.yaml
This is where you can begin constructing your own Home Assistant automations once you’ve added a few integrations into Home Assistant.
An example of an automation you might have set up could send us an email using Apprise at sunset:
# /etc/homeassistant/automations.yaml # # Utilize Apprise to send a notification # alias: "[Interactive] - Sunset Apprise Notice" trigger: platform: sun event: sunset action: service: notify.apprise data: title: "Good evening" message: "This sun is setting."
Configuration Backup
No setup is complete without regular backups taking place. The following is just a basic configuration backup setup you can use to get you started:
# For Backups (run these commands as the homeassistant user): sudo mkdir -p /opt/homeassistant/backups sudo chown homeassistant.homeassistant /opt/homeassistant/backups # This is a simple script to get you started: sudo bash <<EOF cat << _EOF > /opt/homeassistant/bin/backup.sh #!/bin/sh # Create a backup of Home Assistant TARGET=/opt/homeassistant/backups SOURCE=/etc/homeassistant [ ! -d "\$TARGET" ] && /usr/bin/mkdir -p "\$TARGET" [ ! -d "\$TARGET" ] && exit 1 tar cfz "\$TARGET/\$(date +'%Y.%m.%d')-config.tgz" -C \$SOURCE . RET=\$? # Tidy; Keep X days worth find -L \$TARGET/ -mindepth 1 -maxdepth 1 -name "*.config.tgz" -mtime +120 -delete exit \$RET _EOF EOF # Permissions to be executable sudo chmod 775 /opt/homeassistant/bin/backup.sh # Prepare ourselves a cron job that will run our backup every week sudo bash <<EOF cat << _EOF > /etc/cron.d/homeassistant_backup 0 0 * * 0 homeassistant /opt/homeassistant/bin/backup.sh &>/dev/null _EOF EOF
Credit
This blog took me a very (,very) long time to put together and test! If you like what you see and wish to copy and paste this HOWTO, please reference back to this blog post at the very least. Itβs really all I ask. Alternatively, I certainly won’t turn down a coffee if you wish to buy me one! π
Sources
- Setup Open Z-Wave (the new way of doing things) for Home Assistant: Open Z-Wave’s integration is still in beta (at the time this blog was written), but it has been stated that this is the way forward for Home Assistant/Z-Wave users.
- Set up Notifications with Home Assistant
- Official Home Assistant Webpage
- Official Home Assistant Hardware Requirements
- Home Assistant Automation Documentation
- The Home Assistant Official Community Forum: this is probably the best place to get an answer to any question you have about your setup and/or things you can do (including how to do it).