אתם יודעים ממה לעולם יש מספיק? מאנשים שמדברים על מה שהם הולכים לעשות "יום אחד". חולמים שיושבים בחיבוק ידיים, מחכים לרגע המושלם, להגדרה המושלמת, למה-שלא-יהיה המושלם. בינתיים החיים ממשיכים לרוץ.
"הרגשתי שוב כמה פשוט וצנוע דבר הוא האושר: כוס יין, ערמון קלוי, מנגל עלוב, קול הים. שום דבר אחר." — ניקוס קזנצקיס, זורבה היווני
זורבה לא חיכה. זורבה רקד. זורבה נכשל בצורה מרהיבה וצחק על זה. כשפעולת הכרייה הגדולה שלו קרסה (פשוטו כמשמעו קרסה), הוא תפס בקבוק יין והתחיל לרקוד על החוף. עדיף להיכשל כמו זורבה מאשר לשבת בחיבוק ידיים.
אז היום, הבן שלי ואני מבצעים. התוכנית מוכנה. החומרה מוכנה. רוב הדברים נבדקו בנפרד: האוטומציות עובדות, החיישנים מזהים, הקוד מתקמפל. עכשיו נראה אם הכל עובד ביחד. משהו ישתבש? כנראה. אנחנו מוכנים לאתגרים? בהחלט. זה החלק הכיף.
בלי תוכנית, אין דרך קדימה. רק אנשים שמדברים כדי לשמוע את עצמם. רק חלומות. זה לא חלום, זה תדריך ביצוע.
המשימה
עד שנדליק את הגריל הערב, הבית הזה:
- ידליק אורות בחדר שאתם נכנסים אליו, ויעמעם אותם מאחוריכם כשתצאו
- ינעל כל דלת כשהמיטה תזהה שנרדמנו
- יסגור את המוסך אוטומטית כשנשכח (שוב)
- יתאים את המיזוג בהתאם לאילו חדרים באמת תפוסים
- ייצר רעש WiFi כדי שאף אחד בחוץ לא יוכל להשתמש באותה טכנולוגיית חישה נגדנו
ואמזון לא תדע כלום. הכל רץ מקומית. בלי ענן. בלי מנויים. בלי איסוף נתונים.
המחסן (כבר מוכן)
המוח: Raspberry Pi 5 - מוכן
הדבר הזה ישב על השולחן שלי שבועיים, מוגדר לחלוטין, מחכה להיום. Pi 5 זה מוגזם לאוטומציית בית בסיסית. אני אוהב מוגזם. הוא רץ על Raspberry Pi OS Lite, Docker מותקן, Portainer מזמזם. כל מה שנשאר זה לחבר אותו למקום הקבוע.
בחרתי בחבילת Argon ONE V3 M.2 NVME PCIE Case. כבר מורכב:
- SSD מסוג M.2 עם מערכת ההפעלה מותקנת (בלי תקלות כרטיס SD אצלנו)
- Docker + Portainer מותקנים ונבדקים
- קונטיינר Home Assistant מוכן להתקנה
- IP סטטי מוגדר ברשת
רשימת בדיקה טרום טיסה - הושלמה
- ☑ Raspberry Pi OS Lite מותקן על SSD
- ☑ SSH מופעל, אישורים מוגדרים
- ☑ רשת מוגדרת עם IP סטטי
- ☑ Docker + Portainer רצים
- ☑ קבצי הגדרות Home Assistant מוכנים
החיישנים: לוחות ESP32 - מותקנים ונבדקים
הלוחות הקטנים האלה של ESP32 היו החלק הכיף. הבן שלי ואני בילינו בסופ"ש שעבר להתקין אותם ולראות את נתוני אות ה-WiFi זורמים. הם עובדים. מאושר.
- יחידת חישת WiFi - מזהה תנועה על ידי מדידת שיבוש אות WiFi. בדקנו אותה בהליכה בסלון: מזהה תנועה דרך קירות, טווח של כ-4 עד 6 מטרים.
- יחידת ערפל WiFi - מייצרת רעש כדי לסנוור כל חישת WiFi חיצונית. רצה בבידוד, יוצרת כאוס יפה במרחב האותות.
היום אנחנו משלבים אותם ב-Home Assistant ורואים אם האוטומציות נדלקות כמו שצריך. הקוד עובד בבדיקות. השאלה היא: האם זה עובד כשהכל מחובר?
(אם אתם רוצים את הרקע למה זה חשוב, קראו את המאמרים שלי על חישת WiFi ואמצעי נגד WiFi.)
התשתית הקיימת - כבר במקום
אנחנו לא מתחילים מאפס. לבית כבר יש דברים חכמים; הם פשוט רצים על אפליקציות נפרדות כמו ערימה של איים מנותקים. היום אנחנו מאחדים את הממלכה:
- נורות Philips Hue - כבר מותקנות בכל הבית. כרגע נשלטות דרך אפליקציית Hue. היום: Home Assistant משתלט.
- תרמוסטט Ecobee - כבר יודע אילו חדרים תפוסים דרך החיישנים שלו. היום: משלבים את הנתונים.
- מיטת Eight Sleep - כבר עוקבת מתי אני ישן. היום: מפעילה את אוטומציית הנעילה.
- מנעולי Kwikset (Z-Wave) - כבר על הדלתות. היום: לומדים לנעול את עצמם.
- מוסך MyQ - כבר מותקן. היום: נגמר לנסוע חזרה הביתה כי שכחתי לסגור.
הנקודה: יכול להיות שכבר יש לכם יותר ציוד בית חכם ממה שאתם חושבים. הוא פשוט עדיין לא מדבר אחד עם השני.
שלב 1: תשתית (בוצע)
זו העבודה מסוף השבוע שעבר. אם אתם עוקבים מאוחר יותר, הנה מה שעשינו. אם קראתם את המאמר שלי על Docker, אתם יודעים למה עשינו קונטיינריזציה לכל דבר.
bash# Docker + Portainer - Already running
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-cePortainer פעיל ב-http://raspberrypi.local:9000. ממשק גרפי יפה לניהול קונטיינרים. מסומן.
שלב 2: Home Assistant (המשימה הראשונה של היום)
קובץ ה-docker-compose כתוב. תיקיית ההגדרות מוכנה. היום אנחנו מפעילים באמת ומתחילים לחבר מכשירים.
yaml# docker-compose.yml - ready to deploy
version: '3'
services:
homeassistant:
container_name: homeassistant
image: ghcr.io/home-assistant/home-assistant:stable
volumes:
- /home/pi/homeassistant:/config
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
privileged: true
network_mode: hostהתוכנית: להריץ docker-compose up -d, להיכנס לאשף ההגדרות, ולחבר את האינטגרציות אחת אחת:
- Philips Hue - אמור להתגלות אוטומטית ברשת
- Ecobee - תהליך OAuth, צריך את האפליקציה בהישג יד
- Eight Sleep - אינטגרציית API, אישורים מוכנים
- Z-Wave - זה עלול להיות מסובך, מנעולים יכולים להיות גחמניים
- MyQ - פשוט, כבר עשיתי את זה
- ESPHome - למכשירי ה-ESP32 שהתקנו בסוף השבוע שעבר
אתגר צפוי: Z-Wave. למנעולים תמיד יש גישה. נראה.
שלב 3: שילוב חישת WiFi (החלק הכיף של היום)
יחידת החישה - מוכנה לחיבור
בסוף השבוע שעבר הבן שלי צפה במוניטור הסריאלי בזמן שהדבר הזה זיהה אותי הולך בסלון. המילים המדויקות שלו: "אבא, זה מפחיד ומדהים."
ה-ESP32 כבר מותקן עם ESPHome. הוא כבר מזהה תנועה דרך WiFi CSI (Channel State Information). היום אנחנו מחברים אותו ל-Home Assistant ונותנים לו שם: binary_sensor.living_room_occupied
המבחן: להיכנס לסלון. האם Home Assistant רואה את זה? אם כן, אנחנו בעסק.
יחידת הערפל - שכבת פרטיות מוכנה
ה-ESP32 השני מריץ את מחולל הרעש ממאמר אמצעי הנגד שלי. הוא רץ על שולחן העבודה שלי כבר שבוע, מייצר כאוס יפה בספקטרום ה-WiFi.
כן, אנחנו משתמשים בחישת WiFi לאוטומציה שלנו ובו זמנית מגנים מפני אחרים שעושים את אותו הדבר נגדנו. זו לא צביעות. זו אבטחה מבצעית. והבן שלי חושב שזה הדבר הכי מגניב בעולם.
הרחבה עתידית: 3+3
המטרה של היום היא להוכיח את הקונספט עם חיישן אחד ומכשיר ערפל אחד. ברגע שאנחנו בטוחים:
- 3 מכשירי חישה: סלון, מטבח, חדר שינה
- 3 מכשירי ערפל: מפוזרים בכל הבית לכיסוי מלא
זה בערך 50$ בלוחות ESP32 לשדרוג כל הבית. אבל קודם, בואו נוודא שהיום עובד.
שלב 4: האוטומציות (כל המטרה)
בשביל זה בנינו הכל. קבצי ה-YAML האלה כתובים, נבדקו בראש שלי מאה פעמים, ומוכנים להדבקה. האם הם יעבדו מהניסיון הראשון? בואו נגלה.
אוטומציה 1: תאורת Follow-Me (ההייליט)
החזון: נכנסים לחדר, האורות עולים לקבל את פניכם. יוצאים, והם נעמעמים מאחוריכם כמו באטלר מכובד. הבית של טוני סטארק. זו המטרה.
הניואנס: אם הדלקתם אור ידנית, המערכת משאירה אותו. הבחירה שלכם מכובדת. אנחנו עוקבים אחרי זה עם helpers מסוג input_boolean. כי אין שום דבר יותר גרוע מאוטומציה שנלחמת בכם.
yaml# configuration.yaml additions
input_text:
last_occupied_room:
name: "Last Occupied Room"
initial: "none"
input_boolean:
living_room_auto_triggered:
name: "Living Room Auto Triggered"
kitchen_auto_triggered:
name: "Kitchen Auto Triggered"
bedroom_auto_triggered:
name: "Bedroom Auto Triggered"עכשיו האוטומציה:
yaml# automations.yaml
- alias: "Follow Me - Living Room Entry"
trigger:
- platform: state
entity_id: binary_sensor.living_room_occupied
to: "on"
condition:
- condition: state
entity_id: light.living_room
state: "off"
action:
# Dim the previous room if it was auto-triggered
- choose:
- conditions:
- condition: template
value_template: "{{ states('input_text.last_occupied_room') == 'kitchen' }}"
- condition: state
entity_id: input_boolean.kitchen_auto_triggered
state: "on"
sequence:
- service: light.turn_on
target:
entity_id: light.kitchen
data:
brightness_pct: 20
transition: 3
# Turn on current room
- service: light.turn_on
target:
entity_id: light.living_room
data:
brightness_pct: 100
- service: input_boolean.turn_on
target:
entity_id: input_boolean.living_room_auto_triggered
- service: input_text.set_value
target:
entity_id: input_text.last_occupied_room
data:
value: "living_room"
- alias: "Follow Me - Living Room Vacancy"
trigger:
- platform: state
entity_id: binary_sensor.living_room_occupied
to: "off"
for:
minutes: 2
condition:
- condition: state
entity_id: input_boolean.living_room_auto_triggered
state: "on"
action:
- service: light.turn_off
target:
entity_id: light.living_room
data:
transition: 5
- service: input_boolean.turn_off
target:
entity_id: input_boolean.living_room_auto_triggeredהמבחן: ברגע שזה מותקן, הבן שלי ואני הולכים לעבור בבית ולראות אם זה עוקב אחרינו. אם זה עובד, נרגיש כמו בסרט. אם לא, נעשה דיבאג מעל פיצה.
אוטומציה 2: נעילת לילה (שקט נפשי)
התרחיש: השעה 22:00. אני נכנס למיטה. חמש דקות אחר כך, ה-Eight Sleep מאשר שאני באמת ישן (לא רק שוכב וגולל). הבית מגיב: כל דלת ננעלת, המוסך נסגר אם שכחתי (שוב), התרמוסטט עובר למצב שינה, ואורות שהופעלו אוטומטית נכבים.
yaml- alias: "Bedtime - Eight Sleep Triggered Lockdown"
trigger:
- platform: state
entity_id: binary_sensor.eight_sleep_bed_presence
to: "on"
for:
minutes: 5
condition:
- condition: time
after: "21:00:00"
before: "06:00:00"
action:
# Lock all doors
- service: lock.lock
target:
entity_id:
- lock.front_door
- lock.back_door
# Close garage if open
- service: cover.close_cover
target:
entity_id: cover.garage_door
# Set Ecobee to sleep mode
- service: climate.set_preset_mode
target:
entity_id: climate.ecobee
data:
preset_mode: "Sleep"
# Turn off auto-triggered lights
- service: light.turn_off
target:
entity_id:
- light.living_room
- light.kitchen
data:
transition: 5אין לכם Eight Sleep? החליפו בטריגר מבוסס זמן (22:30) או זיהוי טעינת טלפון. הלוגיקה זהה.
אוטומציה 3: סגירה אוטומטית של המוסך (מציל הנישואים)
הבעיה: "סגרת את המוסך?" - שאלה שנשאלת 3 פעמים בשבוע בבית הזה. לא יותר. אחרי 10 דקות פתוח, הוא נסגר לבד ושולח לי הודעה.
yaml- alias: "Garage - Auto Close After 10 Minutes"
trigger:
- platform: state
entity_id: cover.garage_door
to: "open"
for:
minutes: 10
action:
- service: cover.close_cover
target:
entity_id: cover.garage_door
- service: notify.mobile_app_your_phone
data:
title: "Garage Secured"
message: "Garage was open for 10 minutes. Auto-closed."
data:
tag: "garage-closed"אוטומציה 4: מיזוג חכם (חוסך האנרגיה)
הלוגיקה: למה לחמם בית ריק? כשחיישני ה-WiFi שלנו אומרים שאף אחד לא היה בבית 30 דקות, Ecobee עובר למצב לא בבית. כשמישהו נכנס, הוא מתעורר חזרה.
yaml- alias: "Ecobee - Away When House Empty"
trigger:
- platform: state
entity_id: binary_sensor.home_occupied
to: "off"
for:
minutes: 30
action:
- service: climate.set_preset_mode
target:
entity_id: climate.ecobee
data:
preset_mode: "Away"
- alias: "Ecobee - Home When Occupied"
trigger:
- platform: state
entity_id: binary_sensor.home_occupied
to: "on"
condition:
- condition: state
entity_id: climate.ecobee
attribute: preset_mode
state: "Away"
action:
- service: climate.set_preset_mode
target:
entity_id: climate.ecobee
data:
preset_mode: "Home"יצירת החיישן המצרפי
ה-binary_sensor.home_occupied הוא חיישן template שמשלב את כל חיישני החדרים:
yamltemplate:
- binary_sensor:
- name: "Home Occupied"
state: >
{{ is_state('binary_sensor.living_room_occupied', 'on')
or is_state('binary_sensor.kitchen_occupied', 'on')
or is_state('binary_sensor.bedroom_occupied', 'on') }}מה יכול להשתבש? (החלק הכיף)
הנה העניין: משהו כן ישתבש היום. זה לא פסימיות, זו מציאות. וזה בסדר. זה כל הפואנטה.
מועמדים סבירים להרפתקה של היום:
- מנעולי Z-Wave - לדברים האלה יש גישה. השיוך עלול לדרוש כמה ניסיונות.
- כיול חיישן WiFi - עובד על שולחן העבודה, אבל מה קורה כשהוא במיקום?
- מקרי קצה באוטומציה - מה קורה אם מישהו עובר דרך חדר ב-2 שניות?
- בעיית ה"אתמול זה עבד" - הבדיחה האהובה של הטכנולוגיה.
אבל בשביל זה אנחנו עושים את זה ביחד. אב ובן, פותרים בעיות, לומדים, כנראה מתווכחים למה ה-YAML לא עושה parse. ככה באמת לומדים: בונים משהו אמיתי, רואים אותו נשבר ומתקנים אותו.
המכרה של זורבה קרס. התגובה שלו? לרקוד על החוף. מה שלא ישבר היום, נמצא לזה פתרון. ואם לא נוכל, תהיה לנו סיפור מעולה לארוחת הערב.
הפילוסופיה
הנה מה שמפריד בין העושים לחולמים:
חולמים חוקרים חודשים. הם קוראים כל מאמר. הם מחכים לחומרה "הנכונה". הם מייעלים את התוכנית שלהם עד שהיא מושלמת. הם אף פעם לא מתחילים.
עושים כותבים תוכנית, אוספים מה שהם צריכים, ומבצעים. הם מצפים לאתגרים. הם מתאימים את עצמם תוך כדי תנועה. הם נכשלים קדימה.
בלי תוכנית, אין דרך קדימה: רק אנשים שמדברים כדי לשמוע את עצמם. אבל תוכנית בלי ביצוע היא רק חלום עם צעדים נוספים.
קריטריוני הצלחה להיום
- ☐ Home Assistant רץ עם כל המכשירים מחוברים
- ☐ חיישן WiFi מזהה תנועה בסלון
- ☐ תאורת Follow-me עובדת בלפחות חדר אחד
- ☐ אוטומציית נעילת לילה מופעלת
- ☐ הבן שלי אומר "זה כמו הבית של טוני סטארק"
מה הלאה (אחרי שהיום עובד)
בהנחה שנצליח (ונצליח, בסופו של דבר, גם אם ייקח יותר זמן מהצפוי):
- פריסה מלאה של 3+3 ESP32 - חישה בכל חדר עיקרי, כיסוי ערפל בכל מקום
- טאבלט קיר עם לוח בקרה - פאנל שליטה תמיד דולק במסדרון
- שליטה קולית מקומית - Wyoming/Piper לפקודות קוליות שלא עוזבות את הבית שלכם
- חיישני דליפת מים - מתחת לכל כיור ולצד דוד המים
אבל קודם: היום. קודם: ביצוע. קודם: להוכיח שכל התכנון הזה באמת עובד.
"החיים הם מה שקורה לך בזמן שאתה עסוק לתכנן תוכניות אחרות." - ג'ון לנון
טעות. החיים הם מה שקורה כשאתה מפסיק לתכנן ומתחיל לעשות. נתראה בצד השני. הגיע הזמן לבנות משהו.