SENSBLUE ATLAS/Home Assistant: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| Line 74: | Line 74: | ||
done | done | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== 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:<syntaxhighlight lang="bash"> | |||
sudo docker run --rm hello-world | |||
</syntaxhighlight>If <code>apt-get update</code> 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:<syntaxhighlight lang="bash"> | |||
deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian bookworm stable | |||
</syntaxhighlight> | |||
=== 4. Create the Home Assistant project === | |||
Create the project folder:<syntaxhighlight lang="bash"> | |||
sudo mkdir -p /opt/atlas-ha | |||
cd /opt/atlas-ha | |||
</syntaxhighlight>Create the <code>docker-compose.yml</code> file:<syntaxhighlight lang="bash"> | |||
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 | |||
</syntaxhighlight>'''Important notes:''' | |||
{| class="wikitable" | |||
!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 <code>/opt/atlas-ha</code> folder:<syntaxhighlight lang="bash"> | |||
sudo docker compose up -d | |||
</syntaxhighlight>The first start may take a few minutes as the image is downloaded and Home Assistant initialises the configuration. | |||
'''Check container status:'''<syntaxhighlight lang="bash"> | |||
sudo docker ps | |||
</syntaxhighlight>'''Check HTTP response:'''<syntaxhighlight lang="bash"> | |||
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8123 | |||
</syntaxhighlight>'''Expected result:''' | |||
{| class="wikitable" | |||
!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:<syntaxhighlight lang="bash"> | |||
http://<atlas-ip>:8123 | |||
</syntaxhighlight>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 <code>network_mode: host</code>, Home Assistant can access the local Mosquitto via: | |||
{| class="wikitable" | |||
!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:<syntaxhighlight lang="bash"> | |||
cd /opt/atlas-ha/ha-config | |||
</syntaxhighlight>Create or replace the <code>configuration.yaml</code> file:<syntaxhighlight lang="bash"> | |||
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 | |||
</syntaxhighlight>Create the included files if they do not already exist:<syntaxhighlight lang="bash"> | |||
sudo touch automations.yaml scripts.yaml scenes.yaml | |||
sudo mkdir -p themes | |||
</syntaxhighlight> | |||
=== 9. Create mqtt.yaml === | |||
Create the file:<syntaxhighlight lang="bash"> | |||
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 | |||
</syntaxhighlight>'''Notes about this mqtt.yaml''' | |||
{| class="wikitable" | |||
!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:<syntaxhighlight lang="bash"> | |||
{ | |||
"result": true | |||
} | |||
</syntaxhighlight>or:<syntaxhighlight lang="bash"> | |||
{ | |||
"state": "high" | |||
} | |||
</syntaxhighlight>This allows compatibility with different versions of the Node-RED flow. | |||
=== 10. Restart and validate configuration === | |||
'''Restart Home Assistant:'''<syntaxhighlight lang="bash"> | |||
cd /opt/atlas-ha | |||
sudo docker compose restart | |||
</syntaxhighlight>'''View logs:'''<syntaxhighlight lang="bash"> | |||
sudo docker logs -f homeassistant | |||
</syntaxhighlight>'''Confirm there are no errors related to MQTT or YAML.''' | |||
In Home Assistant, check for entities similar to: | |||
{| class="wikitable" | |||
!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:'''<syntaxhighlight lang="yaml">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</syntaxhighlight> | |||
[[File:Home Assistant img 1.png|center|frameless|1037x1037px]] | |||
[[File:Home Assistant img 2.png|center|frameless|1037x1037px]] | |||