Sadržaj:

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

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

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

Uvod

Roštilj se najčešće odnosi na spori proces korištenja indirektne topline za kuhanje vašeg omiljenog mesa. Iako je ovaj način kuhanja izuzetno popularan-posebno u SAD-u-ima nešto što bi neki mogli smatrati prilično ozbiljnom slabošću: potrebno je provesti sate polulucidne pažnje za praćenje temperature vaše jame i hrane. Unesite: Raspberry Pi.

Originalni projekat

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 hrane u relativno niskim cijenama, komercijalno dostupni bežični termometri za Raspberry Pi (koji je na svoje GPIO pinove priključio mali RF modul). U originalnom projektu (gore spojen), Produkt je imao podatke pohranjene u sqlite bazi podataka i prikazane 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 šta ako želimo da proširimo ovo? Unesite: GridDB.

Supplies

Raspberry 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 Grafana bilješke za traženje bilo kakvih abnormalnih podataka - ne smije imati ugljenisanog mesa!

Za početak, morao sam koristiti C kod iz originalnog projekta za čitanje podataka koji dolaze s bežičnog termometra i postavljanje tih podataka na moj GridDB server. Da bih ovo pokrenuo, pokrenuo sam GridDB poslužitelj na Azureu pomoću CentOS virtualne mašine. Najlakši način za razmjenu podataka s naše rubne mašine (Raspberry Pi) na našem serveru u oblaku bio je putem GridDB Web API -ja. Tako sam na tom vm -u postavio GridDB -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_ER_ER_)

Za kreiranje 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 postavljanje stvarnih podataka u naš spremnik. Evo CURL naredbe koja objavljuje neke lažne podatke:

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

Odatle sam morao dodati originalni kôd da bih poslao HTTP POST zahtjev 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 ovo inicirati 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 = {" date / ": \"%s.112Z / ", \" cookid / ": \"%d / ", \" probe1 / ": \"%d / ", / "sonda2 \": / "%d \"} ", vrijeme, kuhanje, sonda1, sonda2); / * get curl handle */ curl = curl_easy_init (); if (curl) { /* Prvo postavite URL koji će uskoro primiti 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)); goto cleanup; } čišćenje: curl_easy_cleanup (curl); curl_global_cleanup (); return 0; }}

S napisanom ovom funkcijom, samo mi je bilo potrebno da se pokrene u isto vrijeme kada su se postavljali sqlite podaci:

if (goodData == 1) {

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

Da biste bili sigurni da su vaši podaci zapravo umetnuti na vaš poslužitelj, možete pokrenuti sljedeću naredbu da biste upitali svoju bazu podataka i vidjeli rezultate:

curl -X POST --basic -u admin: admin -H "Vrsta sadržaja: application/json" -d '{"ograničenje": 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 originalni 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 sa ovog bloga: ovdje. Lijepa strana ove implementacije je što je izuzetno lako vidjeti naše podatke ucrtane u lijepi grafikon. Takođe dodaje napomene.

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

Imao sam slično pravilo za senzor koji zapravo prati samu hranu: ako je hrana dosegla unutrašnju temperaturu od 203 stepena Fahrenheita, rebra su bila spremna. Usamljenu napomenu na kraju kuharice možete vidjeti ovdje:

Sve u svemu, kuharu mi je trebalo samo oko 4 sata ili tako nešto, ali ovakva bi postavka zaista bila izvrsna da sam kuhala nešto za što bi mi bilo potrebno još više vremena na roštilju (pomislite na spori dim koji traje ~ 12 sati). Usprkos 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 gorionik u početku bio previsok za mrvicu, rebra su ispala fantastično. Molimo pogledajte:

Korak 4: Zaključak

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

Preporučuje se: