ปิดปั้มที่บ้านแบบ IoT Part 5: แจ้งเตือน และตั้งเวลา

จากตอนที่แล้วเราได้เซตให้ปิดปั้มเองเรียบร้อยแล้ว แต่ปัญหายังเหลืออยู่ว่าควรจะบอกด้วยว่าปิดปั้มแล้วเพื่อความชัวร์ (และใช้ debug เวลา VPN หลุดด้วย) และจะต้องต่อเวลาได้ในกรณีที่ซักผ้าอยู่ ในตอนสุดท้ายเราจะ ก็จะเพิ่มระบบ Notification เข้ามาครับ

โปรแกรม Home Assistant จะรองรับ Progressive Web App push ซึ่งสามารถ push ไปหา Chrome บน PC/Android ได้ และสำหรับ iOS จะต้องติดตั้งแอพ Home Assistant

สำหรับ PWA Push ทำดังนี้ครับ

  1. เข้าไปสมัคร Firebase Push Notification ที่ https://console.firebase.google.com
  2. เข้าไปที่หน้า project กดตรงประแจที่ Overview เลือก Cloud Messaging แล้วจด Server key กับ Sender ID ไว้

แล้วเพิ่ม config ว่า

ios:
notify:
  - platform: html5
    gcm_api_key: '...'
    gcm_sender_id: '...'

โดยระบุ gcm_api_key เป็น Server key ที่จดไว้ และ gcm_sender_id เป็น Sender ID ที่จดไว้

จากนั้นให้เอาอุปกรณ์เข้ามาที่หน้าเว็บของ Home assistant และ Add to home screen สำหรับ Android จากนั้นใน sidebar ให้เปิด Push Notification ซึ่งบน server จะเห็นมีไฟล์ html5_push_registrations.conf ปรากฏขึ้นมา ตรงนี้แนะนำให้ restart ทีนึง

สำหรับ iOS เมื่อเอาแอพเชื่อมต่อมาแล้วให้ restart Home Assistant ทีนึงก็ใช้ได้เลยครับ

จากนั้นเราจะเพิ่มกฎว่าถ้าไม่มีคนอยู่บ้านให้ push ทำได้ดังนี้ครับ

automation:
  - alias: Notify me when nobody's home
    trigger:
      platform: state
      entity_id: group.family
      from: home
      to: not_home
    action:
      - service: notify.html5_yui
        data:
          message: Nobody home!
      - service: notify.ios_my_love
        data:
          message: Nobody home!

โดยตรงชื่ออุปกรณ์ให้หาจากหน้า service ครับ (/dev-service)

ทดสอบแจ้งเตือนได้โดยกดที่ automation ที่เราสร้างมาใหม่แล้วกด Trigger ครับ จะได้แบบนี้

ตั้งเวลา

โจทย์ข้อสุดท้ายคือ สามารถตั้งเวลาปิดได้สำหรับเวลาซักผ้า ซึ่งเป็นปัญหาที่ผมนึกวิธีอยู่นานพอสมควร

วิธีที่ใช้คือ

  1. มี input slider component ตัวหนึ่งให้ลากตั้งเวลาได้
  2. ทุกๆ 1 นาที slider จะลดค่าลง 1
  3. เมื่อ slider เหลือ 0 นาที ให้ปิดปั้ม
  4. เมื่อ slider คือ -1 แสดงว่าไม่ใช้ เพื่อป้องกัน slider เหลือ 0 ค้าง หรือเมื่อต้องการยกเลิก timer
  5. ให้ trigger “Turn off pump when nobody’s home” ไม่ทำงานถ้า slider นี้ทำงานอยู่

config ก็ตามนี้ครับ

input_slider:
  pump_off_timer:
    name: Pump off timer (min)
    initial: -1
    min: -1
    max: 180
    step: 10
automation:
  - alias: Pump timer tick
    hide_entity: true
    trigger:
      platform: time
      seconds: 00
    condition:
      condition: and
      conditions:
        - condition: numeric_state
          entity_id: input_slider.pump_off_timer
          above: 0
    action:
      service: input_slider.select_value
      data_template:
        entity_id: input_slider.pump_off_timer
        value: '{{states("input_slider.pump_off_timer")|int - 1}}'
  - alias: Pump timer trigger
    hide_entity: true
    trigger:
      platform: numeric_state
      entity_id: input_slider.pump_off_timer
      above: 0
      below: 0
    condition:
      condition: and
      conditions:
        - condition: state
          entity_id: group.family
          state: not_home
    action:
      service: switch.turn_off
      data:
        entity_id: switch.pump

Trigger ชุดใหม่นี้จะไม่ขึ้นในเว็บครับ เนื่องจาก hide_entity: true แต่สามารถดูได้ในหน้า dev-state (ปุ่ม <> ใน sidebar ของ Home Assistant)

และให้แก้ trigger เดิมดังนี้

automation:
  - alias: Turn off pump when nobody's home
    initial_state: 'off'
    trigger:
      platform: state
      entity_id: group.family
      from: home
      to: not_home
    condition:
      condition: and
      conditions:
        - condition: numeric_state
          entity_id: input_slider.pump_off_timer
          below: -1
    action:
      service: switch.turn_off
      data:
        entity_id: switch.pump

โดยเพิ่ม condition เข้ามาว่า pump_off_timer จะต้องเป็น -1 จึงจะปิดปั้มให้อัตโนมัติ ถ้า timer ยังทำงานอยู่ก็จะไม่ปิด

ในหน้าเว็บจะปรากฏ slider ขึ้นมา ก็สามารถลากเอาได้เลยว่าจะปิดปั้มในกี่นาที

สรุป

ในบทความนี้เราก็ทำให้ปั้มในบ้านเรากลายเป็นอุปกรณ์ IoT สามารถเปิดปิดจากอินเทอร์เน็ตได้โดยคำนึงถึง security ด้วย และใช้ระบบอัตโนมัติทำให้เปิดปิดได้อัตโนมัติเพื่อประหยัดน้ำ โดยอุปกรณ์ทั้งหมดที่ใช้ต้นทุนก็ไม่ถึง 1 พันบาท (ไม่นับ server ซึ่งผมก็ใช้เปิดบล็อคที่ผู้อ่านกำลังเข้าอยู่แล้ว)

สำหรับใครที่จะลอง implement ตามก็แนะนำว่าสามารถข้ามพาร์ทที่ใช้ router ไปได้ครับ โดยใช้ Raspberry Pi ลง Home Assistant ไว้ในบ้านก็จะสามารถเซตตามได้เลยโดยไม่ต้องเซต VPN แต่ถ้าไม่มี IP จริงจะทำให้เข้าจากนอกบ้านได้ด้วยก็จะลำบากหน่อย

ก็ขอบคุณมากๆ ที่ติดตามกันมาถึงตอนสุดท้ายครับ Feedback ออกมาค่อนข้างดีมากๆ ถ้ามีคำแนะนำอะไรหรือสงสัยก็พูดคุยกันได้ในโพสต์ Facebook หรือใน Twitter ที่แชร์บล็อคนี้ครับ

ปิดปั้มที่บ้านแบบ 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