İçindekiler:

Barbekü Pi (Veri Görselleştirme ile!): 4 Adım (Resimlerle)
Barbekü Pi (Veri Görselleştirme ile!): 4 Adım (Resimlerle)

Video: Barbekü Pi (Veri Görselleştirme ile!): 4 Adım (Resimlerle)

Video: Barbekü Pi (Veri Görselleştirme ile!): 4 Adım (Resimlerle)
Video: Ünite 10 A - Veri Görselleştirme (Matplotlib Çizgi ve Saçılım Grafiği, Temel Ayarlar) 2024, Kasım
Anonim
Barbekü Pi (Veri Görselleştirme ile!)
Barbekü Pi (Veri Görselleştirme ile!)
Barbekü Pi (Veri Görselleştirme ile!)
Barbekü Pi (Veri Görselleştirme ile!)
Barbekü Pi (Veri Görselleştirme ile!)
Barbekü Pi (Veri Görselleştirme ile!)

Tanıtım

Barbekü, en tipik olarak, en sevdiğiniz etleri pişirmek için dolaylı ısı kullanmanın yavaş sürecini ifade eder. Bu pişirme yöntemi son derece popüler olmasına rağmen - özellikle ABD'de - bazılarının oldukça ciddi bir zayıflık olarak kabul edebileceği bir şeye sahiptir: çukurunuzun ve yemeğinizin sıcaklığını izlemek için saatlerce yarı net bir dikkat gerektirir. Girin: Ahududu Pi.

Orijinal Proje

Bu projenin orijinal kaynağı burada bulunabilir: https://old.reddit.com/r/raspberry_pi/comments/a0… İşin özü, reddit kullanıcısı Produkt'un gıda ve çukur sıcaklık verilerini nispeten ucuza aktarabilmesidir., ticari olarak temin edilebilen kablosuz termometreler bir Raspberry Pi'ye (GPIO pinlerine küçük bir RF modülü bağlamıştı). Orijinal projede (yukarıda bağlantılı), Produkt verilerinin bir sqlite veritabanında saklanmasına ve yerel olarak barındırılan bir apache2 php web sitesinde görüntülenmesine sahipti.

Bu çözüm, bu blogun girişinde değinilen asıl sorunu zaten çözüyor: Artık bir web tarayıcısı ile yiyecek ve çukur sıcaklığınızı uzaktan izleyebilirsiniz. Ama ya bunu genişletmek istersek? Girin: GridDB.

Gereçler

Ahududu Pi4

SUNKEE 433Mhz Süperheterodin Kablosuz Alıcı Modülü

Adım 1: GridDB Web API ve FluentD

GridDB Web API'si ve FluentD
GridDB Web API'si ve FluentD

Bu projeyi gördüğümde, ilk heyecan dalgasından sonra ilk düşüncem, işlevselliği genişletmenin yollarını düşünmekti. GridDB ve Grafana eklentisini kullanarak yiyecek ve çukur verilerimi görselleştirmeye çalıştım. Bunun ötesinde, herhangi bir anormal veri noktası aramak için Grafana ek açıklamaları kurmak istedim - kömürleşmiş et olamaz!

Başlamak için, kablosuz termometreden gelen verileri okumak ve bu verileri GridDB sunucuma göndermek için orijinal projedeki C kodunu kullanmam gerekiyordu. Bunu kurmak ve çalıştırmak için bir CentOS sanal makinesi kullanarak Azure üzerinde bir GridDB Sunucusu kurdum. Uç makinemizden (Raspberry Pi) bulut sunucumuza veri paylaşmanın en kolay yolu GridDB Web API'siydi. Bu nedenle, o vm'de Fluentd ve beraberindeki GridDB konektörüyle birlikte GridDB'nin WebAPI'sini kurdum.

Buluta veri göndermeden önce, BBQ Pi konteynerim için temel şema oluşturmam gerekiyordu. Gelen veri seti son derece basit: iki sıcaklık sensörümüz, bir aşçı kimliğimiz ve tabii ki zaman damgamız var. Yani şemamız şuna benziyor:

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

Bu zaman serisi kapsayıcısını oluşturmak için WebAPI'yi (8080 numaralı bağlantı noktası) kullandım:

curl -X POST --basic -u admin:admin -H "İçerik türü:uygulama/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" }]}'

Oluşturulan kapsayıcıyla, gerçek verileri kapsayıcımıza göndermek için Fluentd'yi (bağlantı noktası 8888) kullanmam gerekiyordu. İşte bazı sahte veriler gönderen bir CURL komutu:

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

Oradan, Pi'miz çukurumuzdan veri okuduğunda bir HTTP POST İsteği göndermek için orijinal kodu eklemem gerekiyordu (yaklaşık her ~ 12 saniyede bir).

Bir yan not olarak: bu kodu yazmak bana C dilinin ne kadar ayrıntılı olabileceğini takdir etmeyi öğretti:

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

