Indholdsfortegnelse:

BBQ Pi (med datavisualisering!): 4 trin (med billeder)
BBQ Pi (med datavisualisering!): 4 trin (med billeder)

Video: BBQ Pi (med datavisualisering!): 4 trin (med billeder)

Video: BBQ Pi (med datavisualisering!): 4 trin (med billeder)
Video: How to Grill a Steak on a Pellet Grill 2024, November
Anonim
BBQ Pi (med datavisualisering!)
BBQ Pi (med datavisualisering!)
BBQ Pi (med datavisualisering!)
BBQ Pi (med datavisualisering!)
BBQ Pi (med datavisualisering!)
BBQ Pi (med datavisualisering!)

Introduktion

Grilling henviser mest til den langsomme proces med at bruge indirekte varme til at tilberede dit yndlingskød. Selvom denne madlavningsmetode er enormt populær-især i USA-har den, hvad nogle kan betragte som en ret alvorlig svaghed: det kræver timers halvklar opmærksomhed at blive brugt på at overvåge temperaturen i din pit og mad. Indtast: Raspberry Pi.

Det originale projekt

Den originale kilde til dette projekt kan findes her: https://old.reddit.com/r/raspberry_pi/comments/a0… Kernen i det er, at reddit -bruger Produkt var i stand til at videresende data om mad og grubetemperatur fra relativt billige, kommercielt tilgængelige trådløse termometre til en Raspberry Pi (som havde knyttet et lille RF -modul til sine GPIO -ben). I det oprindelige projekt (linket ovenfor) lagrede Produkt sine data i en sqlite -database og vises på et lokalt hostet apache2 php -websted.

Denne løsning løser allerede det oprindelige problem, der blev berørt i introduktionen af denne blog: Du kan nu eksternt overvåge din mad og pit -temperatur med en webbrowser. Men hvad nu hvis vi ville udvide dette? Indtast: GridDB.

Forbrugsvarer

Hindbær Pi4

SUNKEE 433Mhz Superheterodyne trådløs modtagermodul

Trin 1: GridDB Web API & FluentD

GridDB Web API & FluentD
GridDB Web API & FluentD

Da jeg så dette projekt, tænkte min første tanke - efter den første spændingsbølge - på måder, hvorpå jeg kan udvide funktionaliteten. Ved at bruge GridDB og dets Grafana -plugin søgte jeg at visualisere mine mad- og pitdata. Udover det ønskede jeg at oprette Grafana -annotationer for at opsøge eventuelle unormale datapunkter - kan ikke have noget forkullet kød!

For at komme i gang var jeg nødt til at bruge C -koden fra det originale projekt til at læse dataene, der kom ind fra det trådløse termometer og sende disse data til min GridDB -server. For at få dette til at fungere, spandt jeg en GridDB -server op på Azure ved hjælp af en virtuel CentOS -maskine. Den nemmeste måde at dele data fra vores kantmaskine (Raspberry Pi) til vores cloud -server var via GridDB Web API. Så på den vm konfigurerede jeg GridDB's WebAPI sammen med Fluentd og det medfølgende GridDB -stik.

Før jeg rent faktisk sendte data op til skyen, var jeg nødt til at oprette det grundlæggende skema til min BBQ Pi -container. Datasættet, der kommer ind, er ekstremt simpelt: vi har to temperatursensorer, et cook -id og selvfølgelig tidsstemplet. Så vores skema ser sådan ud:

timeseries = gridstore.put_container ("bbqpi", [("tid", griddb. GS_TYPE_TIMESTAMP), ("cookid", griddb. GS_TYPE_INT), ("probe1", griddb. GS_TYPE_INT), ("probe2", griddb. GS_TYPE_INT)], griddb. GS_CONTAINER_TIME_

For at oprette denne timeseries -container brugte jeg simpelthen WebAPI (port 8080):

curl -X POST --basic -u admin: admin -H "Indholdstype: applikation/json" -d

'{"container_name": "bbqpi", "container_type": "TIME_SERIES", / "rowkey": true, "columns": [{"name": "time", "type": "TIMESTAMP"}, {"name": "cookid", "type": "INTEGER"}, {"name": "probe1", "type": "INTEGER"}, {"name": "probe2", "type": "INTEGER"}]} '\ https:// localhost: 8080/griddb/v2/defaultCluster/dbs/public/containers

Da containeren blev oprettet, havde jeg brug for at bruge Fluentd (port 8888) til at bogføre faktiske data i vores container. Her er en CURL -kommando, der sender nogle dummy -data:

curl -X POST -d 'json = {"date": "2020-01-01T12: 08: 21.112Z", "cookid": "1", "probe1": "150", "probe2": "140" } 'https:// localhost: 8888/griddb

Derfra var jeg nødt til at tilføje den originale kode for at sende en HTTP POST -anmodning, når vores Pi læste data fra vores pit (cirka en gang hvert ~ 12 sekunder).

Som en sidebemærkning: At skrive denne kode lærte mig at sætte pris på, hvor omfattende C -sproget kan være:

int postData (char time , int cookid, int probe1, int probe2, char url )

{CURL *curl; CURLcode res; / * I windows vil dette starte winsock -tingene */ curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; char agent [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" date / ": \"%s.112Z / ", \" cookid / ": \"%d / ", \" probe1 / ": \"%d / ", / "probe2 \": / "%d \"} ", tid, cookid, probe1, probe2); / * få et krøllehåndtag */ curl = curl_easy_init (); if (curl) { /* Indstil først den webadresse, der er ved at modtage vores POST. Denne URL kan lige så godt være en https:// URL, hvis det er det, der skal modtage dataene. */ snprintf (agent, sizeof agent, "libcurl/%s", curl_version_info (CURLVERSION_NOW)-> version); agent [størrelse af agent - 1] = 0; curl_easy_setopt (curl, CURLOPT_USERAGENT, agent); curl_easy_setopt (curl, CURLOPT_URL, url); curl_easy_setopt (curl, CURLOPT_USERNAME, "admin"); curl_easy_setopt (curl, CURLOPT_PASSWORD, "admin"); curl_easy_setopt (curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, errbuf); curl_easy_setopt (curl, CURLOPT_POSTFIELDS, json); / * Udfør anmodningen, res får returkoden */ res = curl_easy_perform (curl); hvis (res! = CURLE_OK) {size_t len = strlen (errbuf); fprintf (stderr, "\ nlibcurl: (%d)", res); hvis (len) fprintf (stderr, "%s%s", errbuf, ((errbuf [len - 1]! = '\ n')? "\ n": ""))); fprintf (stderr, "%s / n / n", curl_easy_strerror (res)); gå til oprydning; } oprydning: curl_easy_cleanup (curl); curl_global_cleanup (); returnere 0; }}

Med denne funktion skrevet, skulle jeg bare have den kørt på samme tid, som sqlite -dataene blev sendt:

hvis (goodData == 1) {

if (last_db_write == 0 || (secs-last_db_write> = 10)) {snprintf (sql, 100, "INSERT INTO readings (cookid, time, probe1, probe2) VALUES (%d, '%s',%d, %d); ", cookID, buff, probe1, probe2); printf ("%s / n", sql); rc = sqlite3_exec (db, sql, tilbagekald, 0, & zErrMsg); hvis (rc! = SQLITE_OK) {printf ("SQL -fejl: %s / n", zErrMsg); } andet {last_db_write = sek. } char url = "https://xx.xx.xx.xx: 8888/griddb"; postData (buff, cookID, probe1, probe2, url); }}

For at sikre, at dine data faktisk indsættes i din server, kan du køre følgende kommando for at forespørge i din database og se resultaterne:

curl -X POST --basic -u admin: admin -H "Content -type: application/json" -d '{"limit": 1000}' https:// localhost: 8080/griddb/v2/defaultCluster/dbs/ public/containere/bbqpi/rækker

Trin 2: Grafana

Grafana
Grafana
Grafana
Grafana

Med koden på plads, nu når vi bruger den originale webportal til at starte en “kok”, vil vi samtidig gemme vores temperaturdata i vores GridDB -server.

Det næste trin vil være at visualisere vores data ved hjælp af Grafana. For at gøre det fulgte vi oplysningerne fra denne blog: her. Det gode ved denne implementering er, at det er ekstremt let at se vores data kortlagt til en flot graf. Det tilføjer også kommentarer.

De kommentarer, der diskuteres i bloggen, gør det ekstremt let for os at overvåge, når noget går galt med enten vores mad eller selve gruben. I mit tilfælde lavede jeg oksekød korte ribben. Med dem ønskede jeg ikke, at temperaturen i gruben skulle vokse ud over 275 grader Fahrenheit. Hvis jeg så temperaturen gå ud over det, kunne jeg slukke en brænder og lade varmen synke igen:

Jeg havde en lignende regel for, at sensoren faktisk holdt øje med selve maden: hvis maden nåede en indre temperatur på 203 grader fahrenheit, var ribbenene klar. Du kan se den eneste kommentar i slutningen af kokken her:

Alt i alt tog kokken mig kun ca. timer). På trods af det tror jeg på værdien, hvis dette værktøj er let synligt: at kunne logge dine madresultater og derefter sammenligne det med tidligere kokke betyder, at din grillning langsomt bliver bedre med tiden, da du kan bruge data til at se, hvad der virker, og hvad der ikke gør 't.

Trin 3: Maden

Maden
Maden
Maden
Maden
Maden
Maden

Dette var første gang jeg nogensinde har lavet oksekød korte ribben; til krydderier brugte jeg simpelthen salt, sort peber og hvidløgspulver. På trods af nogle problemer med at brænderen blev for høj til en lille smule der i begyndelsen, kom ribbenene fantastisk ud. Venligst se her:

Trin 4: Konklusion

Til sidst kom maden fantastisk ud, sensorerne, GridDB og Grafana arbejdede alle sammen smukt, og vi fik nogle værdifulde data om, hvordan vi kan lave disse ting igen til næste gang, vi vil imponere nogle venner.

Anbefalede: