2
votes

I am using IOT-agent JSON with MQTT binding

I have a sensor-actuator registered in orion using iot-agent and I created the subscription.

If a third party application modifies a sensor value, orion must send iot-agent information and iot-agent to the device.

for example, if I have 3 attributes inside the sensor and one of them controls a valve.

In orion that attribute is true or false.

if the attribute is modified in orion must be sent to iot-agent and iot-agent to the device to close or open the valve.

extra information:

The software is two component of Fiware Generic Enable.

iot-agent JSON: https://github.com/telefonicaid/iotagent-json Fiware-orionCB: https://github.com/telefonicaid/fiware-orion

Is it possible?

1
I'd recommend editing your question a bit further and providing links to the keywords technology you're using as many of the keywords may be unknown to people that might try and help answer and you'd save them the time of having to google!JGlass

1 Answers

2
votes

There is no official tutorial connecting the JSON IoT Agent to a device over MQTT, but a very similar one exists for the Ultralight IoT Agent

IoT Devices are either:

  • sensors - reading measurements from the real world
  • actuators - altering the state of the world
  • or both

Your issue here is that you cannot get Orion to update the attribute/state of a sensor directly. The attributes of the entity in the Context Broker represent the incoming state of the sensor - i.e. the measurements from that sensor.

For example for the sensor reading the state of a valve it could be "open: "true"

In order to update an actuator, you will need to send a command, rather than alter the value.

You should set up the command when provisioning the device (it is assumed you have a service already):

curl -iX POST \
  'http://localhost:4041/iot/devices' \
  -H 'Content-Type: application/json' \
  -H 'fiware-service: openiot' \
  -H 'fiware-servicepath: /' \
  -d '{
  "devices": [
    {
      "device_id": "bell001",
      "entity_name": "urn:ngsi-ld:Bell:001",
      "entity_type": "Bell",
      "protocol": "PDI-IoTA-UltraLight",
      "transport": "MQTT",
      "commands": [
        { "name": "ring", "type": "command" }
       ],
       "static_attributes": [
         {"name":"refStore", "type": "Relationship","value": "urn:ngsi-ld:Store:001"}
      ]
    }
  ]
}
'

You can then send the command to do something (like ring a bell, open a valve etc.) by altering the state of the command attribute.

curl -iX PATCH \
  'http://localhost:1026/v2/entities/urn:ngsi-ld:Bell:001/attrs' \
  -H 'Content-Type: application/json' \
  -H 'fiware-service: openiot' \
  -H 'fiware-servicepath: /' \
  -d '{
  "ring": {
      "type" : "command",
      "value" : ""
  }
}'

Depending upon how you have provisioned devices, you may also need to register the command - though this may not be necessary.