Let's build a #Grafana Data Source for #TheThingsNetwork! (MQTT)
Why connect #Grafana to #TheThingsNetwork? So that we can instantly visualise the Sensor Data transmitted by IoT Devices
We'll take this brand new #Grafana Data Source for MQTT ... And mod it for the MQTT Server at #TheThingsNetwork
#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
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
@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.
@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