จากตอนที่แล้วเราได้เซตให้ปิดปั้มเองเรียบร้อยแล้ว แต่ปัญหายังเหลืออยู่ว่าควรจะบอกด้วยว่าปิดปั้มแล้วเพื่อความชัวร์ (และใช้ debug เวลา VPN หลุดด้วย) และจะต้องต่อเวลาได้ในกรณีที่ซักผ้าอยู่ ในตอนสุดท้ายเราจะ ก็จะเพิ่มระบบ Notification เข้ามาครับ
โปรแกรม Home Assistant จะรองรับ Progressive Web App push ซึ่งสามารถ push ไปหา Chrome บน PC/Android ได้ และสำหรับ iOS จะต้องติดตั้งแอพ Home Assistant
สำหรับ PWA Push ทำดังนี้ครับ
- เข้าไปสมัคร Firebase Push Notification ที่ https://console.firebase.google.com
- เข้าไปที่หน้า 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 ครับ จะได้แบบนี้
ตั้งเวลา
โจทย์ข้อสุดท้ายคือ สามารถตั้งเวลาปิดได้สำหรับเวลาซักผ้า ซึ่งเป็นปัญหาที่ผมนึกวิธีอยู่นานพอสมควร
วิธีที่ใช้คือ
- มี input slider component ตัวหนึ่งให้ลากตั้งเวลาได้
- ทุกๆ 1 นาที slider จะลดค่าลง 1
- เมื่อ slider เหลือ 0 นาที ให้ปิดปั้ม
- เมื่อ slider คือ -1 แสดงว่าไม่ใช้ เพื่อป้องกัน slider เหลือ 0 ค้าง หรือเมื่อต้องการยกเลิก timer
- ให้ 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 ที่แชร์บล็อคนี้ครับ