Dashboard & Cloud

Home Assistant Advanced Configuration

Tutorial lanjutan Home Assistant untuk smart home. Pelajari automations, templates, MQTT integration, custom components, dan HACS untuk rumah pintar yang cerdas.

1. Home Assistant: Refresher & Advanced Overview

Home Assistant (HA) adalah platform smart home open-source yang berjalan di Python. HA mengintegrasikan ratusan device dari berbagai brand dan protokol ke satu dashboard dan automation system. Tutorial ini fokus pada fitur advanced yang memungkinkan kamu membangun automasi kompleks dan mengintegrasikan device custom.

Di level advanced, Home Assistant sangat powerful berkat kombinasi YAML configuration, Jinja2 templates, MQTT integration, dan Python custom components. Kamu bisa mengintegrasikan hampir semua perangkat IoT — bahkan yang belum didukung secara native.

💡 Tips

Home Assistant berkembang sangat cepat. Sejak versi 2023.x, sebagian besar konfigurasi bisa dilakukan via UI (tidak perlu edit YAML lagi). Namun, untuk fitur advanced seperti templates dan custom components, YAML tetap diperlukan.

Home Assistant Architecture

# Komponen utama Home Assistant:
# - Core: Python application (hass) yang menjalankan integrations & automations
# - Frontend: Web UI (Lovelace) dan mobile app
# - Integrations: Modul untuk menghubungkan device/service (1000+ integrations)
# - Entities: Representasi device (sensor, switch, light, dll)
# - Automations: Trigger → Condition → Action
# - Services: Aksi yang bisa dipanggil (turn_on, send_notification, dll)

# Entity States:
# - sensor.temperature_1 = "25.6" (attributes: unit_of_measurement, device_class)
# - light.living_room = "on" (attributes: brightness, color_temp, rgb_color)
# - switch.kitchen_fan = "off"
# - binary_sensor.door = "on" / "off"
# - device_tracker.phone = "home" / "not_home"

Konfigurasi File Structure

# Struktur folder Home Assistant (/config):
# configuration.yaml     — konfigurasi utama
# automations.yaml       — automations (bisa via UI)
# scripts.yaml           — scripts
# scenes.yaml            — scenes
# secrets.yaml           — sensitive data (API keys, passwords)
# customize.yaml         — entity customization
# packages/              — split config by feature
# custom_components/     — custom integrations (dari HACS)
# themes/                — custom themes
# www/                   — static files (images, JS, CSS)
# dashboards/            — custom Lovelace dashboards (YAML mode)

2. Automations & Trigger-Condition-Action

Automations adalah fitur paling penting di Home Assistant. Setiap automation memiliki tiga komponen: Trigger (kapan?), Condition (syarat?), dan Action (apa yang dilakukan?).

Contoh Automations Kompleks

# Automation 1: Lampu otomatis dengan motion sensor dan lux sensor
- alias: "Lampu Otomatis Ruang Tamu"
  description: "Nyalakan lampu saat gelap dan ada gerakan"
  trigger:
    # Trigger 1: Motion sensor mendeteksi gerakan
    - platform: state
      entity_id: binary_sensor.motion_living_room
      to: "on"
    # Trigger 2: Lux sensor berubah di bawah threshold
    - platform: numeric_state
      entity_id: sensor.lux_living_room
      below: 50
  condition:
    # Hanya jika gelap
    - condition: numeric_state
      entity_id: sensor.lux_living_room
      below: 50
    # Dan belum larut malam (sebelum jam 23:00)
    - condition: time
      before: "23:00:00"
    # Dan lampu belum menyala
    - condition: state
      entity_id: light.living_room
      state: "off"
  action:
    # Nyalakan lampu dengan brightness berdasarkan waktu
    - service: light.turn_on
      target:
        entity_id: light.living_room
      data:
        brightness: >
          {% if now().hour < 20 %}
            200
          {% elif now().hour < 22 %}
            150
          {% else %}
            80
          {% endif %}
        color_temp_kelvin: >
          {% if now().hour < 20 %}
            4000
          {% else %}
            2700
          {% endif %}
    # Tunggu 5 menit tanpa gerakan
    - wait_for_trigger:
        - platform: state
          entity_id: binary_sensor.motion_living_room
          to: "off"
          for: "00:05:00"
    # Matikan lampu
    - service: light.turn_off
      target:
        entity_id: light.living_room

