Definición del modelo de ThingWorx en Composer > Modelado > Plantillas de cosa > Plantillas remotas > Presencia de cosa > Presencia de cosa: estrategia de informes personalizados que se crea en Java con el SDK de extensión de ThingWorx
Presencia de cosa: estrategia de informes personalizados que se crea en Java con el SDK de extensión de ThingWorx
En este tutorial no se tratan los aspectos básicos de la creación de extensiones de ThingWorx. Se supone lo siguiente:
El usuario sabe cómo crear una extensión ThingWorx.
El usuario dispone del SDK de extensión, v.8.4.0 o una versión posterior, donde se incluyen objetos de informes.
El usuario sabe cómo crear e importar una extensión en ThingWorx Platform.
Una cosa de estrategia personalizada se puede crear en Java o en JavaScript y XML. En primer lugar, es necesario crear una plantilla de cosa de estrategia e implementar y sustituir el método ReportingAlgorithm. A continuación, se crea una cosa de estrategia. En este tema se explican los pasos para crear una estrategia en Java. Para crear una cosa de estrategia con JavaScript, consulte Presencia de cosa: utilización de ThingWorx Composer para crear una cosa ReportingStrategy personalizada.
Creación de una plantilla de cosa de estrategia
Para crear una estrategia personalizada en Java, primero se debe crear una plantilla de cosa de estrategia. La plantilla de cosa actúa como código base para un algoritmo basado en Java. La definición de clase de la plantilla de cosa debe tener el siguiente aspecto:
@ThingworxBaseTemplateDefinition(name = "ReportingStrategy")
public class MyJavaStrategy extends ReportingStrategy {
Implementación y sustitución del método ReportingAlgorithm
A continuación, se debe implementar y sustituir el método ReportingAlgorithm. En este método se incluye una serie de anotaciones necesarias para que funcione correctamente. La solución más sencilla para garantizar la correcta implementación es copiar el siguiente código:
@Override
@ThingworxServiceDefinition(name = ReportingConstants.REPORTING_ALGORITHM_SERVICE_NAME, isAllowOverride = true,
description = "Evaluates a Thing to determine if it is Present")
@ThingworxServiceResult(name = CommonPropertyNames.PROP_RESULT, baseType = "BOOLEAN",
description = "Whether the parameters describe a Device that is Reporting normally")
public Boolean ReportingAlgorithm(
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_NAME,
description = "Name of the event",
baseType = "STRING" ) String eventName,
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_TIME,
description = "Time event is triggered",
baseType = "DATETIME" ) DateTime eventTime,
@ThingworxServiceParameter(
name = ReportingConstants.SOURCE,
description = "Name of Thing that triggered event",
baseType = "STRING" ) String source,
@ThingworxServiceParameter(
name = ReportingConstants.SOURCE_PROPERTY,
description = "Soure property",
baseType = "STRING" ) String sourceProperty,
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_DATA,
description = "Parameters necessary for the algorithm to determine if a Thing is reporting",
baseType = "INFOTABLE") InfoTable eventData) {
// specifically boolean primitive; this method should never return null
boolean result = false;

// TODO: Custom Strategy implementation here

return result;
}
Plantilla de cosa de estrategia personalizada de ejemplo
Una plantilla de cosa de estrategia personalizada de ejemplo es similar al siguiente ejemplo. En este ejemplo, la estrategia personalizada marca la cosa como presente cuando no está conectada y como no presente cuando está conectada.

import org.joda.time.DateTime;
import org.slf4j.Logger;

import com.thingworx.logging.LogUtilities;
import com.thingworx.metadata.annotations.ThingworxBaseTemplateDefinition;
import com.thingworx.metadata.annotations.ThingworxServiceDefinition;
import com.thingworx.metadata.annotations.ThingworxServiceParameter;
import com.thingworx.metadata.annotations.ThingworxServiceResult;
import com.thingworx.things.connected.reportable.ReportingConstants;
import com.thingworx.things.connected.reportable.ReportingStrategy;
import com.thingworx.types.InfoTable;
import com.thingworx.types.constants.CommonPropertyNames;

@ThingworxBaseTemplateDefinition(name = "ReportingStrategy")
public class MyJavaStrategy extends ReportingStrategy {

private static final Logger logger =
LogUtilities.getInstance().getApplicationLogger(MyJavaStrategy.class);

@Override
@ThingworxServiceDefinition(name = ReportingConstants.REPORTING_ALGORITHM_SERVICE_NAME,
isAllowOverride = true,
description = "Evaluates a Thing to determine if it is Present")
@ThingworxServiceResult(name = CommonPropertyNames.PROP_RESULT, baseType = "BOOLEAN",
description = "Whether the parameters describe a Device that is Reporting normally")
public Boolean ReportingAlgorithm(
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_NAME,
description = "Name of the event",
baseType = "STRING" ) String eventName,
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_TIME,
description = "Time event is triggered",
baseType = "DATETIME" ) DateTime eventTime,
@ThingworxServiceParameter(
name = ReportingConstants.SOURCE,
description = "Name of Thing that triggered event",
baseType = "STRING" ) String source,
@ThingworxServiceParameter(
name = ReportingConstants.SOURCE_PROPERTY,
description = "Soure property",
baseType = "STRING" ) String sourceProperty,
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_DATA,
description = "Parameters necessary for the algorithm to determine if a Thing is reporting",
baseType = "INFOTABLE") InfoTable eventData) {
// specifically boolean primitive; this method should never return null
boolean result;
try {
boolean isBound = (Boolean) eventData.getFirstRow().getValue(ReportingConstants.PROP_ISBOUND);
result = !isBound;
logger.info("Custom strategy has is bound [" + isBound + "].
Setting reporting to [" + result + "]");
} catch (Exception e) {
logger.error("Caught exception while evaluating reporting algorithm.
Marking as not reporting");
result = false;
}
return result;
}

}
Creación de una plantilla de estrategia
La cosa de estrategia amplía la plantilla de estrategia personalizada y permite definirla como el algoritmo de generación de informes en la tabla de configuración de informes de una entidad remota.
Para crear una cosa, el proyecto debe tener la siguiente ruta de carpeta de entidades <Raíz de proyecto>/Entidades/Cosas y las cosas deben tener la siguiente convención de asignación de nombres Things_NombreCosa.xml, donde NombreCosa es el nombre de la cosa personalizada.
En este ejemplo, el nombre de cosa es "CustomStrategyJava", por lo que el nombre del fichero es Things_CustomStrategyJava.xml y el contenido se muestra a continuación. Se deberán editar las líneas 14, 19 y 23 según corresponda, en función de los nombres de ThingPackage, ThingName y ThingTemplate, respectivamente.
* 
Después de copiar las siguientes líneas en el editor IDE o XML, se verán los números de línea adecuados.
<?xml version="1.0" encoding="UTF-8"?>
<Entities
<Things>
<Thing
effectiveThingPackage="MyStrategyPackage"
enabled="true"
name="CustomStrategyJava"
published="false"
thingTemplate="MyJavaStrategy"
</Thing>
</Things>
</Entities>
Ejecución de una estrategia
A partir de ThingWorx 8.4.0, el estado isReporting de una cosa remota se vuelve a evaluar cuando la cosa se enlaza o se desenlaza desde ThingWorx Platform. Este estado también se puede volver a evaluar en cualquier momento (por ejemplo, mediante un temporizador) ejecutando el servicio EvaluateReporting disponible en la cosa remota.
¿Fue esto útil?