תוכן עניינים:

BBQ Pi (עם הדמיית נתונים!): 4 שלבים (עם תמונות)
BBQ Pi (עם הדמיית נתונים!): 4 שלבים (עם תמונות)

וִידֵאוֹ: BBQ Pi (עם הדמיית נתונים!): 4 שלבים (עם תמונות)

וִידֵאוֹ: BBQ Pi (עם הדמיית נתונים!): 4 שלבים (עם תמונות)
וִידֵאוֹ: Jonathan Blow: תודעה, עיצוב משחקים ורצון חופשי 2024, נוֹבֶמבֶּר
Anonim
מנגל פי (עם הדמיית נתונים!)
מנגל פי (עם הדמיית נתונים!)
מנגל פי (עם הדמיית נתונים!)
מנגל פי (עם הדמיית נתונים!)
מנגל פי (עם הדמיית נתונים!)
מנגל פי (עם הדמיית נתונים!)

מבוא

ברביקיו מתייחס בדרך כלל לתהליך האיטי של שימוש בחום עקיף לבישול הבשרים האהובים עליכם. אף על פי ששיטת בישול זו פופולרית מאוד-במיוחד בארה ב-יש בה מה שחושבים כחולשה רצינית למדי: היא דורשת שעות של תשומת לב חצי צלולה כדי להשקיע אחר הטמפרטורה של הבור והמזון שלך. הזן: פטל פטל.

הפרויקט המקורי

ניתן למצוא את המקור המקורי לפרויקט זה כאן: https://old.reddit.com/r/raspberry_pi/comments/a0… עיקרו הוא כי משתמש reddit Product הצליח להעביר נתוני טמפרטורת מזון ובור מהזול יחסית., מדחומים אלחוטיים זמינים מסחרית ל- Raspberry Pi (שחיבר לסיכות ה- GPIO שלו מודול RF קטן). בפרויקט המקורי (המקושר למעלה) הנתונים של Product נשמרו במסד נתונים של sqlite ומוצגים באתר apache2 php המתארח באופן מקומי.

פתרון זה כבר פותר את הבעיה המקורית שבה נגעו בהקדמה של בלוג זה: כעת תוכל לעקוב אחר טמפרטורת האוכל והבור שלך מרחוק באמצעות דפדפן אינטרנט. אבל מה אם נרצה להרחיב בנושא? הזן: GridDB.

אספקה

פטל Pi4

מודול מקלט אלחוטי SUNKEE 433Mhz Superheterodyne

שלב 1: GridDB Web API ו- FluentD

GridDB Web API & FluentD
GridDB Web API & FluentD

כשראיתי את הפרויקט הזה, המחשבה הראשונה שלי - אחרי גל ההתרגשות הראשוני - הייתה לחשוב על דרכים להרחיב את הפונקציונליות. בעזרת GridDB ותוסף הגרפנה שלו, חיפשתי לדמיין את נתוני המזון והבורות שלי. מעבר לכך, רציתי להגדיר ביאורים של גרפנה כדי לחפש נקודות נתונים חריגות - לא יכול להיות שום בשר חרוך!

כדי להתחיל, הייתי צריך להשתמש בקוד C מהפרויקט המקורי כדי לקרוא את הנתונים שמגיעים ממדחום האלחוט ולפרסם נתונים אלה בשרת GridDB שלי. כדי להפעיל את זה, סובבתי שרת GridDB ב- Azure באמצעות מכונה וירטואלית של CentOS. הדרך הקלה ביותר לשתף נתונים ממכונת הקצה שלנו (Raspberry Pi) לשרת הענן שלנו הייתה באמצעות ממשק ה- GridDB Web. אז, ב- vm זה, הקמתי את WebAPI של GridDB יחד עם Fluentd והמחבר GridDB הנלווה אליו.

לפני ששלחתי נתונים למעשה לענן, הייתי צריך ליצור את הסכימה הבסיסית למכל ה- BBQ Pi שלי. מערך הנתונים שנכנס הוא פשוט ביותר: יש לנו שני חיישני טמפרטורה, מזהה בישול אחד, וכמובן חותמת הזמן. אז הסכימה שלנו נראית כך:

