Search code examples
fiwarefiware-orion

Command sent to ContextBroker doesn't reach IOT Agent


I've some problems with the commands in the IoTAgent JSON using MQTT. I follow these instructions:

POST ioat-agent:4041/iot/devices
{
  "devices": [
    {
      "device_id": "id_lamp1",
      "entity_name": "lamp1",
      "entity_type": "lamp",
      "attributes": [
        {
          "object_id": "l",
          "name": "luminosity",
          "type": "float"
        }
      ],
      "commands":[
        {
            "object_id": "u",
            "name": "ping",
            "type": "command"
        }
        ],
      "protocol": "IoTA-JSON",
      "transport": "MQTT"
    }
  ]
}

I try to send a command to the OCB. Something like that:

POST ocb:1026/v2/entities/lamp1/attrs?type=lamp
{
    "ping":{
        "type": "command",
        "value": "Ping Request"
    }
}

This appears to work fine, because I received in the log:

fiware-iot-agent | time=2019-05-16T09:42:00.436Z | lvl=DEBUG | corr=da768116-77be-11e9-8e17-0242ac140004 | trans=ed164f14-ffd8-404a-8da4-53b901d103b5 | op=IoTAgentNGSI.GenericMiddlewares | srv=myhome | subsrv=/environment | msg=Body:
fiware-iot-agent | {
fiware-iot-agent |     "entities": [
fiware-iot-agent |         {
fiware-iot-agent |             "type": "lamp",
fiware-iot-agent |             "isPattern": "false",
fiware-iot-agent |             "id": "lamp1"
fiware-iot-agent |         }
fiware-iot-agent |     ],
fiware-iot-agent |     "attributes": [
fiware-iot-agent |         "ping"
fiware-iot-agent |     ]
fiware-iot-agent | }
fiware-iot-agent |  | comp=IoTAgent
fiware-iot-agent | time=2019-05-16T09:42:00.457Z | lvl=DEBUG | corr=da768116-77be-11e9-8e17-0242ac140004 | trans=ed164f14-ffd8-404a-8da4-53b901d103b5 | op=IoTAgentNGSI.ContextServer | srv=myhome | subsrv=/environment | msg=Handling query from [iot-agent:4041] | comp=IoTAgent
fiware-iot-agent | time=2019-05-16T09:42:00.462Z | lvl=DEBUG | corr=da768116-77be-11e9-8e17-0242ac140004 | trans=ed164f14-ffd8-404a-8da4-53b901d103b5 | op=IoTAgentNGSI.MongoDBDeviceRegister | srv=myhome | subsrv=/environment | msg=Looking for device with name [lamp1]. | comp=IoTAgent
fiware-iot-agent | time=2019-05-16T09:42:00.481Z | lvl=DEBUG | corr=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | trans=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | op=IoTAgentNGSI.MongoDBGroupRegister | srv=n/a | subsrv=n/a | msg=Looking for group params ["service","subservice","type"] with queryObj {"service":"myhome","subservice":"/environment","type":"lamp"} | comp=IoTAgent
fiware-iot-agent | time=2019-05-16T09:42:00.489Z | lvl=DEBUG | corr=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | trans=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | op=IoTAgentNGSI.MongoDBGroupRegister | srv=n/a | subsrv=n/a | msg=Device group for fields [["service","subservice","type"]] not found: [{"service":"myhome","subservice":"/environment","type":"lamp"}] | comp=IoTAgent
fiware-iot-agent | time=2019-05-16T09:42:00.491Z | lvl=ERROR | corr=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | trans=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | op=IoTAgentNGSI.Alarms | srv=n/a | subsrv=n/a | msg=Raising [MONGO-ALARM]: {"name":"DEVICE_GROUP_NOT_FOUND","message":"Couldn\t find device group","code":404} | comp=IoTAgent
fiware-iot-agent | time=2019-05-16T09:42:00.495Z | lvl=DEBUG | corr=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | trans=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | op=IoTAgentNGSI.ContextServer | srv=n/a | subsrv=n/a | msg=Handling received set of attributes: ["ping"] | comp=IoTAgent
fiware-iot-agent | time=2019-05-16T09:42:00.496Z | lvl=DEBUG | corr=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | trans=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | op=IoTAgentNGSI.MongoDBDeviceRegister | srv=n/a | subsrv=n/a | msg=Looking for device with name [lamp1]. | comp=IoTAgent
fiware-iot-agent | time=2019-05-16T09:42:00.506Z | lvl=ERROR | corr=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | trans=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | op=IoTAgentNGSI.Alarms | srv=n/a | subsrv=n/a | msg=Releasing [MONGO-ALARM] | comp=IoTAgent
fiware-iot-agent | time=2019-05-16T09:42:00.509Z | lvl=DEBUG | corr=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | trans=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | op=IoTAgentNGSI.ContextServer | srv=n/a | subsrv=n/a | msg=Query from [iot-agent:4041] handled successfully. | comp=IoTAgent
fiware-iot-agent | time=2019-05-16T09:42:00.511Z | lvl=DEBUG | corr=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | trans=3273f192-1cdc-42dc-80b1-9e0cab5a8a2b | op=IoTAgentNGSI.ContextServer | srv=n/a | subsrv=n/a | msg=Generated query response: {"contextResponses":[{"contextElement":{"type":"lamp","isPattern":false,"id":"lamp1","attributes":[{"name":"ping","type":"command","value":""}]},"statusCode":{"code":200,"reasonPhrase":"OK"}}]} | comp=IoTAgent

But I don't receive any message in the topic /1234/id_lamp1/cmd, and I don't see PENDING in the ring_status attribute of the entity of te OCB. Although when I simulate lamp1 device and publish a message in the /1234/id_lamp1/cmdexe the ring_status and ring_info change to OK and 22 respectively.


Solution

  • The problem is due to the usage of POST verb (in POST /v2/entities/lamp1/attrs?type=lamp) to send the command. POST has create semantics, so it will add the ping attribute to the entity instead of forwarding it to IOTA. Thus, the command never reaches the IOTA, so the IOTA never published in the MQTT broker. This is explained with more detail in the "Important Note" of this section of the documentation.

    However, if you use PATCH instead POST (i.e.PATCH /v2/entities/lamp1/attrs?type=lamp) the forwarding takes place so IOTA receives the command and the IOTA will publish {"ping":"Ping Request"} in the /1234/id_lamp1/cmd topic in the MQTT broker.

    If you already did POST /v2/entities/lamp1/attrs?type=lamp then first you have to fix the situation deleting the attribute with DELETE /v2/entities/lamp1/attrs/ping on the Orion Context Broker API. Otherwise the local ping attribute you created with POST will take preference over the ping registered attribute at IOTA when you do PATCH and forwarding will not take place.