Jump to content

SENSBLUE ATLAS/Home Assistant: Difference between revisions

No edit summary
 
(20 intermediate revisions by the same user not shown)
Line 7: Line 7:
         <span class="atlas-btn">[[Media:Atlas-ha-install-v1.zip|Download Script]]</span>
         <span class="atlas-btn">[[Media:Atlas-ha-install-v1.zip|Download Script]]</span>
     </td>
     </td>
</table>
</table>This script takes a backup file as an argument and contains: <code>.tar.gz</code> <syntaxhighlight lang="bash">
atlas-ha-installer/
├── docker-compose.yml
├── install.sh
├── README.md
├── provision_areas.py
└── ha-config/
    ├── configuration.yaml
    ├── mqtt.yaml
    ├── automations.yaml
    ├── scripts.yaml
    └── scenes.yaml
</syntaxhighlight>
 
=== 1. What the script does ===
{| class="wikitable mix-table"
!Stage
!Action
|-
|Validates argument
|Confirms that a backup file was specified
|-
|Installs dependencies
|Run <code>apt update</code> and install <code>docker.io</code> and <code>docker-compose-plugin</code>
|-
|Enables Docker
|Executes <code>systemctl enable docker</code> and <code>systemctl start docker</code>
|-
|Breed pasta
|Ensure <code>/opt/atlas-ha</code> exists
|-
|Extract backup
|Extract the <code>.tar.gz</code> file to <code>/opt/atlas-ha</code>
|-
|HA starts up
|Navigates to <code>/opt/atlas-ha</code> and runs <code>sudo docker compose up -d</code>
|-
|Show URL
|Indicate access via <code><nowiki>http://DEVICE_IP:8123</nowiki></code>
|}
 
=== 2. Prepare Device ===
Transfer the package to ATLAS, for example using WinSCP:
 
# Open the connection to ATLAS using WinSCP.
# Copy <code>atlas-ha-installer.zip</code> or <code>atlas-ha-installer.tar.gz</code> to <code>/home/pi</code>.
# Drag the folder extracted from the .zip file to the /home/pi directory on ATLAS.
 
'''Note:''' If you need help installing WinSCP, '''''<u>[[SENSBLUE ATLAS/Putty & WinSCP#Install WinSCP|click here]]</u>'''''.
 
On ATLAS, after transferring the necessary files, establish an SSH connection
 
If the package is <code>.zip</code>:<syntaxhighlight lang="bash">
cd /home/pi
unzip atlas-ha-installer.zip
cd atlas-ha-installer
</syntaxhighlight>If the package is:<code>.tar.gz</code><syntaxhighlight lang="bash">cd /home/pi tar
-xzf atlas-ha-installer.tar.gz
cd atlas-ha-installer</syntaxhighlight>Grant execution permission<syntaxhighlight lang="bash">
chmod +x install.sh
</syntaxhighlight>
 
=== 3. Execute installation ===
The script will install the required dependencies, install/configure Docker, copy the files to <code>/opt/atlas-ha</code>, and start Home Assistant.<syntaxhighlight lang="bash">
sudo ./install.sh
</syntaxhighlight>After installation, the following should exist:<syntaxhighlight>
/opt/atlas-ha/
├── docker-compose.yml
└── ha-config/
    ├── configuration.yaml
    ├── mqtt.yaml
    ├── automations.yaml
    ├── scripts.yaml
    └── scenes.yaml
</syntaxhighlight>
 
=== 4. Post-script validation ===
Verify that the container is active:<syntaxhighlight lang="bash">
sudo docker ps
</syntaxhighlight>Check logs:<syntaxhighlight lang="bash">
sudo docker logs -f homeassistant
</syntaxhighlight>Verify HTTP response:<syntaxhighlight lang="bash">
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8123
</syntaxhighlight>Expected result:
{| class="wikitable mix-table"
!Code
!Meaning
|-
|200
|Home Assistant access
|-
|302
|Home Assistant accessible, with redirection
|-
|000 or connection refused
|It can be normal for the first 1–2 minutes; wait and repeat.
|}Access in browser<syntaxhighlight>
http://<ip-do-atlas>:8123
</syntaxhighlight>


