Commit 4e8b0aa674fb89d62955b6482a0f1e446769667f

Authored by Andrii Shvaika
2 parents 458beede a7629fff

Merge branch 'master' of github.com:thingsboard/thingsboard

Showing 30 changed files with 4630 additions and 34 deletions

Too many changes to show.

To preserve performance only 30 of 36 files are displayed.

@@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.ResponseBody; @@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
26 import org.springframework.web.bind.annotation.RestController; 26 import org.springframework.web.bind.annotation.RestController;
27 import org.thingsboard.rule.engine.api.MailService; 27 import org.thingsboard.rule.engine.api.MailService;
28 import org.thingsboard.rule.engine.api.SmsService; 28 import org.thingsboard.rule.engine.api.SmsService;
29 -import org.thingsboard.rule.engine.api.sms.config.TestSmsRequest; 29 +import org.thingsboard.server.common.data.sms.config.TestSmsRequest;
30 import org.thingsboard.server.common.data.AdminSettings; 30 import org.thingsboard.server.common.data.AdminSettings;
31 import org.thingsboard.server.common.data.UpdateMessage; 31 import org.thingsboard.server.common.data.UpdateMessage;
32 import org.thingsboard.server.common.data.exception.ThingsboardException; 32 import org.thingsboard.server.common.data.exception.ThingsboardException;
@@ -166,7 +166,7 @@ public class DefaultTbApiUsageStateService implements TbApiUsageStateService { @@ -166,7 +166,7 @@ public class DefaultTbApiUsageStateService implements TbApiUsageStateService {
166 long newValue = tenantState.add(recordKey, kvProto.getValue()); 166 long newValue = tenantState.add(recordKey, kvProto.getValue());
167 updatedEntries.add(new BasicTsKvEntry(ts, new LongDataEntry(recordKey.getApiCountKey(), newValue))); 167 updatedEntries.add(new BasicTsKvEntry(ts, new LongDataEntry(recordKey.getApiCountKey(), newValue)));
168 long newHourlyValue = tenantState.addToHourly(recordKey, kvProto.getValue()); 168 long newHourlyValue = tenantState.addToHourly(recordKey, kvProto.getValue());
169 - updatedEntries.add(new BasicTsKvEntry(hourTs, new LongDataEntry(recordKey.getApiCountKey() + HOURLY, newHourlyValue))); 169 + updatedEntries.add(new BasicTsKvEntry(newHourTs, new LongDataEntry(recordKey.getApiCountKey() + HOURLY, newHourlyValue)));
170 apiFeatures.add(recordKey.getApiFeature()); 170 apiFeatures.add(recordKey.getApiFeature());
171 } 171 }
172 result = tenantState.checkStateUpdatedDueToThreshold(apiFeatures); 172 result = tenantState.checkStateUpdatedDueToThreshold(apiFeatures);
@@ -112,7 +112,7 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService { @@ -112,7 +112,7 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService {
112 public ProvisionResponse provisionDevice(ProvisionRequest provisionRequest) { 112 public ProvisionResponse provisionDevice(ProvisionRequest provisionRequest) {
113 String provisionRequestKey = provisionRequest.getCredentials().getProvisionDeviceKey(); 113 String provisionRequestKey = provisionRequest.getCredentials().getProvisionDeviceKey();
114 String provisionRequestSecret = provisionRequest.getCredentials().getProvisionDeviceSecret(); 114 String provisionRequestSecret = provisionRequest.getCredentials().getProvisionDeviceSecret();
115 - if (provisionRequest.getDeviceName() != null) { 115 + if (!StringUtils.isEmpty(provisionRequest.getDeviceName())) {
116 provisionRequest.setDeviceName(provisionRequest.getDeviceName().trim()); 116 provisionRequest.setDeviceName(provisionRequest.getDeviceName().trim());
117 if (StringUtils.isEmpty(provisionRequest.getDeviceName())) { 117 if (StringUtils.isEmpty(provisionRequest.getDeviceName())) {
118 log.warn("Provision request contains empty device name!"); 118 log.warn("Provision request contains empty device name!");
@@ -18,9 +18,9 @@ package org.thingsboard.server.service.sms; @@ -18,9 +18,9 @@ package org.thingsboard.server.service.sms;
18 import org.springframework.stereotype.Component; 18 import org.springframework.stereotype.Component;
19 import org.thingsboard.rule.engine.api.sms.SmsSender; 19 import org.thingsboard.rule.engine.api.sms.SmsSender;
20 import org.thingsboard.rule.engine.api.sms.SmsSenderFactory; 20 import org.thingsboard.rule.engine.api.sms.SmsSenderFactory;
21 -import org.thingsboard.rule.engine.api.sms.config.AwsSnsSmsProviderConfiguration;  
22 -import org.thingsboard.rule.engine.api.sms.config.SmsProviderConfiguration;  
23 -import org.thingsboard.rule.engine.api.sms.config.TwilioSmsProviderConfiguration; 21 +import org.thingsboard.server.common.data.sms.config.AwsSnsSmsProviderConfiguration;
  22 +import org.thingsboard.server.common.data.sms.config.SmsProviderConfiguration;
  23 +import org.thingsboard.server.common.data.sms.config.TwilioSmsProviderConfiguration;
24 import org.thingsboard.server.service.sms.aws.AwsSmsSender; 24 import org.thingsboard.server.service.sms.aws.AwsSmsSender;
25 import org.thingsboard.server.service.sms.twilio.TwilioSmsSender; 25 import org.thingsboard.server.service.sms.twilio.TwilioSmsSender;
26 26
@@ -22,8 +22,8 @@ import org.springframework.stereotype.Service; @@ -22,8 +22,8 @@ import org.springframework.stereotype.Service;
22 import org.thingsboard.rule.engine.api.SmsService; 22 import org.thingsboard.rule.engine.api.SmsService;
23 import org.thingsboard.rule.engine.api.sms.SmsSender; 23 import org.thingsboard.rule.engine.api.sms.SmsSender;
24 import org.thingsboard.rule.engine.api.sms.SmsSenderFactory; 24 import org.thingsboard.rule.engine.api.sms.SmsSenderFactory;
25 -import org.thingsboard.rule.engine.api.sms.config.SmsProviderConfiguration;  
26 -import org.thingsboard.rule.engine.api.sms.config.TestSmsRequest; 25 +import org.thingsboard.server.common.data.sms.config.SmsProviderConfiguration;
  26 +import org.thingsboard.server.common.data.sms.config.TestSmsRequest;
27 import org.thingsboard.server.common.data.AdminSettings; 27 import org.thingsboard.server.common.data.AdminSettings;
28 import org.thingsboard.server.common.data.ApiUsageRecordKey; 28 import org.thingsboard.server.common.data.ApiUsageRecordKey;
29 import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; 29 import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
@@ -23,7 +23,7 @@ import com.amazonaws.services.sns.AmazonSNSClient; @@ -23,7 +23,7 @@ import com.amazonaws.services.sns.AmazonSNSClient;
23 import com.amazonaws.services.sns.model.PublishRequest; 23 import com.amazonaws.services.sns.model.PublishRequest;
24 import lombok.extern.slf4j.Slf4j; 24 import lombok.extern.slf4j.Slf4j;
25 import org.apache.commons.lang3.StringUtils; 25 import org.apache.commons.lang3.StringUtils;
26 -import org.thingsboard.rule.engine.api.sms.config.AwsSnsSmsProviderConfiguration; 26 +import org.thingsboard.server.common.data.sms.config.AwsSnsSmsProviderConfiguration;
27 import org.thingsboard.rule.engine.api.sms.exception.SmsException; 27 import org.thingsboard.rule.engine.api.sms.exception.SmsException;
28 import org.thingsboard.rule.engine.api.sms.exception.SmsSendException; 28 import org.thingsboard.rule.engine.api.sms.exception.SmsSendException;
29 import org.thingsboard.server.service.sms.AbstractSmsSender; 29 import org.thingsboard.server.service.sms.AbstractSmsSender;
@@ -19,7 +19,7 @@ import com.twilio.http.TwilioRestClient; @@ -19,7 +19,7 @@ import com.twilio.http.TwilioRestClient;
19 import com.twilio.rest.api.v2010.account.Message; 19 import com.twilio.rest.api.v2010.account.Message;
20 import com.twilio.type.PhoneNumber; 20 import com.twilio.type.PhoneNumber;
21 import org.apache.commons.lang3.StringUtils; 21 import org.apache.commons.lang3.StringUtils;
22 -import org.thingsboard.rule.engine.api.sms.config.TwilioSmsProviderConfiguration; 22 +import org.thingsboard.server.common.data.sms.config.TwilioSmsProviderConfiguration;
23 import org.thingsboard.rule.engine.api.sms.exception.SmsException; 23 import org.thingsboard.rule.engine.api.sms.exception.SmsException;
24 import org.thingsboard.rule.engine.api.sms.exception.SmsSendException; 24 import org.thingsboard.rule.engine.api.sms.exception.SmsSendException;
25 import org.thingsboard.server.service.sms.AbstractSmsSender; 25 import org.thingsboard.server.service.sms.AbstractSmsSender;
common/data/src/main/java/org/thingsboard/server/common/data/sms/config/AwsSnsSmsProviderConfiguration.java renamed from rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/sms/config/AwsSnsSmsProviderConfiguration.java
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 * See the License for the specific language governing permissions and 13 * See the License for the specific language governing permissions and
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 -package org.thingsboard.rule.engine.api.sms.config; 16 +package org.thingsboard.server.common.data.sms.config;
17 17
18 import lombok.Data; 18 import lombok.Data;
19 19
common/data/src/main/java/org/thingsboard/server/common/data/sms/config/SmsProviderConfiguration.java renamed from rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/sms/config/SmsProviderConfiguration.java
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 * See the License for the specific language governing permissions and 13 * See the License for the specific language governing permissions and
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 -package org.thingsboard.rule.engine.api.sms.config; 16 +package org.thingsboard.server.common.data.sms.config;
17 17
18 import com.fasterxml.jackson.annotation.JsonIgnore; 18 import com.fasterxml.jackson.annotation.JsonIgnore;
19 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 19 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
common/data/src/main/java/org/thingsboard/server/common/data/sms/config/SmsProviderType.java renamed from rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/sms/config/SmsProviderType.java
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 * See the License for the specific language governing permissions and 13 * See the License for the specific language governing permissions and
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 -package org.thingsboard.rule.engine.api.sms.config; 16 +package org.thingsboard.server.common.data.sms.config;
17 17
18 public enum SmsProviderType { 18 public enum SmsProviderType {
19 AWS_SNS, 19 AWS_SNS,
common/data/src/main/java/org/thingsboard/server/common/data/sms/config/TestSmsRequest.java renamed from rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/sms/config/TestSmsRequest.java
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 * See the License for the specific language governing permissions and 13 * See the License for the specific language governing permissions and
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 -package org.thingsboard.rule.engine.api.sms.config; 16 +package org.thingsboard.server.common.data.sms.config;
17 17
18 import lombok.Data; 18 import lombok.Data;
19 19
common/data/src/main/java/org/thingsboard/server/common/data/sms/config/TwilioSmsProviderConfiguration.java renamed from rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/sms/config/TwilioSmsProviderConfiguration.java
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 * See the License for the specific language governing permissions and 13 * See the License for the specific language governing permissions and
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 -package org.thingsboard.rule.engine.api.sms.config; 16 +package org.thingsboard.server.common.data.sms.config;
17 17
18 import lombok.Data; 18 import lombok.Data;
19 19
@@ -109,6 +109,7 @@ import org.thingsboard.server.common.data.security.DeviceCredentials; @@ -109,6 +109,7 @@ import org.thingsboard.server.common.data.security.DeviceCredentials;
109 import org.thingsboard.server.common.data.security.DeviceCredentialsType; 109 import org.thingsboard.server.common.data.security.DeviceCredentialsType;
110 import org.thingsboard.server.common.data.security.model.SecuritySettings; 110 import org.thingsboard.server.common.data.security.model.SecuritySettings;
111 import org.thingsboard.server.common.data.security.model.UserPasswordPolicy; 111 import org.thingsboard.server.common.data.security.model.UserPasswordPolicy;
  112 +import org.thingsboard.server.common.data.sms.config.TestSmsRequest;
112 import org.thingsboard.server.common.data.widget.WidgetType; 113 import org.thingsboard.server.common.data.widget.WidgetType;
113 import org.thingsboard.server.common.data.widget.WidgetsBundle; 114 import org.thingsboard.server.common.data.widget.WidgetsBundle;
114 115
@@ -218,7 +219,11 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { @@ -218,7 +219,11 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
218 } 219 }
219 220
220 public void sendTestMail(AdminSettings adminSettings) { 221 public void sendTestMail(AdminSettings adminSettings) {
221 - restTemplate.postForEntity(baseURL + "/api/admin/settings/testMail", adminSettings, AdminSettings.class); 222 + restTemplate.postForLocation(baseURL + "/api/admin/settings/testMail", adminSettings);
  223 + }
  224 +
  225 + public void sendTestSms(TestSmsRequest testSmsRequest) {
  226 + restTemplate.postForLocation(baseURL + "/api/admin/settings/testSms", testSmsRequest);
222 } 227 }
223 228
224 public Optional<SecuritySettings> getSecuritySettings() { 229 public Optional<SecuritySettings> getSecuritySettings() {
@@ -1714,6 +1719,10 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { @@ -1714,6 +1719,10 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
1714 return restTemplate.postForEntity(baseURL + "/api/oauth2/config", oauth2Params, OAuth2ClientsParams.class).getBody(); 1719 return restTemplate.postForEntity(baseURL + "/api/oauth2/config", oauth2Params, OAuth2ClientsParams.class).getBody();
1715 } 1720 }
1716 1721
  1722 + public String getLoginProcessingUrl() {
  1723 + return restTemplate.getForEntity(baseURL + "/api/oauth2/loginProcessingUrl", String.class).getBody();
  1724 + }
  1725 +
1717 public void handleOneWayDeviceRPCRequest(DeviceId deviceId, JsonNode requestBody) { 1726 public void handleOneWayDeviceRPCRequest(DeviceId deviceId, JsonNode requestBody) {
1718 restTemplate.postForLocation(baseURL + "/api/plugins/rpc/oneway/{deviceId}", requestBody, deviceId.getId()); 1727 restTemplate.postForLocation(baseURL + "/api/plugins/rpc/oneway/{deviceId}", requestBody, deviceId.getId());
1719 } 1728 }
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 */ 15 */
16 package org.thingsboard.rule.engine.api; 16 package org.thingsboard.rule.engine.api;
17 17
18 -import org.thingsboard.rule.engine.api.sms.config.TestSmsRequest; 18 +import org.thingsboard.server.common.data.sms.config.TestSmsRequest;
19 import org.thingsboard.server.common.data.exception.ThingsboardException; 19 import org.thingsboard.server.common.data.exception.ThingsboardException;
20 import org.thingsboard.server.common.data.id.TenantId; 20 import org.thingsboard.server.common.data.id.TenantId;
21 21
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 */ 15 */
16 package org.thingsboard.rule.engine.api.sms; 16 package org.thingsboard.rule.engine.api.sms;
17 17
18 -import org.thingsboard.rule.engine.api.sms.config.SmsProviderConfiguration; 18 +import org.thingsboard.server.common.data.sms.config.SmsProviderConfiguration;
19 19
20 public interface SmsSenderFactory { 20 public interface SmsSenderFactory {
21 21
@@ -17,7 +17,7 @@ package org.thingsboard.rule.engine.sms; @@ -17,7 +17,7 @@ package org.thingsboard.rule.engine.sms;
17 17
18 import lombok.Data; 18 import lombok.Data;
19 import org.thingsboard.rule.engine.api.NodeConfiguration; 19 import org.thingsboard.rule.engine.api.NodeConfiguration;
20 -import org.thingsboard.rule.engine.api.sms.config.SmsProviderConfiguration; 20 +import org.thingsboard.server.common.data.sms.config.SmsProviderConfiguration;
21 21
22 @Data 22 @Data
23 public class TbSendSmsNodeConfiguration implements NodeConfiguration { 23 public class TbSendSmsNodeConfiguration implements NodeConfiguration {
@@ -23,6 +23,7 @@ export interface MenuSection extends HasUUID{ @@ -23,6 +23,7 @@ export interface MenuSection extends HasUUID{
23 type: MenuSectionType; 23 type: MenuSectionType;
24 path: string; 24 path: string;
25 icon: string; 25 icon: string;
  26 + notExact?: boolean;
26 isMdiIcon?: boolean; 27 isMdiIcon?: boolean;
27 height?: string; 28 height?: string;
28 pages?: Array<MenuSection>; 29 pages?: Array<MenuSection>;
@@ -288,6 +288,14 @@ export class MenuService { @@ -288,6 +288,14 @@ export class MenuService {
288 type: 'link', 288 type: 'link',
289 path: '/auditLogs', 289 path: '/auditLogs',
290 icon: 'track_changes' 290 icon: 'track_changes'
  291 + },
  292 + {
  293 + id: guid(),
  294 + name: 'api-usage.api-usage',
  295 + type: 'link',
  296 + path: '/usage',
  297 + icon: 'insert_chart',
  298 + notExact: true
291 } 299 }
292 ); 300 );
293 return sections; 301 return sections;
@@ -374,6 +382,11 @@ export class MenuService { @@ -374,6 +382,11 @@ export class MenuService {
374 name: 'audit-log.audit-logs', 382 name: 'audit-log.audit-logs',
375 icon: 'track_changes', 383 icon: 'track_changes',
376 path: '/auditLogs' 384 path: '/auditLogs'
  385 + },
  386 + {
  387 + name: 'api-usage.api-usage',
  388 + icon: 'insert_chart',
  389 + path: '/usage'
377 } 390 }
378 ] 391 ]
379 } 392 }
@@ -21,17 +21,18 @@ import { Inject, Injectable, NgZone } from '@angular/core'; @@ -21,17 +21,18 @@ import { Inject, Injectable, NgZone } from '@angular/core';
21 import { WINDOW } from '@core/services/window.service'; 21 import { WINDOW } from '@core/services/window.service';
22 import { ExceptionData } from '@app/shared/models/error.models'; 22 import { ExceptionData } from '@app/shared/models/error.models';
23 import { 23 import {
  24 + baseUrl,
24 createLabelFromDatasource, 25 createLabelFromDatasource,
25 deepClone, 26 deepClone,
26 deleteNullProperties, 27 deleteNullProperties,
27 guid, 28 guid,
28 isDefined, 29 isDefined,
29 - isDefinedAndNotNull, 30 + isDefinedAndNotNull, isString,
30 isUndefined 31 isUndefined
31 } from '@core/utils'; 32 } from '@core/utils';
32 import { WindowMessage } from '@shared/models/window-message.model'; 33 import { WindowMessage } from '@shared/models/window-message.model';
33 import { TranslateService } from '@ngx-translate/core'; 34 import { TranslateService } from '@ngx-translate/core';
34 -import { customTranslationsPrefix } from '@app/shared/models/constants'; 35 +import { customTranslationsPrefix, i18nPrefix } from '@app/shared/models/constants';
35 import { DataKey, Datasource, DatasourceType, KeyInfo } from '@shared/models/widget.models'; 36 import { DataKey, Datasource, DatasourceType, KeyInfo } from '@shared/models/widget.models';
36 import { EntityType } from '@shared/models/entity-type.models'; 37 import { EntityType } from '@shared/models/entity-type.models';
37 import { DataKeyType } from '@app/shared/models/telemetry/telemetry.models'; 38 import { DataKeyType } from '@app/shared/models/telemetry/telemetry.models';
@@ -42,6 +43,8 @@ import jsonSchemaDefaults from 'json-schema-defaults'; @@ -42,6 +43,8 @@ import jsonSchemaDefaults from 'json-schema-defaults';
42 import materialIconsCodepoints from '!raw-loader!material-design-icons/iconfont/codepoints'; 43 import materialIconsCodepoints from '!raw-loader!material-design-icons/iconfont/codepoints';
43 import { Observable, of, ReplaySubject } from 'rxjs'; 44 import { Observable, of, ReplaySubject } from 'rxjs';
44 45
  46 +const i18nRegExp = new RegExp(`{${i18nPrefix}:[^{}]+}`, 'g');
  47 +
45 const predefinedFunctions: { [func: string]: string } = { 48 const predefinedFunctions: { [func: string]: string } = {
46 Sin: 'return Math.round(1000*Math.sin(time/5000));', 49 Sin: 'return Math.round(1000*Math.sin(time/5000));',
47 Cos: 'return Math.round(1000*Math.cos(time/5000));', 50 Cos: 'return Math.round(1000*Math.cos(time/5000));',
@@ -107,8 +110,8 @@ export class UtilsService { @@ -107,8 +110,8 @@ export class UtilsService {
107 materialIcons: Array<string> = []; 110 materialIcons: Array<string> = [];
108 111
109 constructor(@Inject(WINDOW) private window: Window, 112 constructor(@Inject(WINDOW) private window: Window,
110 - private zone: NgZone,  
111 - private translate: TranslateService) { 113 + private zone: NgZone,
  114 + private translate: TranslateService) {
112 let frame: Element = null; 115 let frame: Element = null;
113 try { 116 try {
114 frame = window.frameElement; 117 frame = window.frameElement;
@@ -221,8 +224,31 @@ export class UtilsService { @@ -221,8 +224,31 @@ export class UtilsService {
221 } 224 }
222 225
223 public customTranslation(translationValue: string, defaultValue: string): string { 226 public customTranslation(translationValue: string, defaultValue: string): string {
  227 + if (translationValue && isString(translationValue)) {
  228 + if (translationValue.includes(`{${i18nPrefix}`)) {
  229 + const matches = translationValue.match(i18nRegExp);
  230 + let result = translationValue;
  231 + for (const match of matches) {
  232 + const translationId = match.substring(6, match.length - 1);
  233 + result = result.replace(match, this.doTranslate(translationId, match));
  234 + }
  235 + return result;
  236 + } else {
  237 + return this.doTranslate(translationValue, defaultValue, customTranslationsPrefix);
  238 + }
  239 + } else {
  240 + return translationValue;
  241 + }
  242 + }
  243 +
  244 + private doTranslate(translationValue: string, defaultValue: string, prefix?: string): string {
224 let result: string; 245 let result: string;
225 - const translationId = customTranslationsPrefix + translationValue; 246 + let translationId;
  247 + if (prefix) {
  248 + translationId = prefix + translationValue;
  249 + } else {
  250 + translationId = translationValue;
  251 + }
226 const translation = this.translate.instant(translationId); 252 const translation = this.translate.instant(translationId);
227 if (translation !== translationId) { 253 if (translation !== translationId) {
228 result = translation + ''; 254 result = translation + '';
@@ -384,7 +410,7 @@ export class UtilsService { @@ -384,7 +410,7 @@ export class UtilsService {
384 } 410 }
385 411
386 public updateQueryParam(name: string, value: string | null) { 412 public updateQueryParam(name: string, value: string | null) {
387 - const baseUrl = [this.window.location.protocol, '//', this.window.location.host, this.window.location.pathname].join(''); 413 + const baseUrlPart = [baseUrl(), this.window.location.pathname].join('');
388 const urlQueryString = this.window.location.search; 414 const urlQueryString = this.window.location.search;
389 let newParam = ''; 415 let newParam = '';
390 let params = ''; 416 let params = '';
@@ -404,7 +430,11 @@ export class UtilsService { @@ -404,7 +430,11 @@ export class UtilsService {
404 } else if (newParam) { 430 } else if (newParam) {
405 params = '?' + newParam; 431 params = '?' + newParam;
406 } 432 }
407 - this.window.history.replaceState({}, '', baseUrl + params); 433 + this.window.history.replaceState({}, '', baseUrlPart + params);
  434 + }
  435 +
  436 + public baseUrl(): string {
  437 + return baseUrl();
408 } 438 }
409 439
410 public deepClone<T>(target: T, ignoreFields?: string[]): T { 440 public deepClone<T>(target: T, ignoreFields?: string[]): T {
@@ -385,6 +385,15 @@ export function padValue(val: any, dec: number): string { @@ -385,6 +385,15 @@ export function padValue(val: any, dec: number): string {
385 return strVal; 385 return strVal;
386 } 386 }
387 387
  388 +export function baseUrl(): string {
  389 + let url = window.location.protocol + '//' + window.location.hostname;
  390 + const port = window.location.port;
  391 + if (port && port.length > 0 && port !== '80' && port !== '443') {
  392 + url += ':' + port;
  393 + }
  394 + return url;
  395 +}
  396 +
388 export function sortObjectKeys<T>(obj: T): T { 397 export function sortObjectKeys<T>(obj: T): T {
389 return Object.keys(obj).sort().reduce((acc, key) => { 398 return Object.keys(obj).sort().reduce((acc, key) => {
390 acc[key] = obj[key]; 399 acc[key] = obj[key];
@@ -71,7 +71,7 @@ const customPrettyActionCompletions: TbEditorCompletions = { @@ -71,7 +71,7 @@ const customPrettyActionCompletions: TbEditorCompletions = {
71 } 71 }
72 }, 72 },
73 ...customActionCompletions 73 ...customActionCompletions
74 -} 74 +};
75 75
76 export const CustomActionEditorCompleter = new TbEditorCompleter(customActionCompletions); 76 export const CustomActionEditorCompleter = new TbEditorCompleter(customActionCompletions);
77 export const CustomPrettyActionEditorCompleter = new TbEditorCompleter(customPrettyActionCompletions); 77 export const CustomPrettyActionEditorCompleter = new TbEditorCompleter(customPrettyActionCompletions);
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 limitations under the License. 15 limitations under the License.
16 16
17 --> 17 -->
18 -<a mat-button routerLinkActive="tb-active" [routerLinkActiveOptions]="{exact: true}" routerLink="{{section.path}}"> 18 +<a mat-button routerLinkActive="tb-active" [routerLinkActiveOptions]="{exact: !section.notExact}" routerLink="{{section.path}}">
19 <mat-icon *ngIf="!section.isMdiIcon && section.icon != null" class="material-icons">{{section.icon}}</mat-icon> 19 <mat-icon *ngIf="!section.isMdiIcon && section.icon != null" class="material-icons">{{section.icon}}</mat-icon>
20 <mat-icon *ngIf="section.isMdiIcon && section.icon != null" [svgIcon]="section.icon"></mat-icon> 20 <mat-icon *ngIf="section.isMdiIcon && section.icon != null" [svgIcon]="section.icon"></mat-icon>
21 <span>{{section.name | translate}}</span> 21 <span>{{section.name | translate}}</span>
  1 +///
  2 +/// Copyright © 2016-2020 The Thingsboard Authors
  3 +///
  4 +/// Licensed under the Apache License, Version 2.0 (the "License");
  5 +/// you may not use this file except in compliance with the License.
  6 +/// You may obtain a copy of the License at
  7 +///
  8 +/// http://www.apache.org/licenses/LICENSE-2.0
  9 +///
  10 +/// Unless required by applicable law or agreed to in writing, software
  11 +/// distributed under the License is distributed on an "AS IS" BASIS,
  12 +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 +/// See the License for the specific language governing permissions and
  14 +/// limitations under the License.
  15 +///
  16 +
  17 +import { NgModule } from '@angular/core';
  18 +import { RouterModule, Routes } from '@angular/router';
  19 +import { Authority } from '@shared/models/authority.enum';
  20 +import { ApiUsageComponent } from '@home/pages/api-usage/api-usage.component';
  21 +
  22 +const routes: Routes = [
  23 + {
  24 + path: 'usage',
  25 + component: ApiUsageComponent,
  26 + data: {
  27 + auth: [Authority.TENANT_ADMIN],
  28 + title: 'api-usage.api-usage',
  29 + breadcrumb: {
  30 + label: 'api-usage.api-usage',
  31 + icon: 'insert_chart'
  32 + }
  33 + }
  34 + }
  35 +];
  36 +
  37 +@NgModule({
  38 + imports: [RouterModule.forChild(routes)],
  39 + exports: [RouterModule]
  40 +})
  41 +export class ApiUsageRoutingModule { }
  1 +<!--
  2 +
  3 + Copyright © 2016-2020 The Thingsboard Authors
  4 +
  5 + Licensed under the Apache License, Version 2.0 (the "License");
  6 + you may not use this file except in compliance with the License.
  7 + You may obtain a copy of the License at
  8 +
  9 + http://www.apache.org/licenses/LICENSE-2.0
  10 +
  11 + Unless required by applicable law or agreed to in writing, software
  12 + distributed under the License is distributed on an "AS IS" BASIS,
  13 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14 + See the License for the specific language governing permissions and
  15 + limitations under the License.
  16 +
  17 +-->
  18 +<tb-dashboard-page [embedded]="true" [dashboard]="apiUsageDashboard"></tb-dashboard-page>
  1 +/**
  2 + * Copyright © 2016-2020 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +
  17 +:host {
  18 + width: 100%;
  19 + height: 100%;
  20 +}
  1 +///
  2 +/// Copyright © 2016-2020 The Thingsboard Authors
  3 +///
  4 +/// Licensed under the Apache License, Version 2.0 (the "License");
  5 +/// you may not use this file except in compliance with the License.
  6 +/// You may obtain a copy of the License at
  7 +///
  8 +/// http://www.apache.org/licenses/LICENSE-2.0
  9 +///
  10 +/// Unless required by applicable law or agreed to in writing, software
  11 +/// distributed under the License is distributed on an "AS IS" BASIS,
  12 +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 +/// See the License for the specific language governing permissions and
  14 +/// limitations under the License.
  15 +///
  16 +
  17 +import { Component, OnInit } from '@angular/core';
  18 +import { Store } from '@ngrx/store';
  19 +import { AppState } from '@core/core.state';
  20 +import { PageComponent } from '@shared/components/page.component';
  21 +import apiUsageDashboardJson from '!raw-loader!./api_usage_json.raw';
  22 +import { Dashboard } from '@shared/models/dashboard.models';
  23 +
  24 +@Component({
  25 + selector: 'tb-api-usage',
  26 + templateUrl: './api-usage.component.html',
  27 + styleUrls: ['./api-usage.component.scss']
  28 +})
  29 +export class ApiUsageComponent extends PageComponent implements OnInit {
  30 +
  31 + apiUsageDashboard: Dashboard;
  32 +
  33 + constructor(protected store: Store<AppState>) {
  34 + super(store);
  35 + }
  36 +
  37 + ngOnInit() {
  38 + this.apiUsageDashboard = JSON.parse(apiUsageDashboardJson);
  39 + }
  40 +
  41 +}
  1 +///
  2 +/// Copyright © 2016-2020 The Thingsboard Authors
  3 +///
  4 +/// Licensed under the Apache License, Version 2.0 (the "License");
  5 +/// you may not use this file except in compliance with the License.
  6 +/// You may obtain a copy of the License at
  7 +///
  8 +/// http://www.apache.org/licenses/LICENSE-2.0
  9 +///
  10 +/// Unless required by applicable law or agreed to in writing, software
  11 +/// distributed under the License is distributed on an "AS IS" BASIS,
  12 +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 +/// See the License for the specific language governing permissions and
  14 +/// limitations under the License.
  15 +///
  16 +
  17 +import { NgModule } from '@angular/core';
  18 +import { CommonModule } from '@angular/common';
  19 +import { SharedModule } from '@app/shared/shared.module';
  20 +import { HomeComponentsModule } from '@modules/home/components/home-components.module';
  21 +import { ApiUsageComponent } from '@home/pages/api-usage/api-usage.component';
  22 +import { DashboardModule } from '@home/pages/dashboard/dashboard.module';
  23 +import { ApiUsageRoutingModule } from '@home/pages/api-usage/api-usage-routing.module';
  24 +
  25 +@NgModule({
  26 + declarations:
  27 + [
  28 + ApiUsageComponent
  29 + ],
  30 + imports: [
  31 + CommonModule,
  32 + SharedModule,
  33 + HomeComponentsModule,
  34 + DashboardModule,
  35 + ApiUsageRoutingModule
  36 + ]
  37 +})
  38 +export class ApiUsageModule { }
  1 +{
  2 + "title": "Api Usage",
  3 + "configuration": {
  4 + "description": "",
  5 + "widgets": {
  6 + "fd6df872-2ddf-0921-3929-2e7f55062fad": {
  7 + "isSystemType": true,
  8 + "bundleAlias": "cards",
  9 + "typeAlias": "html_value_card",
  10 + "type": "latest",
  11 + "title": "New widget",
  12 + "sizeX": 7.5,
  13 + "sizeY": 3,
  14 + "config": {
  15 + "datasources": [
  16 + {
  17 + "type": "entity",
  18 + "name": null,
  19 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  20 + "filterId": null,
  21 + "dataKeys": [
  22 + {
  23 + "name": "jsExecutionApiState",
  24 + "type": "timeseries",
  25 + "label": "apiState",
  26 + "color": "#2196f3",
  27 + "settings": {},
  28 + "_hash": 0.8830669138660703,
  29 + "units": null,
  30 + "decimals": null,
  31 + "funcBody": null,
  32 + "usePostProcessing": null,
  33 + "postFuncBody": null
  34 + },
  35 + {
  36 + "name": "jsExecutionLimit",
  37 + "type": "timeseries",
  38 + "label": "limit",
  39 + "color": "#4caf50",
  40 + "settings": {},
  41 + "_hash": 0.5463603803546802,
  42 + "units": null,
  43 + "decimals": null,
  44 + "funcBody": null,
  45 + "usePostProcessing": null,
  46 + "postFuncBody": null
  47 + },
  48 + {
  49 + "name": "jsExecutionCount",
  50 + "type": "timeseries",
  51 + "label": "count",
  52 + "color": "#f44336",
  53 + "settings": {},
  54 + "_hash": 0.5564241862015964,
  55 + "units": null,
  56 + "decimals": null,
  57 + "funcBody": null,
  58 + "usePostProcessing": null,
  59 + "postFuncBody": null
  60 + },
  61 + {
  62 + "name": "jsExecutionApiState",
  63 + "type": "timeseries",
  64 + "label": "apiStateClass",
  65 + "color": "#ffc107",
  66 + "settings": {},
  67 + "_hash": 0.8737107059960671,
  68 + "units": null,
  69 + "decimals": null,
  70 + "funcBody": null,
  71 + "usePostProcessing": true,
  72 + "postFuncBody": "return value ? value.toLowerCase() : '';"
  73 + },
  74 + {
  75 + "name": "jsExecutionApiState",
  76 + "type": "timeseries",
  77 + "label": "cardId",
  78 + "color": "#607d8b",
  79 + "settings": {},
  80 + "_hash": 0.051659774305067296,
  81 + "units": null,
  82 + "decimals": null,
  83 + "funcBody": null,
  84 + "usePostProcessing": true,
  85 + "postFuncBody": "return (Math.random()*100000).toFixed(0);"
  86 + },
  87 + {
  88 + "name": "jsExecutionApiState",
  89 + "type": "timeseries",
  90 + "label": "title",
  91 + "color": "#9c27b0",
  92 + "settings": {},
  93 + "_hash": 0.7673280949238444,
  94 + "units": null,
  95 + "decimals": null,
  96 + "funcBody": null,
  97 + "usePostProcessing": true,
  98 + "postFuncBody": "return \"JavaScript functions\";"
  99 + }
  100 + ]
  101 + }
  102 + ],
  103 + "timewindow": {
  104 + "realtime": {
  105 + "timewindowMs": 60000
  106 + }
  107 + },
  108 + "showTitle": false,
  109 + "backgroundColor": "#fff",
  110 + "color": "#666666",
  111 + "padding": "0",
  112 + "settings": {
  113 + "cardCss": ".card {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n}\n\n.card .content {\n flex: 1; \n padding: 13px 13px 0;\n display: flex;\n box-sizing: border-box;\n}\n\n.card .content .column {\n display: flex;\n flex-direction: column; \n justify-content: space-around;\n flex: 1;\n}\n\n.card .content .title-row {\n display: flex;\n flex-direction: row;\n padding-bottom: 10px;\n}\n\n.card .title {\n flex: 1;\n font-size: 20px;\n font-weight: 400;\n color: #666666;\n}\n\n.card .state {\n text-transform: uppercase;\n font-size: 20px;\n font-weight: bold;\n}\n\n.card.enabled .state {\n color: #00B260;\n}\n\n.card.warning .state {\n color: #FFAD6F;\n}\n\n.card.disabled .state {\n color: #F73243;\n}\n\n.card .bar-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.card .bar {\n flex: 1;\n max-height: 30px;\n margin-top: 3.5px;\n margin-bottom: 4px;\n background-color: #F0F0F0;\n border: 1px solid #DADCDB;\n border-radius: 2px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, .2);\n}\n\n.card.enabled .bar {\n border-color: #00B260;\n background-color: #F0FBF7;\n}\n\n.card.warning .bar {\n border-color: #FFAD6F;\n background-color: #FFFAF6;\n}\n\n.card.disabled .bar {\n border-color: #F73243;\n background-color: #FFF0F0;\n}\n\n.card .bar .bar-fill {\n background-color: #F0F0F0;\n border-radius: 2px;\n height: 100%;\n width: 0%;\n}\n\n.card.enabled .bar-fill {\n background-color: #00C46C;\n}\n\n.card.warning .bar-fill {\n background-color: #FFD099;\n}\n\n.card.disabled .bar-fill {\n background-color: #FF9494;\n}\n\n.card .bar-labels {\n height: 24px;\n font-size: 20px;\n color: #666;\n display: flex;\n flex-direction: row;\n}\n\n\n.card .mat-button {\n text-transform: uppercase;\n}\n\n.card .mat-button-wrapper {\n pointer-events: none;\n}\n\n.card .action-row {\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n padding: 8px 0;\n}\n",
  114 + "cardHtml": "<div class='card ${apiStateClass}'>\n <img src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" onload=\"initializeCard_${cardId:0}(event);\">\n <script type=\"text/javascript\">\n function initializeCard_${cardId:0}(e) {\n \n function toShortNumber(number) {\n var rounder = Math.pow(10, 1);\n var powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n ];\n \n var key = '';\n \n for (var i = 0; i < powers.length; i++) {\n var reduced = number / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n number = reduced;\n key = powers[i].key;\n break;\n }\n }\n return number + key;\n }\n \n var imgTag = e.target;\n var parentTag = imgTag.parentNode;\n var count = \"${count:0}\";\n var limit = \"${limit:0}\";\n count = count.length > 0 ? parseInt(count, 10) : 0;\n limit = limit.length > 0 ? parseInt(limit, 10) : 0;\n var percentElement = $('#api-usage-percent', parentTag);\n var valueElement = $('#api-usage-value', parentTag);\n var barElement = $('#api-usage-bar', parentTag);\n if (Number.isFinite(limit) && limit > 0) {\n var percent = Math.min(100, ((count / limit) * 100));\n barElement.width(percent + '%');\n percent = percent.toFixed(2);\n percentElement.text(percent + '%');\n valueElement.text(toShortNumber(count) + ' / ' + toShortNumber(limit));\n } else {\n barElement.width('0%');\n percentElement.text('');\n valueElement.text(toShortNumber(count) + ' / unlimited');\n }\n }\n </script>\n <div class='content'>\n <div class='column'>\n <div class='title-row'>\n <div class='title'>${title}</div>\n <div class='state'>${apiState}</div>\n </div> \n <div class='bar-container'>\n <div class='bar'>\n <div class=\"bar-fill\" id=\"api-usage-bar\"></div>\n </div> \n <div class='bar-labels'>\n <div id=\"api-usage-percent\"></div>\n <div style=\"flex: 1;\"></div>\n <div id=\"api-usage-value\"></div>\n </div>\n </div> \n </div>\n </div>\n <div role=\"separator\" class=\"mat-divider mat-divider-horizontal\" aria-orientation=\"horizontal\"></div>\n <div class='action-row'>\n <button id=\"javascript_functions_details\" class=\"mat-focus-indicator mat-button mat-button-base mat-primary\">\n <span class=\"mat-button-wrapper\">View details</span>\n <span class=\"mat-ripple mat-button-ripple\"></span>\n <span class=\"mat-button-focus-overlay\"></span>\n </button>\n </div> \n</div>"
  115 + },
  116 + "title": "JavaScript functions",
  117 + "dropShadow": true,
  118 + "enableFullscreen": false,
  119 + "widgetStyle": {
  120 + "cursor": "default"
  121 + },
  122 + "titleStyle": {
  123 + "fontSize": "20px",
  124 + "fontWeight": 400
  125 + },
  126 + "useDashboardTimewindow": true,
  127 + "showLegend": false,
  128 + "actions": {
  129 + "elementClick": [
  130 + {
  131 + "name": "javascript_functions_details",
  132 + "icon": "insert_chart",
  133 + "type": "openDashboardState",
  134 + "targetDashboardStateId": "javascript_functions",
  135 + "setEntityId": false,
  136 + "stateEntityParamName": null,
  137 + "openRightLayout": false,
  138 + "id": "d4961bea-84de-e1af-e50f-666b98d34cd5"
  139 + }
  140 + ]
  141 + },
  142 + "showTitleIcon": false,
  143 + "iconColor": "rgba(0, 0, 0, 0.87)",
  144 + "iconSize": "24px",
  145 + "titleTooltip": ""
  146 + },
  147 + "row": 0,
  148 + "col": 0,
  149 + "id": "fd6df872-2ddf-0921-3929-2e7f55062fad"
  150 + },
  151 + "7e235874-461b-e7c2-2fdd-d8762a020773": {
  152 + "isSystemType": true,
  153 + "bundleAlias": "cards",
  154 + "typeAlias": "html_value_card",
  155 + "type": "latest",
  156 + "title": "New widget",
  157 + "sizeX": 7.5,
  158 + "sizeY": 3,
  159 + "config": {
  160 + "datasources": [
  161 + {
  162 + "type": "entity",
  163 + "name": null,
  164 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  165 + "filterId": null,
  166 + "dataKeys": [
  167 + {
  168 + "name": "dbApiState",
  169 + "type": "timeseries",
  170 + "label": "apiState",
  171 + "color": "#2196f3",
  172 + "settings": {},
  173 + "_hash": 0.8830669138660703,
  174 + "units": null,
  175 + "decimals": null,
  176 + "funcBody": null,
  177 + "usePostProcessing": null,
  178 + "postFuncBody": null
  179 + },
  180 + {
  181 + "name": "storageDataPointsLimit",
  182 + "type": "timeseries",
  183 + "label": "limit",
  184 + "color": "#4caf50",
  185 + "settings": {},
  186 + "_hash": 0.5463603803546802,
  187 + "units": null,
  188 + "decimals": null,
  189 + "funcBody": null,
  190 + "usePostProcessing": null,
  191 + "postFuncBody": null
  192 + },
  193 + {
  194 + "name": "storageDataPointsCount",
  195 + "type": "timeseries",
  196 + "label": "count",
  197 + "color": "#f44336",
  198 + "settings": {},
  199 + "_hash": 0.5564241862015964,
  200 + "units": null,
  201 + "decimals": null,
  202 + "funcBody": null,
  203 + "usePostProcessing": null,
  204 + "postFuncBody": null
  205 + },
  206 + {
  207 + "name": "dbApiState",
  208 + "type": "timeseries",
  209 + "label": "apiStateClass",
  210 + "color": "#ffc107",
  211 + "settings": {},
  212 + "_hash": 0.8737107059960671,
  213 + "units": null,
  214 + "decimals": null,
  215 + "funcBody": null,
  216 + "usePostProcessing": true,
  217 + "postFuncBody": "return value ? value.toLowerCase() : '';"
  218 + },
  219 + {
  220 + "name": "dbApiState",
  221 + "type": "timeseries",
  222 + "label": "cardId",
  223 + "color": "#607d8b",
  224 + "settings": {},
  225 + "_hash": 0.051659774305067296,
  226 + "units": null,
  227 + "decimals": null,
  228 + "funcBody": null,
  229 + "usePostProcessing": true,
  230 + "postFuncBody": "return (Math.random()*100000).toFixed(0);"
  231 + },
  232 + {
  233 + "name": "dbApiState",
  234 + "type": "timeseries",
  235 + "label": "title",
  236 + "color": "#9c27b0",
  237 + "settings": {},
  238 + "_hash": 0.6301889725474652,
  239 + "units": null,
  240 + "decimals": null,
  241 + "funcBody": null,
  242 + "usePostProcessing": true,
  243 + "postFuncBody": "return \"Telemetry persistence\";"
  244 + }
  245 + ]
  246 + }
  247 + ],
  248 + "timewindow": {
  249 + "realtime": {
  250 + "timewindowMs": 60000
  251 + }
  252 + },
  253 + "showTitle": false,
  254 + "backgroundColor": "#fff",
  255 + "color": "#666666",
  256 + "padding": "0",
  257 + "settings": {
  258 + "cardHtml": "<div class='card ${apiStateClass}'>\n <img src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" onload=\"initializeCard_${cardId:0}(event);\">\n <script type=\"text/javascript\">\n function initializeCard_${cardId:0}(e) {\n \n function toShortNumber(number) {\n var rounder = Math.pow(10, 1);\n var powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n ];\n \n var key = '';\n \n for (var i = 0; i < powers.length; i++) {\n var reduced = number / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n number = reduced;\n key = powers[i].key;\n break;\n }\n }\n return number + key;\n }\n \n var imgTag = e.target;\n var parentTag = imgTag.parentNode;\n var count = \"${count:0}\";\n var limit = \"${limit:0}\";\n count = count.length > 0 ? parseInt(count, 10) : 0;\n limit = limit.length > 0 ? parseInt(limit, 10) : 0;\n var percentElement = $('#api-usage-percent', parentTag);\n var valueElement = $('#api-usage-value', parentTag);\n var barElement = $('#api-usage-bar', parentTag);\n if (Number.isFinite(limit) && limit > 0) {\n var percent = Math.min(100, ((count / limit) * 100));\n barElement.width(percent + '%');\n percent = percent.toFixed(2);\n percentElement.text(percent + '%');\n valueElement.text(toShortNumber(count) + ' / ' + toShortNumber(limit));\n } else {\n barElement.width('0%');\n percentElement.text('');\n valueElement.text(toShortNumber(count) + ' / unlimited');\n }\n }\n </script>\n <div class='content'>\n <div class='column'>\n <div class='title-row'>\n <div class='title'>${title}</div>\n <div class='state'>${apiState}</div>\n </div> \n <div class='bar-container'>\n <div class='bar'>\n <div class=\"bar-fill\" id=\"api-usage-bar\"></div>\n </div> \n <div class='bar-labels'>\n <div id=\"api-usage-percent\"></div>\n <div style=\"flex: 1;\"></div>\n <div id=\"api-usage-value\"></div>\n </div>\n </div> \n </div>\n </div>\n <div role=\"separator\" class=\"mat-divider mat-divider-horizontal\" aria-orientation=\"horizontal\"></div>\n <div class='action-row'>\n <button id=\"telemetry_persistence_details\" class=\"mat-focus-indicator mat-button mat-button-base mat-primary\">\n <span class=\"mat-button-wrapper\">View details</span>\n <span class=\"mat-ripple mat-button-ripple\"></span>\n <span class=\"mat-button-focus-overlay\"></span>\n </button>\n </div> \n</div>",
  259 + "cardCss": ".card {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n}\n\n.card .content {\n flex: 1; \n padding: 13px 13px 0;\n display: flex;\n box-sizing: border-box;\n}\n\n.card .content .column {\n display: flex;\n flex-direction: column; \n justify-content: space-around;\n flex: 1;\n}\n\n.card .content .title-row {\n display: flex;\n flex-direction: row;\n padding-bottom: 10px;\n}\n\n.card .title {\n flex: 1;\n font-size: 20px;\n font-weight: 400;\n color: #666666;\n}\n\n.card .state {\n text-transform: uppercase;\n font-size: 20px;\n font-weight: bold;\n}\n\n.card.enabled .state {\n color: #00B260;\n}\n\n.card.warning .state {\n color: #FFAD6F;\n}\n\n.card.disabled .state {\n color: #F73243;\n}\n\n.card .bar-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.card .bar {\n flex: 1;\n max-height: 30px;\n margin-top: 3.5px;\n margin-bottom: 4px;\n background-color: #F0F0F0;\n border: 1px solid #DADCDB;\n border-radius: 2px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, .2);\n}\n\n.card.enabled .bar {\n border-color: #00B260;\n background-color: #F0FBF7;\n}\n\n.card.warning .bar {\n border-color: #FFAD6F;\n background-color: #FFFAF6;\n}\n\n.card.disabled .bar {\n border-color: #F73243;\n background-color: #FFF0F0;\n}\n\n.card .bar .bar-fill {\n background-color: #F0F0F0;\n border-radius: 2px;\n height: 100%;\n width: 0%;\n}\n\n.card.enabled .bar-fill {\n background-color: #00C46C;\n}\n\n.card.warning .bar-fill {\n background-color: #FFD099;\n}\n\n.card.disabled .bar-fill {\n background-color: #FF9494;\n}\n\n.card .bar-labels {\n height: 24px;\n font-size: 20px;\n color: #666;\n display: flex;\n flex-direction: row;\n}\n\n\n.card .mat-button {\n text-transform: uppercase;\n}\n\n.card .mat-button-wrapper {\n pointer-events: none;\n}\n\n.card .action-row {\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n padding: 8px 0;\n}\n"
  260 + },
  261 + "title": "Telemetry persistence",
  262 + "dropShadow": true,
  263 + "enableFullscreen": false,
  264 + "widgetStyle": {
  265 + "cursor": "default"
  266 + },
  267 + "titleStyle": {
  268 + "fontSize": "20px",
  269 + "fontWeight": 400
  270 + },
  271 + "useDashboardTimewindow": true,
  272 + "showLegend": false,
  273 + "actions": {
  274 + "elementClick": [
  275 + {
  276 + "name": "telemetry_persistence_details",
  277 + "icon": "insert_chart",
  278 + "type": "openDashboardState",
  279 + "targetDashboardStateId": "telemetry_persistence",
  280 + "setEntityId": false,
  281 + "stateEntityParamName": null,
  282 + "openRightLayout": false,
  283 + "id": "6248831c-5b3f-8879-8548-afcf43f10610"
  284 + }
  285 + ]
  286 + },
  287 + "showTitleIcon": false,
  288 + "iconColor": "rgba(0, 0, 0, 0.87)",
  289 + "iconSize": "24px",
  290 + "titleTooltip": ""
  291 + },
  292 + "row": 0,
  293 + "col": 0,
  294 + "id": "7e235874-461b-e7c2-2fdd-d8762a020773"
  295 + },
  296 + "08545554-a0e8-05c7-66df-6000cfeff8a4": {
  297 + "isSystemType": true,
  298 + "bundleAlias": "cards",
  299 + "typeAlias": "html_value_card",
  300 + "type": "latest",
  301 + "title": "New widget",
  302 + "sizeX": 7.5,
  303 + "sizeY": 3,
  304 + "config": {
  305 + "datasources": [
  306 + {
  307 + "type": "entity",
  308 + "name": null,
  309 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  310 + "filterId": null,
  311 + "dataKeys": [
  312 + {
  313 + "name": "ruleEngineApiState",
  314 + "type": "timeseries",
  315 + "label": "apiState",
  316 + "color": "#2196f3",
  317 + "settings": {},
  318 + "_hash": 0.8830669138660703,
  319 + "units": null,
  320 + "decimals": null,
  321 + "funcBody": null,
  322 + "usePostProcessing": null,
  323 + "postFuncBody": null
  324 + },
  325 + {
  326 + "name": "ruleEngineExecutionLimit",
  327 + "type": "timeseries",
  328 + "label": "limit",
  329 + "color": "#4caf50",
  330 + "settings": {},
  331 + "_hash": 0.5463603803546802,
  332 + "units": null,
  333 + "decimals": null,
  334 + "funcBody": null,
  335 + "usePostProcessing": null,
  336 + "postFuncBody": null
  337 + },
  338 + {
  339 + "name": "ruleEngineExecutionCount",
  340 + "type": "timeseries",
  341 + "label": "count",
  342 + "color": "#f44336",
  343 + "settings": {},
  344 + "_hash": 0.5564241862015964,
  345 + "units": null,
  346 + "decimals": null,
  347 + "funcBody": null,
  348 + "usePostProcessing": null,
  349 + "postFuncBody": null
  350 + },
  351 + {
  352 + "name": "ruleEngineApiState",
  353 + "type": "timeseries",
  354 + "label": "apiStateClass",
  355 + "color": "#ffc107",
  356 + "settings": {},
  357 + "_hash": 0.8737107059960671,
  358 + "units": null,
  359 + "decimals": null,
  360 + "funcBody": null,
  361 + "usePostProcessing": true,
  362 + "postFuncBody": "return value ? value.toLowerCase() : '';"
  363 + },
  364 + {
  365 + "name": "ruleEngineApiState",
  366 + "type": "timeseries",
  367 + "label": "cardId",
  368 + "color": "#607d8b",
  369 + "settings": {},
  370 + "_hash": 0.051659774305067296,
  371 + "units": null,
  372 + "decimals": null,
  373 + "funcBody": null,
  374 + "usePostProcessing": true,
  375 + "postFuncBody": "return (Math.random()*100000).toFixed(0);"
  376 + },
  377 + {
  378 + "name": "ruleEngineApiState",
  379 + "type": "timeseries",
  380 + "label": "title",
  381 + "color": "#9c27b0",
  382 + "settings": {},
  383 + "_hash": 0.3551317421302518,
  384 + "units": null,
  385 + "decimals": null,
  386 + "funcBody": null,
  387 + "usePostProcessing": true,
  388 + "postFuncBody": "return \"Rule Engine execution\";"
  389 + }
  390 + ]
  391 + }
  392 + ],
  393 + "timewindow": {
  394 + "realtime": {
  395 + "timewindowMs": 60000
  396 + }
  397 + },
  398 + "showTitle": false,
  399 + "backgroundColor": "#fff",
  400 + "color": "#666666",
  401 + "padding": "0",
  402 + "settings": {
  403 + "cardCss": ".card {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n}\n\n.card .content {\n flex: 1; \n padding: 13px 13px 0;\n display: flex;\n box-sizing: border-box;\n}\n\n.card .content .column {\n display: flex;\n flex-direction: column; \n justify-content: space-around;\n flex: 1;\n}\n\n.card .content .title-row {\n display: flex;\n flex-direction: row;\n padding-bottom: 10px;\n}\n\n.card .title {\n flex: 1;\n font-size: 20px;\n font-weight: 400;\n color: #666666;\n}\n\n.card .state {\n text-transform: uppercase;\n font-size: 20px;\n font-weight: bold;\n}\n\n.card.enabled .state {\n color: #00B260;\n}\n\n.card.warning .state {\n color: #FFAD6F;\n}\n\n.card.disabled .state {\n color: #F73243;\n}\n\n.card .bar-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.card .bar {\n flex: 1;\n max-height: 30px;\n margin-top: 3.5px;\n margin-bottom: 4px;\n background-color: #F0F0F0;\n border: 1px solid #DADCDB;\n border-radius: 2px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, .2);\n}\n\n.card.enabled .bar {\n border-color: #00B260;\n background-color: #F0FBF7;\n}\n\n.card.warning .bar {\n border-color: #FFAD6F;\n background-color: #FFFAF6;\n}\n\n.card.disabled .bar {\n border-color: #F73243;\n background-color: #FFF0F0;\n}\n\n.card .bar .bar-fill {\n background-color: #F0F0F0;\n border-radius: 2px;\n height: 100%;\n width: 0%;\n}\n\n.card.enabled .bar-fill {\n background-color: #00C46C;\n}\n\n.card.warning .bar-fill {\n background-color: #FFD099;\n}\n\n.card.disabled .bar-fill {\n background-color: #FF9494;\n}\n\n.card .bar-labels {\n height: 24px;\n font-size: 20px;\n color: #666;\n display: flex;\n flex-direction: row;\n}\n\n\n.card .mat-button {\n text-transform: uppercase;\n}\n\n.card .mat-button-wrapper {\n pointer-events: none;\n}\n\n.card .action-row {\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n padding: 8px 0;\n}\n",
  404 + "cardHtml": "<div class='card ${apiStateClass}'>\n <img src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" onload=\"initializeCard_${cardId:0}(event);\">\n <script type=\"text/javascript\">\n function initializeCard_${cardId:0}(e) {\n \n function toShortNumber(number) {\n var rounder = Math.pow(10, 1);\n var powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n ];\n \n var key = '';\n \n for (var i = 0; i < powers.length; i++) {\n var reduced = number / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n number = reduced;\n key = powers[i].key;\n break;\n }\n }\n return number + key;\n }\n \n var imgTag = e.target;\n var parentTag = imgTag.parentNode;\n var count = \"${count:0}\";\n var limit = \"${limit:0}\";\n count = count.length > 0 ? parseInt(count, 10) : 0;\n limit = limit.length > 0 ? parseInt(limit, 10) : 0;\n var percentElement = $('#api-usage-percent', parentTag);\n var valueElement = $('#api-usage-value', parentTag);\n var barElement = $('#api-usage-bar', parentTag);\n if (Number.isFinite(limit) && limit > 0) {\n var percent = Math.min(100, ((count / limit) * 100));\n barElement.width(percent + '%');\n percent = percent.toFixed(2);\n percentElement.text(percent + '%');\n valueElement.text(toShortNumber(count) + ' / ' + toShortNumber(limit));\n } else {\n barElement.width('0%');\n percentElement.text('');\n valueElement.text(toShortNumber(count) + ' / unlimited');\n }\n }\n </script>\n <div class='content'>\n <div class='column'>\n <div class='title-row'>\n <div class='title'>${title}</div>\n <div class='state'>${apiState}</div>\n </div> \n <div class='bar-container'>\n <div class='bar'>\n <div class=\"bar-fill\" id=\"api-usage-bar\"></div>\n </div> \n <div class='bar-labels'>\n <div id=\"api-usage-percent\"></div>\n <div style=\"flex: 1;\"></div>\n <div id=\"api-usage-value\"></div>\n </div>\n </div> \n </div>\n </div>\n <div role=\"separator\" class=\"mat-divider mat-divider-horizontal\" aria-orientation=\"horizontal\"></div>\n <div class='action-row'>\n <button id=\"rule_engine_statistics_details\" class=\"mat-focus-indicator mat-button mat-button-base mat-primary\">\n <span class=\"mat-button-wrapper\">View statistics</span>\n <span class=\"mat-ripple mat-button-ripple\"></span>\n <span class=\"mat-button-focus-overlay\"></span>\n </button>\n <button id=\"rule_engine_execution_details\" class=\"mat-focus-indicator mat-button mat-button-base mat-primary\">\n <span class=\"mat-button-wrapper\">View details</span>\n <span class=\"mat-ripple mat-button-ripple\"></span>\n <span class=\"mat-button-focus-overlay\"></span>\n </button>\n </div> \n</div>"
  405 + },
  406 + "title": "Rule Engine execution",
  407 + "dropShadow": true,
  408 + "enableFullscreen": false,
  409 + "widgetStyle": {
  410 + "cursor": "default"
  411 + },
  412 + "titleStyle": {
  413 + "fontSize": "20px",
  414 + "fontWeight": 400
  415 + },
  416 + "useDashboardTimewindow": true,
  417 + "showLegend": false,
  418 + "actions": {
  419 + "elementClick": [
  420 + {
  421 + "name": "rule_engine_execution_details",
  422 + "icon": "insert_chart",
  423 + "type": "openDashboardState",
  424 + "targetDashboardStateId": "rule_engine_execution",
  425 + "setEntityId": false,
  426 + "stateEntityParamName": null,
  427 + "openRightLayout": false,
  428 + "id": "3c30248f-0cd8-fb97-a917-bc1e09984a79"
  429 + },
  430 + {
  431 + "name": "rule_engine_statistics_details",
  432 + "icon": "show_chart",
  433 + "type": "openDashboardState",
  434 + "targetDashboardStateId": "rule_engine_statistics",
  435 + "setEntityId": false,
  436 + "stateEntityParamName": null,
  437 + "openRightLayout": false,
  438 + "id": "04e4565a-9e24-23df-f376-f2ec70a8165f"
  439 + }
  440 + ]
  441 + },
  442 + "showTitleIcon": false,
  443 + "iconColor": "rgba(0, 0, 0, 0.87)",
  444 + "iconSize": "24px",
  445 + "titleTooltip": ""
  446 + },
  447 + "row": 0,
  448 + "col": 0,
  449 + "id": "08545554-a0e8-05c7-66df-6000cfeff8a4"
  450 + },
  451 + "a245c67e-53ec-d299-fa89-69fe2062ccb2": {
  452 + "isSystemType": true,
  453 + "bundleAlias": "cards",
  454 + "typeAlias": "html_value_card",
  455 + "type": "latest",
  456 + "title": "New widget",
  457 + "sizeX": 7.5,
  458 + "sizeY": 3,
  459 + "config": {
  460 + "datasources": [
  461 + {
  462 + "type": "entity",
  463 + "name": null,
  464 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  465 + "filterId": null,
  466 + "dataKeys": [
  467 + {
  468 + "name": "transportApiState",
  469 + "type": "timeseries",
  470 + "label": "apiState",
  471 + "color": "#2196f3",
  472 + "settings": {},
  473 + "_hash": 0.8830669138660703,
  474 + "units": null,
  475 + "decimals": null,
  476 + "funcBody": null,
  477 + "usePostProcessing": null,
  478 + "postFuncBody": null
  479 + },
  480 + {
  481 + "name": "transportMsgLimit",
  482 + "type": "timeseries",
  483 + "label": "limit",
  484 + "color": "#4caf50",
  485 + "settings": {},
  486 + "_hash": 0.5463603803546802,
  487 + "units": null,
  488 + "decimals": null,
  489 + "funcBody": null,
  490 + "usePostProcessing": null,
  491 + "postFuncBody": null
  492 + },
  493 + {
  494 + "name": "transportMsgCount",
  495 + "type": "timeseries",
  496 + "label": "count",
  497 + "color": "#f44336",
  498 + "settings": {},
  499 + "_hash": 0.5564241862015964,
  500 + "units": null,
  501 + "decimals": null,
  502 + "funcBody": null,
  503 + "usePostProcessing": null,
  504 + "postFuncBody": null
  505 + },
  506 + {
  507 + "name": "transportApiState",
  508 + "type": "timeseries",
  509 + "label": "apiStateClass",
  510 + "color": "#ffc107",
  511 + "settings": {},
  512 + "_hash": 0.8737107059960671,
  513 + "units": null,
  514 + "decimals": null,
  515 + "funcBody": null,
  516 + "usePostProcessing": true,
  517 + "postFuncBody": "return value ? value.toLowerCase() : '';"
  518 + },
  519 + {
  520 + "name": "transportApiState",
  521 + "type": "timeseries",
  522 + "label": "cardId",
  523 + "color": "#607d8b",
  524 + "settings": {},
  525 + "_hash": 0.051659774305067296,
  526 + "units": null,
  527 + "decimals": null,
  528 + "funcBody": null,
  529 + "usePostProcessing": true,
  530 + "postFuncBody": "return (Math.random()*100000).toFixed(0);"
  531 + },
  532 + {
  533 + "name": "transportDataPointsLimit",
  534 + "type": "timeseries",
  535 + "label": "pointsLimit",
  536 + "color": "#9c27b0",
  537 + "settings": {},
  538 + "_hash": 0.22082255831864894,
  539 + "units": null,
  540 + "decimals": null,
  541 + "funcBody": null,
  542 + "usePostProcessing": null,
  543 + "postFuncBody": null
  544 + },
  545 + {
  546 + "name": "transportDataPointsCount",
  547 + "type": "timeseries",
  548 + "label": "pointsCount",
  549 + "color": "#8bc34a",
  550 + "settings": {},
  551 + "_hash": 0.6340356364819146,
  552 + "units": null,
  553 + "decimals": null,
  554 + "funcBody": null,
  555 + "usePostProcessing": null,
  556 + "postFuncBody": null
  557 + },
  558 + {
  559 + "name": "transportApiState",
  560 + "type": "timeseries",
  561 + "label": "title",
  562 + "color": "#3f51b5",
  563 + "settings": {},
  564 + "_hash": 0.6894070537030252,
  565 + "units": null,
  566 + "decimals": null,
  567 + "funcBody": null,
  568 + "usePostProcessing": true,
  569 + "postFuncBody": "return \"Transport\";"
  570 + }
  571 + ]
  572 + }
  573 + ],
  574 + "timewindow": {
  575 + "realtime": {
  576 + "timewindowMs": 60000
  577 + }
  578 + },
  579 + "showTitle": false,
  580 + "backgroundColor": "#fff",
  581 + "color": "#666666",
  582 + "padding": "0",
  583 + "settings": {
  584 + "cardHtml": "<div class='card ${apiStateClass}'>\n <img src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" onload=\"initializeCard_${cardId:0}(event);\">\n <script type=\"text/javascript\">\n function initializeCard_${cardId:0}(e) {\n \n function toShortNumber(number) {\n var rounder = Math.pow(10, 1);\n var powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n ];\n \n var key = '';\n \n for (var i = 0; i < powers.length; i++) {\n var reduced = number / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n number = reduced;\n key = powers[i].key;\n break;\n }\n }\n return number + key;\n }\n \n var imgTag = e.target;\n var parentTag = imgTag.parentNode;\n var count = \"${count:0}\";\n var limit = \"${limit:0}\";\n count = count.length > 0 ? parseInt(count, 10) : 0;\n limit = limit.length > 0 ? parseInt(limit, 10) : 0;\n var percentElement = $('#api-usage-percent', parentTag);\n var valueElement = $('#api-usage-value', parentTag);\n var barElement = $('#api-usage-bar', parentTag);\n if (Number.isFinite(limit) && limit > 0) {\n var percent = Math.min(100, ((count / limit) * 100));\n barElement.width(percent + '%');\n percent = percent.toFixed(2);\n percentElement.text(percent + '%');\n valueElement.text(toShortNumber(count) + ' / ' + toShortNumber(limit));\n } else {\n barElement.width('0%');\n percentElement.text('');\n valueElement.text(toShortNumber(count) + ' / unlimited');\n }\n var pointsCount = \"${pointsCount:0}\";\n var pointsLimit = \"${pointsLimit:0}\";\n pointsCount = pointsCount.length > 0 ? parseInt(pointsCount, 10) : 0;\n pointsLimit = pointsLimit.length > 0 ? parseInt(pointsLimit, 10) : 0;\n var pointsPercentElement = $('#api-usage-percent2', parentTag);\n var pointsValueElement = $('#api-usage-value2', parentTag);\n var pointsBarElement = $('#api-usage-bar2', parentTag);\n if (Number.isFinite(pointsLimit) && pointsLimit > 0) {\n var percent = Math.min(100, ((pointsCount / pointsLimit) * 100));\n pointsBarElement.width(percent + '%');\n percent = percent.toFixed(2);\n pointsPercentElement.text(percent + '%');\n pointsValueElement.text(toShortNumber(pointsCount) + ' / ' + toShortNumber(pointsLimit));\n } else {\n pointsBarElement.width('0%');\n pointsPercentElement.text('');\n pointsValueElement.text(toShortNumber(pointsCount) + ' / unlimited');\n }\n }\n </script>\n <div class='content'>\n <div class='column'>\n <div class='title-row'>\n <div class='title'>\n <span>${title}</span>\n </div>\n <div class='state'>${apiState}</div>\n </div>\n <div class=\"bars-row\">\n <div class=\"bar-column\" style=\"margin-right: 10px;\">\n <div class='bar-container'>\n <div>Messages</div>\n <div class='bar'>\n <div class=\"bar-fill\" id=\"api-usage-bar\"></div>\n </div>\n <div class='bar-labels'>\n <div id=\"api-usage-percent\"></div>\n <div style=\"flex: 1;\"></div>\n <div id=\"api-usage-value\"></div>\n </div>\n </div> \n </div>\n <div class=\"bar-column\" style=\"margin-left: 10px;\">\n <div class='bar-container'>\n <div>Data points</div>\n <div class='bar'>\n <div class=\"bar-fill\" id=\"api-usage-bar2\"></div>\n </div> \n <div class='bar-labels'>\n <div id=\"api-usage-percent2\"></div>\n <div style=\"flex: 1;\"></div>\n <div id=\"api-usage-value2\"></div>\n </div>\n </div> \n </div>\n </div>\n </div>\n </div>\n <div role=\"separator\" class=\"mat-divider mat-divider-horizontal\" aria-orientation=\"horizontal\"></div>\n <div class='action-row'>\n <button id=\"transport_details\" class=\"mat-focus-indicator mat-button mat-button-base mat-primary\">\n <span class=\"mat-button-wrapper\">View details</span>\n <span class=\"mat-ripple mat-button-ripple\"></span>\n <span class=\"mat-button-focus-overlay\"></span>\n </button>\n </div> \n</div>",
  585 + "cardCss": ".card {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n}\n\n.card .content {\n flex: 1; \n padding: 13px 13px 0;\n display: flex;\n box-sizing: border-box;\n}\n\n.card .content .column {\n display: flex;\n flex-direction: column; \n justify-content: space-around;\n flex: 1;\n}\n\n.card .content .title-row {\n display: flex;\n flex-direction: row;\n padding-bottom: 10px;\n}\n\n.card .title {\n flex: 1;\n font-size: 20px;\n font-weight: 400;\n color: #666666;\n}\n\n.card .state {\n text-transform: uppercase;\n font-size: 20px;\n font-weight: bold;\n}\n\n.card.enabled .state {\n color: #00B260;\n}\n\n.card.warning .state {\n color: #FFAD6F;\n}\n\n.card.disabled .state {\n color: #F73243;\n}\n\n.card .bars-row {\n flex: 1;\n display: flex;\n flex-direction: row;\n}\n\n.card .bar-column {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.card .bar-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.card .bar {\n flex: 1;\n max-height: 30px;\n margin-top: 3.5px;\n margin-bottom: 4px;\n background-color: #F0F0F0;\n border: 1px solid #DADCDB;\n border-radius: 2px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, .2);\n}\n\n.card.enabled .bar {\n border-color: #00B260;\n background-color: #F0FBF7;\n}\n\n.card.warning .bar {\n border-color: #FFAD6F;\n background-color: #FFFAF6;\n}\n\n.card.disabled .bar {\n border-color: #F73243;\n background-color: #FFF0F0;\n}\n\n.card .bar .bar-fill {\n background-color: #F0F0F0;\n border-radius: 2px;\n height: 100%;\n width: 0%;\n}\n\n.card.enabled .bar-fill {\n background-color: #00C46C;\n}\n\n.card.warning .bar-fill {\n background-color: #FFD099;\n}\n\n.card.disabled .bar-fill {\n background-color: #FF9494;\n}\n\n.card .bar-labels {\n height: 16px;\n font-size: 14px;\n color: #666;\n display: flex;\n flex-direction: row;\n}\n\n.card .mat-button {\n text-transform: uppercase;\n}\n\n.card .mat-button-wrapper {\n pointer-events: none;\n}\n\n.card .action-row {\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n padding: 8px 0;\n}\n"
  586 + },
  587 + "title": "Transport",
  588 + "dropShadow": true,
  589 + "enableFullscreen": false,
  590 + "widgetStyle": {
  591 + "cursor": "default"
  592 + },
  593 + "titleStyle": {
  594 + "fontSize": "20px",
  595 + "fontWeight": 400
  596 + },
  597 + "useDashboardTimewindow": true,
  598 + "showLegend": false,
  599 + "actions": {
  600 + "elementClick": [
  601 + {
  602 + "name": "transport_details",
  603 + "icon": "insert_chart",
  604 + "type": "openDashboardState",
  605 + "targetDashboardStateId": "transport",
  606 + "setEntityId": false,
  607 + "stateEntityParamName": null,
  608 + "openRightLayout": false,
  609 + "id": "46b7cefe-e1f2-67c1-4055-3a214520f869"
  610 + }
  611 + ]
  612 + },
  613 + "showTitleIcon": false,
  614 + "iconColor": "rgba(0, 0, 0, 0.87)",
  615 + "iconSize": "24px",
  616 + "titleTooltip": ""
  617 + },
  618 + "row": 0,
  619 + "col": 0,
  620 + "id": "a245c67e-53ec-d299-fa89-69fe2062ccb2"
  621 + },
  622 + "a151ae60-0326-6116-d818-9070dda8e9c7": {
  623 + "isSystemType": true,
  624 + "bundleAlias": "cards",
  625 + "typeAlias": "html_value_card",
  626 + "type": "latest",
  627 + "title": "New widget",
  628 + "sizeX": 7.5,
  629 + "sizeY": 3,
  630 + "config": {
  631 + "datasources": [
  632 + {
  633 + "type": "entity",
  634 + "name": null,
  635 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  636 + "filterId": null,
  637 + "dataKeys": [
  638 + {
  639 + "name": "emailApiState",
  640 + "type": "timeseries",
  641 + "label": "apiState",
  642 + "color": "#2196f3",
  643 + "settings": {},
  644 + "_hash": 0.8830669138660703,
  645 + "units": null,
  646 + "decimals": null,
  647 + "funcBody": null,
  648 + "usePostProcessing": null,
  649 + "postFuncBody": null
  650 + },
  651 + {
  652 + "name": "emailLimit",
  653 + "type": "timeseries",
  654 + "label": "limit",
  655 + "color": "#4caf50",
  656 + "settings": {},
  657 + "_hash": 0.5463603803546802,
  658 + "units": null,
  659 + "decimals": null,
  660 + "funcBody": null,
  661 + "usePostProcessing": null,
  662 + "postFuncBody": null
  663 + },
  664 + {
  665 + "name": "emailCount",
  666 + "type": "timeseries",
  667 + "label": "count",
  668 + "color": "#f44336",
  669 + "settings": {},
  670 + "_hash": 0.5564241862015964,
  671 + "units": null,
  672 + "decimals": null,
  673 + "funcBody": null,
  674 + "usePostProcessing": null,
  675 + "postFuncBody": null
  676 + },
  677 + {
  678 + "name": "emailApiState",
  679 + "type": "timeseries",
  680 + "label": "apiStateClass",
  681 + "color": "#ffc107",
  682 + "settings": {},
  683 + "_hash": 0.8737107059960671,
  684 + "units": null,
  685 + "decimals": null,
  686 + "funcBody": null,
  687 + "usePostProcessing": true,
  688 + "postFuncBody": "return value ? value.toLowerCase() : '';"
  689 + },
  690 + {
  691 + "name": "emailApiState",
  692 + "type": "timeseries",
  693 + "label": "cardId",
  694 + "color": "#607d8b",
  695 + "settings": {},
  696 + "_hash": 0.051659774305067296,
  697 + "units": null,
  698 + "decimals": null,
  699 + "funcBody": null,
  700 + "usePostProcessing": true,
  701 + "postFuncBody": "return (Math.random()*100000).toFixed(0);"
  702 + },
  703 + {
  704 + "name": "emailApiState",
  705 + "type": "timeseries",
  706 + "label": "title",
  707 + "color": "#9c27b0",
  708 + "settings": {},
  709 + "_hash": 0.43439375716502227,
  710 + "units": null,
  711 + "decimals": null,
  712 + "funcBody": null,
  713 + "usePostProcessing": true,
  714 + "postFuncBody": "return \"Email messages\";"
  715 + }
  716 + ]
  717 + }
  718 + ],
  719 + "timewindow": {
  720 + "realtime": {
  721 + "timewindowMs": 60000
  722 + }
  723 + },
  724 + "showTitle": false,
  725 + "backgroundColor": "#fff",
  726 + "color": "#666666",
  727 + "padding": "0",
  728 + "settings": {
  729 + "cardCss": ".card {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n}\n\n.card .content {\n flex: 1; \n padding: 13px 13px 0;\n display: flex;\n box-sizing: border-box;\n}\n\n.card .content .column {\n display: flex;\n flex-direction: column; \n justify-content: space-around;\n flex: 1;\n}\n\n.card .content .title-row {\n display: flex;\n flex-direction: row;\n padding-bottom: 10px;\n}\n\n.card .title {\n flex: 1;\n font-size: 20px;\n font-weight: 400;\n color: #666666;\n}\n\n.card .state {\n text-transform: uppercase;\n font-size: 20px;\n font-weight: bold;\n}\n\n.card.enabled .state {\n color: #00B260;\n}\n\n.card.warning .state {\n color: #FFAD6F;\n}\n\n.card.disabled .state {\n color: #F73243;\n}\n\n.card .bar-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.card .bar {\n flex: 1;\n max-height: 30px;\n margin-top: 3.5px;\n margin-bottom: 4px;\n background-color: #F0F0F0;\n border: 1px solid #DADCDB;\n border-radius: 2px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, .2);\n}\n\n.card.enabled .bar {\n border-color: #00B260;\n background-color: #F0FBF7;\n}\n\n.card.warning .bar {\n border-color: #FFAD6F;\n background-color: #FFFAF6;\n}\n\n.card.disabled .bar {\n border-color: #F73243;\n background-color: #FFF0F0;\n}\n\n.card .bar .bar-fill {\n background-color: #F0F0F0;\n border-radius: 2px;\n height: 100%;\n width: 0%;\n}\n\n.card.enabled .bar-fill {\n background-color: #00C46C;\n}\n\n.card.warning .bar-fill {\n background-color: #FFD099;\n}\n\n.card.disabled .bar-fill {\n background-color: #FF9494;\n}\n\n.card .bar-labels {\n height: 24px;\n font-size: 20px;\n color: #666;\n display: flex;\n flex-direction: row;\n}\n\n\n.card .mat-button {\n text-transform: uppercase;\n}\n\n.card .mat-button-wrapper {\n pointer-events: none;\n}\n\n.card .action-row {\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n padding: 8px 0;\n}\n",
  730 + "cardHtml": "<div class='card ${apiStateClass}'>\n <img src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" onload=\"initializeCard_${cardId:0}(event);\">\n <script type=\"text/javascript\">\n function initializeCard_${cardId:0}(e) {\n \n function toShortNumber(number) {\n var rounder = Math.pow(10, 1);\n var powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n ];\n \n var key = '';\n \n for (var i = 0; i < powers.length; i++) {\n var reduced = number / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n number = reduced;\n key = powers[i].key;\n break;\n }\n }\n return number + key;\n }\n \n var imgTag = e.target;\n var parentTag = imgTag.parentNode;\n var count = \"${count:0}\";\n var limit = \"${limit:0}\";\n count = count.length > 0 ? parseInt(count, 10) : 0;\n limit = limit.length > 0 ? parseInt(limit, 10) : 0;\n var percentElement = $('#api-usage-percent', parentTag);\n var valueElement = $('#api-usage-value', parentTag);\n var barElement = $('#api-usage-bar', parentTag);\n if (Number.isFinite(limit) && limit > 0) {\n var percent = Math.min(100, ((count / limit) * 100));\n barElement.width(percent + '%');\n percent = percent.toFixed(2);\n percentElement.text(percent + '%');\n valueElement.text(toShortNumber(count) + ' / ' + toShortNumber(limit));\n } else {\n barElement.width('0%');\n percentElement.text('');\n valueElement.text(toShortNumber(count) + ' / unlimited');\n }\n }\n </script>\n <div class='content'>\n <div class='column'>\n <div class='title-row'>\n <div class='title'>${title}</div>\n <div class='state'>${apiState}</div>\n </div> \n <div class='bar-container'>\n <div class='bar'>\n <div class=\"bar-fill\" id=\"api-usage-bar\"></div>\n </div> \n <div class='bar-labels'>\n <div id=\"api-usage-percent\"></div>\n <div style=\"flex: 1;\"></div>\n <div id=\"api-usage-value\"></div>\n </div>\n </div> \n </div>\n </div>\n <div role=\"separator\" class=\"mat-divider mat-divider-horizontal\" aria-orientation=\"horizontal\"></div>\n <div class='action-row'>\n <button id=\"email_messages_details\" class=\"mat-focus-indicator mat-button mat-button-base mat-primary\">\n <span class=\"mat-button-wrapper\">View details</span>\n <span class=\"mat-ripple mat-button-ripple\"></span>\n <span class=\"mat-button-focus-overlay\"></span>\n </button>\n </div> \n</div>"
  731 + },
  732 + "title": "Email messages",
  733 + "dropShadow": true,
  734 + "enableFullscreen": false,
  735 + "widgetStyle": {
  736 + "cursor": "default"
  737 + },
  738 + "titleStyle": {
  739 + "fontSize": "20px",
  740 + "fontWeight": 400
  741 + },
  742 + "useDashboardTimewindow": true,
  743 + "showLegend": false,
  744 + "actions": {
  745 + "elementClick": [
  746 + {
  747 + "name": "email_messages_details",
  748 + "icon": "insert_chart",
  749 + "type": "openDashboardState",
  750 + "targetDashboardStateId": "email_messages",
  751 + "setEntityId": false,
  752 + "stateEntityParamName": null,
  753 + "openRightLayout": false,
  754 + "id": "946ba769-84ac-1507-6baa-94701de8967b"
  755 + }
  756 + ]
  757 + },
  758 + "showTitleIcon": false,
  759 + "iconColor": "rgba(0, 0, 0, 0.87)",
  760 + "iconSize": "24px",
  761 + "titleTooltip": ""
  762 + },
  763 + "row": 0,
  764 + "col": 0,
  765 + "id": "a151ae60-0326-6116-d818-9070dda8e9c7"
  766 + },
  767 + "2503a391-5692-0614-85e6-f179c5ee0dc9": {
  768 + "isSystemType": true,
  769 + "bundleAlias": "cards",
  770 + "typeAlias": "html_value_card",
  771 + "type": "latest",
  772 + "title": "New widget",
  773 + "sizeX": 7.5,
  774 + "sizeY": 3,
  775 + "config": {
  776 + "datasources": [
  777 + {
  778 + "type": "entity",
  779 + "name": null,
  780 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  781 + "filterId": null,
  782 + "dataKeys": [
  783 + {
  784 + "name": "smsApiState",
  785 + "type": "timeseries",
  786 + "label": "apiState",
  787 + "color": "#2196f3",
  788 + "settings": {},
  789 + "_hash": 0.8830669138660703,
  790 + "units": null,
  791 + "decimals": null,
  792 + "funcBody": null,
  793 + "usePostProcessing": null,
  794 + "postFuncBody": null
  795 + },
  796 + {
  797 + "name": "smsLimit",
  798 + "type": "timeseries",
  799 + "label": "limit",
  800 + "color": "#4caf50",
  801 + "settings": {},
  802 + "_hash": 0.5463603803546802,
  803 + "units": null,
  804 + "decimals": null,
  805 + "funcBody": null,
  806 + "usePostProcessing": null,
  807 + "postFuncBody": null
  808 + },
  809 + {
  810 + "name": "smsCount",
  811 + "type": "timeseries",
  812 + "label": "count",
  813 + "color": "#f44336",
  814 + "settings": {},
  815 + "_hash": 0.5564241862015964,
  816 + "units": null,
  817 + "decimals": null,
  818 + "funcBody": null,
  819 + "usePostProcessing": null,
  820 + "postFuncBody": null
  821 + },
  822 + {
  823 + "name": "smsApiState",
  824 + "type": "timeseries",
  825 + "label": "apiStateClass",
  826 + "color": "#ffc107",
  827 + "settings": {},
  828 + "_hash": 0.8737107059960671,
  829 + "units": null,
  830 + "decimals": null,
  831 + "funcBody": null,
  832 + "usePostProcessing": true,
  833 + "postFuncBody": "return value ? value.toLowerCase() : '';"
  834 + },
  835 + {
  836 + "name": "smsApiState",
  837 + "type": "timeseries",
  838 + "label": "cardId",
  839 + "color": "#607d8b",
  840 + "settings": {},
  841 + "_hash": 0.051659774305067296,
  842 + "units": null,
  843 + "decimals": null,
  844 + "funcBody": null,
  845 + "usePostProcessing": true,
  846 + "postFuncBody": "return (Math.random()*100000).toFixed(0);"
  847 + },
  848 + {
  849 + "name": "smsApiState",
  850 + "type": "timeseries",
  851 + "label": "title",
  852 + "color": "#9c27b0",
  853 + "settings": {},
  854 + "_hash": 0.286155312985084,
  855 + "units": null,
  856 + "decimals": null,
  857 + "funcBody": null,
  858 + "usePostProcessing": true,
  859 + "postFuncBody": "return \"SMS messages\";"
  860 + }
  861 + ]
  862 + }
  863 + ],
  864 + "timewindow": {
  865 + "realtime": {
  866 + "timewindowMs": 60000
  867 + }
  868 + },
  869 + "showTitle": false,
  870 + "backgroundColor": "#fff",
  871 + "color": "#666666",
  872 + "padding": "0",
  873 + "settings": {
  874 + "cardCss": ".card {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n}\n\n.card .content {\n flex: 1; \n padding: 13px 13px 0;\n display: flex;\n box-sizing: border-box;\n}\n\n.card .content .column {\n display: flex;\n flex-direction: column; \n justify-content: space-around;\n flex: 1;\n}\n\n.card .content .title-row {\n display: flex;\n flex-direction: row;\n padding-bottom: 10px;\n}\n\n.card .title {\n flex: 1;\n font-size: 20px;\n font-weight: 400;\n color: #666666;\n}\n\n.card .state {\n text-transform: uppercase;\n font-size: 20px;\n font-weight: bold;\n}\n\n.card.enabled .state {\n color: #00B260;\n}\n\n.card.warning .state {\n color: #FFAD6F;\n}\n\n.card.disabled .state {\n color: #F73243;\n}\n\n.card .bar-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.card .bar {\n flex: 1;\n max-height: 30px;\n margin-top: 3.5px;\n margin-bottom: 4px;\n background-color: #F0F0F0;\n border: 1px solid #DADCDB;\n border-radius: 2px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, .2);\n}\n\n.card.enabled .bar {\n border-color: #00B260;\n background-color: #F0FBF7;\n}\n\n.card.warning .bar {\n border-color: #FFAD6F;\n background-color: #FFFAF6;\n}\n\n.card.disabled .bar {\n border-color: #F73243;\n background-color: #FFF0F0;\n}\n\n.card .bar .bar-fill {\n background-color: #F0F0F0;\n border-radius: 2px;\n height: 100%;\n width: 0%;\n}\n\n.card.enabled .bar-fill {\n background-color: #00C46C;\n}\n\n.card.warning .bar-fill {\n background-color: #FFD099;\n}\n\n.card.disabled .bar-fill {\n background-color: #FF9494;\n}\n\n.card .bar-labels {\n height: 24px;\n font-size: 20px;\n color: #666;\n display: flex;\n flex-direction: row;\n}\n\n\n.card .mat-button {\n text-transform: uppercase;\n}\n\n.card .mat-button-wrapper {\n pointer-events: none;\n}\n\n.card .action-row {\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n padding: 8px 0;\n}\n",
  875 + "cardHtml": "<div class='card ${apiStateClass}'>\n <img src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" onload=\"initializeCard_${cardId:0}(event);\">\n <script type=\"text/javascript\">\n function initializeCard_${cardId:0}(e) {\n \n function toShortNumber(number) {\n var rounder = Math.pow(10, 1);\n var powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n ];\n \n var key = '';\n \n for (var i = 0; i < powers.length; i++) {\n var reduced = number / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n number = reduced;\n key = powers[i].key;\n break;\n }\n }\n return number + key;\n }\n \n var imgTag = e.target;\n var parentTag = imgTag.parentNode;\n var count = \"${count:0}\";\n var limit = \"${limit:0}\";\n count = count.length > 0 ? parseInt(count, 10) : 0;\n limit = limit.length > 0 ? parseInt(limit, 10) : 0;\n var percentElement = $('#api-usage-percent', parentTag);\n var valueElement = $('#api-usage-value', parentTag);\n var barElement = $('#api-usage-bar', parentTag);\n if (Number.isFinite(limit) && limit > 0) {\n var percent = Math.min(100, ((count / limit) * 100));\n barElement.width(percent + '%');\n percent = percent.toFixed(2);\n percentElement.text(percent + '%');\n valueElement.text(toShortNumber(count) + ' / ' + toShortNumber(limit));\n } else {\n barElement.width('0%');\n percentElement.text('');\n valueElement.text(toShortNumber(count) + ' / unlimited');\n }\n }\n </script>\n <div class='content'>\n <div class='column'>\n <div class='title-row'>\n <div class='title'>${title}</div>\n <div class='state'>${apiState}</div>\n </div> \n <div class='bar-container'>\n <div class='bar'>\n <div class=\"bar-fill\" id=\"api-usage-bar\"></div>\n </div> \n <div class='bar-labels'>\n <div id=\"api-usage-percent\"></div>\n <div style=\"flex: 1;\"></div>\n <div id=\"api-usage-value\"></div>\n </div>\n </div> \n </div>\n </div>\n <div role=\"separator\" class=\"mat-divider mat-divider-horizontal\" aria-orientation=\"horizontal\"></div>\n <div class='action-row'>\n <button id=\"sms_messages_details\" class=\"mat-focus-indicator mat-button mat-button-base mat-primary\">\n <span class=\"mat-button-wrapper\">View details</span>\n <span class=\"mat-ripple mat-button-ripple\"></span>\n <span class=\"mat-button-focus-overlay\"></span>\n </button>\n </div> \n</div>"
  876 + },
  877 + "title": "SMS messages",
  878 + "dropShadow": true,
  879 + "enableFullscreen": false,
  880 + "widgetStyle": {
  881 + "cursor": "default"
  882 + },
  883 + "titleStyle": {
  884 + "fontSize": "20px",
  885 + "fontWeight": 400
  886 + },
  887 + "useDashboardTimewindow": true,
  888 + "showLegend": false,
  889 + "actions": {
  890 + "elementClick": [
  891 + {
  892 + "name": "sms_messages_details",
  893 + "icon": "insert_chart",
  894 + "type": "openDashboardState",
  895 + "targetDashboardStateId": "sms_messages",
  896 + "setEntityId": false,
  897 + "stateEntityParamName": null,
  898 + "openRightLayout": false,
  899 + "id": "73a35536-96a3-47dd-95bb-b1d9119d0ea2"
  900 + }
  901 + ]
  902 + },
  903 + "showTitleIcon": false,
  904 + "iconColor": "rgba(0, 0, 0, 0.87)",
  905 + "iconSize": "24px",
  906 + "titleTooltip": ""
  907 + },
  908 + "row": 0,
  909 + "col": 0,
  910 + "id": "2503a391-5692-0614-85e6-f179c5ee0dc9"
  911 + },
  912 + "68e16e98-0420-f72c-4848-41dedffd3904": {
  913 + "isSystemType": true,
  914 + "bundleAlias": "charts",
  915 + "typeAlias": "timeseries_bars_flot",
  916 + "type": "timeseries",
  917 + "title": "New widget",
  918 + "sizeX": 8,
  919 + "sizeY": 5,
  920 + "config": {
  921 + "datasources": [
  922 + {
  923 + "type": "entity",
  924 + "name": null,
  925 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  926 + "filterId": null,
  927 + "dataKeys": [
  928 + {
  929 + "name": "ruleEngineExecutionCountHourly",
  930 + "type": "timeseries",
  931 + "label": "Rule Engine executions",
  932 + "color": "#ab00ff",
  933 + "settings": {
  934 + "excludeFromStacking": false,
  935 + "hideDataByDefault": false,
  936 + "disableDataHiding": false,
  937 + "removeFromLegend": false,
  938 + "showLines": false,
  939 + "fillLines": false,
  940 + "showPoints": false,
  941 + "showPointShape": "circle",
  942 + "pointShapeFormatter": "",
  943 + "showPointsLineWidth": 5,
  944 + "showPointsRadius": 3,
  945 + "showSeparateAxis": false,
  946 + "axisPosition": "left",
  947 + "thresholds": [
  948 + {
  949 + "thresholdValueSource": "predefinedValue"
  950 + }
  951 + ],
  952 + "comparisonSettings": {
  953 + "showValuesForComparison": true
  954 + }
  955 + },
  956 + "_hash": 0.0661644137210089,
  957 + "units": null,
  958 + "decimals": null,
  959 + "funcBody": null,
  960 + "usePostProcessing": null,
  961 + "postFuncBody": null
  962 + }
  963 + ]
  964 + }
  965 + ],
  966 + "timewindow": {
  967 + "hideInterval": false,
  968 + "hideAggregation": false,
  969 + "hideAggInterval": false,
  970 + "selectedTab": 0,
  971 + "realtime": {
  972 + "timewindowMs": 86400000,
  973 + "interval": 3600000
  974 + },
  975 + "aggregation": {
  976 + "type": "NONE",
  977 + "limit": 1000
  978 + }
  979 + },
  980 + "showTitle": true,
  981 + "backgroundColor": "#fff",
  982 + "color": "rgba(0, 0, 0, 0.87)",
  983 + "padding": "8px",
  984 + "settings": {
  985 + "shadowSize": 4,
  986 + "fontColor": "#545454",
  987 + "fontSize": 10,
  988 + "xaxis": {
  989 + "showLabels": true,
  990 + "color": "#545454"
  991 + },
  992 + "yaxis": {
  993 + "showLabels": true,
  994 + "color": "#545454",
  995 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;",
  996 + "min": 0,
  997 + "tickDecimals": 0
  998 + },
  999 + "grid": {
  1000 + "color": "#545454",
  1001 + "tickColor": "#DDDDDD",
  1002 + "verticalLines": true,
  1003 + "horizontalLines": true,
  1004 + "outlineWidth": 1
  1005 + },
  1006 + "stack": false,
  1007 + "tooltipIndividual": false,
  1008 + "defaultBarWidth": 2400000,
  1009 + "barAlignment": "left",
  1010 + "timeForComparison": "months",
  1011 + "xaxisSecond": {
  1012 + "axisPosition": "top",
  1013 + "showLabels": true
  1014 + }
  1015 + },
  1016 + "title": "Rule Engine hourly activity",
  1017 + "dropShadow": true,
  1018 + "enableFullscreen": true,
  1019 + "titleStyle": {
  1020 + "fontSize": "16px",
  1021 + "fontWeight": 400
  1022 + },
  1023 + "widgetStyle": {},
  1024 + "useDashboardTimewindow": false,
  1025 + "showLegend": true,
  1026 + "actions": {
  1027 + "headerButton": [
  1028 + {
  1029 + "name": "View statistics",
  1030 + "icon": "show_chart",
  1031 + "type": "openDashboardState",
  1032 + "targetDashboardStateId": "rule_engine_statistics",
  1033 + "setEntityId": false,
  1034 + "stateEntityParamName": null,
  1035 + "openRightLayout": false,
  1036 + "id": "f9f08190-9ed9-d802-5b7a-c57ff84b5648"
  1037 + },
  1038 + {
  1039 + "name": "View details",
  1040 + "icon": "insert_chart",
  1041 + "type": "openDashboardState",
  1042 + "targetDashboardStateId": "rule_engine_execution",
  1043 + "setEntityId": false,
  1044 + "stateEntityParamName": null,
  1045 + "openRightLayout": false,
  1046 + "id": "1aec196b-44ba-ddf4-c4dc-c3f60c1eb6fc"
  1047 + }
  1048 + ]
  1049 + },
  1050 + "displayTimewindow": true,
  1051 + "showTitleIcon": false,
  1052 + "iconColor": "rgba(0, 0, 0, 0.87)",
  1053 + "iconSize": "24px",
  1054 + "titleTooltip": "",
  1055 + "legendConfig": {
  1056 + "direction": "column",
  1057 + "position": "bottom",
  1058 + "sortDataKeys": false,
  1059 + "showMin": false,
  1060 + "showMax": false,
  1061 + "showAvg": false,
  1062 + "showTotal": true
  1063 + }
  1064 + },
  1065 + "row": 0,
  1066 + "col": 0,
  1067 + "id": "68e16e98-0420-f72c-4848-41dedffd3904"
  1068 + },
  1069 + "2aa6b499-6e27-b315-6833-89c4d58485ce": {
  1070 + "isSystemType": true,
  1071 + "bundleAlias": "charts",
  1072 + "typeAlias": "timeseries_bars_flot",
  1073 + "type": "timeseries",
  1074 + "title": "New widget",
  1075 + "sizeX": 8,
  1076 + "sizeY": 5,
  1077 + "config": {
  1078 + "datasources": [
  1079 + {
  1080 + "type": "entity",
  1081 + "name": null,
  1082 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  1083 + "filterId": null,
  1084 + "dataKeys": [
  1085 + {
  1086 + "name": "transportMsgCountHourly",
  1087 + "type": "timeseries",
  1088 + "label": "Transport messages",
  1089 + "color": "#2196f3",
  1090 + "settings": {
  1091 + "excludeFromStacking": false,
  1092 + "hideDataByDefault": false,
  1093 + "disableDataHiding": false,
  1094 + "removeFromLegend": false,
  1095 + "showLines": false,
  1096 + "fillLines": false,
  1097 + "showPoints": false,
  1098 + "showPointShape": "circle",
  1099 + "pointShapeFormatter": "",
  1100 + "showPointsLineWidth": 5,
  1101 + "showPointsRadius": 3,
  1102 + "showSeparateAxis": false,
  1103 + "axisPosition": "left",
  1104 + "thresholds": [
  1105 + {
  1106 + "thresholdValueSource": "predefinedValue"
  1107 + }
  1108 + ],
  1109 + "comparisonSettings": {
  1110 + "showValuesForComparison": true
  1111 + }
  1112 + },
  1113 + "_hash": 0.0661644137210089,
  1114 + "units": null,
  1115 + "decimals": null,
  1116 + "funcBody": null,
  1117 + "usePostProcessing": null,
  1118 + "postFuncBody": null
  1119 + },
  1120 + {
  1121 + "name": "transportDataPointsCountHourly",
  1122 + "type": "timeseries",
  1123 + "label": "Transport data points",
  1124 + "color": "#4caf50",
  1125 + "settings": {
  1126 + "excludeFromStacking": false,
  1127 + "hideDataByDefault": false,
  1128 + "disableDataHiding": false,
  1129 + "removeFromLegend": false,
  1130 + "showLines": false,
  1131 + "fillLines": false,
  1132 + "showPoints": false,
  1133 + "showPointShape": "circle",
  1134 + "pointShapeFormatter": "",
  1135 + "showPointsLineWidth": 5,
  1136 + "showPointsRadius": 3,
  1137 + "showSeparateAxis": false,
  1138 + "axisPosition": "left",
  1139 + "thresholds": [
  1140 + {
  1141 + "thresholdValueSource": "predefinedValue"
  1142 + }
  1143 + ],
  1144 + "comparisonSettings": {
  1145 + "showValuesForComparison": true
  1146 + }
  1147 + },
  1148 + "_hash": 0.46849996721308895,
  1149 + "units": null,
  1150 + "decimals": null,
  1151 + "funcBody": null,
  1152 + "usePostProcessing": null,
  1153 + "postFuncBody": null
  1154 + }
  1155 + ]
  1156 + }
  1157 + ],
  1158 + "timewindow": {
  1159 + "hideInterval": false,
  1160 + "hideAggregation": false,
  1161 + "hideAggInterval": false,
  1162 + "selectedTab": 0,
  1163 + "realtime": {
  1164 + "timewindowMs": 86400000,
  1165 + "interval": 3600000
  1166 + },
  1167 + "aggregation": {
  1168 + "type": "NONE",
  1169 + "limit": 1000
  1170 + }
  1171 + },
  1172 + "showTitle": true,
  1173 + "backgroundColor": "#fff",
  1174 + "color": "rgba(0, 0, 0, 0.87)",
  1175 + "padding": "8px",
  1176 + "settings": {
  1177 + "shadowSize": 4,
  1178 + "fontColor": "#545454",
  1179 + "fontSize": 10,
  1180 + "xaxis": {
  1181 + "showLabels": true,
  1182 + "color": "#545454"
  1183 + },
  1184 + "yaxis": {
  1185 + "showLabels": true,
  1186 + "color": "#545454",
  1187 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;",
  1188 + "min": 0,
  1189 + "tickDecimals": 0
  1190 + },
  1191 + "grid": {
  1192 + "color": "#545454",
  1193 + "tickColor": "#DDDDDD",
  1194 + "verticalLines": true,
  1195 + "horizontalLines": true,
  1196 + "outlineWidth": 1
  1197 + },
  1198 + "stack": true,
  1199 + "tooltipIndividual": false,
  1200 + "defaultBarWidth": 2400000,
  1201 + "barAlignment": "left",
  1202 + "timeForComparison": "months",
  1203 + "xaxisSecond": {
  1204 + "axisPosition": "top",
  1205 + "showLabels": true
  1206 + },
  1207 + "tooltipCumulative": false
  1208 + },
  1209 + "title": "Transport hourly activity",
  1210 + "dropShadow": true,
  1211 + "enableFullscreen": true,
  1212 + "titleStyle": {
  1213 + "fontSize": "16px",
  1214 + "fontWeight": 400
  1215 + },
  1216 + "widgetStyle": {},
  1217 + "useDashboardTimewindow": false,
  1218 + "showLegend": true,
  1219 + "actions": {
  1220 + "headerButton": [
  1221 + {
  1222 + "name": "View details",
  1223 + "icon": "insert_chart",
  1224 + "type": "openDashboardState",
  1225 + "targetDashboardStateId": "transport",
  1226 + "setEntityId": false,
  1227 + "stateEntityParamName": null,
  1228 + "openRightLayout": false,
  1229 + "id": "6ef12f6a-0266-25cf-6ca5-5dcb772252c6"
  1230 + }
  1231 + ]
  1232 + },
  1233 + "displayTimewindow": true,
  1234 + "showTitleIcon": false,
  1235 + "iconColor": "rgba(0, 0, 0, 0.87)",
  1236 + "iconSize": "24px",
  1237 + "titleTooltip": "",
  1238 + "legendConfig": {
  1239 + "direction": "column",
  1240 + "position": "bottom",
  1241 + "sortDataKeys": false,
  1242 + "showMin": false,
  1243 + "showMax": false,
  1244 + "showAvg": false,
  1245 + "showTotal": true
  1246 + }
  1247 + },
  1248 + "row": 0,
  1249 + "col": 0,
  1250 + "id": "2aa6b499-6e27-b315-6833-89c4d58485ce"
  1251 + },
  1252 + "d890cea3-fba0-6474-9a21-fa780230dc62": {
  1253 + "isSystemType": true,
  1254 + "bundleAlias": "charts",
  1255 + "typeAlias": "timeseries_bars_flot",
  1256 + "type": "timeseries",
  1257 + "title": "New widget",
  1258 + "sizeX": 8,
  1259 + "sizeY": 5,
  1260 + "config": {
  1261 + "datasources": [
  1262 + {
  1263 + "type": "entity",
  1264 + "name": null,
  1265 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  1266 + "filterId": null,
  1267 + "dataKeys": [
  1268 + {
  1269 + "name": "jsExecutionCountHourly",
  1270 + "type": "timeseries",
  1271 + "label": "JavaScript executions",
  1272 + "color": "#ff9900",
  1273 + "settings": {
  1274 + "excludeFromStacking": false,
  1275 + "hideDataByDefault": false,
  1276 + "disableDataHiding": false,
  1277 + "removeFromLegend": false,
  1278 + "showLines": false,
  1279 + "fillLines": false,
  1280 + "showPoints": false,
  1281 + "showPointShape": "circle",
  1282 + "pointShapeFormatter": "",
  1283 + "showPointsLineWidth": 5,
  1284 + "showPointsRadius": 3,
  1285 + "showSeparateAxis": false,
  1286 + "axisPosition": "left",
  1287 + "thresholds": [
  1288 + {
  1289 + "thresholdValueSource": "predefinedValue"
  1290 + }
  1291 + ],
  1292 + "comparisonSettings": {
  1293 + "showValuesForComparison": true
  1294 + }
  1295 + },
  1296 + "_hash": 0.0661644137210089,
  1297 + "units": null,
  1298 + "decimals": null,
  1299 + "funcBody": null,
  1300 + "usePostProcessing": null,
  1301 + "postFuncBody": null
  1302 + }
  1303 + ]
  1304 + }
  1305 + ],
  1306 + "timewindow": {
  1307 + "hideInterval": false,
  1308 + "hideAggregation": false,
  1309 + "hideAggInterval": false,
  1310 + "selectedTab": 0,
  1311 + "realtime": {
  1312 + "timewindowMs": 86400000,
  1313 + "interval": 3600000
  1314 + },
  1315 + "aggregation": {
  1316 + "type": "NONE",
  1317 + "limit": 1000
  1318 + }
  1319 + },
  1320 + "showTitle": true,
  1321 + "backgroundColor": "#fff",
  1322 + "color": "rgba(0, 0, 0, 0.87)",
  1323 + "padding": "8px",
  1324 + "settings": {
  1325 + "shadowSize": 4,
  1326 + "fontColor": "#545454",
  1327 + "fontSize": 10,
  1328 + "xaxis": {
  1329 + "showLabels": true,
  1330 + "color": "#545454"
  1331 + },
  1332 + "yaxis": {
  1333 + "showLabels": true,
  1334 + "color": "#545454",
  1335 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;",
  1336 + "min": 0,
  1337 + "tickDecimals": 0
  1338 + },
  1339 + "grid": {
  1340 + "color": "#545454",
  1341 + "tickColor": "#DDDDDD",
  1342 + "verticalLines": true,
  1343 + "horizontalLines": true,
  1344 + "outlineWidth": 1
  1345 + },
  1346 + "stack": false,
  1347 + "tooltipIndividual": false,
  1348 + "defaultBarWidth": 2400000,
  1349 + "barAlignment": "left",
  1350 + "timeForComparison": "months",
  1351 + "xaxisSecond": {
  1352 + "axisPosition": "top",
  1353 + "showLabels": true
  1354 + }
  1355 + },
  1356 + "title": "JavaScript functions hourly activity",
  1357 + "dropShadow": true,
  1358 + "enableFullscreen": true,
  1359 + "titleStyle": {
  1360 + "fontSize": "16px",
  1361 + "fontWeight": 400
  1362 + },
  1363 + "widgetStyle": {},
  1364 + "useDashboardTimewindow": false,
  1365 + "showLegend": true,
  1366 + "actions": {
  1367 + "headerButton": [
  1368 + {
  1369 + "name": "View details",
  1370 + "icon": "insert_chart",
  1371 + "type": "openDashboardState",
  1372 + "targetDashboardStateId": "javascript_functions",
  1373 + "setEntityId": false,
  1374 + "stateEntityParamName": null,
  1375 + "openRightLayout": false,
  1376 + "id": "4687d3f6-8800-a3b6-26e5-0d33f3b828a9"
  1377 + }
  1378 + ]
  1379 + },
  1380 + "displayTimewindow": true,
  1381 + "showTitleIcon": false,
  1382 + "iconColor": "rgba(0, 0, 0, 0.87)",
  1383 + "iconSize": "24px",
  1384 + "titleTooltip": "",
  1385 + "legendConfig": {
  1386 + "direction": "column",
  1387 + "position": "bottom",
  1388 + "sortDataKeys": false,
  1389 + "showMin": false,
  1390 + "showMax": false,
  1391 + "showAvg": false,
  1392 + "showTotal": true
  1393 + }
  1394 + },
  1395 + "row": 0,
  1396 + "col": 0,
  1397 + "id": "d890cea3-fba0-6474-9a21-fa780230dc62"
  1398 + },
  1399 + "84b6cfa5-1449-e0f2-3560-f810d2dd7ead": {
  1400 + "isSystemType": true,
  1401 + "bundleAlias": "charts",
  1402 + "typeAlias": "timeseries_bars_flot",
  1403 + "type": "timeseries",
  1404 + "title": "New widget",
  1405 + "sizeX": 8,
  1406 + "sizeY": 5,
  1407 + "config": {
  1408 + "datasources": [
  1409 + {
  1410 + "type": "entity",
  1411 + "name": null,
  1412 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  1413 + "filterId": null,
  1414 + "dataKeys": [
  1415 + {
  1416 + "name": "storageDataPointsCountHourly",
  1417 + "type": "timeseries",
  1418 + "label": "Storage data points",
  1419 + "color": "#1039ee",
  1420 + "settings": {
  1421 + "excludeFromStacking": false,
  1422 + "hideDataByDefault": false,
  1423 + "disableDataHiding": false,
  1424 + "removeFromLegend": false,
  1425 + "showLines": false,
  1426 + "fillLines": false,
  1427 + "showPoints": false,
  1428 + "showPointShape": "circle",
  1429 + "pointShapeFormatter": "",
  1430 + "showPointsLineWidth": 5,
  1431 + "showPointsRadius": 3,
  1432 + "showSeparateAxis": false,
  1433 + "axisPosition": "left",
  1434 + "thresholds": [
  1435 + {
  1436 + "thresholdValueSource": "predefinedValue"
  1437 + }
  1438 + ],
  1439 + "comparisonSettings": {
  1440 + "showValuesForComparison": true
  1441 + }
  1442 + },
  1443 + "_hash": 0.0661644137210089,
  1444 + "units": null,
  1445 + "decimals": null,
  1446 + "funcBody": null,
  1447 + "usePostProcessing": null,
  1448 + "postFuncBody": null
  1449 + }
  1450 + ]
  1451 + }
  1452 + ],
  1453 + "timewindow": {
  1454 + "hideInterval": false,
  1455 + "hideAggregation": false,
  1456 + "hideAggInterval": false,
  1457 + "selectedTab": 0,
  1458 + "realtime": {
  1459 + "timewindowMs": 86400000,
  1460 + "interval": 3600000
  1461 + },
  1462 + "aggregation": {
  1463 + "type": "NONE",
  1464 + "limit": 1000
  1465 + }
  1466 + },
  1467 + "showTitle": true,
  1468 + "backgroundColor": "#fff",
  1469 + "color": "rgba(0, 0, 0, 0.87)",
  1470 + "padding": "8px",
  1471 + "settings": {
  1472 + "shadowSize": 4,
  1473 + "fontColor": "#545454",
  1474 + "fontSize": 10,
  1475 + "xaxis": {
  1476 + "showLabels": true,
  1477 + "color": "#545454"
  1478 + },
  1479 + "yaxis": {
  1480 + "showLabels": true,
  1481 + "color": "#545454",
  1482 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;",
  1483 + "min": 0,
  1484 + "tickDecimals": 0
  1485 + },
  1486 + "grid": {
  1487 + "color": "#545454",
  1488 + "tickColor": "#DDDDDD",
  1489 + "verticalLines": true,
  1490 + "horizontalLines": true,
  1491 + "outlineWidth": 1
  1492 + },
  1493 + "stack": false,
  1494 + "tooltipIndividual": false,
  1495 + "defaultBarWidth": 2400000,
  1496 + "barAlignment": "left",
  1497 + "timeForComparison": "months",
  1498 + "xaxisSecond": {
  1499 + "axisPosition": "top",
  1500 + "showLabels": true
  1501 + }
  1502 + },
  1503 + "title": "Telemetry persistence hourly activity",
  1504 + "dropShadow": true,
  1505 + "enableFullscreen": true,
  1506 + "titleStyle": {
  1507 + "fontSize": "16px",
  1508 + "fontWeight": 400
  1509 + },
  1510 + "widgetStyle": {},
  1511 + "useDashboardTimewindow": false,
  1512 + "showLegend": true,
  1513 + "actions": {
  1514 + "headerButton": [
  1515 + {
  1516 + "name": "View details",
  1517 + "icon": "insert_chart",
  1518 + "type": "openDashboardState",
  1519 + "targetDashboardStateId": "telemetry_persistence",
  1520 + "setEntityId": false,
  1521 + "stateEntityParamName": null,
  1522 + "openRightLayout": false,
  1523 + "id": "16707efb-e572-bd02-c219-55fc1b0f672a"
  1524 + }
  1525 + ]
  1526 + },
  1527 + "displayTimewindow": true,
  1528 + "showTitleIcon": false,
  1529 + "iconColor": "rgba(0, 0, 0, 0.87)",
  1530 + "iconSize": "24px",
  1531 + "titleTooltip": "",
  1532 + "legendConfig": {
  1533 + "direction": "column",
  1534 + "position": "bottom",
  1535 + "sortDataKeys": false,
  1536 + "showMin": false,
  1537 + "showMax": false,
  1538 + "showAvg": false,
  1539 + "showTotal": true
  1540 + }
  1541 + },
  1542 + "row": 0,
  1543 + "col": 0,
  1544 + "id": "84b6cfa5-1449-e0f2-3560-f810d2dd7ead"
  1545 + },
  1546 + "d296b566-a000-7402-ae9d-c815381c5435": {
  1547 + "isSystemType": true,
  1548 + "bundleAlias": "charts",
  1549 + "typeAlias": "timeseries_bars_flot",
  1550 + "type": "timeseries",
  1551 + "title": "New widget",
  1552 + "sizeX": 8,
  1553 + "sizeY": 5,
  1554 + "config": {
  1555 + "datasources": [
  1556 + {
  1557 + "type": "entity",
  1558 + "name": null,
  1559 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  1560 + "filterId": null,
  1561 + "dataKeys": [
  1562 + {
  1563 + "name": "emailCountHourly",
  1564 + "type": "timeseries",
  1565 + "label": "Email messages",
  1566 + "color": "#d35a00",
  1567 + "settings": {
  1568 + "excludeFromStacking": false,
  1569 + "hideDataByDefault": false,
  1570 + "disableDataHiding": false,
  1571 + "removeFromLegend": false,
  1572 + "showLines": false,
  1573 + "fillLines": false,
  1574 + "showPoints": false,
  1575 + "showPointShape": "circle",
  1576 + "pointShapeFormatter": "",
  1577 + "showPointsLineWidth": 5,
  1578 + "showPointsRadius": 3,
  1579 + "showSeparateAxis": false,
  1580 + "axisPosition": "left",
  1581 + "thresholds": [
  1582 + {
  1583 + "thresholdValueSource": "predefinedValue"
  1584 + }
  1585 + ],
  1586 + "comparisonSettings": {
  1587 + "showValuesForComparison": true
  1588 + }
  1589 + },
  1590 + "_hash": 0.0661644137210089,
  1591 + "units": null,
  1592 + "decimals": null,
  1593 + "funcBody": null,
  1594 + "usePostProcessing": null,
  1595 + "postFuncBody": null
  1596 + }
  1597 + ]
  1598 + }
  1599 + ],
  1600 + "timewindow": {
  1601 + "hideInterval": false,
  1602 + "hideAggregation": false,
  1603 + "hideAggInterval": false,
  1604 + "selectedTab": 0,
  1605 + "realtime": {
  1606 + "timewindowMs": 86400000,
  1607 + "interval": 3600000
  1608 + },
  1609 + "aggregation": {
  1610 + "type": "NONE",
  1611 + "limit": 1000
  1612 + }
  1613 + },
  1614 + "showTitle": true,
  1615 + "backgroundColor": "#fff",
  1616 + "color": "rgba(0, 0, 0, 0.87)",
  1617 + "padding": "8px",
  1618 + "settings": {
  1619 + "shadowSize": 4,
  1620 + "fontColor": "#545454",
  1621 + "fontSize": 10,
  1622 + "xaxis": {
  1623 + "showLabels": true,
  1624 + "color": "#545454"
  1625 + },
  1626 + "yaxis": {
  1627 + "showLabels": true,
  1628 + "color": "#545454",
  1629 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;",
  1630 + "min": 0,
  1631 + "tickDecimals": 0
  1632 + },
  1633 + "grid": {
  1634 + "color": "#545454",
  1635 + "tickColor": "#DDDDDD",
  1636 + "verticalLines": true,
  1637 + "horizontalLines": true,
  1638 + "outlineWidth": 1
  1639 + },
  1640 + "stack": false,
  1641 + "tooltipIndividual": false,
  1642 + "defaultBarWidth": 2400000,
  1643 + "barAlignment": "left",
  1644 + "timeForComparison": "months",
  1645 + "xaxisSecond": {
  1646 + "axisPosition": "top",
  1647 + "showLabels": true
  1648 + }
  1649 + },
  1650 + "title": "Email messages hourly activity",
  1651 + "dropShadow": true,
  1652 + "enableFullscreen": true,
  1653 + "titleStyle": {
  1654 + "fontSize": "16px",
  1655 + "fontWeight": 400
  1656 + },
  1657 + "widgetStyle": {},
  1658 + "useDashboardTimewindow": false,
  1659 + "showLegend": true,
  1660 + "actions": {
  1661 + "headerButton": [
  1662 + {
  1663 + "name": "View details",
  1664 + "icon": "insert_chart",
  1665 + "type": "openDashboardState",
  1666 + "targetDashboardStateId": "email_messages",
  1667 + "setEntityId": false,
  1668 + "stateEntityParamName": null,
  1669 + "openRightLayout": false,
  1670 + "id": "371882f9-ea23-3abc-fca8-9449c5dfdd6b"
  1671 + }
  1672 + ]
  1673 + },
  1674 + "displayTimewindow": true,
  1675 + "showTitleIcon": false,
  1676 + "iconColor": "rgba(0, 0, 0, 0.87)",
  1677 + "iconSize": "24px",
  1678 + "titleTooltip": "",
  1679 + "legendConfig": {
  1680 + "direction": "column",
  1681 + "position": "bottom",
  1682 + "sortDataKeys": false,
  1683 + "showMin": false,
  1684 + "showMax": false,
  1685 + "showAvg": false,
  1686 + "showTotal": true
  1687 + }
  1688 + },
  1689 + "row": 0,
  1690 + "col": 0,
  1691 + "id": "d296b566-a000-7402-ae9d-c815381c5435"
  1692 + },
  1693 + "00a02464-9509-911b-3b5e-21fb37629822": {
  1694 + "isSystemType": true,
  1695 + "bundleAlias": "charts",
  1696 + "typeAlias": "timeseries_bars_flot",
  1697 + "type": "timeseries",
  1698 + "title": "New widget",
  1699 + "sizeX": 8,
  1700 + "sizeY": 5,
  1701 + "config": {
  1702 + "datasources": [
  1703 + {
  1704 + "type": "entity",
  1705 + "name": null,
  1706 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  1707 + "filterId": null,
  1708 + "dataKeys": [
  1709 + {
  1710 + "name": "smsCountHourly",
  1711 + "type": "timeseries",
  1712 + "label": "SMS messages",
  1713 + "color": "#f36021",
  1714 + "settings": {
  1715 + "excludeFromStacking": false,
  1716 + "hideDataByDefault": false,
  1717 + "disableDataHiding": false,
  1718 + "removeFromLegend": false,
  1719 + "showLines": false,
  1720 + "fillLines": false,
  1721 + "showPoints": false,
  1722 + "showPointShape": "circle",
  1723 + "pointShapeFormatter": "",
  1724 + "showPointsLineWidth": 5,
  1725 + "showPointsRadius": 3,
  1726 + "showSeparateAxis": false,
  1727 + "axisPosition": "left",
  1728 + "thresholds": [
  1729 + {
  1730 + "thresholdValueSource": "predefinedValue"
  1731 + }
  1732 + ],
  1733 + "comparisonSettings": {
  1734 + "showValuesForComparison": true
  1735 + }
  1736 + },
  1737 + "_hash": 0.0661644137210089,
  1738 + "units": null,
  1739 + "decimals": null,
  1740 + "funcBody": null,
  1741 + "usePostProcessing": null,
  1742 + "postFuncBody": null
  1743 + }
  1744 + ]
  1745 + }
  1746 + ],
  1747 + "timewindow": {
  1748 + "hideInterval": false,
  1749 + "hideAggregation": false,
  1750 + "hideAggInterval": false,
  1751 + "selectedTab": 0,
  1752 + "realtime": {
  1753 + "timewindowMs": 86400000,
  1754 + "interval": 3600000
  1755 + },
  1756 + "aggregation": {
  1757 + "type": "NONE",
  1758 + "limit": 1000
  1759 + }
  1760 + },
  1761 + "showTitle": true,
  1762 + "backgroundColor": "#fff",
  1763 + "color": "rgba(0, 0, 0, 0.87)",
  1764 + "padding": "8px",
  1765 + "settings": {
  1766 + "shadowSize": 4,
  1767 + "fontColor": "#545454",
  1768 + "fontSize": 10,
  1769 + "xaxis": {
  1770 + "showLabels": true,
  1771 + "color": "#545454"
  1772 + },
  1773 + "yaxis": {
  1774 + "showLabels": true,
  1775 + "color": "#545454",
  1776 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;",
  1777 + "min": 0,
  1778 + "tickDecimals": 0
  1779 + },
  1780 + "grid": {
  1781 + "color": "#545454",
  1782 + "tickColor": "#DDDDDD",
  1783 + "verticalLines": true,
  1784 + "horizontalLines": true,
  1785 + "outlineWidth": 1
  1786 + },
  1787 + "stack": false,
  1788 + "tooltipIndividual": false,
  1789 + "defaultBarWidth": 2400000,
  1790 + "barAlignment": "left",
  1791 + "timeForComparison": "months",
  1792 + "xaxisSecond": {
  1793 + "axisPosition": "top",
  1794 + "showLabels": true
  1795 + }
  1796 + },
  1797 + "title": "SMS messages hourly activity",
  1798 + "dropShadow": true,
  1799 + "enableFullscreen": true,
  1800 + "titleStyle": {
  1801 + "fontSize": "16px",
  1802 + "fontWeight": 400
  1803 + },
  1804 + "widgetStyle": {},
  1805 + "useDashboardTimewindow": false,
  1806 + "showLegend": true,
  1807 + "actions": {
  1808 + "headerButton": [
  1809 + {
  1810 + "name": "View details",
  1811 + "icon": "insert_chart",
  1812 + "type": "openDashboardState",
  1813 + "targetDashboardStateId": "sms_messages",
  1814 + "setEntityId": false,
  1815 + "stateEntityParamName": null,
  1816 + "openRightLayout": false,
  1817 + "id": "49aefac0-ec5e-d6f3-f39c-8744759f4b19"
  1818 + }
  1819 + ]
  1820 + },
  1821 + "displayTimewindow": true,
  1822 + "showTitleIcon": false,
  1823 + "iconColor": "rgba(0, 0, 0, 0.87)",
  1824 + "iconSize": "24px",
  1825 + "titleTooltip": "",
  1826 + "legendConfig": {
  1827 + "direction": "column",
  1828 + "position": "bottom",
  1829 + "sortDataKeys": false,
  1830 + "showMin": false,
  1831 + "showMax": false,
  1832 + "showAvg": false,
  1833 + "showTotal": true
  1834 + }
  1835 + },
  1836 + "row": 0,
  1837 + "col": 0,
  1838 + "id": "00a02464-9509-911b-3b5e-21fb37629822"
  1839 + },
  1840 + "74199074-7873-6c6a-2a51-3fc614769f03": {
  1841 + "isSystemType": true,
  1842 + "bundleAlias": "charts",
  1843 + "typeAlias": "timeseries_bars_flot",
  1844 + "type": "timeseries",
  1845 + "title": "New widget",
  1846 + "sizeX": 8,
  1847 + "sizeY": 5,
  1848 + "config": {
  1849 + "datasources": [
  1850 + {
  1851 + "type": "entity",
  1852 + "name": null,
  1853 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  1854 + "filterId": null,
  1855 + "dataKeys": [
  1856 + {
  1857 + "name": "ruleEngineExecutionCountHourly",
  1858 + "type": "timeseries",
  1859 + "label": "Rule Engine executions",
  1860 + "color": "#ab00ff",
  1861 + "settings": {
  1862 + "excludeFromStacking": false,
  1863 + "hideDataByDefault": false,
  1864 + "disableDataHiding": false,
  1865 + "removeFromLegend": false,
  1866 + "showLines": false,
  1867 + "fillLines": false,
  1868 + "showPoints": false,
  1869 + "showPointShape": "circle",
  1870 + "pointShapeFormatter": "",
  1871 + "showPointsLineWidth": 5,
  1872 + "showPointsRadius": 3,
  1873 + "showSeparateAxis": false,
  1874 + "axisPosition": "left",
  1875 + "thresholds": [
  1876 + {
  1877 + "thresholdValueSource": "predefinedValue"
  1878 + }
  1879 + ],
  1880 + "comparisonSettings": {
  1881 + "showValuesForComparison": true
  1882 + }
  1883 + },
  1884 + "_hash": 0.0661644137210089,
  1885 + "units": null,
  1886 + "decimals": null,
  1887 + "funcBody": null,
  1888 + "usePostProcessing": null,
  1889 + "postFuncBody": null
  1890 + }
  1891 + ]
  1892 + }
  1893 + ],
  1894 + "timewindow": {
  1895 + "hideInterval": false,
  1896 + "hideAggregation": false,
  1897 + "hideAggInterval": false,
  1898 + "selectedTab": 1,
  1899 + "history": {
  1900 + "historyType": 0,
  1901 + "timewindowMs": 2592000000,
  1902 + "interval": 86400000
  1903 + },
  1904 + "aggregation": {
  1905 + "type": "SUM",
  1906 + "limit": 1000
  1907 + }
  1908 + },
  1909 + "showTitle": true,
  1910 + "backgroundColor": "#fff",
  1911 + "color": "rgba(0, 0, 0, 0.87)",
  1912 + "padding": "8px",
  1913 + "settings": {
  1914 + "shadowSize": 4,
  1915 + "fontColor": "#545454",
  1916 + "fontSize": 10,
  1917 + "xaxis": {
  1918 + "showLabels": true,
  1919 + "color": "#545454"
  1920 + },
  1921 + "yaxis": {
  1922 + "showLabels": true,
  1923 + "color": "#545454",
  1924 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;",
  1925 + "min": 0,
  1926 + "tickDecimals": 0
  1927 + },
  1928 + "grid": {
  1929 + "color": "#545454",
  1930 + "tickColor": "#DDDDDD",
  1931 + "verticalLines": true,
  1932 + "horizontalLines": true,
  1933 + "outlineWidth": 1
  1934 + },
  1935 + "stack": false,
  1936 + "tooltipIndividual": false,
  1937 + "defaultBarWidth": 1800000,
  1938 + "barAlignment": "left",
  1939 + "timeForComparison": "months",
  1940 + "xaxisSecond": {
  1941 + "axisPosition": "top",
  1942 + "showLabels": true
  1943 + }
  1944 + },
  1945 + "title": "Rule Engine daily activity",
  1946 + "dropShadow": true,
  1947 + "enableFullscreen": true,
  1948 + "titleStyle": {
  1949 + "fontSize": "16px",
  1950 + "fontWeight": 400
  1951 + },
  1952 + "widgetStyle": {},
  1953 + "useDashboardTimewindow": false,
  1954 + "showLegend": true,
  1955 + "actions": {},
  1956 + "displayTimewindow": true,
  1957 + "showTitleIcon": false,
  1958 + "iconColor": "rgba(0, 0, 0, 0.87)",
  1959 + "iconSize": "24px",
  1960 + "titleTooltip": "",
  1961 + "legendConfig": {
  1962 + "direction": "column",
  1963 + "position": "bottom",
  1964 + "sortDataKeys": false,
  1965 + "showMin": false,
  1966 + "showMax": false,
  1967 + "showAvg": false,
  1968 + "showTotal": true
  1969 + }
  1970 + },
  1971 + "row": 0,
  1972 + "col": 0,
  1973 + "id": "74199074-7873-6c6a-2a51-3fc614769f03"
  1974 + },
  1975 + "00006bc3-8a8d-b55e-ed39-e318f1bcd090": {
  1976 + "isSystemType": true,
  1977 + "bundleAlias": "charts",
  1978 + "typeAlias": "timeseries_bars_flot",
  1979 + "type": "timeseries",
  1980 + "title": "New widget",
  1981 + "sizeX": 8,
  1982 + "sizeY": 5,
  1983 + "config": {
  1984 + "datasources": [
  1985 + {
  1986 + "type": "entity",
  1987 + "name": null,
  1988 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  1989 + "filterId": null,
  1990 + "dataKeys": [
  1991 + {
  1992 + "name": "ruleEngineExecutionCount",
  1993 + "type": "timeseries",
  1994 + "label": "Rule Engine executions",
  1995 + "color": "#ab00ff",
  1996 + "settings": {
  1997 + "excludeFromStacking": false,
  1998 + "hideDataByDefault": false,
  1999 + "disableDataHiding": false,
  2000 + "removeFromLegend": false,
  2001 + "showLines": false,
  2002 + "fillLines": false,
  2003 + "showPoints": false,
  2004 + "showPointShape": "circle",
  2005 + "pointShapeFormatter": "",
  2006 + "showPointsLineWidth": 5,
  2007 + "showPointsRadius": 3,
  2008 + "showSeparateAxis": false,
  2009 + "axisPosition": "left",
  2010 + "thresholds": [
  2011 + {
  2012 + "thresholdValueSource": "predefinedValue"
  2013 + }
  2014 + ],
  2015 + "comparisonSettings": {
  2016 + "showValuesForComparison": true
  2017 + }
  2018 + },
  2019 + "_hash": 0.0661644137210089,
  2020 + "units": null,
  2021 + "decimals": null,
  2022 + "funcBody": null,
  2023 + "usePostProcessing": null,
  2024 + "postFuncBody": null
  2025 + }
  2026 + ]
  2027 + }
  2028 + ],
  2029 + "timewindow": {
  2030 + "hideInterval": false,
  2031 + "hideAggregation": false,
  2032 + "hideAggInterval": false,
  2033 + "selectedTab": 1,
  2034 + "history": {
  2035 + "historyType": 0,
  2036 + "timewindowMs": 31536000000,
  2037 + "interval": 1000
  2038 + },
  2039 + "aggregation": {
  2040 + "type": "NONE",
  2041 + "limit": 1000
  2042 + }
  2043 + },
  2044 + "showTitle": true,
  2045 + "backgroundColor": "#fff",
  2046 + "color": "rgba(0, 0, 0, 0.87)",
  2047 + "padding": "8px",
  2048 + "settings": {
  2049 + "shadowSize": 4,
  2050 + "fontColor": "#545454",
  2051 + "fontSize": 10,
  2052 + "xaxis": {
  2053 + "showLabels": true,
  2054 + "color": "#545454"
  2055 + },
  2056 + "yaxis": {
  2057 + "showLabels": true,
  2058 + "color": "#545454",
  2059 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;",
  2060 + "min": 0,
  2061 + "tickDecimals": 0
  2062 + },
  2063 + "grid": {
  2064 + "color": "#545454",
  2065 + "tickColor": "#DDDDDD",
  2066 + "verticalLines": true,
  2067 + "horizontalLines": true,
  2068 + "outlineWidth": 1
  2069 + },
  2070 + "stack": false,
  2071 + "tooltipIndividual": false,
  2072 + "defaultBarWidth": 900000000,
  2073 + "barAlignment": "left",
  2074 + "timeForComparison": "months",
  2075 + "xaxisSecond": {
  2076 + "axisPosition": "top",
  2077 + "showLabels": true
  2078 + }
  2079 + },
  2080 + "title": "Rule Engine monthly activity",
  2081 + "dropShadow": true,
  2082 + "enableFullscreen": true,
  2083 + "titleStyle": {
  2084 + "fontSize": "16px",
  2085 + "fontWeight": 400
  2086 + },
  2087 + "widgetStyle": {},
  2088 + "useDashboardTimewindow": false,
  2089 + "showLegend": true,
  2090 + "actions": {},
  2091 + "displayTimewindow": true,
  2092 + "showTitleIcon": false,
  2093 + "iconColor": "rgba(0, 0, 0, 0.87)",
  2094 + "iconSize": "24px",
  2095 + "titleTooltip": "",
  2096 + "legendConfig": {
  2097 + "direction": "column",
  2098 + "position": "bottom",
  2099 + "sortDataKeys": false,
  2100 + "showMin": false,
  2101 + "showMax": false,
  2102 + "showAvg": false,
  2103 + "showTotal": true
  2104 + }
  2105 + },
  2106 + "row": 0,
  2107 + "col": 0,
  2108 + "id": "00006bc3-8a8d-b55e-ed39-e318f1bcd090"
  2109 + },
  2110 + "5f5ca59c-e507-5301-5910-7ad8cd34df40": {
  2111 + "isSystemType": true,
  2112 + "bundleAlias": "charts",
  2113 + "typeAlias": "timeseries_bars_flot",
  2114 + "type": "timeseries",
  2115 + "title": "New widget",
  2116 + "sizeX": 8,
  2117 + "sizeY": 5,
  2118 + "config": {
  2119 + "datasources": [
  2120 + {
  2121 + "type": "entity",
  2122 + "name": null,
  2123 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  2124 + "filterId": null,
  2125 + "dataKeys": [
  2126 + {
  2127 + "name": "jsExecutionCountHourly",
  2128 + "type": "timeseries",
  2129 + "label": "JavaScript executions",
  2130 + "color": "#ff9900",
  2131 + "settings": {
  2132 + "excludeFromStacking": false,
  2133 + "hideDataByDefault": false,
  2134 + "disableDataHiding": false,
  2135 + "removeFromLegend": false,
  2136 + "showLines": false,
  2137 + "fillLines": false,
  2138 + "showPoints": false,
  2139 + "showPointShape": "circle",
  2140 + "pointShapeFormatter": "",
  2141 + "showPointsLineWidth": 5,
  2142 + "showPointsRadius": 3,
  2143 + "showSeparateAxis": false,
  2144 + "axisPosition": "left",
  2145 + "thresholds": [
  2146 + {
  2147 + "thresholdValueSource": "predefinedValue"
  2148 + }
  2149 + ],
  2150 + "comparisonSettings": {
  2151 + "showValuesForComparison": true
  2152 + }
  2153 + },
  2154 + "_hash": 0.0661644137210089,
  2155 + "units": null,
  2156 + "decimals": null,
  2157 + "funcBody": null,
  2158 + "usePostProcessing": null,
  2159 + "postFuncBody": null
  2160 + }
  2161 + ]
  2162 + }
  2163 + ],
  2164 + "timewindow": {
  2165 + "hideInterval": false,
  2166 + "hideAggregation": false,
  2167 + "hideAggInterval": false,
  2168 + "selectedTab": 1,
  2169 + "history": {
  2170 + "historyType": 0,
  2171 + "timewindowMs": 2592000000,
  2172 + "interval": 86400000
  2173 + },
  2174 + "aggregation": {
  2175 + "type": "SUM",
  2176 + "limit": 1000
  2177 + }
  2178 + },
  2179 + "showTitle": true,
  2180 + "backgroundColor": "#fff",
  2181 + "color": "rgba(0, 0, 0, 0.87)",
  2182 + "padding": "8px",
  2183 + "settings": {
  2184 + "shadowSize": 4,
  2185 + "fontColor": "#545454",
  2186 + "fontSize": 10,
  2187 + "xaxis": {
  2188 + "showLabels": true,
  2189 + "color": "#545454"
  2190 + },
  2191 + "yaxis": {
  2192 + "showLabels": true,
  2193 + "color": "#545454",
  2194 + "min": 0,
  2195 + "tickDecimals": 0,
  2196 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;"
  2197 + },
  2198 + "grid": {
  2199 + "color": "#545454",
  2200 + "tickColor": "#DDDDDD",
  2201 + "verticalLines": true,
  2202 + "horizontalLines": true,
  2203 + "outlineWidth": 1
  2204 + },
  2205 + "stack": false,
  2206 + "tooltipIndividual": false,
  2207 + "defaultBarWidth": 1800000,
  2208 + "barAlignment": "left",
  2209 + "timeForComparison": "months",
  2210 + "xaxisSecond": {
  2211 + "axisPosition": "top",
  2212 + "showLabels": true
  2213 + }
  2214 + },
  2215 + "title": "JavaScript functions daily activity",
  2216 + "dropShadow": true,
  2217 + "enableFullscreen": true,
  2218 + "titleStyle": {
  2219 + "fontSize": "16px",
  2220 + "fontWeight": 400
  2221 + },
  2222 + "widgetStyle": {},
  2223 + "useDashboardTimewindow": false,
  2224 + "showLegend": true,
  2225 + "actions": {},
  2226 + "displayTimewindow": true,
  2227 + "showTitleIcon": false,
  2228 + "iconColor": "rgba(0, 0, 0, 0.87)",
  2229 + "iconSize": "24px",
  2230 + "titleTooltip": "",
  2231 + "legendConfig": {
  2232 + "direction": "column",
  2233 + "position": "bottom",
  2234 + "sortDataKeys": false,
  2235 + "showMin": false,
  2236 + "showMax": false,
  2237 + "showAvg": false,
  2238 + "showTotal": true
  2239 + }
  2240 + },
  2241 + "row": 0,
  2242 + "col": 0,
  2243 + "id": "5f5ca59c-e507-5301-5910-7ad8cd34df40"
  2244 + },
  2245 + "ada32ee9-44ed-48d1-c368-fd0c94b7607f": {
  2246 + "isSystemType": true,
  2247 + "bundleAlias": "charts",
  2248 + "typeAlias": "timeseries_bars_flot",
  2249 + "type": "timeseries",
  2250 + "title": "New widget",
  2251 + "sizeX": 8,
  2252 + "sizeY": 5,
  2253 + "config": {
  2254 + "datasources": [
  2255 + {
  2256 + "type": "entity",
  2257 + "name": null,
  2258 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  2259 + "filterId": null,
  2260 + "dataKeys": [
  2261 + {
  2262 + "name": "jsExecutionCount",
  2263 + "type": "timeseries",
  2264 + "label": "JavaScript executions",
  2265 + "color": "#ff9900",
  2266 + "settings": {
  2267 + "excludeFromStacking": false,
  2268 + "hideDataByDefault": false,
  2269 + "disableDataHiding": false,
  2270 + "removeFromLegend": false,
  2271 + "showLines": false,
  2272 + "fillLines": false,
  2273 + "showPoints": false,
  2274 + "showPointShape": "circle",
  2275 + "pointShapeFormatter": "",
  2276 + "showPointsLineWidth": 5,
  2277 + "showPointsRadius": 3,
  2278 + "showSeparateAxis": false,
  2279 + "axisPosition": "left",
  2280 + "thresholds": [
  2281 + {
  2282 + "thresholdValueSource": "predefinedValue"
  2283 + }
  2284 + ],
  2285 + "comparisonSettings": {
  2286 + "showValuesForComparison": true
  2287 + }
  2288 + },
  2289 + "_hash": 0.0661644137210089,
  2290 + "units": null,
  2291 + "decimals": null,
  2292 + "funcBody": null,
  2293 + "usePostProcessing": null,
  2294 + "postFuncBody": null
  2295 + }
  2296 + ]
  2297 + }
  2298 + ],
  2299 + "timewindow": {
  2300 + "hideInterval": false,
  2301 + "hideAggregation": false,
  2302 + "hideAggInterval": false,
  2303 + "selectedTab": 1,
  2304 + "history": {
  2305 + "historyType": 0,
  2306 + "timewindowMs": 31536000000,
  2307 + "interval": 1000
  2308 + },
  2309 + "aggregation": {
  2310 + "type": "NONE",
  2311 + "limit": 1000
  2312 + }
  2313 + },
  2314 + "showTitle": true,
  2315 + "backgroundColor": "#fff",
  2316 + "color": "rgba(0, 0, 0, 0.87)",
  2317 + "padding": "8px",
  2318 + "settings": {
  2319 + "shadowSize": 4,
  2320 + "fontColor": "#545454",
  2321 + "fontSize": 10,
  2322 + "xaxis": {
  2323 + "showLabels": true,
  2324 + "color": "#545454"
  2325 + },
  2326 + "yaxis": {
  2327 + "showLabels": true,
  2328 + "color": "#545454",
  2329 + "min": 0,
  2330 + "tickDecimals": 0,
  2331 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;"
  2332 + },
  2333 + "grid": {
  2334 + "color": "#545454",
  2335 + "tickColor": "#DDDDDD",
  2336 + "verticalLines": true,
  2337 + "horizontalLines": true,
  2338 + "outlineWidth": 1
  2339 + },
  2340 + "stack": false,
  2341 + "tooltipIndividual": false,
  2342 + "defaultBarWidth": 900000000,
  2343 + "barAlignment": "left",
  2344 + "timeForComparison": "months",
  2345 + "xaxisSecond": {
  2346 + "axisPosition": "top",
  2347 + "showLabels": true
  2348 + }
  2349 + },
  2350 + "title": "JavaScript functions monthly activity",
  2351 + "dropShadow": true,
  2352 + "enableFullscreen": true,
  2353 + "titleStyle": {
  2354 + "fontSize": "16px",
  2355 + "fontWeight": 400
  2356 + },
  2357 + "widgetStyle": {},
  2358 + "useDashboardTimewindow": false,
  2359 + "showLegend": true,
  2360 + "actions": {},
  2361 + "displayTimewindow": true,
  2362 + "showTitleIcon": false,
  2363 + "iconColor": "rgba(0, 0, 0, 0.87)",
  2364 + "iconSize": "24px",
  2365 + "titleTooltip": "",
  2366 + "legendConfig": {
  2367 + "direction": "column",
  2368 + "position": "bottom",
  2369 + "sortDataKeys": false,
  2370 + "showMin": false,
  2371 + "showMax": false,
  2372 + "showAvg": false,
  2373 + "showTotal": true
  2374 + }
  2375 + },
  2376 + "row": 0,
  2377 + "col": 0,
  2378 + "id": "ada32ee9-44ed-48d1-c368-fd0c94b7607f"
  2379 + },
  2380 + "98bae68b-0f35-72f2-a428-9b06889f1554": {
  2381 + "isSystemType": true,
  2382 + "bundleAlias": "charts",
  2383 + "typeAlias": "timeseries_bars_flot",
  2384 + "type": "timeseries",
  2385 + "title": "New widget",
  2386 + "sizeX": 8,
  2387 + "sizeY": 5,
  2388 + "config": {
  2389 + "datasources": [
  2390 + {
  2391 + "type": "entity",
  2392 + "name": null,
  2393 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  2394 + "filterId": null,
  2395 + "dataKeys": [
  2396 + {
  2397 + "name": "transportMsgCountHourly",
  2398 + "type": "timeseries",
  2399 + "label": "Transport messages",
  2400 + "color": "#2196f3",
  2401 + "settings": {
  2402 + "excludeFromStacking": false,
  2403 + "hideDataByDefault": false,
  2404 + "disableDataHiding": false,
  2405 + "removeFromLegend": false,
  2406 + "showLines": false,
  2407 + "fillLines": false,
  2408 + "showPoints": false,
  2409 + "showPointShape": "circle",
  2410 + "pointShapeFormatter": "",
  2411 + "showPointsLineWidth": 5,
  2412 + "showPointsRadius": 3,
  2413 + "showSeparateAxis": false,
  2414 + "axisPosition": "left",
  2415 + "thresholds": [
  2416 + {
  2417 + "thresholdValueSource": "predefinedValue"
  2418 + }
  2419 + ],
  2420 + "comparisonSettings": {
  2421 + "showValuesForComparison": true
  2422 + }
  2423 + },
  2424 + "_hash": 0.0661644137210089,
  2425 + "units": null,
  2426 + "decimals": null,
  2427 + "funcBody": null,
  2428 + "usePostProcessing": null,
  2429 + "postFuncBody": null
  2430 + },
  2431 + {
  2432 + "name": "transportDataPointsCountHourly",
  2433 + "type": "timeseries",
  2434 + "label": "Transport data points",
  2435 + "color": "#4caf50",
  2436 + "settings": {
  2437 + "excludeFromStacking": false,
  2438 + "hideDataByDefault": false,
  2439 + "disableDataHiding": false,
  2440 + "removeFromLegend": false,
  2441 + "showLines": false,
  2442 + "fillLines": false,
  2443 + "showPoints": false,
  2444 + "showPointShape": "circle",
  2445 + "pointShapeFormatter": "",
  2446 + "showPointsLineWidth": 5,
  2447 + "showPointsRadius": 3,
  2448 + "showSeparateAxis": false,
  2449 + "axisPosition": "left",
  2450 + "thresholds": [
  2451 + {
  2452 + "thresholdValueSource": "predefinedValue"
  2453 + }
  2454 + ],
  2455 + "comparisonSettings": {
  2456 + "showValuesForComparison": true
  2457 + }
  2458 + },
  2459 + "_hash": 0.46849996721308895,
  2460 + "units": null,
  2461 + "decimals": null,
  2462 + "funcBody": null,
  2463 + "usePostProcessing": null,
  2464 + "postFuncBody": null
  2465 + }
  2466 + ]
  2467 + }
  2468 + ],
  2469 + "timewindow": {
  2470 + "hideInterval": false,
  2471 + "hideAggregation": false,
  2472 + "hideAggInterval": false,
  2473 + "selectedTab": 1,
  2474 + "history": {
  2475 + "historyType": 0,
  2476 + "timewindowMs": 2592000000,
  2477 + "interval": 86400000
  2478 + },
  2479 + "aggregation": {
  2480 + "type": "SUM",
  2481 + "limit": 1000
  2482 + }
  2483 + },
  2484 + "showTitle": true,
  2485 + "backgroundColor": "#fff",
  2486 + "color": "rgba(0, 0, 0, 0.87)",
  2487 + "padding": "8px",
  2488 + "settings": {
  2489 + "shadowSize": 4,
  2490 + "fontColor": "#545454",
  2491 + "fontSize": 10,
  2492 + "xaxis": {
  2493 + "showLabels": true,
  2494 + "color": "#545454"
  2495 + },
  2496 + "yaxis": {
  2497 + "showLabels": true,
  2498 + "color": "#545454",
  2499 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;",
  2500 + "min": 0,
  2501 + "tickDecimals": 0
  2502 + },
  2503 + "grid": {
  2504 + "color": "#545454",
  2505 + "tickColor": "#DDDDDD",
  2506 + "verticalLines": true,
  2507 + "horizontalLines": true,
  2508 + "outlineWidth": 1
  2509 + },
  2510 + "stack": true,
  2511 + "tooltipIndividual": false,
  2512 + "defaultBarWidth": 1800000,
  2513 + "barAlignment": "left",
  2514 + "timeForComparison": "months",
  2515 + "xaxisSecond": {
  2516 + "axisPosition": "top",
  2517 + "showLabels": true
  2518 + },
  2519 + "tooltipCumulative": false
  2520 + },
  2521 + "title": "Transport daily activity",
  2522 + "dropShadow": true,
  2523 + "enableFullscreen": true,
  2524 + "titleStyle": {
  2525 + "fontSize": "16px",
  2526 + "fontWeight": 400
  2527 + },
  2528 + "widgetStyle": {},
  2529 + "useDashboardTimewindow": false,
  2530 + "showLegend": true,
  2531 + "actions": {},
  2532 + "displayTimewindow": true,
  2533 + "showTitleIcon": false,
  2534 + "iconColor": "rgba(0, 0, 0, 0.87)",
  2535 + "iconSize": "24px",
  2536 + "titleTooltip": "",
  2537 + "legendConfig": {
  2538 + "direction": "column",
  2539 + "position": "bottom",
  2540 + "sortDataKeys": false,
  2541 + "showMin": false,
  2542 + "showMax": false,
  2543 + "showAvg": false,
  2544 + "showTotal": true
  2545 + }
  2546 + },
  2547 + "row": 0,
  2548 + "col": 0,
  2549 + "id": "98bae68b-0f35-72f2-a428-9b06889f1554"
  2550 + },
  2551 + "e61e5477-5a09-cc25-966b-f613d81da833": {
  2552 + "isSystemType": true,
  2553 + "bundleAlias": "charts",
  2554 + "typeAlias": "timeseries_bars_flot",
  2555 + "type": "timeseries",
  2556 + "title": "New widget",
  2557 + "sizeX": 8,
  2558 + "sizeY": 5,
  2559 + "config": {
  2560 + "datasources": [
  2561 + {
  2562 + "type": "entity",
  2563 + "name": null,
  2564 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  2565 + "filterId": null,
  2566 + "dataKeys": [
  2567 + {
  2568 + "name": "transportMsgCount",
  2569 + "type": "timeseries",
  2570 + "label": "Transport messages",
  2571 + "color": "#2196f3",
  2572 + "settings": {
  2573 + "excludeFromStacking": false,
  2574 + "hideDataByDefault": false,
  2575 + "disableDataHiding": false,
  2576 + "removeFromLegend": false,
  2577 + "showLines": false,
  2578 + "fillLines": false,
  2579 + "showPoints": false,
  2580 + "showPointShape": "circle",
  2581 + "pointShapeFormatter": "",
  2582 + "showPointsLineWidth": 5,
  2583 + "showPointsRadius": 3,
  2584 + "showSeparateAxis": false,
  2585 + "axisPosition": "left",
  2586 + "thresholds": [
  2587 + {
  2588 + "thresholdValueSource": "predefinedValue"
  2589 + }
  2590 + ],
  2591 + "comparisonSettings": {
  2592 + "showValuesForComparison": true
  2593 + }
  2594 + },
  2595 + "_hash": 0.0661644137210089,
  2596 + "units": null,
  2597 + "decimals": null,
  2598 + "funcBody": null,
  2599 + "usePostProcessing": null,
  2600 + "postFuncBody": null
  2601 + },
  2602 + {
  2603 + "name": "transportDataPointsCount",
  2604 + "type": "timeseries",
  2605 + "label": "Transport data points",
  2606 + "color": "#4caf50",
  2607 + "settings": {
  2608 + "excludeFromStacking": false,
  2609 + "hideDataByDefault": false,
  2610 + "disableDataHiding": false,
  2611 + "removeFromLegend": false,
  2612 + "showLines": false,
  2613 + "fillLines": false,
  2614 + "showPoints": false,
  2615 + "showPointShape": "circle",
  2616 + "pointShapeFormatter": "",
  2617 + "showPointsLineWidth": 5,
  2618 + "showPointsRadius": 3,
  2619 + "showSeparateAxis": false,
  2620 + "axisPosition": "left",
  2621 + "thresholds": [
  2622 + {
  2623 + "thresholdValueSource": "predefinedValue"
  2624 + }
  2625 + ],
  2626 + "comparisonSettings": {
  2627 + "showValuesForComparison": true
  2628 + }
  2629 + },
  2630 + "_hash": 0.46849996721308895,
  2631 + "units": null,
  2632 + "decimals": null,
  2633 + "funcBody": null,
  2634 + "usePostProcessing": null,
  2635 + "postFuncBody": null
  2636 + }
  2637 + ]
  2638 + }
  2639 + ],
  2640 + "timewindow": {
  2641 + "hideInterval": false,
  2642 + "hideAggregation": false,
  2643 + "hideAggInterval": false,
  2644 + "selectedTab": 1,
  2645 + "history": {
  2646 + "historyType": 0,
  2647 + "timewindowMs": 31536000000,
  2648 + "interval": 2592000000
  2649 + },
  2650 + "aggregation": {
  2651 + "type": "NONE",
  2652 + "limit": 1000
  2653 + }
  2654 + },
  2655 + "showTitle": true,
  2656 + "backgroundColor": "#fff",
  2657 + "color": "rgba(0, 0, 0, 0.87)",
  2658 + "padding": "8px",
  2659 + "settings": {
  2660 + "shadowSize": 4,
  2661 + "fontColor": "#545454",
  2662 + "fontSize": 10,
  2663 + "xaxis": {
  2664 + "showLabels": true,
  2665 + "color": "#545454"
  2666 + },
  2667 + "yaxis": {
  2668 + "showLabels": true,
  2669 + "color": "#545454",
  2670 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;",
  2671 + "min": 0,
  2672 + "tickDecimals": 0
  2673 + },
  2674 + "grid": {
  2675 + "color": "#545454",
  2676 + "tickColor": "#DDDDDD",
  2677 + "verticalLines": true,
  2678 + "horizontalLines": true,
  2679 + "outlineWidth": 1
  2680 + },
  2681 + "stack": true,
  2682 + "tooltipIndividual": false,
  2683 + "defaultBarWidth": 900000000,
  2684 + "barAlignment": "left",
  2685 + "timeForComparison": "months",
  2686 + "xaxisSecond": {
  2687 + "axisPosition": "top",
  2688 + "showLabels": true
  2689 + },
  2690 + "tooltipCumulative": false
  2691 + },
  2692 + "title": "Transport monthly activity",
  2693 + "dropShadow": true,
  2694 + "enableFullscreen": true,
  2695 + "titleStyle": {
  2696 + "fontSize": "16px",
  2697 + "fontWeight": 400
  2698 + },
  2699 + "widgetStyle": {},
  2700 + "useDashboardTimewindow": false,
  2701 + "showLegend": true,
  2702 + "actions": {},
  2703 + "displayTimewindow": true,
  2704 + "showTitleIcon": false,
  2705 + "iconColor": "rgba(0, 0, 0, 0.87)",
  2706 + "iconSize": "24px",
  2707 + "titleTooltip": "",
  2708 + "legendConfig": {
  2709 + "direction": "column",
  2710 + "position": "bottom",
  2711 + "sortDataKeys": false,
  2712 + "showMin": false,
  2713 + "showMax": false,
  2714 + "showAvg": false,
  2715 + "showTotal": true
  2716 + }
  2717 + },
  2718 + "row": 0,
  2719 + "col": 0,
  2720 + "id": "e61e5477-5a09-cc25-966b-f613d81da833"
  2721 + },
  2722 + "85fe0738-5326-f069-ab3f-30594bde5fed": {
  2723 + "isSystemType": true,
  2724 + "bundleAlias": "charts",
  2725 + "typeAlias": "timeseries_bars_flot",
  2726 + "type": "timeseries",
  2727 + "title": "New widget",
  2728 + "sizeX": 8,
  2729 + "sizeY": 5,
  2730 + "config": {
  2731 + "datasources": [
  2732 + {
  2733 + "type": "entity",
  2734 + "name": null,
  2735 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  2736 + "filterId": null,
  2737 + "dataKeys": [
  2738 + {
  2739 + "name": "storageDataPointsCountHourly",
  2740 + "type": "timeseries",
  2741 + "label": "Storage data points",
  2742 + "color": "#1039ee",
  2743 + "settings": {
  2744 + "excludeFromStacking": false,
  2745 + "hideDataByDefault": false,
  2746 + "disableDataHiding": false,
  2747 + "removeFromLegend": false,
  2748 + "showLines": false,
  2749 + "fillLines": false,
  2750 + "showPoints": false,
  2751 + "showPointShape": "circle",
  2752 + "pointShapeFormatter": "",
  2753 + "showPointsLineWidth": 5,
  2754 + "showPointsRadius": 3,
  2755 + "showSeparateAxis": false,
  2756 + "axisPosition": "left",
  2757 + "thresholds": [
  2758 + {
  2759 + "thresholdValueSource": "predefinedValue"
  2760 + }
  2761 + ],
  2762 + "comparisonSettings": {
  2763 + "showValuesForComparison": true
  2764 + }
  2765 + },
  2766 + "_hash": 0.0661644137210089,
  2767 + "units": null,
  2768 + "decimals": null,
  2769 + "funcBody": null,
  2770 + "usePostProcessing": null,
  2771 + "postFuncBody": null
  2772 + }
  2773 + ]
  2774 + }
  2775 + ],
  2776 + "timewindow": {
  2777 + "hideInterval": false,
  2778 + "hideAggregation": false,
  2779 + "hideAggInterval": false,
  2780 + "selectedTab": 1,
  2781 + "history": {
  2782 + "historyType": 0,
  2783 + "timewindowMs": 2592000000,
  2784 + "interval": 86400000
  2785 + },
  2786 + "aggregation": {
  2787 + "type": "SUM",
  2788 + "limit": 1000
  2789 + }
  2790 + },
  2791 + "showTitle": true,
  2792 + "backgroundColor": "#fff",
  2793 + "color": "rgba(0, 0, 0, 0.87)",
  2794 + "padding": "8px",
  2795 + "settings": {
  2796 + "shadowSize": 4,
  2797 + "fontColor": "#545454",
  2798 + "fontSize": 10,
  2799 + "xaxis": {
  2800 + "showLabels": true,
  2801 + "color": "#545454"
  2802 + },
  2803 + "yaxis": {
  2804 + "showLabels": true,
  2805 + "color": "#545454",
  2806 + "min": 0,
  2807 + "tickDecimals": 0,
  2808 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;"
  2809 + },
  2810 + "grid": {
  2811 + "color": "#545454",
  2812 + "tickColor": "#DDDDDD",
  2813 + "verticalLines": true,
  2814 + "horizontalLines": true,
  2815 + "outlineWidth": 1
  2816 + },
  2817 + "stack": false,
  2818 + "tooltipIndividual": false,
  2819 + "defaultBarWidth": 1800000,
  2820 + "barAlignment": "left",
  2821 + "timeForComparison": "months",
  2822 + "xaxisSecond": {
  2823 + "axisPosition": "top",
  2824 + "showLabels": true
  2825 + }
  2826 + },
  2827 + "title": "Telemetry persistence daily activity",
  2828 + "dropShadow": true,
  2829 + "enableFullscreen": true,
  2830 + "titleStyle": {
  2831 + "fontSize": "16px",
  2832 + "fontWeight": 400
  2833 + },
  2834 + "widgetStyle": {},
  2835 + "useDashboardTimewindow": false,
  2836 + "showLegend": true,
  2837 + "actions": {},
  2838 + "displayTimewindow": true,
  2839 + "showTitleIcon": false,
  2840 + "iconColor": "rgba(0, 0, 0, 0.87)",
  2841 + "iconSize": "24px",
  2842 + "titleTooltip": "",
  2843 + "legendConfig": {
  2844 + "direction": "column",
  2845 + "position": "bottom",
  2846 + "sortDataKeys": false,
  2847 + "showMin": false,
  2848 + "showMax": false,
  2849 + "showAvg": false,
  2850 + "showTotal": true
  2851 + }
  2852 + },
  2853 + "row": 0,
  2854 + "col": 0,
  2855 + "id": "85fe0738-5326-f069-ab3f-30594bde5fed"
  2856 + },
  2857 + "eaeb381a-437e-f6e9-60c9-6bc8826fdd44": {
  2858 + "isSystemType": true,
  2859 + "bundleAlias": "charts",
  2860 + "typeAlias": "timeseries_bars_flot",
  2861 + "type": "timeseries",
  2862 + "title": "New widget",
  2863 + "sizeX": 8,
  2864 + "sizeY": 5,
  2865 + "config": {
  2866 + "datasources": [
  2867 + {
  2868 + "type": "entity",
  2869 + "name": null,
  2870 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  2871 + "filterId": null,
  2872 + "dataKeys": [
  2873 + {
  2874 + "name": "storageDataPointsCount",
  2875 + "type": "timeseries",
  2876 + "label": "Storage data points",
  2877 + "color": "#1039ee",
  2878 + "settings": {
  2879 + "excludeFromStacking": false,
  2880 + "hideDataByDefault": false,
  2881 + "disableDataHiding": false,
  2882 + "removeFromLegend": false,
  2883 + "showLines": false,
  2884 + "fillLines": false,
  2885 + "showPoints": false,
  2886 + "showPointShape": "circle",
  2887 + "pointShapeFormatter": "",
  2888 + "showPointsLineWidth": 5,
  2889 + "showPointsRadius": 3,
  2890 + "showSeparateAxis": false,
  2891 + "axisPosition": "left",
  2892 + "thresholds": [
  2893 + {
  2894 + "thresholdValueSource": "predefinedValue"
  2895 + }
  2896 + ],
  2897 + "comparisonSettings": {
  2898 + "showValuesForComparison": true
  2899 + }
  2900 + },
  2901 + "_hash": 0.0661644137210089,
  2902 + "units": null,
  2903 + "decimals": null,
  2904 + "funcBody": null,
  2905 + "usePostProcessing": null,
  2906 + "postFuncBody": null
  2907 + }
  2908 + ]
  2909 + }
  2910 + ],
  2911 + "timewindow": {
  2912 + "hideInterval": false,
  2913 + "hideAggregation": false,
  2914 + "hideAggInterval": false,
  2915 + "selectedTab": 1,
  2916 + "history": {
  2917 + "historyType": 0,
  2918 + "timewindowMs": 31536000000,
  2919 + "interval": 1000
  2920 + },
  2921 + "aggregation": {
  2922 + "type": "NONE",
  2923 + "limit": 1000
  2924 + }
  2925 + },
  2926 + "showTitle": true,
  2927 + "backgroundColor": "#fff",
  2928 + "color": "rgba(0, 0, 0, 0.87)",
  2929 + "padding": "8px",
  2930 + "settings": {
  2931 + "shadowSize": 4,
  2932 + "fontColor": "#545454",
  2933 + "fontSize": 10,
  2934 + "xaxis": {
  2935 + "showLabels": true,
  2936 + "color": "#545454"
  2937 + },
  2938 + "yaxis": {
  2939 + "showLabels": true,
  2940 + "color": "#545454",
  2941 + "min": 0,
  2942 + "tickDecimals": 0,
  2943 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;"
  2944 + },
  2945 + "grid": {
  2946 + "color": "#545454",
  2947 + "tickColor": "#DDDDDD",
  2948 + "verticalLines": true,
  2949 + "horizontalLines": true,
  2950 + "outlineWidth": 1
  2951 + },
  2952 + "stack": false,
  2953 + "tooltipIndividual": false,
  2954 + "defaultBarWidth": 900000000,
  2955 + "barAlignment": "left",
  2956 + "timeForComparison": "months",
  2957 + "xaxisSecond": {
  2958 + "axisPosition": "top",
  2959 + "showLabels": true
  2960 + }
  2961 + },
  2962 + "title": "Telemetry persistence monthly activity",
  2963 + "dropShadow": true,
  2964 + "enableFullscreen": true,
  2965 + "titleStyle": {
  2966 + "fontSize": "16px",
  2967 + "fontWeight": 400
  2968 + },
  2969 + "widgetStyle": {},
  2970 + "useDashboardTimewindow": false,
  2971 + "showLegend": true,
  2972 + "actions": {},
  2973 + "displayTimewindow": true,
  2974 + "showTitleIcon": false,
  2975 + "iconColor": "rgba(0, 0, 0, 0.87)",
  2976 + "iconSize": "24px",
  2977 + "titleTooltip": "",
  2978 + "legendConfig": {
  2979 + "direction": "column",
  2980 + "position": "bottom",
  2981 + "sortDataKeys": false,
  2982 + "showMin": false,
  2983 + "showMax": false,
  2984 + "showAvg": false,
  2985 + "showTotal": true
  2986 + }
  2987 + },
  2988 + "row": 0,
  2989 + "col": 0,
  2990 + "id": "eaeb381a-437e-f6e9-60c9-6bc8826fdd44"
  2991 + },
  2992 + "4b798823-b97d-9d6a-59dc-fcafd897fc23": {
  2993 + "isSystemType": true,
  2994 + "bundleAlias": "charts",
  2995 + "typeAlias": "timeseries_bars_flot",
  2996 + "type": "timeseries",
  2997 + "title": "New widget",
  2998 + "sizeX": 8,
  2999 + "sizeY": 5,
  3000 + "config": {
  3001 + "datasources": [
  3002 + {
  3003 + "type": "entity",
  3004 + "name": null,
  3005 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  3006 + "filterId": null,
  3007 + "dataKeys": [
  3008 + {
  3009 + "name": "emailCountHourly",
  3010 + "type": "timeseries",
  3011 + "label": "Email messages",
  3012 + "color": "#d35a00",
  3013 + "settings": {
  3014 + "excludeFromStacking": false,
  3015 + "hideDataByDefault": false,
  3016 + "disableDataHiding": false,
  3017 + "removeFromLegend": false,
  3018 + "showLines": false,
  3019 + "fillLines": false,
  3020 + "showPoints": false,
  3021 + "showPointShape": "circle",
  3022 + "pointShapeFormatter": "",
  3023 + "showPointsLineWidth": 5,
  3024 + "showPointsRadius": 3,
  3025 + "showSeparateAxis": false,
  3026 + "axisPosition": "left",
  3027 + "thresholds": [
  3028 + {
  3029 + "thresholdValueSource": "predefinedValue"
  3030 + }
  3031 + ],
  3032 + "comparisonSettings": {
  3033 + "showValuesForComparison": true
  3034 + }
  3035 + },
  3036 + "_hash": 0.0661644137210089,
  3037 + "units": null,
  3038 + "decimals": null,
  3039 + "funcBody": null,
  3040 + "usePostProcessing": null,
  3041 + "postFuncBody": null
  3042 + }
  3043 + ]
  3044 + }
  3045 + ],
  3046 + "timewindow": {
  3047 + "hideInterval": false,
  3048 + "hideAggregation": false,
  3049 + "hideAggInterval": false,
  3050 + "selectedTab": 1,
  3051 + "history": {
  3052 + "historyType": 0,
  3053 + "timewindowMs": 2592000000,
  3054 + "interval": 86400000
  3055 + },
  3056 + "aggregation": {
  3057 + "type": "SUM",
  3058 + "limit": 1000
  3059 + }
  3060 + },
  3061 + "showTitle": true,
  3062 + "backgroundColor": "#fff",
  3063 + "color": "rgba(0, 0, 0, 0.87)",
  3064 + "padding": "8px",
  3065 + "settings": {
  3066 + "shadowSize": 4,
  3067 + "fontColor": "#545454",
  3068 + "fontSize": 10,
  3069 + "xaxis": {
  3070 + "showLabels": true,
  3071 + "color": "#545454"
  3072 + },
  3073 + "yaxis": {
  3074 + "showLabels": true,
  3075 + "color": "#545454",
  3076 + "min": 0,
  3077 + "tickDecimals": 0,
  3078 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;"
  3079 + },
  3080 + "grid": {
  3081 + "color": "#545454",
  3082 + "tickColor": "#DDDDDD",
  3083 + "verticalLines": true,
  3084 + "horizontalLines": true,
  3085 + "outlineWidth": 1
  3086 + },
  3087 + "stack": false,
  3088 + "tooltipIndividual": false,
  3089 + "defaultBarWidth": 1800000,
  3090 + "barAlignment": "left",
  3091 + "timeForComparison": "months",
  3092 + "xaxisSecond": {
  3093 + "axisPosition": "top",
  3094 + "showLabels": true
  3095 + }
  3096 + },
  3097 + "title": "Email messages daily activity",
  3098 + "dropShadow": true,
  3099 + "enableFullscreen": true,
  3100 + "titleStyle": {
  3101 + "fontSize": "16px",
  3102 + "fontWeight": 400
  3103 + },
  3104 + "widgetStyle": {},
  3105 + "useDashboardTimewindow": false,
  3106 + "showLegend": true,
  3107 + "actions": {},
  3108 + "displayTimewindow": true,
  3109 + "showTitleIcon": false,
  3110 + "iconColor": "rgba(0, 0, 0, 0.87)",
  3111 + "iconSize": "24px",
  3112 + "titleTooltip": "",
  3113 + "legendConfig": {
  3114 + "direction": "column",
  3115 + "position": "bottom",
  3116 + "sortDataKeys": false,
  3117 + "showMin": false,
  3118 + "showMax": false,
  3119 + "showAvg": false,
  3120 + "showTotal": true
  3121 + }
  3122 + },
  3123 + "row": 0,
  3124 + "col": 0,
  3125 + "id": "4b798823-b97d-9d6a-59dc-fcafd897fc23"
  3126 + },
  3127 + "6a981580-7490-19dd-f937-b64cbf67a982": {
  3128 + "isSystemType": true,
  3129 + "bundleAlias": "charts",
  3130 + "typeAlias": "timeseries_bars_flot",
  3131 + "type": "timeseries",
  3132 + "title": "New widget",
  3133 + "sizeX": 8,
  3134 + "sizeY": 5,
  3135 + "config": {
  3136 + "datasources": [
  3137 + {
  3138 + "type": "entity",
  3139 + "name": null,
  3140 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  3141 + "filterId": null,
  3142 + "dataKeys": [
  3143 + {
  3144 + "name": "emailCount",
  3145 + "type": "timeseries",
  3146 + "label": "Email messages",
  3147 + "color": "#d35a00",
  3148 + "settings": {
  3149 + "excludeFromStacking": false,
  3150 + "hideDataByDefault": false,
  3151 + "disableDataHiding": false,
  3152 + "removeFromLegend": false,
  3153 + "showLines": false,
  3154 + "fillLines": false,
  3155 + "showPoints": false,
  3156 + "showPointShape": "circle",
  3157 + "pointShapeFormatter": "",
  3158 + "showPointsLineWidth": 5,
  3159 + "showPointsRadius": 3,
  3160 + "showSeparateAxis": false,
  3161 + "axisPosition": "left",
  3162 + "thresholds": [
  3163 + {
  3164 + "thresholdValueSource": "predefinedValue"
  3165 + }
  3166 + ],
  3167 + "comparisonSettings": {
  3168 + "showValuesForComparison": true
  3169 + }
  3170 + },
  3171 + "_hash": 0.0661644137210089,
  3172 + "units": null,
  3173 + "decimals": null,
  3174 + "funcBody": null,
  3175 + "usePostProcessing": null,
  3176 + "postFuncBody": null
  3177 + }
  3178 + ]
  3179 + }
  3180 + ],
  3181 + "timewindow": {
  3182 + "hideInterval": false,
  3183 + "hideAggregation": false,
  3184 + "hideAggInterval": false,
  3185 + "selectedTab": 1,
  3186 + "history": {
  3187 + "historyType": 0,
  3188 + "timewindowMs": 31536000000,
  3189 + "interval": 1000
  3190 + },
  3191 + "aggregation": {
  3192 + "type": "NONE",
  3193 + "limit": 1000
  3194 + }
  3195 + },
  3196 + "showTitle": true,
  3197 + "backgroundColor": "#fff",
  3198 + "color": "rgba(0, 0, 0, 0.87)",
  3199 + "padding": "8px",
  3200 + "settings": {
  3201 + "shadowSize": 4,
  3202 + "fontColor": "#545454",
  3203 + "fontSize": 10,
  3204 + "xaxis": {
  3205 + "showLabels": true,
  3206 + "color": "#545454"
  3207 + },
  3208 + "yaxis": {
  3209 + "showLabels": true,
  3210 + "color": "#545454",
  3211 + "min": 0,
  3212 + "tickDecimals": 0,
  3213 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;"
  3214 + },
  3215 + "grid": {
  3216 + "color": "#545454",
  3217 + "tickColor": "#DDDDDD",
  3218 + "verticalLines": true,
  3219 + "horizontalLines": true,
  3220 + "outlineWidth": 1
  3221 + },
  3222 + "stack": false,
  3223 + "tooltipIndividual": false,
  3224 + "defaultBarWidth": 900000000,
  3225 + "barAlignment": "left",
  3226 + "timeForComparison": "months",
  3227 + "xaxisSecond": {
  3228 + "axisPosition": "top",
  3229 + "showLabels": true
  3230 + }
  3231 + },
  3232 + "title": "Email messages monthly activity",
  3233 + "dropShadow": true,
  3234 + "enableFullscreen": true,
  3235 + "titleStyle": {
  3236 + "fontSize": "16px",
  3237 + "fontWeight": 400
  3238 + },
  3239 + "widgetStyle": {},
  3240 + "useDashboardTimewindow": false,
  3241 + "showLegend": true,
  3242 + "actions": {},
  3243 + "displayTimewindow": true,
  3244 + "showTitleIcon": false,
  3245 + "iconColor": "rgba(0, 0, 0, 0.87)",
  3246 + "iconSize": "24px",
  3247 + "titleTooltip": "",
  3248 + "legendConfig": {
  3249 + "direction": "column",
  3250 + "position": "bottom",
  3251 + "sortDataKeys": false,
  3252 + "showMin": false,
  3253 + "showMax": false,
  3254 + "showAvg": false,
  3255 + "showTotal": true
  3256 + }
  3257 + },
  3258 + "row": 0,
  3259 + "col": 0,
  3260 + "id": "6a981580-7490-19dd-f937-b64cbf67a982"
  3261 + },
  3262 + "7302df65-1b0c-579e-bbdb-145126ae3392": {
  3263 + "isSystemType": true,
  3264 + "bundleAlias": "charts",
  3265 + "typeAlias": "timeseries_bars_flot",
  3266 + "type": "timeseries",
  3267 + "title": "New widget",
  3268 + "sizeX": 8,
  3269 + "sizeY": 5,
  3270 + "config": {
  3271 + "datasources": [
  3272 + {
  3273 + "type": "entity",
  3274 + "name": null,
  3275 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  3276 + "filterId": null,
  3277 + "dataKeys": [
  3278 + {
  3279 + "name": "smsCountHourly",
  3280 + "type": "timeseries",
  3281 + "label": "SMS messages",
  3282 + "color": "#f36021",
  3283 + "settings": {
  3284 + "excludeFromStacking": false,
  3285 + "hideDataByDefault": false,
  3286 + "disableDataHiding": false,
  3287 + "removeFromLegend": false,
  3288 + "showLines": false,
  3289 + "fillLines": false,
  3290 + "showPoints": false,
  3291 + "showPointShape": "circle",
  3292 + "pointShapeFormatter": "",
  3293 + "showPointsLineWidth": 5,
  3294 + "showPointsRadius": 3,
  3295 + "showSeparateAxis": false,
  3296 + "axisPosition": "left",
  3297 + "thresholds": [
  3298 + {
  3299 + "thresholdValueSource": "predefinedValue"
  3300 + }
  3301 + ],
  3302 + "comparisonSettings": {
  3303 + "showValuesForComparison": true
  3304 + }
  3305 + },
  3306 + "_hash": 0.0661644137210089,
  3307 + "units": null,
  3308 + "decimals": null,
  3309 + "funcBody": null,
  3310 + "usePostProcessing": null,
  3311 + "postFuncBody": null
  3312 + }
  3313 + ]
  3314 + }
  3315 + ],
  3316 + "timewindow": {
  3317 + "hideInterval": false,
  3318 + "hideAggregation": false,
  3319 + "hideAggInterval": false,
  3320 + "selectedTab": 1,
  3321 + "history": {
  3322 + "historyType": 0,
  3323 + "timewindowMs": 2592000000,
  3324 + "interval": 86400000
  3325 + },
  3326 + "aggregation": {
  3327 + "type": "SUM",
  3328 + "limit": 1000
  3329 + }
  3330 + },
  3331 + "showTitle": true,
  3332 + "backgroundColor": "#fff",
  3333 + "color": "rgba(0, 0, 0, 0.87)",
  3334 + "padding": "8px",
  3335 + "settings": {
  3336 + "shadowSize": 4,
  3337 + "fontColor": "#545454",
  3338 + "fontSize": 10,
  3339 + "xaxis": {
  3340 + "showLabels": true,
  3341 + "color": "#545454"
  3342 + },
  3343 + "yaxis": {
  3344 + "showLabels": true,
  3345 + "color": "#545454",
  3346 + "min": 0,
  3347 + "tickDecimals": 0,
  3348 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;"
  3349 + },
  3350 + "grid": {
  3351 + "color": "#545454",
  3352 + "tickColor": "#DDDDDD",
  3353 + "verticalLines": true,
  3354 + "horizontalLines": true,
  3355 + "outlineWidth": 1
  3356 + },
  3357 + "stack": false,
  3358 + "tooltipIndividual": false,
  3359 + "defaultBarWidth": 1800000,
  3360 + "barAlignment": "left",
  3361 + "timeForComparison": "months",
  3362 + "xaxisSecond": {
  3363 + "axisPosition": "top",
  3364 + "showLabels": true
  3365 + }
  3366 + },
  3367 + "title": "SMS messages daily activity",
  3368 + "dropShadow": true,
  3369 + "enableFullscreen": true,
  3370 + "titleStyle": {
  3371 + "fontSize": "16px",
  3372 + "fontWeight": 400
  3373 + },
  3374 + "widgetStyle": {},
  3375 + "useDashboardTimewindow": false,
  3376 + "showLegend": true,
  3377 + "actions": {},
  3378 + "displayTimewindow": true,
  3379 + "showTitleIcon": false,
  3380 + "iconColor": "rgba(0, 0, 0, 0.87)",
  3381 + "iconSize": "24px",
  3382 + "titleTooltip": "",
  3383 + "legendConfig": {
  3384 + "direction": "column",
  3385 + "position": "bottom",
  3386 + "sortDataKeys": false,
  3387 + "showMin": false,
  3388 + "showMax": false,
  3389 + "showAvg": false,
  3390 + "showTotal": true
  3391 + }
  3392 + },
  3393 + "row": 0,
  3394 + "col": 0,
  3395 + "id": "7302df65-1b0c-579e-bbdb-145126ae3392"
  3396 + },
  3397 + "fdb385e7-14fe-fc9f-ebdc-b400f26fc66b": {
  3398 + "isSystemType": true,
  3399 + "bundleAlias": "charts",
  3400 + "typeAlias": "timeseries_bars_flot",
  3401 + "type": "timeseries",
  3402 + "title": "New widget",
  3403 + "sizeX": 8,
  3404 + "sizeY": 5,
  3405 + "config": {
  3406 + "datasources": [
  3407 + {
  3408 + "type": "entity",
  3409 + "name": null,
  3410 + "entityAliasId": "40193437-33ac-3172-eefd-0b08eb849062",
  3411 + "filterId": null,
  3412 + "dataKeys": [
  3413 + {
  3414 + "name": "smsCount",
  3415 + "type": "timeseries",
  3416 + "label": "SMS messages",
  3417 + "color": "#f36021",
  3418 + "settings": {
  3419 + "excludeFromStacking": false,
  3420 + "hideDataByDefault": false,
  3421 + "disableDataHiding": false,
  3422 + "removeFromLegend": false,
  3423 + "showLines": false,
  3424 + "fillLines": false,
  3425 + "showPoints": false,
  3426 + "showPointShape": "circle",
  3427 + "pointShapeFormatter": "",
  3428 + "showPointsLineWidth": 5,
  3429 + "showPointsRadius": 3,
  3430 + "showSeparateAxis": false,
  3431 + "axisPosition": "left",
  3432 + "thresholds": [
  3433 + {
  3434 + "thresholdValueSource": "predefinedValue"
  3435 + }
  3436 + ],
  3437 + "comparisonSettings": {
  3438 + "showValuesForComparison": true
  3439 + }
  3440 + },
  3441 + "_hash": 0.0661644137210089,
  3442 + "units": null,
  3443 + "decimals": null,
  3444 + "funcBody": null,
  3445 + "usePostProcessing": null,
  3446 + "postFuncBody": null
  3447 + }
  3448 + ]
  3449 + }
  3450 + ],
  3451 + "timewindow": {
  3452 + "hideInterval": false,
  3453 + "hideAggregation": false,
  3454 + "hideAggInterval": false,
  3455 + "selectedTab": 1,
  3456 + "history": {
  3457 + "historyType": 0,
  3458 + "timewindowMs": 31536000000,
  3459 + "interval": 1000
  3460 + },
  3461 + "aggregation": {
  3462 + "type": "NONE",
  3463 + "limit": 1000
  3464 + }
  3465 + },
  3466 + "showTitle": true,
  3467 + "backgroundColor": "#fff",
  3468 + "color": "rgba(0, 0, 0, 0.87)",
  3469 + "padding": "8px",
  3470 + "settings": {
  3471 + "shadowSize": 4,
  3472 + "fontColor": "#545454",
  3473 + "fontSize": 10,
  3474 + "xaxis": {
  3475 + "showLabels": true,
  3476 + "color": "#545454"
  3477 + },
  3478 + "yaxis": {
  3479 + "showLabels": true,
  3480 + "color": "#545454",
  3481 + "min": 0,
  3482 + "tickDecimals": 0,
  3483 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;"
  3484 + },
  3485 + "grid": {
  3486 + "color": "#545454",
  3487 + "tickColor": "#DDDDDD",
  3488 + "verticalLines": true,
  3489 + "horizontalLines": true,
  3490 + "outlineWidth": 1
  3491 + },
  3492 + "stack": false,
  3493 + "tooltipIndividual": false,
  3494 + "defaultBarWidth": 900000000,
  3495 + "barAlignment": "left",
  3496 + "timeForComparison": "months",
  3497 + "xaxisSecond": {
  3498 + "axisPosition": "top",
  3499 + "showLabels": true
  3500 + }
  3501 + },
  3502 + "title": "SMS messages monthly activity",
  3503 + "dropShadow": true,
  3504 + "enableFullscreen": true,
  3505 + "titleStyle": {
  3506 + "fontSize": "16px",
  3507 + "fontWeight": 400
  3508 + },
  3509 + "widgetStyle": {},
  3510 + "useDashboardTimewindow": false,
  3511 + "showLegend": true,
  3512 + "actions": {},
  3513 + "displayTimewindow": true,
  3514 + "showTitleIcon": false,
  3515 + "iconColor": "rgba(0, 0, 0, 0.87)",
  3516 + "iconSize": "24px",
  3517 + "titleTooltip": "",
  3518 + "legendConfig": {
  3519 + "direction": "column",
  3520 + "position": "bottom",
  3521 + "sortDataKeys": false,
  3522 + "showMin": false,
  3523 + "showMax": false,
  3524 + "showAvg": false,
  3525 + "showTotal": true
  3526 + }
  3527 + },
  3528 + "row": 0,
  3529 + "col": 0,
  3530 + "id": "fdb385e7-14fe-fc9f-ebdc-b400f26fc66b"
  3531 + },
  3532 + "2408ad30-163e-8221-08e1-a82b638be564": {
  3533 + "isSystemType": true,
  3534 + "bundleAlias": "charts",
  3535 + "typeAlias": "basic_timeseries",
  3536 + "type": "timeseries",
  3537 + "title": "New widget",
  3538 + "sizeX": 12,
  3539 + "sizeY": 7,
  3540 + "config": {
  3541 + "datasources": [
  3542 + {
  3543 + "type": "entity",
  3544 + "dataKeys": [
  3545 + {
  3546 + "name": "successfulMsgs",
  3547 + "type": "timeseries",
  3548 + "label": "${entityName} Successful",
  3549 + "color": "#4caf50",
  3550 + "settings": {
  3551 + "excludeFromStacking": false,
  3552 + "hideDataByDefault": false,
  3553 + "disableDataHiding": false,
  3554 + "removeFromLegend": false,
  3555 + "showLines": true,
  3556 + "fillLines": false,
  3557 + "showPoints": false,
  3558 + "showPointShape": "circle",
  3559 + "pointShapeFormatter": "",
  3560 + "showPointsLineWidth": 5,
  3561 + "showPointsRadius": 3,
  3562 + "showSeparateAxis": false,
  3563 + "axisPosition": "left",
  3564 + "thresholds": [
  3565 + {
  3566 + "thresholdValueSource": "predefinedValue"
  3567 + }
  3568 + ],
  3569 + "comparisonSettings": {
  3570 + "showValuesForComparison": true
  3571 + }
  3572 + },
  3573 + "_hash": 0.15490750967648736
  3574 + },
  3575 + {
  3576 + "name": "failedMsgs",
  3577 + "type": "timeseries",
  3578 + "label": "${entityName} Permanent Failures",
  3579 + "color": "#ef5350",
  3580 + "settings": {
  3581 + "excludeFromStacking": false,
  3582 + "hideDataByDefault": false,
  3583 + "disableDataHiding": false,
  3584 + "removeFromLegend": false,
  3585 + "showLines": true,
  3586 + "fillLines": false,
  3587 + "showPoints": false,
  3588 + "showPointShape": "circle",
  3589 + "pointShapeFormatter": "",
  3590 + "showPointsLineWidth": 5,
  3591 + "showPointsRadius": 3,
  3592 + "showSeparateAxis": false,
  3593 + "axisPosition": "left",
  3594 + "thresholds": [
  3595 + {
  3596 + "thresholdValueSource": "predefinedValue"
  3597 + }
  3598 + ],
  3599 + "comparisonSettings": {
  3600 + "showValuesForComparison": true
  3601 + }
  3602 + },
  3603 + "_hash": 0.4186621166514697
  3604 + },
  3605 + {
  3606 + "name": "tmpFailed",
  3607 + "type": "timeseries",
  3608 + "label": "${entityName} Processing Failures",
  3609 + "color": "#ffc107",
  3610 + "settings": {
  3611 + "excludeFromStacking": false,
  3612 + "hideDataByDefault": false,
  3613 + "disableDataHiding": false,
  3614 + "removeFromLegend": false,
  3615 + "showLines": true,
  3616 + "fillLines": false,
  3617 + "showPoints": false,
  3618 + "showPointShape": "circle",
  3619 + "pointShapeFormatter": "",
  3620 + "showPointsLineWidth": 5,
  3621 + "showPointsRadius": 3,
  3622 + "showSeparateAxis": false,
  3623 + "axisPosition": "left",
  3624 + "thresholds": [
  3625 + {
  3626 + "thresholdValueSource": "predefinedValue"
  3627 + }
  3628 + ],
  3629 + "comparisonSettings": {
  3630 + "showValuesForComparison": true
  3631 + }
  3632 + },
  3633 + "_hash": 0.49891007198715376
  3634 + }
  3635 + ],
  3636 + "entityAliasId": "2e4c97b0-257a-a1b9-690c-141d9bf2ec6f"
  3637 + }
  3638 + ],
  3639 + "timewindow": {
  3640 + "hideInterval": false,
  3641 + "hideAggregation": false,
  3642 + "hideAggInterval": false,
  3643 + "selectedTab": 0,
  3644 + "realtime": {
  3645 + "timewindowMs": 3600000,
  3646 + "interval": 1000
  3647 + },
  3648 + "aggregation": {
  3649 + "type": "NONE",
  3650 + "limit": 10000
  3651 + }
  3652 + },
  3653 + "showTitle": true,
  3654 + "backgroundColor": "#fff",
  3655 + "color": "rgba(0, 0, 0, 0.87)",
  3656 + "padding": "8px",
  3657 + "settings": {
  3658 + "shadowSize": 4,
  3659 + "fontColor": "#545454",
  3660 + "fontSize": 10,
  3661 + "xaxis": {
  3662 + "showLabels": true,
  3663 + "color": "#545454"
  3664 + },
  3665 + "yaxis": {
  3666 + "showLabels": true,
  3667 + "color": "#545454",
  3668 + "min": 0,
  3669 + "tickDecimals": 0,
  3670 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;"
  3671 + },
  3672 + "grid": {
  3673 + "color": "#545454",
  3674 + "tickColor": "#DDDDDD",
  3675 + "verticalLines": true,
  3676 + "horizontalLines": true,
  3677 + "outlineWidth": 1
  3678 + },
  3679 + "stack": false,
  3680 + "tooltipIndividual": false,
  3681 + "timeForComparison": "months",
  3682 + "xaxisSecond": {
  3683 + "axisPosition": "top",
  3684 + "showLabels": true
  3685 + }
  3686 + },
  3687 + "title": "Queue Stats",
  3688 + "dropShadow": true,
  3689 + "enableFullscreen": true,
  3690 + "titleStyle": {
  3691 + "fontSize": "16px",
  3692 + "fontWeight": 400
  3693 + },
  3694 + "mobileHeight": null,
  3695 + "showTitleIcon": false,
  3696 + "titleIcon": null,
  3697 + "iconColor": "rgba(0, 0, 0, 0.87)",
  3698 + "iconSize": "24px",
  3699 + "titleTooltip": "",
  3700 + "widgetStyle": {},
  3701 + "useDashboardTimewindow": false,
  3702 + "displayTimewindow": true,
  3703 + "showLegend": true,
  3704 + "actions": {},
  3705 + "legendConfig": {
  3706 + "direction": "column",
  3707 + "position": "bottom",
  3708 + "showMin": true,
  3709 + "showMax": true,
  3710 + "showAvg": false,
  3711 + "showTotal": true
  3712 + }
  3713 + },
  3714 + "id": "2408ad30-163e-8221-08e1-a82b638be564"
  3715 + },
  3716 + "e43dcfe1-b970-6a11-ce0e-5769f3eb5e88": {
  3717 + "isSystemType": true,
  3718 + "bundleAlias": "charts",
  3719 + "typeAlias": "basic_timeseries",
  3720 + "type": "timeseries",
  3721 + "title": "New widget",
  3722 + "sizeX": 12,
  3723 + "sizeY": 7,
  3724 + "config": {
  3725 + "datasources": [
  3726 + {
  3727 + "type": "entity",
  3728 + "dataKeys": [
  3729 + {
  3730 + "name": "timeoutMsgs",
  3731 + "type": "timeseries",
  3732 + "label": "${entityName} Permanent Timeouts",
  3733 + "color": "#4caf50",
  3734 + "settings": {
  3735 + "excludeFromStacking": false,
  3736 + "hideDataByDefault": false,
  3737 + "disableDataHiding": false,
  3738 + "removeFromLegend": false,
  3739 + "showLines": true,
  3740 + "fillLines": false,
  3741 + "showPoints": false,
  3742 + "showPointShape": "circle",
  3743 + "pointShapeFormatter": "",
  3744 + "showPointsLineWidth": 5,
  3745 + "showPointsRadius": 3,
  3746 + "showSeparateAxis": false,
  3747 + "axisPosition": "left",
  3748 + "thresholds": [
  3749 + {
  3750 + "thresholdValueSource": "predefinedValue"
  3751 + }
  3752 + ],
  3753 + "comparisonSettings": {
  3754 + "showValuesForComparison": true
  3755 + }
  3756 + },
  3757 + "_hash": 0.565222981550328
  3758 + },
  3759 + {
  3760 + "name": "tmpTimeout",
  3761 + "type": "timeseries",
  3762 + "label": "${entityName} Processing Timeouts",
  3763 + "color": "#9c27b0",
  3764 + "settings": {
  3765 + "excludeFromStacking": false,
  3766 + "hideDataByDefault": false,
  3767 + "disableDataHiding": false,
  3768 + "removeFromLegend": false,
  3769 + "showLines": true,
  3770 + "fillLines": false,
  3771 + "showPoints": false,
  3772 + "showPointShape": "circle",
  3773 + "pointShapeFormatter": "",
  3774 + "showPointsLineWidth": 5,
  3775 + "showPointsRadius": 3,
  3776 + "showSeparateAxis": false,
  3777 + "axisPosition": "left",
  3778 + "thresholds": [
  3779 + {
  3780 + "thresholdValueSource": "predefinedValue"
  3781 + }
  3782 + ],
  3783 + "comparisonSettings": {
  3784 + "showValuesForComparison": true
  3785 + }
  3786 + },
  3787 + "_hash": 0.2679547062508352
  3788 + }
  3789 + ],
  3790 + "entityAliasId": "2e4c97b0-257a-a1b9-690c-141d9bf2ec6f"
  3791 + }
  3792 + ],
  3793 + "timewindow": {
  3794 + "hideInterval": false,
  3795 + "hideAggregation": false,
  3796 + "hideAggInterval": false,
  3797 + "selectedTab": 0,
  3798 + "realtime": {
  3799 + "timewindowMs": 3600000,
  3800 + "interval": 1000
  3801 + },
  3802 + "aggregation": {
  3803 + "type": "NONE",
  3804 + "limit": 10000
  3805 + }
  3806 + },
  3807 + "showTitle": true,
  3808 + "backgroundColor": "#fff",
  3809 + "color": "rgba(0, 0, 0, 0.87)",
  3810 + "padding": "8px",
  3811 + "settings": {
  3812 + "shadowSize": 4,
  3813 + "fontColor": "#545454",
  3814 + "fontSize": 10,
  3815 + "xaxis": {
  3816 + "showLabels": true,
  3817 + "color": "#545454"
  3818 + },
  3819 + "yaxis": {
  3820 + "showLabels": true,
  3821 + "color": "#545454",
  3822 + "min": 0,
  3823 + "tickDecimals": 0,
  3824 + "ticksFormatter": "var rounder = Math.pow(10, 1);\nvar powers = [\n {key: 'Q', value: Math.pow(10, 15)},\n {key: 'T', value: Math.pow(10, 12)},\n {key: 'B', value: Math.pow(10, 9)},\n {key: 'M', value: Math.pow(10, 6)},\n {key: 'K', value: 1000}\n];\n\nvar key = '';\n\nfor (var i = 0; i < powers.length; i++) {\n var reduced = value / powers[i].value;\n reduced = Math.round(reduced * rounder) / rounder;\n if (reduced >= 1) {\n value = reduced;\n key = powers[i].key;\n break;\n }\n}\nreturn value + key;"
  3825 + },
  3826 + "grid": {
  3827 + "color": "#545454",
  3828 + "tickColor": "#DDDDDD",
  3829 + "verticalLines": true,
  3830 + "horizontalLines": true,
  3831 + "outlineWidth": 1
  3832 + },
  3833 + "stack": false,
  3834 + "tooltipIndividual": false,
  3835 + "timeForComparison": "months",
  3836 + "xaxisSecond": {
  3837 + "axisPosition": "top",
  3838 + "showLabels": true
  3839 + }
  3840 + },
  3841 + "title": "Processing Failures and Timeouts",
  3842 + "dropShadow": true,
  3843 + "enableFullscreen": true,
  3844 + "titleStyle": {
  3845 + "fontSize": "16px",
  3846 + "fontWeight": 400
  3847 + },
  3848 + "mobileHeight": null,
  3849 + "showTitleIcon": false,
  3850 + "titleIcon": null,
  3851 + "iconColor": "rgba(0, 0, 0, 0.87)",
  3852 + "iconSize": "24px",
  3853 + "titleTooltip": "",
  3854 + "widgetStyle": {},
  3855 + "useDashboardTimewindow": false,
  3856 + "displayTimewindow": true,
  3857 + "showLegend": true,
  3858 + "actions": {},
  3859 + "legendConfig": {
  3860 + "direction": "column",
  3861 + "position": "bottom",
  3862 + "showMin": true,
  3863 + "showMax": true,
  3864 + "showAvg": false,
  3865 + "showTotal": true
  3866 + }
  3867 + },
  3868 + "id": "e43dcfe1-b970-6a11-ce0e-5769f3eb5e88"
  3869 + },
  3870 + "a669cf86-e715-efa4-dd9a-b839abf499e9": {
  3871 + "isSystemType": true,
  3872 + "bundleAlias": "cards",
  3873 + "typeAlias": "timeseries_table",
  3874 + "type": "timeseries",
  3875 + "title": "New widget",
  3876 + "sizeX": 24,
  3877 + "sizeY": 5,
  3878 + "config": {
  3879 + "datasources": [
  3880 + {
  3881 + "type": "entity",
  3882 + "dataKeys": [
  3883 + {
  3884 + "name": "ruleEngineException",
  3885 + "type": "timeseries",
  3886 + "label": "Rule Chain",
  3887 + "color": "#2196f3",
  3888 + "settings": {
  3889 + "useCellStyleFunction": false,
  3890 + "useCellContentFunction": true,
  3891 + "cellContentFunction": "return JSON.parse(value).ruleChainName;"
  3892 + },
  3893 + "_hash": 0.9954481282345906
  3894 + },
  3895 + {
  3896 + "name": "ruleEngineException",
  3897 + "type": "timeseries",
  3898 + "label": "Rule Node",
  3899 + "color": "#4caf50",
  3900 + "settings": {
  3901 + "useCellStyleFunction": false,
  3902 + "useCellContentFunction": true,
  3903 + "cellContentFunction": "return JSON.parse(value).ruleNodeName;"
  3904 + },
  3905 + "_hash": 0.18580357036589978
  3906 + },
  3907 + {
  3908 + "name": "ruleEngineException",
  3909 + "type": "timeseries",
  3910 + "label": "Latest Error",
  3911 + "color": "#f44336",
  3912 + "settings": {
  3913 + "useCellStyleFunction": false,
  3914 + "useCellContentFunction": true,
  3915 + "cellContentFunction": "return JSON.parse(value).message;"
  3916 + },
  3917 + "_hash": 0.7255162989552142
  3918 + }
  3919 + ],
  3920 + "entityAliasId": "2e4c97b0-257a-a1b9-690c-141d9bf2ec6f"
  3921 + }
  3922 + ],
  3923 + "timewindow": {
  3924 + "hideInterval": false,
  3925 + "hideAggregation": false,
  3926 + "hideAggInterval": false,
  3927 + "selectedTab": 0,
  3928 + "realtime": {
  3929 + "timewindowMs": 2592000000,
  3930 + "interval": 1000
  3931 + },
  3932 + "aggregation": {
  3933 + "type": "NONE",
  3934 + "limit": 1000
  3935 + }
  3936 + },
  3937 + "showTitle": true,
  3938 + "backgroundColor": "rgb(255, 255, 255)",
  3939 + "color": "rgba(0, 0, 0, 0.87)",
  3940 + "padding": "8px",
  3941 + "settings": {
  3942 + "showTimestamp": true,
  3943 + "displayPagination": true,
  3944 + "defaultPageSize": 10
  3945 + },
  3946 + "title": "Exceptions",
  3947 + "dropShadow": true,
  3948 + "enableFullscreen": true,
  3949 + "titleStyle": {
  3950 + "fontSize": "16px",
  3951 + "fontWeight": 400
  3952 + },
  3953 + "useDashboardTimewindow": false,
  3954 + "showLegend": false,
  3955 + "widgetStyle": {},
  3956 + "actions": {},
  3957 + "showTitleIcon": false,
  3958 + "titleIcon": null,
  3959 + "iconColor": "rgba(0, 0, 0, 0.87)",
  3960 + "iconSize": "24px",
  3961 + "titleTooltip": "",
  3962 + "displayTimewindow": true
  3963 + },
  3964 + "id": "a669cf86-e715-efa4-dd9a-b839abf499e9"
  3965 + }
  3966 + },
  3967 + "states": {
  3968 + "default": {
  3969 + "name": "Api Usage",
  3970 + "root": true,
  3971 + "layouts": {
  3972 + "main": {
  3973 + "widgets": {
  3974 + "fd6df872-2ddf-0921-3929-2e7f55062fad": {
  3975 + "sizeX": 4,
  3976 + "sizeY": 2,
  3977 + "row": 0,
  3978 + "col": 8,
  3979 + "mobileHeight": 3
  3980 + },
  3981 + "7e235874-461b-e7c2-2fdd-d8762a020773": {
  3982 + "sizeX": 4,
  3983 + "sizeY": 2,
  3984 + "row": 0,
  3985 + "col": 12,
  3986 + "mobileHeight": 3
  3987 + },
  3988 + "08545554-a0e8-05c7-66df-6000cfeff8a4": {
  3989 + "sizeX": 4,
  3990 + "sizeY": 2,
  3991 + "row": 0,
  3992 + "col": 4,
  3993 + "mobileHeight": 3
  3994 + },
  3995 + "a245c67e-53ec-d299-fa89-69fe2062ccb2": {
  3996 + "sizeX": 4,
  3997 + "sizeY": 2,
  3998 + "row": 0,
  3999 + "col": 0,
  4000 + "mobileHeight": 3
  4001 + },
  4002 + "a151ae60-0326-6116-d818-9070dda8e9c7": {
  4003 + "sizeX": 4,
  4004 + "sizeY": 2,
  4005 + "row": 0,
  4006 + "col": 16,
  4007 + "mobileHeight": 3
  4008 + },
  4009 + "2503a391-5692-0614-85e6-f179c5ee0dc9": {
  4010 + "sizeX": 4,
  4011 + "sizeY": 2,
  4012 + "row": 0,
  4013 + "col": 20,
  4014 + "mobileHeight": 3
  4015 + },
  4016 + "68e16e98-0420-f72c-4848-41dedffd3904": {
  4017 + "sizeX": 8,
  4018 + "sizeY": 4,
  4019 + "row": 2,
  4020 + "col": 8
  4021 + },
  4022 + "2aa6b499-6e27-b315-6833-89c4d58485ce": {
  4023 + "sizeX": 8,
  4024 + "sizeY": 4,
  4025 + "row": 2,
  4026 + "col": 0
  4027 + },
  4028 + "d890cea3-fba0-6474-9a21-fa780230dc62": {
  4029 + "sizeX": 8,
  4030 + "sizeY": 4,
  4031 + "row": 2,
  4032 + "col": 16
  4033 + },
  4034 + "84b6cfa5-1449-e0f2-3560-f810d2dd7ead": {
  4035 + "sizeX": 8,
  4036 + "sizeY": 4,
  4037 + "row": 6,
  4038 + "col": 0
  4039 + },
  4040 + "d296b566-a000-7402-ae9d-c815381c5435": {
  4041 + "sizeX": 8,
  4042 + "sizeY": 4,
  4043 + "row": 6,
  4044 + "col": 8
  4045 + },
  4046 + "00a02464-9509-911b-3b5e-21fb37629822": {
  4047 + "sizeX": 8,
  4048 + "sizeY": 4,
  4049 + "row": 6,
  4050 + "col": 16
  4051 + }
  4052 + },
  4053 + "gridSettings": {
  4054 + "backgroundColor": "#eeeeee",
  4055 + "color": "rgba(0,0,0,0.870588)",
  4056 + "columns": 24,
  4057 + "margin": 5,
  4058 + "backgroundSizeMode": "100%",
  4059 + "autoFillHeight": true,
  4060 + "backgroundImageUrl": null,
  4061 + "mobileAutoFillHeight": false,
  4062 + "mobileRowHeight": 70
  4063 + }
  4064 + }
  4065 + }
  4066 + },
  4067 + "transport": {
  4068 + "name": "Transport",
  4069 + "root": false,
  4070 + "layouts": {
  4071 + "main": {
  4072 + "widgets": {
  4073 + "98bae68b-0f35-72f2-a428-9b06889f1554": {
  4074 + "sizeX": 24,
  4075 + "sizeY": 6,
  4076 + "row": 0,
  4077 + "col": 0
  4078 + },
  4079 + "e61e5477-5a09-cc25-966b-f613d81da833": {
  4080 + "sizeX": 24,
  4081 + "sizeY": 6,
  4082 + "row": 6,
  4083 + "col": 0
  4084 + }
  4085 + },
  4086 + "gridSettings": {
  4087 + "backgroundColor": "#eeeeee",
  4088 + "color": "rgba(0,0,0,0.870588)",
  4089 + "columns": 24,
  4090 + "margin": 10,
  4091 + "backgroundSizeMode": "100%",
  4092 + "autoFillHeight": true,
  4093 + "backgroundImageUrl": null,
  4094 + "mobileAutoFillHeight": false,
  4095 + "mobileRowHeight": 70
  4096 + }
  4097 + }
  4098 + }
  4099 + },
  4100 + "rule_engine_execution": {
  4101 + "name": "Rule Engine execution",
  4102 + "root": false,
  4103 + "layouts": {
  4104 + "main": {
  4105 + "widgets": {
  4106 + "74199074-7873-6c6a-2a51-3fc614769f03": {
  4107 + "sizeX": 24,
  4108 + "sizeY": 6,
  4109 + "row": 0,
  4110 + "col": 0
  4111 + },
  4112 + "00006bc3-8a8d-b55e-ed39-e318f1bcd090": {
  4113 + "sizeX": 24,
  4114 + "sizeY": 6,
  4115 + "row": 6,
  4116 + "col": 0
  4117 + }
  4118 + },
  4119 + "gridSettings": {
  4120 + "backgroundColor": "#eeeeee",
  4121 + "color": "rgba(0,0,0,0.870588)",
  4122 + "columns": 24,
  4123 + "margin": 10,
  4124 + "backgroundSizeMode": "100%",
  4125 + "autoFillHeight": true,
  4126 + "backgroundImageUrl": null,
  4127 + "mobileAutoFillHeight": false,
  4128 + "mobileRowHeight": 70
  4129 + }
  4130 + }
  4131 + }
  4132 + },
  4133 + "javascript_functions": {
  4134 + "name": "JavaScript functions",
  4135 + "root": false,
  4136 + "layouts": {
  4137 + "main": {
  4138 + "widgets": {
  4139 + "5f5ca59c-e507-5301-5910-7ad8cd34df40": {
  4140 + "sizeX": 24,
  4141 + "sizeY": 6,
  4142 + "row": 0,
  4143 + "col": 0
  4144 + },
  4145 + "ada32ee9-44ed-48d1-c368-fd0c94b7607f": {
  4146 + "sizeX": 24,
  4147 + "sizeY": 6,
  4148 + "row": 6,
  4149 + "col": 0
  4150 + }
  4151 + },
  4152 + "gridSettings": {
  4153 + "backgroundColor": "#eeeeee",
  4154 + "color": "rgba(0,0,0,0.870588)",
  4155 + "columns": 24,
  4156 + "margin": 10,
  4157 + "backgroundSizeMode": "100%",
  4158 + "autoFillHeight": true,
  4159 + "backgroundImageUrl": null,
  4160 + "mobileAutoFillHeight": false,
  4161 + "mobileRowHeight": 70
  4162 + }
  4163 + }
  4164 + }
  4165 + },
  4166 + "telemetry_persistence": {
  4167 + "name": "Telemetry persistence",
  4168 + "root": false,
  4169 + "layouts": {
  4170 + "main": {
  4171 + "widgets": {
  4172 + "85fe0738-5326-f069-ab3f-30594bde5fed": {
  4173 + "sizeX": 24,
  4174 + "sizeY": 6,
  4175 + "row": 0,
  4176 + "col": 0
  4177 + },
  4178 + "eaeb381a-437e-f6e9-60c9-6bc8826fdd44": {
  4179 + "sizeX": 24,
  4180 + "sizeY": 6,
  4181 + "row": 6,
  4182 + "col": 0
  4183 + }
  4184 + },
  4185 + "gridSettings": {
  4186 + "backgroundColor": "#eeeeee",
  4187 + "color": "rgba(0,0,0,0.870588)",
  4188 + "columns": 24,
  4189 + "margin": 10,
  4190 + "backgroundSizeMode": "100%",
  4191 + "autoFillHeight": true,
  4192 + "backgroundImageUrl": null,
  4193 + "mobileAutoFillHeight": false,
  4194 + "mobileRowHeight": 70
  4195 + }
  4196 + }
  4197 + }
  4198 + },
  4199 + "email_messages": {
  4200 + "name": "Email messages",
  4201 + "root": false,
  4202 + "layouts": {
  4203 + "main": {
  4204 + "widgets": {
  4205 + "4b798823-b97d-9d6a-59dc-fcafd897fc23": {
  4206 + "sizeX": 24,
  4207 + "sizeY": 6,
  4208 + "row": 0,
  4209 + "col": 0
  4210 + },
  4211 + "6a981580-7490-19dd-f937-b64cbf67a982": {
  4212 + "sizeX": 24,
  4213 + "sizeY": 6,
  4214 + "row": 6,
  4215 + "col": 0
  4216 + }
  4217 + },
  4218 + "gridSettings": {
  4219 + "backgroundColor": "#eeeeee",
  4220 + "color": "rgba(0,0,0,0.870588)",
  4221 + "columns": 24,
  4222 + "margin": 10,
  4223 + "backgroundSizeMode": "100%",
  4224 + "autoFillHeight": true,
  4225 + "backgroundImageUrl": null,
  4226 + "mobileAutoFillHeight": false,
  4227 + "mobileRowHeight": 70
  4228 + }
  4229 + }
  4230 + }
  4231 + },
  4232 + "sms_messages": {
  4233 + "name": "SMS messages",
  4234 + "root": false,
  4235 + "layouts": {
  4236 + "main": {
  4237 + "widgets": {
  4238 + "7302df65-1b0c-579e-bbdb-145126ae3392": {
  4239 + "sizeX": 24,
  4240 + "sizeY": 6,
  4241 + "row": 0,
  4242 + "col": 0
  4243 + },
  4244 + "fdb385e7-14fe-fc9f-ebdc-b400f26fc66b": {
  4245 + "sizeX": 24,
  4246 + "sizeY": 6,
  4247 + "row": 6,
  4248 + "col": 0
  4249 + }
  4250 + },
  4251 + "gridSettings": {
  4252 + "backgroundColor": "#eeeeee",
  4253 + "color": "rgba(0,0,0,0.870588)",
  4254 + "columns": 24,
  4255 + "margin": 10,
  4256 + "backgroundSizeMode": "100%",
  4257 + "autoFillHeight": true,
  4258 + "backgroundImageUrl": null,
  4259 + "mobileAutoFillHeight": false,
  4260 + "mobileRowHeight": 70
  4261 + }
  4262 + }
  4263 + }
  4264 + },
  4265 + "rule_engine_statistics": {
  4266 + "name": "Rule Engine Statistics",
  4267 + "root": false,
  4268 + "layouts": {
  4269 + "main": {
  4270 + "widgets": {
  4271 + "2408ad30-163e-8221-08e1-a82b638be564": {
  4272 + "sizeX": 12,
  4273 + "sizeY": 7,
  4274 + "mobileHeight": null,
  4275 + "row": 0,
  4276 + "col": 0
  4277 + },
  4278 + "e43dcfe1-b970-6a11-ce0e-5769f3eb5e88": {
  4279 + "sizeX": 12,
  4280 + "sizeY": 7,
  4281 + "mobileHeight": null,
  4282 + "row": 0,
  4283 + "col": 12
  4284 + },
  4285 + "a669cf86-e715-efa4-dd9a-b839abf499e9": {
  4286 + "sizeX": 24,
  4287 + "sizeY": 5,
  4288 + "row": 7,
  4289 + "col": 0
  4290 + }
  4291 + },
  4292 + "gridSettings": {
  4293 + "backgroundColor": "#eeeeee",
  4294 + "color": "rgba(0,0,0,0.870588)",
  4295 + "columns": 24,
  4296 + "margin": 10,
  4297 + "backgroundSizeMode": "100%",
  4298 + "autoFillHeight": true,
  4299 + "backgroundImageUrl": null,
  4300 + "mobileAutoFillHeight": false,
  4301 + "mobileRowHeight": 70
  4302 + }
  4303 + }
  4304 + }
  4305 + }
  4306 + },
  4307 + "entityAliases": {
  4308 + "40193437-33ac-3172-eefd-0b08eb849062": {
  4309 + "id": "40193437-33ac-3172-eefd-0b08eb849062",
  4310 + "alias": "Api usage state",
  4311 + "filter": {
  4312 + "type": "apiUsageState",
  4313 + "resolveMultiple": false
  4314 + }
  4315 + },
  4316 + "2e4c97b0-257a-a1b9-690c-141d9bf2ec6f": {
  4317 + "id": "2e4c97b0-257a-a1b9-690c-141d9bf2ec6f",
  4318 + "alias": "TbServiceQueues",
  4319 + "filter": {
  4320 + "type": "assetType",
  4321 + "resolveMultiple": true,
  4322 + "assetType": "TbServiceQueue",
  4323 + "assetNameFilter": ""
  4324 + }
  4325 + }
  4326 + },
  4327 + "filters": {},
  4328 + "timewindow": {
  4329 + "hideInterval": false,
  4330 + "hideAggregation": false,
  4331 + "hideAggInterval": false,
  4332 + "selectedTab": 0,
  4333 + "realtime": {
  4334 + "timewindowMs": 86400000,
  4335 + "interval": 3600000
  4336 + },
  4337 + "aggregation": {
  4338 + "type": "NONE",
  4339 + "limit": 50000
  4340 + }
  4341 + },
  4342 + "settings": {
  4343 + "stateControllerId": "entity",
  4344 + "showTitle": false,
  4345 + "showDashboardsSelect": false,
  4346 + "showEntitiesSelect": false,
  4347 + "showDashboardTimewindow": false,
  4348 + "showDashboardExport": false,
  4349 + "toolbarAlwaysOpen": true,
  4350 + "titleColor": "rgba(0,0,0,0.870588)",
  4351 + "showFilters": false
  4352 + }
  4353 + },
  4354 + "name": "Api Usage"
  4355 +}
@@ -196,7 +196,7 @@ @@ -196,7 +196,7 @@
196 matTooltipPosition="above"> 196 matTooltipPosition="above">
197 <mat-icon>done</mat-icon> 197 <mat-icon>done</mat-icon>
198 </button> 198 </button>
199 - <button *ngIf="(isTenantAdmin() || isSystemAdmin()) && !forceFullscreen" 199 + <button *ngIf="(isTenantAdmin() || isSystemAdmin()) && !forceFullscreen && !embedded"
200 mat-fab color="accent" class="tb-btn-footer" 200 mat-fab color="accent" class="tb-btn-footer"
201 [ngClass]="{'tb-hide': isAddingWidget || (isLoading$ | async)}" 201 [ngClass]="{'tb-hide': isAddingWidget || (isLoading$ | async)}"
202 [disabled]="isLoading$ | async" 202 [disabled]="isLoading$ | async"
@@ -14,7 +14,17 @@ @@ -14,7 +14,17 @@
14 /// limitations under the License. 14 /// limitations under the License.
15 /// 15 ///
16 16
17 -import { ChangeDetectorRef, Component, Inject, NgZone, OnDestroy, ViewChild, ViewEncapsulation } from '@angular/core'; 17 +import {
  18 + ChangeDetectorRef,
  19 + Component,
  20 + Inject,
  21 + Input,
  22 + NgZone,
  23 + OnDestroy,
  24 + OnInit,
  25 + ViewChild,
  26 + ViewEncapsulation
  27 +} from '@angular/core';
18 import { PageComponent } from '@shared/components/page.component'; 28 import { PageComponent } from '@shared/components/page.component';
19 import { Store } from '@ngrx/store'; 29 import { Store } from '@ngrx/store';
20 import { AppState } from '@core/core.state'; 30 import { AppState } from '@core/core.state';
@@ -98,12 +108,16 @@ import { Filters } from '@shared/models/query/query.models'; @@ -98,12 +108,16 @@ import { Filters } from '@shared/models/query/query.models';
98 encapsulation: ViewEncapsulation.None, 108 encapsulation: ViewEncapsulation.None,
99 // changeDetection: ChangeDetectionStrategy.OnPush 109 // changeDetection: ChangeDetectionStrategy.OnPush
100 }) 110 })
101 -export class DashboardPageComponent extends PageComponent implements IDashboardController, OnDestroy { 111 +export class DashboardPageComponent extends PageComponent implements IDashboardController, OnInit, OnDestroy {
102 112
103 authState: AuthState = getCurrentAuthState(this.store); 113 authState: AuthState = getCurrentAuthState(this.store);
104 114
105 authUser: AuthUser = this.authState.authUser; 115 authUser: AuthUser = this.authState.authUser;
106 116
  117 + @Input()
  118 + embedded = false;
  119 +
  120 + @Input()
107 dashboard: Dashboard; 121 dashboard: Dashboard;
108 dashboardConfiguration: DashboardConfiguration; 122 dashboardConfiguration: DashboardConfiguration;
109 123
@@ -239,19 +253,26 @@ export class DashboardPageComponent extends PageComponent implements IDashboardC @@ -239,19 +253,26 @@ export class DashboardPageComponent extends PageComponent implements IDashboardC
239 private cd: ChangeDetectorRef) { 253 private cd: ChangeDetectorRef) {
240 super(store); 254 super(store);
241 255
  256 + }
  257 +
  258 + ngOnInit() {
242 this.rxSubscriptions.push(this.route.data.subscribe( 259 this.rxSubscriptions.push(this.route.data.subscribe(
243 (data) => { 260 (data) => {
  261 + if (this.embedded) {
  262 + data.dashboard = this.dashboard;
  263 + data.widgetEditMode = false;
  264 + data.singlePageMode = false;
  265 + }
244 this.init(data); 266 this.init(data);
245 this.runChangeDetection(); 267 this.runChangeDetection();
246 } 268 }
247 )); 269 ));
248 -  
249 this.rxSubscriptions.push(this.breakpointObserver 270 this.rxSubscriptions.push(this.breakpointObserver
250 .observe(MediaBreakpoints['gt-sm']) 271 .observe(MediaBreakpoints['gt-sm'])
251 .subscribe((state: BreakpointState) => { 272 .subscribe((state: BreakpointState) => {
252 - this.isMobile = !state.matches; 273 + this.isMobile = !state.matches;
253 } 274 }
254 - )); 275 + ));
255 } 276 }
256 277
257 private init(data: any) { 278 private init(data: any) {