mqtt-datasource icon indicating copy to clipboard operation
mqtt-datasource copied to clipboard

Add support to publish data via different query

Open NiklasCi opened this issue 1 year ago • 5 comments

This PR adds support to publish data via the datasource by sending a different payload. This can be used by plugins like Buttons Panel or Data Manipulation.

Publish timeouts after 1s and subscribe timeouts 1s after publish was successful.

Schema of query:

interface Query {
  topic string // topic to publish payload to
  payload object // a js/json object that contains the publish message
  response string // (Optional): a topic to listen for a response
}

Example of a query:

query: {
  topic: "cmd/send/values",
  payload: {
    value1: "Hallo",
    value2: 12.34
  },
  response: "response/from/send"
}

The returned response from the query contains the reponse of the mqtt command under a new frame with name Response and a field Body where the field values contain the responded message. Note: I only tested json response messages.

Blocked by: #91

NiklasCi avatar Feb 12 '24 09:02 NiklasCi

can it work with plugin like htmlgraphic https://grafana.com/grafana/plugins/gapit-htmlgraphics-panel/

DonatoD avatar Feb 12 '24 11:02 DonatoD

https://grafana.com/grafana/plugins/gapit-htmlgraphics-panel/

If this plugin supports getting the backend server and the access to the grafana api sure. You can send a query via grafana datasource api: https://grafana.com/docs/grafana/latest/developers/http_api/data_source/#query-a-data-source

Should look like this:

POST /api/ds/query HTTP/1.1
Accept: application/json
Content-Type: application/json

{
   "queries":[
      {
         "refId":"1",
         "datasource":{
            "uid":"MQTT-UID" // need to be known
         },
         "topic": "cmd/send/values",
         "payload": {
             "value1": "Hallo",
             "value2": 12.34
         },
         "response": "response/from/send"
      }
   ],
}

NiklasCi avatar Feb 12 '24 14:02 NiklasCi

Thanks. I'm not that expert on this stuff, so I need to study all this more in details. But the html graphic panel allow you to write in javascript, so I think it should works, shouldn't it?

DonatoD avatar Feb 12 '24 14:02 DonatoD

Thanks. I'm not that expert on this stuff, so I need to study all this more in details. But the html graphic panel allow you to write in javascript, so I think it should works, shouldn't it?

Yes as long as you get the backend server. There are helper functions under @grafana/runtime. For example getDataSourceSrv() or getbackendSrv(). Maybe cehckout iof you can access them in the html panel.

If so you can publish mqtt data.

NiklasCi avatar Feb 12 '24 15:02 NiklasCi

Thanks so much. I'll give it a look

DonatoD avatar Feb 12 '24 16:02 DonatoD