Sadržaj:

BBQ Pi (s vizualizacijom podataka!): 4 koraka (sa slikama)
BBQ Pi (s vizualizacijom podataka!): 4 koraka (sa slikama)

Video: BBQ Pi (s vizualizacijom podataka!): 4 koraka (sa slikama)

Video: BBQ Pi (s vizualizacijom podataka!): 4 koraka (sa slikama)
Video: ЛЮБОВЬ С ДОСТАВКОЙ НА ДОМ (2020). Романтическая комедия. Хит 2024, Studeni
Anonim
BBQ Pi (s vizualizacijom podataka!)
BBQ Pi (s vizualizacijom podataka!)
BBQ Pi (s vizualizacijom podataka!)
BBQ Pi (s vizualizacijom podataka!)
BBQ Pi (s vizualizacijom podataka!)
BBQ Pi (s vizualizacijom podataka!)

Uvod

Roštilj se obično odnosi na spori proces korištenja neizravne topline za kuhanje vašeg omiljenog mesa. Iako je ova metoda kuhanja iznimno popularna-osobito u SAD-u-ima nešto što bi neki mogli smatrati prilično ozbiljnom slabošću: zahtijeva sate polulucidne pozornosti za praćenje temperature vaše jame i hrane. Unesite: Malina Pi.

Izvorni projekt

Izvorni izvor za ovaj projekt možete pronaći ovdje: https://old.reddit.com/r/raspberry_pi/comments/a0… Suština je u tome što je korisnik Reddita Produkt uspio prenijeti podatke o temperaturi hrane i jama iz relativno jeftinih, komercijalno dostupni bežični termometri za Raspberry Pi (koji je na svoje GPIO pinove priključio mali RF modul). U izvornom projektu (gore spojen), Produkt je imao pohranjene svoje podatke u sqlite bazi podataka i prikazao ih na lokalno hostiranoj apache2 php web stranici.

Ovo rješenje već rješava izvorni problem o kojem smo govorili u uvodu ovog bloga: sada možete daljinski nadzirati temperaturu hrane i jela u web pregledniku. Ali što ako ovo želimo proširiti? Unesite: GridDB.

Pribor

Malina Pi4

SUNKEE 433Mhz Superheterodinski bežični prijemnički modul

Korak 1: GridDB Web API & FluentD

GridDB Web API & FluentD
GridDB Web API & FluentD

Nakon što sam vidio ovaj projekt, moja prva pomisao - nakon početnog vala uzbuđenja - bila je razmišljanje o načinima na koje mogu proširiti funkcionalnost. Koristeći GridDB i njegov dodatak Grafana, pokušao sam vizualizirati svoje podatke o hrani i jami. Osim toga, želio sam postaviti napomene Grafane za traženje bilo kakvih abnormalnih točaka podataka - ne mogu imati pougljeno meso!

Za početak sam morao upotrijebiti C kôd iz izvornog projekta za čitanje podataka koji dolaze s bežičnog termometra i postavljanje tih podataka na moj GridDB poslužitelj. Da bih ovo pokrenuo, pokrenuo sam GridDB poslužitelj na Azureu pomoću CentOS virtualnog stroja. Najlakši način za razmjenu podataka s našeg rubnog stroja (Raspberry Pi) na našem poslužitelju u oblaku bio je putem GridDB Web API -ja. Dakle, na tom sam vm -u postavio GAPDB -ov WebAPI zajedno s Fluentdom i pripadajućim GridDB konektorom.

Prije nego što sam zapravo poslao podatke u oblak, morao sam stvoriti osnovnu shemu za svoj BBQ Pi spremnik. Skup podataka koji dolazi vrlo je jednostavan: imamo dva senzora temperature, jedan ID kuhara i, naravno, vremensku oznaku. Dakle, naša shema izgleda ovako:

timeseries = gridstore.put_container ("bbqpi", [("vrijeme", griddb. GS_TYPE_TIMESTAMP), ("kuhanje", griddb. GS_TYPE_INT), ("sonda1", griddb. GS_TYPE_INT), ("probe2", griddb. GS_TYPE_INT)], griddb. GS_TSER_)

Za izradu ovog spremnika vremenske serije jednostavno sam upotrijebio WebAPI (port 8080):

curl -X POST --basic -u admin: admin -H "Vrsta sadržaja: aplikacija/json" -d

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

S stvorenim spremnikom, morao sam koristiti Fluentd (port 8888) za objavljivanje stvarnih podataka u naš spremnik. Evo naredbe CURL koja objavljuje neke lažne podatke:

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

Odatle sam morao dodati izvorni kôd za slanje HTTP POST zahtjeva kad god je naš Pi čitao podatke iz naše jame (otprilike jednom svakih ~ 12 sekundi).

Kao napomenu: pisanje ovog koda naučilo me je cijeniti koliko opširan jezik C može biti:

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

{CURL *curl; CURLcode res; / * U prozorima će se pokrenuti winsock stvari */ curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; char agent [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" datum / ": \"%s.112Z / ", \" kuhanje / ": \"%d / ", \" sonda1 / ": \"%d / ", / "sonda2 \": / "%d \"} ", vrijeme, kuhanje, sonda1, sonda2); / * get curl handle */ curl = curl_easy_init (); if (curl) { /* Prvo postavite URL koji će uskoro primiti naš POST. Ovaj URL može isto tako biti https:// URL ako je to ono što bi trebalo primiti podatke. */ snprintf (agent, sizeof agent, "libcurl/%s", curl_version_info (CURLVERSION_NOW)-> verzija); 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); / * Izvršite zahtjev, res će dobiti povratni kod */ 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)); idi na čišćenje; } čišćenje: curl_easy_cleanup (curl); curl_global_cleanup (); return 0; }}

S napisanom ovom funkcijom, samo sam je trebao pokrenuti u isto vrijeme kad su se objavljivali sqlite podaci:

if (goodData == 1) {

if (last_db_write == 0 || (secs-last_db_write> = 10)) {snprintf (sql, 100, "INSERT INTO očitanja (kuhanje, vrijeme, sonda1, sonda2) VRIJEDNOSTI (%d, '%s',%d, %d); ", cookID, buff, sonda1, sonda2); printf ("%s / n", sql); rc = sqlite3_exec (db, sql, povratni poziv, 0, & zErrMsg); if (rc! = SQLITE_OK) {printf ("SQL pogreška: %s / n", zErrMsg); } else {last_db_write = secs; } char url = "https://xx.xx.xx.xx: 8888/griddb"; postData (buff, cookID, sonda1, sonda2, url); }}

Kako biste bili sigurni da su vaši podaci zapravo umetnuti na vaš poslužitelj, možete pokrenuti sljedeću naredbu za postavljanje upita u bazu podataka i pregled rezultata:

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

Korak 2: Grafana

Grafana
Grafana
Grafana
Grafana

S postavljenim kodom, sada kada koristimo izvorni web portal za početak kuhanja, istovremeno ćemo pohranjivati naše podatke o temperaturi na naš GridDB poslužitelj.

Sljedeći korak bit će vizualizacija naših podataka pomoću Grafane. Da bismo to učinili, slijedili smo informacije s ovog bloga: ovdje. Lijepa stvar u ovoj implementaciji je to što je iznimno lako vidjeti naše podatke ucrtane u lijepi grafikon. Također dodaje napomene.

Napomene o kojima se raspravlja na blogu iznimno nam olakšavaju praćenje kada nešto pođe po zlu s našom hranom ili sa samim košticama. U mom slučaju kuhala sam goveđa kratka rebra. S njima nisam želio da temperatura u jami poraste iznad 275 stupnjeva celzijusa. Kad bih vidio da temperatura prelazi tu granicu, mogao bih isključiti plamenik i dopustiti da toplina ponovno padne:

Imao sam slično pravilo za senzor koji je držao podatke o samoj hrani: ako je hrana dosegla unutarnju temperaturu od 203 stupnja Fahrenheita, rebra su bila spremna. Usamljenu napomenu na kraju kuhara možete vidjeti ovdje:

Sve u svemu, kuharu mi je trebalo samo oko 4 sata ili tako nešto, ali ovakav način postavljanja doista bi se istaknuo da sam kuhao nešto za što bi mi bilo potrebno još više vremena na roštilju (pomislite na nisko spor dim koji traje ~ 12 sati). Unatoč tome, vjerujem da je vrijednost ako je ovaj alat lako uočljiv: mogućnost bilježenja rezultata vaše hrane i zatim usporedba s prethodnim kuharima znači da će vam roštilj s vremenom postajati sve bolji jer možete koristiti podatke da vidite što radi, a što ne 't.

Korak 3: Hrana

Hrana
Hrana
Hrana
Hrana
Hrana
Hrana

Ovo je bio prvi put da sam radila goveđa kratka rebra; za začine sam jednostavno koristila sol, crni papar i češnjak u prahu. Unatoč nekim problemima s time da je plamenik u početku bio previsok za mrvicu, rebra su ispala fantastično. Molim te pogledaj:

Korak 4: Zaključak

Na kraju, hrana je ispala izvrsna, senzori, GridDB i Grafana svi su odlično funkcionirali, a dobili smo i neke vrijedne podatke o tome kako ponovno skuhati ove stvari za sljedeći put kada želimo impresionirati neke prijatelje.

Preporučeni: