ADS-B Grafana: Maak lijsten van types, calsigns en meer
Laatst liep ik tegen een beperking van Influxdb met Grafana aan. Ik heb een Influxdb die ik voer met data van mijn ADS-B ontvanger. Deze feed bevat gegevens zoals
Reg: PH-AOA
Type: A332
Wat ik wilde doen is het aantal UNIEKE Airbus A330-203's tellen.
Het einddoel
TIEN pings op PH-AOE A332 moet worden geteld als ÉÉN A320-203 en Geen tien!
Om dat te doen moet je een query maken met "GROUP BY". Dat is gemakkelijk genoeg. Nu komt het probleem: Je kunt geen "GROUP BY" doen in Influxdb die twee waarden verbindt. Je kunt dat alleen doen met een TAG.
Influxdb query - Group by tag: actype
De query ziet er als volgt uit:
SELECT count(distinct("Reg")) FROM "mesg" WHERE $imeFilter GROUP BY time(1d), "actype"
We hebben een TAG nodig om deze items te groeperen
Deze tag "actype" bestaat niet in de datafeed, dus moet hij worden aangemaakt. Ik gebruik node red al om de feed te verzamelen en te organiseren, dus het is logisch om het daar aan te maken.
Node-Red lost het op
De ADS-B ontvanger op de Pi produceert de JSON-feed die er na wat knutselen als volgt uitziet:
Hoe voeg je een TAG-waarde toe voor Influxdb met een Node-Red function node
msg.payload=[msg.payload,{tag:waarde}];
Voorbeeld
Om twee tags toe te voegen:
- Voeg de tag "icao24" toe vanuit de payload "msg.payload.Icao"
- Voeg de tag "actype" toe vanuit de payload "msg.payload.Mdl"
Doe dit:
msg.payload=[msg.payload,{icao24:msg.payload.Icao},{actype:msg.payload.Mdl}];
return msg
Je kunt nu de volgende query doen in Grafana:
SELECT count(distinct("Reg")) FROM "mesg" WHERE $imeFilter GROUP BY time(1d), "actype"
Het resultaat is een geaggregeerde lijst van vliegtuigtypes van unieke registraties over een periode van één dag.