مستندات ویرالینک

داده‌های سری زمانی (Time-series data)

ویرالینک عملیات زیر را در رابطه با داده‌های سری زمانی پشتیبانی میکند:

  • جمع آوری داده های سری زمانی از دستگاه‌ها با استفاده از پروتکل‌های MQTT, HTTP یا CoAP
  • ذخیره سازی داده‌های سری زمانی در پایگاه داده‌های ویرالینک
  • پرس و جو (Query) از داده‌های سری زمانی بر حسب آخرین مقدار ارسال شده و یا در بازه زمانی مشخص
  • مشترک شدن(Subscribe) برای دریافت بروزرسانی‌ها با استفاده از پروتکل websocket جهت مصور‌سازی و تحلیل داده‌ها در لحظه
  • مصورسازی داده‌های سری زمانی با استفاده از ابزارک‌ها و داشبورد‌ها
  • فیلتراسیون و تحلیل داده‌های سری زمانی توسط موتور قواعد
  • ایجاد هشدار بر اساس داده‌های سری زمانی جمع آوری شده
  • ارسال داده‌های سری زمانی به سیستم‌های خارجی توسط موتور قواعد (با استفاده از گره‌هایی مانند Kafka, RabbitMQ و غیره)

نقاط داده‌ای #

داده‌های سری زمانی در حقیقت جفت کلید-مقدار (key-value) با برچسب زمانی (timestamp) هستند. هر یک از این جفت کلید-مقدار در حقیقت یک داده نقطه‌ای می باشد که مجموع این داده نقطه‌ها نقاط داده‌ای هستند. این ساختار کلید-مقدار انعطاف‌پذیر باعث می‌شود که با دستگاه‌های اینترنت اشیا موجود در بازار به آسانی ادغام شود.
کلید همیشه به صورت یک رشته (String) بوده و نام صفت را مشخص می‌کند. مقدار یک صفت می‌تواند شامل string (رشته), boolean (منطقی), double (عدد اعشاری) , integer (عدد صحیح) و یا json باشد. برای مثال:

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

اگر دقت کنید متوجه خواهید شد که در مثال بالا مقدار زمان یا همان timestamp وجود ندارد. در اصل ویرالینک هنگام ثبت داده‌ها زمان دریافت پیام را قرار می‌دهد. اما میتوانید زمان دلخواه خود را در پیام قرار دهید. برای مثال:

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

API ارسال داده های سری زمانی #

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

  • MQTT API
  • CoAP API
  • HTTP API

مصورسازی داده‌ها #

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

مدت زمان نگهداری داده‌ها #

شما میتوانید به ازای هر یک رکورد ثبت شده برای داده های سری زمانی خود مدت زمان نگهداری آن را نیز با متفییر TTL ثبت کنید. به صورت پیشفرض مدت زمان نگهداری داده های سری زمانی در ویرالینک بی نهایت می باشد. (مقدار پیشفرض TTL صفر می باشد). شما میتوانید این مقدار پیشفرض را در گره Save Timeseries تغییر دهید و مقدار دلخواه خود را در واحد ثانیه وارد نمایید.

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

پایداری داده ها #

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

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

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

موتور قواعد #

وظیفه موتور قواعد پردازش تمام داده‌ها و رویداد‌های ورودی است. لینک‌های زیر نمونه سناریو‌هایی هستند که در آن‌ها از صفت‌ها استفاده می‌کنند:

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

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

تغییر داده‌های سری زمانی ورودی سمت کاربر قبل از ذخیره سازی آن در ویرالینک

به کمک گره message type switch پیام‌هایی که حاوی درخواست “Post telemetry” هستند را فیلتر کرده و سپس به کمک گره transformation rule node آن را تغییر دهید.

محاسبه دلتا بین مقادیر فعلی و قبلی در داده های سری زمانی

به کمک گره محاسبه دلتا میتوانید دلتای داده های سری زمانی خود را به سادگی محاسبه کنید.

دریافت مقادیر داده‌های سری زمانی گذشته برای تحلیل داده‌های سری زمانی ورودی از دستگاه

به کمک گره orginator telemetry میتوانید داده‌های سری زمانی ورودی دستگاه ها را با داده‌های سری زمانی گذشته همان دستگاه غنی سازی کنید.

دریافت مقادیر صفت‌ها برای تحلیل داده‌های ورودی تله‌متری از دستگاه

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

API برای پرس و جو داده‌ها (Data Query API) #

بخش telemetry-controller در REST API به شما امکان دریافت داده‌های مختلف را فراهم می‌کند.

توجه: API از طریق Swagger UI در دسترس است. لطفاً برای جزئیات بیشتر مستندات REST API را مرور کنید.

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

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

https://console.viralink.io/api/plugins/telemetry/{entityType}/{entityId}/keys/timeseries
["gas","temperature"]
curl -v -X GET https://console.viralink.io/api/plugins/telemetry/DEVICE/ac8e6020-ae99-11e6-b9bd-2b15845ada4e/keys/timeseries \
--header "Content-Type:application/json" \
--header "X-Authorization: $JWT_TOKEN"

موجودیت‌های پشتیانی شده: مدیر‌ (TENANT)، داشبورد (DASHBOARD)، مشتری (CUSTOMER)، کاربر (USER)، دارایی (ASSET)، دستگاه ‌(DEVICE)، هشدار (ALARM)، نمایش موجودیت (ENTITY_VIEW)

دریافت آخرین مقادیر داده های سری زمانی برای یک موجودیت مشخص #

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

https://console.viralink.io/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries?keys=key1,key2,key3
{
  "gas": [
    {
      "ts": 1479735870786,
      "value": "1"
    }
  ],
  "temperature": [
    {
      "ts": 1479735870786,
      "value": "3"
    }
  ]
}
curl -v -X GET https://console.viralink.io/api/plugins/telemetry/DEVICE/ac8e6020-ae99-11e6-b9bd-2b15845ada4e/values/timeseries?keys=gas,temperature \
--header "Content-Type:application/json" \
--header "X-Authorization: $JWT_TOKEN"

موجودیت‌های پشتیانی شده: مدیر‌ (TENANT)، داشبورد (DASHBOARD)، مشتری (CUSTOMER)، کاربر (USER)، دارایی (ASSET)، دستگاه ‌(DEVICE)، هشدار (ALARM)، نمایش موجودیت (ENTITY_VIEW)

دریافت تاریخچه داده های سری زمانی ثبت شده در بازه زمانی مشخص برای یک موجودیت مشخض #

شما می‌توانید تاریخچه داده‌های سری زمانی ثبت شده برای یک موجودیت خاص را با ارسال درخواست GET به لینک زیر دریافت کنید.

https://console.viralink.io/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries?keys=key1,key2,key3&startTs=1479735870785&endTs=1479735871858&interval=60000&limit=100&agg=AVG

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

  • keys – لیست کلید‌های درخواستی به صورت جدا شده با کاما (comma-separated)
  • startTS – زمان شروع به صورت unix timestamp در واحد میلی ثانیه
  • endTs – زمان پایان به صورت unix timestamp در واحد میلی ثانیه
  • interval – فاصله عملیات متراکم سازی (aggregation) در واحد میلی ثانیه
  • agg – عملیات متراکم سازی (aggregation). عملیات پشتیبانی شده: MIN, MAX, AVG, SUM, COUNT, NONE.
  • limit – حداکثر تعداد داده‌های سری زمانی برای پاسخ دادن و یا در فاصله زمانی برای پردازش
{
  "gas": [
    {
      "ts": 1479735870786,
      "value": "1"
    },
    {
      "ts": 1479735871857,
      "value": "2"
    }
  ],
  "temperature": [
    {
      "ts": 1479735870786,
      "value": "3"
    },
    {
      "ts": 1479735871857,
      "value": "4"
    }
  ]
}
curl -v -X GET "https://console.viralink.io/api/plugins/telemetry/DEVICE/ac8e6020-ae99-11e6-b9bd-2b15845ada4e/values/timeseries?keys=gas,temperature&startTs=1479735870785&endTs=1479735871858&interval=60000&limit=100&agg=AVG" \
--header "Content-Type:application/json" \
--header "X-Authorization: $JWT_TOKEN"

موجودیت‌های پشتیانی شده: مدیر‌ (TENANT)، داشبورد (DASHBOARD)، مشتری (CUSTOMER)، کاربر (USER)، دارایی (ASSET)، دستگاه ‌(DEVICE)، هشدار (ALARM)، نمایش موجودیت (ENTITY_VIEW)

WebSocket API #

ویرالینک تمام امکاناتی که در پروتکل REST API وجود دارد در پروتکل WebSocket نیز ارایه می‌دهد. همچنین شما می‌توانید در پروتکل websocket بر روی تغییرات داده‌های دستگاه subscribe کنید تا در هر زمان که داده‌های دستگاه تغییر پیدا کرد در لحظه مطلع شوید. به لینک زیر یک ارتباط وب سوکت باز کنید

wss://console.viralink.io/api/ws/plugins/telemetry?token=$JWT_TOKEN

بعد از باز شدن ارتباط وب سوکت می‌توانید دستورات subscribe ارسال کنید تا بروز رسانی‌های subscription را دریافت کنید
توضیحات پارامتر ها

  • cmdId – شناسه یکتای دستورات (این شناسه باید در اتصال وب سوکت به ازای هر دستور یکتا باشد و همانندی نداشته باشد)
  • entityType – نوع موجودیت. موجودیت‌های پشتیبانی شده: TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, ALARM
  • keys – کلید‌های داده‌ها به صورت جدا شده با کاما (comma-separated)
  • timeWindow – بازه زمانی دریافت subscription برای داده‌های سری زمانی در واحد میلی ثانیه. داده‌ها به صورت بازه زمانی [now()-timeWindow, now()] دریافت خواهند شد.
  • startTs – زمان شروع فاصله واکشی برای پرس و جو داده‌های تاریخی ، بر حسب میلی ثانیه.
  • endTs – زمان پایان فاصله واکشی برای جستجوی داده‌های تاریخی ، بر حسب میلی ثانیه.

مثال #

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

  • token – به شناسه دسترسی که می توانید با استفاده از این لینک دریافت کنید.
  • entityId – به شناسه دستگاه شما.
<!DOCTYPE HTML>
<html>
<head>

    <script type="text/javascript">
        function WebSocketAPIExample() {
            var token = "YOUR_JWT_TOKEN";
            var entityId = "YOUR_DEVICE_ID";
            var webSocket = new WebSocket("wss://console.viralink.io/api/ws/plugins/telemetry?token=" + token);

            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 = {
                    tsSubCmds: [
                        {
                            entityType: "DEVICE",
                            entityId: entityId,
                            scope: "LATEST_TELEMETRY",
                            cmdId: 10
                        }
                    ],
                    historyCmds: [],
                    attrSubCmds: []
                };
                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>

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

</body>
</html>