ปิดปั้มที่บ้านแบบ IoT Part 3: ควบคุมผ่านเว็บด้วย Home Assistant

หลังจากตอนที่แล้ว เราเตรียม hardware ติดตั้งเรียบร้อยแล้ว ในตอนที่ 3 นี้เราจะมาติดตั้ง MQTT server และ Home Assistant กันครับ ซึ่งพอทำเสร็จแล้วจะได้แบบในภาพนี้ โดยตัวโปรแกรมจะเชื่อมต่อกับ MQTT เพื่อสั่งงานสวิทช์

สำหรับวิธีการลงนั้น เนื่องจากระบบผมใช้ Docker 100% แล้วก็เลยจะต้องลงเป็น container โดยใช้ Docker Compose ตามนี้ครับ

version: "2"
services:
  homeassistant:
    restart: unless-stopped
    image: homeassistant/home-assistant
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - homeassistant:/config
  mqtt: 
    image: toke/mosquitto
    restart: unless-stopped
    volumes:
      - mqtt:/mqtt/data
      - mqtt-config:/mqtt/config
    ports:
      - 1883:1883
      - 9001:9001
volumes:
  homeassistant: {}
  mqtt: {}
  mqtt-config: {}

(ตรงนี้ผมมี nginx ดักด้านหน้าอยู่ เลยไม่ได้ expose Home Assistant โดยตรง และ MQTT จะโดน firewall rule อีกชั้นนึงด้วย ถ้านำไปใช้และไม่มี nginx ดักหน้าก็เปิด port 80 ออกไปแบบเดียวกับที่ผมเปิด MQTT port 1883 ครับ)

จากนั้นก็ config Home Assistant ให้เชื่อมต่อกับ Sonoff บน MQTT โดยแก้ไข configuration.yaml ใน Docker ที่อยู่ที่ /var/lib/docker/volumes/homeassistant_homeassistant/_data/configuration.yaml ซึ่งไฟล์นี้คือศูนย์กลางการตั้งค่าทุกอย่างที่เราจะได้แก้กันอีกหลายรอบ

mqtt:
  broker: mqtt
  port: 1883
  client_id: home-assistant-1
  keepalive: 60
  protocol: 3.1
  birth_message:
    topic: "hass/status"
    payload: "Online"
    qos: 1
    retain: true
  will_message:
    topic: "hass/status"
    payload: "Offline"
    qos: 1
    retain: true
switch:
  - platform: mqtt
    name: "Pump"
    state_topic: "stat/pump/POWER"
    command_topic: "cmnd/pump/POWER"
    qos: 1
    payload_on: "ON"
    payload_off: "OFF"
    retain: true

ตรงนี้จะให้ Home Assistant report สถานะลง MQTT ด้วย และตรง state_topic ด้านบนจะต้องกำหนดให้ตรงกับ MQTT topic ที่เซตไว้ในเว็บของ Sonoff นะครับ ผมใช้ pump ก็ใส่ตามนั้น

พอทำถึงตรงนี้ บนเว็บ Home Assistant ควรจะขึ้นให้ปิดปั้มได้แล้วครับ และพอกดแล้ว Sonoff ควรจะตัดทันที (ได้ยินเสียง relay ทำงาน)

สำหรับตอนหน้าเราจะมาทำระบบอัตโนมัติกันครับ