کار با داده های تلمتری

ThingsConnect مجموعه ای غنی از ویژگی های مربوط به داده های سری زمانی را ارائه می دهد:

  • جمع آوری داده ها از دستگاه ها با استفاده از پروتکل ها و یکپارچه سازی مختلف.
  • داده های سری زمانی را در پایگاه های داده SQL (PostgreSQL) یا NoSQL (Cassandra یا Timescale) ذخیره کنید.
  • آخرین مقادیر داده سری زمانی یا همه داده ها را در محدوده زمانی مشخص را جستجو کنید با تجمیع انعطاف پذیر جستجو کنید.
  • عضو شدن(Subscribe) در به روز رسانی داده ها با استفاده از WebSockets برای تجسم یا تجزیه و تحلیل زمان واقعی ؛
  • تجسم داده های سری زمانی با استفاده از ویدجت ها و داشبوردهای قابل تنظیم و بسیار قابل تنظیم ؛
  • فیلتر و تجزیه و تحلیل داده ها با استفاده از Rule Engine انعطاف پذیر.
  • ایجاد آلارم بر اساس داده های جمع آوری شده ؛
  • ارسال داده ها به سیستم های خارجی با استفاده از گره های قانون خارجی (به عنوان مثال گره های قاعده کافکا یا RabbitMQ).

این راهنما نگاهی بر ویژگی های ذکر شده در بالا ، و برخی پیوندهای مفید برای به دست آوردن جزئیات بیشتر ارائه می دهد.

نقاط داده

بورد ThingsConnect داده‌های سری زمانی را به صورت جفت‌های کلید-مقدار دارای برچسب زمانی در نظر می‌گیرد. ما به یک جفت کلید-مقدار دارای برچسب زمانی یک نقطه داده می‌گوییم. انعطاف‌پذیری و سادگی فرمت کلید-مقدار، ادغام آسان و بی‌دردسر با تقریباً هر دستگاه اینترنت اشیاء (IoT) موجود در بازار را ممکن می‌سازد. کلید همیشه یک رشته است و اساساً نام کلید نقطه داده می‌باشد، در حالی که مقدار می‌تواند به صورت رشته، بولین، دوبل، عدد صحیح یا JSON باشد.

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

متن JSON زیر شامل ۵ نقطه داده است: دما (double)، رطوبت (integer)، فعال بودن سیستم تهویه مطبوع (boolean)، وضعیت سیستم تهویه مطبوع (string) و پیکربندی (JSON):

				
					{
 "temperature": 42.2, 
 "humidity": 70,
 "hvacEnabled": true,
 "hvacState": "IDLE",
 "configuration": {
    "someNumber": 42,
    "someArray": [1,2,3],
    "someNestedObject": {"key": "value"}
 }
}
				
			

ممکن است متوجه شوید که JSON ذکر شده در بالا اطلاعات زمان‌بندی (timestamp) ندارد. در این صورت، ThingsConnect از زمان‌بندی سرور فعلی استفاده می‌کند. با این حال، می‌توانید اطلاعات زمان‌بندی را در پیام بگنجانید. به مثال زیر توجه کنید:

				
					{
  "ts": 1527863043000,
  "values": {
    "temperature": 42.2,
    "humidity": 70
  }
}
				
			

رابط برنامه‌نویسی بارگذاری داده‌های سری زمانی

می‌توانید از پیاده‌سازی‌های پروتکل انتقال داخلی استفاده کنید:

  • MQTT API reference
  • CoAP API reference
  • HTTP API reference
  • LwM2M API reference

بیشتر پروتکل‌های فوق از JSON، Protobuf یا فرمت داده‌ای اختصاصی خود پشتیبانی می‌کنند. برای پروتکل‌های دیگر، لطفاً به راهنمای "چگونه دستگاه خود را متصل کنید؟" مراجعه کنید.

بصری‌سازی داده‌ها

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

همچنین می‌توانید از ویجت‌های ورودی استفاده کنید تا به کاربران داشبورد امکان دهید مقادیر جدید سری زمانی را به‌طور مستقیم از طریق داشبوردها وارد کنند.

ذخیره‌سازی داده‌ها

مدیر سیستم می‌تواند ThingsConnect را به گونه‌ای پیکربندی کند که داده‌های سری زمانی را در پایگاه‌های داده SQL (مانند PostgreSQL) یا NoSQL (مانند Cassandra یا Timescale) ذخیره کند. برای محیط‌های کوچک که کمتر از ۵۰۰۰ نقطه داده در ثانیه دارند، استفاده از ذخیره‌سازی SQL توصیه می‌شود. اگر نیاز به عملکرد بالا یا دسترسی بسیار بالا دارید، ذخیره‌سازی داده‌ها در Cassandra مناسب است.

برای اطلاعات بیشتر، به مقایسه SQL، NoSQL و Hybrid مراجعه کنید.

نگهداری داده‌ها

سیاست و پیکربندی نگهداری داده‌ها به نوع ذخیره‌سازی انتخاب‌شده بستگی دارد.

