(1). ThingsBoard源码编译官方指导
https://thingsboard.io/docs/user-guide/install/building-from-source/
(2). ThingsBoard编译
# 注意,要求安装:jdk11
# 进入工作目录
lixin-macbook:~ lixin$ cd ~/GitRepository/
# clone源码
lixin-macbook:GitRepository lixin$ git clone git@github.com:help-lixin/thingsboard.git
# 切换分支
lixin-macbook:thingsboard lixin$ git checkout release-3.2
# 编译(过程比较漫长)
lixin-macbook:thingsboard lixin$ mvn clean install -DskipTests
# 应用程序生成后的目录
lixin-macbook:thingsboard lixin$ ll application/target/
drwxr-xr-x 3 lixin staff 96 8 7 13:05 bin/
drwxr-xr-x 8 lixin staff 256 8 7 13:05 classes/
drwxr-xr-x 8 lixin staff 256 8 7 13:05 conf/
drwxr-xr-x 5 lixin staff 160 8 7 13:05 control/
drwxr-xr-x 7 lixin staff 224 8 7 13:05 data/
drwxr-xr-x 8 lixin staff 256 8 7 13:05 debian/
-rw-r--r-- 1 lixin staff 11857728 8 7 13:05 protoc-3.11.4-osx-x86_64.exe
-rw-r--r-- 1 lixin staff 136096896 8 7 13:05 thingsboard-3.2.2-1.noarch.rpm
-rwxr--r-- 1 lixin staff 148502358 8 7 13:05 thingsboard-3.2.2-boot.jar*
-rw-r--r-- 1 lixin staff 1074627 8 7 13:05 thingsboard-3.2.2.jar
-rw-r--r-- 1 lixin staff 136284994 8 7 13:05 thingsboard-windows.zip
-rw-r--r-- 1 lixin staff 136088534 8 7 13:05 thingsboard.deb
-rw-r--r-- 1 lixin staff 136096896 8 7 13:05 thingsboard.rpm
-rw-r--r-- 1 lixin staff 570 8 7 13:05 thingsboard_3.2.2-1_all.changes
-rw-r--r-- 1 lixin staff 136088534 8 7 13:05 thingsboard_3.2.2-1_all.deb
(3). PostgreSQL准备
lixin-macbook:~ lixin$ docker pull postgres:12.1
lixin-macbook:~ lixin$ docker run --name tb_pg -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d postgres:12.1
lixin-macbook:~ lixin$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
54c5075c5d9e postgres:12.1 "docker-entrypoint.s…" 41 seconds ago Up 39 seconds 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp tb_pg
# 创建数据库
lixin-macbook:~ lixin$ docker exec -it 54c5075c5d9e /bin/bash
# 切换用户
root@54c5075c5d9e:/# su - postgres
# 运行psql
postgres@54c5075c5d9e:~$ psql
psql (12.1 (Debian 12.1-1.pgdg100+1))
Type "help" for help.
# 创建数据库
postgres=# CREATE DATABASE thingsboard;
CREATE DATABASE
(4). 环境初始化
# 查看当前目录
lixin-macbook:thingsboard lixin$ pwd
/Users/lixin/GitRepository/thingsboard
# 拷贝:dao/src/main/resources/sql目录到:application/src/main/data目录下
lixin-macbook:thingsboard lixin$ cp -rf ./dao/src/main/resources/sql ./application/src/main/data/
# 验证结果
lixin-macbook:thingsboard lixin$ ll ./application/src/main/data/
drwxr-xr-x 3 lixin staff 96 8 7 11:14 certs/
drwxr-xr-x 5 lixin staff 160 8 7 11:14 json/
drwxr-xr-x 9 lixin staff 288 8 7 14:12 sql/
drwxr-xr-x 17 lixin staff 544 8 7 11:21 upgrade/
(5). IDEA配置(ThingsboardInstallApplication)
(6). 启动ThingsboardInstallApplication
运行ThingsboardInstallApplication,使其初始化表.
/Library/Java/JavaVirtualMachines/jdk-11.0.9.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:58818,suspend=y,server=n -javaagent:/Users/lixin/Library/Caches/JetBrains/IdeaIC2021.1/groovyHotSwap/gragent.jar -javaagent:/Users/lixin/Library/Caches/JetBrains/IdeaIC2021.1/captureAgent/debugger-agent.jar -Dfile.encoding=UTF-8 -classpath /Users/lixin/GitRepository/thingsboard/application/target/classes:/Users/lixin/.m2/repository/io/netty/netty-transport-native-epoll/4.1.60.Final/netty-transport-native-epoll-4.1.60.Final-linux-x86_64.jar:/Users/lixin/.m2/repository/io/netty/netty-common/4.1.60.Final/netty-common-4.1.60.Final.jar:/Users/lixin/.m2/repository/io/netty/netty-buffer/4.1.60.Final/netty-buffer-4.1.60.Final.jar:/Users/lixin/.m2/repository/io/netty/netty-transport/4.1.60.Final/netty-transport-4.1.60.Final.jar:/Users/lixin/.m2/repository/io/netty/netty-resolver/4.1.60.Final/netty-resolver-4.1.60.Final.jar:/Users/lixin/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.60.Final/netty-transport-native-unix-common-4.1.60.Final.jar:/Users/lixin/GitRepository/thingsboard/common/actor/target/classes:/Users/lixin/GitRepository/thingsboard/common/message/target/classes:/Users/lixin/.m2/repository/com/github/vladimir-bukhtoyarov/bucket4j-core/4.1.1/bucket4j-core-4.1.1.jar:/Users/lixin/GitRepository/thingsboard/common/util/target/classes:/Users/lixin/.m2/repository/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar:/Users/lixin/GitRepository/thingsboard/rule-engine/rule-engine-api/target/classes:/Users/lixin/GitRepository/thingsboard/rule-engine/rule-engine-components/target/classes:/Users/lixin/GitRepository/thingsboard/netty-mqtt/target/classes:/Users/lixin/.m2/repository/io/netty/netty-codec-mqtt/4.1.60.Final/netty-codec-mqtt-4.1.60.Final.jar:/Users/lixin/.m2/repository/io/netty/netty-handler/4.1.60.Final/netty-handler-4.1.60.Final.jar:/Users/lixin/.m2/repository/com/google/guava/guava/28.2-jre/guava-28.2-jre.jar:/Users/lixin/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar:/Users/lixin/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:/Users/lixin/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar:/Users/lixin/.m2/repository/org/checkerframework/checker-qual/2.10.0/checker-qual-2.10.0.jar:/Users/lixin/.m2/repository/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar:/Users/lixin/.m2/repository/com/google/code/gson/gson/2.6.2/gson-2.6.2.jar:/Users/lixin/.m2/repository/org/apache/kafka/kafka-clients/2.6.0/kafka-clients-2.6.0.jar:/Users/lixin/.m2/repository/com/github/luben/zstd-jni/1.4.4-7/zstd-jni-1.4.4-7.jar:/Users/lixin/.m2/repository/org/lz4/lz4-java/1.7.1/lz4-java-1.7.1.jar:/Users/lixin/.m2/repository/org/xerial/snappy/snappy-java/1.1.7.3/snappy-java-1.1.7.3.jar:/Users/lixin/.m2/repository/com/google/cloud/google-cloud-pubsub/1.105.0/google-cloud-pubsub-1.105.0.jar:/Users/lixin/.m2/repository/com/google/api/api-common/1.9.0/api-common-1.9.0.jar:/Users/lixin/.m2/repository/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.87.0/proto-google-cloud-pubsub-v1-1.87.0.jar:/Users/lixin/.m2/repository/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar:/Users/lixin/.m2/repository/com/google/api/gax/1.56.0/gax-1.56.0.jar:/Users/lixin/.m2/repository/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar:/Users/lixin/.m2/repository/com/google/http-client/google-http-client-jackson2/1.34.0/google-http-client-jackson2-1.34.0.jar:/Users/lixin/.m2/repository/com/google/api/gax-grpc/1.56.0/gax-grpc-1.56.0.jar:/Users/lixin/.m2/repository/io/grpc/grpc-auth/1.22.1/grpc-auth-1.22.1.jar:/Users/lixin/.m2/repository/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar:/Users/lixin/.m2/repository/io/grpc/grpc-alts/1.22.1/grpc-alts-1.22.1.jar:/Users/lixin/.m2/repository/io/grpc/grpc-grpclb/1.22.1/grpc-grpclb-1.22.1.jar:/Users/lixin/.m2/repository/com/google/protobuf/protobuf-java-util/3.7.1/protobuf-java-util-3.7.1.jar:/Users/lixin/.m2/repository/io/grpc/grpc-netty-shaded/1.22.1/grpc-netty-shaded-1.22.1.jar:/Users/lixin/.m2/repository/org/threeten/threetenbp/1.4.3/threetenbp-1.4.3.jar:/Users/lixin/.m2/repository/io/opencensus/opencensus-api/0.26.0/opencensus-api-0.26.0.jar:/Users/lixin/.m2/repository/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar:/Users/lixin/.m2/repository/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2.jar:/Users/lixin/.m2/repository/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar:/Users/lixin/.m2/repository/com/google/api/grpc/proto-google-common-protos/1.16.0/proto-google-common-protos-1.16.0.jar:/Users/lixin/.m2/repository/com/rabbitmq/amqp-client/4.8.0/amqp-client-4.8.0.jar:/Users/lixin/.m2/repository/org/bouncycastle/bcpkix-jdk15on/1.64/bcpkix-jdk15on-1.64.jar:/Users/lixin/.m2/repository/org/locationtech/spatial4j/spatial4j/0.7/spatial4j-0.7.jar:/Users/lixin/.m2/repository/org/locationtech/jts/jts-core/1.15.0/jts-core-1.15.0.jar:/Users/lixin/GitRepository/thingsboard/common/transport/transport-api/target/classes:/Users/lixin/GitRepository/thingsboard/common/data/target/classes:/Users/lixin/.m2/repository/com/squareup/wire/wire-schema/3.4.0/wire-schema-3.4.0.jar:/Users/lixin/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib/1.4.10/kotlin-stdlib-1.4.10.jar:/Users/lixin/.m2/repository/org/jetbrains/annotations/13.0/annotations-13.0.jar:/Users/lixin/.m2/repository/com/squareup/wire/wire-runtime/3.4.0/wire-runtime-3.4.0.jar:/Users/lixin/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10.jar:/Users/lixin/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10.jar:/Users/lixin/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.10/kotlin-stdlib-common-1.4.10.jar:/Users/lixin/.m2/repository/com/squareup/okio/okio/2.8.0/okio-2.8.0.jar:/Users/lixin/.m2/repository/org/thingsboard/protobuf-dynamic/1.0.2TB/protobuf-dynamic-1.0.2TB.jar:/Users/lixin/.m2/repository/de/ruedigermoeller/fst/2.57/fst-2.57.jar:/Users/lixin/.m2/repository/org/javassist/javassist/3.21.0-GA/javassist-3.21.0-GA.jar:/Users/lixin/.m2/repository/org/springframework/spring-context/5.2.10.RELEASE/spring-context-5.2.10.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/spring-expression/5.2.10.RELEASE/spring-expression-5.2.10.RELEASE.jar:/Users/lixin/.m2/repository/org/apache/commons/commons-lang3/3.4/commons-lang3-3.4.jar:/Users/lixin/GitRepository/thingsboard/common/transport/mqtt/target/classes:/Users/lixin/.m2/repository/io/netty/netty-all/4.1.60.Final/netty-all-4.1.60.Final.jar:/Users/lixin/GitRepository/thingsboard/common/transport/http/target/classes:/Users/lixin/GitRepository/thingsboard/common/transport/coap/target/classes:/Users/lixin/.m2/repository/org/eclipse/californium/californium-core/2.6.1/californium-core-2.6.1.jar:/Users/lixin/.m2/repository/org/eclipse/californium/californium-legal/2.6.1/californium-legal-2.6.1.jar:/Users/lixin/.m2/repository/org/eclipse/californium/element-connector/2.6.1/element-connector-2.6.1.jar:/Users/lixin/.m2/repository/net/i2p/crypto/eddsa/0.3.0/eddsa-0.3.0.jar:/Users/lixin/GitRepository/thingsboard/dao/target/classes:/Users/lixin/GitRepository/thingsboard/common/dao-api/target/classes:/Users/lixin/.m2/repository/com/github/fge/json-schema-validator/2.2.6/json-schema-validator-2.2.6.jar:/Users/lixin/.m2/repository/com/googlecode/libphonenumber/libphonenumber/6.2/libphonenumber-6.2.jar:/Users/lixin/.m2/repository/com/github/fge/json-schema-core/1.2.5/json-schema-core-1.2.5.jar:/Users/lixin/.m2/repository/com/github/fge/uri-template/0.9/uri-template-0.9.jar:/Users/lixin/.m2/repository/com/github/fge/msg-simple/1.1/msg-simple-1.1.jar:/Users/lixin/.m2/repository/com/github/fge/btf/1.2/btf-1.2.jar:/Users/lixin/.m2/repository/com/github/fge/jackson-coreutils/1.8/jackson-coreutils-1.8.jar:/Users/lixin/.m2/repository/org/mozilla/rhino/1.7R4/rhino-1.7R4.jar:/Users/lixin/.m2/repository/net/sf/jopt-simple/jopt-simple/4.6/jopt-simple-4.6.jar:/Users/lixin/.m2/repository/org/postgresql/postgresql/42.2.16/postgresql-42.2.16.jar:/Users/lixin/.m2/repository/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar:/Users/lixin/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar:/Users/lixin/.m2/repository/org/springframework/spring-tx/5.2.10.RELEASE/spring-tx-5.2.10.RELEASE.jar:/Users/lixin/.m2/repository/com/datastax/oss/java-driver-core/4.10.0/java-driver-core-4.10.0.jar:/Users/lixin/.m2/repository/com/datastax/oss/native-protocol/1.4.12/native-protocol-1.4.12.jar:/Users/lixin/.m2/repository/com/datastax/oss/java-driver-shaded-guava/25.1-jre-graal-sub-1/java-driver-shaded-guava-25.1-jre-graal-sub-1.jar:/Users/lixin/.m2/repository/com/typesafe/config/1.4.1/config-1.4.1.jar:/Users/lixin/.m2/repository/com/github/jnr/jnr-posix/3.1.2/jnr-posix-3.1.2.jar:/Users/lixin/.m2/repository/com/github/jnr/jnr-constants/0.10.0/jnr-constants-0.10.0.jar:/Users/lixin/.m2/repository/io/dropwizard/metrics/metrics-core/4.1.16/metrics-core-4.1.16.jar:/Users/lixin/.m2/repository/org/hdrhistogram/HdrHistogram/2.1.12/HdrHistogram-2.1.12.jar:/Users/lixin/.m2/repository/com/esri/geometry/esri-geometry-api/1.2.1/esri-geometry-api-1.2.1.jar:/Users/lixin/.m2/repository/org/json/json/20090211/json-20090211.jar:/Users/lixin/.m2/repository/org/codehaus/jackson/jackson-core-asl/1.9.12/jackson-core-asl-1.9.12.jar:/Users/lixin/.m2/repository/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar:/Users/lixin/.m2/repository/com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar:/Users/lixin/.m2/repository/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12.jar:/Users/lixin/.m2/repository/com/datastax/oss/java-driver-query-builder/4.10.0/java-driver-query-builder-4.10.0.jar:/Users/lixin/.m2/repository/io/dropwizard/metrics/metrics-jmx/4.0.5/metrics-jmx-4.0.5.jar:/Users/lixin/.m2/repository/org/apache/curator/curator-x-discovery/4.2.0/curator-x-discovery-4.2.0.jar:/Users/lixin/.m2/repository/com/github/ben-manes/caffeine/caffeine/2.6.1/caffeine-2.6.1.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.3.9.RELEASE/spring-boot-autoconfigure-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot/2.3.9.RELEASE/spring-boot-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/bouncycastle/bcprov-jdk15on/1.64/bcprov-jdk15on-1.64.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-starter-data-jpa/2.3.9.RELEASE/spring-boot-starter-data-jpa-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-starter-aop/2.3.9.RELEASE/spring-boot-starter-aop-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/aspectj/aspectjweaver/1.9.6/aspectjweaver-1.9.6.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-starter-jdbc/2.3.9.RELEASE/spring-boot-starter-jdbc-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/com/zaxxer/HikariCP/3.4.5/HikariCP-3.4.5.jar:/Users/lixin/.m2/repository/org/springframework/spring-jdbc/5.2.13.RELEASE/spring-jdbc-5.2.13.RELEASE.jar:/Users/lixin/.m2/repository/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar:/Users/lixin/.m2/repository/jakarta/persistence/jakarta.persistence-api/2.2.3/jakarta.persistence-api-2.2.3.jar:/Users/lixin/.m2/repository/org/hibernate/hibernate-core/5.4.28.Final/hibernate-core-5.4.28.Final.jar:/Users/lixin/.m2/repository/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final.jar:/Users/lixin/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar:/Users/lixin/.m2/repository/org/jboss/jandex/2.2.3.Final/jandex-2.2.3.Final.jar:/Users/lixin/.m2/repository/org/dom4j/dom4j/2.1.3/dom4j-2.1.3.jar:/Users/lixin/.m2/repository/org/hibernate/common/hibernate-commons-annotations/5.1.2.Final/hibernate-commons-annotations-5.1.2.Final.jar:/Users/lixin/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar:/Users/lixin/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar:/Users/lixin/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar:/Users/lixin/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar:/Users/lixin/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar:/Users/lixin/.m2/repository/org/springframework/data/spring-data-jpa/2.3.7.RELEASE/spring-data-jpa-2.3.7.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/data/spring-data-commons/2.3.7.RELEASE/spring-data-commons-2.3.7.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/spring-orm/5.2.13.RELEASE/spring-orm-5.2.13.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/spring-aspects/5.2.13.RELEASE/spring-aspects-5.2.13.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/data/spring-data-redis/2.4.1/spring-data-redis-2.4.1.jar:/Users/lixin/.m2/repository/org/springframework/data/spring-data-keyvalue/2.4.1/spring-data-keyvalue-2.4.1.jar:/Users/lixin/.m2/repository/org/springframework/spring-oxm/5.3.1/spring-oxm-5.3.1.jar:/Users/lixin/.m2/repository/redis/clients/jedis/3.3.0/jedis-3.3.0.jar:/Users/lixin/.m2/repository/org/apache/commons/commons-pool2/2.6.2/commons-pool2-2.6.2.jar:/Users/lixin/.m2/repository/org/elasticsearch/client/rest/5.0.2/rest-5.0.2.jar:/Users/lixin/.m2/repository/org/apache/httpcomponents/httpasyncclient/4.1.2/httpasyncclient-4.1.2.jar:/Users/lixin/.m2/repository/org/apache/httpcomponents/httpcore-nio/4.4.5/httpcore-nio-4.4.5.jar:/Users/lixin/.m2/repository/commons-codec/commons-codec/1.10/commons-codec-1.10.jar:/Users/lixin/.m2/repository/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar:/Users/lixin/GitRepository/thingsboard/common/queue/target/classes:/Users/lixin/.m2/repository/com/amazonaws/aws-java-sdk-sqs/1.11.747/aws-java-sdk-sqs-1.11.747.jar:/Users/lixin/.m2/repository/com/microsoft/azure/azure-servicebus/3.2.0/azure-servicebus-3.2.0.jar:/Users/lixin/.m2/repository/org/apache/qpid/proton-j/0.33.2/proton-j-0.33.2.jar:/Users/lixin/.m2/repository/com/microsoft/azure/qpid-proton-j-extensions/1.2.2/qpid-proton-j-extensions-1.2.2.jar:/Users/lixin/.m2/repository/org/asynchttpclient/async-http-client/2.10.5/async-http-client-2.10.5.jar:/Users/lixin/.m2/repository/org/asynchttpclient/async-http-client-netty-utils/2.10.5/async-http-client-netty-utils-2.10.5.jar:/Users/lixin/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.45.Final/netty-transport-native-kqueue-4.1.45.Final-osx-x86_64.jar:/Users/lixin/.m2/repository/com/typesafe/netty/netty-reactive-streams/2.0.3/netty-reactive-streams-2.0.3.jar:/Users/lixin/.m2/repository/com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar:/Users/lixin/.m2/repository/com/microsoft/azure/azure-client-authentication/1.7.2/azure-client-authentication-1.7.2.jar:/Users/lixin/.m2/repository/com/microsoft/azure/azure-client-runtime/1.7.2/azure-client-runtime-1.7.2.jar:/Users/lixin/.m2/repository/com/microsoft/rest/client-runtime/1.7.2/client-runtime-1.7.2.jar:/Users/lixin/.m2/repository/com/squareup/retrofit2/retrofit/2.5.0/retrofit-2.5.0.jar:/Users/lixin/.m2/repository/com/squareup/okhttp3/okhttp/3.12.6/okhttp-3.12.6.jar:/Users/lixin/.m2/repository/com/squareup/okhttp3/logging-interceptor/3.12.2/logging-interceptor-3.12.2.jar:/Users/lixin/.m2/repository/com/squareup/okhttp3/okhttp-urlconnection/3.12.2/okhttp-urlconnection-3.12.2.jar:/Users/lixin/.m2/repository/com/squareup/retrofit2/converter-jackson/2.5.0/converter-jackson-2.5.0.jar:/Users/lixin/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-joda/2.10.1/jackson-datatype-joda-2.10.1.jar:/Users/lixin/.m2/repository/io/reactivex/rxjava/1.3.8/rxjava-1.3.8.jar:/Users/lixin/.m2/repository/com/squareup/retrofit2/adapter-rxjava/2.6.2/adapter-rxjava-2.6.2.jar:/Users/lixin/.m2/repository/com/microsoft/azure/adal4j/1.6.4/adal4j-1.6.4.jar:/Users/lixin/.m2/repository/com/microsoft/azure/azure-annotations/1.10.0/azure-annotations-1.10.0.jar:/Users/lixin/GitRepository/thingsboard/common/stats/target/classes:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-starter-actuator/2.3.9.RELEASE/spring-boot-starter-actuator-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-actuator-autoconfigure/2.3.9.RELEASE/spring-boot-actuator-autoconfigure-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-actuator/2.3.9.RELEASE/spring-boot-actuator-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/io/micrometer/micrometer-core/1.5.2/micrometer-core-1.5.2.jar:/Users/lixin/.m2/repository/org/latencyutils/LatencyUtils/2.0.3/LatencyUtils-2.0.3.jar:/Users/lixin/.m2/repository/io/micrometer/micrometer-registry-prometheus/1.5.2/micrometer-registry-prometheus-1.5.2.jar:/Users/lixin/.m2/repository/io/prometheus/simpleclient_common/0.8.1/simpleclient_common-0.8.1.jar:/Users/lixin/.m2/repository/io/prometheus/simpleclient/0.8.1/simpleclient-0.8.1.jar:/Users/lixin/.m2/repository/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.2.4/org.eclipse.paho.client.mqttv3-1.2.4.jar:/Users/lixin/.m2/repository/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar:/Users/lixin/GitRepository/thingsboard/ui-ngx/target/classes:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-starter-security/2.3.9.RELEASE/spring-boot-starter-security-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-starter/2.3.9.RELEASE/spring-boot-starter-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-starter-logging/2.3.9.RELEASE/spring-boot-starter-logging-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.13.3/log4j-to-slf4j-2.13.3.jar:/Users/lixin/.m2/repository/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar:/Users/lixin/.m2/repository/org/slf4j/jul-to-slf4j/1.7.7/jul-to-slf4j-1.7.7.jar:/Users/lixin/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/Users/lixin/.m2/repository/org/springframework/spring-aop/5.2.13.RELEASE/spring-aop-5.2.13.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/security/spring-security-config/5.3.8.RELEASE/spring-security-config-5.3.8.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/security/spring-security-web/5.3.8.RELEASE/spring-security-web-5.3.8.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-starter-web/2.3.9.RELEASE/spring-boot-starter-web-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-starter-json/2.3.9.RELEASE/spring-boot-starter-json-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.11.4/jackson-datatype-jdk8-2.11.4.jar:/Users/lixin/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.11.4/jackson-datatype-jsr310-2.11.4.jar:/Users/lixin/.m2/repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.11.4/jackson-module-parameter-names-2.11.4.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-starter-tomcat/2.3.9.RELEASE/spring-boot-starter-tomcat-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/9.0.43/tomcat-embed-core-9.0.43.jar:/Users/lixin/.m2/repository/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar:/Users/lixin/.m2/repository/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.43/tomcat-embed-websocket-9.0.43.jar:/Users/lixin/.m2/repository/org/springframework/spring-web/5.2.10.RELEASE/spring-web-5.2.10.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/spring-webmvc/5.2.13.RELEASE/spring-webmvc-5.2.13.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/boot/spring-boot-starter-websocket/2.3.9.RELEASE/spring-boot-starter-websocket-2.3.9.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/spring-messaging/5.2.13.RELEASE/spring-messaging-5.2.13.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/spring-websocket/5.2.13.RELEASE/spring-websocket-5.2.13.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/security/spring-security-oauth2-client/5.4.1/spring-security-oauth2-client-5.4.1.jar:/Users/lixin/.m2/repository/com/nimbusds/oauth2-oidc-sdk/8.22/oauth2-oidc-sdk-8.22.jar:/Users/lixin/.m2/repository/com/nimbusds/content-type/2.1/content-type-2.1.jar:/Users/lixin/.m2/repository/com/nimbusds/lang-tag/1.4.4/lang-tag-1.4.4.jar:/Users/lixin/.m2/repository/org/springframework/security/spring-security-core/5.4.1/spring-security-core-5.4.1.jar:/Users/lixin/.m2/repository/org/springframework/security/spring-security-oauth2-core/5.4.1/spring-security-oauth2-core-5.4.1.jar:/Users/lixin/.m2/repository/org/springframework/security/spring-security-oauth2-jose/5.4.1/spring-security-oauth2-jose-5.4.1.jar:/Users/lixin/.m2/repository/com/nimbusds/nimbus-jose-jwt/9.0.1/nimbus-jose-jwt-9.0.1.jar:/Users/lixin/.m2/repository/io/jsonwebtoken/jjwt/0.7.0/jjwt-0.7.0.jar:/Users/lixin/.m2/repository/org/freemarker/freemarker/2.3.30/freemarker-2.3.30.jar:/Users/lixin/.m2/repository/commons-io/commons-io/2.5/commons-io-2.5.jar:/Users/lixin/.m2/repository/org/apache/commons/commons-csv/1.4/commons-csv-1.4.jar:/Users/lixin/.m2/repository/org/springframework/spring-context-support/5.2.10.RELEASE/spring-context-support-5.2.10.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/spring-beans/5.2.10.RELEASE/spring-beans-5.2.10.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/spring-core/5.2.10.RELEASE/spring-core-5.2.10.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/spring-jcl/5.2.10.RELEASE/spring-jcl-5.2.10.RELEASE.jar:/Users/lixin/.m2/repository/org/slf4j/slf4j-api/1.7.7/slf4j-api-1.7.7.jar:/Users/lixin/.m2/repository/org/slf4j/log4j-over-slf4j/1.7.7/log4j-over-slf4j-1.7.7.jar:/Users/lixin/.m2/repository/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/Users/lixin/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/Users/lixin/.m2/repository/com/sun/mail/javax.mail/1.6.2/javax.mail-1.6.2.jar:/Users/lixin/.m2/repository/javax/activation/activation/1.1/activation-1.1.jar:/Users/lixin/.m2/repository/com/twilio/sdk/twilio/7.54.2/twilio-7.54.2.jar:/Users/lixin/.m2/repository/joda-time/joda-time/2.10.6/joda-time-2.10.6.jar:/Users/lixin/.m2/repository/org/apache/httpcomponents/httpclient/4.5.6/httpclient-4.5.6.jar:/Users/lixin/.m2/repository/org/apache/httpcomponents/httpcore/4.4.10/httpcore-4.4.10.jar:/Users/lixin/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar:/Users/lixin/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.12.1/jackson-annotations-2.12.1.jar:/Users/lixin/.m2/repository/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar:/Users/lixin/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar:/Users/lixin/.m2/repository/com/amazonaws/aws-java-sdk-sns/1.11.747/aws-java-sdk-sns-1.11.747.jar:/Users/lixin/.m2/repository/com/amazonaws/aws-java-sdk-core/1.11.747/aws-java-sdk-core-1.11.747.jar:/Users/lixin/.m2/repository/software/amazon/ion/ion-java/1.0.2/ion-java-1.0.2.jar:/Users/lixin/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.6.7/jackson-dataformat-cbor-2.6.7.jar:/Users/lixin/.m2/repository/com/amazonaws/jmespath-java/1.11.747/jmespath-java-1.11.747.jar:/Users/lixin/.m2/repository/org/apache/curator/curator-recipes/4.2.0/curator-recipes-4.2.0.jar:/Users/lixin/.m2/repository/org/apache/curator/curator-framework/4.2.0/curator-framework-4.2.0.jar:/Users/lixin/.m2/repository/org/apache/curator/curator-client/4.2.0/curator-client-4.2.0.jar:/Users/lixin/.m2/repository/org/apache/zookeeper/zookeeper/3.5.5/zookeeper-3.5.5.jar:/Users/lixin/.m2/repository/org/apache/zookeeper/zookeeper-jute/3.5.5/zookeeper-jute-3.5.5.jar:/Users/lixin/.m2/repository/org/apache/yetus/audience-annotations/0.5.0/audience-annotations-0.5.0.jar:/Users/lixin/.m2/repository/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar:/Users/lixin/.m2/repository/io/grpc/grpc-netty/1.22.1/grpc-netty-1.22.1.jar:/Users/lixin/.m2/repository/io/grpc/grpc-core/1.22.1/grpc-core-1.22.1.jar:/Users/lixin/.m2/repository/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar:/Users/lixin/.m2/repository/io/perfmark/perfmark-api/0.16.0/perfmark-api-0.16.0.jar:/Users/lixin/.m2/repository/io/opencensus/opencensus-contrib-grpc-metrics/0.21.0/opencensus-contrib-grpc-metrics-0.21.0.jar:/Users/lixin/.m2/repository/io/netty/netty-codec-http2/4.1.35.Final/netty-codec-http2-4.1.35.Final.jar:/Users/lixin/.m2/repository/io/netty/netty-codec/4.1.35.Final/netty-codec-4.1.35.Final.jar:/Users/lixin/.m2/repository/io/netty/netty-codec-http/4.1.35.Final/netty-codec-http-4.1.35.Final.jar:/Users/lixin/.m2/repository/io/netty/netty-handler-proxy/4.1.35.Final/netty-handler-proxy-4.1.35.Final.jar:/Users/lixin/.m2/repository/io/netty/netty-codec-socks/4.1.35.Final/netty-codec-socks-4.1.35.Final.jar:/Users/lixin/.m2/repository/io/grpc/grpc-protobuf/1.22.1/grpc-protobuf-1.22.1.jar:/Users/lixin/.m2/repository/io/grpc/grpc-api/1.22.1/grpc-api-1.22.1.jar:/Users/lixin/.m2/repository/io/grpc/grpc-context/1.22.1/grpc-context-1.22.1.jar:/Users/lixin/.m2/repository/com/google/errorprone/error_prone_annotations/2.3.2/error_prone_annotations-2.3.2.jar:/Users/lixin/.m2/repository/org/codehaus/mojo/animal-sniffer-annotations/1.17/animal-sniffer-annotations-1.17.jar:/Users/lixin/.m2/repository/io/grpc/grpc-protobuf-lite/1.22.1/grpc-protobuf-lite-1.22.1.jar:/Users/lixin/.m2/repository/io/grpc/grpc-stub/1.22.1/grpc-stub-1.22.1.jar:/Users/lixin/.m2/repository/io/springfox/springfox-swagger2/2.6.1/springfox-swagger2-2.6.1.jar:/Users/lixin/.m2/repository/io/swagger/swagger-annotations/1.5.10/swagger-annotations-1.5.10.jar:/Users/lixin/.m2/repository/io/swagger/swagger-models/1.5.10/swagger-models-1.5.10.jar:/Users/lixin/.m2/repository/io/springfox/springfox-spi/2.6.1/springfox-spi-2.6.1.jar:/Users/lixin/.m2/repository/io/springfox/springfox-core/2.6.1/springfox-core-2.6.1.jar:/Users/lixin/.m2/repository/io/springfox/springfox-schema/2.6.1/springfox-schema-2.6.1.jar:/Users/lixin/.m2/repository/io/springfox/springfox-swagger-common/2.6.1/springfox-swagger-common-2.6.1.jar:/Users/lixin/.m2/repository/io/springfox/springfox-spring-web/2.6.1/springfox-spring-web-2.6.1.jar:/Users/lixin/.m2/repository/com/fasterxml/classmate/1.3.1/classmate-1.3.1.jar:/Users/lixin/.m2/repository/org/springframework/plugin/spring-plugin-core/1.2.0.RELEASE/spring-plugin-core-1.2.0.RELEASE.jar:/Users/lixin/.m2/repository/org/springframework/plugin/spring-plugin-metadata/1.2.0.RELEASE/spring-plugin-metadata-1.2.0.RELEASE.jar:/Users/lixin/.m2/repository/org/mapstruct/mapstruct/1.0.0.Final/mapstruct-1.0.0.Final.jar:/Users/lixin/.m2/repository/com/github/jnr/jnr-ffi/2.1.7/jnr-ffi-2.1.7.jar:/Users/lixin/.m2/repository/com/github/jnr/jffi/1.2.16/jffi-1.2.16.jar:/Users/lixin/.m2/repository/com/github/jnr/jffi/1.2.16/jffi-1.2.16-native.jar:/Users/lixin/.m2/repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.jar:/Users/lixin/.m2/repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.jar:/Users/lixin/.m2/repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar:/Users/lixin/.m2/repository/org/ow2/asm/asm-util/5.0.3/asm-util-5.0.3.jar:/Users/lixin/.m2/repository/com/github/jnr/jnr-x86asm/1.0.2/jnr-x86asm-1.0.2.jar:/Users/lixin/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar:/Users/lixin/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar:/Users/lixin/.m2/repository/net/minidev/json-smart/2.2.1/json-smart-2.2.1.jar:/Users/lixin/.m2/repository/net/minidev/accessors-smart/1.1/accessors-smart-1.1.jar:/Users/lixin/.m2/repository/net/bytebuddy/byte-buddy/1.10.5/byte-buddy-1.10.5.jar:/Users/lixin/.m2/repository/org/objenesis/objenesis/2.6/objenesis-2.6.jar:/Users/lixin/.m2/repository/org/hsqldb/hsqldb/2.5.0/hsqldb-2.5.0.jar:/Users/lixin/.m2/repository/org/javadelight/delight-nashorn-sandbox/0.1.31/delight-nashorn-sandbox-0.1.31.jar:/Users/lixin/.m2/repository/org/webjars/bower/js-beautify/1.9.0/js-beautify-1.9.0.jar:/Users/lixin/.m2/repository/io/springfox/ui/springfox-swagger-ui-rfc6570/1.0.0/springfox-swagger-ui-rfc6570-1.0.0.jar:/Users/lixin/.m2/repository/org/passay/passay/1.5.0/passay-1.5.0.jar:/Users/lixin/.m2/repository/com/github/ua-parser/uap-java/1.4.3/uap-java-1.4.3.jar:/Users/lixin/.m2/repository/org/yaml/snakeyaml/1.27/snakeyaml-1.27.jar:/Users/lixin/.m2/repository/org/apache/commons/commons-collections4/4.1/commons-collections4-4.1.jar:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar org.thingsboard.server.ThingsboardInstallApplication install.load_demo=true
Connected to the target VM, address: '127.0.0.1:58818', transport: 'socket'
===================================================
:: ::
===================================================
2021-08-07 14:26:53,477 [main] INFO o.t.s.ThingsboardInstallApplication - Starting ThingsboardInstallApplication on lixin-macbook.local with PID 15246 (/Users/lixin/GitRepository/thingsboard/application/target/classes started by lixin in /Users/lixin/GitRepository/thingsboard)
2021-08-07 14:26:53,488 [main] INFO o.t.s.ThingsboardInstallApplication - The following profiles are active: install
2021-08-07 14:26:54,205 [background-preinit] WARN o.s.h.c.j.Jackson2ObjectMapperBuilder - For Jackson Kotlin classes support please add "com.fasterxml.jackson.module:jackson-module-kotlin" to the classpath
2021-08-07 14:26:58,055 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
2021-08-07 14:26:58,056 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-08-07 14:26:58,694 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 612ms. Found 28 JPA repository interfaces.
2021-08-07 14:26:58,718 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
2021-08-07 14:26:58,718 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-08-07 14:26:58,735 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 16ms. Found 1 JPA repository interfaces.
2021-08-07 14:26:58,736 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
2021-08-07 14:26:58,737 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-08-07 14:26:58,757 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 19ms. Found 1 JPA repository interfaces.
2021-08-07 14:26:58,759 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
2021-08-07 14:26:58,759 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-08-07 14:26:58,774 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 14ms. Found 1 JPA repository interfaces.
2021-08-07 14:27:00,109 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
2021-08-07 14:27:00,121 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2021-08-07 14:27:00,521 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.alarm.AlarmRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,522 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.asset.AssetRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,522 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.attributes.AttributeKvRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,523 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.audit.AuditLogRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,524 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.component.ComponentDescriptorRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,525 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.customer.CustomerRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,526 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.dashboard.DashboardInfoRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,526 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.dashboard.DashboardRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,527 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.device.DeviceCredentialsRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,527 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.device.DeviceProfileRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,528 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.device.DeviceRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,529 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.entityview.EntityViewRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,529 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.event.EventRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,530 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.oauth2.OAuth2ClientRegistrationInfoRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,531 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.oauth2.OAuth2ClientRegistrationRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,531 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.oauth2.OAuth2ClientRegistrationTemplateRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,532 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.relation.RelationRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,534 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.rule.RuleChainRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,534 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.rule.RuleNodeRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,535 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.rule.RuleNodeStateRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,536 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.settings.AdminSettingsRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,537 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.tenant.TenantProfileRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,537 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.tenant.TenantRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,538 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.usagerecord.ApiUsageStateRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,538 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.user.UserCredentialsRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,539 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.user.UserRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,539 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.widget.WidgetTypeRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,540 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sql.widget.WidgetsBundleRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,540 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sqlts.dictionary.TsKvDictionaryRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,541 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sqlts.latest.TsKvLatestRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,541 [main] INFO o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data Redis - Could not safely identify store assignment for repository candidate interface org.thingsboard.server.dao.sqlts.ts.TsKvRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
2021-08-07 14:27:00,542 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 364ms. Found 0 Redis repository interfaces.
2021-08-07 14:27:04,113 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
2021-08-07 14:27:04,228 [main] INFO o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-0.0.0.0-8080"]
2021-08-07 14:27:04,229 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
2021-08-07 14:27:04,229 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.43]
2021-08-07 14:27:05,748 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2021-08-07 14:27:05,748 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 12073 ms
2021-08-07 14:27:08,010 [main] INFO o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default]
2021-08-07 14:27:08,399 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 5.4.28.Final
2021-08-07 14:27:09,314 [main] INFO o.h.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-08-07 14:27:09,879 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2021-08-07 14:27:10,365 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
2021-08-07 14:27:10,449 [main] INFO org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
2021-08-07 14:27:14,365 [main] INFO o.h.e.t.j.p.i.JtaPlatformInitiator - HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2021-08-07 14:27:14,434 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default'
2021-08-07 14:27:22,138 [main] INFO o.s.b.a.w.s.WelcomePageHandlerMapping - Adding welcome page: class path resource [public/index.html]
2021-08-07 14:27:24,840 [main] INFO o.s.s.web.DefaultSecurityFilterChain - Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@1ff9d66b, org.springframework.security.web.context.SecurityContextPersistenceFilter@752957da, org.springframework.security.web.header.HeaderWriterFilter@eb8d539, org.springframework.security.web.csrf.CsrfFilter@4f7bb581, org.springframework.security.web.authentication.logout.LogoutFilter@1342c6e1, org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter@2eaaef66, org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter@3a8dd899, org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter@6fab250b, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@519f6adb, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@1e2c701, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4c6a5712, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@20ee12d8, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@21e441d1, org.springframework.security.oauth2.client.web.OAuth2AuthorizationCodeGrantFilter@2620d0dc, org.springframework.security.web.session.SessionManagementFilter@36642182, org.springframework.security.web.access.ExceptionTranslationFilter@c534814, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@35007b7a]
2021-08-07 14:27:25,822 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator'
2021-08-07 14:27:25,932 [main] INFO o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-0.0.0.0-8080"]
2021-08-07 14:27:26,023 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
2021-08-07 14:27:26,090 [main] INFO o.t.s.ThingsboardInstallApplication - Started ThingsboardInstallApplication in 34.827 seconds (JVM running for 42.836)
2021-08-07 14:27:26,259 [main] INFO o.t.s.i.ThingsboardInstallService - Starting ThingsBoard Installation...
2021-08-07 14:27:26,259 [main] INFO o.t.s.i.ThingsboardInstallService - Installing DataBase schema for entities...
2021-08-07 14:27:26,259 [main] INFO o.t.s.s.i.SqlAbstractDatabaseSchemaService - Installing SQL DataBase schema part: schema-entities.sql
2021-08-07 14:27:26,843 [main] INFO o.t.s.s.i.SqlAbstractDatabaseSchemaService - Installing SQL DataBase schema indexes part: schema-entities-idx.sql
2021-08-07 14:27:26,946 [main] INFO o.t.s.i.ThingsboardInstallService - Installing DataBase schema for timeseries...
2021-08-07 14:27:26,946 [main] INFO o.t.s.s.i.SqlAbstractDatabaseSchemaService - Installing SQL DataBase schema part: schema-ts-psql.sql
2021-08-07 14:27:27,083 [main] INFO o.t.s.s.i.SqlAbstractDatabaseSchemaService - Successfully executed query: CREATE TABLE IF NOT EXISTS ts_kv_indefinite PARTITION OF ts_kv DEFAULT;
2021-08-07 14:27:32,088 [main] INFO o.t.s.i.ThingsboardInstallService - Loading system data...
2021-08-07 14:27:32,481 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=FILTER, scope=TENANT, name=script, clazz=org.thingsboard.rule.engine.filter.TbJsFilterNode, configurationDescriptor={"nodeDefinition":{"details":"Evaluate incoming Message with configured JS condition. If <b>True</b> - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.Message payload can be accessed via <code>msg</code> property. For example <code>msg.temperature < 10;</code><br/>Message metadata can be accessed via <code>metadata</code> property. For example <code>metadata.customerName === 'John';</code><br/>Message type can be accessed via <code>msgType</code> property.","description":"Filter incoming messages using JS script","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"jsScript":"return msg.temperature > 20;"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeScriptConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:32,787 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=FILTER, scope=TENANT, name=script, clazz=org.thingsboard.rule.engine.filter.TbJsFilterNode, configurationDescriptor={"nodeDefinition":{"details":"Evaluate incoming Message with configured JS condition. If <b>True</b> - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.Message payload can be accessed via <code>msg</code> property. For example <code>msg.temperature < 10;</code><br/>Message metadata can be accessed via <code>metadata</code> property. For example <code>metadata.customerName === 'John';</code><br/>Message type can be accessed via <code>msgType</code> property.","description":"Filter incoming messages using JS script","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"jsScript":"return msg.temperature > 20;"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeScriptConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,130 [main] INFO c.d.oss.driver.api.core.uuid.Uuids - PID obtained through JMX: 15246
2021-08-07 14:27:33,460 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=rabbitmq, clazz=org.thingsboard.rule.engine.rabbitmq.TbRabbitMqNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to RabbitMQ queue.","description":"Publish messages to the RabbitMQ","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"exchangeNamePattern":"","routingKeyPattern":"","messageProperties":null,"host":"localhost","port":5672,"virtualHost":"/","username":"guest","password":"guest","automaticRecoveryEnabled":false,"connectionTimeout":60000,"handshakeTimeout":10000,"clientProperties":{}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRabbitMqConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHZlcnNpb249IjEuMSIgeT0iMHB4IiB4PSIwcHgiIHZpZXdCb3g9IjAgMCAxMDAwIDEwMDAiPjxwYXRoIHN0cm9rZS13aWR0aD0iLjg0OTU2IiBkPSJtODYwLjQ3IDQxNi4zMmgtMjYyLjAxYy0xMi45MTMgMC0yMy42MTgtMTAuNzA0LTIzLjYxOC0yMy42MTh2LTI3Mi43MWMwLTIwLjMwNS0xNi4yMjctMzYuMjc2LTM2LjI3Ni0zNi4yNzZoLTkzLjc5MmMtMjAuMzA1IDAtMzYuMjc2IDE2LjIyNy0zNi4yNzYgMzYuMjc2djI3MC44NGMtMC4yNTQ4NyAxNC4xMDMtMTEuNDY5IDI1LjU3Mi0yNS43NDIgMjUuNTcybC04NS42MzYgMC42Nzk2NWMtMTQuMTAzIDAtMjUuNTcyLTExLjQ2OS0yNS41NzItMjUuNTcybDAuNjc5NjUtMjcxLjUyYzAtMjAuMzA1LTE2LjIyNy0zNi4yNzYtMzYuMjc2LTM2LjI3NmgtOTMuNTM3Yy0yMC4zMDUgMC0zNi4yNzYgMTYuMjI3LTM2LjI3NiAzNi4yNzZ2NzYzLjg0YzAgMTguMDk2IDE0Ljc4MiAzMi40NTMgMzIuNDUzIDMyLjQ1M2g3MjIuODFjMTguMDk2IDAgMzIuNDUzLTE0Ljc4MiAzMi40NTMtMzIuNDUzdi00MzUuMzFjLTEuMTg5NC0xOC4xODEtMTUuMjkyLTMyLjE5OC0zMy4zODgtMzIuMTk4em0tMTIyLjY4IDI4Ny4wN2MwIDIzLjYxOC0xOC44NiA0Mi40NzgtNDIuNDc4IDQyLjQ3OGgtNzMuOTk3Yy0yMy42MTggMC00Mi40NzgtMTguODYtNDIuNDc4LTQyLjQ3OHYtNzQuMjUyYzAtMjMuNjE4IDE4Ljg2LTQyLjQ3OCA0Mi40NzgtNDIuNDc4aDczLjk5N2MyMy42MTggMCA0Mi40NzggMTguODYgNDIuNDc4IDQyLjQ3OHoiLz48L3N2Zz4=","docUrl":""}}, actions=null)
2021-08-07 14:27:33,466 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=rabbitmq, clazz=org.thingsboard.rule.engine.rabbitmq.TbRabbitMqNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to RabbitMQ queue.","description":"Publish messages to the RabbitMQ","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"exchangeNamePattern":"","routingKeyPattern":"","messageProperties":null,"host":"localhost","port":5672,"virtualHost":"/","username":"guest","password":"guest","automaticRecoveryEnabled":false,"connectionTimeout":60000,"handshakeTimeout":10000,"clientProperties":{}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRabbitMqConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHZlcnNpb249IjEuMSIgeT0iMHB4IiB4PSIwcHgiIHZpZXdCb3g9IjAgMCAxMDAwIDEwMDAiPjxwYXRoIHN0cm9rZS13aWR0aD0iLjg0OTU2IiBkPSJtODYwLjQ3IDQxNi4zMmgtMjYyLjAxYy0xMi45MTMgMC0yMy42MTgtMTAuNzA0LTIzLjYxOC0yMy42MTh2LTI3Mi43MWMwLTIwLjMwNS0xNi4yMjctMzYuMjc2LTM2LjI3Ni0zNi4yNzZoLTkzLjc5MmMtMjAuMzA1IDAtMzYuMjc2IDE2LjIyNy0zNi4yNzYgMzYuMjc2djI3MC44NGMtMC4yNTQ4NyAxNC4xMDMtMTEuNDY5IDI1LjU3Mi0yNS43NDIgMjUuNTcybC04NS42MzYgMC42Nzk2NWMtMTQuMTAzIDAtMjUuNTcyLTExLjQ2OS0yNS41NzItMjUuNTcybDAuNjc5NjUtMjcxLjUyYzAtMjAuMzA1LTE2LjIyNy0zNi4yNzYtMzYuMjc2LTM2LjI3NmgtOTMuNTM3Yy0yMC4zMDUgMC0zNi4yNzYgMTYuMjI3LTM2LjI3NiAzNi4yNzZ2NzYzLjg0YzAgMTguMDk2IDE0Ljc4MiAzMi40NTMgMzIuNDUzIDMyLjQ1M2g3MjIuODFjMTguMDk2IDAgMzIuNDUzLTE0Ljc4MiAzMi40NTMtMzIuNDUzdi00MzUuMzFjLTEuMTg5NC0xOC4xODEtMTUuMjkyLTMyLjE5OC0zMy4zODgtMzIuMTk4em0tMTIyLjY4IDI4Ny4wN2MwIDIzLjYxOC0xOC44NiA0Mi40NzgtNDIuNDc4IDQyLjQ3OGgtNzMuOTk3Yy0yMy42MTggMC00Mi40NzgtMTguODYtNDIuNDc4LTQyLjQ3OHYtNzQuMjUyYzAtMjMuNjE4IDE4Ljg2LTQyLjQ3OCA0Mi40NzgtNDIuNDc4aDczLjk5N2MyMy42MTggMCA0Mi40NzggMTguODYgNDIuNDc4IDQyLjQ3OHoiLz48L3N2Zz4=","docUrl":""}}, actions=null)
2021-08-07 14:27:33,495 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=synchronization start, clazz=org.thingsboard.rule.engine.transaction.TbSynchronizationBeginNode, configurationDescriptor={"nodeDefinition":{"details":"This node should be used together with \"synchronization end\" node. \n This node will put messages into queue based on message originator id. \nSubsequent messages will not be processed until the previous message processing is completed or timeout event occurs.\nSize of the queue per originator and timeout values are configurable on a system level","description":"This Node is now deprecated. Use \"Checkpoint\" instead.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,498 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=synchronization start, clazz=org.thingsboard.rule.engine.transaction.TbSynchronizationBeginNode, configurationDescriptor={"nodeDefinition":{"details":"This node should be used together with \"synchronization end\" node. \n This node will put messages into queue based on message originator id. \nSubsequent messages will not be processed until the previous message processing is completed or timeout event occurs.\nSize of the queue per originator and timeout values are configurable on a system level","description":"This Node is now deprecated. Use \"Checkpoint\" instead.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,536 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=gcp pubsub, clazz=org.thingsboard.rule.engine.gcp.pubsub.TbPubSubNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the Google Cloud Platform PubSub topic. Outbound message will contain response fields (<code>messageId</code> in the Message Metadata from the GCP PubSub. <b>messageId</b> field can be accessed with <code>metadata.messageId</code>.","description":"Publish message to the Google Cloud PubSub","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"projectId":"my-google-cloud-project-id","topicName":"my-pubsub-topic-name","messageAttributes":{},"serviceAccountKey":null,"serviceAccountKeyFileName":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodePubSubConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+Cjx0aXRsZT5DbG91ZCBQdWJTdWI8L3RpdGxlPgo8Zz4KPHBhdGggZD0iTTEyNi40Nyw1OC4xMmwtMjYuMy00NS43NEExMS41NiwxMS41NiwwLDAsMCw5MC4zMSw2LjVIMzcuN2ExMS41NSwxMS41NSwwLDAsMC05Ljg2LDUuODhMMS41Myw1OGExMS40OCwxMS40OCwwLDAsMCwwLDExLjQ0bDI2LjMsNDZhMTEuNzcsMTEuNzcsMCwwLDAsOS44Niw2LjA5SDkwLjNhMTEuNzMsMTEuNzMsMCwwLDAsOS44Ny02LjA2bDI2LjMtNDUuNzRBMTEuNzMsMTEuNzMsMCwwLDAsMTI2LjQ3LDU4LjEyWiIgc3R5bGU9ImZpbGw6ICM3MzViMmYiLz4KPHBhdGggZD0iTTg5LjIyLDQ3Ljc0LDgzLjM2LDQ5bC0xNC42LTE0LjZMNjQuMDksNDMuMSw2MS41NSw1My4ybDQuMjksNC4yOUw1Ny42LDU5LjE4LDQ2LjMsNDcuODhsLTcuNjcsNy4zOEw1Mi43Niw2OS4zN2wtMTUsMTEuOUw3OCwxMjEuNUg5MC4zYTExLjczLDExLjczLDAsMCwwLDkuODctNi4wNmwyMC43Mi0zNloiIHN0eWxlPSJvcGFjaXR5OiAwLjA3MDAwMDAwMDI5ODAyMztpc29sYXRpb246IGlzb2xhdGUiLz4KPHBhdGggZD0iTTgyLjg2LDQ3YTUuMzIsNS4zMiwwLDEsMS0xLjk1LDcuMjdBNS4zMiw1LjMyLDAsMCwxLDgyLjg2LDQ3IiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8cGF0aCBkPSJNMzkuODIsNTYuMThhNS4zMiw1LjMyLDAsMSwxLDcuMjctMS45NSw1LjMyLDUuMzIsMCwwLDEtNy4yNywxLjk1IiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8cGF0aCBkPSJNNjkuMzIsODguODVBNS4zMiw1LjMyLDAsMSwxLDY0LDgzLjUyYTUuMzIsNS4zMiwwLDAsMSw1LjMyLDUuMzIiIHN0eWxlPSJmaWxsOiAjZmZmIi8+CjxnPgo8cGF0aCBkPSJNNjQsNTIuOTRhMTEuMDYsMTEuMDYsMCwwLDEsMi40Ni4yOFYzOS4xNUg2MS41NFY1My4yMkExMS4wNiwxMS4wNiwwLDAsMSw2NCw1Mi45NFoiIHN0eWxlPSJmaWxsOiAjZmZmIi8+CjxwYXRoIGQ9Ik03NC41Nyw2Ny4yNmExMSwxMSwwLDAsMS0yLjQ3LDQuMjVsMTIuMTksNywyLjQ2LTQuMjZaIiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8cGF0aCBkPSJNNTMuNDMsNjcuMjZsLTEyLjE4LDcsMi40Niw0LjI2LDEyLjE5LTdBMTEsMTEsMCwwLDEsNTMuNDMsNjcuMjZaIiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8L2c+CjxwYXRoIGQ9Ik03Mi42LDY0QTguNiw4LjYsMCwxLDEsNjQsNTUuNCw4LjYsOC42LDAsMCwxLDcyLjYsNjQiIHN0eWxlPSJmaWxsOiAjZmZmIi8+CjxwYXRoIGQ9Ik0zOS4xLDcwLjU3YTYuNzYsNi43NiwwLDEsMS0yLjQ3LDkuMjMsNi43Niw2Ljc2LDAsMCwxLDIuNDctOS4yMyIgc3R5bGU9ImZpbGw6ICNmZmYiLz4KPHBhdGggZD0iTTgyLjE0LDgyLjI3YTYuNzYsNi43NiwwLDEsMSw5LjIzLTIuNDcsNi43NSw2Ljc1LDAsMCwxLTkuMjMsMi40NyIgc3R5bGU9ImZpbGw6ICNmZmYiLz4KPHBhdGggZD0iTTcwLjc2LDM5LjE1QTYuNzYsNi43NiwwLDEsMSw2NCwzMi4zOWE2Ljc2LDYuNzYsMCwwLDEsNi43Niw2Ljc2IiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8L2c+Cjwvc3ZnPgo=","docUrl":""}}, actions=null)
2021-08-07 14:27:33,540 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=gcp pubsub, clazz=org.thingsboard.rule.engine.gcp.pubsub.TbPubSubNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the Google Cloud Platform PubSub topic. Outbound message will contain response fields (<code>messageId</code> in the Message Metadata from the GCP PubSub. <b>messageId</b> field can be accessed with <code>metadata.messageId</code>.","description":"Publish message to the Google Cloud PubSub","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"projectId":"my-google-cloud-project-id","topicName":"my-pubsub-topic-name","messageAttributes":{},"serviceAccountKey":null,"serviceAccountKeyFileName":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodePubSubConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+Cjx0aXRsZT5DbG91ZCBQdWJTdWI8L3RpdGxlPgo8Zz4KPHBhdGggZD0iTTEyNi40Nyw1OC4xMmwtMjYuMy00NS43NEExMS41NiwxMS41NiwwLDAsMCw5MC4zMSw2LjVIMzcuN2ExMS41NSwxMS41NSwwLDAsMC05Ljg2LDUuODhMMS41Myw1OGExMS40OCwxMS40OCwwLDAsMCwwLDExLjQ0bDI2LjMsNDZhMTEuNzcsMTEuNzcsMCwwLDAsOS44Niw2LjA5SDkwLjNhMTEuNzMsMTEuNzMsMCwwLDAsOS44Ny02LjA2bDI2LjMtNDUuNzRBMTEuNzMsMTEuNzMsMCwwLDAsMTI2LjQ3LDU4LjEyWiIgc3R5bGU9ImZpbGw6ICM3MzViMmYiLz4KPHBhdGggZD0iTTg5LjIyLDQ3Ljc0LDgzLjM2LDQ5bC0xNC42LTE0LjZMNjQuMDksNDMuMSw2MS41NSw1My4ybDQuMjksNC4yOUw1Ny42LDU5LjE4LDQ2LjMsNDcuODhsLTcuNjcsNy4zOEw1Mi43Niw2OS4zN2wtMTUsMTEuOUw3OCwxMjEuNUg5MC4zYTExLjczLDExLjczLDAsMCwwLDkuODctNi4wNmwyMC43Mi0zNloiIHN0eWxlPSJvcGFjaXR5OiAwLjA3MDAwMDAwMDI5ODAyMztpc29sYXRpb246IGlzb2xhdGUiLz4KPHBhdGggZD0iTTgyLjg2LDQ3YTUuMzIsNS4zMiwwLDEsMS0xLjk1LDcuMjdBNS4zMiw1LjMyLDAsMCwxLDgyLjg2LDQ3IiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8cGF0aCBkPSJNMzkuODIsNTYuMThhNS4zMiw1LjMyLDAsMSwxLDcuMjctMS45NSw1LjMyLDUuMzIsMCwwLDEtNy4yNywxLjk1IiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8cGF0aCBkPSJNNjkuMzIsODguODVBNS4zMiw1LjMyLDAsMSwxLDY0LDgzLjUyYTUuMzIsNS4zMiwwLDAsMSw1LjMyLDUuMzIiIHN0eWxlPSJmaWxsOiAjZmZmIi8+CjxnPgo8cGF0aCBkPSJNNjQsNTIuOTRhMTEuMDYsMTEuMDYsMCwwLDEsMi40Ni4yOFYzOS4xNUg2MS41NFY1My4yMkExMS4wNiwxMS4wNiwwLDAsMSw2NCw1Mi45NFoiIHN0eWxlPSJmaWxsOiAjZmZmIi8+CjxwYXRoIGQ9Ik03NC41Nyw2Ny4yNmExMSwxMSwwLDAsMS0yLjQ3LDQuMjVsMTIuMTksNywyLjQ2LTQuMjZaIiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8cGF0aCBkPSJNNTMuNDMsNjcuMjZsLTEyLjE4LDcsMi40Niw0LjI2LDEyLjE5LTdBMTEsMTEsMCwwLDEsNTMuNDMsNjcuMjZaIiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8L2c+CjxwYXRoIGQ9Ik03Mi42LDY0QTguNiw4LjYsMCwxLDEsNjQsNTUuNCw4LjYsOC42LDAsMCwxLDcyLjYsNjQiIHN0eWxlPSJmaWxsOiAjZmZmIi8+CjxwYXRoIGQ9Ik0zOS4xLDcwLjU3YTYuNzYsNi43NiwwLDEsMS0yLjQ3LDkuMjMsNi43Niw2Ljc2LDAsMCwxLDIuNDctOS4yMyIgc3R5bGU9ImZpbGw6ICNmZmYiLz4KPHBhdGggZD0iTTgyLjE0LDgyLjI3YTYuNzYsNi43NiwwLDEsMSw5LjIzLTIuNDcsNi43NSw2Ljc1LDAsMCwxLTkuMjMsMi40NyIgc3R5bGU9ImZpbGw6ICNmZmYiLz4KPHBhdGggZD0iTTcwLjc2LDM5LjE1QTYuNzYsNi43NiwwLDEsMSw2NCwzMi4zOWE2Ljc2LDYuNzYsMCwwLDEsNi43Niw2Ljc2IiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8L2c+Cjwvc3ZnPgo=","docUrl":""}}, actions=null)
2021-08-07 14:27:33,563 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=send email, clazz=org.thingsboard.rule.engine.mail.TbSendEmailNode, configurationDescriptor={"nodeDefinition":{"details":"Expects messages with <b>SEND_EMAIL</b> type. Node works only with messages that where created using <code>to Email</code> transformation Node, please connect this Node with <code>to Email</code> Node using <code>Successful</code> chain.","description":"Sends email message via SMTP server.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"useSystemSmtpSettings":true,"smtpHost":"localhost","smtpPort":25,"username":null,"password":null,"smtpProtocol":"smtp","timeout":10000,"enableTls":false,"tlsVersion":"TLSv1.2","enableProxy":false,"proxyHost":null,"proxyPort":null,"proxyUser":null,"proxyPassword":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSendEmailConfig","icon":"send","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,575 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=send email, clazz=org.thingsboard.rule.engine.mail.TbSendEmailNode, configurationDescriptor={"nodeDefinition":{"details":"Expects messages with <b>SEND_EMAIL</b> type. Node works only with messages that where created using <code>to Email</code> transformation Node, please connect this Node with <code>to Email</code> Node using <code>Successful</code> chain.","description":"Sends email message via SMTP server.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"useSystemSmtpSettings":true,"smtpHost":"localhost","smtpPort":25,"username":null,"password":null,"smtpProtocol":"smtp","timeout":10000,"enableTls":false,"tlsVersion":"TLSv1.2","enableProxy":false,"proxyHost":null,"proxyPort":null,"proxyUser":null,"proxyPassword":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSendEmailConfig","icon":"send","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,635 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=tenant details, clazz=org.thingsboard.rule.engine.metadata.TbGetTenantDetailsNode, configurationDescriptor={"nodeDefinition":{"details":"If checkbox: <b>Add selected details to the message metadata</b> is selected, existing fields will be added to the message metadata instead of message data.<br><br><b>Note:</b> only Device, Asset, and Entity View type are allowed.<br><br>If the originator of the message is not assigned to Tenant, or originator type is not supported - Message will be forwarded to <b>Failure</b> chain, otherwise, <b>Success</b> chain will be used.","description":"Adds fields from Tenant details to the message body or metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"detailsList":[],"addToMetadata":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeEntityDetailsConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,639 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=tenant details, clazz=org.thingsboard.rule.engine.metadata.TbGetTenantDetailsNode, configurationDescriptor={"nodeDefinition":{"details":"If checkbox: <b>Add selected details to the message metadata</b> is selected, existing fields will be added to the message metadata instead of message data.<br><br><b>Note:</b> only Device, Asset, and Entity View type are allowed.<br><br>If the originator of the message is not assigned to Tenant, or originator type is not supported - Message will be forwarded to <b>Failure</b> chain, otherwise, <b>Success</b> chain will be used.","description":"Adds fields from Tenant details to the message body or metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"detailsList":[],"addToMetadata":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeEntityDetailsConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,658 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=save attributes, clazz=org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode, configurationDescriptor={"nodeDefinition":{"details":"Saves entity attributes based on configurable scope parameter. Expects messages with 'POST_ATTRIBUTES_REQUEST' message type","description":"Saves attributes data","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"scope":"SERVER_SCOPE","notifyDevice":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeAttributesConfig","icon":"file_upload","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,661 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=save attributes, clazz=org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode, configurationDescriptor={"nodeDefinition":{"details":"Saves entity attributes based on configurable scope parameter. Expects messages with 'POST_ATTRIBUTES_REQUEST' message type","description":"Saves attributes data","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"scope":"SERVER_SCOPE","notifyDevice":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeAttributesConfig","icon":"file_upload","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,747 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=create relation, clazz=org.thingsboard.rule.engine.action.TbCreateRelationNode, configurationDescriptor={"nodeDefinition":{"details":"If the relation already exists or successfully created - Message send via <b>Success</b> chain, otherwise <b>Failure</b> chain will be used.","description":"Finds target Entity by entity name pattern and (entity type pattern for Asset, Device) and then create a relation to Originator Entity by type and direction. If Selected entity type: Asset, Device or Customer will create new Entity if it doesn't exist and selected checkbox 'Create new entity if not exists'.<br> In case that relation from the message originator to the selected entity not exist and If selected checkbox 'Remove current relations', before creating the new relation all existed relations to message originator by type and direction will be removed.<br> If relation from the message originator to the selected entity created and If selected checkbox 'Change originator to related entity', outbound message will be processed as a message from this entity.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"direction":"FROM","relationType":"Contains","entityType":null,"entityNamePattern":"","entityTypePattern":null,"entityCacheExpiration":300,"createEntityIfNotExists":false,"changeOriginatorToRelatedEntity":false,"removeCurrentRelations":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCreateRelationConfig","icon":"add_circle","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,765 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=create relation, clazz=org.thingsboard.rule.engine.action.TbCreateRelationNode, configurationDescriptor={"nodeDefinition":{"details":"If the relation already exists or successfully created - Message send via <b>Success</b> chain, otherwise <b>Failure</b> chain will be used.","description":"Finds target Entity by entity name pattern and (entity type pattern for Asset, Device) and then create a relation to Originator Entity by type and direction. If Selected entity type: Asset, Device or Customer will create new Entity if it doesn't exist and selected checkbox 'Create new entity if not exists'.<br> In case that relation from the message originator to the selected entity not exist and If selected checkbox 'Remove current relations', before creating the new relation all existed relations to message originator by type and direction will be removed.<br> If relation from the message originator to the selected entity created and If selected checkbox 'Change originator to related entity', outbound message will be processed as a message from this entity.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"direction":"FROM","relationType":"Contains","entityType":null,"entityNamePattern":"","entityTypePattern":null,"entityCacheExpiration":300,"createEntityIfNotExists":false,"changeOriginatorToRelatedEntity":false,"removeCurrentRelations":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCreateRelationConfig","icon":"add_circle","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,846 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=generator, clazz=org.thingsboard.rule.engine.debug.TbMsgGeneratorNode, configurationDescriptor={"nodeDefinition":{"details":"Generates messages with configurable period. Javascript function used for message generation.","description":"Periodically generates messages","inEnabled":false,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"msgCount":0,"periodInSeconds":1,"originatorId":null,"originatorType":null,"jsScript":"var msg = { temp: 42, humidity: 77 };\nvar metadata = { data: 40 };\nvar msgType = \"POST_TELEMETRY_REQUEST\";\n\nreturn { msg: msg, metadata: metadata, msgType: msgType };"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeGeneratorConfig","icon":"repeat","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,861 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=generator, clazz=org.thingsboard.rule.engine.debug.TbMsgGeneratorNode, configurationDescriptor={"nodeDefinition":{"details":"Generates messages with configurable period. Javascript function used for message generation.","description":"Periodically generates messages","inEnabled":false,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"msgCount":0,"periodInSeconds":1,"originatorId":null,"originatorType":null,"jsScript":"var msg = { temp: 42, humidity: 77 };\nvar metadata = { data: 40 };\nvar msgType = \"POST_TELEMETRY_REQUEST\";\n\nreturn { msg: msg, metadata: metadata, msgType: msgType };"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeGeneratorConfig","icon":"repeat","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,892 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=delay, clazz=org.thingsboard.rule.engine.delay.TbMsgDelayNode, configurationDescriptor={"nodeDefinition":{"details":"Delays messages for configurable period. Please note, this node acknowledges the message from the current queue (message will be removed from queue)","description":"Delays incoming message","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"periodInSeconds":60,"maxPendingMsgs":1000,"periodInSecondsPattern":null,"useMetadataPeriodInSecondsPatterns":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeMsgDelayConfig","icon":"pause","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,896 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=delay, clazz=org.thingsboard.rule.engine.delay.TbMsgDelayNode, configurationDescriptor={"nodeDefinition":{"details":"Delays messages for configurable period. Please note, this node acknowledges the message from the current queue (message will be removed from queue)","description":"Delays incoming message","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"periodInSeconds":60,"maxPendingMsgs":1000,"periodInSecondsPattern":null,"useMetadataPeriodInSecondsPatterns":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeMsgDelayConfig","icon":"pause","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,940 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=originator fields, clazz=org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode, configurationDescriptor={"nodeDefinition":{"details":"Will fetch fields values specified in mapping. If specified field is not part of originator fields it will be ignored.","description":"Add Message Originator fields values into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"fieldsMapping":{"name":"originatorName","type":"originatorType"}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeOriginatorFieldsConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:33,946 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=originator fields, clazz=org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode, configurationDescriptor={"nodeDefinition":{"details":"Will fetch fields values specified in mapping. If specified field is not part of originator fields it will be ignored.","description":"Add Message Originator fields values into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"fieldsMapping":{"name":"originatorName","type":"originatorType"}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeOriginatorFieldsConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,061 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=create alarm, clazz=org.thingsboard.rule.engine.action.TbCreateAlarmNode, configurationDescriptor={"nodeDefinition":{"details":"Details - JS function that creates JSON object based on incoming message. This object will be added into Alarm.details field.\nNode output:\nIf alarm was not created, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'metadata' will contains one of those properties 'isNewAlarm/isExistingAlarm'. Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.","description":"Create or Update Alarm","inEnabled":true,"outEnabled":true,"relationTypes":["Created","Updated","False","Failure"],"customRelations":false,"defaultConfiguration":{"alarmType":"General Alarm","alarmDetailsBuildJs":"var details = {};\nif (metadata.prevAlarmDetails) {\n details = JSON.parse(metadata.prevAlarmDetails);\n}\nreturn details;","severity":"CRITICAL","propagate":false,"useMessageAlarmData":false,"relationTypes":[]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCreateAlarmConfig","icon":"notifications_active","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,078 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=create alarm, clazz=org.thingsboard.rule.engine.action.TbCreateAlarmNode, configurationDescriptor={"nodeDefinition":{"details":"Details - JS function that creates JSON object based on incoming message. This object will be added into Alarm.details field.\nNode output:\nIf alarm was not created, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'metadata' will contains one of those properties 'isNewAlarm/isExistingAlarm'. Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.","description":"Create or Update Alarm","inEnabled":true,"outEnabled":true,"relationTypes":["Created","Updated","False","Failure"],"customRelations":false,"defaultConfiguration":{"alarmType":"General Alarm","alarmDetailsBuildJs":"var details = {};\nif (metadata.prevAlarmDetails) {\n details = JSON.parse(metadata.prevAlarmDetails);\n}\nreturn details;","severity":"CRITICAL","propagate":false,"useMessageAlarmData":false,"relationTypes":[]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCreateAlarmConfig","icon":"notifications_active","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,142 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=related attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetRelatedAttributeNode, configurationDescriptor={"nodeDefinition":{"details":"Related Entity found using configured relation direction and Relation Type. If multiple Related Entities are found, only first Entity is used for attributes enrichment, other entities are discarded. If Attributes enrichment configured, server scope attributes are added into Message metadata. If Latest Telemetry enrichment configured, latest telemetry added into metadata. To access those attributes in other nodes this template can be used <code>metadata.temperature</code>.","description":"Add Originators Related Entity Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"attrMapping":{"temperature":"tempo"},"relationsQuery":{"direction":"FROM","maxLevel":1,"filters":[{"relationType":"Contains","entityTypes":[]}],"fetchLastLevelOnly":false},"telemetry":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeRelatedAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,146 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=related attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetRelatedAttributeNode, configurationDescriptor={"nodeDefinition":{"details":"Related Entity found using configured relation direction and Relation Type. If multiple Related Entities are found, only first Entity is used for attributes enrichment, other entities are discarded. If Attributes enrichment configured, server scope attributes are added into Message metadata. If Latest Telemetry enrichment configured, latest telemetry added into metadata. To access those attributes in other nodes this template can be used <code>metadata.temperature</code>.","description":"Add Originators Related Entity Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"attrMapping":{"temperature":"tempo"},"relationsQuery":{"direction":"FROM","maxLevel":1,"filters":[{"relationType":"Contains","entityTypes":[]}],"fetchLastLevelOnly":false},"telemetry":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeRelatedAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,178 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=TRANSFORMATION, scope=TENANT, name=to email, clazz=org.thingsboard.rule.engine.mail.TbMsgToEmailNode, configurationDescriptor={"nodeDefinition":{"details":"Transforms message to email message by populating email fields using values derived from message metadata. Set 'SEND_EMAIL' output message type.","description":"Transforms message to email message","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"fromTemplate":"info@testmail.org","toTemplate":"${userEmail}","ccTemplate":null,"bccTemplate":null,"subjectTemplate":"Device ${deviceType} temperature high","bodyTemplate":"Device ${deviceName} has high temperature ${temp}"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbTransformationNodeToEmailConfig","icon":"email","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,182 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=TRANSFORMATION, scope=TENANT, name=to email, clazz=org.thingsboard.rule.engine.mail.TbMsgToEmailNode, configurationDescriptor={"nodeDefinition":{"details":"Transforms message to email message by populating email fields using values derived from message metadata. Set 'SEND_EMAIL' output message type.","description":"Transforms message to email message","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"fromTemplate":"info@testmail.org","toTemplate":"${userEmail}","ccTemplate":null,"bccTemplate":null,"subjectTemplate":"Device ${deviceType} temperature high","bodyTemplate":"Device ${deviceName} has high temperature ${temp}"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbTransformationNodeToEmailConfig","icon":"email","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,227 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=TRANSFORMATION, scope=TENANT, name=change originator, clazz=org.thingsboard.rule.engine.transform.TbChangeOriginatorNode, configurationDescriptor={"nodeDefinition":{"details":"Related Entity found using configured relation direction and Relation Type. If multiple Related Entities are found, only first Entity is used as new Originator, other entities are discarded.<br/>Alarm Originator found only in case original Originator is <code>Alarm</code> entity.","description":"Change Message Originator To Tenant/Customer/Related Entity/Alarm Originator","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"originatorSource":"CUSTOMER","relationsQuery":{"direction":"FROM","maxLevel":1,"filters":[{"relationType":"Contains","entityTypes":[]}],"fetchLastLevelOnly":false}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbTransformationNodeChangeOriginatorConfig","icon":"find_replace","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,231 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=TRANSFORMATION, scope=TENANT, name=change originator, clazz=org.thingsboard.rule.engine.transform.TbChangeOriginatorNode, configurationDescriptor={"nodeDefinition":{"details":"Related Entity found using configured relation direction and Relation Type. If multiple Related Entities are found, only first Entity is used as new Originator, other entities are discarded.<br/>Alarm Originator found only in case original Originator is <code>Alarm</code> entity.","description":"Change Message Originator To Tenant/Customer/Related Entity/Alarm Originator","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"originatorSource":"CUSTOMER","relationsQuery":{"direction":"FROM","maxLevel":1,"filters":[{"relationType":"Contains","entityTypes":[]}],"fetchLastLevelOnly":false}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbTransformationNodeChangeOriginatorConfig","icon":"find_replace","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,261 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=device profile, clazz=org.thingsboard.rule.engine.profile.TbDeviceProfileNode, configurationDescriptor={"nodeDefinition":{"details":"Create and clear alarms based on alarm rules defined in device profile. The output relation type is either 'Alarm Created', 'Alarm Updated', 'Alarm Severity Updated' and 'Alarm Cleared' or simply 'Success' if no alarms were affected.","description":"Process device messages based on device profile settings","inEnabled":true,"outEnabled":true,"relationTypes":["Alarm Created","Alarm Updated","Alarm Severity Updated","Alarm Cleared","Success","Failure"],"customRelations":true,"defaultConfiguration":{"persistAlarmRulesState":false,"fetchAlarmRulesStateOnStart":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbDeviceProfileConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,268 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=device profile, clazz=org.thingsboard.rule.engine.profile.TbDeviceProfileNode, configurationDescriptor={"nodeDefinition":{"details":"Create and clear alarms based on alarm rules defined in device profile. The output relation type is either 'Alarm Created', 'Alarm Updated', 'Alarm Severity Updated' and 'Alarm Cleared' or simply 'Success' if no alarms were affected.","description":"Process device messages based on device profile settings","inEnabled":true,"outEnabled":true,"relationTypes":["Alarm Created","Alarm Updated","Alarm Severity Updated","Alarm Cleared","Success","Failure"],"customRelations":true,"defaultConfiguration":{"persistAlarmRulesState":false,"fetchAlarmRulesStateOnStart":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbDeviceProfileConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,327 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=log, clazz=org.thingsboard.rule.engine.action.TbLogNode, configurationDescriptor={"nodeDefinition":{"details":"Transform incoming Message with configured JS function to String and log final value into Thingsboard log file. Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.","description":"Log incoming messages using JS script for transformation Message into String","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"jsScript":"return 'Incoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeLogConfig","icon":"menu","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,356 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=log, clazz=org.thingsboard.rule.engine.action.TbLogNode, configurationDescriptor={"nodeDefinition":{"details":"Transform incoming Message with configured JS function to String and log final value into Thingsboard log file. Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.","description":"Log incoming messages using JS script for transformation Message into String","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"jsScript":"return 'Incoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeLogConfig","icon":"menu","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,429 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=FILTER, scope=TENANT, name=check alarm status, clazz=org.thingsboard.rule.engine.filter.TbCheckAlarmStatusNode, configurationDescriptor={"nodeDefinition":{"details":"If the alarm status matches the specified one - msg is success if does not match - msg is failure.","description":"Checks alarm status.","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"alarmStatusList":["ACTIVE_ACK","ACTIVE_UNACK"]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeCheckAlarmStatusConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,433 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=FILTER, scope=TENANT, name=check alarm status, clazz=org.thingsboard.rule.engine.filter.TbCheckAlarmStatusNode, configurationDescriptor={"nodeDefinition":{"details":"If the alarm status matches the specified one - msg is success if does not match - msg is failure.","description":"Checks alarm status.","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"alarmStatusList":["ACTIVE_ACK","ACTIVE_UNACK"]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeCheckAlarmStatusConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,508 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=FILTER, scope=TENANT, name=gps geofencing filter, clazz=org.thingsboard.rule.engine.geo.TbGpsGeofencingFilterNode, configurationDescriptor={"nodeDefinition":{"details":"Extracts latitude and longitude parameters from incoming message and returns 'True' if they are inside configured perimeters, 'False' otherwise.","description":"Filter incoming messages by GPS based geofencing","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"latitudeKeyName":"latitude","longitudeKeyName":"longitude","fetchPerimeterInfoFromMessageMetadata":true,"perimeterType":null,"polygonsDefinition":null,"centerLatitude":null,"centerLongitude":null,"range":null,"rangeUnit":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeGpsGeofencingConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,513 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=FILTER, scope=TENANT, name=gps geofencing filter, clazz=org.thingsboard.rule.engine.geo.TbGpsGeofencingFilterNode, configurationDescriptor={"nodeDefinition":{"details":"Extracts latitude and longitude parameters from incoming message and returns 'True' if they are inside configured perimeters, 'False' otherwise.","description":"Filter incoming messages by GPS based geofencing","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"latitudeKeyName":"latitude","longitudeKeyName":"longitude","fetchPerimeterInfoFromMessageMetadata":true,"perimeterType":null,"polygonsDefinition":null,"centerLatitude":null,"centerLongitude":null,"range":null,"rangeUnit":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeGpsGeofencingConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,556 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=FILTER, scope=TENANT, name=message type switch, clazz=org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode, configurationDescriptor={"nodeDefinition":{"details":"Sends messages with message types <b>\"Post attributes\", \"Post telemetry\", \"RPC Request\"</b> etc. via corresponding chain, otherwise <b>Other</b> chain is used.","description":"Route incoming messages by Message Type","inEnabled":true,"outEnabled":true,"relationTypes":["Post attributes","Post telemetry","RPC Request from Device","RPC Request to Device","Activity Event","Inactivity Event","Connect Event","Disconnect Event","Entity Created","Entity Updated","Entity Deleted","Entity Assigned","Entity Unassigned","Attributes Updated","Attributes Deleted","Alarm Acknowledged","Alarm Cleared","Other","Entity Assigned From Tenant","Entity Assigned To Tenant","Timeseries Updated","Timeseries Deleted","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,579 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=FILTER, scope=TENANT, name=message type switch, clazz=org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode, configurationDescriptor={"nodeDefinition":{"details":"Sends messages with message types <b>\"Post attributes\", \"Post telemetry\", \"RPC Request\"</b> etc. via corresponding chain, otherwise <b>Other</b> chain is used.","description":"Route incoming messages by Message Type","inEnabled":true,"outEnabled":true,"relationTypes":["Post attributes","Post telemetry","RPC Request from Device","RPC Request to Device","Activity Event","Inactivity Event","Connect Event","Disconnect Event","Entity Created","Entity Updated","Entity Deleted","Entity Assigned","Entity Unassigned","Attributes Updated","Attributes Deleted","Alarm Acknowledged","Alarm Cleared","Other","Entity Assigned From Tenant","Entity Assigned To Tenant","Timeseries Updated","Timeseries Deleted","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,629 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=unassign from customer, clazz=org.thingsboard.rule.engine.action.TbUnassignFromCustomerNode, configurationDescriptor={"nodeDefinition":{"details":"Finds target Entity Customer by Customer name pattern and then unassign Originator Entity from this customer.","description":"Unassign Message Originator Entity from Customer","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"customerNamePattern":"","customerCacheExpiration":300},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeUnAssignToCustomerConfig","icon":"remove_circle","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,633 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=unassign from customer, clazz=org.thingsboard.rule.engine.action.TbUnassignFromCustomerNode, configurationDescriptor={"nodeDefinition":{"details":"Finds target Entity Customer by Customer name pattern and then unassign Originator Entity from this customer.","description":"Unassign Message Originator Entity from Customer","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"customerNamePattern":"","customerCacheExpiration":300},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeUnAssignToCustomerConfig","icon":"remove_circle","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,650 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=copy to view, clazz=org.thingsboard.rule.engine.action.TbCopyAttributesToEntityViewNode, configurationDescriptor={"nodeDefinition":{"details":"Copy attributes from asset/device to related entity view according to entity view configuration. \n Copy will be done only for attributes that are between start and end dates and according to attribute keys configuration. \nChanges message originator to related entity view and produces new messages according to count of updated entity views","description":"Copy attributes from asset/device to entity view and changes message originator to related entity view","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"content_copy","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,657 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=copy to view, clazz=org.thingsboard.rule.engine.action.TbCopyAttributesToEntityViewNode, configurationDescriptor={"nodeDefinition":{"details":"Copy attributes from asset/device to related entity view according to entity view configuration. \n Copy will be done only for attributes that are between start and end dates and according to attribute keys configuration. \nChanges message originator to related entity view and produces new messages according to count of updated entity views","description":"Copy attributes from asset/device to entity view and changes message originator to related entity view","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"content_copy","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,678 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=clear alarm, clazz=org.thingsboard.rule.engine.action.TbClearAlarmNode, configurationDescriptor={"nodeDefinition":{"details":"Details - JS function that creates JSON object based on incoming message. This object will be added into Alarm.details field.\nNode output:\nIf alarm was not cleared, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'metadata' will contains 'isClearedAlarm' property. Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.","description":"Clear Alarm","inEnabled":true,"outEnabled":true,"relationTypes":["Cleared","False","Failure"],"customRelations":false,"defaultConfiguration":{"alarmType":"General Alarm","alarmDetailsBuildJs":"var details = {};\nif (metadata.prevAlarmDetails) {\n details = JSON.parse(metadata.prevAlarmDetails);\n}\nreturn details;"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeClearAlarmConfig","icon":"notifications_off","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,682 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=clear alarm, clazz=org.thingsboard.rule.engine.action.TbClearAlarmNode, configurationDescriptor={"nodeDefinition":{"details":"Details - JS function that creates JSON object based on incoming message. This object will be added into Alarm.details field.\nNode output:\nIf alarm was not cleared, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'metadata' will contains 'isClearedAlarm' property. Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.","description":"Clear Alarm","inEnabled":true,"outEnabled":true,"relationTypes":["Cleared","False","Failure"],"customRelations":false,"defaultConfiguration":{"alarmType":"General Alarm","alarmDetailsBuildJs":"var details = {};\nif (metadata.prevAlarmDetails) {\n details = JSON.parse(metadata.prevAlarmDetails);\n}\nreturn details;"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeClearAlarmConfig","icon":"notifications_off","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,726 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=save to custom table, clazz=org.thingsboard.rule.engine.action.TbSaveToCustomCassandraTableNode, configurationDescriptor={"nodeDefinition":{"details":"Administrator should set the custom table name without prefix: <b>cs_tb_</b>. <br>Administrator can configure the mapping between the Message field names and Table columns name.<br><b>Note:</b>If the mapping key is <b>$entity_id</b>, that is identified by the Message Originator, then to the appropriate column name(mapping value) will be write the message originator id.<br><br>If specified message field does not exist or is not a JSON Primitive, the outbound message will be routed via <b>failure</b> chain, otherwise, the message will be routed via <b>success</b> chain.","description":"Node stores data from incoming Message payload to the Cassandra database into the predefined custom table that should have <b>cs_tb_</b> prefix, to avoid the data insertion to the common TB tables.<br><b>Note:</b> rule node can be used only for Cassandra DB.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"tableName":"","fieldsMapping":{"":""}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCustomTableConfig","icon":"file_upload","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,742 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=save to custom table, clazz=org.thingsboard.rule.engine.action.TbSaveToCustomCassandraTableNode, configurationDescriptor={"nodeDefinition":{"details":"Administrator should set the custom table name without prefix: <b>cs_tb_</b>. <br>Administrator can configure the mapping between the Message field names and Table columns name.<br><b>Note:</b>If the mapping key is <b>$entity_id</b>, that is identified by the Message Originator, then to the appropriate column name(mapping value) will be write the message originator id.<br><br>If specified message field does not exist or is not a JSON Primitive, the outbound message will be routed via <b>failure</b> chain, otherwise, the message will be routed via <b>success</b> chain.","description":"Node stores data from incoming Message payload to the Cassandra database into the predefined custom table that should have <b>cs_tb_</b> prefix, to avoid the data insertion to the common TB tables.<br><b>Note:</b> rule node can be used only for Cassandra DB.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"tableName":"","fieldsMapping":{"":""}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCustomTableConfig","icon":"file_upload","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,841 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=calculate delta, clazz=org.thingsboard.rule.engine.metadata.CalculateDeltaNode, configurationDescriptor={"nodeDefinition":{"details":"Calculates delta and period based on the previous time-series reading and current data. Delta calculation is done in scope of the message originator, e.g. device, asset or customer. If there is input key, the output relation will be 'Success' unless delta is negative and corresponding configuration parameter is set. If there is no input value key in the incoming message, the output relation will be 'Other'.","description":"Calculates and adds 'delta' value into message based on the incoming and previous value","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure","Other"],"customRelations":false,"defaultConfiguration":{"inputValueKey":"pulseCounter","outputValueKey":"delta","useCache":true,"addPeriodBetweenMsgs":false,"periodValueKey":"periodInMs","round":null,"tellFailureIfDeltaIsNegative":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeCalculateDeltaConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,847 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=calculate delta, clazz=org.thingsboard.rule.engine.metadata.CalculateDeltaNode, configurationDescriptor={"nodeDefinition":{"details":"Calculates delta and period based on the previous time-series reading and current data. Delta calculation is done in scope of the message originator, e.g. device, asset or customer. If there is input key, the output relation will be 'Success' unless delta is negative and corresponding configuration parameter is set. If there is no input value key in the incoming message, the output relation will be 'Other'.","description":"Calculates and adds 'delta' value into message based on the incoming and previous value","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure","Other"],"customRelations":false,"defaultConfiguration":{"inputValueKey":"pulseCounter","outputValueKey":"delta","useCache":true,"addPeriodBetweenMsgs":false,"periodValueKey":"periodInMs","round":null,"tellFailureIfDeltaIsNegative":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeCalculateDeltaConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,877 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=originator attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetAttributesNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, <b>CLIENT/SHARED/SERVER</b> attributes are added into Message metadata with specific prefix: <i>cs/shared/ss</i>. Latest telemetry value added into metadata without prefix. To access those attributes in other nodes this template can be used <code>metadata.cs_temperature</code> or <code>metadata.shared_limit</code> ","description":"Add Message Originator Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"clientAttributeNames":[],"sharedAttributeNames":[],"serverAttributeNames":[],"latestTsKeyNames":[],"tellFailureIfAbsent":true,"getLatestValueWithTs":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeOriginatorAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,882 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=originator attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetAttributesNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, <b>CLIENT/SHARED/SERVER</b> attributes are added into Message metadata with specific prefix: <i>cs/shared/ss</i>. Latest telemetry value added into metadata without prefix. To access those attributes in other nodes this template can be used <code>metadata.cs_temperature</code> or <code>metadata.shared_limit</code> ","description":"Add Message Originator Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"clientAttributeNames":[],"sharedAttributeNames":[],"serverAttributeNames":[],"latestTsKeyNames":[],"tellFailureIfAbsent":true,"getLatestValueWithTs":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeOriginatorAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,927 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=FILTER, scope=TENANT, name=message type, clazz=org.thingsboard.rule.engine.filter.TbMsgTypeFilterNode, configurationDescriptor={"nodeDefinition":{"details":"If incoming MessageType is expected - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.","description":"Filter incoming messages by Message Type","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"messageTypes":["POST_ATTRIBUTES_REQUEST","POST_TELEMETRY_REQUEST","TO_SERVER_RPC_REQUEST"]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeMessageTypeConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,931 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=FILTER, scope=TENANT, name=message type, clazz=org.thingsboard.rule.engine.filter.TbMsgTypeFilterNode, configurationDescriptor={"nodeDefinition":{"details":"If incoming MessageType is expected - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.","description":"Filter incoming messages by Message Type","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"messageTypes":["POST_ATTRIBUTES_REQUEST","POST_TELEMETRY_REQUEST","TO_SERVER_RPC_REQUEST"]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeMessageTypeConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,965 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=checkpoint, clazz=org.thingsboard.rule.engine.flow.TbCheckpointNode, configurationDescriptor={"nodeDefinition":{"details":"After successful transfer incoming message is automatically acknowledged. Queue name is configurable.","description":"transfers the message to another queue","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"queueName":"HighPriority"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCheckPointConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:34,975 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=checkpoint, clazz=org.thingsboard.rule.engine.flow.TbCheckpointNode, configurationDescriptor={"nodeDefinition":{"details":"After successful transfer incoming message is automatically acknowledged. Queue name is configurable.","description":"transfers the message to another queue","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"queueName":"HighPriority"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCheckPointConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,066 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=aws sqs, clazz=org.thingsboard.rule.engine.aws.sqs.TbSqsNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload and metadata attributes to the AWS SQS queue. Outbound message will contain response fields (<code>messageId</code>, <code>requestId</code>, <code>messageBodyMd5</code>, <code>messageAttributesMd5</code>, <code>sequenceNumber</code>) in the Message Metadata from the AWS SQS. For example <b>requestId</b> field can be accessed with <code>metadata.requestId</code>.","description":"Publish messages to the AWS SQS","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"queueType":"STANDARD","queueUrlPattern":"https://sqs.us-east-1.amazonaws.com/123456789012/my-queue-name","delaySeconds":0,"messageAttributes":{},"accessKeyId":null,"secretAccessKey":null,"region":"us-east-1"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSqsConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48cGF0aCBkPSJNMTMuMjMgMTAuNTZWMTBjLTEuOTQgMC0zLjk5LjM5LTMuOTkgMi42NyAwIDEuMTYuNjEgMS45NSAxLjYzIDEuOTUuNzYgMCAxLjQzLS40NyAxLjg2LTEuMjIuNTItLjkzLjUtMS44LjUtMi44NG0yLjcgNi41M2MtLjE4LjE2LS40My4xNy0uNjMuMDYtLjg5LS43NC0xLjA1LTEuMDgtMS41NC0xLjc5LTEuNDcgMS41LTIuNTEgMS45NS00LjQyIDEuOTUtMi4yNSAwLTQuMDEtMS4zOS00LjAxLTQuMTcgMC0yLjE4IDEuMTctMy42NCAyLjg2LTQuMzggMS40Ni0uNjQgMy40OS0uNzYgNS4wNC0uOTNWNy41YzAtLjY2LjA1LTEuNDEtLjMzLTEuOTYtLjMyLS40OS0uOTUtLjctMS41LS43LTEuMDIgMC0xLjkzLjUzLTIuMTUgMS42MS0uMDUuMjQtLjI1LjQ4LS40Ny40OWwtMi42LS4yOGMtLjIyLS4wNS0uNDYtLjIyLS40LS41Ni42LTMuMTUgMy40NS00LjEgNi00LjEgMS4zIDAgMyAuMzUgNC4wMyAxLjMzQzE3LjExIDQuNTUgMTcgNi4xOCAxNyA3Ljk1djQuMTdjMCAxLjI1LjUgMS44MSAxIDIuNDguMTcuMjUuMjEuNTQgMCAuNzFsLTIuMDYgMS43OGgtLjAxIj48L3BhdGg+PHBhdGggZD0iTTIwLjE2IDE5LjU0QzE4IDIxLjE0IDE0LjgyIDIyIDEyLjEgMjJjLTMuODEgMC03LjI1LTEuNDEtOS44NS0zLjc2LS4yLS4xOC0uMDItLjQzLjI1LS4yOSAyLjc4IDEuNjMgNi4yNSAyLjYxIDkuODMgMi42MSAyLjQxIDAgNS4wNy0uNSA3LjUxLTEuNTMuMzctLjE2LjY2LjI0LjMyLjUxIj48L3BhdGg+PHBhdGggZD0iTTIxLjA3IDE4LjVjLS4yOC0uMzYtMS44NS0uMTctMi41Ny0uMDgtLjE5LjAyLS4yMi0uMTYtLjAzLS4zIDEuMjQtLjg4IDMuMjktLjYyIDMuNTMtLjMzLjI0LjMtLjA3IDIuMzUtMS4yNCAzLjMyLS4xOC4xNi0uMzUuMDctLjI2LS4xMS4yNi0uNjcuODUtMi4xNC41Ny0yLjV6Ij48L3BhdGg+PC9zdmc+","docUrl":""}}, actions=null)
2021-08-07 14:27:35,080 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=aws sqs, clazz=org.thingsboard.rule.engine.aws.sqs.TbSqsNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload and metadata attributes to the AWS SQS queue. Outbound message will contain response fields (<code>messageId</code>, <code>requestId</code>, <code>messageBodyMd5</code>, <code>messageAttributesMd5</code>, <code>sequenceNumber</code>) in the Message Metadata from the AWS SQS. For example <b>requestId</b> field can be accessed with <code>metadata.requestId</code>.","description":"Publish messages to the AWS SQS","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"queueType":"STANDARD","queueUrlPattern":"https://sqs.us-east-1.amazonaws.com/123456789012/my-queue-name","delaySeconds":0,"messageAttributes":{},"accessKeyId":null,"secretAccessKey":null,"region":"us-east-1"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSqsConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48cGF0aCBkPSJNMTMuMjMgMTAuNTZWMTBjLTEuOTQgMC0zLjk5LjM5LTMuOTkgMi42NyAwIDEuMTYuNjEgMS45NSAxLjYzIDEuOTUuNzYgMCAxLjQzLS40NyAxLjg2LTEuMjIuNTItLjkzLjUtMS44LjUtMi44NG0yLjcgNi41M2MtLjE4LjE2LS40My4xNy0uNjMuMDYtLjg5LS43NC0xLjA1LTEuMDgtMS41NC0xLjc5LTEuNDcgMS41LTIuNTEgMS45NS00LjQyIDEuOTUtMi4yNSAwLTQuMDEtMS4zOS00LjAxLTQuMTcgMC0yLjE4IDEuMTctMy42NCAyLjg2LTQuMzggMS40Ni0uNjQgMy40OS0uNzYgNS4wNC0uOTNWNy41YzAtLjY2LjA1LTEuNDEtLjMzLTEuOTYtLjMyLS40OS0uOTUtLjctMS41LS43LTEuMDIgMC0xLjkzLjUzLTIuMTUgMS42MS0uMDUuMjQtLjI1LjQ4LS40Ny40OWwtMi42LS4yOGMtLjIyLS4wNS0uNDYtLjIyLS40LS41Ni42LTMuMTUgMy40NS00LjEgNi00LjEgMS4zIDAgMyAuMzUgNC4wMyAxLjMzQzE3LjExIDQuNTUgMTcgNi4xOCAxNyA3Ljk1djQuMTdjMCAxLjI1LjUgMS44MSAxIDIuNDguMTcuMjUuMjEuNTQgMCAuNzFsLTIuMDYgMS43OGgtLjAxIj48L3BhdGg+PHBhdGggZD0iTTIwLjE2IDE5LjU0QzE4IDIxLjE0IDE0LjgyIDIyIDEyLjEgMjJjLTMuODEgMC03LjI1LTEuNDEtOS44NS0zLjc2LS4yLS4xOC0uMDItLjQzLjI1LS4yOSAyLjc4IDEuNjMgNi4yNSAyLjYxIDkuODMgMi42MSAyLjQxIDAgNS4wNy0uNSA3LjUxLTEuNTMuMzctLjE2LjY2LjI0LjMyLjUxIj48L3BhdGg+PHBhdGggZD0iTTIxLjA3IDE4LjVjLS4yOC0uMzYtMS44NS0uMTctMi41Ny0uMDgtLjE5LjAyLS4yMi0uMTYtLjAzLS4zIDEuMjQtLjg4IDMuMjktLjYyIDMuNTMtLjMzLjI0LjMtLjA3IDIuMzUtMS4yNCAzLjMyLS4xOC4xNi0uMzUuMDctLjI2LS4xMS4yNi0uNjcuODUtMi4xNC41Ny0yLjV6Ij48L3BhdGg+PC9zdmc+","docUrl":""}}, actions=null)
2021-08-07 14:27:35,127 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=kafka, clazz=org.thingsboard.rule.engine.kafka.TbKafkaNode, configurationDescriptor={"nodeDefinition":{"details":"Will send record via Kafka producer to Kafka server. Outbound message will contain response fields (<code>offset</code>, <code>partition</code>, <code>topic</code>) from the Kafka in the Message Metadata. For example <b>partition</b> field can be accessed with <code>metadata.partition</code>.","description":"Publish messages to Kafka server","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicPattern":"my-topic","bootstrapServers":"localhost:9092","retries":0,"batchSize":16384,"linger":0,"bufferMemory":33554432,"acks":"-1","keySerializer":"org.apache.kafka.common.serialization.StringSerializer","valueSerializer":"org.apache.kafka.common.serialization.StringSerializer","otherProperties":{},"addMetadataKeyValuesAsKafkaHeaders":false,"kafkaHeadersCharset":"UTF-8"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeKafkaConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUzOCIgaGVpZ2h0PSIyNTAwIiB2aWV3Qm94PSIwIDAgMjU2IDQxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZD0iTTIwMS44MTYgMjMwLjIxNmMtMTYuMTg2IDAtMzAuNjk3IDcuMTcxLTQwLjYzNCAxOC40NjFsLTI1LjQ2My0xOC4wMjZjMi43MDMtNy40NDIgNC4yNTUtMTUuNDMzIDQuMjU1LTIzLjc5NyAwLTguMjE5LTEuNDk4LTE2LjA3Ni00LjExMi0yMy40MDhsMjUuNDA2LTE3LjgzNWM5LjkzNiAxMS4yMzMgMjQuNDA5IDE4LjM2NSA0MC41NDggMTguMzY1IDI5Ljg3NSAwIDU0LjE4NC0yNC4zMDUgNTQuMTg0LTU0LjE4NCAwLTI5Ljg3OS0yNC4zMDktNTQuMTg0LTU0LjE4NC01NC4xODQtMjkuODc1IDAtNTQuMTg0IDI0LjMwNS01NC4xODQgNTQuMTg0IDAgNS4zNDguODA4IDEwLjUwNSAyLjI1OCAxNS4zODlsLTI1LjQyMyAxNy44NDRjLTEwLjYyLTEzLjE3NS0yNS45MTEtMjIuMzc0LTQzLjMzMy0yNS4xODJ2LTMwLjY0YzI0LjU0NC01LjE1NSA0My4wMzctMjYuOTYyIDQzLjAzNy01My4wMTlDMTI0LjE3MSAyNC4zMDUgOTkuODYyIDAgNjkuOTg3IDAgNDAuMTEyIDAgMTUuODAzIDI0LjMwNSAxNS44MDMgNTQuMTg0YzAgMjUuNzA4IDE4LjAxNCA0Ny4yNDYgNDIuMDY3IDUyLjc2OXYzMS4wMzhDMjUuMDQ0IDE0My43NTMgMCAxNzIuNDAxIDAgMjA2Ljg1NGMwIDM0LjYyMSAyNS4yOTIgNjMuMzc0IDU4LjM1NSA2OC45NHYzMi43NzRjLTI0LjI5OSA1LjM0MS00Mi41NTIgMjcuMDExLTQyLjU1MiA1Mi44OTQgMCAyOS44NzkgMjQuMzA5IDU0LjE4NCA1NC4xODQgNTQuMTg0IDI5Ljg3NSAwIDU0LjE4NC0yNC4zMDUgNTQuMTg0LTU0LjE4NCAwLTI1Ljg4My0xOC4yNTMtNDcuNTUzLTQyLjU1Mi01Mi44OTR2LTMyLjc3NWE2OS45NjUgNjkuOTY1IDAgMCAwIDQyLjYtMjQuNzc2bDI1LjYzMyAxOC4xNDNjLTEuNDIzIDQuODQtMi4yMiA5Ljk0Ni0yLjIyIDE1LjI0IDAgMjkuODc5IDI0LjMwOSA1NC4xODQgNTQuMTg0IDU0LjE4NCAyOS44NzUgMCA1NC4xODQtMjQuMzA1IDU0LjE4NC01NC4xODQgMC0yOS44NzktMjQuMzA5LTU0LjE4NC01NC4xODQtNTQuMTg0em0wLTEyNi42OTVjMTQuNDg3IDAgMjYuMjcgMTEuNzg4IDI2LjI3IDI2LjI3MXMtMTEuNzgzIDI2LjI3LTI2LjI3IDI2LjI3LTI2LjI3LTExLjc4Ny0yNi4yNy0yNi4yN2MwLTE0LjQ4MyAxMS43ODMtMjYuMjcxIDI2LjI3LTI2LjI3MXptLTE1OC4xLTQ5LjMzN2MwLTE0LjQ4MyAxMS43ODQtMjYuMjcgMjYuMjcxLTI2LjI3czI2LjI3IDExLjc4NyAyNi4yNyAyNi4yN2MwIDE0LjQ4My0xMS43ODMgMjYuMjctMjYuMjcgMjYuMjdzLTI2LjI3MS0xMS43ODctMjYuMjcxLTI2LjI3em01Mi41NDEgMzA3LjI3OGMwIDE0LjQ4My0xMS43ODMgMjYuMjctMjYuMjcgMjYuMjdzLTI2LjI3MS0xMS43ODctMjYuMjcxLTI2LjI3YzAtMTQuNDgzIDExLjc4NC0yNi4yNyAyNi4yNzEtMjYuMjdzMjYuMjcgMTEuNzg3IDI2LjI3IDI2LjI3em0tMjYuMjcyLTExNy45N2MtMjAuMjA1IDAtMzYuNjQyLTE2LjQzNC0zNi42NDItMzYuNjM4IDAtMjAuMjA1IDE2LjQzNy0zNi42NDIgMzYuNjQyLTM2LjY0MiAyMC4yMDQgMCAzNi42NDEgMTYuNDM3IDM2LjY0MSAzNi42NDIgMCAyMC4yMDQtMTYuNDM3IDM2LjYzOC0zNi42NDEgMzYuNjM4em0xMzEuODMxIDY3LjE3OWMtMTQuNDg3IDAtMjYuMjctMTEuNzg4LTI2LjI3LTI2LjI3MXMxMS43ODMtMjYuMjcgMjYuMjctMjYuMjcgMjYuMjcgMTEuNzg3IDI2LjI3IDI2LjI3YzAgMTQuNDgzLTExLjc4MyAyNi4yNzEtMjYuMjcgMjYuMjcxeiIvPjwvc3ZnPg==","docUrl":""}}, actions=null)
2021-08-07 14:27:35,131 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=kafka, clazz=org.thingsboard.rule.engine.kafka.TbKafkaNode, configurationDescriptor={"nodeDefinition":{"details":"Will send record via Kafka producer to Kafka server. Outbound message will contain response fields (<code>offset</code>, <code>partition</code>, <code>topic</code>) from the Kafka in the Message Metadata. For example <b>partition</b> field can be accessed with <code>metadata.partition</code>.","description":"Publish messages to Kafka server","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicPattern":"my-topic","bootstrapServers":"localhost:9092","retries":0,"batchSize":16384,"linger":0,"bufferMemory":33554432,"acks":"-1","keySerializer":"org.apache.kafka.common.serialization.StringSerializer","valueSerializer":"org.apache.kafka.common.serialization.StringSerializer","otherProperties":{},"addMetadataKeyValuesAsKafkaHeaders":false,"kafkaHeadersCharset":"UTF-8"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeKafkaConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUzOCIgaGVpZ2h0PSIyNTAwIiB2aWV3Qm94PSIwIDAgMjU2IDQxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZD0iTTIwMS44MTYgMjMwLjIxNmMtMTYuMTg2IDAtMzAuNjk3IDcuMTcxLTQwLjYzNCAxOC40NjFsLTI1LjQ2My0xOC4wMjZjMi43MDMtNy40NDIgNC4yNTUtMTUuNDMzIDQuMjU1LTIzLjc5NyAwLTguMjE5LTEuNDk4LTE2LjA3Ni00LjExMi0yMy40MDhsMjUuNDA2LTE3LjgzNWM5LjkzNiAxMS4yMzMgMjQuNDA5IDE4LjM2NSA0MC41NDggMTguMzY1IDI5Ljg3NSAwIDU0LjE4NC0yNC4zMDUgNTQuMTg0LTU0LjE4NCAwLTI5Ljg3OS0yNC4zMDktNTQuMTg0LTU0LjE4NC01NC4xODQtMjkuODc1IDAtNTQuMTg0IDI0LjMwNS01NC4xODQgNTQuMTg0IDAgNS4zNDguODA4IDEwLjUwNSAyLjI1OCAxNS4zODlsLTI1LjQyMyAxNy44NDRjLTEwLjYyLTEzLjE3NS0yNS45MTEtMjIuMzc0LTQzLjMzMy0yNS4xODJ2LTMwLjY0YzI0LjU0NC01LjE1NSA0My4wMzctMjYuOTYyIDQzLjAzNy01My4wMTlDMTI0LjE3MSAyNC4zMDUgOTkuODYyIDAgNjkuOTg3IDAgNDAuMTEyIDAgMTUuODAzIDI0LjMwNSAxNS44MDMgNTQuMTg0YzAgMjUuNzA4IDE4LjAxNCA0Ny4yNDYgNDIuMDY3IDUyLjc2OXYzMS4wMzhDMjUuMDQ0IDE0My43NTMgMCAxNzIuNDAxIDAgMjA2Ljg1NGMwIDM0LjYyMSAyNS4yOTIgNjMuMzc0IDU4LjM1NSA2OC45NHYzMi43NzRjLTI0LjI5OSA1LjM0MS00Mi41NTIgMjcuMDExLTQyLjU1MiA1Mi44OTQgMCAyOS44NzkgMjQuMzA5IDU0LjE4NCA1NC4xODQgNTQuMTg0IDI5Ljg3NSAwIDU0LjE4NC0yNC4zMDUgNTQuMTg0LTU0LjE4NCAwLTI1Ljg4My0xOC4yNTMtNDcuNTUzLTQyLjU1Mi01Mi44OTR2LTMyLjc3NWE2OS45NjUgNjkuOTY1IDAgMCAwIDQyLjYtMjQuNzc2bDI1LjYzMyAxOC4xNDNjLTEuNDIzIDQuODQtMi4yMiA5Ljk0Ni0yLjIyIDE1LjI0IDAgMjkuODc5IDI0LjMwOSA1NC4xODQgNTQuMTg0IDU0LjE4NCAyOS44NzUgMCA1NC4xODQtMjQuMzA1IDU0LjE4NC01NC4xODQgMC0yOS44NzktMjQuMzA5LTU0LjE4NC01NC4xODQtNTQuMTg0em0wLTEyNi42OTVjMTQuNDg3IDAgMjYuMjcgMTEuNzg4IDI2LjI3IDI2LjI3MXMtMTEuNzgzIDI2LjI3LTI2LjI3IDI2LjI3LTI2LjI3LTExLjc4Ny0yNi4yNy0yNi4yN2MwLTE0LjQ4MyAxMS43ODMtMjYuMjcxIDI2LjI3LTI2LjI3MXptLTE1OC4xLTQ5LjMzN2MwLTE0LjQ4MyAxMS43ODQtMjYuMjcgMjYuMjcxLTI2LjI3czI2LjI3IDExLjc4NyAyNi4yNyAyNi4yN2MwIDE0LjQ4My0xMS43ODMgMjYuMjctMjYuMjcgMjYuMjdzLTI2LjI3MS0xMS43ODctMjYuMjcxLTI2LjI3em01Mi41NDEgMzA3LjI3OGMwIDE0LjQ4My0xMS43ODMgMjYuMjctMjYuMjcgMjYuMjdzLTI2LjI3MS0xMS43ODctMjYuMjcxLTI2LjI3YzAtMTQuNDgzIDExLjc4NC0yNi4yNyAyNi4yNzEtMjYuMjdzMjYuMjcgMTEuNzg3IDI2LjI3IDI2LjI3em0tMjYuMjcyLTExNy45N2MtMjAuMjA1IDAtMzYuNjQyLTE2LjQzNC0zNi42NDItMzYuNjM4IDAtMjAuMjA1IDE2LjQzNy0zNi42NDIgMzYuNjQyLTM2LjY0MiAyMC4yMDQgMCAzNi42NDEgMTYuNDM3IDM2LjY0MSAzNi42NDIgMCAyMC4yMDQtMTYuNDM3IDM2LjYzOC0zNi42NDEgMzYuNjM4em0xMzEuODMxIDY3LjE3OWMtMTQuNDg3IDAtMjYuMjctMTEuNzg4LTI2LjI3LTI2LjI3MXMxMS43ODMtMjYuMjcgMjYuMjctMjYuMjcgMjYuMjcgMTEuNzg3IDI2LjI3IDI2LjI3YzAgMTQuNDgzLTExLjc4MyAyNi4yNzEtMjYuMjcgMjYuMjcxeiIvPjwvc3ZnPg==","docUrl":""}}, actions=null)
2021-08-07 14:27:35,247 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=gps geofencing events, clazz=org.thingsboard.rule.engine.geo.TbGpsGeofencingActionNode, configurationDescriptor={"nodeDefinition":{"details":"Extracts latitude and longitude parameters from incoming message and returns different events based on configuration parameters","description":"Produces incoming messages using GPS based geofencing","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Entered","Left","Inside","Outside","Failure"],"customRelations":false,"defaultConfiguration":{"latitudeKeyName":"latitude","longitudeKeyName":"longitude","fetchPerimeterInfoFromMessageMetadata":true,"perimeterType":null,"polygonsDefinition":null,"centerLatitude":null,"centerLongitude":null,"range":null,"rangeUnit":null,"minInsideDuration":1,"minOutsideDuration":1,"minInsideDurationTimeUnit":"MINUTES","minOutsideDurationTimeUnit":"MINUTES"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeGpsGeofencingConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,264 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=gps geofencing events, clazz=org.thingsboard.rule.engine.geo.TbGpsGeofencingActionNode, configurationDescriptor={"nodeDefinition":{"details":"Extracts latitude and longitude parameters from incoming message and returns different events based on configuration parameters","description":"Produces incoming messages using GPS based geofencing","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Entered","Left","Inside","Outside","Failure"],"customRelations":false,"defaultConfiguration":{"latitudeKeyName":"latitude","longitudeKeyName":"longitude","fetchPerimeterInfoFromMessageMetadata":true,"perimeterType":null,"polygonsDefinition":null,"centerLatitude":null,"centerLongitude":null,"range":null,"rangeUnit":null,"minInsideDuration":1,"minOutsideDuration":1,"minInsideDurationTimeUnit":"MINUTES","minOutsideDurationTimeUnit":"MINUTES"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeGpsGeofencingConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,297 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=FILTER, scope=TENANT, name=check existence fields, clazz=org.thingsboard.rule.engine.filter.TbCheckMessageNode, configurationDescriptor={"nodeDefinition":{"details":"If selected checkbox 'Check that all selected keys are present'\" and all keys in message data and metadata are exist - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.\nElse if the checkbox is not selected, and at least one of the keys from data or metadata of the message exists - send Message via <b>True</b> chain, otherwise, <b>False</b> chain is used. ","description":"Checks the existence of the selected keys from message data and metadata.","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"messageNames":[],"metadataNames":[],"checkAllKeys":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeCheckMessageConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,301 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=FILTER, scope=TENANT, name=check existence fields, clazz=org.thingsboard.rule.engine.filter.TbCheckMessageNode, configurationDescriptor={"nodeDefinition":{"details":"If selected checkbox 'Check that all selected keys are present'\" and all keys in message data and metadata are exist - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.\nElse if the checkbox is not selected, and at least one of the keys from data or metadata of the message exists - send Message via <b>True</b> chain, otherwise, <b>False</b> chain is used. ","description":"Checks the existence of the selected keys from message data and metadata.","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"messageNames":[],"metadataNames":[],"checkAllKeys":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeCheckMessageConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,329 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=FILTER, scope=TENANT, name=switch, clazz=org.thingsboard.rule.engine.filter.TbJsSwitchNode, configurationDescriptor={"nodeDefinition":{"details":"Node executes configured JS script. Script should return array of next Chain names where Message should be routed. If Array is empty - message not routed to next Node. Message payload can be accessed via <code>msg</code> property. For example <code>msg.temperature < 10;</code><br/>Message metadata can be accessed via <code>metadata</code> property. For example <code>metadata.customerName === 'John';</code><br/>Message type can be accessed via <code>msgType</code> property.","description":"Route incoming Message to one or multiple output chains","inEnabled":true,"outEnabled":true,"relationTypes":["Failure"],"customRelations":true,"defaultConfiguration":{"jsScript":"function nextRelation(metadata, msg) {\n return ['one','nine'];\n}\nif(msgType === 'POST_TELEMETRY_REQUEST') {\n return ['two'];\n}\nreturn nextRelation(metadata, msg);"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeSwitchConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,331 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=FILTER, scope=TENANT, name=switch, clazz=org.thingsboard.rule.engine.filter.TbJsSwitchNode, configurationDescriptor={"nodeDefinition":{"details":"Node executes configured JS script. Script should return array of next Chain names where Message should be routed. If Array is empty - message not routed to next Node. Message payload can be accessed via <code>msg</code> property. For example <code>msg.temperature < 10;</code><br/>Message metadata can be accessed via <code>metadata</code> property. For example <code>metadata.customerName === 'John';</code><br/>Message type can be accessed via <code>msgType</code> property.","description":"Route incoming Message to one or multiple output chains","inEnabled":true,"outEnabled":true,"relationTypes":["Failure"],"customRelations":true,"defaultConfiguration":{"jsScript":"function nextRelation(metadata, msg) {\n return ['one','nine'];\n}\nif(msgType === 'POST_TELEMETRY_REQUEST') {\n return ['two'];\n}\nreturn nextRelation(metadata, msg);"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeSwitchConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,349 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=customer attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetCustomerAttributeNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, server scope attributes are added into Message metadata. If Latest Telemetry enrichment configured, latest telemetry added into metadata. To access those attributes in other nodes this template can be used <code>metadata.temperature</code>.","description":"Add Originators Customer Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"attrMapping":{"temperature":"tempo"},"telemetry":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeCustomerAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,358 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=customer attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetCustomerAttributeNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, server scope attributes are added into Message metadata. If Latest Telemetry enrichment configured, latest telemetry added into metadata. To access those attributes in other nodes this template can be used <code>metadata.temperature</code>.","description":"Add Originators Customer Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"attrMapping":{"temperature":"tempo"},"telemetry":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeCustomerAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,425 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=tenant attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetTenantAttributeNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, server scope attributes are added into Message metadata. If Latest Telemetry enrichment configured, latest telemetry added into metadata. To access those attributes in other nodes this template can be used <code>metadata.temperature</code>.","description":"Add Originators Tenant Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"attrMapping":{"temperature":"tempo"},"telemetry":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeTenantAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,439 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=tenant attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetTenantAttributeNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, server scope attributes are added into Message metadata. If Latest Telemetry enrichment configured, latest telemetry added into metadata. To access those attributes in other nodes this template can be used <code>metadata.temperature</code>.","description":"Add Originators Tenant Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"attrMapping":{"temperature":"tempo"},"telemetry":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeTenantAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,475 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=rpc call request, clazz=org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode, configurationDescriptor={"nodeDefinition":{"details":"Expects messages with \"method\" and \"params\". Will forward response from device to next nodes.If the RPC call request is originated by REST API call from user, will forward the response to user immediately.","description":"Sends RPC call to device","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"timeoutInSeconds":60},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRpcRequestConfig","icon":"call_made","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,478 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=rpc call request, clazz=org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode, configurationDescriptor={"nodeDefinition":{"details":"Expects messages with \"method\" and \"params\". Will forward response from device to next nodes.If the RPC call request is originated by REST API call from user, will forward the response to user immediately.","description":"Sends RPC call to device","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"timeoutInSeconds":60},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRpcRequestConfig","icon":"call_made","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,596 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=mqtt, clazz=org.thingsboard.rule.engine.mqtt.TbMqttNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the MQTT broker with QoS <b>AT_LEAST_ONCE</b>.","description":"Publish messages to the MQTT broker","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicPattern":"my-topic","host":"localhost","port":1883,"connectTimeoutSec":10,"clientId":null,"cleanSession":true,"ssl":false,"credentials":{"type":"anonymous"}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeMqttConfig","icon":"call_split","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,616 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=mqtt, clazz=org.thingsboard.rule.engine.mqtt.TbMqttNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the MQTT broker with QoS <b>AT_LEAST_ONCE</b>.","description":"Publish messages to the MQTT broker","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicPattern":"my-topic","host":"localhost","port":1883,"connectTimeoutSec":10,"clientId":null,"cleanSession":true,"ssl":false,"credentials":{"type":"anonymous"}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeMqttConfig","icon":"call_split","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,696 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=rpc call reply, clazz=org.thingsboard.rule.engine.rpc.TbSendRPCReplyNode, configurationDescriptor={"nodeDefinition":{"details":"Expects messages with any message type. Will forward message body to the device.","description":"Sends reply to RPC call from device","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"serviceIdMetaDataAttribute":"serviceId","sessionIdMetaDataAttribute":"sessionId","requestIdMetaDataAttribute":"requestId"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRpcReplyConfig","icon":"call_merge","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,699 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=rpc call reply, clazz=org.thingsboard.rule.engine.rpc.TbSendRPCReplyNode, configurationDescriptor={"nodeDefinition":{"details":"Expects messages with any message type. Will forward message body to the device.","description":"Sends reply to RPC call from device","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"serviceIdMetaDataAttribute":"serviceId","sessionIdMetaDataAttribute":"sessionId","requestIdMetaDataAttribute":"requestId"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRpcReplyConfig","icon":"call_merge","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,716 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=message count, clazz=org.thingsboard.rule.engine.action.TbMsgCountNode, configurationDescriptor={"nodeDefinition":{"details":"Count incoming messages for specified interval and produces POST_TELEMETRY_REQUEST msg with messages count","description":"Count incoming messages","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"telemetryPrefix":"messageCount","interval":1},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeMsgCountConfig","icon":"functions","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,721 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=message count, clazz=org.thingsboard.rule.engine.action.TbMsgCountNode, configurationDescriptor={"nodeDefinition":{"details":"Count incoming messages for specified interval and produces POST_TELEMETRY_REQUEST msg with messages count","description":"Count incoming messages","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"telemetryPrefix":"messageCount","interval":1},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeMsgCountConfig","icon":"functions","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,745 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=acknowledge, clazz=org.thingsboard.rule.engine.flow.TbAckNode, configurationDescriptor={"nodeDefinition":{"details":"After acknowledgement, the message is pushed to related rule nodes. Useful if you don't care what happens to this message next.","description":"Acknowledges the incoming message","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,758 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=acknowledge, clazz=org.thingsboard.rule.engine.flow.TbAckNode, configurationDescriptor={"nodeDefinition":{"details":"After acknowledgement, the message is pushed to related rule nodes. Useful if you don't care what happens to this message next.","description":"Acknowledges the incoming message","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,779 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=send sms, clazz=org.thingsboard.rule.engine.sms.TbSendSmsNode, configurationDescriptor={"nodeDefinition":{"details":"Will send SMS message by populating target phone numbers and sms message fields using values derived from message metadata.","description":"Sends SMS message via SMS provider.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"numbersToTemplate":"${userPhone}","smsMessageTemplate":"Device ${deviceName} has high temperature ${temp}","useSystemSmsSettings":true,"smsProviderConfiguration":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSendSmsConfig","icon":"sms","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,782 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=send sms, clazz=org.thingsboard.rule.engine.sms.TbSendSmsNode, configurationDescriptor={"nodeDefinition":{"details":"Will send SMS message by populating target phone numbers and sms message fields using values derived from message metadata.","description":"Sends SMS message via SMS provider.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"numbersToTemplate":"${userPhone}","smsMessageTemplate":"Device ${deviceName} has high temperature ${temp}","useSystemSmsSettings":true,"smsProviderConfiguration":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSendSmsConfig","icon":"sms","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,810 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=originator telemetry, clazz=org.thingsboard.rule.engine.metadata.TbGetTelemetryNode, configurationDescriptor={"nodeDefinition":{"details":"The node allows you to select fetch mode: <b>FIRST/LAST/ALL</b> to fetch telemetry of certain time range that are added into Message metadata without any prefix. If selected fetch mode <b>ALL</b> Telemetry will be added like array into Message Metadata where <b>key</b> is Timestamp and <b>value</b> is value of Telemetry.</br>If selected fetch mode <b>FIRST</b> or <b>LAST</b> Telemetry will be added like string without Timestamp.</br>Also, the rule node allows you to select telemetry sampling order: <b>ASC</b> or <b>DESC</b>. </br><b>Note</b>: The maximum size of the fetched array is 1000 records.\n ","description":"Add Message Originator Telemetry for selected time range into Message Metadata\n","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"startInterval":2,"endInterval":1,"startIntervalPattern":"","endIntervalPattern":"","useMetadataIntervalPatterns":false,"startIntervalTimeUnit":"MINUTES","endIntervalTimeUnit":"MINUTES","fetchMode":"FIRST","orderBy":"ASC","limit":1000,"latestTsKeyNames":[]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeGetTelemetryFromDatabase","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,832 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=originator telemetry, clazz=org.thingsboard.rule.engine.metadata.TbGetTelemetryNode, configurationDescriptor={"nodeDefinition":{"details":"The node allows you to select fetch mode: <b>FIRST/LAST/ALL</b> to fetch telemetry of certain time range that are added into Message metadata without any prefix. If selected fetch mode <b>ALL</b> Telemetry will be added like array into Message Metadata where <b>key</b> is Timestamp and <b>value</b> is value of Telemetry.</br>If selected fetch mode <b>FIRST</b> or <b>LAST</b> Telemetry will be added like string without Timestamp.</br>Also, the rule node allows you to select telemetry sampling order: <b>ASC</b> or <b>DESC</b>. </br><b>Note</b>: The maximum size of the fetched array is 1000 records.\n ","description":"Add Message Originator Telemetry for selected time range into Message Metadata\n","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"startInterval":2,"endInterval":1,"startIntervalPattern":"","endIntervalPattern":"","useMetadataIntervalPatterns":false,"startIntervalTimeUnit":"MINUTES","endIntervalTimeUnit":"MINUTES","fetchMode":"FIRST","orderBy":"ASC","limit":1000,"latestTsKeyNames":[]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeGetTelemetryFromDatabase","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,925 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=synchronization end, clazz=org.thingsboard.rule.engine.transaction.TbSynchronizationEndNode, configurationDescriptor={"nodeDefinition":{"details":"","description":"This Node is now deprecated. Use \"Checkpoint\" instead.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,942 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=synchronization end, clazz=org.thingsboard.rule.engine.transaction.TbSynchronizationEndNode, configurationDescriptor={"nodeDefinition":{"details":"","description":"This Node is now deprecated. Use \"Checkpoint\" instead.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,966 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=related device attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetDeviceAttrNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, <b>CLIENT/SHARED/SERVER</b> attributes are added into Message metadata with specific prefix: <i>cs/shared/ss</i>. Latest telemetry value added into metadata without prefix. To access those attributes in other nodes this template can be used <code>metadata.cs_temperature</code> or <code>metadata.shared_limit</code> ","description":"Add Originators Related Device Attributes and Latest Telemetry value into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"clientAttributeNames":[],"sharedAttributeNames":[],"serverAttributeNames":[],"latestTsKeyNames":[],"tellFailureIfAbsent":true,"getLatestValueWithTs":false,"deviceRelationsQuery":{"direction":"FROM","maxLevel":1,"relationType":"Contains","deviceTypes":["default"],"fetchLastLevelOnly":false}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeDeviceAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,972 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=related device attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetDeviceAttrNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, <b>CLIENT/SHARED/SERVER</b> attributes are added into Message metadata with specific prefix: <i>cs/shared/ss</i>. Latest telemetry value added into metadata without prefix. To access those attributes in other nodes this template can be used <code>metadata.cs_temperature</code> or <code>metadata.shared_limit</code> ","description":"Add Originators Related Device Attributes and Latest Telemetry value into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"clientAttributeNames":[],"sharedAttributeNames":[],"serverAttributeNames":[],"latestTsKeyNames":[],"tellFailureIfAbsent":true,"getLatestValueWithTs":false,"deviceRelationsQuery":{"direction":"FROM","maxLevel":1,"relationType":"Contains","deviceTypes":["default"],"fetchLastLevelOnly":false}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeDeviceAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:35,991 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=rest api call, clazz=org.thingsboard.rule.engine.rest.TbRestApiCallNode, configurationDescriptor={"nodeDefinition":{"details":"Will invoke REST API call <code>GET | POST | PUT | DELETE</code> to external REST server. Message payload added into Request body. Configured attributes can be added into Headers from Message Metadata. Outbound message will contain response fields (<code>status</code>, <code>statusCode</code>, <code>statusReason</code> and response <code>headers</code>) in the Message Metadata. Response body saved in outbound Message payload. For example <b>statusCode</b> field can be accessed with <code>metadata.statusCode</code>.<br/><b>Note-</b> if you use system proxy properties, the next system proxy properties should be added: \"http.proxyHost\" and \"http.proxyPort\" or \"https.proxyHost\" and \"https.proxyPort\" or \"socksProxyHost\" and \"socksProxyPort\",and if your proxy with auth, the next ones should be added: \"tb.proxy.user\" and \"tb.proxy.password\" to the thingsboard.conf file.","description":"Invoke REST API calls to external REST server","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"restEndpointUrlPattern":"http://localhost/api","requestMethod":"POST","headers":{},"useSimpleClientHttpFactory":false,"readTimeoutMs":0,"maxParallelRequestsCount":0,"useRedisQueueForMsgPersistence":false,"trimQueue":false,"maxQueueSize":0,"enableProxy":false,"useSystemProxyProperties":false,"proxyHost":null,"proxyPort":0,"proxyUser":null,"proxyPassword":null,"proxyScheme":null,"credentials":{"type":"anonymous"}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRestApiCallConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiB2ZXJzaW9uPSIxLjEiIHk9IjBweCIgeD0iMHB4Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTQ5NzUgMCAwIC45NDk3NSAxNy4xMiAyNi40OTIpIj48cGF0aCBkPSJtMTY5LjExIDEwOC41NGMtOS45MDY2IDAuMDczNC0xOS4wMTQgNi41NzI0LTIyLjAxNCAxNi40NjlsLTY5Ljk5MyAyMzEuMDhjLTMuNjkwNCAxMi4xODEgMy4yODkyIDI1LjIyIDE1LjQ2OSAyOC45MSAyLjIyNTkgMC42NzQ4MSA0LjQ5NjkgMSA2LjcyODUgMSA5Ljk3MjEgMCAxOS4xNjUtNi41MTUzIDIyLjE4Mi0xNi40NjdhNi41MjI0IDYuNTIyNCAwIDAgMCAwLjAwMiAtMC4wMDJsNjkuOTktMjMxLjA3YTYuNTIyNCA2LjUyMjQgMCAwIDAgMCAtMC4wMDJjMy42ODU1LTEyLjE4MS0zLjI4Ny0yNS4yMjUtMTUuNDcxLTI4LjkxMi0yLjI4MjUtMC42OTE0NS00LjYxMTYtMS4wMTY5LTYuODk4NC0xem04NC45ODggMGMtOS45MDQ4IDAuMDczNC0xOS4wMTggNi41Njc1LTIyLjAxOCAxNi40NjlsLTY5Ljk4NiAyMzEuMDhjLTMuNjg5OCAxMi4xNzkgMy4yODUzIDI1LjIxNyAxNS40NjUgMjguOTA4IDIuMjI5NyAwLjY3NjQ3IDQuNTAwOCAxLjAwMiA2LjczMjQgMS4wMDIgOS45NzIxIDAgMTkuMTY1LTYuNTE1MyAyMi4xODItMTYuNDY3YTYuNTIyNCA2LjUyMjQgMCAwIDAgMC4wMDIgLTAuMDAybDY5Ljk4OC0yMzEuMDdjMy42OTA4LTEyLjE4MS0zLjI4NTItMjUuMjIzLTE1LjQ2Ny0yOC45MTItMi4yODE0LTAuNjkyMzEtNC42MTA4LTEuMDE4OS02Ljg5ODQtMS4wMDJ6bS0yMTcuMjkgNDIuMjNjLTEyLjcyOS0wLjAwMDg3LTIzLjE4OCAxMC40NTYtMjMuMTg4IDIzLjE4NiAwLjAwMSAxMi43MjggMTAuNDU5IDIzLjE4NiAyMy4xODggMjMuMTg2IDEyLjcyNy0wLjAwMSAyMy4xODMtMTAuNDU5IDIzLjE4NC0yMy4xODYgMC4wMDA4NzYtMTIuNzI4LTEwLjQ1Ni0yMy4xODUtMjMuMTg0LTIzLjE4NnptMCAxNDYuNjRjLTEyLjcyNy0wLjAwMDg3LTIzLjE4NiAxMC40NTUtMjMuMTg4IDIzLjE4NC0wLjAwMDg3MyAxMi43MjkgMTAuNDU4IDIzLjE4OCAyMy4xODggMjMuMTg4IDEyLjcyOC0wLjAwMSAyMy4xODQtMTAuNDYgMjMuMTg0LTIzLjE4OC0wLjAwMS0xMi43MjYtMTAuNDU3LTIzLjE4My0yMy4xODQtMjMuMTg0em0yNzAuNzkgNDIuMjExYy0xMi43MjcgMC0yMy4xODQgMTAuNDU3LTIzLjE4NCAyMy4xODRzMTAuNDU1IDIzLjE4OCAyMy4xODQgMjMuMTg4aDE1NC45OGMxMi43MjkgMCAyMy4xODYtMTAuNDYgMjMuMTg2LTIzLjE4OCAwLjAwMS0xMi43MjgtMTAuNDU4LTIzLjE4NC0yMy4xODYtMjMuMTg0eiIgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMzc2IDAgMCAxLjAzNzYgLTcuNTY3NiAtMTQuOTI1KSIgc3Ryb2tlLXdpZHRoPSIxLjI2OTMiLz48L2c+PC9zdmc+","docUrl":""}}, actions=null)
2021-08-07 14:27:35,996 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=rest api call, clazz=org.thingsboard.rule.engine.rest.TbRestApiCallNode, configurationDescriptor={"nodeDefinition":{"details":"Will invoke REST API call <code>GET | POST | PUT | DELETE</code> to external REST server. Message payload added into Request body. Configured attributes can be added into Headers from Message Metadata. Outbound message will contain response fields (<code>status</code>, <code>statusCode</code>, <code>statusReason</code> and response <code>headers</code>) in the Message Metadata. Response body saved in outbound Message payload. For example <b>statusCode</b> field can be accessed with <code>metadata.statusCode</code>.<br/><b>Note-</b> if you use system proxy properties, the next system proxy properties should be added: \"http.proxyHost\" and \"http.proxyPort\" or \"https.proxyHost\" and \"https.proxyPort\" or \"socksProxyHost\" and \"socksProxyPort\",and if your proxy with auth, the next ones should be added: \"tb.proxy.user\" and \"tb.proxy.password\" to the thingsboard.conf file.","description":"Invoke REST API calls to external REST server","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"restEndpointUrlPattern":"http://localhost/api","requestMethod":"POST","headers":{},"useSimpleClientHttpFactory":false,"readTimeoutMs":0,"maxParallelRequestsCount":0,"useRedisQueueForMsgPersistence":false,"trimQueue":false,"maxQueueSize":0,"enableProxy":false,"useSystemProxyProperties":false,"proxyHost":null,"proxyPort":0,"proxyUser":null,"proxyPassword":null,"proxyScheme":null,"credentials":{"type":"anonymous"}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRestApiCallConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiB2ZXJzaW9uPSIxLjEiIHk9IjBweCIgeD0iMHB4Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTQ5NzUgMCAwIC45NDk3NSAxNy4xMiAyNi40OTIpIj48cGF0aCBkPSJtMTY5LjExIDEwOC41NGMtOS45MDY2IDAuMDczNC0xOS4wMTQgNi41NzI0LTIyLjAxNCAxNi40NjlsLTY5Ljk5MyAyMzEuMDhjLTMuNjkwNCAxMi4xODEgMy4yODkyIDI1LjIyIDE1LjQ2OSAyOC45MSAyLjIyNTkgMC42NzQ4MSA0LjQ5NjkgMSA2LjcyODUgMSA5Ljk3MjEgMCAxOS4xNjUtNi41MTUzIDIyLjE4Mi0xNi40NjdhNi41MjI0IDYuNTIyNCAwIDAgMCAwLjAwMiAtMC4wMDJsNjkuOTktMjMxLjA3YTYuNTIyNCA2LjUyMjQgMCAwIDAgMCAtMC4wMDJjMy42ODU1LTEyLjE4MS0zLjI4Ny0yNS4yMjUtMTUuNDcxLTI4LjkxMi0yLjI4MjUtMC42OTE0NS00LjYxMTYtMS4wMTY5LTYuODk4NC0xem04NC45ODggMGMtOS45MDQ4IDAuMDczNC0xOS4wMTggNi41Njc1LTIyLjAxOCAxNi40NjlsLTY5Ljk4NiAyMzEuMDhjLTMuNjg5OCAxMi4xNzkgMy4yODUzIDI1LjIxNyAxNS40NjUgMjguOTA4IDIuMjI5NyAwLjY3NjQ3IDQuNTAwOCAxLjAwMiA2LjczMjQgMS4wMDIgOS45NzIxIDAgMTkuMTY1LTYuNTE1MyAyMi4xODItMTYuNDY3YTYuNTIyNCA2LjUyMjQgMCAwIDAgMC4wMDIgLTAuMDAybDY5Ljk4OC0yMzEuMDdjMy42OTA4LTEyLjE4MS0zLjI4NTItMjUuMjIzLTE1LjQ2Ny0yOC45MTItMi4yODE0LTAuNjkyMzEtNC42MTA4LTEuMDE4OS02Ljg5ODQtMS4wMDJ6bS0yMTcuMjkgNDIuMjNjLTEyLjcyOS0wLjAwMDg3LTIzLjE4OCAxMC40NTYtMjMuMTg4IDIzLjE4NiAwLjAwMSAxMi43MjggMTAuNDU5IDIzLjE4NiAyMy4xODggMjMuMTg2IDEyLjcyNy0wLjAwMSAyMy4xODMtMTAuNDU5IDIzLjE4NC0yMy4xODYgMC4wMDA4NzYtMTIuNzI4LTEwLjQ1Ni0yMy4xODUtMjMuMTg0LTIzLjE4NnptMCAxNDYuNjRjLTEyLjcyNy0wLjAwMDg3LTIzLjE4NiAxMC40NTUtMjMuMTg4IDIzLjE4NC0wLjAwMDg3MyAxMi43MjkgMTAuNDU4IDIzLjE4OCAyMy4xODggMjMuMTg4IDEyLjcyOC0wLjAwMSAyMy4xODQtMTAuNDYgMjMuMTg0LTIzLjE4OC0wLjAwMS0xMi43MjYtMTAuNDU3LTIzLjE4My0yMy4xODQtMjMuMTg0em0yNzAuNzkgNDIuMjExYy0xMi43MjcgMC0yMy4xODQgMTAuNDU3LTIzLjE4NCAyMy4xODRzMTAuNDU1IDIzLjE4OCAyMy4xODQgMjMuMTg4aDE1NC45OGMxMi43MjkgMCAyMy4xODYtMTAuNDYgMjMuMTg2LTIzLjE4OCAwLjAwMS0xMi43MjgtMTAuNDU4LTIzLjE4NC0yMy4xODYtMjMuMTg0eiIgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMzc2IDAgMCAxLjAzNzYgLTcuNTY3NiAtMTQuOTI1KSIgc3Ryb2tlLXdpZHRoPSIxLjI2OTMiLz48L2c+PC9zdmc+","docUrl":""}}, actions=null)
2021-08-07 14:27:36,045 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=save timeseries, clazz=org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode, configurationDescriptor={"nodeDefinition":{"details":"Saves timeseries telemetry data based on configurable TTL parameter. Expects messages with 'POST_TELEMETRY_REQUEST' message type","description":"Saves timeseries data","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"defaultTTL":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeTimeseriesConfig","icon":"file_upload","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,049 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=save timeseries, clazz=org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode, configurationDescriptor={"nodeDefinition":{"details":"Saves timeseries telemetry data based on configurable TTL parameter. Expects messages with 'POST_TELEMETRY_REQUEST' message type","description":"Saves timeseries data","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"defaultTTL":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeTimeseriesConfig","icon":"file_upload","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,096 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=customer details, clazz=org.thingsboard.rule.engine.metadata.TbGetCustomerDetailsNode, configurationDescriptor={"nodeDefinition":{"details":"If checkbox: <b>Add selected details to the message metadata</b> is selected, existing fields will be added to the message metadata instead of message data.<br><br><b>Note:</b> only Device, Asset, and Entity View type are allowed.<br><br>If the originator of the message is not assigned to Customer, or originator type is not supported - Message will be forwarded to <b>Failure</b> chain, otherwise, <b>Success</b> chain will be used.","description":"Adds fields from Customer details to the message body or metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"detailsList":[],"addToMetadata":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeEntityDetailsConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,126 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=customer details, clazz=org.thingsboard.rule.engine.metadata.TbGetCustomerDetailsNode, configurationDescriptor={"nodeDefinition":{"details":"If checkbox: <b>Add selected details to the message metadata</b> is selected, existing fields will be added to the message metadata instead of message data.<br><br><b>Note:</b> only Device, Asset, and Entity View type are allowed.<br><br>If the originator of the message is not assigned to Customer, or originator type is not supported - Message will be forwarded to <b>Failure</b> chain, otherwise, <b>Success</b> chain will be used.","description":"Adds fields from Customer details to the message body or metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"detailsList":[],"addToMetadata":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeEntityDetailsConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,172 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=assign to customer, clazz=org.thingsboard.rule.engine.action.TbAssignToCustomerNode, configurationDescriptor={"nodeDefinition":{"details":"Finds target Customer by customer name pattern and then assign Originator Entity to this customer. Will create new Customer if it doesn't exists and 'Create new Customer if not exists' is set to true.","description":"Assign Message Originator Entity to Customer","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"customerNamePattern":"","customerCacheExpiration":300,"createCustomerIfNotExists":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeAssignToCustomerConfig","icon":"add_circle","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,176 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=assign to customer, clazz=org.thingsboard.rule.engine.action.TbAssignToCustomerNode, configurationDescriptor={"nodeDefinition":{"details":"Finds target Customer by customer name pattern and then assign Originator Entity to this customer. Will create new Customer if it doesn't exists and 'Create new Customer if not exists' is set to true.","description":"Assign Message Originator Entity to Customer","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"customerNamePattern":"","customerCacheExpiration":300,"createCustomerIfNotExists":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeAssignToCustomerConfig","icon":"add_circle","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,226 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=FILTER, scope=TENANT, name=originator type, clazz=org.thingsboard.rule.engine.filter.TbOriginatorTypeFilterNode, configurationDescriptor={"nodeDefinition":{"details":"If Originator Type of incoming message is expected - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.","description":"Filter incoming messages by message Originator Type","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"originatorTypes":["DEVICE"]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeOriginatorTypeConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,233 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=FILTER, scope=TENANT, name=originator type, clazz=org.thingsboard.rule.engine.filter.TbOriginatorTypeFilterNode, configurationDescriptor={"nodeDefinition":{"details":"If Originator Type of incoming message is expected - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.","description":"Filter incoming messages by message Originator Type","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"originatorTypes":["DEVICE"]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeOriginatorTypeConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,745 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=azure iot hub, clazz=org.thingsboard.rule.engine.mqtt.azure.TbAzureIotHubNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the Azure IoT Hub with QoS <b>AT_LEAST_ONCE</b>.","description":"Publish messages to the Azure IoT Hub","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicPattern":"devices/<device_id>/messages/events/","host":"<iot-hub-name>.azure-devices.net","port":8883,"connectTimeoutSec":10,"clientId":null,"cleanSession":true,"ssl":true,"credentials":{"type":"sas","caCert":null,"cert":null,"privateKey":null,"password":null,"sasKey":null}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeAzureIotHubConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,754 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=azure iot hub, clazz=org.thingsboard.rule.engine.mqtt.azure.TbAzureIotHubNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the Azure IoT Hub with QoS <b>AT_LEAST_ONCE</b>.","description":"Publish messages to the Azure IoT Hub","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicPattern":"devices/<device_id>/messages/events/","host":"<iot-hub-name>.azure-devices.net","port":8883,"connectTimeoutSec":10,"clientId":null,"cleanSession":true,"ssl":true,"credentials":{"type":"sas","caCert":null,"cert":null,"privateKey":null,"password":null,"sasKey":null}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeAzureIotHubConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,803 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=FILTER, scope=TENANT, name=originator type switch, clazz=org.thingsboard.rule.engine.filter.TbOriginatorTypeSwitchNode, configurationDescriptor={"nodeDefinition":{"details":"Routes messages to chain according to the originator type ('Device', 'Asset', etc.).","description":"Route incoming messages by Message Originator Type","inEnabled":true,"outEnabled":true,"relationTypes":["Device","Asset","Alarm","Entity View","Tenant","Customer","User","Dashboard","Rule chain","Rule node","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,821 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=FILTER, scope=TENANT, name=originator type switch, clazz=org.thingsboard.rule.engine.filter.TbOriginatorTypeSwitchNode, configurationDescriptor={"nodeDefinition":{"details":"Routes messages to chain according to the originator type ('Device', 'Asset', etc.).","description":"Route incoming messages by Message Originator Type","inEnabled":true,"outEnabled":true,"relationTypes":["Device","Asset","Alarm","Entity View","Tenant","Customer","User","Dashboard","Rule chain","Rule node","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,858 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=FILTER, scope=TENANT, name=check relation, clazz=org.thingsboard.rule.engine.filter.TbCheckRelationNode, configurationDescriptor={"nodeDefinition":{"details":"If at least one relation exists - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.","description":"Checks the relation from the selected entity to the originator of the message by type and direction if 'Check for single entity' is set to true, otherwise rule node will check if exist any relation to the originator of the message by type and direction.","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"direction":"FROM","entityId":null,"entityType":null,"relationType":"Contains","checkForSingleEntity":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeCheckRelationConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,864 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=FILTER, scope=TENANT, name=check relation, clazz=org.thingsboard.rule.engine.filter.TbCheckRelationNode, configurationDescriptor={"nodeDefinition":{"details":"If at least one relation exists - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.","description":"Checks the relation from the selected entity to the originator of the message by type and direction if 'Check for single entity' is set to true, otherwise rule node will check if exist any relation to the originator of the message by type and direction.","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"direction":"FROM","entityId":null,"entityType":null,"relationType":"Contains","checkForSingleEntity":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeCheckRelationConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,896 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=TRANSFORMATION, scope=TENANT, name=script, clazz=org.thingsboard.rule.engine.transform.TbTransformMsgNode, configurationDescriptor={"nodeDefinition":{"details":"JavaScript function receive 3 input parameters <br/> <code>metadata</code> - is a Message metadata.<br/><code>msg</code> - is a Message payload.<br/><code>msgType</code> - is a Message type.<br/>Should return the following structure:<br/><code>{ msg: <i style=\"color: #666;\">new payload</i>,<br/>   metadata: <i style=\"color: #666;\">new metadata</i>,<br/>   msgType: <i style=\"color: #666;\">new msgType</i> }</code><br/>All fields in resulting object are optional and will be taken from original message if not specified.","description":"Change Message payload, Metadata or Message type using JavaScript","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"jsScript":"return {msg: msg, metadata: metadata, msgType: msgType};"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbTransformationNodeScriptConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,899 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=TRANSFORMATION, scope=TENANT, name=script, clazz=org.thingsboard.rule.engine.transform.TbTransformMsgNode, configurationDescriptor={"nodeDefinition":{"details":"JavaScript function receive 3 input parameters <br/> <code>metadata</code> - is a Message metadata.<br/><code>msg</code> - is a Message payload.<br/><code>msgType</code> - is a Message type.<br/>Should return the following structure:<br/><code>{ msg: <i style=\"color: #666;\">new payload</i>,<br/>   metadata: <i style=\"color: #666;\">new metadata</i>,<br/>   msgType: <i style=\"color: #666;\">new msgType</i> }</code><br/>All fields in resulting object are optional and will be taken from original message if not specified.","description":"Change Message payload, Metadata or Message type using JavaScript","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"jsScript":"return {msg: msg, metadata: metadata, msgType: msgType};"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbTransformationNodeScriptConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,918 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=ACTION, scope=TENANT, name=delete relation, clazz=org.thingsboard.rule.engine.action.TbDeleteRelationNode, configurationDescriptor={"nodeDefinition":{"details":"If the relation(s) successfully deleted - Message send via <b>Success</b> chain, otherwise <b>Failure</b> chain will be used.","description":"Finds target Entity by entity name pattern and then delete a relation to Originator Entity by type and direction if 'Delete single entity' is set to true, otherwise rule node will delete all relations to the originator of the message by type and direction.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"direction":"FROM","relationType":"Contains","entityType":null,"entityNamePattern":"","entityTypePattern":null,"entityCacheExpiration":300,"deleteForSingleEntity":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeDeleteRelationConfig","icon":"remove_circle","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:36,927 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=ACTION, scope=TENANT, name=delete relation, clazz=org.thingsboard.rule.engine.action.TbDeleteRelationNode, configurationDescriptor={"nodeDefinition":{"details":"If the relation(s) successfully deleted - Message send via <b>Success</b> chain, otherwise <b>Failure</b> chain will be used.","description":"Finds target Entity by entity name pattern and then delete a relation to Originator Entity by type and direction if 'Delete single entity' is set to true, otherwise rule node will delete all relations to the originator of the message by type and direction.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"direction":"FROM","relationType":"Contains","entityType":null,"entityNamePattern":"","entityTypePattern":null,"entityCacheExpiration":300,"deleteForSingleEntity":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeDeleteRelationConfig","icon":"remove_circle","iconUrl":"","docUrl":""}}, actions=null)
2021-08-07 14:27:37,047 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Processing scanned component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=aws sns, clazz=org.thingsboard.rule.engine.aws.sns.TbSnsNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the AWS SNS topic. Outbound message will contain response fields (<code>messageId</code>, <code>requestId</code>) in the Message Metadata from the AWS SNS. For example <b>requestId</b> field can be accessed with <code>metadata.requestId</code>.","description":"Publish message to the AWS SNS","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicArnPattern":"arn:aws:sns:us-east-1:123456789012:MyNewTopic","accessKeyId":null,"secretAccessKey":null,"region":"us-east-1"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSnsConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48cGF0aCBkPSJNMTMuMjMgMTAuNTZWMTBjLTEuOTQgMC0zLjk5LjM5LTMuOTkgMi42NyAwIDEuMTYuNjEgMS45NSAxLjYzIDEuOTUuNzYgMCAxLjQzLS40NyAxLjg2LTEuMjIuNTItLjkzLjUtMS44LjUtMi44NG0yLjcgNi41M2MtLjE4LjE2LS40My4xNy0uNjMuMDYtLjg5LS43NC0xLjA1LTEuMDgtMS41NC0xLjc5LTEuNDcgMS41LTIuNTEgMS45NS00LjQyIDEuOTUtMi4yNSAwLTQuMDEtMS4zOS00LjAxLTQuMTcgMC0yLjE4IDEuMTctMy42NCAyLjg2LTQuMzggMS40Ni0uNjQgMy40OS0uNzYgNS4wNC0uOTNWNy41YzAtLjY2LjA1LTEuNDEtLjMzLTEuOTYtLjMyLS40OS0uOTUtLjctMS41LS43LTEuMDIgMC0xLjkzLjUzLTIuMTUgMS42MS0uMDUuMjQtLjI1LjQ4LS40Ny40OWwtMi42LS4yOGMtLjIyLS4wNS0uNDYtLjIyLS40LS41Ni42LTMuMTUgMy40NS00LjEgNi00LjEgMS4zIDAgMyAuMzUgNC4wMyAxLjMzQzE3LjExIDQuNTUgMTcgNi4xOCAxNyA3Ljk1djQuMTdjMCAxLjI1LjUgMS44MSAxIDIuNDguMTcuMjUuMjEuNTQgMCAuNzFsLTIuMDYgMS43OGgtLjAxIj48L3BhdGg+PHBhdGggZD0iTTIwLjE2IDE5LjU0QzE4IDIxLjE0IDE0LjgyIDIyIDEyLjEgMjJjLTMuODEgMC03LjI1LTEuNDEtOS44NS0zLjc2LS4yLS4xOC0uMDItLjQzLjI1LS4yOSAyLjc4IDEuNjMgNi4yNSAyLjYxIDkuODMgMi42MSAyLjQxIDAgNS4wNy0uNSA3LjUxLTEuNTMuMzctLjE2LjY2LjI0LjMyLjUxIj48L3BhdGg+PHBhdGggZD0iTTIxLjA3IDE4LjVjLS4yOC0uMzYtMS44NS0uMTctMi41Ny0uMDgtLjE5LjAyLS4yMi0uMTYtLjAzLS4zIDEuMjQtLjg4IDMuMjktLjYyIDMuNTMtLjMzLjI0LjMtLjA3IDIuMzUtMS4yNCAzLjMyLS4xOC4xNi0uMzUuMDctLjI2LS4xMS4yNi0uNjcuODUtMi4xNC41Ny0yLjV6Ij48L3BhdGg+PC9zdmc+","docUrl":""}}, actions=null)
2021-08-07 14:27:37,080 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Persisting new component: ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=aws sns, clazz=org.thingsboard.rule.engine.aws.sns.TbSnsNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the AWS SNS topic. Outbound message will contain response fields (<code>messageId</code>, <code>requestId</code>) in the Message Metadata from the AWS SNS. For example <b>requestId</b> field can be accessed with <code>metadata.requestId</code>.","description":"Publish message to the AWS SNS","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicArnPattern":"arn:aws:sns:us-east-1:123456789012:MyNewTopic","accessKeyId":null,"secretAccessKey":null,"region":"us-east-1"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSnsConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48cGF0aCBkPSJNMTMuMjMgMTAuNTZWMTBjLTEuOTQgMC0zLjk5LjM5LTMuOTkgMi42NyAwIDEuMTYuNjEgMS45NSAxLjYzIDEuOTUuNzYgMCAxLjQzLS40NyAxLjg2LTEuMjIuNTItLjkzLjUtMS44LjUtMi44NG0yLjcgNi41M2MtLjE4LjE2LS40My4xNy0uNjMuMDYtLjg5LS43NC0xLjA1LTEuMDgtMS41NC0xLjc5LTEuNDcgMS41LTIuNTEgMS45NS00LjQyIDEuOTUtMi4yNSAwLTQuMDEtMS4zOS00LjAxLTQuMTcgMC0yLjE4IDEuMTctMy42NCAyLjg2LTQuMzggMS40Ni0uNjQgMy40OS0uNzYgNS4wNC0uOTNWNy41YzAtLjY2LjA1LTEuNDEtLjMzLTEuOTYtLjMyLS40OS0uOTUtLjctMS41LS43LTEuMDIgMC0xLjkzLjUzLTIuMTUgMS42MS0uMDUuMjQtLjI1LjQ4LS40Ny40OWwtMi42LS4yOGMtLjIyLS4wNS0uNDYtLjIyLS40LS41Ni42LTMuMTUgMy40NS00LjEgNi00LjEgMS4zIDAgMyAuMzUgNC4wMyAxLjMzQzE3LjExIDQuNTUgMTcgNi4xOCAxNyA3Ljk1djQuMTdjMCAxLjI1LjUgMS44MSAxIDIuNDguMTcuMjUuMjEuNTQgMCAuNzFsLTIuMDYgMS43OGgtLjAxIj48L3BhdGg+PHBhdGggZD0iTTIwLjE2IDE5LjU0QzE4IDIxLjE0IDE0LjgyIDIyIDEyLjEgMjJjLTMuODEgMC03LjI1LTEuNDEtOS44NS0zLjc2LS4yLS4xOC0uMDItLjQzLjI1LS4yOSAyLjc4IDEuNjMgNi4yNSAyLjYxIDkuODMgMi42MSAyLjQxIDAgNS4wNy0uNSA3LjUxLTEuNTMuMzctLjE2LjY2LjI0LjMyLjUxIj48L3BhdGg+PHBhdGggZD0iTTIxLjA3IDE4LjVjLS4yOC0uMzYtMS44NS0uMTctMi41Ny0uMDgtLjE5LjAyLS4yMi0uMTYtLjAzLS4zIDEuMjQtLjg4IDMuMjktLjYyIDMuNTMtLjMzLjI0LjMtLjA3IDIuMzUtMS4yNCAzLjMyLS4xOC4xNi0uMzUuMDctLjI2LS4xMS4yNi0uNjcuODUtMi4xNC41Ny0yLjV6Ij48L3BhdGg+PC9zdmc+","docUrl":""}}, actions=null)
2021-08-07 14:27:37,116 [main] INFO o.t.s.s.c.AnnotationComponentDiscoveryService - Found following definitions: [ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=aws sqs, clazz=org.thingsboard.rule.engine.aws.sqs.TbSqsNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload and metadata attributes to the AWS SQS queue. Outbound message will contain response fields (<code>messageId</code>, <code>requestId</code>, <code>messageBodyMd5</code>, <code>messageAttributesMd5</code>, <code>sequenceNumber</code>) in the Message Metadata from the AWS SQS. For example <b>requestId</b> field can be accessed with <code>metadata.requestId</code>.","description":"Publish messages to the AWS SQS","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"queueType":"STANDARD","queueUrlPattern":"https://sqs.us-east-1.amazonaws.com/123456789012/my-queue-name","delaySeconds":0,"messageAttributes":{},"accessKeyId":null,"secretAccessKey":null,"region":"us-east-1"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSqsConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48cGF0aCBkPSJNMTMuMjMgMTAuNTZWMTBjLTEuOTQgMC0zLjk5LjM5LTMuOTkgMi42NyAwIDEuMTYuNjEgMS45NSAxLjYzIDEuOTUuNzYgMCAxLjQzLS40NyAxLjg2LTEuMjIuNTItLjkzLjUtMS44LjUtMi44NG0yLjcgNi41M2MtLjE4LjE2LS40My4xNy0uNjMuMDYtLjg5LS43NC0xLjA1LTEuMDgtMS41NC0xLjc5LTEuNDcgMS41LTIuNTEgMS45NS00LjQyIDEuOTUtMi4yNSAwLTQuMDEtMS4zOS00LjAxLTQuMTcgMC0yLjE4IDEuMTctMy42NCAyLjg2LTQuMzggMS40Ni0uNjQgMy40OS0uNzYgNS4wNC0uOTNWNy41YzAtLjY2LjA1LTEuNDEtLjMzLTEuOTYtLjMyLS40OS0uOTUtLjctMS41LS43LTEuMDIgMC0xLjkzLjUzLTIuMTUgMS42MS0uMDUuMjQtLjI1LjQ4LS40Ny40OWwtMi42LS4yOGMtLjIyLS4wNS0uNDYtLjIyLS40LS41Ni42LTMuMTUgMy40NS00LjEgNi00LjEgMS4zIDAgMyAuMzUgNC4wMyAxLjMzQzE3LjExIDQuNTUgMTcgNi4xOCAxNyA3Ljk1djQuMTdjMCAxLjI1LjUgMS44MSAxIDIuNDguMTcuMjUuMjEuNTQgMCAuNzFsLTIuMDYgMS43OGgtLjAxIj48L3BhdGg+PHBhdGggZD0iTTIwLjE2IDE5LjU0QzE4IDIxLjE0IDE0LjgyIDIyIDEyLjEgMjJjLTMuODEgMC03LjI1LTEuNDEtOS44NS0zLjc2LS4yLS4xOC0uMDItLjQzLjI1LS4yOSAyLjc4IDEuNjMgNi4yNSAyLjYxIDkuODMgMi42MSAyLjQxIDAgNS4wNy0uNSA3LjUxLTEuNTMuMzctLjE2LjY2LjI0LjMyLjUxIj48L3BhdGg+PHBhdGggZD0iTTIxLjA3IDE4LjVjLS4yOC0uMzYtMS44NS0uMTctMi41Ny0uMDgtLjE5LjAyLS4yMi0uMTYtLjAzLS4zIDEuMjQtLjg4IDMuMjktLjYyIDMuNTMtLjMzLjI0LjMtLjA3IDIuMzUtMS4yNCAzLjMyLS4xOC4xNi0uMzUuMDctLjI2LS4xMS4yNi0uNjcuODUtMi4xNC41Ny0yLjV6Ij48L3BhdGg+PC9zdmc+","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=log, clazz=org.thingsboard.rule.engine.action.TbLogNode, configurationDescriptor={"nodeDefinition":{"details":"Transform incoming Message with configured JS function to String and log final value into Thingsboard log file. Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.","description":"Log incoming messages using JS script for transformation Message into String","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"jsScript":"return 'Incoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeLogConfig","icon":"menu","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=send email, clazz=org.thingsboard.rule.engine.mail.TbSendEmailNode, configurationDescriptor={"nodeDefinition":{"details":"Expects messages with <b>SEND_EMAIL</b> type. Node works only with messages that where created using <code>to Email</code> transformation Node, please connect this Node with <code>to Email</code> Node using <code>Successful</code> chain.","description":"Sends email message via SMTP server.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"useSystemSmtpSettings":true,"smtpHost":"localhost","smtpPort":25,"username":null,"password":null,"smtpProtocol":"smtp","timeout":10000,"enableTls":false,"tlsVersion":"TLSv1.2","enableProxy":false,"proxyHost":null,"proxyPort":null,"proxyUser":null,"proxyPassword":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSendEmailConfig","icon":"send","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=clear alarm, clazz=org.thingsboard.rule.engine.action.TbClearAlarmNode, configurationDescriptor={"nodeDefinition":{"details":"Details - JS function that creates JSON object based on incoming message. This object will be added into Alarm.details field.\nNode output:\nIf alarm was not cleared, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'metadata' will contains 'isClearedAlarm' property. Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.","description":"Clear Alarm","inEnabled":true,"outEnabled":true,"relationTypes":["Cleared","False","Failure"],"customRelations":false,"defaultConfiguration":{"alarmType":"General Alarm","alarmDetailsBuildJs":"var details = {};\nif (metadata.prevAlarmDetails) {\n details = JSON.parse(metadata.prevAlarmDetails);\n}\nreturn details;"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeClearAlarmConfig","icon":"notifications_off","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=send sms, clazz=org.thingsboard.rule.engine.sms.TbSendSmsNode, configurationDescriptor={"nodeDefinition":{"details":"Will send SMS message by populating target phone numbers and sms message fields using values derived from message metadata.","description":"Sends SMS message via SMS provider.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"numbersToTemplate":"${userPhone}","smsMessageTemplate":"Device ${deviceName} has high temperature ${temp}","useSystemSmsSettings":true,"smsProviderConfiguration":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSendSmsConfig","icon":"sms","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=FILTER, scope=TENANT, name=switch, clazz=org.thingsboard.rule.engine.filter.TbJsSwitchNode, configurationDescriptor={"nodeDefinition":{"details":"Node executes configured JS script. Script should return array of next Chain names where Message should be routed. If Array is empty - message not routed to next Node. Message payload can be accessed via <code>msg</code> property. For example <code>msg.temperature < 10;</code><br/>Message metadata can be accessed via <code>metadata</code> property. For example <code>metadata.customerName === 'John';</code><br/>Message type can be accessed via <code>msgType</code> property.","description":"Route incoming Message to one or multiple output chains","inEnabled":true,"outEnabled":true,"relationTypes":["Failure"],"customRelations":true,"defaultConfiguration":{"jsScript":"function nextRelation(metadata, msg) {\n return ['one','nine'];\n}\nif(msgType === 'POST_TELEMETRY_REQUEST') {\n return ['two'];\n}\nreturn nextRelation(metadata, msg);"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeSwitchConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=delete relation, clazz=org.thingsboard.rule.engine.action.TbDeleteRelationNode, configurationDescriptor={"nodeDefinition":{"details":"If the relation(s) successfully deleted - Message send via <b>Success</b> chain, otherwise <b>Failure</b> chain will be used.","description":"Finds target Entity by entity name pattern and then delete a relation to Originator Entity by type and direction if 'Delete single entity' is set to true, otherwise rule node will delete all relations to the originator of the message by type and direction.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"direction":"FROM","relationType":"Contains","entityType":null,"entityNamePattern":"","entityTypePattern":null,"entityCacheExpiration":300,"deleteForSingleEntity":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeDeleteRelationConfig","icon":"remove_circle","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=FILTER, scope=TENANT, name=originator type switch, clazz=org.thingsboard.rule.engine.filter.TbOriginatorTypeSwitchNode, configurationDescriptor={"nodeDefinition":{"details":"Routes messages to chain according to the originator type ('Device', 'Asset', etc.).","description":"Route incoming messages by Message Originator Type","inEnabled":true,"outEnabled":true,"relationTypes":["Device","Asset","Alarm","Entity View","Tenant","Customer","User","Dashboard","Rule chain","Rule node","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=originator telemetry, clazz=org.thingsboard.rule.engine.metadata.TbGetTelemetryNode, configurationDescriptor={"nodeDefinition":{"details":"The node allows you to select fetch mode: <b>FIRST/LAST/ALL</b> to fetch telemetry of certain time range that are added into Message metadata without any prefix. If selected fetch mode <b>ALL</b> Telemetry will be added like array into Message Metadata where <b>key</b> is Timestamp and <b>value</b> is value of Telemetry.</br>If selected fetch mode <b>FIRST</b> or <b>LAST</b> Telemetry will be added like string without Timestamp.</br>Also, the rule node allows you to select telemetry sampling order: <b>ASC</b> or <b>DESC</b>. </br><b>Note</b>: The maximum size of the fetched array is 1000 records.\n ","description":"Add Message Originator Telemetry for selected time range into Message Metadata\n","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"startInterval":2,"endInterval":1,"startIntervalPattern":"","endIntervalPattern":"","useMetadataIntervalPatterns":false,"startIntervalTimeUnit":"MINUTES","endIntervalTimeUnit":"MINUTES","fetchMode":"FIRST","orderBy":"ASC","limit":1000,"latestTsKeyNames":[]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeGetTelemetryFromDatabase","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=originator attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetAttributesNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, <b>CLIENT/SHARED/SERVER</b> attributes are added into Message metadata with specific prefix: <i>cs/shared/ss</i>. Latest telemetry value added into metadata without prefix. To access those attributes in other nodes this template can be used <code>metadata.cs_temperature</code> or <code>metadata.shared_limit</code> ","description":"Add Message Originator Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"clientAttributeNames":[],"sharedAttributeNames":[],"serverAttributeNames":[],"latestTsKeyNames":[],"tellFailureIfAbsent":true,"getLatestValueWithTs":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeOriginatorAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=related attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetRelatedAttributeNode, configurationDescriptor={"nodeDefinition":{"details":"Related Entity found using configured relation direction and Relation Type. If multiple Related Entities are found, only first Entity is used for attributes enrichment, other entities are discarded. If Attributes enrichment configured, server scope attributes are added into Message metadata. If Latest Telemetry enrichment configured, latest telemetry added into metadata. To access those attributes in other nodes this template can be used <code>metadata.temperature</code>.","description":"Add Originators Related Entity Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"attrMapping":{"temperature":"tempo"},"relationsQuery":{"direction":"FROM","maxLevel":1,"filters":[{"relationType":"Contains","entityTypes":[]}],"fetchLastLevelOnly":false},"telemetry":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeRelatedAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=copy to view, clazz=org.thingsboard.rule.engine.action.TbCopyAttributesToEntityViewNode, configurationDescriptor={"nodeDefinition":{"details":"Copy attributes from asset/device to related entity view according to entity view configuration. \n Copy will be done only for attributes that are between start and end dates and according to attribute keys configuration. \nChanges message originator to related entity view and produces new messages according to count of updated entity views","description":"Copy attributes from asset/device to entity view and changes message originator to related entity view","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"content_copy","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=FILTER, scope=TENANT, name=message type, clazz=org.thingsboard.rule.engine.filter.TbMsgTypeFilterNode, configurationDescriptor={"nodeDefinition":{"details":"If incoming MessageType is expected - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.","description":"Filter incoming messages by Message Type","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"messageTypes":["POST_ATTRIBUTES_REQUEST","POST_TELEMETRY_REQUEST","TO_SERVER_RPC_REQUEST"]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeMessageTypeConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=message count, clazz=org.thingsboard.rule.engine.action.TbMsgCountNode, configurationDescriptor={"nodeDefinition":{"details":"Count incoming messages for specified interval and produces POST_TELEMETRY_REQUEST msg with messages count","description":"Count incoming messages","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"telemetryPrefix":"messageCount","interval":1},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeMsgCountConfig","icon":"functions","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=synchronization start, clazz=org.thingsboard.rule.engine.transaction.TbSynchronizationBeginNode, configurationDescriptor={"nodeDefinition":{"details":"This node should be used together with \"synchronization end\" node. \n This node will put messages into queue based on message originator id. \nSubsequent messages will not be processed until the previous message processing is completed or timeout event occurs.\nSize of the queue per originator and timeout values are configurable on a system level","description":"This Node is now deprecated. Use \"Checkpoint\" instead.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=FILTER, scope=TENANT, name=script, clazz=org.thingsboard.rule.engine.filter.TbJsFilterNode, configurationDescriptor={"nodeDefinition":{"details":"Evaluate incoming Message with configured JS condition. If <b>True</b> - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.Message payload can be accessed via <code>msg</code> property. For example <code>msg.temperature < 10;</code><br/>Message metadata can be accessed via <code>metadata</code> property. For example <code>metadata.customerName === 'John';</code><br/>Message type can be accessed via <code>msgType</code> property.","description":"Filter incoming messages using JS script","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"jsScript":"return msg.temperature > 20;"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeScriptConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=rpc call request, clazz=org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode, configurationDescriptor={"nodeDefinition":{"details":"Expects messages with \"method\" and \"params\". Will forward response from device to next nodes.If the RPC call request is originated by REST API call from user, will forward the response to user immediately.","description":"Sends RPC call to device","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"timeoutInSeconds":60},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRpcRequestConfig","icon":"call_made","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=TRANSFORMATION, scope=TENANT, name=script, clazz=org.thingsboard.rule.engine.transform.TbTransformMsgNode, configurationDescriptor={"nodeDefinition":{"details":"JavaScript function receive 3 input parameters <br/> <code>metadata</code> - is a Message metadata.<br/><code>msg</code> - is a Message payload.<br/><code>msgType</code> - is a Message type.<br/>Should return the following structure:<br/><code>{ msg: <i style=\"color: #666;\">new payload</i>,<br/>   metadata: <i style=\"color: #666;\">new metadata</i>,<br/>   msgType: <i style=\"color: #666;\">new msgType</i> }</code><br/>All fields in resulting object are optional and will be taken from original message if not specified.","description":"Change Message payload, Metadata or Message type using JavaScript","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"jsScript":"return {msg: msg, metadata: metadata, msgType: msgType};"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbTransformationNodeScriptConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=FILTER, scope=TENANT, name=message type switch, clazz=org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode, configurationDescriptor={"nodeDefinition":{"details":"Sends messages with message types <b>\"Post attributes\", \"Post telemetry\", \"RPC Request\"</b> etc. via corresponding chain, otherwise <b>Other</b> chain is used.","description":"Route incoming messages by Message Type","inEnabled":true,"outEnabled":true,"relationTypes":["Post attributes","Post telemetry","RPC Request from Device","RPC Request to Device","Activity Event","Inactivity Event","Connect Event","Disconnect Event","Entity Created","Entity Updated","Entity Deleted","Entity Assigned","Entity Unassigned","Attributes Updated","Attributes Deleted","Alarm Acknowledged","Alarm Cleared","Other","Entity Assigned From Tenant","Entity Assigned To Tenant","Timeseries Updated","Timeseries Deleted","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=generator, clazz=org.thingsboard.rule.engine.debug.TbMsgGeneratorNode, configurationDescriptor={"nodeDefinition":{"details":"Generates messages with configurable period. Javascript function used for message generation.","description":"Periodically generates messages","inEnabled":false,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"msgCount":0,"periodInSeconds":1,"originatorId":null,"originatorType":null,"jsScript":"var msg = { temp: 42, humidity: 77 };\nvar metadata = { data: 40 };\nvar msgType = \"POST_TELEMETRY_REQUEST\";\n\nreturn { msg: msg, metadata: metadata, msgType: msgType };"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeGeneratorConfig","icon":"repeat","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=FILTER, scope=TENANT, name=check relation, clazz=org.thingsboard.rule.engine.filter.TbCheckRelationNode, configurationDescriptor={"nodeDefinition":{"details":"If at least one relation exists - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.","description":"Checks the relation from the selected entity to the originator of the message by type and direction if 'Check for single entity' is set to true, otherwise rule node will check if exist any relation to the originator of the message by type and direction.","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"direction":"FROM","entityId":null,"entityType":null,"relationType":"Contains","checkForSingleEntity":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeCheckRelationConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=device profile, clazz=org.thingsboard.rule.engine.profile.TbDeviceProfileNode, configurationDescriptor={"nodeDefinition":{"details":"Create and clear alarms based on alarm rules defined in device profile. The output relation type is either 'Alarm Created', 'Alarm Updated', 'Alarm Severity Updated' and 'Alarm Cleared' or simply 'Success' if no alarms were affected.","description":"Process device messages based on device profile settings","inEnabled":true,"outEnabled":true,"relationTypes":["Alarm Created","Alarm Updated","Alarm Severity Updated","Alarm Cleared","Success","Failure"],"customRelations":true,"defaultConfiguration":{"persistAlarmRulesState":false,"fetchAlarmRulesStateOnStart":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbDeviceProfileConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=checkpoint, clazz=org.thingsboard.rule.engine.flow.TbCheckpointNode, configurationDescriptor={"nodeDefinition":{"details":"After successful transfer incoming message is automatically acknowledged. Queue name is configurable.","description":"transfers the message to another queue","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"queueName":"HighPriority"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCheckPointConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=FILTER, scope=TENANT, name=originator type, clazz=org.thingsboard.rule.engine.filter.TbOriginatorTypeFilterNode, configurationDescriptor={"nodeDefinition":{"details":"If Originator Type of incoming message is expected - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.","description":"Filter incoming messages by message Originator Type","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"originatorTypes":["DEVICE"]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeOriginatorTypeConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=TRANSFORMATION, scope=TENANT, name=change originator, clazz=org.thingsboard.rule.engine.transform.TbChangeOriginatorNode, configurationDescriptor={"nodeDefinition":{"details":"Related Entity found using configured relation direction and Relation Type. If multiple Related Entities are found, only first Entity is used as new Originator, other entities are discarded.<br/>Alarm Originator found only in case original Originator is <code>Alarm</code> entity.","description":"Change Message Originator To Tenant/Customer/Related Entity/Alarm Originator","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"originatorSource":"CUSTOMER","relationsQuery":{"direction":"FROM","maxLevel":1,"filters":[{"relationType":"Contains","entityTypes":[]}],"fetchLastLevelOnly":false}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbTransformationNodeChangeOriginatorConfig","icon":"find_replace","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=gcp pubsub, clazz=org.thingsboard.rule.engine.gcp.pubsub.TbPubSubNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the Google Cloud Platform PubSub topic. Outbound message will contain response fields (<code>messageId</code> in the Message Metadata from the GCP PubSub. <b>messageId</b> field can be accessed with <code>metadata.messageId</code>.","description":"Publish message to the Google Cloud PubSub","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"projectId":"my-google-cloud-project-id","topicName":"my-pubsub-topic-name","messageAttributes":{},"serviceAccountKey":null,"serviceAccountKeyFileName":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodePubSubConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+Cjx0aXRsZT5DbG91ZCBQdWJTdWI8L3RpdGxlPgo8Zz4KPHBhdGggZD0iTTEyNi40Nyw1OC4xMmwtMjYuMy00NS43NEExMS41NiwxMS41NiwwLDAsMCw5MC4zMSw2LjVIMzcuN2ExMS41NSwxMS41NSwwLDAsMC05Ljg2LDUuODhMMS41Myw1OGExMS40OCwxMS40OCwwLDAsMCwwLDExLjQ0bDI2LjMsNDZhMTEuNzcsMTEuNzcsMCwwLDAsOS44Niw2LjA5SDkwLjNhMTEuNzMsMTEuNzMsMCwwLDAsOS44Ny02LjA2bDI2LjMtNDUuNzRBMTEuNzMsMTEuNzMsMCwwLDAsMTI2LjQ3LDU4LjEyWiIgc3R5bGU9ImZpbGw6ICM3MzViMmYiLz4KPHBhdGggZD0iTTg5LjIyLDQ3Ljc0LDgzLjM2LDQ5bC0xNC42LTE0LjZMNjQuMDksNDMuMSw2MS41NSw1My4ybDQuMjksNC4yOUw1Ny42LDU5LjE4LDQ2LjMsNDcuODhsLTcuNjcsNy4zOEw1Mi43Niw2OS4zN2wtMTUsMTEuOUw3OCwxMjEuNUg5MC4zYTExLjczLDExLjczLDAsMCwwLDkuODctNi4wNmwyMC43Mi0zNloiIHN0eWxlPSJvcGFjaXR5OiAwLjA3MDAwMDAwMDI5ODAyMztpc29sYXRpb246IGlzb2xhdGUiLz4KPHBhdGggZD0iTTgyLjg2LDQ3YTUuMzIsNS4zMiwwLDEsMS0xLjk1LDcuMjdBNS4zMiw1LjMyLDAsMCwxLDgyLjg2LDQ3IiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8cGF0aCBkPSJNMzkuODIsNTYuMThhNS4zMiw1LjMyLDAsMSwxLDcuMjctMS45NSw1LjMyLDUuMzIsMCwwLDEtNy4yNywxLjk1IiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8cGF0aCBkPSJNNjkuMzIsODguODVBNS4zMiw1LjMyLDAsMSwxLDY0LDgzLjUyYTUuMzIsNS4zMiwwLDAsMSw1LjMyLDUuMzIiIHN0eWxlPSJmaWxsOiAjZmZmIi8+CjxnPgo8cGF0aCBkPSJNNjQsNTIuOTRhMTEuMDYsMTEuMDYsMCwwLDEsMi40Ni4yOFYzOS4xNUg2MS41NFY1My4yMkExMS4wNiwxMS4wNiwwLDAsMSw2NCw1Mi45NFoiIHN0eWxlPSJmaWxsOiAjZmZmIi8+CjxwYXRoIGQ9Ik03NC41Nyw2Ny4yNmExMSwxMSwwLDAsMS0yLjQ3LDQuMjVsMTIuMTksNywyLjQ2LTQuMjZaIiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8cGF0aCBkPSJNNTMuNDMsNjcuMjZsLTEyLjE4LDcsMi40Niw0LjI2LDEyLjE5LTdBMTEsMTEsMCwwLDEsNTMuNDMsNjcuMjZaIiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8L2c+CjxwYXRoIGQ9Ik03Mi42LDY0QTguNiw4LjYsMCwxLDEsNjQsNTUuNCw4LjYsOC42LDAsMCwxLDcyLjYsNjQiIHN0eWxlPSJmaWxsOiAjZmZmIi8+CjxwYXRoIGQ9Ik0zOS4xLDcwLjU3YTYuNzYsNi43NiwwLDEsMS0yLjQ3LDkuMjMsNi43Niw2Ljc2LDAsMCwxLDIuNDctOS4yMyIgc3R5bGU9ImZpbGw6ICNmZmYiLz4KPHBhdGggZD0iTTgyLjE0LDgyLjI3YTYuNzYsNi43NiwwLDEsMSw5LjIzLTIuNDcsNi43NSw2Ljc1LDAsMCwxLTkuMjMsMi40NyIgc3R5bGU9ImZpbGw6ICNmZmYiLz4KPHBhdGggZD0iTTcwLjc2LDM5LjE1QTYuNzYsNi43NiwwLDEsMSw2NCwzMi4zOWE2Ljc2LDYuNzYsMCwwLDEsNi43Niw2Ljc2IiBzdHlsZT0iZmlsbDogI2ZmZiIvPgo8L2c+Cjwvc3ZnPgo=","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=create relation, clazz=org.thingsboard.rule.engine.action.TbCreateRelationNode, configurationDescriptor={"nodeDefinition":{"details":"If the relation already exists or successfully created - Message send via <b>Success</b> chain, otherwise <b>Failure</b> chain will be used.","description":"Finds target Entity by entity name pattern and (entity type pattern for Asset, Device) and then create a relation to Originator Entity by type and direction. If Selected entity type: Asset, Device or Customer will create new Entity if it doesn't exist and selected checkbox 'Create new entity if not exists'.<br> In case that relation from the message originator to the selected entity not exist and If selected checkbox 'Remove current relations', before creating the new relation all existed relations to message originator by type and direction will be removed.<br> If relation from the message originator to the selected entity created and If selected checkbox 'Change originator to related entity', outbound message will be processed as a message from this entity.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"direction":"FROM","relationType":"Contains","entityType":null,"entityNamePattern":"","entityTypePattern":null,"entityCacheExpiration":300,"createEntityIfNotExists":false,"changeOriginatorToRelatedEntity":false,"removeCurrentRelations":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCreateRelationConfig","icon":"add_circle","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=calculate delta, clazz=org.thingsboard.rule.engine.metadata.CalculateDeltaNode, configurationDescriptor={"nodeDefinition":{"details":"Calculates delta and period based on the previous time-series reading and current data. Delta calculation is done in scope of the message originator, e.g. device, asset or customer. If there is input key, the output relation will be 'Success' unless delta is negative and corresponding configuration parameter is set. If there is no input value key in the incoming message, the output relation will be 'Other'.","description":"Calculates and adds 'delta' value into message based on the incoming and previous value","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure","Other"],"customRelations":false,"defaultConfiguration":{"inputValueKey":"pulseCounter","outputValueKey":"delta","useCache":true,"addPeriodBetweenMsgs":false,"periodValueKey":"periodInMs","round":null,"tellFailureIfDeltaIsNegative":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeCalculateDeltaConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=related device attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetDeviceAttrNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, <b>CLIENT/SHARED/SERVER</b> attributes are added into Message metadata with specific prefix: <i>cs/shared/ss</i>. Latest telemetry value added into metadata without prefix. To access those attributes in other nodes this template can be used <code>metadata.cs_temperature</code> or <code>metadata.shared_limit</code> ","description":"Add Originators Related Device Attributes and Latest Telemetry value into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"clientAttributeNames":[],"sharedAttributeNames":[],"serverAttributeNames":[],"latestTsKeyNames":[],"tellFailureIfAbsent":true,"getLatestValueWithTs":false,"deviceRelationsQuery":{"direction":"FROM","maxLevel":1,"relationType":"Contains","deviceTypes":["default"],"fetchLastLevelOnly":false}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeDeviceAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=FILTER, scope=TENANT, name=gps geofencing filter, clazz=org.thingsboard.rule.engine.geo.TbGpsGeofencingFilterNode, configurationDescriptor={"nodeDefinition":{"details":"Extracts latitude and longitude parameters from incoming message and returns 'True' if they are inside configured perimeters, 'False' otherwise.","description":"Filter incoming messages by GPS based geofencing","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"latitudeKeyName":"latitude","longitudeKeyName":"longitude","fetchPerimeterInfoFromMessageMetadata":true,"perimeterType":null,"polygonsDefinition":null,"centerLatitude":null,"centerLongitude":null,"range":null,"rangeUnit":null},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeGpsGeofencingConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=assign to customer, clazz=org.thingsboard.rule.engine.action.TbAssignToCustomerNode, configurationDescriptor={"nodeDefinition":{"details":"Finds target Customer by customer name pattern and then assign Originator Entity to this customer. Will create new Customer if it doesn't exists and 'Create new Customer if not exists' is set to true.","description":"Assign Message Originator Entity to Customer","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"customerNamePattern":"","customerCacheExpiration":300,"createCustomerIfNotExists":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeAssignToCustomerConfig","icon":"add_circle","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=TRANSFORMATION, scope=TENANT, name=to email, clazz=org.thingsboard.rule.engine.mail.TbMsgToEmailNode, configurationDescriptor={"nodeDefinition":{"details":"Transforms message to email message by populating email fields using values derived from message metadata. Set 'SEND_EMAIL' output message type.","description":"Transforms message to email message","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"fromTemplate":"info@testmail.org","toTemplate":"${userEmail}","ccTemplate":null,"bccTemplate":null,"subjectTemplate":"Device ${deviceType} temperature high","bodyTemplate":"Device ${deviceName} has high temperature ${temp}"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbTransformationNodeToEmailConfig","icon":"email","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=unassign from customer, clazz=org.thingsboard.rule.engine.action.TbUnassignFromCustomerNode, configurationDescriptor={"nodeDefinition":{"details":"Finds target Entity Customer by Customer name pattern and then unassign Originator Entity from this customer.","description":"Unassign Message Originator Entity from Customer","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"customerNamePattern":"","customerCacheExpiration":300},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeUnAssignToCustomerConfig","icon":"remove_circle","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=tenant details, clazz=org.thingsboard.rule.engine.metadata.TbGetTenantDetailsNode, configurationDescriptor={"nodeDefinition":{"details":"If checkbox: <b>Add selected details to the message metadata</b> is selected, existing fields will be added to the message metadata instead of message data.<br><br><b>Note:</b> only Device, Asset, and Entity View type are allowed.<br><br>If the originator of the message is not assigned to Tenant, or originator type is not supported - Message will be forwarded to <b>Failure</b> chain, otherwise, <b>Success</b> chain will be used.","description":"Adds fields from Tenant details to the message body or metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"detailsList":[],"addToMetadata":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeEntityDetailsConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=acknowledge, clazz=org.thingsboard.rule.engine.flow.TbAckNode, configurationDescriptor={"nodeDefinition":{"details":"After acknowledgement, the message is pushed to related rule nodes. Useful if you don't care what happens to this message next.","description":"Acknowledges the incoming message","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=azure iot hub, clazz=org.thingsboard.rule.engine.mqtt.azure.TbAzureIotHubNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the Azure IoT Hub with QoS <b>AT_LEAST_ONCE</b>.","description":"Publish messages to the Azure IoT Hub","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicPattern":"devices/<device_id>/messages/events/","host":"<iot-hub-name>.azure-devices.net","port":8883,"connectTimeoutSec":10,"clientId":null,"cleanSession":true,"ssl":true,"credentials":{"type":"sas","caCert":null,"cert":null,"privateKey":null,"password":null,"sasKey":null}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeAzureIotHubConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=aws sns, clazz=org.thingsboard.rule.engine.aws.sns.TbSnsNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the AWS SNS topic. Outbound message will contain response fields (<code>messageId</code>, <code>requestId</code>) in the Message Metadata from the AWS SNS. For example <b>requestId</b> field can be accessed with <code>metadata.requestId</code>.","description":"Publish message to the AWS SNS","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicArnPattern":"arn:aws:sns:us-east-1:123456789012:MyNewTopic","accessKeyId":null,"secretAccessKey":null,"region":"us-east-1"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeSnsConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48cGF0aCBkPSJNMTMuMjMgMTAuNTZWMTBjLTEuOTQgMC0zLjk5LjM5LTMuOTkgMi42NyAwIDEuMTYuNjEgMS45NSAxLjYzIDEuOTUuNzYgMCAxLjQzLS40NyAxLjg2LTEuMjIuNTItLjkzLjUtMS44LjUtMi44NG0yLjcgNi41M2MtLjE4LjE2LS40My4xNy0uNjMuMDYtLjg5LS43NC0xLjA1LTEuMDgtMS41NC0xLjc5LTEuNDcgMS41LTIuNTEgMS45NS00LjQyIDEuOTUtMi4yNSAwLTQuMDEtMS4zOS00LjAxLTQuMTcgMC0yLjE4IDEuMTctMy42NCAyLjg2LTQuMzggMS40Ni0uNjQgMy40OS0uNzYgNS4wNC0uOTNWNy41YzAtLjY2LjA1LTEuNDEtLjMzLTEuOTYtLjMyLS40OS0uOTUtLjctMS41LS43LTEuMDIgMC0xLjkzLjUzLTIuMTUgMS42MS0uMDUuMjQtLjI1LjQ4LS40Ny40OWwtMi42LS4yOGMtLjIyLS4wNS0uNDYtLjIyLS40LS41Ni42LTMuMTUgMy40NS00LjEgNi00LjEgMS4zIDAgMyAuMzUgNC4wMyAxLjMzQzE3LjExIDQuNTUgMTcgNi4xOCAxNyA3Ljk1djQuMTdjMCAxLjI1LjUgMS44MSAxIDIuNDguMTcuMjUuMjEuNTQgMCAuNzFsLTIuMDYgMS43OGgtLjAxIj48L3BhdGg+PHBhdGggZD0iTTIwLjE2IDE5LjU0QzE4IDIxLjE0IDE0LjgyIDIyIDEyLjEgMjJjLTMuODEgMC03LjI1LTEuNDEtOS44NS0zLjc2LS4yLS4xOC0uMDItLjQzLjI1LS4yOSAyLjc4IDEuNjMgNi4yNSAyLjYxIDkuODMgMi42MSAyLjQxIDAgNS4wNy0uNSA3LjUxLTEuNTMuMzctLjE2LjY2LjI0LjMyLjUxIj48L3BhdGg+PHBhdGggZD0iTTIxLjA3IDE4LjVjLS4yOC0uMzYtMS44NS0uMTctMi41Ny0uMDgtLjE5LjAyLS4yMi0uMTYtLjAzLS4zIDEuMjQtLjg4IDMuMjktLjYyIDMuNTMtLjMzLjI0LjMtLjA3IDIuMzUtMS4yNCAzLjMyLS4xOC4xNi0uMzUuMDctLjI2LS4xMS4yNi0uNjcuODUtMi4xNC41Ny0yLjV6Ij48L3BhdGg+PC9zdmc+","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=synchronization end, clazz=org.thingsboard.rule.engine.transaction.TbSynchronizationEndNode, configurationDescriptor={"nodeDefinition":{"details":"","description":"This Node is now deprecated. Use \"Checkpoint\" instead.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"version":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbNodeEmptyConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=kafka, clazz=org.thingsboard.rule.engine.kafka.TbKafkaNode, configurationDescriptor={"nodeDefinition":{"details":"Will send record via Kafka producer to Kafka server. Outbound message will contain response fields (<code>offset</code>, <code>partition</code>, <code>topic</code>) from the Kafka in the Message Metadata. For example <b>partition</b> field can be accessed with <code>metadata.partition</code>.","description":"Publish messages to Kafka server","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicPattern":"my-topic","bootstrapServers":"localhost:9092","retries":0,"batchSize":16384,"linger":0,"bufferMemory":33554432,"acks":"-1","keySerializer":"org.apache.kafka.common.serialization.StringSerializer","valueSerializer":"org.apache.kafka.common.serialization.StringSerializer","otherProperties":{},"addMetadataKeyValuesAsKafkaHeaders":false,"kafkaHeadersCharset":"UTF-8"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeKafkaConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUzOCIgaGVpZ2h0PSIyNTAwIiB2aWV3Qm94PSIwIDAgMjU2IDQxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZD0iTTIwMS44MTYgMjMwLjIxNmMtMTYuMTg2IDAtMzAuNjk3IDcuMTcxLTQwLjYzNCAxOC40NjFsLTI1LjQ2My0xOC4wMjZjMi43MDMtNy40NDIgNC4yNTUtMTUuNDMzIDQuMjU1LTIzLjc5NyAwLTguMjE5LTEuNDk4LTE2LjA3Ni00LjExMi0yMy40MDhsMjUuNDA2LTE3LjgzNWM5LjkzNiAxMS4yMzMgMjQuNDA5IDE4LjM2NSA0MC41NDggMTguMzY1IDI5Ljg3NSAwIDU0LjE4NC0yNC4zMDUgNTQuMTg0LTU0LjE4NCAwLTI5Ljg3OS0yNC4zMDktNTQuMTg0LTU0LjE4NC01NC4xODQtMjkuODc1IDAtNTQuMTg0IDI0LjMwNS01NC4xODQgNTQuMTg0IDAgNS4zNDguODA4IDEwLjUwNSAyLjI1OCAxNS4zODlsLTI1LjQyMyAxNy44NDRjLTEwLjYyLTEzLjE3NS0yNS45MTEtMjIuMzc0LTQzLjMzMy0yNS4xODJ2LTMwLjY0YzI0LjU0NC01LjE1NSA0My4wMzctMjYuOTYyIDQzLjAzNy01My4wMTlDMTI0LjE3MSAyNC4zMDUgOTkuODYyIDAgNjkuOTg3IDAgNDAuMTEyIDAgMTUuODAzIDI0LjMwNSAxNS44MDMgNTQuMTg0YzAgMjUuNzA4IDE4LjAxNCA0Ny4yNDYgNDIuMDY3IDUyLjc2OXYzMS4wMzhDMjUuMDQ0IDE0My43NTMgMCAxNzIuNDAxIDAgMjA2Ljg1NGMwIDM0LjYyMSAyNS4yOTIgNjMuMzc0IDU4LjM1NSA2OC45NHYzMi43NzRjLTI0LjI5OSA1LjM0MS00Mi41NTIgMjcuMDExLTQyLjU1MiA1Mi44OTQgMCAyOS44NzkgMjQuMzA5IDU0LjE4NCA1NC4xODQgNTQuMTg0IDI5Ljg3NSAwIDU0LjE4NC0yNC4zMDUgNTQuMTg0LTU0LjE4NCAwLTI1Ljg4My0xOC4yNTMtNDcuNTUzLTQyLjU1Mi01Mi44OTR2LTMyLjc3NWE2OS45NjUgNjkuOTY1IDAgMCAwIDQyLjYtMjQuNzc2bDI1LjYzMyAxOC4xNDNjLTEuNDIzIDQuODQtMi4yMiA5Ljk0Ni0yLjIyIDE1LjI0IDAgMjkuODc5IDI0LjMwOSA1NC4xODQgNTQuMTg0IDU0LjE4NCAyOS44NzUgMCA1NC4xODQtMjQuMzA1IDU0LjE4NC01NC4xODQgMC0yOS44NzktMjQuMzA5LTU0LjE4NC01NC4xODQtNTQuMTg0em0wLTEyNi42OTVjMTQuNDg3IDAgMjYuMjcgMTEuNzg4IDI2LjI3IDI2LjI3MXMtMTEuNzgzIDI2LjI3LTI2LjI3IDI2LjI3LTI2LjI3LTExLjc4Ny0yNi4yNy0yNi4yN2MwLTE0LjQ4MyAxMS43ODMtMjYuMjcxIDI2LjI3LTI2LjI3MXptLTE1OC4xLTQ5LjMzN2MwLTE0LjQ4MyAxMS43ODQtMjYuMjcgMjYuMjcxLTI2LjI3czI2LjI3IDExLjc4NyAyNi4yNyAyNi4yN2MwIDE0LjQ4My0xMS43ODMgMjYuMjctMjYuMjcgMjYuMjdzLTI2LjI3MS0xMS43ODctMjYuMjcxLTI2LjI3em01Mi41NDEgMzA3LjI3OGMwIDE0LjQ4My0xMS43ODMgMjYuMjctMjYuMjcgMjYuMjdzLTI2LjI3MS0xMS43ODctMjYuMjcxLTI2LjI3YzAtMTQuNDgzIDExLjc4NC0yNi4yNyAyNi4yNzEtMjYuMjdzMjYuMjcgMTEuNzg3IDI2LjI3IDI2LjI3em0tMjYuMjcyLTExNy45N2MtMjAuMjA1IDAtMzYuNjQyLTE2LjQzNC0zNi42NDItMzYuNjM4IDAtMjAuMjA1IDE2LjQzNy0zNi42NDIgMzYuNjQyLTM2LjY0MiAyMC4yMDQgMCAzNi42NDEgMTYuNDM3IDM2LjY0MSAzNi42NDIgMCAyMC4yMDQtMTYuNDM3IDM2LjYzOC0zNi42NDEgMzYuNjM4em0xMzEuODMxIDY3LjE3OWMtMTQuNDg3IDAtMjYuMjctMTEuNzg4LTI2LjI3LTI2LjI3MXMxMS43ODMtMjYuMjcgMjYuMjctMjYuMjcgMjYuMjcgMTEuNzg3IDI2LjI3IDI2LjI3YzAgMTQuNDgzLTExLjc4MyAyNi4yNzEtMjYuMjcgMjYuMjcxeiIvPjwvc3ZnPg==","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=save attributes, clazz=org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode, configurationDescriptor={"nodeDefinition":{"details":"Saves entity attributes based on configurable scope parameter. Expects messages with 'POST_ATTRIBUTES_REQUEST' message type","description":"Saves attributes data","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"scope":"SERVER_SCOPE","notifyDevice":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeAttributesConfig","icon":"file_upload","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=delay, clazz=org.thingsboard.rule.engine.delay.TbMsgDelayNode, configurationDescriptor={"nodeDefinition":{"details":"Delays messages for configurable period. Please note, this node acknowledges the message from the current queue (message will be removed from queue)","description":"Delays incoming message","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"periodInSeconds":60,"maxPendingMsgs":1000,"periodInSecondsPattern":null,"useMetadataPeriodInSecondsPatterns":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeMsgDelayConfig","icon":"pause","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=save timeseries, clazz=org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode, configurationDescriptor={"nodeDefinition":{"details":"Saves timeseries telemetry data based on configurable TTL parameter. Expects messages with 'POST_TELEMETRY_REQUEST' message type","description":"Saves timeseries data","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"defaultTTL":0},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeTimeseriesConfig","icon":"file_upload","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=FILTER, scope=TENANT, name=check alarm status, clazz=org.thingsboard.rule.engine.filter.TbCheckAlarmStatusNode, configurationDescriptor={"nodeDefinition":{"details":"If the alarm status matches the specified one - msg is success if does not match - msg is failure.","description":"Checks alarm status.","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"alarmStatusList":["ACTIVE_ACK","ACTIVE_UNACK"]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeCheckAlarmStatusConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=rabbitmq, clazz=org.thingsboard.rule.engine.rabbitmq.TbRabbitMqNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to RabbitMQ queue.","description":"Publish messages to the RabbitMQ","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"exchangeNamePattern":"","routingKeyPattern":"","messageProperties":null,"host":"localhost","port":5672,"virtualHost":"/","username":"guest","password":"guest","automaticRecoveryEnabled":false,"connectionTimeout":60000,"handshakeTimeout":10000,"clientProperties":{}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRabbitMqConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHZlcnNpb249IjEuMSIgeT0iMHB4IiB4PSIwcHgiIHZpZXdCb3g9IjAgMCAxMDAwIDEwMDAiPjxwYXRoIHN0cm9rZS13aWR0aD0iLjg0OTU2IiBkPSJtODYwLjQ3IDQxNi4zMmgtMjYyLjAxYy0xMi45MTMgMC0yMy42MTgtMTAuNzA0LTIzLjYxOC0yMy42MTh2LTI3Mi43MWMwLTIwLjMwNS0xNi4yMjctMzYuMjc2LTM2LjI3Ni0zNi4yNzZoLTkzLjc5MmMtMjAuMzA1IDAtMzYuMjc2IDE2LjIyNy0zNi4yNzYgMzYuMjc2djI3MC44NGMtMC4yNTQ4NyAxNC4xMDMtMTEuNDY5IDI1LjU3Mi0yNS43NDIgMjUuNTcybC04NS42MzYgMC42Nzk2NWMtMTQuMTAzIDAtMjUuNTcyLTExLjQ2OS0yNS41NzItMjUuNTcybDAuNjc5NjUtMjcxLjUyYzAtMjAuMzA1LTE2LjIyNy0zNi4yNzYtMzYuMjc2LTM2LjI3NmgtOTMuNTM3Yy0yMC4zMDUgMC0zNi4yNzYgMTYuMjI3LTM2LjI3NiAzNi4yNzZ2NzYzLjg0YzAgMTguMDk2IDE0Ljc4MiAzMi40NTMgMzIuNDUzIDMyLjQ1M2g3MjIuODFjMTguMDk2IDAgMzIuNDUzLTE0Ljc4MiAzMi40NTMtMzIuNDUzdi00MzUuMzFjLTEuMTg5NC0xOC4xODEtMTUuMjkyLTMyLjE5OC0zMy4zODgtMzIuMTk4em0tMTIyLjY4IDI4Ny4wN2MwIDIzLjYxOC0xOC44NiA0Mi40NzgtNDIuNDc4IDQyLjQ3OGgtNzMuOTk3Yy0yMy42MTggMC00Mi40NzgtMTguODYtNDIuNDc4LTQyLjQ3OHYtNzQuMjUyYzAtMjMuNjE4IDE4Ljg2LTQyLjQ3OCA0Mi40NzgtNDIuNDc4aDczLjk5N2MyMy42MTggMCA0Mi40NzggMTguODYgNDIuNDc4IDQyLjQ3OHoiLz48L3N2Zz4=","docUrl":""}}, actions=null), ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=mqtt, clazz=org.thingsboard.rule.engine.mqtt.TbMqttNode, configurationDescriptor={"nodeDefinition":{"details":"Will publish message payload to the MQTT broker with QoS <b>AT_LEAST_ONCE</b>.","description":"Publish messages to the MQTT broker","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"topicPattern":"my-topic","host":"localhost","port":1883,"connectTimeoutSec":10,"clientId":null,"cleanSession":true,"ssl":false,"credentials":{"type":"anonymous"}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeMqttConfig","icon":"call_split","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=rpc call reply, clazz=org.thingsboard.rule.engine.rpc.TbSendRPCReplyNode, configurationDescriptor={"nodeDefinition":{"details":"Expects messages with any message type. Will forward message body to the device.","description":"Sends reply to RPC call from device","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"serviceIdMetaDataAttribute":"serviceId","sessionIdMetaDataAttribute":"sessionId","requestIdMetaDataAttribute":"requestId"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRpcReplyConfig","icon":"call_merge","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=EXTERNAL, scope=TENANT, name=rest api call, clazz=org.thingsboard.rule.engine.rest.TbRestApiCallNode, configurationDescriptor={"nodeDefinition":{"details":"Will invoke REST API call <code>GET | POST | PUT | DELETE</code> to external REST server. Message payload added into Request body. Configured attributes can be added into Headers from Message Metadata. Outbound message will contain response fields (<code>status</code>, <code>statusCode</code>, <code>statusReason</code> and response <code>headers</code>) in the Message Metadata. Response body saved in outbound Message payload. For example <b>statusCode</b> field can be accessed with <code>metadata.statusCode</code>.<br/><b>Note-</b> if you use system proxy properties, the next system proxy properties should be added: \"http.proxyHost\" and \"http.proxyPort\" or \"https.proxyHost\" and \"https.proxyPort\" or \"socksProxyHost\" and \"socksProxyPort\",and if your proxy with auth, the next ones should be added: \"tb.proxy.user\" and \"tb.proxy.password\" to the thingsboard.conf file.","description":"Invoke REST API calls to external REST server","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"restEndpointUrlPattern":"http://localhost/api","requestMethod":"POST","headers":{},"useSimpleClientHttpFactory":false,"readTimeoutMs":0,"maxParallelRequestsCount":0,"useRedisQueueForMsgPersistence":false,"trimQueue":false,"maxQueueSize":0,"enableProxy":false,"useSystemProxyProperties":false,"proxyHost":null,"proxyPort":0,"proxyUser":null,"proxyPassword":null,"proxyScheme":null,"credentials":{"type":"anonymous"}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeRestApiCallConfig","icon":"","iconUrl":"data:image/svg+xml;base64,PHN2ZyBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiB2ZXJzaW9uPSIxLjEiIHk9IjBweCIgeD0iMHB4Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTQ5NzUgMCAwIC45NDk3NSAxNy4xMiAyNi40OTIpIj48cGF0aCBkPSJtMTY5LjExIDEwOC41NGMtOS45MDY2IDAuMDczNC0xOS4wMTQgNi41NzI0LTIyLjAxNCAxNi40NjlsLTY5Ljk5MyAyMzEuMDhjLTMuNjkwNCAxMi4xODEgMy4yODkyIDI1LjIyIDE1LjQ2OSAyOC45MSAyLjIyNTkgMC42NzQ4MSA0LjQ5NjkgMSA2LjcyODUgMSA5Ljk3MjEgMCAxOS4xNjUtNi41MTUzIDIyLjE4Mi0xNi40NjdhNi41MjI0IDYuNTIyNCAwIDAgMCAwLjAwMiAtMC4wMDJsNjkuOTktMjMxLjA3YTYuNTIyNCA2LjUyMjQgMCAwIDAgMCAtMC4wMDJjMy42ODU1LTEyLjE4MS0zLjI4Ny0yNS4yMjUtMTUuNDcxLTI4LjkxMi0yLjI4MjUtMC42OTE0NS00LjYxMTYtMS4wMTY5LTYuODk4NC0xem04NC45ODggMGMtOS45MDQ4IDAuMDczNC0xOS4wMTggNi41Njc1LTIyLjAxOCAxNi40NjlsLTY5Ljk4NiAyMzEuMDhjLTMuNjg5OCAxMi4xNzkgMy4yODUzIDI1LjIxNyAxNS40NjUgMjguOTA4IDIuMjI5NyAwLjY3NjQ3IDQuNTAwOCAxLjAwMiA2LjczMjQgMS4wMDIgOS45NzIxIDAgMTkuMTY1LTYuNTE1MyAyMi4xODItMTYuNDY3YTYuNTIyNCA2LjUyMjQgMCAwIDAgMC4wMDIgLTAuMDAybDY5Ljk4OC0yMzEuMDdjMy42OTA4LTEyLjE4MS0zLjI4NTItMjUuMjIzLTE1LjQ2Ny0yOC45MTItMi4yODE0LTAuNjkyMzEtNC42MTA4LTEuMDE4OS02Ljg5ODQtMS4wMDJ6bS0yMTcuMjkgNDIuMjNjLTEyLjcyOS0wLjAwMDg3LTIzLjE4OCAxMC40NTYtMjMuMTg4IDIzLjE4NiAwLjAwMSAxMi43MjggMTAuNDU5IDIzLjE4NiAyMy4xODggMjMuMTg2IDEyLjcyNy0wLjAwMSAyMy4xODMtMTAuNDU5IDIzLjE4NC0yMy4xODYgMC4wMDA4NzYtMTIuNzI4LTEwLjQ1Ni0yMy4xODUtMjMuMTg0LTIzLjE4NnptMCAxNDYuNjRjLTEyLjcyNy0wLjAwMDg3LTIzLjE4NiAxMC40NTUtMjMuMTg4IDIzLjE4NC0wLjAwMDg3MyAxMi43MjkgMTAuNDU4IDIzLjE4OCAyMy4xODggMjMuMTg4IDEyLjcyOC0wLjAwMSAyMy4xODQtMTAuNDYgMjMuMTg0LTIzLjE4OC0wLjAwMS0xMi43MjYtMTAuNDU3LTIzLjE4My0yMy4xODQtMjMuMTg0em0yNzAuNzkgNDIuMjExYy0xMi43MjcgMC0yMy4xODQgMTAuNDU3LTIzLjE4NCAyMy4xODRzMTAuNDU1IDIzLjE4OCAyMy4xODQgMjMuMTg4aDE1NC45OGMxMi43MjkgMCAyMy4xODYtMTAuNDYgMjMuMTg2LTIzLjE4OCAwLjAwMS0xMi43MjgtMTAuNDU4LTIzLjE4NC0yMy4xODYtMjMuMTg0eiIgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMzc2IDAgMCAxLjAzNzYgLTcuNTY3NiAtMTQuOTI1KSIgc3Ryb2tlLXdpZHRoPSIxLjI2OTMiLz48L2c+PC9zdmc+","docUrl":""}}, actions=null), ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=customer attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetCustomerAttributeNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, server scope attributes are added into Message metadata. If Latest Telemetry enrichment configured, latest telemetry added into metadata. To access those attributes in other nodes this template can be used <code>metadata.temperature</code>.","description":"Add Originators Customer Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"attrMapping":{"temperature":"tempo"},"telemetry":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeCustomerAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=originator fields, clazz=org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode, configurationDescriptor={"nodeDefinition":{"details":"Will fetch fields values specified in mapping. If specified field is not part of originator fields it will be ignored.","description":"Add Message Originator fields values into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"fieldsMapping":{"name":"originatorName","type":"originatorType"}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeOriginatorFieldsConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=FILTER, scope=TENANT, name=check existence fields, clazz=org.thingsboard.rule.engine.filter.TbCheckMessageNode, configurationDescriptor={"nodeDefinition":{"details":"If selected checkbox 'Check that all selected keys are present'\" and all keys in message data and metadata are exist - send Message via <b>True</b> chain, otherwise <b>False</b> chain is used.\nElse if the checkbox is not selected, and at least one of the keys from data or metadata of the message exists - send Message via <b>True</b> chain, otherwise, <b>False</b> chain is used. ","description":"Checks the existence of the selected keys from message data and metadata.","inEnabled":true,"outEnabled":true,"relationTypes":["True","False","Failure"],"customRelations":false,"defaultConfiguration":{"messageNames":[],"metadataNames":[],"checkAllKeys":true},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbFilterNodeCheckMessageConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=customer details, clazz=org.thingsboard.rule.engine.metadata.TbGetCustomerDetailsNode, configurationDescriptor={"nodeDefinition":{"details":"If checkbox: <b>Add selected details to the message metadata</b> is selected, existing fields will be added to the message metadata instead of message data.<br><br><b>Note:</b> only Device, Asset, and Entity View type are allowed.<br><br>If the originator of the message is not assigned to Customer, or originator type is not supported - Message will be forwarded to <b>Failure</b> chain, otherwise, <b>Success</b> chain will be used.","description":"Adds fields from Customer details to the message body or metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"detailsList":[],"addToMetadata":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeEntityDetailsConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=save to custom table, clazz=org.thingsboard.rule.engine.action.TbSaveToCustomCassandraTableNode, configurationDescriptor={"nodeDefinition":{"details":"Administrator should set the custom table name without prefix: <b>cs_tb_</b>. <br>Administrator can configure the mapping between the Message field names and Table columns name.<br><b>Note:</b>If the mapping key is <b>$entity_id</b>, that is identified by the Message Originator, then to the appropriate column name(mapping value) will be write the message originator id.<br><br>If specified message field does not exist or is not a JSON Primitive, the outbound message will be routed via <b>failure</b> chain, otherwise, the message will be routed via <b>success</b> chain.","description":"Node stores data from incoming Message payload to the Cassandra database into the predefined custom table that should have <b>cs_tb_</b> prefix, to avoid the data insertion to the common TB tables.<br><b>Note:</b> rule node can be used only for Cassandra DB.","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"tableName":"","fieldsMapping":{"":""}},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCustomTableConfig","icon":"file_upload","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=gps geofencing events, clazz=org.thingsboard.rule.engine.geo.TbGpsGeofencingActionNode, configurationDescriptor={"nodeDefinition":{"details":"Extracts latitude and longitude parameters from incoming message and returns different events based on configuration parameters","description":"Produces incoming messages using GPS based geofencing","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Entered","Left","Inside","Outside","Failure"],"customRelations":false,"defaultConfiguration":{"latitudeKeyName":"latitude","longitudeKeyName":"longitude","fetchPerimeterInfoFromMessageMetadata":true,"perimeterType":null,"polygonsDefinition":null,"centerLatitude":null,"centerLongitude":null,"range":null,"rangeUnit":null,"minInsideDuration":1,"minOutsideDuration":1,"minInsideDurationTimeUnit":"MINUTES","minOutsideDurationTimeUnit":"MINUTES"},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeGpsGeofencingConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ENRICHMENT, scope=TENANT, name=tenant attributes, clazz=org.thingsboard.rule.engine.metadata.TbGetTenantAttributeNode, configurationDescriptor={"nodeDefinition":{"details":"If Attributes enrichment configured, server scope attributes are added into Message metadata. If Latest Telemetry enrichment configured, latest telemetry added into metadata. To access those attributes in other nodes this template can be used <code>metadata.temperature</code>.","description":"Add Originators Tenant Attributes or Latest Telemetry into Message Metadata","inEnabled":true,"outEnabled":true,"relationTypes":["Success","Failure"],"customRelations":false,"defaultConfiguration":{"attrMapping":{"temperature":"tempo"},"telemetry":false},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbEnrichmentNodeTenantAttributesConfig","icon":"","iconUrl":"","docUrl":""}}, actions=null), ComponentDescriptor(type=ACTION, scope=TENANT, name=create alarm, clazz=org.thingsboard.rule.engine.action.TbCreateAlarmNode, configurationDescriptor={"nodeDefinition":{"details":"Details - JS function that creates JSON object based on incoming message. This object will be added into Alarm.details field.\nNode output:\nIf alarm was not created, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'metadata' will contains one of those properties 'isNewAlarm/isExistingAlarm'. Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.","description":"Create or Update Alarm","inEnabled":true,"outEnabled":true,"relationTypes":["Created","Updated","False","Failure"],"customRelations":false,"defaultConfiguration":{"alarmType":"General Alarm","alarmDetailsBuildJs":"var details = {};\nif (metadata.prevAlarmDetails) {\n details = JSON.parse(metadata.prevAlarmDetails);\n}\nreturn details;","severity":"CRITICAL","propagate":false,"useMessageAlarmData":false,"relationTypes":[]},"uiResources":["static/rulenode/rulenode-core-config.js"],"configDirective":"tbActionNodeCreateAlarmConfig","icon":"notifications_active","iconUrl":"","docUrl":""}}, actions=null)]
2021-08-07 14:27:41,874 [main] INFO o.t.s.i.ThingsboardInstallService - Installation finished successfully!
2021-08-07 14:27:41,936 [sql-queue-1-attributes-12-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [Attributes] Queue polling was interrupted
2021-08-07 14:27:41,936 [sql-queue-0-attributes-11-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [Attributes] Queue polling was interrupted
2021-08-07 14:27:41,936 [sql-queue-2-attributes-13-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [Attributes] Queue polling was interrupted
2021-08-07 14:27:41,940 [sql-queue-3-attributes-14-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [Attributes] Queue polling was interrupted
2021-08-07 14:27:41,945 [sql-queue-2-ts latest-8-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [TS Latest] Queue polling was interrupted
2021-08-07 14:27:41,946 [sql-queue-3-ts latest-9-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [TS Latest] Queue polling was interrupted
2021-08-07 14:27:41,945 [sql-queue-1-ts latest-7-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [TS Latest] Queue polling was interrupted
2021-08-07 14:27:41,945 [sql-queue-0-ts latest-6-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [TS Latest] Queue polling was interrupted
2021-08-07 14:27:41,947 [sql-queue-0-ts-2-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [TS] Queue polling was interrupted
2021-08-07 14:27:41,947 [sql-queue-2-ts-4-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [TS] Queue polling was interrupted
2021-08-07 14:27:41,947 [sql-queue-1-ts-3-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [TS] Queue polling was interrupted
2021-08-07 14:27:41,947 [sql-queue-3-ts-5-thread-1] INFO o.t.s.dao.sql.TbSqlBlockingQueue - [TS] Queue polling was interrupted
2021-08-07 14:27:41,964 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default'
2021-08-07 14:27:41,981 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
2021-08-07 14:27:42,030 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
(7). PostgreSQL验证表结构信息
# 查看运行的docker进程
lixin-macbook:thingsboard lixin$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
54c5075c5d9e postgres:12.1 "docker-entrypoint.s…" 43 minutes ago Up 43 minutes 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp tb_pg
# 进入docker容器内部
lixin-macbook:thingsboard lixin$ docker exec -it 54c5075c5d9e /bin/bash
# 切换账号
root@54c5075c5d9e:/# su - postgres
# 连接postgresql
postgres@54c5075c5d9e:~$ psql
psql (12.1 (Debian 12.1-1.pgdg100+1))
Type "help" for help.
# 查看有哪些数据库
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-------------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
thingsboard | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
(4 rows)
# 切换到:thingsboard数据库
postgres=# \c thingsboard
You are now connected to database "thingsboard" as user "postgres".
# 查看库下所有的表.
thingsboard=# \dt
List of relations
Schema | Name | Type | Owner
--------+-------------------------------------+-------------------+----------
public | admin_settings | table | postgres
public | alarm | table | postgres
public | api_usage_state | table | postgres
public | asset | table | postgres
public | attribute_kv | table | postgres
public | audit_log | table | postgres
public | component_descriptor | table | postgres
public | customer | table | postgres
public | dashboard | table | postgres
public | device | table | postgres
public | device_credentials | table | postgres
public | device_profile | table | postgres
public | entity_view | table | postgres
public | event | table | postgres
public | oauth2_client_registration | table | postgres
public | oauth2_client_registration_info | table | postgres
public | oauth2_client_registration_template | table | postgres
public | relation | table | postgres
public | rule_chain | table | postgres
public | rule_node | table | postgres
public | rule_node_state | table | postgres
# 查询tb_user表信息.
thingsboard=# SELECT * FROM tb_user;
id | created_time | additional_info
| authority | customer_id | email |
first_name | last_name | search_text | tenant_id
--------------------------------------+---------------+-----------------------------------------------------------------
-----------------------------------------+-----------+--------------------------------------+--------------------------+
------------+-----------+--------------------------+--------------------------------------
8edebc80-f748-11eb-9028-dd08e7c1bf83 | 1628317657160 | {"userPasswordHistory":{"1628317657879":"$2a$10$wkbwfJ.K8aZIVF48
C.hkT.3awc4V58SLKyyaTDa9TTG1tn.JPWs9O"}} | SYS_ADMIN | 13814000-1dd2-11b2-8080-808080808080 | sysadmin@thingsboard.org |
| | sysadmin@thingsboard.org | 13814000-1dd2-11b2-8080-808080808080
... ...
(7). 运行ThingsboardServerApplication
(8). 访问服务
账号信息如下:
System Administrator: sysadmin@thingsboard.org / sysadmin
# Tenant Administrator: tenant@thingsboard.org / tenant
# Customer User: customer@thingsboard.org / customer
(9). 总结
在这里,对ThingsBoard进行了源码编译和运行,后面,会深入研究功能和源码分析.