זמנים = gridstore.put_container ("bbqpi", [("זמן", griddb. GS_TYPE_TIMESTAMP), ("cookid", griddb. GS_TYPE_INT), ("probe1", griddb. GS_TYPE_INT), ("probe2", griddb. GS_TYPE_INT)], griddb. GS_CONTAINER_TIME_

ליצירת מיכל משך הזמן הזה, פשוט השתמשתי ב- WebAPI (יציאה 8080):

curl -X POST --basic -u admin: admin -H "סוג תוכן: יישום/json" -d

'{"container_name": "bbqpi", "container_type": "TIME_SERIES", / "keykey": 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

משם, הייתי צריך לצרף את הקוד המקורי כדי לשלוח בקשת HTTP POST בכל פעם שהפי שלנו קורא נתונים מהבור שלנו (בערך כל ~ 12 שניות).

הערה צדדית: כתיבת הקוד הזה לימדה אותי להעריך עד כמה שפת C יכולה להיות מפורטת:

int postData (זמן char , int cookid, int probe1, int probe2, char url )

{CURL *תלתל; CURLcode res; / * בחלונות, זה יתחיל את חומר winsock */ curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; סוכן צ'ארם [1024] = {0,}; צ'אר ג'סון [1000]; snprintf (json, 200, "json = {" date / ": \"%s.112Z / ", \" cookid / ": \"%d / ", \" probe1 / ": \"%d / ", / "probe2 \": / "%d \"} ", time, cookid, probe1, probe2); / * קבל ידית תלתלים */ curl = curl_easy_init (); if (curl) { /* הגדר תחילה את כתובת האתר שעומדת לקבל את ה- POST שלנו. כתובת אתר זו יכולה באותה מידה להיות כתובת אתר https:// אם זה מה שצריך לקבל את הנתונים. */ snprintf (סוכן, סוכן גודל, "libcurl/%s", curl_version_info (CURLVERSION_NOW)-> גרסה); סוכן [sizeof סוכן - 1] = 0; curl_easy_setopt (curl, CURLOPT_USERAGENT, סוכן); curl_easy_setopt (curl, CURLOPT_URL, url); curl_easy_setopt (curl, CURLOPT_USERNAME, "מנהל"); 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); / * בצע את הבקשה, res יקבל את קוד ההחזרה */ 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)); ללכת לנקות; } ניקוי: curl_easy_cleanup (curl); curl_global_cleanup (); החזר 0; }}

כשהפונקציה הזו כתובה, הייתי צריך להפעיל אותה במקביל לפרסום נתוני sqlite:

אם (goodData == 1) {

if (last_db_write == 0 || (secs-last_db_write> = 10)) {snprintf (sql, 100, "הכנס לקריאות (cookid, time, probe1, probe2) ערכים (%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); } אחר {last_db_write = שניות; } char url = "https://xx.xx.xx.xx: 8888/griddb"; postData (buff, cookID, probe1, probe2, url); }}

כדי לוודא שהנתונים שלך באמת מוכנסים לשרת שלך, תוכל להריץ את הפקודה הבאה כדי לבדוק את מסד הנתונים ולצפות בתוצאות:

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

שלב 2: גרפנה

גרפנה
גרפנה
גרפנה
גרפנה

כשהקוד קיים, כעת כשאנחנו משתמשים בפורטל האינטרנט המקורי כדי להתחיל "טבח", נשמור בו זמנית את נתוני הטמפרטורה שלנו בשרת GridDB שלנו.

השלב הבא יהיה הדמיה של הנתונים שלנו באמצעות Grafana. לשם כך עקבנו אחר המידע מהבלוג הזה: כאן. הדבר הנחמד ביישום זה הוא שקל מאוד לראות את הנתונים שלנו מתואמים לתרשים נחמד. זה גם מוסיף ביאורים.

ההערות שנדונו בבלוג מקלות עלינו מאוד על ניטור כאשר משהו משתבש באוכל שלנו או בבור עצמו. במקרה שלי, בישלתי צלעות קצרות בקר. עם אלה, לא רציתי שהטמפרטורה בבור תעלה מעל 275 מעלות פרנהייט. אם הייתי רואה שהטמפרטורה חורגת מזה, יכולתי לכבות מבער ולאפשר לחום לטבול שוב:

היה לי כלל דומה לגבי החיישן בפועל שמירה על מעקב אחר האוכל עצמו: אם האוכל הגיע לטמפרטורה פנימית של 203 מעלות פרנהייט, הצלעות היו מוכנות. אתה יכול לראות את הביאור הבודד בסוף הטבח כאן:

בסך הכל, הטבח לקח לי רק בערך 4 שעות בערך, אבל התקנה כזו באמת הייתה מצטיינת אם הייתי מבשל משהו שהיה דורש אפילו יותר זמן בגריל (תחשוב על עשן איטי נמוך שנמשך ~ 12 שעה (ות). למרות זאת, אני מאמין שהערך אם הכלי הזה ניכר בקלות: היכולת לרשום את תוצאות המאכלים שלך ואז להשוות אותו לטבחים קודמים פירושה שהמנגל שלך לאט לאט ישתפר עם הזמן מכיוון שתוכל להשתמש בנתונים כדי לראות מה עובד ומה לא. לא.

שלב 3: האוכל

האוכל
האוכל
האוכל
האוכל
האוכל
האוכל

זו הייתה הפעם הראשונה שהכנתי צלעות קצרות בקר; לתיבול, פשוט השתמשתי במלח, פלפל שחור ואבקת שום. למרות כמה בעיות עם המבער שהגיע גבוה מדי בשביל קצת בהתחלה, הצלעות יצאו פנטסטיות. בבקשה תסתכל:

שלב 4: מסקנה

בסופו של דבר האוכל יצא נהדר, החיישנים, GridDB, וגרפנה עבדו כולם בקונצרט יפה, וקיבלנו נתונים יקרי ערך כיצד לבשל את הדברים האלה שוב בפעם הבאה שנרצה להרשים כמה חברים.

מוּמלָץ: