Πίνακας περιεχομένων:

BBQ Pi (Με οπτικοποίηση δεδομένων!): 4 βήματα (με εικόνες)
BBQ Pi (Με οπτικοποίηση δεδομένων!): 4 βήματα (με εικόνες)

Βίντεο: BBQ Pi (Με οπτικοποίηση δεδομένων!): 4 βήματα (με εικόνες)

Βίντεο: BBQ Pi (Με οπτικοποίηση δεδομένων!): 4 βήματα (με εικόνες)
Βίντεο: Το χάος του GTA 6, τα ΒΡΑΒΕΙΑ και το δράμα του The Day Before! 2024, Ενδέχεται
Anonim
BBQ Pi (με οπτικοποίηση δεδομένων!)
BBQ Pi (με οπτικοποίηση δεδομένων!)
BBQ Pi (με οπτικοποίηση δεδομένων!)
BBQ Pi (με οπτικοποίηση δεδομένων!)
BBQ Pi (με οπτικοποίηση δεδομένων!)
BBQ Pi (με οπτικοποίηση δεδομένων!)

Εισαγωγή

Το μπάρμπεκιου αναφέρεται συνήθως στην αργή διαδικασία χρήσης έμμεσης θερμότητας για να μαγειρέψετε τα αγαπημένα σας κρέατα. Αν και αυτή η μέθοδος μαγειρέματος είναι εξαιρετικά δημοφιλής-ειδικά στις ΗΠΑ-έχει ό, τι μερικοί μπορεί να θεωρήσουν ως μια αρκετά σοβαρή αδυναμία: απαιτεί ώρες ημι-διαυγούς προσοχής για να παρακολουθήσετε τη θερμοκρασία του λάκκου και του φαγητού σας. Εισαγάγετε: Raspberry Pi.

Το Πρωτότυπο Έργο

Η αρχική πηγή για αυτό το έργο μπορεί να βρεθεί εδώ: https://old.reddit.com/r/raspberry_pi/comments/a0… Η ουσία είναι ότι ο χρήστης reddit Produkt μπόρεσε να μεταδώσει δεδομένα θερμοκρασίας τροφίμων και λάκκων από σχετικά φθηνά, διατίθενται στο εμπόριο ασύρματα θερμόμετρα σε ένα Raspberry Pi (το οποίο είχε προσαρτήσει στις καρφίτσες GPIO του μια μικρή μονάδα RF). Στο αρχικό έργο (που συνδέεται παραπάνω), ο Produkt είχε τα δεδομένα του αποθηκευμένα σε μια βάση δεδομένων sqlite και εμφανιζόταν σε έναν τοπικά φιλοξενούμενο ιστότοπο apache2 php.

Αυτή η λύση λύνει ήδη το αρχικό πρόβλημα που αναφέρθηκε στην εισαγωγή αυτού του ιστολογίου: μπορείτε τώρα να παρακολουθείτε τη θερμοκρασία των τροφίμων και των λακκοειδών σας από απόσταση με ένα πρόγραμμα περιήγησης ιστού. Τι γίνεται όμως αν θέλουμε να επεκταθούμε σε αυτό; Εισαγάγετε: GridDB.

Προμήθειες

Raspberry Pi4

Μονάδα ασύρματου δέκτη SUNKEE 433Mhz Superheterodyne

Βήμα 1: GridDB Web API & FluentD

GridDB Web API & FluentD
GridDB Web API & FluentD

Μόλις είδα αυτό το έργο, η πρώτη μου σκέψη - μετά το αρχικό κύμα ενθουσιασμού - ήταν να σκεφτώ τρόπους για να επεκτείνω τη λειτουργικότητα. Χρησιμοποιώντας το GridDB και το πρόσθετο Grafana, προσπάθησα να οπτικοποιήσω τα δεδομένα των τροφίμων και των pit μου. Από εκεί και πέρα, ήθελα να δημιουργήσω σχολιασμούς Grafana για να αναζητήσω τυχόν ανώμαλα σημεία δεδομένων - δεν μπορώ να έχω απανθρακωμένο κρέας!

Για να ξεκινήσω, έπρεπε να χρησιμοποιήσω τον κωδικό C από το αρχικό έργο για να διαβάσω τα δεδομένα που προέρχονται από το ασύρματο θερμόμετρο και να δημοσιεύσω αυτά τα δεδομένα στον διακομιστή μου GridDB. Για να ξεκινήσει αυτό, έκανα ένα διακομιστή GridDB στο Azure χρησιμοποιώντας μια εικονική μηχανή CentOS. Ο ευκολότερος τρόπος για την κοινή χρήση δεδομένων από το μηχάνημά μας (Raspberry Pi) στον διακομιστή cloud μας ήταν μέσω του GridDB Web API. Έτσι, σε αυτό το vm, έστησα το WebAPI του GridDB μαζί με το Fluentd και το συνοδευτικό σύνδεσμο GridDB.

Πριν από την πραγματική αποστολή δεδομένων στο cloud, έπρεπε να δημιουργήσω το βασικό σχήμα για το δοχείο BBQ Pi. Το σύνολο δεδομένων που έρχεται είναι εξαιρετικά απλό: έχουμε δύο αισθητήρες θερμοκρασίας, έναν αναγνωριστικό μαγειρέματος και, φυσικά, τη χρονική σήμανση. Έτσι το σχήμα μας μοιάζει με αυτό:

timeseries = gridstore.put_container ("bbqpi", [("χρόνος", griddb. GS_TYPE_TIMESTAMP), ("cookid", griddb. GS_TYPE_INT), ("probe1", griddb. GS_TYPE_INT), ("probe2", griddb. GS_TYPE_INT)] griddb. GT

Για να δημιουργήσω αυτό το δοχείο χρονομετρητών, χρησιμοποίησα απλώς το WebAPI (θύρα 8080):

curl -X POST -βασικό -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

Με το δοχείο που δημιουργήθηκε, χρειάστηκε να χρησιμοποιήσω το Fluentd (θύρα 8888) για να δημοσιεύσω πραγματικά δεδομένα στο κοντέινερ μας. Ακολουθεί μια εντολή CURL που δημοσιεύει μερικά εικονικά δεδομένα:

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

Από εκεί, έπρεπε να προσθέσω τον αρχικό κώδικα για να στείλω ένα αίτημα POST HTTP κάθε φορά που το Pi μας διάβαζε δεδομένα από το λάκκο μας (περίπου μία φορά ~ 12 δευτερόλεπτα).

Ως δευτερεύουσα σημείωση: γράφοντας αυτόν τον κώδικα με έμαθε να εκτιμώ πόσο λεκτική μπορεί να είναι η γλώσσα C:

int postData (χρόνος char , int cookid, int probe1, int probe2, char url )

{CURL *curl; CURLcode res; / * Στα παράθυρα, αυτό θα κάνει εκκίνηση των αντικειμένων σε βιτρίνα */ curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; πράκτορας char [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" date / ": \"%s.112Z / ", \" cookid / ": \"%d / ", \" probe1 / ": \"%d / ", / "probe2 \": / "%d \"} ", time, cookid, probe1, probe2); / * λάβετε μια λαβή μπούκλας */ curl = curl_easy_init (); if (curl) { /* Ορίστε πρώτα τη διεύθυνση URL που πρόκειται να λάβει το POST μας. Αυτή η διεύθυνση URL μπορεί εξίσου να είναι https:// URL, εάν αυτό είναι που πρέπει να λαμβάνει τα δεδομένα. */ snprintf (agent, sizeof agent, "libcurl/%s", curl_version_info (CURLVERSION_NOW)-> έκδοση); πράκτορας [sizeof agent - 1] = 0; curl_easy_setopt (μπούκλα, CURLOPT_USERAGENT, πράκτορας); curl_easy_setopt (μπούκλα, CURLOPT_URL, url); curl_easy_setopt (curl, CURLOPT_USERNAME, "admin"); curl_easy_setopt (curl, CURLOPT_PASSWORD, "admin"); curl_easy_setopt (μπούκλα, CURLOPT_VERBOSE, 1L); curl_easy_setopt (μπούκλα, CURLOPT_ERRORBUFFER, errbuf); curl_easy_setopt (μπούκλα, CURLOPT_POSTFIELDS, json); / * Εκτελέστε το αίτημα, το res θα λάβει τον κωδικό επιστροφής */ res = curl_easy_perform (curl)? εάν (res! = CURLE_OK) {size_t len = strlen (errbuf); fprintf (stderr, "\ nlibcurl: (%d)", res); αν (len) fprintf (stderr, "%s%s", errbuf, ((errbuf [len - 1]! = '\ n')? "\ n": "")); fprintf (stderr, "%s / n / n", curl_easy_strerror (res)); πήγα να καθαρίσω? } καθαρισμός: curl_easy_cleanup (μπούκλα); curl_global_cleanup (); επιστροφή 0? }}

Με αυτήν τη συνάρτηση γραμμένη, έπρεπε απλώς να την εκτελέσω την ίδια στιγμή που δημοσιεύονταν τα δεδομένα sqlite:

εάν (goodData == 1) {

εάν (last_db_write == 0 || (secs-last_db_write> = 10)) {snprintf (sql, 100, "ΕΙΣΑΓΩΓΕ ΣΕ αναγνώσεις (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: %s / n", zErrMsg); } else {last_db_write = secs; } char url = "https://xx.xx.xx.xx: 8888/griddb"; postData (buff, cookID, probe1, probe2, url); }}

