Let's build a #Grafana Data Source for #TheThingsNetwork! (MQTT)
We'll take this brand new #Grafana Data Source for MQTT ... And mod it for the MQTT Server at #TheThingsNetwork
Here's how our #Grafana Data Source extracts the Message Payload from #TheThingsNetwork MQTT ... Pardon my ghastly GoLang 🙏
https://github.com/lupyuen/the-things-network-datasource/blob/main/pkg/plugin/message.go#L43-L154
#Grafana Log shows our #TheThingsNetwork Data Source has extracted the Message Payload correctly yay!
https://github.com/lupyuen/the-things-network-datasource#grafana-log
Remember that #LoRa Messages are super tiny ... We shall encode Sensor Data in CBOR ... And our #Grafana Data Source needs to decode the CBOR Payload
https://lupyuen.github.io/articles/ttn#fair-use-of-the-things-network
How our #Grafana Data Source decodes CBOR Payloads from #TheThingsNetwork
https://github.com/lupyuen/the-things-network-datasource/blob/main/pkg/plugin/message.go#L100-L116
Cleaned up the CBOR Decoding ... In our #Grafana Data Source for #TheThingsNetwork
https://github.com/lupyuen/the-things-network-datasource/blob/main/pkg/plugin/message.go#L131-L189
How our #Grafana Data Source transforms #TheThingsNetwork MQTT Messages ... Into Grafana Data Frames
https://github.com/lupyuen/the-things-network-datasource/blob/main/pkg/plugin/message.go#L46-L129
CBOR Payloads now decoded OK ... By our #Grafana Data Source for #TheThingsNetwork yay! 🎉
Our Data Source for #TheThingsNetwork MQTT ... On a #Grafana Dashboard 🎉
We have just visualised #TheThingsNetwork Sensor Data in #Grafana with our custom data source
But to visualise historical Sensor Data from #TheThingsNetwork, we should store the data in Prometheus and push to #Grafana
Visualising #TheThingsNetwork Sensor Data with #Grafana ... All shall be explained in this article
How we enable the MQTT Server at #TheThingsNetwork
https://lupyuen.github.io/articles/grafana?2#configure-the-things-network-mqtt
Here's how we install #Grafana ... And our Custom Data Source for #TheThingsNetwork
https://lupyuen.github.io/articles/grafana?3#appendix-install-grafana-and-data-source
Adding the #Grafana Data Source for our MQTT Server at #TheThingsNetwork
https://lupyuen.github.io/articles/grafana?4#configure-grafana-data-source
Visualising #TheThingsNetwork Sensor Data with #Grafana
https://lupyuen.github.io/articles/grafana?5#grafana-dashboard
Why we encode #TheThingsNetwork Sensor Data with CBOR (instead of JSON)
https://lupyuen.github.io/articles/grafana?7#cbor-concise-binary-object-representation
@lupyuen you might want to use the
x, ok := y.(type)
if !ok {
return fmt.Errorf("type assertion failed for: %v", x)
}
style of type assertions. by using the form with two return values you can prevent panics and instead return an error if you have malformed input data.
@bonifartius Cool thanks for the tip!
@velartrill
it's a type assertion, because the values of the map are interface{}. the empty interface is fulfilled by _any_ type. you usually need to do type asserts if you want to do _more_ than is defined in the interface. you need the concrete type for that.
if you don't want to have a panic if the type doesn't match, you use the form with two return values. usually if the input is controlled by yourself you want panics because a non matching type is clearly a bug then. for parsing things like irregular JSON it's handy to have the two valued form. an alternative, especially if you have a set of possible types are type switches: https://tour.golang.org/methods/16
#TheThingsNetwork MQTT Messages are really complex ... Our #Grafana Data Source shall extract the Base64 Payload that's deep inside the message
https://github.com/lupyuen/the-things-network-datasource#mqtt-log