Cassandra از پارامتر زمان انقضا (TTL) برای هر ردیف واردشده پشتیبانی می‌کند. بنابراین، می‌توانید پارامتر TTL پیش‌فرض را در سطح سیستم با استفاده از متغیر محیطی ‘TS_KV_TTL’ تنظیم کنید. همچنین می‌توانید مقدار پیش‌فرض را در گره قانون "ذخیره‌سازی سری زمانی" یا از طریق فیلد متاداده "TTL" در پیام خود تغییر دهید. این قابلیت به شما کمک می‌کند تا مصرف فضای ذخیره‌سازی را بهینه کنید.

از طرف دیگر، PostgreSQL و Timescale از پارامتر زمان انقضا (TTL) برای هر ردیف پشتیبانی نمی‌کنند. بنابراین، تنها می‌توانید روال پاک‌سازی دوره‌ای داده‌های سری زمانی را با استفاده از متغیرهای محیطی ‘SQL_TTL_*’ تنظیم کنید.

پایداری داده‌ها

دستگاهی که پیام حاوی داده‌های سری زمانی را به ThingsConnect ارسال می‌کند، پس از اینکه پیام با موفقیت در صف Rule Engine ذخیره شد، تأیید دریافت خواهد کرد. این صف مخصوصاً برای پروفایل دستگاه پیکربندی شده است.

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

موتور قوانین

موتور قوانین مسئول پردازش انواع مختلف داده‌ها و رویدادهای ورودی است. در زیر، رایج‌ترین سناریوهای استفاده از ویژگی‌ها در موتور قواعد آمده است:

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

تغییر داده‌های سری زمانی ورودی قبل از ذخیره‌سازی در پایگاه داده
از گره قانون نوع پیام برای فیلتر کردن پیام‌هایی که شامل درخواست "Post telemetry" هستند استفاده کنید. سپس، با استفاده از گره‌های قانون تغییر، پیام خاص مورد نظر را تغییر دهید.

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

دریافت مقادیر سری زمانی قبلی برای تحلیل تلمتری ورودی از دستگاه
از گره قانون تلمتری مبدأ برای غنی‌سازی پیام داده‌های سری زمانی ورودی با داده‌های سری زمانی قبلی دستگاه استفاده کنید.

دریافت مقادیر ویژگی‌ها برای تحلیل تلمتری ورودی از دستگاه
از گره‌های قانون غنی‌سازی برای افزودن ویژگی‌های دستگاه، دارایی مرتبط، مشتری یا مستاجر به پیام تلمتری ورودی استفاده کنید. این روش به شما امکان می‌دهد تا منطق و پارامترهای پردازش را بر اساس تنظیمات ذخیره‌شده در ویژگی‌ها تغییر دهید.

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

رابط برنامه‌نویسی درخواست داده‌ها

ThingsConnect API زیر را برای دریافت داده‌های موجودیت ارائه می‌دهد:

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

برای دریافت فهرست تمامی کلیدهای داده‌های سری زمانی مربوط به نوع و شناسه خاص یک موجودیت، می‌توانید از درخواست GET به آدرس زیر استفاده کنید:

توجه: این API از طریق Swagger UI قابل دسترسی است. برای جزئیات بیشتر، مستندات عمومی REST API را بررسی کنید. این API با نسخه‌های قبلی TB v1.0+ سازگار است و به همین دلیل URL‌های فراخوانی API شامل کلمه "plugin" هستند.

				
					http(s)://host:port/api/plugins/telemetry/{entityType}/{entityId}/keys/timeseries
				
			
				
					http(s)://host:port/api/plugins/telemetry/{entityType}/{entityId}/keys/timeseries
				
			

دریافت آخرین مقادیر داده‌های سری زمانی برای موجودیت خاص
برای دریافت فهرست آخرین مقادیر داده‌های سری زمانی مربوط به نوع و شناسه خاص یک موجودیت، می‌توانید از درخواست GET به آدرس زیر استفاده کنید:

				
					http(s)://host:port/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries?keys=key1,key2,key3
				
			
				
					http(s)://host:port/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries?keys=key1,key2,key3
				
			

انواع موجودیت‌های پشتیبانی‌شده عبارتند از: TENANT، CUSTOMER، USER، DASHBOARD، ASSET، DEVICE، ALARM، و ENTITY_VIEW.

دریافت مقادیر تاریخی داده‌های سری زمانی برای موجودیت خاص
برای دریافت فهرست مقادیر تاریخی داده‌های سری زمانی مربوط به نوع و شناسه خاص یک موجودیت، می‌توانید از درخواست GET به آدرس زیر استفاده کنید:

				
					http(s)://host:port/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries?keys=key1,key2,key3&startTs=1479735870785&endTs=1479735871858&interval=60000&limit=100&agg=AVG
				
			

