Search code examples
fiware

Modify attribute on device by IOT-Agent Json


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?


Solution

  • 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.