SENSBLUE ATLAS/Home Assistant
Home Assistant integration
Installing Home Assistant on the SENSBLUE ATLAS / i.Cee²
Objective Install Home Assistant in a Docker container, running alongside the stack already present on the ATLAS:
- Node-RED
- Mosquitto MQTT
- Grafana
- InfluxDB
Home Assistant does not replace the native stack. It only adds an extra interface/integration layer.
Scope: base installation of Home Assistant, creation of the initial account, and MQTT configuration compatible with the current ATLAS installation.
1. Prerequisites
| Item | Value / check |
|---|---|
| Device | SENSBLUE ATLAS / i.Cee² |
| Platform | Raspberry Pi CM4 / aarch64 |
| System | Debian GNU/Linux 13 trixie |
| Access | SSH with a user account that has sudo permissions |
| Disk space | At least 1 GB free on the eMMC |
| Network | ATLAS with internet access |
| Required port | 8123 free for Home Assistant |
| MQTT | Local Mosquitto on 127.0.0.1:1883 |
Check the system:
cat /etc/os-release | grep PRETTY_NAME
uname -m
df -h /
2. Ports used on ATLAS
Before and after installation, confirm that the existing stack continues to respond.
| Service | Port |
|---|---|
| Node-RED | 1880 |
| Mosquitto MQTT | 1883 |
| Grafana | 3000 |
| InfluxDB | 8086 |
| Home Assistant | 8123 |
Check the stack's ports:
for p in 1880 1883 3000 8086; do
ss -tlnp | grep ":$p " && echo "port $p OK"
done
3. Installing Docker
Install Docker Engine and the Docker Compose plugin through Docker's official Debian repository.
Summary of the process:
- Update packages.
- Install dependencies.
- Add the Docker GPG key.
- Add the Docker repository.
- Install Docker Engine and the Docker Compose plugin.
- Test with hello-world.
Check that Docker is operational:
sudo docker run --rm hello-world
If apt-get update returns a 404 error for the Docker repository, temporarily use the bookworm line for the Docker repository and repeat the update/installation.
Example alternative line:
deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian bookworm stable
4. Create the Home Assistant project
Create the project folder:
sudo mkdir -p /opt/atlas-ha
cd /opt/atlas-ha
Create the docker-compose.yml file:
sudo tee docker-compose.yml > /dev/null << 'EOF'
services:
homeassistant:
container_name: homeassistant
image: ghcr.io/home-assistant/home-assistant:stable
network_mode: host
volumes:
- ./ha-config:/config
- /etc/localtime:/etc/localtime:ro
environment:
- TZ=Europe/Lisbon
restart: unless-stopped
EOF
Important notes:
| Option | Reason |
|---|---|
| network_mode: host | Allows direct access to the port and local Mosquitto at 127.0.0.1:1883 |
| ./ha-config:/config | Stores Home Assistant configuration in /opt/atlas-ha/ha-config |
| restart: unless-stopped | Automatically restarts Home Assistant after reboot or failure |
| TZ=Europe/Lisbon | Sets the correct time zone |
5. Start Home Assistant
From the /opt/atlas-ha folder:
sudo docker compose up -d
The first start may take a few minutes as the image is downloaded and Home Assistant initialises the configuration. Check container status:
sudo docker ps
Check HTTP response:
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8123
Expected result:
| Code | Meaning |
|---|---|
| 200 | Home Assistant accessible |
| 302 | Home Assistant accessible, with redirection |
| 000 connection refused | May be normal in the first 1-2 minutes; wait and retry |
6. Initial onboarding
Open in a browser on a PC on the same network:
http://<atlas-ip>:8123
Then:
- Create the administrator account.
- Set the location, e.g., Portugal, or skip.
- Complete until you reach the main dashboard.
From this point, Home Assistant is installed and operational.
7. Configure MQTT integration in Home Assistant
Since the container uses network_mode: host, Home Assistant can access the local Mosquitto via:
| Field | Value |
|---|---|
| Broker | 127.0.0.1 |
| Port | 1883 |
| User/password | As per Mosquitto configuration; blank if no authentication |
In Home Assistant:
Settings → Devices & services → Add integration → MQTT
Configure the broker as:
127.0.0.1:1883
After adding the MQTT integration, create the following YAML files to declare the entities used in the current installation.
8. Create configuration.yaml
Enter the Home Assistant configuration folder:
cd /opt/atlas-ha/ha-config
Create or replace the configuration.yaml file:
sudo tee configuration.yaml > /dev/null << 'EOF'
default_config:
frontend:
themes: !include_dir_merge_named themes
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
mqtt: !include mqtt.yaml
EOF
Create the included files if they do not already exist:
sudo touch automations.yaml scripts.yaml scenes.yaml
sudo mkdir -p themes
9. Create mqtt.yaml
Create the file:
cd /opt/atlas-ha/ha-config
sudo tee mqtt.yaml > /dev/null << 'EOF'
sensor:
- name: "ATLAS AI1"
unique_id: atlas_ai1
state_topic: "analogInputs/runtime/out"
value_template: "{{ value_json.task.taskResult.AI1.result | float(0) }}"
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
- name: "ATLAS AI2"
unique_id: atlas_ai2
state_topic: "analogInputs/runtime/out"
value_template: "{{ value_json.task.taskResult.AI2.result | float(0) }}"
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
- name: "ATLAS AI3"
unique_id: atlas_ai3
state_topic: "analogInputs/runtime/out"
value_template: "{{ value_json.task.taskResult.AI3.result | float(0) }}"
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
- name: "ATLAS AI4"
unique_id: atlas_ai4
state_topic: "analogInputs/runtime/out"
value_template: "{{ value_json.task.taskResult.AI4.result | float(0) }}"
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
binary_sensor:
- name: "ATLAS DI1"
unique_id: atlas_di1
state_topic: "digitalInputs/runtime/out"
value_template: >-
{% set di = value_json.task.taskResult.DI1 %}
{% if di.result is defined %}
{{ 'ON' if di.result == true else 'OFF' }}
{% else %}
{{ 'ON' if di.state == 'high' else 'OFF' }}
{% endif %}
payload_on: "ON"
payload_off: "OFF"
- name: "ATLAS DI2"
unique_id: atlas_di2
state_topic: "digitalInputs/runtime/out"
value_template: >-
{% set di = value_json.task.taskResult.DI2 %}
{% if di.result is defined %}
{{ 'ON' if di.result == true else 'OFF' }}
{% else %}
{{ 'ON' if di.state == 'high' else 'OFF' }}
{% endif %}
payload_on: "ON"
payload_off: "OFF"
- name: "ATLAS DI3"
unique_id: atlas_di3
state_topic: "digitalInputs/runtime/out"
value_template: >-
{% set di = value_json.task.taskResult.DI3 %}
{% if di.result is defined %}
{{ 'ON' if di.result == true else 'OFF' }}
{% else %}
{{ 'ON' if di.state == 'high' else 'OFF' }}
{% endif %}
payload_on: "ON"
payload_off: "OFF"
- name: "ATLAS DI4"
unique_id: atlas_di4
state_topic: "digitalInputs/runtime/out"
value_template: >-
{% set di = value_json.task.taskResult.DI4 %}
{% if di.result is defined %}
{{ 'ON' if di.result == true else 'OFF' }}
{% else %}
{{ 'ON' if di.state == 'high' else 'OFF' }}
{% endif %}
payload_on: "ON"
payload_off: "OFF"
switch:
- name: "ATLAS DO1"
unique_id: atlas_do1
command_topic: "digitalOutputs/runtime/in"
state_topic: "digitalOutputs/runtime/out"
payload_on: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO1":{"state":"high"}}}}'
payload_off: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO1":{"state":"low"}}}}'
value_template: "{{ value_json.task.taskResult.DO1.state }}"
state_on: "high"
state_off: "low"
optimistic: false
- name: "ATLAS DO2"
unique_id: atlas_do2
command_topic: "digitalOutputs/runtime/in"
state_topic: "digitalOutputs/runtime/out"
payload_on: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO2":{"state":"high"}}}}'
payload_off: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO2":{"state":"low"}}}}'
value_template: "{{ value_json.task.taskResult.DO2.state }}"
state_on: "high"
state_off: "low"
optimistic: false
- name: "ATLAS DO3"
unique_id: atlas_do3
command_topic: "digitalOutputs/runtime/in"
state_topic: "digitalOutputs/runtime/out"
payload_on: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO3":{"state":"high"}}}}'
payload_off: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO3":{"state":"low"}}}}'
value_template: "{{ value_json.task.taskResult.DO3.state }}"
state_on: "high"
state_off: "low"
optimistic: false
- name: "ATLAS DO4"
unique_id: atlas_do4
command_topic: "digitalOutputs/runtime/in"
state_topic: "digitalOutputs/runtime/out"
payload_on: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO4":{"state":"high"}}}}'
payload_off: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO4":{"state":"low"}}}}'
value_template: "{{ value_json.task.taskResult.DO4.state }}"
state_on: "high"
state_off: "low"
optimistic: false
EOF
Notes about this mqtt.yaml
| Entity | MQTT Topic | Function |
|---|---|---|
| sensor.atlas_ai1 .. ai4 | analogInputs/runtime/out | Show analogue readings AI..AI4 |
| binary_sensor.atlas_di1 .. di4 | digitalInputs/runtime/out | Show digital input states DI..DI4 |
| switch.atlas_do1 .. do4 | digitalOutputs/runtime/in/out | Control and confirm digital outputs DO..DO4 |
Digital inputs accept two response formats:
{
"result": true
}
or:
{
"state": "high"
}
This allows compatibility with different versions of the Node-RED flow.
10. Restart and validate configuration
Restart Home Assistant:
cd /opt/atlas-ha
sudo docker compose restart
View logs:
sudo docker logs -f homeassistant
Confirm there are no errors related to MQTT or YAML.
In Home Assistant, check for entities similar to:
| Entity | Type |
|---|---|
| sensor.atlas_ai1 | Analogue sensor |
| sensor.atlas_ai2 | Analogue sensor |
| sensor.atlas_ai3 | Analogue sensor |
| sensor.atlas_ai4 | Analogue sensor |
| binary_sensor.atlas_di1 | Digital input |
| binary_sensor.atlas_di2 | Digital input |
| binary_sensor.atlas_di3 | Digital input |
| binary_sensor.atlas_di4 | Digital input |
| switch.atlas_do1 | Digital output |
| switch.atlas_do2 | Digital output |
| switch.atlas_do3 | Digital output |
| switch.atlas_do4 | Digital output |
11. Simple dashboard in Home Assistant
Once the entities exist, you can create a simple card in the Dashboard.
Example YAML for a Lovelace view:
type: vertical-stack
cards:
- type: entities
title: Analog Inputs
entities:
- sensor.atlas_ai1
- sensor.atlas_ai2
- sensor.atlas_ai3
- sensor.atlas_ai4
- type: entities
title: Digital Inputs
entities:
- binary_sensor.atlas_di1
- binary_sensor.atlas_di2
- binary_sensor.atlas_di3
- binary_sensor.atlas_di4
- type: entities
title: Digital Outputs
entities:
- switch.atlas_do1
- switch.atlas_do2
- switch.atlas_do3
- switch.atlas_do4