{ CURL *kıvrım; CURLcode res; /* Windows'ta bu, winsock öğelerini başlatır */ curl_global_init(CURL_GLOBAL_ALL); karakter hatası[CURL_ERROR_SIZE] = { 0, }; karakter aracısı[1024] = { 0, }; karakter json[1000]; snprintf(json, 200, "json={"date\":\"%s.112Z\", \"cookid\":\"%d\", \"probe1\":\"%d\", \"probe2\":\"%d\"}", zaman, cookie, prob1, prob2)); /* bir kıvrılma tutamacı olsun */ curl = curl_easy_init(); if(curl) { /* Önce POST'umuzu almak üzere olan URL'yi ayarlayın. Bu URL, verileri alması gereken şey buysa, bir https:// URL'si de olabilir. */ snprintf(agent, sizeof agent, "libcurl/%s", curl_version_info(CURLVERSION_NOW)->version); ajan[ajan boyutu - 1] = 0; curl_easy_setopt(curl, CURLOPT_USERAGENT, aracı); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_USERNAME, "yönetici"); curl_easy_setopt(curl, CURLOPT_PASSWORD, "yönetici"); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json); /* İsteği gerçekleştir, res dönüş kodunu alacak */ 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)); temizlemeye git; } temizleme: curl_easy_cleanup(curl); curl_global_cleanup(); 0 döndür; } }

Bu fonksiyon yazıldığında, sqlite verilerinin gönderildiği anda çalıştırmam gerekiyordu:

if (goodData==1) {

if (last_db_write==0 || (secs-last_db_write>=10)) { snprintf(sql, 100, "INSERT INTO okumaları (cookid, time, probe1, probe2) DEĞERLER (%d, '%s', %d, %d);", CookID, buff, prob1, prob2); printf("%s\n", sql); rc=sqlite3_exec(db, sql, geri arama, 0, &zErrMsg); if (rc!=SQLITE_OK) { printf("SQL hatası: %s\n", zErrMsg); } else { last_db_write=sec; } karakter url = "https://xx.xx.xx.xx:8888/griddb"; postData(buff, CookID, prob1, prob2, url); } }

Verilerinizin sunucunuza gerçekten eklendiğinden emin olmak için veritabanınızı sorgulamak ve sonuçları görüntülemek için aşağıdaki komutu çalıştırabilirsiniz:

curl -X POST --basic -u admin:admin -H "Content-type:application/json" -d '{"limit":1000}' https://localhost:8080/griddb/v2/defaultCluster/dbs/ genel/konteynerler/bbqpi/satırlar

2. Adım: Grafana

Grafana
Grafana
Grafana
Grafana

Yerinde kod ile, şimdi bir "yemek pişirmek" başlatmak için orijinal web portalını kullandığımızda, sıcaklık verilerimizi aynı anda GridDB sunucumuza kaydedeceğiz.

Bir sonraki adım, verilerimizi Grafana kullanarak görselleştirmek olacaktır. Bunu yapmak için şu blogdaki bilgileri takip ettik: burada. Bu uygulamanın güzel yanı, verilerimizin güzel bir grafikte gösterildiğini görmenin son derece kolay olmasıdır. Ayrıca açıklamalar ekler.

Blogda tartışılan açıklamalar, yemeğimizde veya çukurun kendisinde bir şeyler ters gittiğinde izlememizi son derece kolaylaştırıyor. Benim durumumda, sığır eti kısa kaburga pişiriyordum. Bunlarla, çukurdaki sıcaklığın 275 derece Fahrenheit'in üzerine çıkmasını istemedim. Sıcaklığın bunun ötesine geçtiğini görürsem, brülörü kapatabilir ve ısının tekrar düşmesine izin verebilirim:

Yiyeceklerin kendisini takip eden sensör için de benzer bir kuralım vardı: yiyecek 203 fahrenhayt derecelik bir iç sıcaklığa ulaşırsa, kaburgalar hazırdı. Aşçının sonundaki yalnız açıklamayı burada görebilirsiniz:

Sonuç olarak, aşçı sadece yaklaşık 4 saatimi aldı, ancak bu tür bir kurulum, ızgarada daha fazla zaman gerektirecek bir şey pişiriyor olsaydım gerçekten mükemmel olurdu (~ 12 süren düşük yavaş bir duman düşünün) saat). Buna rağmen, bu aracın kolayca görülebilmesinin değerine inanıyorum: Yiyeceklerinizin sonuçlarını kaydedebilmek ve ardından önceki aşçılarla karşılaştırabilmek, neyin işe yarayıp neyin yaramadığını görmek için verileri kullanabildiğiniz için barbekünüzün zamanla yavaş yavaş daha iyi hale geleceği anlamına gelir. 'T.

3. Adım: Yemek

Gıda
Gıda
Gıda
Gıda
Gıda
Gıda

Bu, dana eti kısa kaburga yaptığım ilk seferdi; baharat olarak sadece tuz, karabiber ve sarımsak tozu kullandım. Brülörün başlangıçta biraz fazla yükselmesiyle ilgili bazı sorunlara rağmen, kaburgalar harika çıktı. Lütfen bir bak:

4. Adım: Sonuç

Sonunda, yemek harika çıktı, sensörler, GridDB ve Grafana'nın hepsi uyum içinde çok güzel çalıştı ve bir dahaki sefere bazı arkadaşlarımızı etkilemek istediğimizde bu şeyleri nasıl tekrar pişireceğimize dair değerli veriler elde ettik.

Önerilen: