تقویم خانوادگی هوشمند DIY (شبیهساز Skylight)

📖 مقدمه
همسرم اخیراً در شبکههای اجتماعی با تبلیغات تقویمهای هوشمند خانگی (Skylight، Cozyla، Hearth) بمباران شده بود و آماده بود بیش از ۳۰۰ دلار برای یکی از آنها هزینه کند. قبل از اینکه اجازه خرید بدهم، از او خواستم فرصتی به من بدهد تا دربارهشان تحقیق کنم.
متوجه شدم که اکثر گزینهها عملکرد مشابهی ارائه میدهند اما تفاوت قابلتوجهی در قیمت دارند. مهمتر از همه، هیچ ویژگی برجستهای ندیدم که نتوانم آن را در Home Assistant پیادهسازی کنم.
هدف: یک تقویم لمسی رومیزی مورد تأیید WAF (عامل پذیرش همسر) که به طور عمیق با خانه هوشمند ما ادغام شود و هیچ هزینه ماهیانهای نداشته باشد.
💡 چرا DIY؟
انتخاب مسیر DIY با Home Assistant مزایای متعددی نسبت به خرید نمایشگر Skylight/Hearth داشت:
- بدون هزینه ماهیانه: از پرداخت حق اشتراک بابت قابلیتهای "پریمیوم" جلوگیری میکند.
- ادغام بیوقفه: با چراغها، وظایف (Grocy) و حسگرهای حضور ارتباط برقرار میکند.
- سختافزار قدیمی: یک مینیپیسی و یک مانیتور استاندارد را دوباره استفاده کردم.
- حریم خصوصی: بدون وابستگی به فروشنده یا ریسک تعطیلی شرکت.
🛠 انتخاب سختافزار
در حال حاضر این پروژه برای نمایش داشبورد روی هر نمایشگر HD (1920x1080) ساخته شده است.
در مورد من، نیاز این بود که "شبیه" Skylight باشد، لمسی باشد، رومیزی باشد و امکان جابجایی به مکانهای مختلف را داشته باشد. بنابراین با سختافزار زیر پیش رفتم. با این حال، شرایط شما ممکن است متفاوت باشد و لازم است آن را بر اساس نیاز خود تنظیم کنید، مثلاً اگر بخواهید آن را روی یک تبلت یا دستگاه دیگر نمایش دهید.
سختافزاری که در ابتدا انتخاب کردم بر اساس موارد بالا بود و همچنین با امید به گسترش قابلیتها با استفاده از وبکم، اسپیکر و میکروفون. اکنون، با نگاه به گذشته، احتمالاً آن را متفاوت میساختم، چون هنوز وقت نکردهام به این ایدههای سختافزاری اضافه رسیدگی کنم.
- مانیتور: مانیتور لمسی ۱۵ اینچی HP Engage. آن را به جای مانیتورهای پرتابل معمولی انتخاب کردم چون دارای اسپیکر، وبکم و میکروفون داخلی است و امکان کنترل صوتی یا تماس تصویری در آینده را فراهم میکند.
- کامپیوتر: یک مینیپیسی قدیمی (NUC/Tiny PC) با ویندوز/لینوکس در حالت Kiosk، یا Raspberry Pi 4.~~
✨ قابلیتها
- نمای خانوادگی و فردی: امکان روشن/خاموش کردن تقویم اعضای خانواده به طور جداگانه.
- همگامسازی دوطرفه: ویرایش رویدادها از روی صفحه یا تلفنهای ما (Google Calendar).
- پنجره "افزودن رویداد": رابط کاربری سفارشی برای افزودن مستقیم رویداد به تقویمهای خاص از روی صفحه.
- آبوهوا و تاریخ: هدر زیبا و قابل مشاهده در یک نگاه.
- واکنشگرا: به طور خودکار تعداد روزهای نمایش را بر اساس عرض صفحه تنظیم میکند (موبایل و دسکتاپ).
⚙️ راهنمای نصب
توجه: این راهاندازی از یک YAML Package استفاده میکند تا تمام دستیارها، اسکریپتها و متغیرهای مورد نیاز را به طور خودکار برای شما ایجاد کند. نیازی به ساخت دستی آنها ندارید.
۱. پیشنیازها (HACS)
شما باید HACS را نصب کرده باشید. لطفاً یکپارچهسازیهای Frontend زیر را نصب کنید:
week-planner-cardbubble-cardconfig-template-cardcard-modbetter-moment-cardweather-cardbrowser_mod(برای عملکرد پاپآپها الزامی است)layout-card(برای نمای Sections الزامی است)button-card(برای پاپآپ افزودن رویداد الزامی است)
۲. بکاند (مغز سیستم)
- فایل
configuration.yamlخود را در Home Assistant باز کنید. - مطمئن شوید که این خط را زیر
homeassistant:برای فعالسازی بستهها اضافه کردهاید:
homeassistant:
packages: !include_dir_named packages
``
- یک پوشه به نام
packages در دایرکتوری تنظیمات HA خود ایجاد کنید (اگر ندارید).
فایل packages/family_calendar.yaml را از این مخزن دانلود کنید.
فایل را داخل پوشه packages/ خود قرار دهید.
Home Assistant را ریستارت کنید. ۳. تقویمها
شما میتوانید از تقویمهای گوگل یا تقویمهای محلی استفاده کنید.
#### گزینه A: تقویم محلی (سادهترین)
توجه داشته باشید که این گزینه تست نشده است زیرا من فقط از تقویمهای گوگل استفاده میکنم
- به تنظیمات > دستگاهها و سرویسها بروید.
- یکپارچهسازی تقویم محلی را اضافه کنید.
- تقویمهایی با نام دقیقاً:
Alice، Bob، Charlie، Daisy، Family ایجاد کنید.
اگر از این نامها استفاده کنید، کد بدون نیاز به تغییر کار میکند!*#### گزینه B: تقویم گوگل
- فایل
packages/family_calendar.yaml را باز کنید.
به بخش اسکریپت add_google_calendar_event بروید.
calendar_map را به گونهای بهروزرسانی کنید که به موجودیتهای واقعی گوگل شما اشاره کند:
`yaml
calendar_map:
"Alice": "calendar.alice_gmail_com"
"Bob": "calendar.bob_work_account"
`#### تنظیم تعطیلات
از آنجایی که Home Assistant بهروزرسانی شده است، تعطیلات اکنون از طریق رابط کاربری اضافه میشوند:
- به تنظیمات > دستگاهها و سرویسها > افزودن یکپارچهسازی > تعطیلات بروید.
- کشور خود را انتخاب کنید.
- شناسه موجودیت (مانند
calendar.holidays) را بررسی کنید. اگر با پیشفرض متفاوت بود، آن را در YAML داشبورد بهروزرسانی کنید.۴. داشبورد (نمای ظاهری)
- یک نمای جدید برای داشبورد ایجاد کنید (نوع نما را روی Sections تنظیم کنید).
- کد را از dashboard.yaml کپی کنید.
- شخصیسازی:
- جستجو و جایگزینی:
person.alice را با موجودیت اعضای خانواده خود جایگزین کنید.
هواشناسی: weather.home را با ارائهدهنده آب و هوای خود جایگزین کنید.
پسزمینه: آدرس تصویر را در انتهای yaml بهروزرسانی کنید. گام ۵: پوسته (اختیاری)
برای دریافت ظاهر فونت خاص (Ovo):
- اطمینان حاصل کنید که در
configuration.yaml شما این خط زیر frontend: قرار دارد.
`yaml
frontend:
themes: !include_dir_merge_named themes
`
- یک پوشه با نام
themes در دایرکتوری پیکربندی خود ایجاد کنید.
فایل themes/skylight.yaml را دانلود کرده و در آن پوشه قرار دهید.
هوم اسیستنت را ریستارت کنید.
به پروفایل خود (آیکون کاربر پایین سمت چپ) بروید و Theme را به Skylight تغییر دهید.
توجه: این تم کامل نیست، پس این موضوع را در نظر داشته باشید.
📐 نحوه عملکرد (در پشت صحنه)
منطق فیلتر
کارت
week-planner-card به طور بومی پشتیبانی از مخفی کردن تقویمهای خاص به صورت لحظهای را ندارد. برای حل این موضوع، از Input Texts به عنوان فیلتر Regex استفاده کردم. وقتی روی دکمه یک نفر کلیک میکنید، فیلتر او بین
. (نمایش همه چیز) و ^$ (نمایش هیچ چیز) جابجا میشود.
- کارت
config-template-card این متغیرها را به صورت داینامیک در کارت تقویم تزریق میکند.اسکریپت ایجاد رویداد
پنجره پاپآپ "افزودن رویداد" از یک اسکریپت واحد استفاده میکند که منطق مربوط به چند نفر و انواع رویدادها (تمام روز در مقابل زمانبندی شده) را مدیریت میکند.
yaml
Simplified Logic Example
target_calendar: "{{ calendar_map.get(states('input_select.calendar_select')) }}"choose:
- conditions: "All Day Event is ON"
- conditions: "All Day Event is OFF"
یادداشتها
پست اولیه من صرفاً برای ارائه یک نمای کلی از نحوه انجام این کار بود تا افراد بتوانند کد را مطابق نیاز خود تنظیم کنند.
به طور خاص من این کار را انجام دادم چون هر نمایشگر و نیازی متفاوت است. من نمیتوانم برای همه اندازههای ممکن نمایشگرها، داشبوردها و غیره توسعه دهم. بنابراین این کد طوری ساخته شده که در نمایشگری که ذکر کردم یا هر نمایشگر دیگری (۱۹۲۰x۱۰۸۰) کار کند ولی باید برای سایر موارد قابل ویرایش باشد.
در مورد نمایشگر، من در ابتدا آن را پیشنهاد دادم چون آن زمان در سایت Woot با تخفیف فروخته میشد و یک روش اقتصادی برای تهیه نمایشگر لمسی بود. شاید اکنون اینطور نباشد، پس هر نمایشگری که برای شما مناسب است استفاده کنید. تبلت، صفحه لمسی، تلفن، هر چیزی. مورد اصلی که باید ویرایش کنید داشبورد است.
--- Tranlated By Open Ai Tx | Last indexed: 2026-01-14 ---