= Home Assistant integration =
= Home Assistant integration =
Line 54: Line 152:
|Local Mosquitto on 127.0.0.1:1883
|Local Mosquitto on 127.0.0.1:1883
|}
|}
To locate the IP address of the ATLAS device, toggle the joystick to the right to navigate to the '''<nowiki/>'Network'''' screen, where the '''eth1''' address is displayed.
To locate the IP address of the ATLAS device, '''toggle the joystick to the right''' to navigate to the '''<nowiki/>'Network'''' screen, where the '''eth1''' address is displayed.
 
 
[[File:Front Screen.svg|center|frameless|566x566px]]


[[File:Front Screen.svg|center|frameless|540x540px]]




Once your preferred terminal application (e.g., PuTTY) is installed, initiate an SSH session using the ATLAS IP address and execute the following command to verify the system:
Once your preferred terminal application (e.g., PuTTY) is installed, initiate an SSH session using the ATLAS IP address and execute the following command to verify the system:


'''Note:''' If you need help installing PuTTY, [[SENSBLUE ATLAS/Putty & WinSCP#Install PuTTY|'''''<u>click here</u>''''']].
[[File:Image.png|center|frameless|448x448px]]
[[File:Image.png|center|frameless|448x448px]]


'''Note:''' SSH access to the ATLAS device requires authentication.
'''Note:''' SSH access to the ATLAS device requires authentication.
Line 145: Line 245:
==== 3.4 Add Docker repository ====
==== 3.4 Add Docker repository ====
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \ https://download.docker.com/linux/debian \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \ https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
</syntaxhighlight>
</syntaxhighlight>


Line 283: Line 386:


sudo tee mqtt.yaml > /dev/null << 'EOF'
sudo tee mqtt.yaml > /dev/null << 'EOF'
sensor:
sensor:
   - name: "ATLAS AI1"
   - name: "ATLAS AI1"
     unique_id: atlas_ai1
     unique_id: atlas_ai1
     state_topic: "analogInputs/runtime/out"
     state_topic: "analogInputs/runtime/out"
     value_template: "{{ value_json.task.taskResult.AI1.result | float(0) }}"
     value_template: "{{ value_json.task.taskResult.AI1.result }}"
     unit_of_measurement: "V"
     unit_of_measurement: "V"
     device_class: voltage
     device_class: voltage
Line 295: Line 399:
     unique_id: atlas_ai2
     unique_id: atlas_ai2
     state_topic: "analogInputs/runtime/out"
     state_topic: "analogInputs/runtime/out"
     value_template: "{{ value_json.task.taskResult.AI2.result | float(0) }}"
     value_template: "{{ value_json.task.taskResult.AI2.result }}"
     unit_of_measurement: "V"
     unit_of_measurement: "V"
     device_class: voltage
     device_class: voltage
Line 303: Line 407:
     unique_id: atlas_ai3
     unique_id: atlas_ai3
     state_topic: "analogInputs/runtime/out"
     state_topic: "analogInputs/runtime/out"
     value_template: "{{ value_json.task.taskResult.AI3.result | float(0) }}"
     value_template: "{{ value_json.task.taskResult.AI3.result }}"
     unit_of_measurement: "V"
     unit_of_measurement: "V"
     device_class: voltage
     device_class: voltage
Line 311: Line 415:
     unique_id: atlas_ai4
     unique_id: atlas_ai4
     state_topic: "analogInputs/runtime/out"
     state_topic: "analogInputs/runtime/out"
     value_template: "{{ value_json.task.taskResult.AI4.result | float(0) }}"
     value_template: "{{ value_json.task.taskResult.AI4.result }}"
     unit_of_measurement: "V"
     unit_of_measurement: "V"
     device_class: voltage
     device_class: voltage
     state_class: measurement
     state_class: measurement
  - name: "ATLAS CPU Usage"
    unique_id: atlas_cpu_usage
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.cpu_percent }}"
    unit_of_measurement: "%"
    device_class: power_factor
    state_class: measurement
  - name: "ATLAS CPU Temperature"
    unique_id: atlas_cpu_temperature
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.cpu_tempC }}"
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
  - name: "ATLAS CPU0 Frequency"
    unique_id: atlas_cpu0_frequency
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.cpu_freqs.cpu0.frequency_mhz }}"
    unit_of_measurement: "MHz"
    state_class: measurement
  - name: "ATLAS CPU1 Frequency"
    unique_id: atlas_cpu1_frequency
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.cpu_freqs.cpu1.frequency_mhz }}"
    unit_of_measurement: "MHz"
    state_class: measurement
  - name: "ATLAS CPU2 Frequency"
    unique_id: atlas_cpu2_frequency
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.cpu_freqs.cpu2.frequency_mhz }}"
    unit_of_measurement: "MHz"
    state_class: measurement
  - name: "ATLAS CPU3 Frequency"
    unique_id: atlas_cpu3_frequency
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.cpu_freqs.cpu3.frequency_mhz }}"
    unit_of_measurement: "MHz"
    state_class: measurement
  - name: "ATLAS CPU Throttle"
    unique_id: atlas_cpu_throttle
    state_topic: "systemHealth/runtime/out"
    value_template: >
      {% if value_json.task.taskResult.cpu_throttle == "0x0" %}
        No
      {% else %}
        Yes
      {% endif %}
  - name: "ATLAS RAM Usage"
    unique_id: atlas_ram_usage
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.ram_percent }}"
    unit_of_measurement: "%"
    state_class: measurement
  - name: "ATLAS RAM Total"
    unique_id: atlas_ram_total
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.ram_total_mb }}"
    unit_of_measurement: "GB"
    state_class: measurement
  - name: "ATLAS RAM Used"
    unique_id: atlas_ram_used
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.ram_used_mb }}"
    unit_of_measurement: "GB"
    state_class: measurement
  - name: "ATLAS RAM Available"
    unique_id: atlas_ram_available
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.ram_available_mb }}"
    unit_of_measurement: "GB"
    state_class: measurement
  - name: "ATLAS Disk Usage"
    unique_id: atlas_disk_usage
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.disk_percent }}"
    unit_of_measurement: "%"
    state_class: measurement
  - name: "ATLAS Disk Total"
    unique_id: atlas_disk_total
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.disk_total_gb }}"
    unit_of_measurement: "GB"
    device_class: data_size
    state_class: measurement
  - name: "ATLAS Disk Used"
    unique_id: atlas_disk_used
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.disk_used_gb }}"
    unit_of_measurement: "GB"
    device_class: data_size
    state_class: measurement
  - name: "ATLAS Disk Free"
    unique_id: atlas_disk_free
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.disk_free_gb }}"
    unit_of_measurement: "GB"
    device_class: data_size
    state_class: measurement
  - name: "ATLAS eMMC RUL State"
    unique_id: atlas_emmc_rul_state
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.emmc_rul.state }}"
  - name: "ATLAS eMMC RUL Reason"
    unique_id: atlas_emmc_rul_reason
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.emmc_rul.reason }}"
  - name: "ATLAS Uptime"
    unique_id: atlas_uptime_seconds
    state_topic: "systemHealth/runtime/out"
    value_template: "{{ value_json.task.taskResult.uptime_sec }}"
    unit_of_measurement: "s"
    device_class: duration
    state_class: measurement


binary_sensor:
binary_sensor:
Line 320: Line 557:
     unique_id: atlas_di1
     unique_id: atlas_di1
     state_topic: "digitalInputs/runtime/out"
     state_topic: "digitalInputs/runtime/out"
     value_template: >-
     value_template: >
       {% set di = value_json.task.taskResult.DI1 %}
       {% if value_json.task.taskResult.DI1.result == true %}
      {% if di.result is defined %}
         ON
         {{ 'ON' if di.result == true else 'OFF' }}
       {% else %}
       {% else %}
         {{ 'ON' if di.state == 'high' else 'OFF' }}
         OFF
       {% endif %}
       {% endif %}
     payload_on: "ON"
     payload_on: "ON"
Line 333: Line 569:
     unique_id: atlas_di2
     unique_id: atlas_di2
     state_topic: "digitalInputs/runtime/out"
     state_topic: "digitalInputs/runtime/out"
     value_template: >-
     value_template: >
       {% set di = value_json.task.taskResult.DI2 %}
       {% if value_json.task.taskResult.DI2.result == true %}
      {% if di.result is defined %}
         ON
         {{ 'ON' if di.result == true else 'OFF' }}
       {% else %}
       {% else %}
         {{ 'ON' if di.state == 'high' else 'OFF' }}
         OFF
       {% endif %}
       {% endif %}
     payload_on: "ON"
     payload_on: "ON"
Line 346: Line 581:
     unique_id: atlas_di3
     unique_id: atlas_di3
     state_topic: "digitalInputs/runtime/out"
     state_topic: "digitalInputs/runtime/out"
     value_template: >-
     value_template: >
       {% set di = value_json.task.taskResult.DI3 %}
       {% if value_json.task.taskResult.DI3.result == true %}
      {% if di.result is defined %}
         ON
         {{ 'ON' if di.result == true else 'OFF' }}
       {% else %}
       {% else %}
         {{ 'ON' if di.state == 'high' else 'OFF' }}
         OFF
       {% endif %}
       {% endif %}
     payload_on: "ON"
     payload_on: "ON"
Line 359: Line 593:
     unique_id: atlas_di4
     unique_id: atlas_di4
     state_topic: "digitalInputs/runtime/out"
     state_topic: "digitalInputs/runtime/out"
     value_template: >-
     value_template: >
       {% set di = value_json.task.taskResult.DI4 %}
       {% if value_json.task.taskResult.DI4.result == true %}
       {% if di.result is defined %}
        ON
         {{ 'ON' if di.result == true else 'OFF' }}
       {% else %}
         OFF
      {% endif %}
    payload_on: "ON"
    payload_off: "OFF"
 
  - name: "ATLAS eMMC RUL OK"
    unique_id: atlas_emmc_rul_ok
    state_topic: "systemHealth/runtime/out"
    value_template: >
      {% if value_json.task.taskResult.emmc_rul.ok == true %}
        ON
       {% else %}
       {% else %}
         {{ 'ON' if di.state == 'high' else 'OFF' }}
         OFF
       {% endif %}
       {% endif %}
     payload_on: "ON"
     payload_on: "ON"
     payload_off: "OFF"
     payload_off: "OFF"
    device_class: problem
  - name: "ATLAS eMMC RUL Problem"
    unique_id: atlas_emmc_rul_problem
    state_topic: "systemHealth/runtime/out"
    value_template: >
      {% if value_json.task.taskResult.emmc_rul.ok == false %}
        ON
      {% else %}
        OFF
      {% endif %}
    payload_on: "ON"
    payload_off: "OFF"
    device_class: problem


switch:
switch:
   - name: "ATLAS DO1"
   - name: "ATLAS DO1"
     unique_id: atlas_do1
     unique_id: atlas_do1
    state_topic: "digitalOutputs/runtime/out"
     command_topic: "digitalOutputs/runtime/in"
     command_topic: "digitalOutputs/runtime/in"
     state_topic: "digitalOutputs/runtime/out"
     value_template: >
     payload_on: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO1":{"state":"high"}}}}'
      {% if value_json.task.taskResult.DO1.result == true %}
     payload_off: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO1":{"state":"low"}}}}'
        ON
    value_template: "{{ value_json.task.taskResult.DO1.state }}"
      {% else %}
     state_on: "high"
        OFF
     state_off: "low"
      {% endif %}
    optimistic: false
     payload_on: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO1":true}}}'
     payload_off: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO1":false}}}'
     state_on: "ON"
     state_off: "OFF"


   - name: "ATLAS DO2"
   - name: "ATLAS DO2"
     unique_id: atlas_do2
     unique_id: atlas_do2
    state_topic: "digitalOutputs/runtime/out"
     command_topic: "digitalOutputs/runtime/in"
     command_topic: "digitalOutputs/runtime/in"
     state_topic: "digitalOutputs/runtime/out"
     value_template: >
     payload_on: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO2":{"state":"high"}}}}'
      {% if value_json.task.taskResult.DO2.result == true %}
     payload_off: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO2":{"state":"low"}}}}'
        ON
    value_template: "{{ value_json.task.taskResult.DO2.state }}"
      {% else %}
     state_on: "high"
        OFF
     state_off: "low"
      {% endif %}
    optimistic: false
     payload_on: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO2":true}}}'
     payload_off: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO2":false}}}'
     state_on: "ON"
     state_off: "OFF"


   - name: "ATLAS DO3"
   - name: "ATLAS DO3"
     unique_id: atlas_do3
     unique_id: atlas_do3
    state_topic: "digitalOutputs/runtime/out"
     command_topic: "digitalOutputs/runtime/in"
     command_topic: "digitalOutputs/runtime/in"
     state_topic: "digitalOutputs/runtime/out"
     value_template: >
     payload_on: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO3":{"state":"high"}}}}'
      {% if value_json.task.taskResult.DO3.result == true %}
     payload_off: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO3":{"state":"low"}}}}'
        ON
    value_template: "{{ value_json.task.taskResult.DO3.state }}"
      {% else %}
     state_on: "high"
        OFF
     state_off: "low"
      {% endif %}
    optimistic: false
     payload_on: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO3":true}}}'
     payload_off: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO3":false}}}'
     state_on: "ON"
     state_off: "OFF"


   - name: "ATLAS DO4"
   - name: "ATLAS DO4"
     unique_id: atlas_do4
     unique_id: atlas_do4
    state_topic: "digitalOutputs/runtime/out"
     command_topic: "digitalOutputs/runtime/in"
     command_topic: "digitalOutputs/runtime/in"
    value_template: >
      {% if value_json.task.taskResult.DO4.result == true %}
        ON
      {% else %}
        OFF
      {% endif %}
    payload_on: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO4":true}}}'
    payload_off: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO4":false}}}'
    state_on: "ON"
    state_off: "OFF"
 
  - name: "ATLAS DO5"
    unique_id: atlas_do5
     state_topic: "digitalOutputs/runtime/out"
     state_topic: "digitalOutputs/runtime/out"
     payload_on: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO4":{"state":"high"}}}}'
    command_topic: "digitalOutputs/runtime/in"
     payload_off: '{"id":0,"origin":"HA","task":{"action":"SET","taskParams":{"DO4":{"state":"low"}}}}'
    value_template: >
     value_template: "{{ value_json.task.taskResult.DO4.state }}"
      {% if value_json.task.taskResult.DO5.result == true %}
     state_on: "high"
        ON
     state_off: "low"
      {% else %}
     optimistic: false
        OFF
      {% endif %}
     payload_on: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO5":true}}}'
    payload_off: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO5":false}}}'
    state_on: "ON"
    state_off: "OFF"
 
  - name: "ATLAS DO6"
    unique_id: atlas_do6
    state_topic: "digitalOutputs/runtime/out"
    command_topic: "digitalOutputs/runtime/in"
    value_template: >
      {% if value_json.task.taskResult.DO6.result == true %}
        ON
      {% else %}
        OFF
      {% endif %}
    payload_on: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO6":true}}}'
    payload_off: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO6":false}}}'
    state_on: "ON"
    state_off: "OFF"
 
  - name: "ATLAS DO7"
    unique_id: atlas_do7
    state_topic: "digitalOutputs/runtime/out"
    command_topic: "digitalOutputs/runtime/in"
    value_template: >
      {% if value_json.task.taskResult.DO7.result == true %}
        ON
      {% else %}
        OFF
      {% endif %}
    payload_on: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO7":true}}}'
     payload_off: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO7":false}}}'
    state_on: "ON"
    state_off: "OFF"
 
  - name: "ATLAS DO8"
    unique_id: atlas_do8
    state_topic: "digitalOutputs/runtime/out"
    command_topic: "digitalOutputs/runtime/in"
    value_template: >
      {% if value_json.task.taskResult.DO8.result == true %}
        ON
      {% else %}
        OFF
      {% endif %}
    payload_on: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO8":true}}}'
    payload_off: '{"origin":"HA","task":{"alias":"SET_DO","taskParams":{"DO8":false}}}'
    state_on: "ON"
    state_off: "OFF"
 
number:
  - name: "ATLAS AO1"
    unique_id: atlas_ao1
    state_topic: "analogOutputs/runtime/out"
    command_topic: "analogOutputs/runtime/in"
    value_template: "{{ value_json.task.taskResult.AO1.result }}"
    command_template: >
      {"origin":"HA","task":{"alias":"SET_AO","taskParams":{"AO1":{{ value | float }}}}}
    min: 4
    max: 20
    step: 0.1
    unit_of_measurement: "mA"
    mode: slider
 
  - name: "ATLAS AO2"
    unique_id: atlas_ao2
    state_topic: "analogOutputs/runtime/out"
    command_topic: "analogOutputs/runtime/in"
     value_template: "{{ value_json.task.taskResult.AO2.result }}"
     command_template: >
      {"origin":"HA","task":{"alias":"SET_AO","taskParams":{"AO2":{{ value | float }}}}}
     min: 4
    max: 20
    step: 0.1
    unit_of_measurement: "mA"
     mode: slider
EOF
EOF
</syntaxhighlight>'''Notes about this mqtt.yaml'''
</syntaxhighlight>'''Notes about this mqtt.yaml'''