پارامترهای پشتیبانی‌شده به شرح زیر است:

  • keys: فهرست کلیدهای تلمتری که باید دریافت شوند، به‌صورت جداشده با کاما.

  • startTs: تایم‌استمپ یونیکس که شروع بازه زمانی را به میلی‌ثانیه مشخص می‌کند.

  • endTs: تایم‌استمپ یونیکس که پایان بازه زمانی را به میلی‌ثانیه مشخص می‌کند.

  • interval: بازه زمانی تجمیع، به میلی‌ثانیه.

  • agg: تابع تجمیع. یکی از مقادیر MIN، MAX، AVG، SUM، COUNT، NONE.

  • limit: حداکثر تعداد نقاط داده‌ای که باید برگردانده شوند یا تعداد بازه‌های زمانی که باید پردازش شوند.

پارامترهای پشتیبانی‌شده به شرح زیر است:

				
					http(s)://host:port/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries?keys=key1,key2,key3&startTs=1479735870785&endTs=1479735871858&interval=60000&limit=100&agg=AVG
				
			

انواع موجودیت‌های پشتیبانی‌شده به شرح زیر است: TENANT، CUSTOMER، USER، DASHBOARD، ASSET، DEVICE، ALARM، و ENTITY_VIEW.

رابط برنامه‌نویسی WebSocket

WebSocket‌ها به‌طور فعال توسط رابط کاربری وب ThingsConnect استفاده می‌شوند. WebSocket API عملکردهای REST API را تکرار می‌کند و امکان اشتراک‌گذاری تغییرات داده‌های دستگاه را فراهم می‌آورد. برای برقراری ارتباط WebSocket با سرویس تلمتری، می‌توانید از URL زیر استفاده کنید:

				
					ws(s)://host:port/api/ws
				
			

پس از باز کردن ارتباط، باید در عرض ۱۰ ثانیه با استفاده از دستور auth، جلسه را تأیید کنید:

				
					{
  "authCmd": {
    "cmdId": 0,
    "token": "$JWT_TOKEN"
  }
}
				
			

سپس می‌توانید دستورات اشتراک‌گذاری را ارسال کرده و به‌روزرسانی‌های اشتراک را دریافت کنید:

که در آن:

  • cmdId: شناسه منحصربه‌فرد دستور (درون ارتباط WebSocket مربوطه)

  • entityType: نوع موجودیت منحصربه‌فرد. انواع موجودیت‌های پشتیبانی‌شده عبارتند از: TENANT، CUSTOMER، USER، DASHBOARD، ASSET، DEVICE، ALARM

  • entityId: شناسه منحصربه‌فرد موجودیت
    keys: فهرست کلیدهای داده به‌صورت جداشده با کاما

  • timeWindow: بازه زمانی برای اشتراک‌گذاری داده‌های سری زمانی، به میلی‌ثانیه. داده‌ها در بازه زمانی [حالا()-timeWindow، حالا()] بازیابی خواهند شد.

  • startTs: زمان شروع بازه زمانی برای پرس‌وجوی داده‌های تاریخی، به میلی‌ثانیه.

  • endTs: زمان پایان بازه زمانی برای پرس‌وجوی داده‌های تاریخی، به میلی‌ثانیه.

مثال

مقادیر متغیرهای زیر را تغییر دهید:

  • token - به توکن JWT که می‌توانید از طریق لینک زیر دریافت کنید.

  • entityId - به شناسه دستگاه شما.

در صورت استفاده از سرور دمو زنده:

  • host:port را با demo.thingsconnect.ir جایگزین کنید و اتصال امن - wss:// را انتخاب کنید.

در صورت استفاده از نصب محلی:

  • host:port را با 127.0.0.1:8080 جایگزین کنید و اتصال - ws:// را انتخاب کنید.
				
					<!DOCTYPE HTML>
<html>
<head>

    <script type="text/javascript">
        function WebSocketAPIExample() {
            var token = "YOUR_JWT_TOKEN";
            var entityId = "YOUR_DEVICE_ID";
            var webSocket = new WebSocket("ws(s)://host:port/api/ws");

            if (entityId === "YOUR_DEVICE_ID") {
                alert("Invalid device id!");
                webSocket.close();
            }

            if (token === "YOUR_JWT_TOKEN") {
                alert("Invalid JWT token!");
                webSocket.close();
            }

            webSocket.onopen = function () {
                var object = {
                    authCmd: {
                        cmdId: 0,
                        token: token
                    },
                    cmds: [
                        {
                            entityType: "DEVICE",
                            entityId: entityId,
                            scope: "LATEST_TELEMETRY",
                            cmdId: 10,
                            type: "TIMESERIES"
                        }
                    ]
                };
                var data = JSON.stringify(object);
                webSocket.send(data);
                alert("Message is sent: " + data);
            };

            webSocket.onmessage = function (event) {
                var received_msg = event.data;
                alert("Message is received: " + received_msg);
            };

            webSocket.onclose = function (event) {
                alert("Connection is closed!");
            };
        }
    </script>

</head>
<body data-rsssl=1>

<div id="sse">
    <a href="javascript:WebSocketAPIExample()">Run WebSocket</a>
</div>

</body>
</html>
				
			

عناوین هر بخش