پرش به مطلب اصلی

وابستگی به وضعیت سایر ابزارها (Cross-Device Dependency)

بسیاری از قابلیت‌های یک ابزار، به‌جای اینکه فقط بر اساس داده‌های داخلی خودش تصمیم بگیرند، به وضعیت یا مقدار یک Operation از ابزار دیگری در همان پروژه نیاز دارند.

این یک قابلیت عمومی است و مخصوص هیچ حوزه خاصی (مثلاً فقط دما، فقط نور، فقط تشخیص حرکت) نیست. هر Operation از هر ابزاری می‌تواند به هر Operation از هر ابزار دیگری وابسته شود؛ طراحی این وابستگی کاملاً به خلاقیت شما به‌عنوان تولیدکننده بستگی دارد.

سوال کشف قابلیت

پیش از پیاده‌سازی، این سوال را از خودتان بپرسید:

آیا قابلیتی از این ابزار، به داده یا وضعیت یک Operation از ابزار دیگری در پروژه نیاز دارد؟

اگر پاسخ مثبت است، صفحه تنظیمات اختصاصی (Dedicated Setting HTML) شما باید به نصاب اجازه دهد این وابستگی را با الگوی زیر انتخاب کند:

اتاق (Room) → ابزار (Device) → Operation

برای پیاده‌سازی این انتخابگر می‌توانید از Api های زیر استفاده کنید که پیش‌تر معرفی شده‌اند:

مثال‌های کاربردی (صرفاً برای الهام‌گیری، نه یک قاعده اجباری)

  • یک رله برد می‌خواهد بر اساس مقدار یک سنسور دمای مجزا، تصمیم بگیرد که یک پمپ را روشن یا خاموش کند.
  • یک تاچ‌اسکرین می‌خواهد مقدار چند سنسور دیگر پروژه (دما، رطوبت، نور) را روی صفحه خودش نمایش دهد.
  • یک کنترلر پرده می‌خواهد بر اساس وضعیت یک سنسور نور، تصمیم بگیرد پرده را ببندد یا باز کند.

مقدار انتخاب‌شده (شناسه اتاق/ابزار/Operation) باید مطابق قواعد صفحه ذخیره‌سازی تنظیمات در تنظیمات ابزار ذخیره شود تا فریمور شما بداند باید به کدام Operation از کدام ابزار گوش دهد.

دو مکانیزم مکمل برای دریافت مقدار: Snapshot در برابر Live

پس از آنکه وابستگی پیکربندی شد، فریمور برای دریافت مقدار Operation دیگر، به دو مکانیزم مکمل نیاز دارد — نه جایگزین یکدیگر:

۱. RequestDeviceLastValue — دریافت آخرین مقدار شناخته‌شده (Snapshot)

این مکانیزم برای دریافت آخرین وضعیت شناخته‌شده یک Operation در همان لحظه استفاده می‌شود؛ برای مثال بلافاصله بعد از بوت شدن ابزار یا اتصال مجدد به سرور، وقتی هنوز هیچ داده‌ی زنده‌ای دریافت نکرده‌اید.

  • درخواست را روی تاپیک projectCode/RequestDeviceLastValue ارسال می‌کنید.
  • پاسخ روی تاپیک projectCode/DeviceLastValue/{deviceSerial} برمی‌گردد.

(تمام تاپیک‌های Direct Device با کد پروژه projectCode namespace می‌شوند.)

اگر سرور مقدار معتبری برای آن Operation نداشته باشد، نباید مقداری حدس زده یا فرضی برای آن در نظر بگیرید؛ تا زمانی که یک مقدار معتبر دریافت نشده، وضعیت آن Operation از دید ابزار شما نامشخص (Unknown) باقی می‌ماند.

۲. ListenToDevice — دریافت به‌روزرسانی‌های زنده (Live)

پس از مقداردهی اولیه با Snapshot، برای ادامه دریافت تغییرات آن Operation به‌صورت لحظه‌ای، باید به‌روزرسانی‌های زنده را دریافت کنید. ListenToDevice تاپیک جداگانه‌ای نیست — یک مقدار tag درون پاکت عمومی General Data است که روی همان تاپیکی که برای دریافت دستورات معمول Subscribe کرده‌اید دریافت می‌شود:

Topic : projectCode/ReceiveGeneralData/{deviceSerial}

پیام‌های این تاپیک، صرف‌نظر از نوع، همیشه یک ساختار ثابت دارند:

{ "tag": "ListenToDevice", "data": "...", "deviceSerial": "..." }

یعنی کافیست ابزار شما روی تاپیک projectCode/ReceiveGeneralData/{deviceSerial} (یا نسخه رمزنگاری‌شده projectCode/ReceiveGeneralData/{deviceSerial}/AES) Subscribe کند و در بین پیام‌های دریافتی، فقط پیام‌هایی را که فیلد tag آن‌ها برابر "ListenToDevice" است پردازش کند.

چه زمانی باید Snapshot گرفت؟

تشخیص اینکه چه زمانی نیاز به یک عکس فوری از وضعیت فعلی است، بر عهده طراح یکپارچه‌سازی است. معمول‌ترین موارد:

  • بوت اولیه ابزار
  • اتصال مجدد بعد از قطعی شبکه/MQTT
  • درخواست دستی رفرش توسط کاربر (مثلاً از طریق صفحه تنظیمات)
  • درست پیش از اجرای یک منطق محلی یا زمان‌بندی‌شده که به آن مقدار وابسته است
  • درست پیش از ارزیابی یک قاعده/شرط که به وضعیت فعلی یک ابزار دیگر نیاز دارد

الگوی پیشنهادی پیاده‌سازی

اگر ابزار شما دارای حداقل یک وابستگی پیکربندی‌شده است:
۱. برای هر وابستگی پیکربندی‌شده → RequestDeviceLastValue ارسال شود
۲. مقدار دریافتی در حافظه محلی (cache) وابستگی‌ها ذخیره شود
۳. سپس روی projectCode/ReceiveGeneralData/{deviceSerial} مشترک شده و پیام‌های با tag برابر ListenToDevice را به‌صورت زنده پردازش شود
نکته

ListenToDevice یک مکانیزم عمومی در سطح پروتکل است و معنای کاربردی هیچ حوزه‌ای (مثل «آستانه دما» یا «تشخیص حرکت») در خود قرارداد آن تعریف نشده است. نمایش مقدار، ذخیره آن، ترکیب چند مقدار، اعمال آستانه، ارزیابی شرط، یا اجرای یک عملیات محلی موجود — همگی تصمیمات سطح محصول شما هستند.

این قابلیت با اجازه سرور کار می‌کند

انتخاب یک ابزار/Operation دیگر در صفحه تنظیمات، به‌تنهایی به معنای دسترسی واقعی نیست. برای جزئیات کامل درباره تایید مالک پروژه (Master)، صفحه کنترل سایر ابزارها و مجوزها را مطالعه کنید.