برنامه نویسی

شبکه وای فای زنجیره ای برای سیستم های کنترل

Summarize this content to 400 words in Persian Lang
این یک استراتژی شبکه برای کنترل دستگاه‌های وای فای ساده که در یک منطقه فیزیکی بزرگ توزیع شده‌اند، بدون نیاز به تکرارکننده توصیف می‌کند. کد Micropython است و سیستم برای شبکه ای از دستگاه های 4MB ESP8266 طراحی شده است. این در ابتدا برای سیستم کنترل گرمایش خانه توسعه داده شد، اما به همان اندازه برای رسیدگی به نیازهای گرمایش صنعتی، آبیاری یا سیستم های مشابه، که در آن چندین دستگاه نیاز به کنترل مرکزی دارند، مناسب است.

پس زمینه

اکثر سیستم های شبکه WiFi در مقیاس کوچک از توپولوژی “ستاره” استفاده می کنند:

با تمام گره های کنترل و حسگر متصل به یک هاب. اغلب یک روتر اینترنت استاندارد. این نزدیک به جایی که کابل ارائه دهنده خدمات وارد ملک می شود، اغلب در گوشه ای دورافتاده قرار دارد. دستگاه‌هایی مانند ESP8266 آنتن‌های کوچکی دارند و در مسافت‌های بسیار کوتاه ضعیف عمل می‌کنند. این به صورت تأخیر در پاسخ‌دهی، بازنشانی‌های مکرر و حتی خرابی نشان داده می‌شود، اما ممکن است تا زمانی که نصب کامل نشده و امضا نشده باشد، قابل توجه نباشد. سپس سیستم به یک کار مجدد زمان بر نیاز دارد.

این مشکل را می توان با استفاده از روترها یا توسعه دهنده های شبکه اضافی، برای تشکیل سیستم “مش” غلبه کرد، اما ممکن است از نظر بصری مزاحم باشند و هزینه و پیچیدگی بیشتری به سیستم اضافه کنند.

در مورد سیستم گرمایش خانه، یک مشکل اضافی وجود داشت، اینکه اگر اتصال اینترنت قطع شود، شبکه NAT محلی نیز از کار می‌افتد و کنترل‌کننده سیستم نمی‌توانست به رله‌ها و دستگاه‌های دیگر دسترسی پیدا کند. برای جلوگیری از این امر، کنترلر با یک رابط وای فای دوم برای ارائه یک LAN خصوصی نصب شد و کل شبکه کنترل روی آن قرار گرفت. در صورت خرابی WAN، سیستم به خودی خود با خوشحالی کار می کند.

این تا حدی خوب کار می‌کند، اما رایانه‌های کوچکی مانند Raspberry/Orange pi فقط می‌توانند تعداد محدودی از دستگاه‌های وای‌فای را پشتیبانی کنند، و با دستگاه‌هایی که خیلی دور هستند و قابل اطمینان کار نمی‌کنند، مقابله نمی‌کند، مگر اینکه روترهای مش اضافه شوند.

یک مشکل ثانویه مربوط به به روز رسانی سیستم عامل داخل دستگاه ها بود. هنگامی که به‌روزرسانی‌ها مورد نیاز بود، لازم بود به‌طور دستی از هر دستگاه بازدید کرده و به‌روزرسانی انجام شود.

این مقاله یک رویکرد ساده و کم‌هزینه را توضیح می‌دهد که در آن دستگاه‌های کنترل‌شده خودشان از تمام شبکه‌های گسترده مراقبت می‌کنند. می تواند تعداد زیادی دستگاه را مدیریت کند و با استفاده از سخت افزار بسیار متوسطی مانند ESP8266 قابل استقرار است. این سیستم از طریق یک آدرس وای فای به کنترلر خود متصل می شود و می توان آن را به طور کامل پیکربندی و قبل از تحویل برای نصب آزمایش کرد. به‌روزرسانی‌های نرم‌افزاری به‌طور بی‌صدا و خودکار از طریق سیستم منتشر می‌شوند.

فشار دهید یا بکشید

در یک سناریوی «فشار»، یک کنترل‌کننده مرکزی وضعیت هر یک از دستگاه‌های کنترل‌شده را تعیین می‌کند و پیام‌ها را از طریق REST، MQTT یا مکانیسم‌های ارتباطی دیگر به هر یک از آنها «هل» می‌کند. این در حالی که کار می کند خوب است، اما زمانی که دستگاه ها آفلاین می شوند و کنترل کننده پاسخ های مورد انتظار خود را دریافت نمی کند، می تواند باعث مشکلات زمان بندی عمده شود.

این سیستم یک استراتژی “کشش” را اتخاذ می کند. مانند قبل، کنترل کننده وضعیت دستگاه ها را تعیین می کند، اما پس از آن این به هر یک از آنها بستگی دارد که هر زمان که می خواهد کنترلر را نظرسنجی کند و بر اساس پاسخی که دریافت می کند، عمل کند. پس از چندین ماه آزمایش هیچ نشانه ای از مشکلات زمان بندی وجود ندارد. گاهی اوقات یک دستگاه تماس خود را از دست می دهد، دچار سرریز حافظه یا مشکل دیگری می شود که باعث می شود ناظر محلی مجبور به تنظیم مجدد شود، اما این تأثیر چندانی بر رفتار کلی سیستم ندارد.

طرح کلی استراتژی

این استراتژی برخی از دستگاه های شبکه را به عنوان رله پیام که داده ها را به و از سایر دستگاه های مجاور منتقل می کند، به کار می گیرد. سپس شبکه به شکل زیر است:

پیاده سازی

استراتژی بر روی بسته ای از اطلاعات ساخته شده توسط کنترل کننده سیستم متمرکز است. کدگذاری شده به عنوان JSON، شامل بخشی برای هر یک از دستگاه های شبکه است که با نام دستگاه کلید می خورد. همچنین حاوی مهر زمانی فعلی و شماره نسخه سیستم عامل سیستم است. بیایید این بسته را “نقشه” بنامیم. در اینجا مثالی از یک سیستم ساده با دو گره رله آورده شده است:

{“Room1“: {“relay“: “off“}, “Room2“: {“relay“: “on“}, “ts“: “1719094849“, “v“: “90“}

محتوای هر بخش دستگاه در نقشه به دستگاه بستگی دارد. یک رله حالت خود را دارد، روشن یا خاموش. یک دماسنج معمولاً به هیچ اطلاعاتی نیاز ندارد زیرا وظیفه آن برگرداندن داده است نه مصرف آن.

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

هنگامی که یک دستگاه راه اندازی می شود، یک “بسته بازگشتی” خالی ایجاد می کند، که آن را برای طول عمر برنامه در حال اجرا نگه می دارد. دستگاه مهر زمانی موجود در آخرین نقشه خروجی را به این بسته اضافه می کند. برای یک رله، این تمام چیزی است که وجود دارد. یک دماسنج نیز دمای فعلی را اضافه می کند. بسته برگشتی به شکل زیر است:

{“Room1“: {“ts”: “1719094849”}}یا{“Thermo1“: {“temp”: “25.3”, “ts”: “1719094849”}}

هنگامی که یک دستگاه از والدین خود نظرسنجی می کند، بسته برگشتی فعلی خود را ارائه می دهد، که شامل بسته های دستگاه های فرزند خود است که در زیر توضیح داده شده است. اگر نظرسنجی متوقف شود یا به هر دلیل دیگری مُهرهای زمانی به‌روزرسانی نشود، کنترل‌کننده می‌تواند با بررسی سن مُهرهای زمانی بازگشتی، متوجه شود مشکلی در سیستم وجود دارد.

افزودن دستگاه های بیشتر

دستگاه هایی مانند ESP8266 و ESP32 می توانند به طور همزمان در حالت Station و در حالت Access Point کار کنند. یعنی می توانند به یک هات اسپات وای فای متصل شوند و در عین حال یکی از خود را منتشر کنند. این هات اسپات های محلی عملکرد محدودی دارند اما معمولا می توانند تا 4 اتصال را پشتیبانی کنند که به ما امکان می دهد سیستم را با اتصال دستگاه ها به یکدیگر به صورت زنجیره ای به جای همه به یک هاب مرکزی گسترش دهیم. در این سیستم، هر دستگاه یک هات اسپات را با یک SSID بر اساس آدرس MAC خودش و یک آدرس IP شبکه متفاوت با آدرسی که به آن متصل است راه اندازی می کند.

هنگامی که یک دستگاه یک درخواست نظرسنجی از یک دستگاه فرزند دریافت می کند، بسته بازگشتی موجود را استخراج می کند و آن را به بسته برگشتی خود اضافه می کند تا در نظرسنجی بعدی به والد خود ارسال شود. برای مثال، اگر Room2 فرزند Room1 است، پس از نظرسنجی Room1 توسط Room2، بسته بازگشتی از Room1 به شکل زیر گسترش می یابد:

{“Room1“: {“ts”: “1719094849”}, “Room2“: {“ts”: “1719093995”}}

همانطور که در امتداد زنجیره به سمت دستگاه نقطه ورود به عقب حرکت می کنیم، بسته برگشتی رشد می کند تا تمام گره ها را شامل شود تا در نهایت در نظرسنجی بعدی به هاب تحویل داده شود.

پس از برخورد با بسته برگشتی، دستگاه با برگرداندن نقشه خروجی فعلی (که از کنترلر آمده) به دستگاه فرزندی که آن را نظرسنجی کرده است، به درخواست نظرسنجی پاسخ می دهد. به این ترتیب نقشه خروجی به همه دستگاه ها منتشر می شود.

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

رفتار هر دستگاه یکسان است، بنابراین پیکربندی سیستم بسیار آسان است. نام دستگاه و SSID والد آن تنها مواردی هستند که از دستگاهی به دستگاه دیگر متفاوت هستند. و به این ترتیب سیستم رشد می‌کند و دستگاه‌هایی به هر دستگاه دیگری متصل می‌شوند که می‌تواند سیگنال وای فای خوبی ارائه دهد.

این سیستم همچنین دارای قابلیت خوش آمدگویی است که بدون نیاز به ردیابی آدرس های IP به صورت دستی عمل کند. دستگاه ها با نام های منحصر به فرد و SSID شناسایی می شوند، که در آن دومی به طور خودکار از آدرس MAC دستگاه ایجاد می شود. هر دستگاه برای هات اسپات خود محدوده آدرس IP را انتخاب می کند که با آدرسی که پدرش استفاده می کند متفاوت است. در سیستم‌های نمونه اولیه، این محدوده‌ها به طور متناوب تغییر می‌کنند 172.24.100.x و 172.24.101.x. هر دستگاه از یکی یا دیگری استفاده می کند.

ایجاد یک صفحه گسترده ساده برای ثبت جزئیات ضروری سیستم، به عنوان راهنما در هنگام نصب و هنگام تعمیر و نگهداری، اغلب مفید خواهد بود. جدولی برای سیستم گرمایش خانه به شرح زیر است:

در این مثال، Request دستگاه ورود است. (در اینجا این رله است که کنترل می کند بویلر – یا در این مورد پمپ حرارتی – باید کار کند. وقتی رادیاتور روشن است روشن است.)

بررسی قدرت سیگنال در یک مکان خاص با استفاده از هر رایانه یا تلفن هوشمند، برای تصمیم گیری اینکه کدام دستگاه می تواند به کدام والدین متصل شود، بسیار ساده است. وقتی رایانه شما به نقطه اتصال دستگاه متصل می شود، آدرس دروازه (که هشتمین آن است 1به عنوان مثال 172.24.100.1) یک سرور HTTP کوچک را اجرا می کند که اطلاعات اولیه دستگاه را برمی گرداند. نام آن، SSID، والد و مدت زمان راه‌اندازی آن.

به روز رسانی های Over The Air (OTA).

شماره نسخه ارائه شده توسط هاب برای به روز نگه داشتن سیستم عامل سیستم استفاده می شود. هر دستگاه یک یادداشت از نسخه فعلی خود نگه می دارد. هنگامی که یک بسته پیام (نقشه) با شماره نسخه بالاتر وارد می‌شود، دستگاه فهرستی از فایل‌ها را از والدین خود درخواست می‌کند و سپس هر یک از فایل‌های فهرست شده را یکی یکی درخواست می‌کند. پس از اتمام به روز رسانی، شماره نسخه جدید را ذخیره می کند.

در حالی که به روز رسانی در حال انجام است، عملکرد عادی به حالت تعلیق درآمده است. مشتریان یک دستگاه پاسخی به نظرسنجی خود دریافت نخواهند کرد و در نهایت زمان سپری شده و خود را بازنشانی می کنند. پس از اتمام به‌روزرسانی، دستگاه عملکرد عادی خود را مجدداً راه‌اندازی می‌کند و زمانی که نقشه را از والدین خود دریافت کرد، آن را ارسال می‌کند. از آنجایی که اکنون شامل یک شماره نسخه به روز شده است، هر یک از مشتریان آن به روز رسانی خود را شروع می کند. بنابراین آخرین نسخه در سیستم موج می زند و همه با یک کد به پایان می رسند.

اگر سیستم ترکیبی از انواع مختلف دستگاه باشد، کد همه آنها باید در هر کدام موجود باشد. بنابراین یک رله حاوی کد دماسنج است و بالعکس.

نقاط مثبت

توانایی مدیریت تعداد زیادی دستگاه که در یک منطقه فیزیکی بزرگ پخش شده اند
بدون لکه های سیاه وای فای
تمام آدرس های IP توسط خود دستگاه ها استنباط می شوند
هزینه بسیار کم
پروتکل پیام رسانی انعطاف پذیر است. می توان آن را برای افزودن تبادل اطلاعات پیچیده تر، بدون هیچ گونه مشکل سازگاری گسترش داد.

جنبه های منفی

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

دستگاهی که این کد روی آن اجرا می شود، معمولاً یک ESP8266، باید حداقل 4M بایت حافظه فلش داشته باشد تا از مجموعه کامل ماژول های Micropython مورد نیاز پشتیبانی کند – مهمتر از همه، توابع ناهمزمان. اگر از ESP-01 استفاده می کنید، حتما نسخه 4 مگابایتی را تهیه کنید، نه نسخه قدیمی تر 1 مگابایتی.

از آنجایی که این یک پروژه در حال انجام است، هر کدی که در اینجا ارائه می کنم به سرعت قدیمی می شود. بنابراین، به جای آن، در اینجا پیوندی به مخزن GitHub وجود دارد که شامل تمام فایل های منبع اشاره شده در پاراگراف های زیر است:(https://github.com/easycoder/rbr/blob/main/roombyroom/Controller/home/orangepi/firmware/XR)

مانند تمام پروژه های Micropython یک فایل بوت و یک برنامه اصلی وجود دارد. اول، boot.py:

from machine import Pin

led = Pin(2, Pin.OUT)
led.on()

import esp
esp.osdebug(None)

import gc
gc.collect()

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این کاملا استاندارد است. بعد، main.py، که همیشه به صورت خودکار به دنبال آن اجرا می شود boot.py:

import os

def fileExists(filename):
try:
os.stat(filename)
return True
except OSError:
return False

if fileExists(‘config.json’):
if fileExists(‘update’):
import updater
f = open(‘update’,’r’)
value=f.read()
f.close()
updater.run(value)
else:
import configured
configured.run()
else:
import unconfigured
unconfigured.run()

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالت کار با چند فایلی که در فلش دستگاه نگهداری می شوند تعیین می شود. فایل config.json حاوی اطلاعات خاص این دستگاه است. اگر این فایل وجود نداشته باشد، دستگاه پیکربندی نشده است. اگر وجود داشته باشد، دستگاه پیکربندی شده و آماده اجرا در نظر گرفته می شود. در مورد دوم، پرونده update بررسی می شود؛ اگر این مورد نیز وجود داشته باشد، دستگاه وارد حالت به‌روزرسانی می‌شود، که در آخر به آن خواهم پرداخت.

توجه داشته باشید که ماژول های تابع اصلی فقط در صورتی فراخوانی می شوند که برای حالت انتخابی مورد نیاز باشند. این از بارگیری همه چیز از جلو در زمانی که بسیاری از آنها بلااستفاده می ماند جلوگیری می کند.

حالت پیکربندی نشده

این حالت توسط unconfigured.py. حالت اختیاری است. اگر شما ارائه دهید config.json فایل به صورت دستی دستگاه هرگز بدون پیکربندی اجرا نمی شود. به گونه ای وجود دارد که می توان دسته ای از دستگاه ها را با سیستم عامل یکسان فلش کرد و سپس هر کدام را به صورت جداگانه با استفاده از یک مرورگر پیکربندی کرد.

وظیفه ماژول اجرای یک وب سرور است که یک فرم پیکربندی برای ارائه داده های پیکربندی به کاربر ارائه می دهد. در بالا چند صفحه HTML، سپس برخی از توابع کاربردی و در نهایت کد اصلی وجود دارد.

ویژگی کلیدی استفاده از توابع ناهمزمان برای اجازه چندوظیفه ای است. این برنامه 2 کار را اجرا می کند. یکی منتظر می ماند تا یک کلاینت وصل شود و دیگری LED را چشمک می زند. از آنجایی که هیچ یک از اینها نمی توانند مسدود شوند، کد ناهمزمان مورد نیاز است. اولین کار این است که دو کار را با استفاده از asyncio ایجاد کنید، سپس در حین انجام وظایف خود وارد یک حلقه بی پایان شوید.

کد یک وب سرور را راه اندازی می کند که SSID آن از این شکل است RBR-xr-xxxxxx، کجا RBR-xr- توصیفگر محصول است و xxxxxx 6 رقم آخر مک آدرس دستگاه هستند. آدرس IP سرور است 192.168.66.1 (یا هر چیز دیگری که شما ترجیح می دهید). اتصال به آن در http://192.168.66.1/config صفحه زیر را نشان می دهد:

فیلدها به شرح زیر است:

نام رله: هر نامی که به طور منحصر به فرد این رله را در شبکه شناسایی کند. فضاها مجاز نیست.SSID میزبان: SSID دستگاهی که این دستگاه باید به آن متصل شود.رمز عبور میزبان: رمز وای فای هاست.رمز عبور من: رمز عبور Wifi که اجازه دسترسی به سرور این دستگاه را پس از پیکربندی می دهد.

چه زمانی راه اندازی کلیک می شود، فیلدها در یک ساختار JSON ترکیب شده و در ناحیه فلاش دستگاه ذخیره می شوند config.json. سپس دستگاه خود را ریست می کند. اگر همه چیز خوب باشد باید در حالت پیکربندی مجدد راه اندازی شود.

حالت پیکربندی شده

این حالت توسط configured.py. همانند حالت پیکربندی نشده، کد وظایف همزمان را با استفاده از کتابخانه asyncio اجرا می کند. یکی از این وظایف برنامه اصلی است. دیگری یک ناظر است که بر فعالیت نظارت می کند تا اطمینان حاصل کند که نظرسنجی طبق انتظار انجام می شود. اگر به هر دلیلی متوقف شود (مانند آفلاین شدن هاست دستگاه)، ناظر پس از یک فاصله زمانی مناسب، بازنشانی را مجبور می کند. این کار از بازنشانی های غیر ضروری در هنگام بروز خرابی های لحظه ای جلوگیری می کند.

بسیاری از توابع مورد نیاز کد – به غیر از کتابخانه های استاندارد – در دو ماژول محلی نگهداری می شوند. functions.py و hardware.py. اینها بعدا توضیح داده خواهد شد.

برنامه اصلی با انجام مقداری مقداردهی اولیه شروع می شود. دو شیء خاص فرهنگ لغت – outgoingMap و incomingMap – نگه داشتن داده های در حال عبور در سراسر شبکه. هر دوی اینها، پس از ایجاد، تا زمانی که برنامه در حال اجرا است، دوام می آورند. یک نقطه دسترسی (Hotspot) برای سایر دستگاه ها تنظیم شده است تا به عنوان بخشی از زنجیره پیام از آن استفاده کنند.

این کد همچنین یک نقطه دسترسی محلی (Hotspot) را با یک SSID تنظیم می‌کند که مشابه چیزی است که در حالت پیکربندی شده استفاده می‌شود اما یکسان نیست. در این مثال خواهد بود RBR-XR-xxxxxx، کجا xxxxxx مانند قبل از 6 رقم آخر آدرس MAC است. از آنجایی که دو تا از نویسه‌های توصیف‌گر محصول اکنون با حروف بزرگ هستند، یافتن دستگاه در لیستی از نقاط دسترسی محلی آسان است.

در حلقه اصلی، کد در فواصل زمانی معین از دستگاه والد خود نظرسنجی می کند و آن را ارسال می کند incomingMap. پاسخ از والدین – outgoingMap – برای یافتن اینکه رله محلی باید روشن یا خاموش باشد تجزیه می شود. شماره نسخه در outgoingMap با آنچه در حال حاضر ذخیره شده مقایسه می شود، و اگر پیشرفتی صورت گرفته باشد، دستگاه یک فایل به روز رسانی ایجاد می کند و مجبور به تنظیم مجدد می شود.

هنگامی که یک دستگاه مشتری این مورد را نظرسنجی می کند، درخواست ورودی برای یافتن فرمان و داده های آن (در صورت وجود) تجزیه می شود. فرمت درخواست یکی از

http://(my ip address)/command
http://(my ip address)/command?data

دستورات شناسایی شده به شرح زیر است:

reboot کد را مجبور به راه اندازی مجدد می کند.reset فایل پیکربندی را پاک می کند و سپس راه اندازی مجدد را مجبور می کند و باعث می شود دستگاه در حالت پیکربندی نشده راه اندازی مجدد شود.getFile?{filename} درخواستی برای بازگرداندن محتویات فایل نامگذاری شده است. این توسط به روز رسانی استفاده می شود.poll?data={incomingMap} با ارائه نقشه ورودی (یا بخشی از آن که برای این دستگاه شناخته شده است) از مادر این دستگاه نظرسنجی کنید. نقشه خروجی به تماس گیرنده برگردانده می شود.

هر دستور دیگری یک خط از اطلاعات کلی در مورد دستگاه و وضعیت آن را برمی گرداند.

ماژول های “توابع”.

مجموعه ای از توابع کمکی در آن نگهداری می شود functions.py و hardware.py. اینها به عنوان دو فایل برای جلوگیری از تمام شدن حافظه در طول به روز رسانی ارائه می شوند.

یک کتابخانه شخص ثالث، uaiohttpclient، که درخواست های HTTP ناهمزمان را مدیریت می کند، در دایرکتوری lib قرار می گیرد.

حالت به روز رسانی

این حالت توسط updater.py. به روز رسانی وظیفه اصلی خود و یک نگهبان را اجرا می کند. کار اصلی با درخواست از دستگاه والد خود، فهرستی از تمام فایل‌هایی که مجموعه کد را تشکیل می‌دهند، شروع می‌شود. این لیست به عنوان ذخیره می شود files.txt، سپس هر یک از فایل های نامگذاری شده درخواست می شود. وقتی همه با موفقیت بررسی شدند، شماره نسخه جدید ذخیره می شود.

مکانیسم پردازش هر فایل باید قوی باشد و بتواند خطاها را بازیابی کند. روال به شرح زیر است:

1 فایل درخواستی را دانلود کرده و به عنوان فایل موقت ذخیره کنید.1 فایل ذخیره شده را بخوانید و بررسی کنید که با داده های دانلود شده یکسان باشد. اگر نه، به زور ریست کنید.1 اگر فایلی با نام درخواستی موجود نیست، نام فایل موقت را تغییر داده و برگردانید.1 اگر فایلی موجود است، آن را بخوانید و با فایل دانلود شده مقایسه کنید. اگر آنها یکسان هستند، نیازی به به روز رسانی نیست، بنابراین فایل موقت را حذف کرده و برگردانید.1 اگر آنها متفاوت هستند، نسخه فعلی (قدیمی) را حذف کنید، نام فایل موقت را تغییر دهید و برگردانید.

کار آینده

این سیستم نسبت به محیطی که در آن کار می‌کند، نادان است. در نمونه‌های اولیه، هاب یک کامپیوتر کوچک مانند Raspberry یا Orange Pi است که کنترل آن توسط یک ماژول PHP در یک وب سرور آپاچی انجام می‌شود. یک گام مفید بعدی ایجاد یک ادغام برای Home Assistant خواهد بود. یک ماژول هاب – احتمالاً خودش یک ESP8266 است – زنجیره کاملی از دستگاه‌ها را مدیریت می‌کند و آنها را به عنوان یک آیتم از طریق MQTT به HA ارائه می‌کند. یک API مناسب به هر دستگاه نامگذاری شده در زنجیره اجازه می دهد تا به طور مستقل از طریق هاب آدرس دهی و کنترل شود.

این یک استراتژی شبکه برای کنترل دستگاه‌های وای فای ساده که در یک منطقه فیزیکی بزرگ توزیع شده‌اند، بدون نیاز به تکرارکننده توصیف می‌کند. کد Micropython است و سیستم برای شبکه ای از دستگاه های 4MB ESP8266 طراحی شده است. این در ابتدا برای سیستم کنترل گرمایش خانه توسعه داده شد، اما به همان اندازه برای رسیدگی به نیازهای گرمایش صنعتی، آبیاری یا سیستم های مشابه، که در آن چندین دستگاه نیاز به کنترل مرکزی دارند، مناسب است.

پس زمینه

اکثر سیستم های شبکه WiFi در مقیاس کوچک از توپولوژی “ستاره” استفاده می کنند:

توپولوژی ستاره ای

با تمام گره های کنترل و حسگر متصل به یک هاب. اغلب یک روتر اینترنت استاندارد. این نزدیک به جایی که کابل ارائه دهنده خدمات وارد ملک می شود، اغلب در گوشه ای دورافتاده قرار دارد. دستگاه‌هایی مانند ESP8266 آنتن‌های کوچکی دارند و در مسافت‌های بسیار کوتاه ضعیف عمل می‌کنند. این به صورت تأخیر در پاسخ‌دهی، بازنشانی‌های مکرر و حتی خرابی نشان داده می‌شود، اما ممکن است تا زمانی که نصب کامل نشده و امضا نشده باشد، قابل توجه نباشد. سپس سیستم به یک کار مجدد زمان بر نیاز دارد.

این مشکل را می توان با استفاده از روترها یا توسعه دهنده های شبکه اضافی، برای تشکیل سیستم “مش” غلبه کرد، اما ممکن است از نظر بصری مزاحم باشند و هزینه و پیچیدگی بیشتری به سیستم اضافه کنند.

در مورد سیستم گرمایش خانه، یک مشکل اضافی وجود داشت، اینکه اگر اتصال اینترنت قطع شود، شبکه NAT محلی نیز از کار می‌افتد و کنترل‌کننده سیستم نمی‌توانست به رله‌ها و دستگاه‌های دیگر دسترسی پیدا کند. برای جلوگیری از این امر، کنترلر با یک رابط وای فای دوم برای ارائه یک LAN خصوصی نصب شد و کل شبکه کنترل روی آن قرار گرفت. در صورت خرابی WAN، سیستم به خودی خود با خوشحالی کار می کند.

این تا حدی خوب کار می‌کند، اما رایانه‌های کوچکی مانند Raspberry/Orange pi فقط می‌توانند تعداد محدودی از دستگاه‌های وای‌فای را پشتیبانی کنند، و با دستگاه‌هایی که خیلی دور هستند و قابل اطمینان کار نمی‌کنند، مقابله نمی‌کند، مگر اینکه روترهای مش اضافه شوند.

یک مشکل ثانویه مربوط به به روز رسانی سیستم عامل داخل دستگاه ها بود. هنگامی که به‌روزرسانی‌ها مورد نیاز بود، لازم بود به‌طور دستی از هر دستگاه بازدید کرده و به‌روزرسانی انجام شود.

این مقاله یک رویکرد ساده و کم‌هزینه را توضیح می‌دهد که در آن دستگاه‌های کنترل‌شده خودشان از تمام شبکه‌های گسترده مراقبت می‌کنند. می تواند تعداد زیادی دستگاه را مدیریت کند و با استفاده از سخت افزار بسیار متوسطی مانند ESP8266 قابل استقرار است. این سیستم از طریق یک آدرس وای فای به کنترلر خود متصل می شود و می توان آن را به طور کامل پیکربندی و قبل از تحویل برای نصب آزمایش کرد. به‌روزرسانی‌های نرم‌افزاری به‌طور بی‌صدا و خودکار از طریق سیستم منتشر می‌شوند.

فشار دهید یا بکشید

در یک سناریوی «فشار»، یک کنترل‌کننده مرکزی وضعیت هر یک از دستگاه‌های کنترل‌شده را تعیین می‌کند و پیام‌ها را از طریق REST، MQTT یا مکانیسم‌های ارتباطی دیگر به هر یک از آنها «هل» می‌کند. این در حالی که کار می کند خوب است، اما زمانی که دستگاه ها آفلاین می شوند و کنترل کننده پاسخ های مورد انتظار خود را دریافت نمی کند، می تواند باعث مشکلات زمان بندی عمده شود.

این سیستم یک استراتژی “کشش” را اتخاذ می کند. مانند قبل، کنترل کننده وضعیت دستگاه ها را تعیین می کند، اما پس از آن این به هر یک از آنها بستگی دارد که هر زمان که می خواهد کنترلر را نظرسنجی کند و بر اساس پاسخی که دریافت می کند، عمل کند. پس از چندین ماه آزمایش هیچ نشانه ای از مشکلات زمان بندی وجود ندارد. گاهی اوقات یک دستگاه تماس خود را از دست می دهد، دچار سرریز حافظه یا مشکل دیگری می شود که باعث می شود ناظر محلی مجبور به تنظیم مجدد شود، اما این تأثیر چندانی بر رفتار کلی سیستم ندارد.

طرح کلی استراتژی

این استراتژی برخی از دستگاه های شبکه را به عنوان رله پیام که داده ها را به و از سایر دستگاه های مجاور منتقل می کند، به کار می گیرد. سپس شبکه به شکل زیر است:

یک توپولوژی زنجیره ای

پیاده سازی

استراتژی بر روی بسته ای از اطلاعات ساخته شده توسط کنترل کننده سیستم متمرکز است. کدگذاری شده به عنوان JSON، شامل بخشی برای هر یک از دستگاه های شبکه است که با نام دستگاه کلید می خورد. همچنین حاوی مهر زمانی فعلی و شماره نسخه سیستم عامل سیستم است. بیایید این بسته را “نقشه” بنامیم. در اینجا مثالی از یک سیستم ساده با دو گره رله آورده شده است:

{“Room1“: {“relay“: “off“}, “Room2“: {“relay“: “on“}, “ts“: “1719094849“, “v“: “90“}

محتوای هر بخش دستگاه در نقشه به دستگاه بستگی دارد. یک رله حالت خود را دارد، روشن یا خاموش. یک دماسنج معمولاً به هیچ اطلاعاتی نیاز ندارد زیرا وظیفه آن برگرداندن داده است نه مصرف آن.

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

هنگامی که یک دستگاه راه اندازی می شود، یک “بسته بازگشتی” خالی ایجاد می کند، که آن را برای طول عمر برنامه در حال اجرا نگه می دارد. دستگاه مهر زمانی موجود در آخرین نقشه خروجی را به این بسته اضافه می کند. برای یک رله، این تمام چیزی است که وجود دارد. یک دماسنج نیز دمای فعلی را اضافه می کند. بسته برگشتی به شکل زیر است:

{“Room1“: {“ts”: “1719094849”}}
یا
{“Thermo1“: {“temp”: “25.3”, “ts”: “1719094849”}}

هنگامی که یک دستگاه از والدین خود نظرسنجی می کند، بسته برگشتی فعلی خود را ارائه می دهد، که شامل بسته های دستگاه های فرزند خود است که در زیر توضیح داده شده است. اگر نظرسنجی متوقف شود یا به هر دلیل دیگری مُهرهای زمانی به‌روزرسانی نشود، کنترل‌کننده می‌تواند با بررسی سن مُهرهای زمانی بازگشتی، متوجه شود مشکلی در سیستم وجود دارد.

افزودن دستگاه های بیشتر

دستگاه هایی مانند ESP8266 و ESP32 می توانند به طور همزمان در حالت Station و در حالت Access Point کار کنند. یعنی می توانند به یک هات اسپات وای فای متصل شوند و در عین حال یکی از خود را منتشر کنند. این هات اسپات های محلی عملکرد محدودی دارند اما معمولا می توانند تا 4 اتصال را پشتیبانی کنند که به ما امکان می دهد سیستم را با اتصال دستگاه ها به یکدیگر به صورت زنجیره ای به جای همه به یک هاب مرکزی گسترش دهیم. در این سیستم، هر دستگاه یک هات اسپات را با یک SSID بر اساس آدرس MAC خودش و یک آدرس IP شبکه متفاوت با آدرسی که به آن متصل است راه اندازی می کند.

هنگامی که یک دستگاه یک درخواست نظرسنجی از یک دستگاه فرزند دریافت می کند، بسته بازگشتی موجود را استخراج می کند و آن را به بسته برگشتی خود اضافه می کند تا در نظرسنجی بعدی به والد خود ارسال شود. برای مثال، اگر Room2 فرزند Room1 است، پس از نظرسنجی Room1 توسط Room2، بسته بازگشتی از Room1 به شکل زیر گسترش می یابد:

{“Room1“: {“ts”: “1719094849”}, “Room2“: {“ts”: “1719093995”}}

همانطور که در امتداد زنجیره به سمت دستگاه نقطه ورود به عقب حرکت می کنیم، بسته برگشتی رشد می کند تا تمام گره ها را شامل شود تا در نهایت در نظرسنجی بعدی به هاب تحویل داده شود.

پس از برخورد با بسته برگشتی، دستگاه با برگرداندن نقشه خروجی فعلی (که از کنترلر آمده) به دستگاه فرزندی که آن را نظرسنجی کرده است، به درخواست نظرسنجی پاسخ می دهد. به این ترتیب نقشه خروجی به همه دستگاه ها منتشر می شود.

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

رفتار هر دستگاه یکسان است، بنابراین پیکربندی سیستم بسیار آسان است. نام دستگاه و SSID والد آن تنها مواردی هستند که از دستگاهی به دستگاه دیگر متفاوت هستند. و به این ترتیب سیستم رشد می‌کند و دستگاه‌هایی به هر دستگاه دیگری متصل می‌شوند که می‌تواند سیگنال وای فای خوبی ارائه دهد.

این سیستم همچنین دارای قابلیت خوش آمدگویی است که بدون نیاز به ردیابی آدرس های IP به صورت دستی عمل کند. دستگاه ها با نام های منحصر به فرد و SSID شناسایی می شوند، که در آن دومی به طور خودکار از آدرس MAC دستگاه ایجاد می شود. هر دستگاه برای هات اسپات خود محدوده آدرس IP را انتخاب می کند که با آدرسی که پدرش استفاده می کند متفاوت است. در سیستم‌های نمونه اولیه، این محدوده‌ها به طور متناوب تغییر می‌کنند 172.24.100.x و 172.24.101.x. هر دستگاه از یکی یا دیگری استفاده می کند.

ایجاد یک صفحه گسترده ساده برای ثبت جزئیات ضروری سیستم، به عنوان راهنما در هنگام نصب و هنگام تعمیر و نگهداری، اغلب مفید خواهد بود. جدولی برای سیستم گرمایش خانه به شرح زیر است:

پیکربندی سیستم

در این مثال، Request دستگاه ورود است. (در اینجا این رله است که کنترل می کند بویلر – یا در این مورد پمپ حرارتی – باید کار کند. وقتی رادیاتور روشن است روشن است.)

بررسی قدرت سیگنال در یک مکان خاص با استفاده از هر رایانه یا تلفن هوشمند، برای تصمیم گیری اینکه کدام دستگاه می تواند به کدام والدین متصل شود، بسیار ساده است. وقتی رایانه شما به نقطه اتصال دستگاه متصل می شود، آدرس دروازه (که هشتمین آن است 1به عنوان مثال 172.24.100.1) یک سرور HTTP کوچک را اجرا می کند که اطلاعات اولیه دستگاه را برمی گرداند. نام آن، SSID، والد و مدت زمان راه‌اندازی آن.

به روز رسانی های Over The Air (OTA).

شماره نسخه ارائه شده توسط هاب برای به روز نگه داشتن سیستم عامل سیستم استفاده می شود. هر دستگاه یک یادداشت از نسخه فعلی خود نگه می دارد. هنگامی که یک بسته پیام (نقشه) با شماره نسخه بالاتر وارد می‌شود، دستگاه فهرستی از فایل‌ها را از والدین خود درخواست می‌کند و سپس هر یک از فایل‌های فهرست شده را یکی یکی درخواست می‌کند. پس از اتمام به روز رسانی، شماره نسخه جدید را ذخیره می کند.

در حالی که به روز رسانی در حال انجام است، عملکرد عادی به حالت تعلیق درآمده است. مشتریان یک دستگاه پاسخی به نظرسنجی خود دریافت نخواهند کرد و در نهایت زمان سپری شده و خود را بازنشانی می کنند. پس از اتمام به‌روزرسانی، دستگاه عملکرد عادی خود را مجدداً راه‌اندازی می‌کند و زمانی که نقشه را از والدین خود دریافت کرد، آن را ارسال می‌کند. از آنجایی که اکنون شامل یک شماره نسخه به روز شده است، هر یک از مشتریان آن به روز رسانی خود را شروع می کند. بنابراین آخرین نسخه در سیستم موج می زند و همه با یک کد به پایان می رسند.

اگر سیستم ترکیبی از انواع مختلف دستگاه باشد، کد همه آنها باید در هر کدام موجود باشد. بنابراین یک رله حاوی کد دماسنج است و بالعکس.

نقاط مثبت

  • توانایی مدیریت تعداد زیادی دستگاه که در یک منطقه فیزیکی بزرگ پخش شده اند
  • بدون لکه های سیاه وای فای
  • تمام آدرس های IP توسط خود دستگاه ها استنباط می شوند
  • هزینه بسیار کم
  • پروتکل پیام رسانی انعطاف پذیر است. می توان آن را برای افزودن تبادل اطلاعات پیچیده تر، بدون هیچ گونه مشکل سازگاری گسترش داد.

جنبه های منفی

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

دستگاهی که این کد روی آن اجرا می شود، معمولاً یک ESP8266، باید حداقل 4M بایت حافظه فلش داشته باشد تا از مجموعه کامل ماژول های Micropython مورد نیاز پشتیبانی کند – مهمتر از همه، توابع ناهمزمان. اگر از ESP-01 استفاده می کنید، حتما نسخه 4 مگابایتی را تهیه کنید، نه نسخه قدیمی تر 1 مگابایتی.

از آنجایی که این یک پروژه در حال انجام است، هر کدی که در اینجا ارائه می کنم به سرعت قدیمی می شود. بنابراین، به جای آن، در اینجا پیوندی به مخزن GitHub وجود دارد که شامل تمام فایل های منبع اشاره شده در پاراگراف های زیر است:
(https://github.com/easycoder/rbr/blob/main/roombyroom/Controller/home/orangepi/firmware/XR)

مانند تمام پروژه های Micropython یک فایل بوت و یک برنامه اصلی وجود دارد. اول، boot.py:

from machine import Pin

led = Pin(2, Pin.OUT)
led.on()

import esp
esp.osdebug(None)

import gc
gc.collect()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این کاملا استاندارد است. بعد، main.py، که همیشه به صورت خودکار به دنبال آن اجرا می شود boot.py:

import os

def fileExists(filename):
    try:
        os.stat(filename)
        return True
    except OSError:
        return False

if fileExists('config.json'):
    if fileExists('update'):
        import updater
        f = open('update','r')
        value=f.read()
        f.close()
        updater.run(value)
    else:
        import configured
        configured.run()
else:
    import unconfigured
    unconfigured.run()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالت کار با چند فایلی که در فلش دستگاه نگهداری می شوند تعیین می شود. فایل config.json حاوی اطلاعات خاص این دستگاه است. اگر این فایل وجود نداشته باشد، دستگاه پیکربندی نشده است. اگر وجود داشته باشد، دستگاه پیکربندی شده و آماده اجرا در نظر گرفته می شود. در مورد دوم، پرونده update بررسی می شود؛ اگر این مورد نیز وجود داشته باشد، دستگاه وارد حالت به‌روزرسانی می‌شود، که در آخر به آن خواهم پرداخت.

توجه داشته باشید که ماژول های تابع اصلی فقط در صورتی فراخوانی می شوند که برای حالت انتخابی مورد نیاز باشند. این از بارگیری همه چیز از جلو در زمانی که بسیاری از آنها بلااستفاده می ماند جلوگیری می کند.

حالت پیکربندی نشده

این حالت توسط unconfigured.py. حالت اختیاری است. اگر شما ارائه دهید config.json فایل به صورت دستی دستگاه هرگز بدون پیکربندی اجرا نمی شود. به گونه ای وجود دارد که می توان دسته ای از دستگاه ها را با سیستم عامل یکسان فلش کرد و سپس هر کدام را به صورت جداگانه با استفاده از یک مرورگر پیکربندی کرد.

وظیفه ماژول اجرای یک وب سرور است که یک فرم پیکربندی برای ارائه داده های پیکربندی به کاربر ارائه می دهد. در بالا چند صفحه HTML، سپس برخی از توابع کاربردی و در نهایت کد اصلی وجود دارد.

ویژگی کلیدی استفاده از توابع ناهمزمان برای اجازه چندوظیفه ای است. این برنامه 2 کار را اجرا می کند. یکی منتظر می ماند تا یک کلاینت وصل شود و دیگری LED را چشمک می زند. از آنجایی که هیچ یک از اینها نمی توانند مسدود شوند، کد ناهمزمان مورد نیاز است. اولین کار این است که دو کار را با استفاده از asyncio ایجاد کنید، سپس در حین انجام وظایف خود وارد یک حلقه بی پایان شوید.

کد یک وب سرور را راه اندازی می کند که SSID آن از این شکل است RBR-xr-xxxxxx، کجا RBR-xr- توصیفگر محصول است و xxxxxx 6 رقم آخر مک آدرس دستگاه هستند. آدرس IP سرور است 192.168.66.1 (یا هر چیز دیگری که شما ترجیح می دهید). اتصال به آن در http://192.168.66.1/config صفحه زیر را نشان می دهد:

صفحه پیکربندی

فیلدها به شرح زیر است:

نام رله: هر نامی که به طور منحصر به فرد این رله را در شبکه شناسایی کند. فضاها مجاز نیست.
SSID میزبان: SSID دستگاهی که این دستگاه باید به آن متصل شود.
رمز عبور میزبان: رمز وای فای هاست.
رمز عبور من: رمز عبور Wifi که اجازه دسترسی به سرور این دستگاه را پس از پیکربندی می دهد.

چه زمانی راه اندازی کلیک می شود، فیلدها در یک ساختار JSON ترکیب شده و در ناحیه فلاش دستگاه ذخیره می شوند config.json. سپس دستگاه خود را ریست می کند. اگر همه چیز خوب باشد باید در حالت پیکربندی مجدد راه اندازی شود.

حالت پیکربندی شده

این حالت توسط configured.py. همانند حالت پیکربندی نشده، کد وظایف همزمان را با استفاده از کتابخانه asyncio اجرا می کند. یکی از این وظایف برنامه اصلی است. دیگری یک ناظر است که بر فعالیت نظارت می کند تا اطمینان حاصل کند که نظرسنجی طبق انتظار انجام می شود. اگر به هر دلیلی متوقف شود (مانند آفلاین شدن هاست دستگاه)، ناظر پس از یک فاصله زمانی مناسب، بازنشانی را مجبور می کند. این کار از بازنشانی های غیر ضروری در هنگام بروز خرابی های لحظه ای جلوگیری می کند.

بسیاری از توابع مورد نیاز کد – به غیر از کتابخانه های استاندارد – در دو ماژول محلی نگهداری می شوند. functions.py و hardware.py. اینها بعدا توضیح داده خواهد شد.

برنامه اصلی با انجام مقداری مقداردهی اولیه شروع می شود. دو شیء خاص فرهنگ لغت – outgoingMap و incomingMap – نگه داشتن داده های در حال عبور در سراسر شبکه. هر دوی اینها، پس از ایجاد، تا زمانی که برنامه در حال اجرا است، دوام می آورند. یک نقطه دسترسی (Hotspot) برای سایر دستگاه ها تنظیم شده است تا به عنوان بخشی از زنجیره پیام از آن استفاده کنند.

این کد همچنین یک نقطه دسترسی محلی (Hotspot) را با یک SSID تنظیم می‌کند که مشابه چیزی است که در حالت پیکربندی شده استفاده می‌شود اما یکسان نیست. در این مثال خواهد بود RBR-XR-xxxxxx، کجا xxxxxx مانند قبل از 6 رقم آخر آدرس MAC است. از آنجایی که دو تا از نویسه‌های توصیف‌گر محصول اکنون با حروف بزرگ هستند، یافتن دستگاه در لیستی از نقاط دسترسی محلی آسان است.

در حلقه اصلی، کد در فواصل زمانی معین از دستگاه والد خود نظرسنجی می کند و آن را ارسال می کند incomingMap. پاسخ از والدین – outgoingMap – برای یافتن اینکه رله محلی باید روشن یا خاموش باشد تجزیه می شود. شماره نسخه در outgoingMap با آنچه در حال حاضر ذخیره شده مقایسه می شود، و اگر پیشرفتی صورت گرفته باشد، دستگاه یک فایل به روز رسانی ایجاد می کند و مجبور به تنظیم مجدد می شود.

هنگامی که یک دستگاه مشتری این مورد را نظرسنجی می کند، درخواست ورودی برای یافتن فرمان و داده های آن (در صورت وجود) تجزیه می شود. فرمت درخواست یکی از

  • http://(my ip address)/command
  • http://(my ip address)/command?data

دستورات شناسایی شده به شرح زیر است:

reboot کد را مجبور به راه اندازی مجدد می کند.
reset فایل پیکربندی را پاک می کند و سپس راه اندازی مجدد را مجبور می کند و باعث می شود دستگاه در حالت پیکربندی نشده راه اندازی مجدد شود.
getFile?{filename} درخواستی برای بازگرداندن محتویات فایل نامگذاری شده است. این توسط به روز رسانی استفاده می شود.
poll?data={incomingMap} با ارائه نقشه ورودی (یا بخشی از آن که برای این دستگاه شناخته شده است) از مادر این دستگاه نظرسنجی کنید. نقشه خروجی به تماس گیرنده برگردانده می شود.

هر دستور دیگری یک خط از اطلاعات کلی در مورد دستگاه و وضعیت آن را برمی گرداند.

ماژول های “توابع”.

مجموعه ای از توابع کمکی در آن نگهداری می شود functions.py و hardware.py. اینها به عنوان دو فایل برای جلوگیری از تمام شدن حافظه در طول به روز رسانی ارائه می شوند.

یک کتابخانه شخص ثالث، uaiohttpclient، که درخواست های HTTP ناهمزمان را مدیریت می کند، در دایرکتوری lib قرار می گیرد.

حالت به روز رسانی

این حالت توسط updater.py. به روز رسانی وظیفه اصلی خود و یک نگهبان را اجرا می کند. کار اصلی با درخواست از دستگاه والد خود، فهرستی از تمام فایل‌هایی که مجموعه کد را تشکیل می‌دهند، شروع می‌شود. این لیست به عنوان ذخیره می شود files.txt، سپس هر یک از فایل های نامگذاری شده درخواست می شود. وقتی همه با موفقیت بررسی شدند، شماره نسخه جدید ذخیره می شود.

مکانیسم پردازش هر فایل باید قوی باشد و بتواند خطاها را بازیابی کند. روال به شرح زیر است:

1 فایل درخواستی را دانلود کرده و به عنوان فایل موقت ذخیره کنید.
1 فایل ذخیره شده را بخوانید و بررسی کنید که با داده های دانلود شده یکسان باشد. اگر نه، به زور ریست کنید.
1 اگر فایلی با نام درخواستی موجود نیست، نام فایل موقت را تغییر داده و برگردانید.
1 اگر فایلی موجود است، آن را بخوانید و با فایل دانلود شده مقایسه کنید. اگر آنها یکسان هستند، نیازی به به روز رسانی نیست، بنابراین فایل موقت را حذف کرده و برگردانید.
1 اگر آنها متفاوت هستند، نسخه فعلی (قدیمی) را حذف کنید، نام فایل موقت را تغییر دهید و برگردانید.

کار آینده

این سیستم نسبت به محیطی که در آن کار می‌کند، نادان است. در نمونه‌های اولیه، هاب یک کامپیوتر کوچک مانند Raspberry یا Orange Pi است که کنترل آن توسط یک ماژول PHP در یک وب سرور آپاچی انجام می‌شود. یک گام مفید بعدی ایجاد یک ادغام برای Home Assistant خواهد بود. یک ماژول هاب – احتمالاً خودش یک ESP8266 است – زنجیره کاملی از دستگاه‌ها را مدیریت می‌کند و آنها را به عنوان یک آیتم از طریق MQTT به HA ارائه می‌کند. یک API مناسب به هر دستگاه نامگذاری شده در زنجیره اجازه می دهد تا به طور مستقل از طریق هاب آدرس دهی و کنترل شود.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا