Innehållsförteckning:

BBQ Pi (med datavisualisering!): 4 steg (med bilder)
BBQ Pi (med datavisualisering!): 4 steg (med bilder)

Video: BBQ Pi (med datavisualisering!): 4 steg (med bilder)

Video: BBQ Pi (med datavisualisering!): 4 steg (med bilder)
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

Grillning avser oftast den långsamma processen med att använda indirekt värme för att laga ditt favoritkött. Även om denna matlagningsmetod är oerhört populär-särskilt i USA-har den vad som kan anses vara en ganska allvarlig svaghet: det kräver timmar av halvklar uppmärksamhet för att övervaka temperaturen på din grop och mat. Ange: Raspberry Pi.

Det ursprungliga projektet

Den ursprungliga källan för detta projekt hittar du här: https://old.reddit.com/r/raspberry_pi/comments/a0… Kärnan i det är att reddit -användare Produkt kunde vidarebefordra mat- och groptemperaturdata från relativt billiga, kommersiellt tillgängliga trådlösa termometrar till en Raspberry Pi (som hade fäst en liten RF -modul på sina GPIO -stift). I det ursprungliga projektet (länkad ovan) lagrade Produkt sin data i en sqlite -databas och visades på en lokalt värd apache2 php -webbplats.

Denna lösning löser redan det ursprungliga problemet som berördes i introduktionen av den här bloggen: du kan nu övervaka din mat & groptemperatur på distans med en webbläsare. Men tänk om vi ville utöka detta? Ange: GridDB.

Tillbehör

Hallon Pi4

SUNKEE 433Mhz Superheterodyne trådlös mottagarmodul

Steg 1: GridDB Web API & FluentD

GridDB Web API & FluentD
GridDB Web API & FluentD

När jag såg detta projekt var min första tanke - efter den första våg av spänning - att tänka på sätt att utöka funktionaliteten. Genom att använda GridDB och dess Grafana -plugin försökte jag visualisera mina mat- och gropdata. Utöver det ville jag skapa Grafana -anteckningar för att söka efter onormala datapunkter - kan inte ha något förkolnat kött!

För att komma igång behövde jag använda C -koden från det ursprungliga projektet för att läsa data som kom in från den trådlösa termometern och lägga upp den i min GridDB -server. För att få detta igång, snurrade jag upp en GridDB -server på Azure med en virtuell CentOS -dator. Det enklaste sättet att dela data från vår kantmaskin (Raspberry Pi) till vår molnserver var via GridDB Web API. Så på den videon ställde jag in GridDB: s WebAPI tillsammans med Fluentd och den medföljande GridDB -kontakten.

Innan jag faktiskt skickade data till molnet behövde jag skapa grundschemat för min BBQ Pi -behållare. Datauppsättningen som kommer in är extremt enkel: vi har två temperatursensorer, en kock -id och naturligtvis tidsstämpeln. Så vårt schema ser ut så här:

tidsserier = 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_

För att skapa denna tidsseriebehållare använde jag helt enkelt WebAPI (port 8080):

curl -X POST --basic -u admin: admin -H "Content -type: application/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

Med behållaren skapad behövde jag använda Fluentd (port 8888) för att lägga upp faktiska data i vår behållare. Här är ett CURL -kommando som lägger ut några dummy -data:

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

Därifrån behövde jag lägga till den ursprungliga koden för att skicka en HTTP POST -begäran när vår Pi läste data från vår grop (ungefär en gång var ~ var 12: e sekund).

Som en sidnot: att skriva den här koden lärde mig att uppskatta hur orimligt C -språket kan vara:

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

{CURL *curl; CURLcode res; / * I windows kommer detta att initiera winsock -grejerna */ curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; röding agent [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" datum / ": \"%s.112Z / ", \" cookid / ": \"%d / ", \" probe1 / ": \"%d / ", / "probe2 \": / "%d \"} ", tid, cookid, probe1, probe2); / * få ett curlhandtag */ curl = curl_easy_init (); if (curl) { /* Ange först webbadressen som ska ta emot vårt POST. Denna URL kan lika gärna vara en https:// URL om det är det som ska ta emot data. */ snprintf (agent, sizeof agent, "libcurl/%s", curl_version_info (CURLVERSION_NOW)-> version); agent [sizeof 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); / * Utför begäran, res får returkoden */ res = curl_easy_perform (curl); if (res! = CURLE_OK) {size_t len = strlen (errbuf); fprintf (stderr, "\ nlibcurl: (%d)", res); if (len) fprintf (stderr, "%s%s", errbuf, ((errbuf [len - 1]! = '\ n')? "\ n": "")); fprintf (stderr, "%s / n / n", curl_easy_strerror (res)); gå till städning; } sanering: curl_easy_cleanup (curl); curl_global_cleanup (); returnera 0; }}

Med den här funktionen skriven behövde jag bara att den skulle köras samtidigt som sqlite -data publicerades:

if (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, callback, 0, & zErrMsg); if (rc! = SQLITE_OK) {printf ("SQL -fel: %s / n", zErrMsg); } annat {last_db_write = sek. } char url = "https://xx.xx.xx.xx: 8888/griddb"; postData (buff, cookID, probe1, probe2, url); }}

För att säkerställa att dina data faktiskt sätts in i din server kan du köra följande kommando för att fråga din databas och se resultaten:

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

Steg 2: Grafana

Grafana
Grafana
Grafana
Grafana

Med koden på plats, nu när vi använder den ursprungliga webbportalen för att starta en "kock", kommer vi samtidigt att lagra våra temperaturdata i vår GridDB -server.

Nästa steg blir att visualisera våra data med Grafana. För att göra det följde vi informationen från den här bloggen: här. Det fina med den här implementeringen är att det är extremt lätt att se våra data kartlagda i ett snyggt diagram. Det lägger också till kommentarer.

Anteckningarna som diskuteras i bloggen gör det extremt lätt för oss att övervaka när något går fel med antingen vår mat eller själva gropen. I mitt fall lagade jag nötkött med kort revben. Med dem ville jag inte att temperaturen i gropen skulle växa bortom 275 grader Fahrenheit. Om jag såg temperaturen gå utöver det kunde jag stänga av en brännare och låta värmen sjunka igen:

Jag hade en liknande regel för att sensorn faktiskt skulle hålla koll på själva maten: om maten fick en inre temperatur på 203 grader Fahrenheit var revbenen klara. Du kan se den enda kommentaren i slutet av kocken här:

Sammantaget tog kocken mig ungefär ~ 4 timmar eller så, men den här typen av inställningar skulle verkligen utmärka sig om jag lagade något som skulle ha krävt ännu mer tid i grillen (tänk på en lågt långsam rök som varar ~ 12 timmar). Trots det tror jag värdet om det här verktyget är lätt uppenbart: att kunna logga dina livsmedelsresultat och sedan jämföra det med tidigare kockar betyder att din grillning långsamt blir bättre med tiden eftersom du kan använda data för att se vad som fungerar och vad som inte fungerar 't.

Steg 3: Maten

Maten
Maten
Maten
Maten
Maten
Maten

Detta var första gången jag någonsin har gjort nötkött kort revben; för smaksättning använde jag helt enkelt salt, svartpeppar och vitlökspulver. Trots vissa problem med att brännaren blev för hög för en liten bit där i början kom revbenen fantastiskt bra. Ta en titt:

Steg 4: Slutsats

Till slut kom maten fantastiskt bra, sensorerna, GridDB och Grafana arbetade alla underbart och vi fick värdefull information om hur man lagar dessa saker igen för nästa gång vi vill imponera på några vänner.

Rekommenderad: