{
"org.thingsboard.server.dao.rule.BaseRuleChainService.lambda$getRuleChainNodes$0": {
"[{\"SYS_TENANT_ID\":{\"SYS_TENANT_ID\":{\"r\":\"@org.thingsboard.server.common.data.id.TenantId\"},\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},{\"log\":{\"r\":\"@ch.qos.logback.classic.Logger\"},\"serialVersionUID\":\"2807343040519543363\",\"CONTAINS_TYPE\":\"Contains\",\"MANAGES_TYPE\":\"Manages\",\"from\":{\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},\"to\":{\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},\"type\":\"Contains\",\"typeGroup\":\"RULE_CHAIN\",\"additionalInfoBytes\":[\"110\",\"117\",\"108\",\"108\"]}]": 2
},
"org.thingsboard.server.dao.relation.BaseRelationService.saveRelation": {
"[{\"SYS_TENANT_ID\":{\"SYS_TENANT_ID\":{\"r\":\"@org.thingsboard.server.common.data.id.TenantId\"},\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},{\"log\":{\"r\":\"@ch.qos.logback.classic.Logger\"},\"serialVersionUID\":\"2807343040519543363\",\"CONTAINS_TYPE\":\"Contains\",\"MANAGES_TYPE\":\"Manages\",\"from\":{\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},\"to\":{\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},\"type\":\"Contains\",\"typeGroup\":\"RULE_CHAIN\"}]": 9
},
"org.thingsboard.server.dao.util.mapping.JacksonUtil.fromString": {
"[\"{\\\"description\\\":\\\"Demo device that is used in Raspberry Pi GPIO control sample application\\\"}\",{\"r\":\"@java.lang.Class\"}]": 3,
"[\"{\\\"type\\\":\\\"rpc\\\",\\\"sizeX\\\":4,\\\"sizeY\\\":2,\\\"resources\\\":[],\\\"templateHtml\\\":\\\"\\u003cfieldset class\\u003d\\\\\\\"gpio-panel\\\\\\\" ng-disabled\\u003d\\\\\\\"!rpcEnabled || executingRpcRequest\\\\\\\" style\\u003d\\\\\\\"height: 100%;\\\\\\\"\\u003e\\\\n \\u003csection class\\u003d\\\\\\\"gpio-row\\\\\\\" layout\\u003d\\\\\\\"row\\\\\\\" ng-repeat\\u003d\\\\\\\"row in rows track by $index\\\\\\\" \\\\n ng-style\\u003d\\\\\\\"{\\u0027height\\u0027: prefferedRowHeight+\\u0027px\\u0027}\\\\\\\"\\u003e\\\\n \\u003csection flex layout\\u003d\\\\\\\"row\\\\\\\" ng-repeat\\u003d\\\\\\\"cell in row track by $index\\\\\\\"\\u003e\\\\n \\u003csection layout\\u003d\\\\\\\"row\\\\\\\" flex ng-if\\u003d\\\\\\\"cell\\\\\\\" layout-align\\u003d\\\\\\\"{{$index\\u003d\\u003d\\u003d0 ? \\u0027end center\\u0027 : \\u0027start center\\u0027}}\\\\\\\"\\u003e\\\\n \\u003cspan class\\u003d\\\\\\\"gpio-left-label\\\\\\\" ng-show\\u003d\\\\\\\"$index\\u003d\\u003d\\u003d0\\\\\\\"\\u003e{{ cell.label }}\\u003c/span\\u003e\\\\n \\u003csection layout\\u003d\\\\\\\"row\\\\\\\" class\\u003d\\\\\\\"switch-panel\\\\\\\" layout-align\\u003d\\\\\\\"start center\\\\\\\" ng-class\\u003d\\\\\\\"$index\\u003d\\u003d\\u003d0 ? \\u0027col-0\\u0027 : \\u0027col-1\\u0027\\\\\\\"\\\\n ng-style\\u003d\\\\\\\"{\\u0027height\\u0027: prefferedRowHeight+\\u0027px\\u0027, \\u0027backgroundColor\\u0027: \\u0027{{ switchPanelBackgroundColor }}\\u0027}\\\\\\\"\\u003e\\\\n \\u003cspan class\\u003d\\\\\\\"pin\\\\\\\" ng-show\\u003d\\\\\\\"$index\\u003d\\u003d\\u003d0\\\\\\\"\\u003e{{cell.pin}}\\u003c/span\\u003e\\\\n \\u003cspan flex ng-show\\u003d\\\\\\\"$index\\u003d\\u003d\\u003d1\\\\\\\"\\u003e\\u003c/span\\u003e\\\\n \\u003cmd-switch\\\\n aria-label\\u003d\\\\\\\"{{ cell.label }}\\\\\\\"\\\\n ng-disabled\\u003d\\\\\\\"!rpcEnabled || executingRpcRequest\\\\\\\"\\\\n ng-model\\u003d\\\\\\\"cell.enabled\\\\\\\" \\\\n ng-change\\u003d\\\\\\\"cell.enabled \\u003d !cell.enabled\\\\\\\" \\\\n ng-click\\u003d\\\\\\\"gpioClick($event, cell)\\\\\\\"\\u003e\\\\n \\u003c/md-switch\\u003e\\\\n \\u003cspan flex ng-show\\u003d\\\\\\\"$index\\u003d\\u003d\\u003d0\\\\\\\"\\u003e\\u003c/span\\u003e\\\\n \\u003cspan class\\u003d\\\\\\\"pin\\\\\\\" ng-show\\u003d\\\\\\\"$index\\u003d\\u003d\\u003d1\\\\\\\"\\u003e{{cell.pin}}\\u003c/span\\u003e\\\\n \\u003c/section\\u003e\\\\n \\u003cspan class\\u003d\\\\\\\"gpio-right-label\\\\\\\" ng-show\\u003d\\\\\\\"$index\\u003d\\u003d\\u003d1\\\\\\\"\\u003e{{ cell.label }}\\u003c/span\\u003e\\\\n \\u003c/section\\u003e\\\\n \\u003csection layout\\u003d\\\\\\\"row\\\\\\\" flex ng-if\\u003d\\\\\\\"!cell\\\\\\\"\\u003e\\\\n \\u003cspan flex ng-show\\u003d\\\\\\\"$index\\u003d\\u003d\\u003d0\\\\\\\"\\u003e\\u003c/span\\u003e\\\\n \\u003cspan class\\u003d\\\\\\\"switch-panel\\\\\\\"\\\\n ng-style\\u003d\\\\\\\"{\\u0027height\\u0027: prefferedRowHeight+\\u0027px\\u0027, \\u0027backgroundColor\\u0027: \\u0027{{ switchPanelBackgroundColor }}\\u0027}\\\\\\\"\\u003e\\u003c/span\\u003e\\\\n \\u003cspan flex ng-show\\u003d\\\\\\\"$index\\u003d\\u003d\\u003d1\\\\\\\"\\u003e\\u003c/span\\u003e\\\\n \\u003c/section\\u003e\\\\n \\u003c/section\\u003e\\\\n \\u003c/section\\u003e \\\\n \\u003cspan class\\u003d\\\\\\\"error\\\\\\\" style\\u003d\\\\\\\"position: absolute; bottom: 5px;\\\\\\\" ng-show\\u003d\\\\\\\"rpcErrorText\\\\\\\"\\u003e{{rpcErrorText}}\\u003c/span\\u003e\\\\n \\u003cmd-progress-linear ng-show\\u003d\\\\\\\"executingRpcRequest\\\\\\\" style\\u003d\\\\\\\"position: absolute; bottom: 0;\\\\\\\" md-mode\\u003d\\\\\\\"indeterminate\\\\\\\"\\u003e\\u003c/md-progress-linear\\u003e \\\\n\\u003c/fieldset\\u003e\\\",\\\"templateCss\\\":\\\".error {\\\\n font-size: 14px !important;\\\\n color: maroon;/*rgb(250,250,250);*/\\\\n background-color: transparent;\\\\n padding: 6px;\\\\n}\\\\n\\\\n.error span {\\\\n margin: auto;\\\\n}\\\\n\\\\n.gpio-panel {\\\\n padding-top: 10px;\\\\n white-space: nowrap;\\\\n}\\\\n\\\\n.switch-panel {\\\\n margin: 0;\\\\n height: 32px;\\\\n width: 66px;\\\\n min-width: 66px;\\\\n}\\\\n\\\\n.switch-panel md-switch {\\\\n margin: 0;\\\\n width: 36px;\\\\n min-width: 36px;\\\\n}\\\\n\\\\n.switch-panel md-switch \\u003e div.md-container {\\\\n margin: 0;\\\\n}\\\\n\\\\n.switch-panel.col-0 md-switch {\\\\n padding-left: 8px;\\\\n padding-right: 4px;\\\\n}\\\\n\\\\n.switch-panel.col-1 md-switch {\\\\n padding-left: 4px;\\\\n padding-right: 8px;\\\\n}\\\\n\\\\n.gpio-row {\\\\n height: 32px;\\\\n}\\\\n\\\\n.pin {\\\\n margin-top: auto;\\\\n margin-bottom: auto;\\\\n color: white;\\\\n font-size: 12px;\\\\n width: 16px;\\\\n min-width: 16px;\\\\n}\\\\n\\\\n.switch-panel.col-0 .pin {\\\\n margin-left: auto;\\\\n padding-left: 2px;\\\\n text-align: right;\\\\n}\\\\n\\\\n.switch-panel.col-1 .pin {\\\\n margin-right: auto;\\\\n \\\\n text-align: left;\\\\n}\\\\n\\\\n.gpio-left-label {\\\\n margin-right: 8px;\\\\n}\\\\n\\\\n.gpio-right-label {\\\\n margin-left: 8px;\\\\n}\\\",\\\"controllerScript\\\":\\\"self.onInit \\u003d function() {\\\\n \\\\n var i, gpio;\\\\n var scope \\u003d self.ctx.$scope;\\\\n var settings \\u003d self.ctx.settings;\\\\n scope.gpioList \\u003d [];\\\\n for (var g \\u003d 0; g \\u003c settings.gpioList.length; g++) {\\\\n gpio \\u003d settings.gpioList[g];\\\\n scope.gpioList.push(\\\\n {\\\\n row: gpio.row,\\\\n col: gpio.col,\\\\n pin: gpio.pin,\\\\n label: gpio.label,\\\\n enabled: false\\\\n }\\\\n );\\\\n }\\\\n\\\\n scope.requestTimeout \\u003d settings.requestTimeout || 1000;\\\\n\\\\n scope.switchPanelBackgroundColor \\u003d settings.switchPanelBackgroundColor || tinycolor(\\u0027green\\u0027).lighten(2).toRgbString();\\\\n\\\\n scope.gpioStatusRequest \\u003d {\\\\n method: \\\\\\\"getGpioStatus\\\\\\\",\\\\n paramsBody: \\\\\\\"{}\\\\\\\"\\\\n };\\\\n \\\\n if (settings.gpioStatusRequest) {\\\\n scope.gpioStatusRequest.method \\u003d settings.gpioStatusRequest.method || scope.gpioStatusRequest.method;\\\\n scope.gpioStatusRequest.paramsBody \\u003d settings.gpioStatusRequest.paramsBody || scope.gpioStatusRequest.paramsBody;\\\\n }\\\\n \\\\n scope.gpioStatusChangeRequest \\u003d {\\\\n method: \\\\\\\"setGpioStatus\\\\\\\",\\\\n paramsBody: \\\\\\\"{\\\\\\\\n \\\\\\\\\\\\\\\"pin\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"{$pin}\\\\\\\\\\\\\\\",\\\\\\\\n \\\\\\\\\\\\\\\"enabled\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"{$enabled}\\\\\\\\\\\\\\\"\\\\\\\\n}\\\\\\\"\\\\n };\\\\n \\\\n if (settings.gpioStatusChangeRequest) {\\\\n scope.gpioStatusChangeRequest.method \\u003d settings.gpioStatusChangeRequest.method || scope.gpioStatusChangeRequest.method;\\\\n scope.gpioStatusChangeRequest.paramsBody \\u003d settings.gpioStatusChangeRequest.paramsBody || scope.gpioStatusChangeRequest.paramsBody;\\\\n }\\\\n \\\\n scope.parseGpioStatusFunction \\u003d \\\\\\\"return body[pin] \\u003d\\u003d\\u003d true;\\\\\\\";\\\\n \\\\n if (settings.parseGpioStatusFunction \\u0026\\u0026 settings.parseGpioStatusFunction.length \\u003e 0) {\\\\n scope.parseGpioStatusFunction \\u003d settings.parseGpioStatusFunction;\\\\n }\\\\n \\\\n scope.parseGpioStatusFunction \\u003d new Function(\\\\\\\"body, pin\\\\\\\", scope.parseGpioStatusFunction);\\\\n \\\\n function requestGpioStatus() {\\\\n self.ctx.controlApi.sendTwoWayCommand(scope.gpioStatusRequest.method, \\\\n scope.gpioStatusRequest.paramsBody, \\\\n scope.requestTimeout)\\\\n .then(\\\\n function success(responseBody) {\\\\n for (var g \\u003d 0; g \\u003c scope.gpioList.length; g++) {\\\\n var gpio \\u003d scope.gpioList[g];\\\\n var enabled \\u003d scope.parseGpioStatusFunction.apply(this, [responseBody, gpio.pin]);\\\\n gpio.enabled \\u003d enabled; \\\\n }\\\\n }\\\\n );\\\\n }\\\\n \\\\n function changeGpioStatus(gpio) {\\\\n var pin \\u003d gpio.pin + \\u0027\\u0027;\\\\n var enabled \\u003d !gpio.enabled;\\\\n enabled \\u003d enabled \\u003d\\u003d\\u003d true ? \\u0027true\\u0027 : \\u0027false\\u0027;\\\\n var paramsBody \\u003d scope.gpioStatusChangeRequest.paramsBody;\\\\n var requestBody \\u003d JSON.parse(paramsBody.replace(\\\\\\\"\\\\\\\\\\\\\\\"{$pin}\\\\\\\\\\\\\\\"\\\\\\\", pin).replace(\\\\\\\"\\\\\\\\\\\\\\\"{$enabled}\\\\\\\\\\\\\\\"\\\\\\\", enabled));\\\\n self.ctx.controlApi.sendTwoWayCommand(scope.gpioStatusChangeRequest.method, \\\\n requestBody, scope.requestTimeout)\\\\n .then(\\\\n function success(responseBody) {\\\\n var enabled \\u003d scope.parseGpioStatusFunction.apply(this, [responseBody, gpio.pin]);\\\\n gpio.enabled \\u003d enabled;\\\\n }\\\\n );\\\\n }\\\\n \\\\n scope.gpioCells \\u003d {};\\\\n var rowCount \\u003d 0;\\\\n for (i \\u003d 0; i \\u003c scope.gpioList.length; i++) {\\\\n gpio \\u003d scope.gpioList[i];\\\\n scope.gpioCells[gpio.row+\\u0027_\\u0027+gpio.col] \\u003d gpio;\\\\n rowCount \\u003d Math.max(rowCount, gpio.row+1);\\\\n }\\\\n \\\\n scope.prefferedRowHeight \\u003d 32;\\\\n scope.rows \\u003d [];\\\\n for (i \\u003d 0; i \\u003c rowCount; i++) {\\\\n var row \\u003d [];\\\\n for (var c \\u003d0; c\\u003c2;c++) {\\\\n if (scope.gpioCells[i+\\u0027_\\u0027+c]) {\\\\n row[c] \\u003d scope.gpioCells[i+\\u0027_\\u0027+c];\\\\n } else {\\\\n row[c] \\u003d null;\\\\n }\\\\n }\\\\n scope.rows.push(row);\\\\n }\\\\n\\\\n scope.gpioClick \\u003d function($event, gpio) {\\\\n changeGpioStatus(gpio);\\\\n };\\\\n\\\\n requestGpioStatus(); \\\\n \\\\n self.onResize();\\\\n}\\\\n\\\\nself.onResize \\u003d function() {\\\\n var scope \\u003d self.ctx.$scope;\\\\n var rowCount \\u003d scope.rows.length;\\\\n var prefferedRowHeight \\u003d (self.ctx.height - 35)/rowCount;\\\\n prefferedRowHeight \\u003d Math.min(32, prefferedRowHeight);\\\\n prefferedRowHeight \\u003d Math.max(12, prefferedRowHeight);\\\\n scope.prefferedRowHeight \\u003d prefferedRowHeight;\\\\n var ratio \\u003d prefferedRowHeight/32;\\\\n var switches \\u003d $(\\u0027md-switch\\u0027, self.ctx.$container);\\\\n switches.css(\\u0027height\\u0027, 30*ratio+\\u0027px\\u0027);\\\\n switches.css(\\u0027width\\u0027, 36*ratio+\\u0027px\\u0027);\\\\n switches.css(\\u0027min-width\\u0027, 36*ratio+\\u0027px\\u0027);\\\\n $(\\u0027.md-container\\u0027, switches).css(\\u0027height\\u0027, 24*ratio+\\u0027px\\u0027);\\\\n $(\\u0027.md-container\\u0027, switches).css(\\u0027width\\u0027, 36*ratio+\\u0027px\\u0027);\\\\n var bars \\u003d $(\\u0027.md-bar\\u0027, self.ctx.$container);\\\\n bars.css(\\u0027height\\u0027, 14*ratio+\\u0027px\\u0027);\\\\n bars.css(\\u0027width\\u0027, 34*ratio+\\u0027px\\u0027);\\\\n var thumbs \\u003d $(\\u0027.md-thumb\\u0027, self.ctx.$container);\\\\n thumbs.css(\\u0027height\\u0027, 20*ratio+\\u0027px\\u0027);\\\\n thumbs.css(\\u0027width\\u0027, 20*ratio+\\u0027px\\u0027);\\\\n \\\\n var leftLabels \\u003d $(\\u0027.gpio-left-label\\u0027, self.ctx.$container);\\\\n leftLabels.css(\\u0027font-size\\u0027, 16*ratio+\\u0027px\\u0027);\\\\n var rightLabels \\u003d $(\\u0027.gpio-right-label\\u0027, self.ctx.$container);\\\\n rightLabels.css(\\u0027font-size\\u0027, 16*ratio+\\u0027px\\u0027);\\\\n var pins \\u003d $(\\u0027.pin\\u0027, self.ctx.$container);\\\\n var pinsFontSize \\u003d Math.max(9, 12*ratio);\\\\n pins.css(\\u0027font-size\\u0027, pinsFontSize+\\u0027px\\u0027); \\\\n}\\\\n\\\\nself.onDestroy \\u003d function() {\\\\n}\\\\n\\\",\\\"settingsSchema\\\":\\\"{\\\\n \\\\\\\"schema\\\\\\\": {\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"object\\\\\\\",\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Settings\\\\\\\",\\\\n \\\\\\\"properties\\\\\\\": {\\\\n \\\\\\\"gpioList\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Gpio switches\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"array\\\\\\\",\\\\n \\\\\\\"minItems\\\\\\\" : 1,\\\\n \\\\\\\"items\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Gpio switch\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"object\\\\\\\",\\\\n \\\\\\\"properties\\\\\\\": {\\\\n \\\\\\\"pin\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Pin\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"number\\\\\\\"\\\\n },\\\\n \\\\\\\"label\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Label\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"string\\\\\\\"\\\\n },\\\\n \\\\\\\"row\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Row\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"number\\\\\\\"\\\\n },\\\\n \\\\\\\"col\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Column\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"number\\\\\\\"\\\\n }\\\\n },\\\\n \\\\\\\"required\\\\\\\": [\\\\\\\"pin\\\\\\\", \\\\\\\"label\\\\\\\", \\\\\\\"row\\\\\\\", \\\\\\\"col\\\\\\\"]\\\\n }\\\\n },\\\\n \\\\\\\"requestTimeout\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"RPC request timeout\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"number\\\\\\\",\\\\n \\\\\\\"default\\\\\\\": 500\\\\n },\\\\n \\\\\\\"switchPanelBackgroundColor\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Switches panel background color\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"string\\\\\\\",\\\\n \\\\\\\"default\\\\\\\": \\\\\\\"#008a00\\\\\\\"\\\\n },\\\\n \\\\\\\"gpioStatusRequest\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"GPIO status request\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"object\\\\\\\",\\\\n \\\\\\\"properties\\\\\\\": {\\\\n \\\\\\\"method\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Method name\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"string\\\\\\\",\\\\n \\\\\\\"default\\\\\\\": \\\\\\\"getGpioStatus\\\\\\\"\\\\n },\\\\n \\\\\\\"paramsBody\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Method body\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"string\\\\\\\",\\\\n \\\\\\\"default\\\\\\\": \\\\\\\"{}\\\\\\\"\\\\n }\\\\n },\\\\n \\\\\\\"required\\\\\\\": [\\\\\\\"method\\\\\\\", \\\\\\\"paramsBody\\\\\\\"]\\\\n },\\\\n \\\\\\\"gpioStatusChangeRequest\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"GPIO status change request\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"object\\\\\\\",\\\\n \\\\\\\"properties\\\\\\\": {\\\\n \\\\\\\"method\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Method name\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"string\\\\\\\",\\\\n \\\\\\\"default\\\\\\\": \\\\\\\"setGpioStatus\\\\\\\"\\\\n },\\\\n \\\\\\\"paramsBody\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Method body\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"string\\\\\\\",\\\\n \\\\\\\"default\\\\\\\": \\\\\\\"{\\\\\\\\n \\\\\\\\\\\\\\\"pin\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"{$pin}\\\\\\\\\\\\\\\",\\\\\\\\n \\\\\\\\\\\\\\\"enabled\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"{$enabled}\\\\\\\\\\\\\\\"\\\\\\\\n}\\\\\\\"\\\\n }\\\\n },\\\\n \\\\\\\"required\\\\\\\": [\\\\\\\"method\\\\\\\", \\\\\\\"paramsBody\\\\\\\"]\\\\n },\\\\n \\\\\\\"parseGpioStatusFunction\\\\\\\": {\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"Parse gpio status function\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"string\\\\\\\",\\\\n \\\\\\\"default\\\\\\\": \\\\\\\"return body[pin] \\u003d\\u003d\\u003d true;\\\\\\\"\\\\n } \\\\n },\\\\n \\\\\\\"required\\\\\\\": [\\\\\\\"gpioList\\\\\\\", \\\\n \\\\\\\"requestTimeout\\\\\\\",\\\\n \\\\\\\"switchPanelBackgroundColor\\\\\\\",\\\\n \\\\\\\"gpioStatusRequest\\\\\\\",\\\\n \\\\\\\"gpioStatusChangeRequest\\\\\\\",\\\\n \\\\\\\"parseGpioStatusFunction\\\\\\\"]\\\\n },\\\\n \\\\\\\"form\\\\\\\": [\\\\n \\\\\\\"gpioList\\\\\\\",\\\\n \\\\\\\"requestTimeout\\\\\\\",\\\\n {\\\\n \\\\\\\"key\\\\\\\": \\\\\\\"switchPanelBackgroundColor\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"color\\\\\\\"\\\\n },\\\\n {\\\\n \\\\\\\"key\\\\\\\": \\\\\\\"gpioStatusRequest\\\\\\\",\\\\n \\\\\\\"items\\\\\\\": [\\\\n \\\\\\\"gpioStatusRequest.method\\\\\\\",\\\\n {\\\\n \\\\\\\"key\\\\\\\": \\\\\\\"gpioStatusRequest.paramsBody\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"json\\\\\\\"\\\\n }\\\\n ]\\\\n },\\\\n {\\\\n \\\\\\\"key\\\\\\\": \\\\\\\"gpioStatusChangeRequest\\\\\\\",\\\\n \\\\\\\"items\\\\\\\": [\\\\n \\\\\\\"gpioStatusChangeRequest.method\\\\\\\",\\\\n {\\\\n \\\\\\\"key\\\\\\\": \\\\\\\"gpioStatusChangeRequest.paramsBody\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"json\\\\\\\"\\\\n }\\\\n ]\\\\n },\\\\n {\\\\n \\\\\\\"key\\\\\\\": \\\\\\\"parseGpioStatusFunction\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"javascript\\\\\\\"\\\\n }\\\\n ]\\\\n}\\\",\\\"dataKeySettingsSchema\\\":\\\"{}\\\\n\\\",\\\"defaultConfig\\\":\\\"{\\\\\\\"targetDeviceAliases\\\\\\\":[],\\\\\\\"showTitle\\\\\\\":true,\\\\\\\"backgroundColor\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"rgba(0, 0, 0, 0.87)\\\\\\\",\\\\\\\"padding\\\\\\\":\\\\\\\"0px\\\\\\\",\\\\\\\"settings\\\\\\\":{\\\\\\\"parseGpioStatusFunction\\\\\\\":\\\\\\\"return body[pin] \\u003d\\u003d\\u003d true;\\\\\\\",\\\\\\\"gpioStatusChangeRequest\\\\\\\":{\\\\\\\"method\\\\\\\":\\\\\\\"setGpioStatus\\\\\\\",\\\\\\\"paramsBody\\\\\\\":\\\\\\\"{\\\\\\\\n \\\\\\\\\\\\\\\"pin\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"{$pin}\\\\\\\\\\\\\\\",\\\\\\\\n \\\\\\\\\\\\\\\"enabled\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"{$enabled}\\\\\\\\\\\\\\\"\\\\\\\\n}\\\\\\\"},\\\\\\\"requestTimeout\\\\\\\":500,\\\\\\\"switchPanelBackgroundColor\\\\\\\":\\\\\\\"#b71c1c\\\\\\\",\\\\\\\"gpioStatusRequest\\\\\\\":{\\\\\\\"method\\\\\\\":\\\\\\\"getGpioStatus\\\\\\\",\\\\\\\"paramsBody\\\\\\\":\\\\\\\"{}\\\\\\\"},\\\\\\\"gpioList\\\\\\\":[{\\\\\\\"pin\\\\\\\":1,\\\\\\\"label\\\\\\\":\\\\\\\"GPIO 1\\\\\\\",\\\\\\\"row\\\\\\\":0,\\\\\\\"col\\\\\\\":0,\\\\\\\"_uniqueKey\\\\\\\":0},{\\\\\\\"pin\\\\\\\":2,\\\\\\\"label\\\\\\\":\\\\\\\"GPIO 2\\\\\\\",\\\\\\\"row\\\\\\\":0,\\\\\\\"col\\\\\\\":1,\\\\\\\"_uniqueKey\\\\\\\":1},{\\\\\\\"pin\\\\\\\":3,\\\\\\\"label\\\\\\\":\\\\\\\"GPIO 3\\\\\\\",\\\\\\\"row\\\\\\\":1,\\\\\\\"col\\\\\\\":0,\\\\\\\"_uniqueKey\\\\\\\":2}]},\\\\\\\"title\\\\\\\":\\\\\\\"Basic GPIO Control\\\\\\\"}\\\"}\",{\"r\":\"@java.lang.Class\"}]": 5
},
"org.thingsboard.server.dao.sql.relation.JpaRelationDao.saveRelation": {
"[{\"SYS_TENANT_ID\":{\"SYS_TENANT_ID\":{\"r\":\"@org.thingsboard.server.common.data.id.TenantId\"},\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},{\"log\":{\"r\":\"@ch.qos.logback.classic.Logger\"},\"serialVersionUID\":\"2807343040519543363\",\"CONTAINS_TYPE\":\"Contains\",\"MANAGES_TYPE\":\"Manages\",\"from\":{\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},\"to\":{\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},\"type\":\"Contains\",\"typeGroup\":\"RULE_CHAIN\"}]": 11
},
"org.thingsboard.server.dao.sql.relation.JpaRelationDao.findAllByFrom": {
"[{\"SYS_TENANT_ID\":{\"SYS_TENANT_ID\":{\"r\":\"@org.thingsboard.server.common.data.id.TenantId\"},\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},{\"serialVersionUID\":\"1\",\"id\":{\"r\":\"@java.util.UUID\"}},\"RULE_NODE\"]": 3
}
}