# Automation 2: Notifikasi suhu tinggi
- alias: "Alert Suhu Tinggi"
  trigger:
    - platform: numeric_state
      entity_id: sensor.temperature_server_room
      above: 35
      for: "00:05:00"
  condition:
    - condition: state
      entity_id: input_boolean.alert_enabled
      state: "on"
  action:
    - service: notify.mobile_app
      data:
        title: "⚠️ Suhu Server Room Tinggi!"
        message: >
          Suhu saat ini: {{ states('sensor.temperature_server_room') }}°C
          Kelembaban: {{ states('sensor.humidity_server_room') }}%
        data:
          push:
            sound: "alarm.caf"
          actions:
            - action: "TURN_ON_AC"
              title: "Nyalakan AC"
            - action: "SNOOZE_ALERT"
              title: "Snooze 1 Jam"
    # Tunggu response dari notification
    - wait_for_trigger:
        - platform: event
          event_type: mobile_app_notification_action
          event_data:
            action: "TURN_ON_AC"
      timeout: "00:10:00"
    - condition: template
      value_template: "{{ wait.trigger is not none }}"
    - service: climate.set_temperature
      target:
        entity_id: climate.server_room_ac
      data:
        temperature: 22
        hvac_mode: "cool"

3. Templates & Jinja2

Template memungkinkan kamu membuat logika dinamis menggunakan bahasa template Jinja2. Ini sangat powerful untuk sensor template, automation conditions, dan dashboard card.

# Template Sensor — buat virtual sensor dari data lain
template:
  - sensor:
      # Rata-rata suhu seluruh rumah
      - name: "Suhu Rata-rata Rumah"
        unit_of_measurement: "°C"
        state: >
          {% set sensors = [
            states('sensor.temperature_living_room'),
            states('sensor.temperature_bedroom'),
            states('sensor.temperature_kitchen')
          ] %}
          {% set valid = sensors | select('is_number') | list %}
          {{ (valid | map('float') | sum / valid | count) | round(1) }}
        attributes:
          rooms: >
            {{ states.sensor
               | selectattr('attributes.device_class', 'eq', 'temperature')
               | map(attribute='entity_id')
               | list }}

      # Status perangkat online
      - name: "Jumlah Device Online"
        state: >
          {% set devices = states.sensor 
             | selectattr('state', 'ne', 'unavailable')
             | selectattr('state', 'ne', 'unknown')
             | list %}
          {{ devices | count }}
        attributes:
          offline_devices: >
            {% set offline = states.sensor 
               | selectattr('state', 'eq', 'unavailable')
               | map(attribute='name')
               | list %}
            {{ offline | join(', ') }}

  - binary_sensor:
      # Deteksi kebocoran air
      - name: "Water Leak Detected"
        state: >
          {{ states('sensor.moisture_bathroom') | float > 60
             or states('sensor.moisture_kitchen') | float > 60 }}
        device_class: moisture

  - sensor:
      # Waktu tempuh ke kantor
      - name: "ETA Kantor"
        state: >
          {% set duration = state_attr('sensor.google_maps_commute', 'duration') %}
          {% if duration %}
            {{ (now() + timedelta(minutes=duration)).strftime('%H:%M') }}
          {% else %}
            unavailable
          {% endif %}
        attributes:
          duration_minutes: >
            {{ state_attr('sensor.google_maps_commute', 'duration') }}

4. MQTT Integration untuk IoT Devices

MQTT adalah cara terbaik menghubungkan device IoT custom ke Home Assistant. HA memiliki MQTT integration yang sangat lengkap — kamu bisa mendefinisikan sensor, switch, light, dan bahkan camera melalui MQTT discovery atau manual config.

MQTT Discovery

# ESP32: Kirim MQTT discovery config ke Home Assistant
import json

# Discovery config untuk temperature sensor
discovery_topic = "homeassistant/sensor/sensor-01-temp/config"
discovery_payload = {
    "name": "Suhu Ruang Server",
    "unique_id": "sensor_01_temperature",
    "state_topic": "home/sensor-01/state",
    "unit_of_measurement": "°C",
    "device_class": "temperature",
    "value_template": "{{ value_json.temperature }}",
    "device": {
        "identifiers": ["sensor-01"],
        "name": "Sensor Ruang Server",
        "manufacturer": "BeebaneLabs",
        "model": "ESP32-S3 Sensor",
        "sw_version": "2.1.0"
    },
    "availability_topic": "home/sensor-01/availability",
    "payload_available": "online",
    "payload_not_available": "offline"
}

mqtt_client.publish(discovery_topic, json.dumps(discovery_payload), retain=True)

# Discovery config untuk humidity sensor (device yang sama)
discovery_topic = "homeassistant/sensor/sensor-01-hum/config"
discovery_payload = {
    "name": "Kelembaban Ruang Server",
    "unique_id": "sensor_01_humidity",
    "state_topic": "home/sensor-01/state",
    "unit_of_measurement": "%",
    "device_class": "humidity",
    "value_template": "{{ value_json.humidity }}",
    "device": {"identifiers": ["sensor-01"]}
}
mqtt_client.publish(discovery_topic, json.dumps(discovery_payload), retain=True)

# State update (setiap 30 detik)
state_topic = "home/sensor-01/state"
state_payload = {"temperature": 25.6, "humidity": 65, "battery": 87}
mqtt_client.publish(state_topic, json.dumps(state_payload))

MQTT Manual Configuration

# configuration.yaml — manual MQTT sensor
mqtt:
  sensor:
    - name: "IoT Gateway Temperature"
      state_topic: "sensors/gateway/telemetry"
      unit_of_measurement: "°C"
      value_template: "{{ value_json.temperature }}"
      json_attributes_topic: "sensors/gateway/telemetry"
      json_attributes_template: >
        {{ {'humidity': value_json.humidity, 'battery': value_json.battery} | tojson }}
      availability_topic: "sensors/gateway/status"
      payload_available: "online"
      payload_not_available: "offline"

    - name: "IoT Device Count"
      state_topic: "gateway/stats/connected_devices"
      unit_of_measurement: "devices"

  switch:
    - name: "IoT Relay 1"
      command_topic: "sensors/relay-01/set"
      state_topic: "sensors/relay-01/state"
      payload_on: '{"state": "ON"}'
      payload_off: '{"state": "OFF"}'
      state_on: '{"state": "ON"}'
      state_off: '{"state": "OFF"}'
      optimistic: false

  binary_sensor:
    - name: "IoT Motion Sensor"
      state_topic: "sensors/motion-01/state"
      payload_on: "DETECTED"
      payload_off: "CLEAR"
      device_class: motion

5. Custom Components & Integration

Untuk integrasi yang belum tersedia di Home Assistant, kamu bisa membuat custom component. Custom component adalah Python module yang berjalan di dalam HA core.

# custom_components/my_iot_sensor/__init__.py
"""Custom IoT Sensor Integration for Home Assistant."""
import logging
from homeassistant.core import HomeAssistant
from homeassistant.config_entries import ConfigEntry
from homeassistant.helpers.typing import ConfigType

DOMAIN = "my_iot_sensor"
_LOGGER = logging.getLogger(__name__)

async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
    """Set up the component from configuration.yaml."""
    return True

async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
    """Set up from a config entry (UI-based)."""
    hass.async_create_task(
        hass.config_entries.async_forward_entry_setups(entry, ["sensor"])
    )
    return True

async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
    """Unload a config entry."""
    return await hass.config_entries.async_unload_platforms(entry, ["sensor"])
# custom_components/my_iot_sensor/sensor.py
"""Sensor platform for my_iot_sensor."""
import logging
from homeassistant.components.sensor import SensorEntity
from homeassistant.core import HomeAssistant
from homeassistant.config_entries import ConfigEntry

_LOGGER = logging.getLogger(__name__)

async def async_setup_entry(hass, config_entry, async_add_entities):
    """Set up sensor platform."""
    sensors = [
        IoTSensor("Server Room Temperature", "°C", "temperature"),
        IoTSensor("Server Room Humidity", "%", "humidity"),
    ]
    async_add_entities(sensors, True)

class IoTSensor(SensorEntity):
    def __init__(self, name, unit, sensor_type):
        self._attr_name = name
        self._attr_native_unit_of_measurement = unit
        self._sensor_type = sensor_type
        self._state = None

    @property
    def native_value(self):
        return self._state

    async def async_update(self):
        """Fetch new state data for the sensor."""
        # Implementasi: baca dari API, MQTT, database, dll
        # self._state = await fetch_data(self._sensor_type)
        pass

6. HACS (Home Assistant Community Store)

HACS adalah package manager untuk Home Assistant. Dengan HACS, kamu bisa menginstall custom integrations, themes, dan dashboard cards dari komunitas dengan mudah.

Instalasi HACS

# Metode 1: Install via SSH/terminal
# Akses HA terminal (add-on Terminal & SSH)
cd /config
wget -O - https://get.hacs.xyz | bash -
# Restart Home Assistant

# Metode 2: Install via Docker
# Tambahkan volume: - /config/custom_components/hacs:/config/custom_components/hacs
# Download release dari https://github.com/hacs/integration/releases

# Setelah install:
# 1. Buka HA → Settings → Devices & Services → Add Integration
# 2. Cari "HACS" → Install
# 3. Autentikasi dengan GitHub account
# 4. HACS muncul di sidebar

Popular HACS Integrations

IntegrationKegunaan
Browser ModControl browser sebagai media player, popup dialog
Card ModCustom CSS untuk Lovelace cards
Mushroom CardsModern card design untuk dashboard
Mini Media PlayerCompact media player card
Auto EntitiesDinamis entity list berdasarkan filter
ApexCharts CardAdvanced charting untuk dashboard
Scheduler ComponentVisual scheduler untuk automations
Battery NotesTrack battery replacement dates
SpookSwiss army knife — helper entities, integration health

7. Lovelace Dashboard Advanced

# Custom dashboard YAML mode (di /config/dashboards/)
views:
  - title: "Smart Home Overview"
    path: overview
    cards:
      # Status card dengan conditional visibility
      - type: conditional
        conditions:
          - entity: sensor.temperature_server_room
            above: 35
        card:
          type: markdown
          content: "⚠️ **PERINGATAN:** Suhu server room {{ states('sensor.temperature_server_room') }}°C!"

      # Grid layout
      - type: grid
        columns: 2
        cards:
          - type: sensor
            entity: sensor.temperature_living_room
            graph: line
            name: "Suhu Ruang Tamu"
          - type: sensor
            entity: sensor.humidity_living_room
            graph: line
            name: "Kelembaban"

      # Gauge card
      - type: gauge
        entity: sensor.temperature_server_room
        min: 15
        max: 50
        segments:
          - from: 0
            color: "#2196F3"
          - from: 25
            color: "#4CAF50"
          - from: 35
            color: "#FF9800"
          - from: 40
            color: "#F44336"
        needle: true

      # Entities card dengan custom badges
      - type: entities
        title: "Device Status"
        show_header_toggle: false
        entities:
          - entity: sensor.device_online_count
            name: "Device Online"
            icon: mdi:devices
          - entity: binary_sensor.internet_connection
            name: "Internet"
          - entity: sensor.last_motion
            name: "Gerakan Terakhir"
          - type: divider
          - entity: switch.living_room_lamp
            name: "Lampu Ruang Tamu"
          - entity: switch.kitchen_fan
            name: "Kipas Dapur"

8. Tips & Best Practices

Best PracticeDeskripsi
Gunakan PackagesSplit configuration.yaml ke folder packages/ per fitur
SecretsSimpan API keys dan password di secrets.yaml
Automation via UIGunakan UI editor untuk automations sederhana, YAML untuk kompleks
Backup OtomatisKonfigurasi Google Drive Backup add-on
Pisahkan MQTTGunakan broker MQTT terpisah (EMQX/Mosquitto) dari HA internal broker
Monitor ResourcesPantau CPU/RAM usage, terutama untuk Raspberry Pi
Entity NamingGunakan friendly_name yang deskriptif, bukan nama teknis
DatabasePertimbangkan MariaDB/PostgreSQL untuk recorder (lebih cepat dari SQLite)

9. Quiz: Uji Pemahamanmu!

Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Home Assistant Advanced:

Pertanyaan 1: Tiga komponen utama dari automation di Home Assistant adalah...

a) Input, Process, Output
b) Trigger, Condition, Action
c) Start, Execute, Stop
d) Event, Handler, Response

Pertanyaan 2: Template sensor di Home Assistant menggunakan bahasa template apa?

a) Mustache
b) Jinja2
c) ERB (Embedded Ruby)
d) Handlebars

Pertanyaan 3: Apa fungsi MQTT Discovery di Home Assistant?

a) Mencari broker MQTT di jaringan
b) Device mendaftarkan diri secara otomatis ke HA melalui MQTT config topic
c) Menghapus device MQTT yang tidak aktif
d) Mengenkripsi komunikasi MQTT

Pertanyaan 4: HACS (Home Assistant Community Store) memungkinkan kamu untuk...

a) Menginstall firmware ke device
b) Menginstall custom integrations, themes, dan dashboard cards dari komunitas
c) Mengelola database Home Assistant
d) Mengganti operating system

Pertanyaan 5: Untuk membuat virtual sensor yang menghitung rata-rata dari beberapa sensor, kamu perlu menggunakan...

a) Automation
b) Script
c) Template sensor dengan Jinja2
d) Scene
← SebelumnyaEMQX MQTT Broker Selanjutnya →InfluxDB & Telegraf
🔍 Zoom
100%
🎨 Tema