forked from community/device-mgt-plugins
Merge branch 'release-3.0.x' of https://github.com/wso2/carbon-device-mgt-plugins into release-3.0.x
commit
b5e220799a
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.wso2.carbon.iot.android.sense.event.streams.battery;
|
||||||
|
|
||||||
|
import android.app.IntentService;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.os.BatteryManager;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
|
||||||
|
|
||||||
|
public class BatteryReaderService extends IntentService {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
|
||||||
|
public BatteryReaderService() {
|
||||||
|
super("BatteryReaderService");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onHandleIntent(Intent intent) {
|
||||||
|
IntentFilter intentFilter = new IntentFilter();
|
||||||
|
intentFilter.addAction(Intent.ACTION_BATTERY_LOW);
|
||||||
|
intentFilter.addAction(Intent.ACTION_BATTERY_OKAY);
|
||||||
|
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
|
||||||
|
Intent intent1 = registerReceiver(null, intentFilter);
|
||||||
|
|
||||||
|
Log.i("Battery Data", String.valueOf(intent1.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)));
|
||||||
|
if (Intent.ACTION_BATTERY_OKAY.equals(intent.getAction())) {
|
||||||
|
SenseDataHolder.getBatteryDataHolder().add(new BatteryData(BatteryData.State.OK));
|
||||||
|
} else if (Intent.ACTION_BATTERY_LOW.equals(intent.getAction())) {
|
||||||
|
SenseDataHolder.getBatteryDataHolder().add(new BatteryData(BatteryData.State.LOW));
|
||||||
|
} else {
|
||||||
|
SenseDataHolder.getBatteryDataHolder().add(new BatteryData(intent1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.wso2.carbon.iot.android.sense.event.streams.data;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.NetworkInfo;
|
||||||
|
import android.net.TrafficStats;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to read data sent and received by the device.
|
||||||
|
*/
|
||||||
|
public class NetworkDataReader extends AsyncTask<Void, Void, Long> {
|
||||||
|
|
||||||
|
private NetworkData networkData;
|
||||||
|
private Context context;
|
||||||
|
private Handler mHandler = new Handler();
|
||||||
|
private long mStartRX = 0;
|
||||||
|
private long mStartTX = 0;
|
||||||
|
private final String WIFI = "WIFI";
|
||||||
|
private final String MOBILE = "MOBILE";
|
||||||
|
private String connectionType;
|
||||||
|
|
||||||
|
public NetworkDataReader(Context context) {
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Long doInBackground(Void... voids) {
|
||||||
|
|
||||||
|
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
networkData = new NetworkData();
|
||||||
|
|
||||||
|
if (getConnectionType(connectivityManager, ConnectivityManager.TYPE_WIFI)) {
|
||||||
|
connectionType = WIFI;
|
||||||
|
} else if (getConnectionType(connectivityManager, ConnectivityManager.TYPE_MOBILE)) {
|
||||||
|
connectionType = MOBILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
mStartRX = TrafficStats.getTotalRxBytes();
|
||||||
|
mStartTX = TrafficStats.getTotalTxBytes();
|
||||||
|
if (mStartRX == TrafficStats.UNSUPPORTED || mStartTX == TrafficStats.UNSUPPORTED) {
|
||||||
|
Log.e("ERROR", "Not connected.");
|
||||||
|
} else {
|
||||||
|
mHandler.postDelayed(mRunnable, 10000);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collect data sent and received with in 10 second time frames.
|
||||||
|
*/
|
||||||
|
private final Runnable mRunnable = new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
long rxBytes = TrafficStats.getTotalRxBytes() - mStartRX;
|
||||||
|
long txBytes = TrafficStats.getTotalTxBytes() - mStartTX;
|
||||||
|
Log.i("Usage: ", String.valueOf(rxBytes) + " " + String.valueOf(txBytes) + " " + System.currentTimeMillis());
|
||||||
|
networkData.setType(connectionType);
|
||||||
|
networkData.setTimeStamp(new Date().getTime());
|
||||||
|
networkData.setDataSent(txBytes);
|
||||||
|
networkData.setDataReceived(rxBytes);
|
||||||
|
SenseDataHolder.getNetworkDataHolder().add(networkData);
|
||||||
|
mHandler.postDelayed(mRunnable, 10000);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the type of the connection currently have.
|
||||||
|
*/
|
||||||
|
private boolean getConnectionType(ConnectivityManager manager, Integer type) {
|
||||||
|
NetworkInfo networkInfo = manager.getNetworkInfo(type);
|
||||||
|
return networkInfo.isConnected();
|
||||||
|
}
|
||||||
|
}
|
@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
|
||||||
*
|
|
||||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
|
||||||
* Version 2.0 (the "License"); you may not use this file except
|
|
||||||
* in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.wso2.carbon.iot.android.sense.event.streams.data;
|
|
||||||
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
|
|
||||||
|
|
||||||
public class NetworkDataReceiver extends BroadcastReceiver{
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
long sent = android.net.TrafficStats.getTotalTxBytes();
|
|
||||||
long received = android.net.TrafficStats.getTotalRxBytes();
|
|
||||||
Log.d("NetworkData :", "Received: " + sent + " Received : " + received);
|
|
||||||
|
|
||||||
NetworkData networkData = new NetworkData(received, sent);
|
|
||||||
|
|
||||||
SenseDataHolder.getNetworkDataHolder().add(networkData);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,19 @@
|
|||||||
|
@Plan:name('Android-Battery-ExecutionPlan')
|
||||||
|
|
||||||
|
@Plan:description('Find the battery status of the android device.')
|
||||||
|
|
||||||
|
|
||||||
|
@Import('org.wso2.iot.android.battery:1.0.0')
|
||||||
|
define stream BatteryStream (meta_owner string, meta_deviceId string, meta_timestamp long, level int, state string, status string, temperature int);
|
||||||
|
|
||||||
|
|
||||||
|
@Export('org.wso2.iot.android.battery.stats:1.0.0')
|
||||||
|
define stream BatteryStatsStream (meta_owner string, meta_deviceId string, meta_timestamp long, level int, state
|
||||||
|
string, status string, temperature int, year int, month int, day int, hour int, minute int);
|
||||||
|
|
||||||
|
partition with (meta_deviceId of BatteryStream)
|
||||||
|
begin
|
||||||
|
from BatteryStream
|
||||||
|
select meta_owner, meta_deviceId, meta_timestamp, level, state, status, temperature, time:extract(preState.meta_timestamp, 'year') as year, time:extract(preState.meta_timestamp, 'month') as month, time:extract(preState.meta_timestamp, 'day') as day, time:extract(preState.meta_timestamp, 'hour') as hour, time:extract(preState.meta_timestamp, 'minute') as minute
|
||||||
|
insert into BatteryStatsStream;
|
||||||
|
end;
|
@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
~
|
||||||
|
~ WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
~ Version 2.0 (the "License"); you may not use this file except
|
||||||
|
~ in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing,
|
||||||
|
~ software distributed under the License is distributed on an
|
||||||
|
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
~ KIND, either express or implied. See the License for the
|
||||||
|
~ specific language governing permissions and limitations
|
||||||
|
~ under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<artifact name= "android_android_battery_executionplan" version="1.0.0" type="event/execution-plan"
|
||||||
|
serverRole="DataAnalyticsServer">
|
||||||
|
<file>Android-Battery-ExecutionPlan.siddhiql</file>
|
||||||
|
</artifact>
|
||||||
|
|
10
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/conf.json → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/conf.json
10
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/conf.json → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/conf.json
@ -1,17 +1,19 @@
|
|||||||
{
|
{
|
||||||
"provider-conf": {
|
"provider-conf": {
|
||||||
"streamName": "org.wso2.iot.android.battery:1.0.0",
|
"tableName": "ORG_WSO2_IOT_ANDROID_BATTERY_STATS",
|
||||||
"provider-name": "realtime"
|
"query": "",
|
||||||
|
"limit": "",
|
||||||
|
"provider-name": "batch"
|
||||||
},
|
},
|
||||||
"chart-conf": {
|
"chart-conf": {
|
||||||
"x": "TIMESTAMP",
|
"x": "meta_timestamp",
|
||||||
"xType": "time",
|
"xType": "time",
|
||||||
"y": "level",
|
"y": "level",
|
||||||
"yType": "number",
|
"yType": "number",
|
||||||
"color": "None",
|
"color": "None",
|
||||||
"mode": "stack",
|
"mode": "stack",
|
||||||
"maxLength": "30",
|
"maxLength": "30",
|
||||||
"gadget-name": "Android Battery Level Chart",
|
"gadget-name": "Battery History",
|
||||||
"chart-name": "area-chart"
|
"chart-name": "area-chart"
|
||||||
}
|
}
|
||||||
}
|
}
|
0
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/gadget-controller.jag → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/gadget-controller.jag
0
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/gadget-controller.jag → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/gadget-controller.jag
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"id": "Android_Battery_History_Chart",
|
||||||
|
"title": "Battery History",
|
||||||
|
"type": "gadget",
|
||||||
|
"thumbnail": "gadget/Android_Battery_History_Chart/thumbnail.png",
|
||||||
|
"data": {
|
||||||
|
"url": "gadget/Android_Battery_History_Chart/gadget.xml"
|
||||||
|
}
|
||||||
|
}
|
16
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/gadget.xml → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/gadget.xml
16
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/gadget.xml → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/gadget.xml
0
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/js/core/area-chart-api.js → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/js/core/area-chart-api.js
0
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/js/core/area-chart-api.js → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/js/core/area-chart-api.js
@ -0,0 +1,190 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
var getConfig, validate, getMode, getSchema, getData, registerCallBackforPush;
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
var PROVIDERS_LOCATION = '/extensions/providers/';
|
||||||
|
|
||||||
|
var PROVIDER_NAME = 'batch';
|
||||||
|
var TYPE = "type";
|
||||||
|
var TABLE_NAME = "tableName";
|
||||||
|
var HTTPS_TRANSPORT = "https";
|
||||||
|
var CONTENT_TYPE_JSON = "application/json";
|
||||||
|
var AUTHORIZATION_HEADER = "Authorization";
|
||||||
|
var USER_TOKEN = "user";
|
||||||
|
var TENANT_DOMAIN = "domain";
|
||||||
|
var CONST_AT = "@";
|
||||||
|
var USERNAME = "username";
|
||||||
|
var HTTP_USER_NOT_AUTHENTICATED = 403;
|
||||||
|
var JS_MAX_VALUE = "9007199254740992";
|
||||||
|
var JS_MIN_VALUE = "-9007199254740992";
|
||||||
|
|
||||||
|
var typeMap = {
|
||||||
|
"bool" : "string",
|
||||||
|
"boolean" : "string",
|
||||||
|
"string" : "string",
|
||||||
|
"int" : "number",
|
||||||
|
"integer" : "number",
|
||||||
|
"long" : "number",
|
||||||
|
"double" : "number",
|
||||||
|
"float" : "number",
|
||||||
|
"time": "time"
|
||||||
|
};
|
||||||
|
|
||||||
|
var log = new Log();
|
||||||
|
var carbon = require('carbon');
|
||||||
|
var configs = require('/configs/designer.json');
|
||||||
|
var utils = require('/modules/utils.js');
|
||||||
|
var JSUtils = Packages.org.wso2.carbon.analytics.jsservice.Utils;
|
||||||
|
var AnalyticsCachedJSServiceConnector = Packages.org.wso2.carbon.analytics.jsservice.AnalyticsCachedJSServiceConnector;
|
||||||
|
var AnalyticsCache = Packages.org.wso2.carbon.analytics.jsservice.AnalyticsCachedJSServiceConnector.AnalyticsCache;
|
||||||
|
var cacheTimeoutSeconds = 5;
|
||||||
|
var loggedInUser = null;
|
||||||
|
|
||||||
|
if (configs.cacheTimeoutSeconds) {
|
||||||
|
cacheTimeoutSeconds = parseInt(configs.cacheTimeoutSeconds);
|
||||||
|
}
|
||||||
|
var cacheSizeBytes = 1024 * 1024 * 1024; // 1GB
|
||||||
|
if (configs.cacheSizeBytes) {
|
||||||
|
cacheSizeBytes = parseInt(configs.cacheSizeBytes);
|
||||||
|
}
|
||||||
|
response.contentType = CONTENT_TYPE_JSON;
|
||||||
|
|
||||||
|
var authParam = request.getHeader(AUTHORIZATION_HEADER);
|
||||||
|
if (authParam != null) {
|
||||||
|
credentials = JSUtils.authenticate(authParam);
|
||||||
|
loggedInUser = credentials[0];
|
||||||
|
} else {
|
||||||
|
var token = session.get(USER_TOKEN);
|
||||||
|
if (token != null) {
|
||||||
|
loggedInUser = token[USERNAME] + CONST_AT + token[TENANT_DOMAIN];
|
||||||
|
} else {
|
||||||
|
log.error("user is not authenticated!");
|
||||||
|
response.status = HTTP_USER_NOT_AUTHENTICATED;
|
||||||
|
print('{ "status": "Failed", "message": "User is not authenticated." }');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var cache = application.get("AnalyticsWebServiceCache");
|
||||||
|
if (cache == null) {
|
||||||
|
cache = new AnalyticsCache(cacheTimeoutSeconds, cacheSizeBytes);
|
||||||
|
application.put("AnalyticsWebServiceCache", cache);
|
||||||
|
}
|
||||||
|
var connector = new AnalyticsCachedJSServiceConnector(cache);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* require the existing config.json and push any dynamic fields that needs to be populated in the UI
|
||||||
|
*/
|
||||||
|
getConfig = function() {
|
||||||
|
var formConfig = require(PROVIDERS_LOCATION + '/' + PROVIDER_NAME + '/config.json');
|
||||||
|
var tables;
|
||||||
|
try {
|
||||||
|
tables = JSON.parse(connector.getTableList(loggedInUser).getMessage());
|
||||||
|
} catch (e) {
|
||||||
|
log.error(e);
|
||||||
|
}
|
||||||
|
var configs = formConfig.config;
|
||||||
|
configs.forEach(function(config) {
|
||||||
|
if (config.fieldName === TABLE_NAME) {
|
||||||
|
config.valueSet = tables;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return formConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* validate the user input of provider configuration
|
||||||
|
* @param providerConfig
|
||||||
|
*/
|
||||||
|
validate = function(providerConfig) {
|
||||||
|
/*
|
||||||
|
validate the form and return
|
||||||
|
|
||||||
|
*/
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns the data mode either push or pull
|
||||||
|
*/
|
||||||
|
getMode = function() {
|
||||||
|
return "PULL";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns an array of column names & types
|
||||||
|
* @param providerConfig
|
||||||
|
*/
|
||||||
|
getSchema = function(providerConfig) {
|
||||||
|
var schema = [];
|
||||||
|
var tableName = providerConfig["tableName"];
|
||||||
|
var result = connector.getTableSchema(loggedInUser, tableName).getMessage();
|
||||||
|
result = JSON.parse(result);
|
||||||
|
|
||||||
|
var columns = result.columns;
|
||||||
|
Object.getOwnPropertyNames(columns).forEach(function(name, idx, array) {
|
||||||
|
var type = "ordinal";
|
||||||
|
if(columns[name]['type']) {
|
||||||
|
type = columns[name]['type'];
|
||||||
|
}
|
||||||
|
schema.push({
|
||||||
|
fieldName: name,
|
||||||
|
fieldType: typeMap[type.toLowerCase()]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// log.info(schema);
|
||||||
|
return schema;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns the actual data
|
||||||
|
* @param providerConfig
|
||||||
|
* @param limit
|
||||||
|
*/
|
||||||
|
getData = function(providerConfig, limit) {
|
||||||
|
var tableName = providerConfig.tableName;
|
||||||
|
var query = providerConfig.query;
|
||||||
|
var limit = 100;
|
||||||
|
if (providerConfig.limit) {
|
||||||
|
limit = providerConfig.limit;
|
||||||
|
}
|
||||||
|
var result;
|
||||||
|
//if there's a filter present, we should perform a Lucene search instead of reading the table
|
||||||
|
if (query) {
|
||||||
|
var filter = {
|
||||||
|
"query": query,
|
||||||
|
"start": 0,
|
||||||
|
"count": limit
|
||||||
|
};
|
||||||
|
result = connector.search(loggedInUser, tableName, stringify(filter)).getMessage();
|
||||||
|
} else {
|
||||||
|
var from = JS_MIN_VALUE;
|
||||||
|
var to = JS_MAX_VALUE;
|
||||||
|
result = connector.getRecordsByRange(loggedInUser, tableName, from, to, 0, limit, null).getMessage();
|
||||||
|
|
||||||
|
}
|
||||||
|
result = JSON.parse(result);
|
||||||
|
var data = [];
|
||||||
|
for (var i = 0; i < result.length; i++) {
|
||||||
|
var values = result[i].values;
|
||||||
|
data.push(values);
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|
||||||
|
}());
|
29
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/js/core/gadget-core.js → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/js/core/gadget-core.js
29
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/js/core/gadget-core.js → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/js/core/gadget-core.js
2
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/js/core/gadget-util.js → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/js/core/gadget-util.js
2
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/js/core/gadget-util.js → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/js/core/gadget-util.js
0
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/thumbnail.png → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/thumbnail.png
0
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/Android_Battery_Level_Chart/thumbnail.png → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_history_chart_gadget/Android_Battery_History_Chart/thumbnail.png
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
~
|
||||||
|
~ WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
~ Version 2.0 (the "License"); you may not use this file except
|
||||||
|
~ in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing,
|
||||||
|
~ software distributed under the License is distributed on an
|
||||||
|
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
~ KIND, either express or implied. See the License for the
|
||||||
|
~ specific language governing permissions and limitations
|
||||||
|
~ under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<artifact name= "android_battery_history_chart_gadget" version="1.0.0" type="dashboards/gadget"
|
||||||
|
serverRole="DataAnalyticsServer">
|
||||||
|
<file>Android_Battery_History_Chart</file>
|
||||||
|
</artifact>
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "Android_Battery_Level_Chart",
|
|
||||||
"title": "Android Battery Level Chart",
|
|
||||||
"type": "gadget",
|
|
||||||
"thumbnail": "gadget/Android_Battery_Level_Chart/thumbnail.png",
|
|
||||||
"data": {
|
|
||||||
"url": "gadget/Android_Battery_Level_Chart/gadget.xml"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
// var registerCallBackforPush;
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
|
|
||||||
var callback;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO Need to read hostname,port, and tenantId from providerConfig
|
|
||||||
* @param providerConfig
|
|
||||||
* @param schema
|
|
||||||
*/
|
|
||||||
registerCallBackforPush = function(providerConfig, schema, _callback) {
|
|
||||||
var streamId = providerConfig['streamName'];
|
|
||||||
var hostname = window.parent.location.hostname;
|
|
||||||
var port = window.parent.location.port;
|
|
||||||
|
|
||||||
subscribe(streamId.split(":")[0], streamId.split(":")[1],
|
|
||||||
'10',
|
|
||||||
onData, onError,
|
|
||||||
hostname,
|
|
||||||
port,
|
|
||||||
'WEBSOCKET'
|
|
||||||
);
|
|
||||||
callback = _callback;
|
|
||||||
};
|
|
||||||
|
|
||||||
function onData(streamId, data) {
|
|
||||||
callback(data);
|
|
||||||
};
|
|
||||||
|
|
||||||
function onError(error) {
|
|
||||||
console.error(error);
|
|
||||||
};
|
|
||||||
|
|
||||||
}());
|
|
||||||
|
|
@ -1,154 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
var getConfig, validate, getMode, getSchema, getData, registerCallBackforPush;
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
|
|
||||||
var PROVIDERS_LOCATION = '/extensions/providers/';
|
|
||||||
var PROVIDER_NAME = 'realtime';
|
|
||||||
|
|
||||||
var log = new Log();
|
|
||||||
var utils = require('/modules/utils.js');
|
|
||||||
var carbon = require("carbon");
|
|
||||||
var EventPublisherConstants = Packages.org.wso2.carbon.event.publisher.core.config.EventPublisherConstants;
|
|
||||||
var eventPublisherService = carbon.server.osgiService('org.wso2.carbon.event.publisher.core.EventPublisherService');
|
|
||||||
var eventStreamService = carbon.server.osgiService('org.wso2.carbon.event.stream.core.EventStreamService');
|
|
||||||
|
|
||||||
var typeMap = {
|
|
||||||
"bool": "string",
|
|
||||||
"boolean": "string",
|
|
||||||
"string": "string",
|
|
||||||
"int": "number",
|
|
||||||
"integer": "number",
|
|
||||||
"long": "number",
|
|
||||||
"double": "number",
|
|
||||||
"float": "number",
|
|
||||||
"time": "time"
|
|
||||||
};
|
|
||||||
|
|
||||||
getConfig = function() {
|
|
||||||
var formConfig = require(PROVIDERS_LOCATION + '/' + PROVIDER_NAME + '/config.json');
|
|
||||||
var datasources = [];
|
|
||||||
try {
|
|
||||||
var eventPublisherConfigurationList = eventPublisherService.getAllActiveEventPublisherConfigurations();
|
|
||||||
for (var i = 0; i < eventPublisherConfigurationList.size(); i++) {
|
|
||||||
var eventPublisherConfiguration = eventPublisherService.getActiveEventPublisherConfiguration(
|
|
||||||
eventPublisherConfigurationList.get(i).getEventPublisherName());;
|
|
||||||
|
|
||||||
var mappingTypeIsWso2 = eventPublisherConfiguration.getOutputMapping()
|
|
||||||
.getMappingType().equals(EventPublisherConstants.EF_WSO2EVENT_MAPPING_TYPE);
|
|
||||||
|
|
||||||
var adapterType = null;
|
|
||||||
if (eventPublisherConfiguration.getToAdapterConfiguration() != null) {
|
|
||||||
adapterType = eventPublisherConfiguration.getToAdapterConfiguration().getType();
|
|
||||||
}
|
|
||||||
if (mappingTypeIsWso2 && adapterType.trim() == "ui") {
|
|
||||||
var streamName = eventPublisherConfiguration.getFromStreamName();
|
|
||||||
var streamVersion = eventPublisherConfiguration.getFromStreamVersion();
|
|
||||||
var streamId = streamName + ":" + streamVersion;
|
|
||||||
datasources.push(streamId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var datasourceCfg = {
|
|
||||||
"fieldLabel": "Event Stream",
|
|
||||||
"fieldName": "streamName",
|
|
||||||
"fieldType": "dropDown"
|
|
||||||
};
|
|
||||||
datasourceCfg['valueSet'] = datasources;
|
|
||||||
} catch (e) {
|
|
||||||
log.error(e);
|
|
||||||
}
|
|
||||||
formConfig.config.push(datasourceCfg);
|
|
||||||
return formConfig;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* validate the user input of provider configuration
|
|
||||||
* @param providerConfig
|
|
||||||
*/
|
|
||||||
validate = function(providerConfig) {
|
|
||||||
/*
|
|
||||||
validate the form and return
|
|
||||||
|
|
||||||
*/
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* returns the data mode either push or pull
|
|
||||||
*/
|
|
||||||
getMode = function() {
|
|
||||||
return 'push';
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* returns an array of column names & types
|
|
||||||
* @param providerConfig
|
|
||||||
*/
|
|
||||||
getSchema = function(providerConfig) {
|
|
||||||
var streamId = providerConfig["streamName"];
|
|
||||||
var output = [];
|
|
||||||
|
|
||||||
output.push({
|
|
||||||
fieldName: "TIMESTAMP",
|
|
||||||
fieldType: "time"
|
|
||||||
});
|
|
||||||
|
|
||||||
if (eventStreamService != null) {
|
|
||||||
var eventStreamConfiguration = eventStreamService.getEventStreamConfiguration(streamId);
|
|
||||||
if (eventStreamConfiguration != null) {
|
|
||||||
var metaData = eventStreamConfiguration.getStreamDefinition().getMetaData();
|
|
||||||
var correlationData = eventStreamConfiguration.getStreamDefinition().getCorrelationData();
|
|
||||||
var payloadData = eventStreamConfiguration.getStreamDefinition().getPayloadData();
|
|
||||||
if (metaData != null) {
|
|
||||||
for (var i = 0; i < metaData.size(); i++) {
|
|
||||||
var type = metaData.get(i).getType().toString().toLowerCase();
|
|
||||||
output.push({
|
|
||||||
fieldName: metaData.get(i).getName(),
|
|
||||||
fieldType: typeMap[type.toLowerCase()]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (correlationData != null) {
|
|
||||||
for (var i = 0; i < correlationData.size(); i++) {
|
|
||||||
var type = correlationData.get(i).getType().toString().toLowerCase();
|
|
||||||
output.push({
|
|
||||||
fieldName: correlationData.get(i).getName(),
|
|
||||||
fieldType: typeMap[type.toLowerCase()]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (payloadData != null) {
|
|
||||||
for (var i = 0; i < payloadData.size(); i++) {
|
|
||||||
var type = payloadData.get(i).getType().toString().toLowerCase();
|
|
||||||
output.push({
|
|
||||||
fieldName: payloadData.get(i).getName(),
|
|
||||||
fieldType: typeMap[type.toLowerCase()]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return output;
|
|
||||||
};
|
|
||||||
|
|
||||||
getData = function(providerConfig,limit) {
|
|
||||||
var data = [];
|
|
||||||
return data;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
}());
|
|
@ -1,262 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
|
||||||
*
|
|
||||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
|
||||||
* Version 2.0 (the "License"); you may not use this file except
|
|
||||||
* in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var CONSTANTS = {
|
|
||||||
urlSeperator: '/',
|
|
||||||
queryParamStreamName : '?streamname=',
|
|
||||||
queryParamStreamVersion : '&version=',
|
|
||||||
queryParamLastUpdatedTime : '&lastUpdatedTime=',
|
|
||||||
urlSecureTransportWebsocket : 'wss://',
|
|
||||||
urlSecureTransportHttp : 'https://',
|
|
||||||
colon : ':',
|
|
||||||
defaultIntervalTime : 10 * 1000,
|
|
||||||
defaultHostName : 'localhost',
|
|
||||||
defaultSecurePortNumber : '9443',
|
|
||||||
defaultMode : 'AUTO',
|
|
||||||
processModeHTTP : 'HTTP',
|
|
||||||
processModeWebSocket : 'WEBSOCKET',
|
|
||||||
processModeAuto : 'AUTO',
|
|
||||||
numThousand : 1000,
|
|
||||||
websocketTimeAppender : 400,
|
|
||||||
websocketSubscriptionEndpoint : 'portal/uipublisher/websocketSubscriptionEndpoint.jag',
|
|
||||||
httpEventRetrievalEndpoint : 'portal/uipublisher/httpEventRetrievalEndpoint.jag'
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
var websocket = null;
|
|
||||||
var webSocketUrl;
|
|
||||||
var httpUrl;
|
|
||||||
var cepHostName;
|
|
||||||
var cepPortNumber;
|
|
||||||
var isErrorOccured = false;
|
|
||||||
var lastUpdatedtime = -1;
|
|
||||||
var polingInterval;
|
|
||||||
var stream;
|
|
||||||
var streamVersion;
|
|
||||||
var firstPollingAttempt;
|
|
||||||
var processMode;
|
|
||||||
var onSuccessFunction;
|
|
||||||
var onErrorFunction;
|
|
||||||
var terminateWebsocketInstance = false;
|
|
||||||
var pollingContinue = true;
|
|
||||||
|
|
||||||
function subscribe(streamName,version,intervalTime,
|
|
||||||
listeningFuncSuccessData,listeningFuncErrorData,cepHost,cepPort,mode){
|
|
||||||
stopPollingProcesses();
|
|
||||||
stream = streamName;
|
|
||||||
streamVersion = version;
|
|
||||||
onSuccessFunction = listeningFuncSuccessData;
|
|
||||||
onErrorFunction = listeningFuncErrorData;
|
|
||||||
|
|
||||||
if(intervalTime == null || intervalTime == ""){
|
|
||||||
polingInterval = CONSTANTS.defaultIntervalTime;
|
|
||||||
} else{
|
|
||||||
polingInterval = intervalTime * CONSTANTS.numThousand;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cepHost == null || cepHost == ""){
|
|
||||||
cepHostName = CONSTANTS.defaultHostName;
|
|
||||||
} else{
|
|
||||||
cepHostName = cepHost;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cepPort == null || cepPort == ""){
|
|
||||||
cepPortNumber = CONSTANTS.defaultSecurePortNumber;
|
|
||||||
} else{
|
|
||||||
cepPortNumber = cepPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(mode == null || mode == ""){
|
|
||||||
processMode = CONSTANTS.defaultMode;
|
|
||||||
} else{
|
|
||||||
processMode = mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
webSocketUrl = CONSTANTS.urlSecureTransportWebsocket + cepHostName + CONSTANTS.colon + cepPortNumber +
|
|
||||||
CONSTANTS.urlSeperator + CONSTANTS.websocketSubscriptionEndpoint;
|
|
||||||
|
|
||||||
if(processMode == CONSTANTS.processModeHTTP){
|
|
||||||
firstPollingAttempt = true;
|
|
||||||
pollingContinue = true;
|
|
||||||
startPoll();
|
|
||||||
} else{
|
|
||||||
initializeWebSocket(webSocketUrl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializing Web Socket
|
|
||||||
*/
|
|
||||||
function initializeWebSocket(webSocketUrl){
|
|
||||||
websocket = new WebSocket(webSocketUrl);
|
|
||||||
websocket.onopen = webSocketOnOpen;
|
|
||||||
websocket.onmessage = webSocketOnMessage;
|
|
||||||
websocket.onclose = webSocketOnClose;
|
|
||||||
websocket.onerror = webSocketOnError;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getWebsocketSubscriptionMessage(streamName, streamVersion, streamProperties, streamValues) {
|
|
||||||
if (streamProperties.length === streamValues.length) {
|
|
||||||
var message = {};
|
|
||||||
message.streamName = streamName;
|
|
||||||
message.streamVersion = streamVersion;
|
|
||||||
var i;
|
|
||||||
for (i = 0; i < streamProperties.length; i++) {
|
|
||||||
message.filterProps = [];
|
|
||||||
message.filterProps.push({
|
|
||||||
'name': streamProperties[i],
|
|
||||||
'value': streamValues[i]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return JSON.stringify(message);
|
|
||||||
} else {
|
|
||||||
console.log('stream properties and values are not in equal size');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Web socket On Open
|
|
||||||
*/
|
|
||||||
|
|
||||||
var webSocketOnOpen = function () {
|
|
||||||
var filterPropNames = ["meta_deviceId"];
|
|
||||||
var filterPropVals = ["htc"];
|
|
||||||
var data = getWebsocketSubscriptionMessage(stream, streamVersion, filterPropNames, filterPropVals);
|
|
||||||
websocket.send(data);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* On server sends a message
|
|
||||||
*/
|
|
||||||
var webSocketOnMessage = function (evt) {
|
|
||||||
var event = evt.data;
|
|
||||||
var array = JSON.parse(event);
|
|
||||||
constructPayload(array);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* On server close
|
|
||||||
*/
|
|
||||||
var webSocketOnClose =function (e) {
|
|
||||||
|
|
||||||
if(isErrorOccured){
|
|
||||||
if(processMode != CONSTANTS.processModeWebSocket){
|
|
||||||
firstPollingAttempt = true;
|
|
||||||
pollingContinue = true;
|
|
||||||
startPoll();
|
|
||||||
}
|
|
||||||
} else{
|
|
||||||
if(!terminateWebsocketInstance){
|
|
||||||
waitForSocketConnection(websocket);
|
|
||||||
} else{
|
|
||||||
terminateWebsocketInstance = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* On server Error
|
|
||||||
*/
|
|
||||||
var webSocketOnError = function (err) {
|
|
||||||
var error = "Error: Cannot connect to Websocket URL:" + webSocketUrl + " .Hence closing the connection!";
|
|
||||||
|
|
||||||
onErrorFunction(error);
|
|
||||||
isErrorOccured = true;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gracefully increments the connection retry
|
|
||||||
*/
|
|
||||||
var waitTime = CONSTANTS.numThousand;
|
|
||||||
function waitForSocketConnection(socket, callback){
|
|
||||||
setTimeout(
|
|
||||||
function () {
|
|
||||||
if (socket.readyState === 1) {
|
|
||||||
initializeWebSocket(webSocketUrl);
|
|
||||||
console.log("Connection is made");
|
|
||||||
if(callback != null){
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
websocket = new WebSocket(webSocketUrl);
|
|
||||||
waitTime += CONSTANTS.websocketTimeAppender;
|
|
||||||
waitForSocketConnection(websocket, callback);
|
|
||||||
}
|
|
||||||
}, waitTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Polling to retrieve events from http request periodically
|
|
||||||
*/
|
|
||||||
function startPoll(){
|
|
||||||
|
|
||||||
(function poll(){
|
|
||||||
setTimeout(function(){
|
|
||||||
httpUrl = CONSTANTS.urlSecureTransportHttp + cepHostName + CONSTANTS.colon + cepPortNumber +
|
|
||||||
CONSTANTS.urlSeperator + CONSTANTS.httpEventRetrievalEndpoint + CONSTANTS.queryParamStreamName + stream +
|
|
||||||
CONSTANTS.queryParamStreamVersion + streamVersion + CONSTANTS.queryParamLastUpdatedTime + lastUpdatedtime;;
|
|
||||||
$.getJSON(httpUrl, function(responseText) {
|
|
||||||
if(firstPollingAttempt){
|
|
||||||
/*var data = $("textarea#idConsole").val();
|
|
||||||
$("textarea#idConsole").val(data + "Successfully connected to HTTP.");*/
|
|
||||||
firstPollingAttempt = false;
|
|
||||||
}
|
|
||||||
var eventList = $.parseJSON(responseText.events);
|
|
||||||
if(eventList.length != 0){
|
|
||||||
lastUpdatedtime = responseText.lastEventTime;
|
|
||||||
for(var i=0;i<eventList.length;i++){
|
|
||||||
var arr = eventList[i];
|
|
||||||
constructPayload(arr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(pollingContinue){
|
|
||||||
startPoll();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.fail(function(errorData) {
|
|
||||||
var errorData = JSON.parse(errorData.responseText);
|
|
||||||
onErrorFunction(errorData.error);
|
|
||||||
});
|
|
||||||
}, polingInterval);
|
|
||||||
})()
|
|
||||||
}
|
|
||||||
|
|
||||||
function stopPollingProcesses(){
|
|
||||||
|
|
||||||
//stopping the Websocket
|
|
||||||
if(websocket != null){
|
|
||||||
terminateWebsocketInstance = true;
|
|
||||||
websocket.close();
|
|
||||||
}
|
|
||||||
//stopping the HTTPS Request
|
|
||||||
pollingContinue = false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function constructPayload(eventsArray){
|
|
||||||
|
|
||||||
var streamId = stream + CONSTANTS.colon + streamVersion;
|
|
||||||
var twoDimentionalArray = [eventsArray];
|
|
||||||
onSuccessFunction(streamId,twoDimentionalArray);
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<Analytics>
|
||||||
|
<Editable>true</Editable>
|
||||||
|
<Name>AndriodCallScript</Name>
|
||||||
|
<Script> CREATE TEMPORARY TABLE AndroidBatteryData USING CarbonAnalytics OPTIONS(tableName
|
||||||
|
"ORG_WSO2_IOT_ANDROID_BATTERY_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_BATTERY_STATS, DAY");
|
||||||
|
|
||||||
|
CREATE TEMPORARY TABLE Android_Battery_Stat_Per_Day USING CarbonAnalytics
|
||||||
|
OPTIONS (tableName "Android_Battery_Stat_Per_Day",
|
||||||
|
schema "owner STRING, deviceId STRING, type STRING, level INT -i, year INT -i, month INT -i, day INT -i,
|
||||||
|
timestamp STRING", primaryKeys "year, month, day, deviceId, owner, type", mergeSchema "false");
|
||||||
|
|
||||||
|
INSERT INTO TABLE Android_Battery_Stat_Per_Day
|
||||||
|
SELECT meta_owner as owner, meta_deviceId as deviceId, type, avg(level) as level, year, month, day,
|
||||||
|
getDateStartingTime(year, month, day) as timestamp
|
||||||
|
FROM AndroidBatteryData
|
||||||
|
GROUP BY year, month, day, meta_deviceId, meta_owner, type ORDER BY timestamp DESC;
|
||||||
|
|
||||||
|
INCREMENTAL_TABLE_COMMIT ORG_WSO2_IOT_ANDROID_BATTERY_STATS;
|
||||||
|
</Script>
|
||||||
|
<CronExpression>0 0/5 * * * ?</CronExpression>
|
||||||
|
</Analytics>
|
4
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/artifact.xml → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_script/artifact.xml
4
components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_level_chart_gadget/artifact.xml → components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_battery_script/artifact.xml
@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
~
|
||||||
|
~ WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
~ Version 2.0 (the "License"); you may not use this file except
|
||||||
|
~ in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing,
|
||||||
|
~ software distributed under the License is distributed on an
|
||||||
|
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
~ KIND, either express or implied. See the License for the
|
||||||
|
~ specific language governing permissions and limitations
|
||||||
|
~ under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<artifact name= "android_battery_stats_event_sink" version="1.0.0" type="analytics/eventstore"
|
||||||
|
serverRole="DataAnalyticsServer">
|
||||||
|
<file>org_wso2_iot_android_battery_stats.xml</file>
|
||||||
|
</artifact>
|
||||||
|
|
@ -0,0 +1,106 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<EventStoreConfiguration>
|
||||||
|
<TableSchema>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>meta_owner</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>STRING</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>meta_deviceId</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>STRING</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>meta_timestamp</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>LONG</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>level</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>INTEGER</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>state</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>STRING</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>status</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>LONG</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>temperature</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>INTEGER</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>year</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>INTEGER</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>month</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>INTEGER</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>day</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>INTEGER</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>hour</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>INTEGER</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
<ColumnDefinition>
|
||||||
|
<Name>minute</Name>
|
||||||
|
<IsFacet>false</IsFacet>
|
||||||
|
<EnableIndexing>false</EnableIndexing>
|
||||||
|
<IsPrimaryKey>false</IsPrimaryKey>
|
||||||
|
<EnableScoreParam>false</EnableScoreParam>
|
||||||
|
<Type>INTEGER</Type>
|
||||||
|
</ColumnDefinition>
|
||||||
|
</TableSchema>
|
||||||
|
<Source>
|
||||||
|
<StreamId>org.wso2.iot.android.battery.stats:1.0.0</StreamId>
|
||||||
|
</Source>
|
||||||
|
<MergeSchema>false</MergeSchema>
|
||||||
|
<RecordStoreName>PROCESSED_DATA_STORE</RecordStoreName>
|
||||||
|
</EventStoreConfiguration>
|
@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
~
|
||||||
|
~ WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
~ Version 2.0 (the "License"); you may not use this file except
|
||||||
|
~ in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing,
|
||||||
|
~ software distributed under the License is distributed on an
|
||||||
|
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
~ KIND, either express or implied. See the License for the
|
||||||
|
~ specific language governing permissions and limitations
|
||||||
|
~ under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<artifact name= "android_battery_stats_streams" version="1.0.0" type="event/stream" serverRole="DataAnalyticsServer">
|
||||||
|
<file>org.wso2.iot.android.battery.stats_1.0.0.json</file>
|
||||||
|
</artifact>
|
||||||
|
|
@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"name": "org.wso2.iot.android.battery.stats",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"nickName": "",
|
||||||
|
"description": "",
|
||||||
|
"metaData": [
|
||||||
|
{
|
||||||
|
"name": "owner",
|
||||||
|
"type": "STRING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "deviceId",
|
||||||
|
"type": "STRING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "timestamp",
|
||||||
|
"type": "LONG"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"payloadData": [
|
||||||
|
{
|
||||||
|
"name": "level",
|
||||||
|
"type": "INT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "state",
|
||||||
|
"type": "STRING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "status",
|
||||||
|
"type": "STRING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "temperature",
|
||||||
|
"type": "INT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "year",
|
||||||
|
"type": "INT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "month",
|
||||||
|
"type": "INT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "day",
|
||||||
|
"type": "INT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "hour",
|
||||||
|
"type": "INT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "minute",
|
||||||
|
"type": "INT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
~
|
||||||
|
~ WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
~ Version 2.0 (the "License"); you may not use this file except
|
||||||
|
~ in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing,
|
||||||
|
~ software distributed under the License is distributed on an
|
||||||
|
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
~ KIND, either express or implied. See the License for the
|
||||||
|
~ specific language governing permissions and limitations
|
||||||
|
~ under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<artifact name= "android_battery_stats_ui_event_publisher" version="1.0.0" type="event/publisher"
|
||||||
|
serverRole="DataAnalyticsServer">
|
||||||
|
<file>org.wso2.iot.android.battery.stats.ui.publisher.xml</file>
|
||||||
|
</artifact>
|
||||||
|
|
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<eventPublisher name="org.wso2.iot.android.battery.stats.ui.publisher"
|
||||||
|
processing="enable" statistics="disable" trace="disable" xmlns="http://wso2.org/carbon/eventpublisher">
|
||||||
|
<from streamName="org.wso2.iot.android.battery.stats" version="1.0.0"/>
|
||||||
|
<mapping customMapping="disable" type="wso2event"/>
|
||||||
|
<to eventAdapterType="ui"/>
|
||||||
|
</eventPublisher>
|
||||||
|
|
||||||
|
|
Binary file not shown.
@ -0,0 +1,85 @@
|
|||||||
|
{{!
|
||||||
|
Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
|
||||||
|
WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
Version 2.0 (the "License"); you may not use this file except
|
||||||
|
in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
}}
|
||||||
|
{{#zone "topCss"}}
|
||||||
|
<style>
|
||||||
|
.thumbnail.icon:before {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{{/zone}}
|
||||||
|
|
||||||
|
{{#zone "device-thumbnail"}}
|
||||||
|
<img src="{{@unit.publicUri}}/images/respberry-icon.png"/>
|
||||||
|
{{/zone}}
|
||||||
|
|
||||||
|
{{#zone "device-opetations"}}
|
||||||
|
<div style="background: #11375B; color: #fff; padding: 10px; margin-bottom: 5px">
|
||||||
|
Operations
|
||||||
|
</div>
|
||||||
|
<div class="add-margin-top-4x">
|
||||||
|
{{unit "iot.unit.device.operation-bar" device=device backendApiUri=backendApiUri autoCompleteParams=autoCompleteParams}}
|
||||||
|
</div>
|
||||||
|
{{/zone}}
|
||||||
|
|
||||||
|
{{#zone "device-detail-properties"}}
|
||||||
|
<div class="media">
|
||||||
|
<div class="media-left col-xs-12 col-sm-2 col-md-2 col-lg-2">
|
||||||
|
<ul class="list-group" role="tablist">
|
||||||
|
<li class="active"><a class="list-group-item" href="#device_statistics" role="tab"
|
||||||
|
data-toggle="tab" aria-controls="device_statistics">Device
|
||||||
|
Statistics</a>
|
||||||
|
</li>
|
||||||
|
<li><a class="list-group-item" href="#event_log" role="tab" data-toggle="tab"
|
||||||
|
aria-controls="event_log">Operations Log</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="media-body add-padding-left-5x remove-padding-xs tab-content">
|
||||||
|
<div class="panel-group tab-content">
|
||||||
|
|
||||||
|
<div class="panel panel-default tab-pane active"
|
||||||
|
id="device_statistics" role="tabpanel" aria-labelledby="device_statistics">
|
||||||
|
<div class="panel-heading">Device Statistics</div>
|
||||||
|
{{unit "cdmf.unit.device.type.raspberrypi.realtime.analytics-view" device=device}}
|
||||||
|
</div>
|
||||||
|
<div class="panel panel-default tab-pane" id="event_log" role="tabpanel"
|
||||||
|
aria-labelledby="event_log">
|
||||||
|
<div class="panel-heading">Operations Log <span><a href="#"
|
||||||
|
id="refresh-operations"><i
|
||||||
|
class="fw fw-refresh"></i></a></span></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<div id="operations-spinner" class="wr-advance-operations-init hidden">
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<i class="fw fw-settings fw-spin fw-2x"></i>
|
||||||
|
|
||||||
|
Loading Operations Log . . .
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
<div id="operations-log-container">
|
||||||
|
<div class="panel-body">
|
||||||
|
Not available yet
|
||||||
|
</div>
|
||||||
|
<br class="c-both"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/zone}}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue