cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 

Community Tip - Learn all about PTC Community Badges. Engage with PTC and see how many you can earn! X

SDK Reference Part 4

No ratings

 

Step 5: Java - Events

 

While connected to the server, you can trigger an event on a remote Thing. The code snippet from the Simple Thing example below shows how to use a ValueCollection to specify the payload of an event, and then trigger a FileEvent on a remote Thing.

 

Create Event

 

The two implementations of the VirtualThing.defineEvent method are used to create an event definition ThingWorx Platform.

@ThingworxEventDefinitions(events = { @ThingworxEventDefinition(name = "SteamSensorFault",
        description = "Steam sensor fault", dataShape = "SteamSensor.Fault", category = "Faults",
        isInvocable = true, isPropertyEvent = false) })
public void defineEvent(String name, String description, String dataShape, AspectCollection aspects) {
        EventDefinition eventDefinition = new EventDefinition(name, description);
        eventDefinition.setDataShapeName(dataShape);
        if (aspects != null) {
            eventDefinition.setAspects(aspects);
        }

        this.getThingShape().getEventDefinitions().put(name, eventDefinition);
    }

    public void defineEvent(EventDefinition eventDefinition) {
        this.getThingShape().getEventDefinitions().put(eventDefinition.getName(), eventDefinition);
    }

 

Queue Event

 

To queue an event, create a ValueCollection instance, and load it with the necessary fields for the DataShape of that event.

ValueCollection eventInfo = new ValueCollection();
eventInfo.put(CommonPropertyNames.PROP_MESSAGE, new StringPrimitive("Temperature at " + temperature + " was above limit of " + temperatureLimit));
super.queueEvent("SteamSensorFault", DateTime.now(), eventInfo);
super.updateSubscribedEvents(60000);

 

Fire Event

 

You can send the client a request to fire the event with the collected values, the event, and information to find the entity the event belongs to as shown below. In order to send the Event to the ThingWorx Platform, use the VirtualThing.updateSubscribedEvents method.

ValueCollection eventInfo = new ValueCollection();
eventInfo.put(CommonPropertyNames.PROP_MESSAGE, new StringPrimitive("Temperature at " + temperature + " was above limit of " + temperatureLimit));
super.queueEvent("SteamSensorFault", DateTime.now(), eventInfo);
super.updateSubscribedEvents(60000);
 
 

Step 6: Java - Services

 

Create Services

 

Simply use the ThingworxServiceDefinition and ThingworxServiceResult anotations to create a service. Then, you can define the service as shown in this code:

@ThingworxServiceDefinition(name = "GetSteamSensorReadings", description = "Get SteamSensor Readings")
    @ThingworxServiceResult(name = CommonPropertyNames.PROP_RESULT, description = "Result", baseType = "INFOTABLE", aspects = { "dataShape:SteamSensorReadings" })
    public InfoTable GetSteamSensorReadings() {
        InfoTable table = new InfoTable(getDataShapeDefinition("SteamSensorReadings"));
        ValueCollection entry = new ValueCollection();
        DateTime now = DateTime.now();

        try {
            // entry 1
            entry.clear();
            entry.SetStringValue(SENSOR_NAME_FIELD, "Sensor Alpha");
            entry.SetDateTimeValue(ACTIV_TIME_FIELD, now.plusDays(1));
            entry.SetNumberValue(TEMPERATURE_FIELD, 50);
            entry.SetNumberValue(PRESSURE_FIELD, 15);
            entry.SetBooleanValue(FAULT_STATUS_FIELD, false);
            entry.SetBooleanValue(INLET_VALVE_FIELD, true);
            entry.SetNumberValue(TEMPERATURE_LIMIT_FIELD, 150);
            entry.SetNumberValue(TOTAL_FLOW_FIELD, 87);
            table.addRow(entry.clone());

            // entry 2
            entry.clear();
            entry.SetStringValue(SENSOR_NAME_FIELD, "Sensor Beta");
            entry.SetDateTimeValue(ACTIV_TIME_FIELD, now.plusDays(2));
            entry.SetNumberValue(TEMPERATURE_FIELD, 60);
            entry.SetNumberValue(PRESSURE_FIELD, 25);
            entry.SetBooleanValue(FAULT_STATUS_FIELD, true);
            entry.SetBooleanValue(INLET_VALVE_FIELD, true);
            entry.SetNumberValue(TEMPERATURE_LIMIT_FIELD, 150);
            entry.SetNumberValue(TOTAL_FLOW_FIELD, 77);
            table.addRow(entry.clone());
        } catch (Exception e) {
            e.printStackTrace();
        }

        return table;
    }

 

NOTE: This service will be callable by the ThingWorx Platform.

 

Call Services

 

The are two types of service calls that can be made. The first type belongs to the ConnectedThingClient class. This client has methods for processing information where only the parameters for the method is necessary. The other type of call is based on services located on an Entity. For these calls, you must create a ValueCollection instance, and load it with the necessary parameters of the service.

 

After loading the ValueCollection instance, send the client the request to execute the service with the:

 

  • Parameter values
  • Service name
  • Timeout setting (in milliseconds) for the service to finish executing
  • Information to find the entity the service belongs to

 

The first type of call can be seen in SimpleClient.java:

  InfoTable result = client.readProperty(ThingworxEntityTypes.Things, ThingName, "name", 10000);
  String name = result.getFirstRow().getStringValue("name");

 

The second type of call can be seen below:

    ValueCollection payload = new ValueCollection();
    payload.put("name", new StringPrimitive("Timothy"));
    InfoTable table = handleServiceRequest("ServiceName", payload);
 
TIP: Put the code for creating the service and event in the constructor of the extended VirtualThing (or a method called from the constructor). Also, the service code examples will work as long as the actual service is defined. We recommend the annotation method as shown in the examples because it is much cleaner.
 
 
 
Click here to view Part 5 of this guide.
 
Version history
Last update:
‎Mar 07, 2023 08:23 AM
Updated by:
Labels (1)
Contributors