Για να βεβαιωθείτε ότι τα δεδομένα σας πράγματι εισάγονται στον διακομιστή σας, μπορείτε να εκτελέσετε την ακόλουθη εντολή για να αναζητήσετε τη βάση δεδομένων σας και να δείτε τα αποτελέσματα:

curl -X POST -βασικό -u admin: admin -H "Content -type: application/json" -d '{"limit": 1000}' https:// localhost: 8080/griddb/v2/defaultCluster/dbs/ δημόσια/εμπορευματοκιβώτια/bbqpi/σειρές

Βήμα 2: Grafana

Grafana
Grafana
Grafana
Grafana

Με τον κωδικό στη θέση του, τώρα όταν χρησιμοποιούμε την αρχική διαδικτυακή πύλη για να ξεκινήσουμε ένα "μαγείρεμα", θα αποθηκεύουμε ταυτόχρονα τα δεδομένα θερμοκρασίας στον διακομιστή μας GridDB.

Το επόμενο βήμα θα είναι η οπτικοποίηση των δεδομένων μας χρησιμοποιώντας το Grafana. Για να το κάνουμε αυτό, ακολουθήσαμε τις πληροφορίες από αυτό το ιστολόγιο: εδώ. Το ωραίο με αυτήν την υλοποίηση είναι ότι είναι εξαιρετικά εύκολο να δούμε τα δεδομένα μας σε ένα ωραίο γράφημα. Προσθέτει επίσης σχολιασμούς.

Οι σχολιασμοί που συζητούνται στο ιστολόγιο μας καθιστούν εξαιρετικά εύκολο να παρακολουθούμε πότε κάτι δεν πάει καλά είτε με το φαγητό μας είτε με το ίδιο το λάκκο. Στην περίπτωσή μου, μαγείρευα κοντά μοσχαρίσια παϊδάκια. Με αυτά, δεν ήθελα η θερμοκρασία στο λάκκο να αυξηθεί πέρα από τους 275 βαθμούς Φαρενάιτ. Αν έβλεπα τη θερμοκρασία να υπερβαίνει αυτό, θα μπορούσα να σβήσω έναν καυστήρα και να αφήσω τη θερμότητα να πέσει ξανά:

Είχα έναν παρόμοιο κανόνα για τον αισθητήρα που παρακολουθούσε πραγματικά το ίδιο το φαγητό: εάν το φαγητό έφτανε σε εσωτερική θερμοκρασία 203 βαθμών Φαρενάιτ, τα πλευρά ήταν έτοιμα. Μπορείτε να δείτε τον μοναδικό σχολιασμό στο τέλος του μάγειρα εδώ:

Συνολικά, ο μάγειρας μου πήρε μόνο περίπου 4 ώρες περίπου, αλλά αυτό το είδος ρύθμισης θα ήταν πραγματικά εξαιρετικό αν μαγείρευα κάτι που θα απαιτούσε ακόμη περισσότερο χρόνο στο γκριλ (σκεφτείτε έναν χαμηλό-αργό καπνό που διαρκεί 12 ~ ώρες). Παρ 'όλα αυτά, πιστεύω ότι η αξία αν αυτό το εργαλείο είναι εύκολα εμφανές: το να μπορείτε να καταγράφετε τα αποτελέσματα των τροφίμων σας και στη συνέχεια να το συγκρίνετε με προηγούμενους μάγειρες σημαίνει ότι το μπάρμπεκιου σας θα βελτιωθεί σιγά σιγά με την πάροδο του χρόνου καθώς μπορείτε να χρησιμοποιήσετε δεδομένα για να δείτε τι λειτουργεί και τι όχι 't

Βήμα 3: Το φαγητό

Το φαγητό
Το φαγητό
Το φαγητό
Το φαγητό
Το φαγητό
Το φαγητό

Αυτή ήταν η πρώτη φορά που έφτιαχνα μοσχάρι κοντά παϊδάκια. για καρύκευμα, χρησιμοποίησα απλά αλάτι, μαύρο πιπέρι και σκόνη σκόρδου. Παρά τα προβλήματα με τον καυστήρα να είναι πολύ ψηλός για λίγο στην αρχή, τα παϊδάκια βγήκαν φανταστικά. Σε παρακαλώ ρίξε μια ματιά:

Βήμα 4: Συμπέρασμα

Τελικά, το φαγητό βγήκε υπέροχο, οι αισθητήρες, το GridDB και η Grafana συνεργάστηκαν όμορφα και πήραμε μερικά πολύτιμα δεδομένα για το πώς να μαγειρέψουμε ξανά αυτά τα πράγματα για την επόμενη φορά που θέλουμε να εντυπωσιάσουμε μερικούς φίλους.

Συνιστάται: