ปิดปั้มที่บ้านแบบ IoT Part 4: ทำชีวิตให้อัตโนมัติ

หลังจากตอนที่แล้วเราติดตั้งโปรแกรม Home Assistant และ Mosquitto MQTT Server และสามารถปิดปั้มผ่านเว็บได้แล้ว ในตอนนี้เราจะทำให้มันเป็นอัตโนมัติด้วยครับ

เริ่มแรกที่เราจะต้อง detect ก่อนว่ามีคนอยู่บ้านหรือเปล่า ซึ่งจากที่ทดลองมาหลายวิธีแล้วพบว่า component Ping ง่ายๆ นี่แหละเวิร์คที่สุด ซึ่งการทำงานก็แค่จะ ping IP ที่กำหนดไว้เรื่อยๆ ถ้าเจอก็คืออยู่บ้าน ถ้าไม่เจอติดกันประมาณ 5 นาทีก็คือไม่อยู่

device_tracker:
  - platform: ping
    hosts:
      yui: 192.168.2.12
      dadiphone: 192.168.2.21
      momsamsung: 192.168.2.23

ตรงนี้อุปกรณ์ทั้งหมดจะถูก fix IP ไว้ใน DHCP Server ของ Mikrotik ครับ ทำให้ไม่ต้องกังวลว่า IP จะเปลี่ยนไปเอง และบน server ผมนั้นจะได้ route เข้ามาหาอุปกรณ์ในบ้านผ่าน BGP อยู่แล้วทำให้ ping IP ภายในบ้านผ่าน VPN ได้เลย (ทั้งหมดนี้ทำไว้ใน ตอนที่ 1)

ถัดมาก็คือ group ทุกคนเข้าด้วยกันเพื่อให้จัดการได้ง่ายขึ้น

group:
  family:
    name: Family members
    view: no
    entities:
      - device_tracker.yui
      - device_tracker.dadiphone
      - device_tracker.momsamsung

พอ restart ใน interface ก็จะเริ่มขึ้นอุปกรณ์มาแล้วครับ

ตรงนี้สามารถตกแต่งได้ที่ไฟล์ known_devices.yaml โดยระบุ name และ gravatar (อีเมลที่สมัคร Gravatar) เพื่อให้สวยงามได้ (ไฟล์นี้จะ generate มาเอง ถ้าไม่มีอุปกรณ์เราหรือไม่มีไฟล์ต้อง restart หลังเซต device tracker ครับ) และสำหรับ iPhone ให้ระบุ consider_home: 1800 ในไฟล์นั้นด้วย เพราะ iPhone จะชอบตัด WiFi เองเรื่อยๆ

yui:
  hide_if_away: false
  name: Win's Phone
  gravatar: manatsawin@gmail.com
  track: true
dadiphone:
  name: Dad's iPhone
  hide_if_away: false
  track: true
  consider_home: 1800 # ถ้าไม่อยู่บ้าน 30 นาทีถึงจะตัด

พอ Detect ได้หมดแล้วก็ได้เวลาเขียน Automation ให้กับ Home Assistant ครับ ดังนี้

automation:
  - alias: Turn off pump when nobody's home
    initial_state: 'off'
    trigger:
      platform: state
      entity_id: group.family
      from: home
      to: not_home
    action:
      service: switch.turn_off
      data:
        entity_id: switch.pump
  - alias: Turn on pump when people are home
    trigger:
      platform: state
      entity_id: group.family
      from: not_home
      to: home
    action:
      service: switch.turn_on
      data:
        entity_id: switch.pump

ตรงนี้จะมี trigger 2 ตัวคือ

  1. เมื่อ group.family เปลี่ยนสถานะจาก home -> not_home แล้วให้ turn off switch.pump ซึ่งตรงนี้ initial state คือ Off แปลว่าไม่ใช้งาน ถ้าจะใช้ต้องไปเปิดในเว็บก่อน
  2. เมื่อ group.family เปลี่ยนสถานะจาก not_home -> home แล้วให้ turn on switch.pump

โดย group นี้ถ้ามีคนอยู่บ้านแม้แต่คนเดียว สถานะจะเป็น home ครับ อันนี้คือพฤติกรรมของ Home Assistant เลย ไม่ต้องเซตอะไร

พอใช้ได้แล้วในเว็บจะปรากฏ automation menu ครับ

ตรงนี้สามารถทดสอบได้โดยคลิกที่ชื่อแล้วกดปุ่ม Trigger โปรแกรมจะทำงาน action ที่เซตไว้โดยไม่สนใจเงื่อนไข trigger ที่ตั้งไว้

สำหรับตอนหน้าจะเป็นตอนสุดท้ายแล้วครับ ซึ่งจะพูดถึง Automation ในระดับที่ยากขึ้นก็คือการทำ Push notification และการทำ Timer