اسکریپت، ماشین حالت، سناریو و آزمایشگاه تست
سه سازوکار اجرایی موتور منطق را از هم تفکیک میکنید، یک اسکریپت زمانبندیشده، یک ماشین حالت و یک سناریو میسازید و پیش از اتکا به آنها، منطق را در آزمایشگاه تست و روی دادهٔ شبیهسازی میسنجید.
«طراحی سیستم» ← «طراحی منطقی» ← «موتور قوانین و اتوماسیون» ← زبانههای «اسکریپتها»، «سناریوها»، «ماشینهای حالت» و «آزمایشگاه تست»
قانون برای «اگر این، آنگاه آن» ساخته شده است. اما کارهای واقعی بهرهبرداری معمولاً ترتیب دارند (پمپ را روشن کن، سی ثانیه صبر کن، شیر را باز کن)، یا حالت دارند (چیلر: خاموش، شارژ، عملیات، تعمیر)، یا یک بستهٔ قابل برگشتاند (حالت تعطیلی ساختمان و بازگرداندن آن). برای این سه، سامانه سه سازوکار جدا دارد: اسکریپت، ماشین حالت و سناریو. و برای اینکه هیچکدام کورکورانه روی تجهیز واقعی اجرا نشود، «آزمایشگاه تست» وجود دارد.
کدام سازوکار برای کدام کار
| سازوکار | مسئلهٔ اصلی | نمونه |
|---|---|---|
| اسکریپت اتوماسیون | توالی گامها با تأخیر، شرط و حلقه | راهاندازی ترتیبی موتورخانه، گزارش هفتگی |
| ماشین حالت | فرآیندی که «الان کجاست» اهمیت دارد | چرخهٔ عمر چیلر، حالتهای UPS، آسانسور |
| سناریو | بستهٔ اقدامها که فعال و بعد بازگردانده میشود | حالت تخلیهٔ اضطراری، حالت خواب ساختمان |
هر سه زبانه چیدمان یکسانی دارند: کادر جستوجو…، دکمهٔ بارگذاری مجدد، دکمهٔ سبز مورد جدید و کارتهایی که نام، توضیح، کلید فعال/غیرفعال، تراشهٔ ID و دکمههای ویرایش و حذف دارند. دکمهٔ اصلی هر کارت فرق میکند: اجرا برای اسکریپت (که هنگام اجرا به توقف تبدیل میشود)، فعالسازی/غیرفعالسازی برای سناریو و Reset برای ماشین حالت.

اسکریپت اتوماسیون
پنجرهٔ ساخت اسکریپت این فیلدها را دارد: نام، توضیحات، نوع محرک (MANUAL، ACV_CHANGE، ACV_CONDITION، SCHEDULE، RULE_FIRED)، ENID محرک، شرط محرک، Cron، مراحل اجرا (JSON) و Action هنگام خطا (JSON).
گامها را با JSON مینویسید. نوعهایی که موتور اجرا میکند:
| نوع گام | فیلدها | کار آن |
|---|---|---|
SET_VALUE | targetEnid و value یا expression | نوشتن مقدار در یک نقطه |
DELAY | delayMs | مکث بین دو گام |
CONDITION | condition، thenSteps، elseSteps | انشعاب شرطی |
LOOP | loopType، count، condition، maxIterations، bodySteps | تکرار گامها |
NOTIFICATION | channel، message، subject، recipients | ارسال پیامک یا ایمیل |
PARALLEL | steps | اجرای همزمان چند گام |
در متن پیام یک گام اعلان میتوانید مقدار لحظهای یک نقطه را با قالب ${ACV['enid']} درج کنید.
ماشین حالت
پنجرهٔ ماشین حالت این فیلدها را دارد: نام، توضیحات، ENID هدف (نقطهای که ماشین را میراند)، شناسه State اولیه، Stateها (JSON)، Transitionها (JSON) و فراداده (JSON). هر حالت id و name دارد و میتواند isInitial، isFinal، timeoutMs، timeoutTargetStateId و اقدامهای ورود و خروج داشته باشد. هر گذار با fromStateId و toStateId مشخص میشود و میتواند نقطهٔ محرک، شرط، نگهبان، نام رویداد و اولویت داشته باشد.

سناریو
پنجرهٔ سناریو این فیلدها را دارد: نام، توضیحات، نوع فعالسازی (MANUAL، RULE، EXPRESSION، SCHEDULE)، عبارت فعالسازی، شرط غیرفعالسازی، زمان وقفه بر حسب دقیقه، شناسه قوانین مرتبط، Actionهای فعالسازی (JSON) و Actionهای غیرفعالسازی (JSON). اقدامها معمولاً به شکل [{"targetEnid":"…","value":"1","delayMs":0}] نوشته میشوند و فهرست غیرفعالسازی معمولاً عکس فهرست فعالسازی است.

گامبهگام
- یک اسکریپت زمانبندیشده بسازید. زبانهٔ اسکریپتها ← مورد جدید. نام را بنویسید (خالی بماند پیام «نام الزامی است.» میگیرید)، نوع محرک را SCHEDULE بگذارید و در Cron مثلاً
0 0 6 * * *بنویسید. برای محرک ACV_CONDITION بهجای Cron، ENID محرک و شرط محرک (مثلACV['<ENID>'] > 30) را پر کنید. - گامها را بنویسید و ذخیره کنید. در مراحل اجرا (JSON) فهرست گامها را وارد کنید. JSON نادرست ذخیره نمیشود و پیام «ساختار JSON معتبر نیست: …» میآید. پس از ذخیره پیام «ذخیره شد» را میبینید.
- اجرای دستی را آگاهانه انجام دهید. دکمهٔ اجرا روی کارت، پرسش تأیید «اسکریپت «…» اجرا شود؟ Actionهای آن ممکن است روی سیستم اثر بگذارند.» را نشان میدهد. پس از تأیید پیام «اجرا شروع شد · ID n» میآید و دکمه به توقف تبدیل میشود. این اجرا واقعی است، نه آزمایشی.
- ماشین حالت را تعریف کنید. زبانهٔ ماشینهای حالت ← مورد جدید. ENID هدف را بگذارید، حالتها را در Stateها (JSON) و گذارها را در Transitionها (JSON) بنویسید. تعریف ناقص ذخیره نمیشود و خطای «Invalid state machine: …» میآید — مثلاً وقتی حالت اولیه تعریف نشده یا گذاری به حالتی ناشناخته اشاره میکند.
- سناریو را بسازید و برگرداندنش را هم بنویسید. زبانهٔ سناریوها ← مورد جدید. نوع فعالسازی را انتخاب کنید (برای EXPRESSION عبارتی مثل
ACV['<دتکتور دود>'] == 1)، هر دو فهرست Action را پر کنید و در صورت نیاز شرط غیرفعالسازی یا زمان وقفه بگذارید. اگر موتور بخشی از تعریف را نتواند اجرا کند، هنگام ذخیره هشدار زرد «ذخیره شد، اما موتور آن را اجرا نمیکند: …» میگیرید — این هشدار را جدی بگیرید. - شبیهساز را همگام کنید. «طراحی سیستم» ← «شبیهساز دستگاهها» و دکمهٔ همگامسازی پروژه. بدون این کار آزمایشگاه تست دادهٔ پروژهٔ شما را ندارد.
- در آزمایشگاه تست ارزیابی کنید. به زبانهٔ آزمایشگاه تست برگردید و بازآوری را بزنید؛ کاشی وضعیت Snapshot باید «آماده» شود. قانون موردنظر را از فهرست قانون پروژه انتخاب و تنظیم و ارزیابی را بزنید تا پنجرهٔ آزمون امن باز شود.

آزمایشگاه تست · کاشی «وضعیت Snapshot»، شمار متغیرها و انتخاب قانون برای ارزیابی؛ هشدار بالای صفحه میگوید Snapshot باید با پروژه همگام شود
نکتهها و اشتباههای رایج
- در همهٔ عبارتها نقطه را با
ACV['ENID']بنویسید؛ عبارتی که هیچ نقطهای را نام نبرد هرگز ارزیابی نمیشود. - موتور فقط گامهای SET_VALUE، DELAY، CONDITION، LOOP، NOTIFICATION و PARALLEL را اجرا میکند؛ نوعهای دیگر بیصدا نادیده گرفته میشوند. اگر گامی اثر نکرد، اول نوع آن را بررسی کنید.
- Action هنگام خطا (JSON) ذخیره میشود ولی در نسخهٔ فعلی اجرا نمیشود؛ رفتار امن در برابر خطا را با گام
CONDITIONدر خود توالی بسازید. - کلید روی کارت سناریو یعنی «تعریف فعال است یا نه»، ولی دکمهٔ فعالسازی یعنی «همین حالا اجرا شود». این دو را با هم اشتباه نگیرید؛ سناریوی غیرفعال نه با محرک و نه دستی اجرا نمیشود.
- در سناریو زمان وقفه برابر ۰ یعنی بدون مهلت؛ سناریو تا غیرفعالسازی دستی یا برقرار شدن شرط غیرفعالسازی فعال میماند.
INTERVAL:کمتر از ۱۰۰۰ میلیثانیه پذیرفته نمیشود و همهٔ زمانها به وقت سرور است.- ماشین حالت از حالتی که در آن مانده ادامه میدهد؛ پس از تغییر تعریف، با Reset آن را به حالت اولیه برگردانید.
- آزمون امن هیچ اقدامی اجرا نمیکند، ولی تغییر واقعی مقدار از کنسول شبیهساز مسیر کامل را طی میکند و میتواند اقدامهای قانونها را اجرا کند. این دو را از هم جدا نگه دارید.
خلاصه
- توالی → اسکریپت، حالت → ماشین حالت، بستهٔ قابل برگشت → سناریو.
- گامها و تعریفها JSONاند؛ ساختار نامعتبر ذخیره نمیشود و هشدار «موتور آن را اجرا نمیکند» یعنی تعریف ذخیره شده ولی بیاثر است.
- سناریوی EXPRESSION فقط در لحظهٔ درستشدن شرط فعال میشود، نه تا وقتی شرط برقرار است.
- اجرای دستی اسکریپت و فعالسازی سناریو واقعیاند؛ آزمایشگاه تست جای تمرین بیخطر است.
- آزمایشگاه تست بدون همگامسازی پروژه در شبیهساز کار نمیکند.
تمرین عملی روی دموی زنده
روی دموی عمومی (هولدینگ ارگ) کار کنید. دکمههای اجرا، فعالسازی و Reset اجرای واقعیاند؛ در این تمرین آنها را نزنید و چیزی را حذف نکنید.
- در زبانهٔ اسکریپتها یک اسکریپت SCHEDULE را با آیکون ویرایش باز کنید. از روی Cron و مراحل اجرا (JSON) بنویسید این اسکریپت چه زمانی و دقیقاً چه کاری میکند، سپس انصراف را بزنید.
- در ماشینهای حالت ماشین حالت چیلر یا UPS را باز کنید و از روی JSON، نمودار حالتها و گذارها را روی کاغذ بکشید و حالت اولیه را مشخص کنید.
- در سناریوها یک سناریو را باز کنید و دو فهرست Action فعالسازی و غیرفعالسازی را مقایسه کنید: آیا غیرفعالسازی همهٔ تغییرها را برمیگرداند؟
- زبانهٔ آزمایشگاه تست را باز کنید و وضعیت کاشی وضعیت Snapshot را یادداشت کنید. اگر «نیازمند همگامسازی» بود، توضیح دهید برای آمادهشدن چه گامی لازم است.
آزمون درس
برای گذراندن درس دستکم به ۳ پرسش از ۴ پرسش پاسخ درست بدهید.
- ۱. سناریویی با نوع فعالسازی EXPRESSION و عبارت ACV['X'] == 1، در حالی که X مدتهاست ۱ است، کِی فعال میشود؟
- ۲. کدام نوع گام در «مراحل اجرا (JSON)» اسکریپت اجرا نمیشود؟
- ۳. ذخیرهٔ ماشین حالتی که گذارش به حالتی ناشناخته اشاره میکند چه نتیجهای دارد؟
- ۴. کاشی «وضعیت Snapshot» در آزمایشگاه تست «نیازمند همگامسازی» است. اول چه باید کرد؟