Hoppa till huvudinnehåll

Grafana

IoT-plattformen stödjer två Grafana-datakällor:

  1. JSON-datakällan (simpod-json-datasource) - kör din egen Grafana och visa tidsseriedata från plattformen.
  2. Infinity-datakällan - använd valfri av IoT-plattformens REST-API-ändpunkter för att bygga tabeller, diagram och kartor, och driva Grafanas Alert Manager.

Den här guiden visar hur du bygger paneler. För att installera och ansluta Grafana först, se Grafana-installation. Om du inte har åtkomst till Grafana från ditt konto på plattformen, be en administratör om åtkomst eller kontakta din tekniska support.

Vilken datakälla ska jag använda?​

Använd…när du vill…
JSON-datakällansnabbt visa grafer för en enhets värden eller plotta enheter på en karta (enheten vald som ett "mått/metric")
Infinity-datakällanhämta valfritt REST-API-svar till en tabell, bygga diagram/kartor från godtyckliga ändpunkter, eller sätta upp larm

Fältnamn är IoT-plattformens kanoniska fält (temperature, rssi, lnglat, …), så en panel byggd för en enhet fungerar för andra enheter av samma typ.


Bygg paneler med JSON-datakällan​

Tidsseriegraf​

  1. Välj Time series som visualisering (uppe till höger).
  2. Välj måttet (IoT-noden/enheten) du vill visa i en graf.
  3. Att välja jokertecknet (*) som mått visar värden från alla dina aktiva enheter.

Dölj lat/lng från en graf​

Om en enhet har ett lnglat-fält visas dess lat och lng i tidserie- grafen. För att dölja dem:

Ett tidsseriediagram i Grafana från JSON-datakällan, med lat och lng dolda

  1. Se till att ett mått (enhet) är valt.
  2. Klicka på Transform.
  3. Välj Filter by name.
  4. Avmarkera lat och lng.

Karta (Geomap)​

  1. Välj Geomap som visualisering (uppe till höger).
  2. Välj måttet (enheten) att plotta.
  3. Se till att lat och lng är markerade (motsatsen till föregående steg).
  4. Att välja jokertecknet (*) som mått plottar GPS-positionerna för alla dina aktiva enheter - efter att ha valt alternativet Merge under Transform.

Historik för trackerns position​

  1. Välj Geomap som visualisering (uppe till höger).
  2. Välj måttet Din Tracker.lnglat - detta ritar spåret på kartan automatiskt.
  3. Lägg valfritt till en andra fråga, Din Tracker.speed, för att färgkoda spåret.
  4. I sidopanelen Marker, välj värdet att färgkoda efter och ställ in tröskelvärdena.

Ett Geomap-panel i Grafana som ritar en trackers positionshistorik, färgkodad efter tröskelvärden tracker map coloured by value


Bygg paneler med Infinity-datakällan​

Infinity-datakällan anropar IoT-plattformens REST-API direkt. Det enklaste sättet att lära sig den: kopiera en komplett förfråga-URL från Swagger (https://beta.yggio.net/swagger), klistra in den i panelen, lägg sedan till kolumner med fältnamnen från JSON- svaret (synligt i Swagger) och ställ in varje kolumns datatyp. Klicka på uppdatera för att testa.

Tabell​

  1. Välj Table som visualisering (uppe till höger).
  2. Ange GET-URL:en https://beta.yggio.net/api/iotnodes. För att filtrera, lägg till en q- fråga - t.ex. https://beta.yggio.net/api/iotnodes?q=temperature returnerar bara enheter som har ett temperature-fält.
  3. Under Parsing options & Result fields, ange kolumnerna du vill ha, t.ex.:
    • name som Name, typ String
    • reportedAt som Reported, typ Time
    • rssi som RSSI, typ Number
    • snr som SNR, typ Number

En tabellpanel i Grafana byggd på Infinity-datakällan, med de tolkade enhetskolumnerna Samma Infinity-tabellpanel med fler rader och kolumner ifyllda

För att inkludera kontextuella parametrar, lägg till väljarkolumner som contextMap.dittFältnamn:

En Infinity-tabellpanel med ett contextMap-fält tillagt som kolumn

För att visa samma data som ett stapeldiagram, byt bara paneltypen till Bar chart:

Samma Infinity-data visad som en stapeldiagrampanel

Tidsserie​

  1. Välj Time series som visualisering (uppe till höger).
  2. Ange GET-URL:en https://beta.yggio.net/api/iotnodes/<device _id>/stats?measurement=temperature&start=<start time in unix ms>&distance=3600 för att hämta tidsserien för temperature (distance är bucket-storleken i sekunder).
  3. Under Parsing options & Result fields, mappa kolumnerna:
    • value som value, typ Number
    • time som time, typ Time

En tidsseriepanel i Grafana på Infinity-datakällan, med time tolkat som Time-fält Samma Infinity-tidsseriepanel över en längre period

Karta (Geomap)​

  1. Välj Geomap som visualisering (uppe till höger).
  2. Ange GET-URL:en https://beta.yggio.net/api/iotnodes?q=lnglat för att hämta enheter som har en giltig plats.
  3. Under Parsing options & Result fields, mappa platsen och värdena att plotta - t.ex. för en signalstyrkekarta:
    • lnglat.coordinates.0 som Longitude, typ Number
    • lnglat.coordinates.1 som Latitude, typ Number
    • rssi som RSSI, typ Number
    • snr som SNR, typ Number
  4. Lägg till tröskelvärden för att färgkoda kartan.

Ett Geomap-panel i Grafana på Infinity-datakällan, med enheter färgkodade efter tröskelvärde Samma Infinity-Geomap-panel inzoomad på en enskild plats


Välja paneltyp​

Grafana har många visualiseringar. För IoT-plattformens data är dessa de vanliga valen:

För att visa…AnvändAnteckningar
Ett värde som trendar över tid (temperatur, energi, luftfuktighet)Time seriesstandard för mätvärden
Det senaste enskilda värdet, stort och fetstilt (aktuell temp, batteri %)Statlägg till tröskelvärden för att färgkoda det; visar en sparkline
Ett värde inom ett känt intervall (batteri %, tankfyllnad, luftfuktighet)Gaugeställ in min/max och tröskelvärden
Samma värde för många enheter (batteri för varje sensor)Bar gaugeen stapel per enhet - jokertecken-mått * + en Reduce-transform
En lista med enheter och deras fältTableInfinity → /api/iotnodes
Enhetspositioner, trackerspår, värmekartorGeomapkräver lnglat (lat/lng)
Ett booleskt/på-av-tillstånd över tid (närvaro, dörr, larm)State timelineidealiskt för presence, contact, *Alarm-fält
Antal eller kategorier sida vid sida (personer per zon)Bar chart
Fördelningen/spridningen av en mätningHistogram
Aktuella larmAlert listpassar ihop med Infinity-larmregler

Tips och tekniker​

  • Ställ in enheten (Panel → Standard options → Unit, t.ex. Celsius (°C), Percent (0-100), Volts) så att axlar, tooltips och Stat/Gauge visas korrekt.
  • Tröskelvärden (Panel → Thresholds) färgar Stat/Gauge/Time series efter värde - t.ex. blir temperaturen röd över 30 °C, batteriet gult under 20 %.
  • Värdemappningar (Panel → Value mappings) omvandlar siffror till ord - mappa 0 → Closed/1 → Open, eller false → Vacant/true → Occupied för booleska fält som contact eller presence.
  • Transformationer gör det mesta av formandet utan att ändra frågan:
    • Filter by name - dölj fält som lat/lng.
    • Merge - kombinera jokertecken-resultat (*) till en serie eller tabell.
    • Organize fields - döp om, ändra ordning och dölj kolumner.
    • Reduce - reducera en tidsserie till dess senaste/max/medel (matar en Stat- eller Bar gauge-panel).
    • Add field from calculation - härledda kolumner (skillnad, förhållande, etc.).
  • Enhetsväljare (dashboard-variabler): under Dashboard settings → Variables skapa en variabel med enhetsnamn, referera den sedan i dina frågor så att en dashboard fungerar för alla enheter. Kombinera med Repeat (Panel → Repeat options) för att automatiskt generera en panel per vald enhet.
  • Navigering mellan dashboards: länka samman dashboards för att bygga en landningssida → drill-down-upplevelse. Alternativ, enklast först:
    • Text panel - vanliga Markdown-länkar till andra dashboards.
    • Dashboard list panel - listar automatiskt dashboards efter tagg eller mapp, ingen konfiguration.
    • Data links / panel links - klicka på en serie eller panel för att hoppa till en annan dashboard, och för med sig de aktuella variablerna (t.ex. den valda enheten).
    • Business Text panel (Volkov Labs, community-plugin marcusolsson-dynamictext-panel) - det kraftfulla alternativet: rendera anpassad Markdown/HTML från din frågedata, så du kan bygga en datadriven navigations- meny (t.ex. en länk per enhet, genererad från en enhetslista, som varje skickar den enheten till målets dashboard-variabler). Installera den först: grafana-cli plugins install marcusolsson-dynamictext-panel, och starta om.
  • Automatisk uppdatering och tidsintervall: ställ in dashboardens uppdateringsintervall (t.ex. var 1 min) och ett vettigt standardintervall (uppe till höger) - Last 24 hours är en bra start.
  • Legend-värden: visa senaste/medel/max i legenden (Panel → Legend) för snabba överblicksvärden.
  • Larm (endast Infinity): du kan larma på vilket REST-värde som helst - tröskelvärden, eller offline-enheter via No data - se Konfigurera ett enkelt larm.
  • Publika dashboards (bädda in på en webbplats, ingen inloggning): en publik dashboard kör frågor utan en inloggad användare, så den kan inte fråga IoT-plattformen direkt - datan måste först kopieras till din egen datalagring. Se Publicera på en offentlig dashboard.

Vanliga recept​

Fullständiga exempel som kombinerar stegen ovan - kopiera inställningarna.

Aktuell temperatur, färgkodad (Stat)

  1. Ny panel → Stat. JSON-datakälla → välj enheten → fältet temperature.
  2. Standard options → Unit = Celsius (°C).
  3. Thresholds: bas grön, lägg till röd vid 30, blå vid 0. → Ett stort aktuellt temperaturvärde som blir rött när det är varmt.

Batterinivå för varje sensor (Bar gauge)

  1. Ny panel → Bar gauge. JSON-datakälla → mått * → fältet batteryLevel.
  2. Transform → Reduce = Last (ett värde per enhet).
  3. Unit = Percent (0-100); Thresholds: röd <20, gul <50, annars grön. → En stapel per sensor - visar direkt vilka batterier som är låga.

Närvaro över tid (State timeline)

  1. Ny panel → State timeline. Välj enheten → fältet presence (eller occupied).
  2. Value mappings: true → Occupied, false → Vacant (ge varje en färg). → Ett färgat band som visar när utrymmet var upptaget.

Larm när en enhet går offline - sätt upp en Infinity-larmregel (se Konfigurera ett enkelt larm) och använd dess alternativ No data → Alerting, så att du får en notis när en sensor slutar rapportera.

Flottöversiktstabell (Table via Infinity)

  1. Ny panel → Table. Infinity-datakälla → GET https://beta.yggio.net/api/iotnodes (lägg till ?q=batteryLevel för att begränsa till dina sensorer).
  2. Parsing options & Result fields - lägg till kolumnerna:
    • name som Device, typ String
    • batteryLevel som Battery %, typ Number
    • rssi som RSSI, typ Number
    • snr som SNR, typ Number
    • reportedAt som Last reported, typ Time
  3. Färga batterikolumnen: lägg till en field override på Battery % → Cell display mode = Colored background, med Thresholds röd <20, gul <50, annars grön.
  4. Synliggör tysta enheter: sortera tabellen efter Last reported (klicka på kolumn- rubriken, eller ställ in den som standardsortering) så att de minst nyligen sedda enheterna hamnar överst. → En rad per enhet som visar batteri, signal och senast sedd - en översiktlig flotta-hälsovy.

Energiförbrukning per dag (Bar chart)

  1. Köra översättaren calculate-energy-consumption-per-time-period på mätaren
    • den omvandlar den kumulativa activeEnergyImport-avläsningen till energyConsumptionDay/Week/Month (var återställs vid lokal midnatt). Se Utveckla översättare.
  2. Ny panel → Bar chart (eller Time series). JSON-datakälla → välj mätaren → fältet energyConsumptionDay.
  3. Unit = kWh (kilowattimme); lägg valfritt till tröskelvärden för att flagga högförbrukningsdagar. → Varje dags förbrukning; värdet strax före midnatt är den dagens totalsumma.

Ingen översättare på mätaren? Fråga den råa kumulativa avläsningen per dag via Infinity - /stats?measurement=activeEnergyImport&distance=86400 - och ta sedan skillnaden dag för dag i Grafana. IoT-plattformens /stats grupperar efter distance men räknar inte ut skillnaden server-side, så översättar-metoden ovan är enklare.


Konfigurera ett enkelt larm (Infinity)​

Grafana kan larma på vilken av IoT-plattformens REST-data som helst genom Infinity-datakällan. Här är ett minimalt tröskellarm - "meddela mig när en temperatur går över 30 °C" - med hjälp av Grafanas enhetliga larmhantering (Grafana 9+).

  1. Skapa en kontaktpunkt (en gång): Alerting → Contact points → Add contact point. Välj en typ (e-post, Slack, webhook, …), fyll i detaljerna och testa den.
  2. Ny larmregel: Alerting → Alert rules → New alert rule, och ge den ett namn.
  3. Fråga värdet (fråga A): välj Infinity-datakällan och ange en GET-URL som returnerar talet att övervaka, t.ex. https://beta.yggio.net/api/iotnodes/<device _id>/stats?measurement=temperature&start=<ms>&distance=3600 (parsa value som ett Number). Kör den för att bekräfta att den returnerar data.
  4. Reducera till ett värde (uttryck B): lägg till ett Reduce-uttryck, funktion Last, indata A. Larmregler utvärderar ett enskilt tal, inte en hel serie.
  5. Ställ in tröskelvärdet (uttryck C): lägg till ett Threshold-uttryck på B, t.ex. IS ABOVE 30, och ange C som larmvillkoret.
  6. Utvärdering: placera regeln i en utvärderingsgrupp med ett intervall (t.ex. var 1 min) och en väntetid (t.ex. 5 min) så att en kort spik inte utlöser larmet direkt.
  7. Notifieringar: lägg till en summary-annotation (meddelandet du kommer att få), se sedan till att regelns etiketter matchar en notifieringspolicy som dirigerar till din kontaktpunkt (standardpolicyn dirigerar allt till standardkontaktpunkten, vilket är den enklaste starten).
  8. Spara. När temperaturen håller sig över 30 °C under väntetiden får du en notis; den återgår automatiskt när värdet sjunker igen.

Larm för offline-enheter: i regelns Configure no data and error handling, ställ in tillståndet till Alerting när frågan returnerar No data. Kombinerat med en fråga som bara returnerar ny data notifierar detta dig när en enhet slutar rapportera.


Publicera på en offentlig dashboard​

Du kan lägga en dashboard på en publik URL och bädda in den på en webbplats så att vem som helst kan se den utan att logga in - för live luftkvalitet, vattennivåer, parkerings- beläggning och liknande.

Det viktigaste att förstå först​

En offentlig dashboard kör sina frågor server-side, utan en inloggad användare. IoT- plattformen returnerar av design aldrig data utan behörighet, så en offentlig (användarlös) dashboard kan inte fråga IoT-plattformen direkt - JSON- och Infinity-datakällorna ovan förutsätter att du är inloggad, vilket en offentlig besökare inte är.

Så datan måste redan finnas i en datalagring Grafana kan läsa utan en inloggning till IoT-plattformen. Mönstret: kopiera live-datan från IoT-plattformen till din egen InfluxDB, och peka den offentliga dashboarden mot InfluxDB. Ett litet Node-RED-flöde gör kopieringen - och eftersom det autentiserar mot IoT-plattformens MQTT-broker med en uppsättning grundläggande autentiseringsuppgifter (en varaktig användarnamn/lösenord, inte en användarsession), körs det obevakat. Den offentliga besökaren rör aldrig plattformen.

Yggio MQTT output ──(Basic Credential Set)──▶ Node-RED ──▶ InfluxDB ──▶ public dashboard ──▶ iframe
durable auth bridge flow no Yggio auth in the public path

Många team kör redan Node-RED, så detta återanvänder ofta infrastruktur du redan har.

Förutsättningar​

  • En Node-RED-installation som kan nå IoT-plattformens MQTT-broker (Node-RED-guiden).
  • En InfluxDB-instans (en enda Docker-container fungerar fint - Steg 1).
  • En självhostad Grafana nåbar från internet (reverse proxy + HTTPS).
  • I IoT-plattformen: en uppsättning grundläggande autentiseringsuppgifter och en MQTT-kanal på varje enhet du vill publicera (MQTT-referensen).

Steg 1 - Sätt upp InfluxDB​

Om du inte redan har en:

docker run -d --name influxdb -p 8086:8086 \
-v influxdb-data:/var/lib/influxdb2 \
influxdb:2

Öppna http://<host>:8086, kör installationsguiden och notera fyra saker du kommer att återanvända: URL:en, organisationen, en API-token och ett bucket-namn (t.ex. yggio-public). Använd en separat bucket per kund så att varje offentlig dashboard bara någonsin exponerar sina egna enheter.

Steg 2 - Bygg Node-RED-bryggan​

  1. Installera InfluxDB-noderna: Manage palette → Install → node-red-contrib-influxdb.

  2. MQTT in-nod - lägg till en MQTT-server för IoT-plattformens broker:

    • Server mqtt.beta.yggio.net, Port 8883, TLS aktiverat.
    • Security: användarnamnet/lösenordet för uppsättningen grundläggande autentiseringsuppgifter.
    • Topic: ämnet från enhetens MQTT-kanal i IoT-plattformen (enhet → fliken Channels → basicCredentialSet-kanal → kopiera ämnet). Se MQTT-referensen.
    • Sätt Output till "a parsed JSON object" så att msg.payload är ett objekt.
  3. Function-nod - omvandla avläsningen till en InfluxDB-punkt, och behåll bara de enheter du tänker publicera:

    // Only these devices are allowed onto the public dashboard.
    const PUBLIC = ['device-id-1', 'device-id-2'];

    const deviceId = msg.topic.split('/').pop(); // or read from msg.payload
    if (!PUBLIC.includes(deviceId)) { return null; } // drop everything else

    // Keep numeric canonical fields only (temperature, batteryLevel, ...).
    const fields = {};
    for (const [k, v] of Object.entries(msg.payload)) {
    if (typeof v === 'number') { fields[k] = v; }
    }
    if (Object.keys(fields).length === 0) { return null; }

    msg.payload = [fields, {deviceId}]; // node-red-contrib-influxdb: [fields, tags]
    return msg;
  4. InfluxDB out-nod - välj din InfluxDB-server (URL, token, organisation), ställ in bucketen och ett mätningsnamn (t.ex. reading).

  5. Deploy. Avläsningar flödar nu in i InfluxDB.

Tappa inte data om InfluxDB hackar. Bryggan är den enda platsen Node-RED inte buffrar åt dig. För motståndskraft, gruppera skrivningar och lägg till ett litet återförsök (en catch-nod som matar en återförsökssökväg). För några få enheter med låg rapporteringsfrekvens spelar detta sällan någon roll - dimensionera efter din flotta.

Steg 3 - Lägg till InfluxDB som en Grafana-datakälla​

Ren UI, inget plugin att installera (InfluxDB är inbyggt i Grafana): gå till Connections → Data sources → Add data source → InfluxDB, ställ sedan in frågespråket (Flux för InfluxDB 2), URL:en http://<influx-host>:8086, och autentiseringen (token, organisation, standardbucket). Klicka på Save & test.

Steg 4 - Bygg dashboarden​

Lägg till paneler som frågar InfluxDB. En minimal Flux-fråga för ett fält:

from(bucket: "yggio-public")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "reading" and r._field == "temperature")

Ställ in dashboardens automatiska uppdatering (t.ex. 10 s) för en levande känsla.

Steg 5 - Gör dashboarden offentlig​

På självhostad (community) Grafana, lägg till i grafana.ini:

[security]
allow_embedding = true

# Only on older Grafana (9.x / 10.0–10.1); ~10.2+ has it on by default.
[feature_toggles]
publicDashboards = true

Starta om Grafana, och på dashboarden välj Share → Public dashboard → enable och kopiera den publika URL:en. (I Grafana 11/12 finns detta under Share → External / Shared dashboard - samma funktion, med nytt namn.)

Steg 6 - Bädda in den på webbplatsen​

Släpp den publika URL:en i en <iframe> i webbplatsens CMS:

<iframe src="https://GRAFANA_HOST/public-dashboards/<token>"
width="100%" height="600" frameborder="0"></iframe>

Säkerhet, isolering och begränsningar​

  • Exponering: en offentlig dashboard visar allt i sin bucket till alla med länken - det finns ingen filtrering per besökare. Håll varje kunds data i sin egen bucket, och låt bara bryggan skriva de enheter som finns i PUBLIC- tillåtelselistan.
  • Autentiseringsuppgifter: bryggans uppsättning grundläggande autentiseringsuppgifter är en verklig autentiseringsuppgift för IoT-plattformen - skydda Node-RED-instansen (håll den bakom en brandvägg; den har bara en enkel inloggning).
  • Funktionsbegränsningar: offentliga dashboards stödjer inte mallvariabler, vissa paneltyper är inte tillgängliga, och resultat cachas - fint för fasta "aktuella avläsningar + senaste trend"-vyer, mindre lämpat för interaktiv utforskning.
  • Latens: "realtid" styrs av uppdateringsintervallet plus den cachen, inte sub-sekund-strömning; själva InfluxDB-inmatningen är snabb.
  • Historik: InfluxDB håller bara data från när bryggan startar. För att fylla i historik, gör en engångsladdning från IoT-plattformens /stats-ändpunkt (se Åtkomst till IoT-plattformens API).