- KFS × Navera
- IoT & AI for Smart Agriculture
- السيشن 21
تجميع المشروع النهائي والاختبار الميداني
Final Project Assembly & Field Testing
نجمع كل ما بنيناه في نظام واحد: عقد الحساسات + الشبكة + السيرفر + لوحة التحكم + الذكاء الاصطناعي + الأتمتة. نختبر كل مسار من البداية للنهاية، نعالج الأخطاء، نوثق الكود والدوائر، ثم ننشر النظام الكامل في موقع حقيقي بالمزرعة ليعمل 48 ساعة متواصلة.
نظرة عامة على السيشن
بنهاية السيشن ستكون قادراً على
- تراجع معمارية النظام المتكاملة وتحدد نقاط الفشل.
- تصمم وتنفذ اختبارات End-to-end لكل مسار (قراءة، أمر، توقع، تنبيه).
- تطبق Error handling شامل في الـ firmware والسيرفر (إعادة المحاولة، القيم الافتراضية الآمنة).
- توثق الكود والدوائر بمستودع منظم و README ومخطط توصيل.
- تنشر النظام 48 ساعة في الحقل وتقيس أداءه بمؤشرات محددة مسبقاً.
التطبيق في مزرعة الكلية
تشغيل النظام المتكامل لكل فريق في موقعه الحقيقي بالمزرعة لمدة 48 ساعة: قراءات كل دقيقة، لوحة تحكم حية، توقعات ري، تنبيهات Telegram، وري شبه آلي — مع خطة مراقبة ومؤشرات نجاح قابلة للقياس.
المُخرج (Deliverable)
نظام زراعي متكامل جاهز للعرض: يعمل 48 ساعة في الحقل بمؤشرات موثقة (Uptime، نسبة التسليم، التنبيهات، أحداث الري)، مع مستودع كود موثق ومخطط دوائر ودليل تشغيل.
خطة السيشن (180 دقيقة)
- 0:00 مراجعة خطة اليوم + توزيع الأدوار في الفريق 10 د
- 0:10 شرح مراجعة المعمارية المتكاملة + خطة الاختبار 25 د
- 0:35 تطبيق Lab: التجميع والاختبار على المنضدة (Bench test) 40 د
- 1:15 استراحة استراحة 10 د
- 1:25 مشروع التوثيق: المستودع، README، مخطط الدائرة 30 د
- 1:55 ميداني ميداني: نشر النظام الكامل وبدء اختبار الـ 48 ساعة 55 د
- 2:50 تقييم خطة المراقبة والتسليم 10 د
الأدوات والمكونات
قاموس المصطلحات (Glossary)
جعل المكونات المنفصلة تعمل معاً كنظام واحد.
اختبار المسار من الحساس حتى الفعل في الحقل.
اختبار كامل في المعمل قبل النقل للحقل.
شروط مسبقة تحدد نجاح المشروع.
نسبة الوقت الذي كان فيه النظام يعمل.
ميزة كانت تعمل ثم تعطلت بعد تعديل.
أول ملف يقرؤه أي شخص في المستودع: ما المشروع وكيف يشغله.
رسم يبين كل سلك من أين وإلى أين.
خطوات التشغيل والإيقاف وحل المشاكل الشائعة.
ما حدث، متى، الأثر، وكيف عولج.
النظام يفقد ميزة دون أن ينهار كله.
لا تعديلات أثناء الاختبار الميداني إلا لإصلاح حرج.
المعمارية وخطة الاختبار
25 دقيقةالنظام المتكامل في 7 طبقات
-
العقدة (السيشن 1-4، 20)
ESP32 + DHT22 + Soil + LDR + Relay، فلترة، Fail-safe، OTA، Health.
-
الشبكة (5-6)
Wi-Fi للعقد القريبة + ESP-NOW/Gateway للبعيدة.
-
النقل (7-8)
MQTT (Mosquitto + ACL + LWT) أو HTTP POST بمفتاح API.
-
التخزين (8، 10، 20)
SQLite بفهارس + نسخ احتياطي يومي + أرشفة.
-
الواجهة (9، 11، 12، 19)
لوحة تحكم + خريطة + أوامر آمنة.
-
الذكاء (13-17)
نموذج الري + طقس حي + عتبة متفق عليها + مراقبة.
-
الأتمتة (18)
قواعد + Telegram + ري تلقائي + وحدة احتياطية محلية.
| # | الاختبار | الخطوات | معيار النجاح |
|---|---|---|---|
| E1 | قراءة حتى اللوحة | غيّر رطوبة الحساس يدوياً | تظهر في اللوحة خلال ≤ 90 ث |
| E2 | أمر مضخة | تشغيل 1 د من اللوحة | الـ Relay يعمل ≤ 60 ث ويتوقف وحده، والأمر done |
| E3 | انقطاع الشبكة | افصل الراوتر 5 د أثناء ري | المضخة تتوقف + offline يظهر + عودة تلقائية |
| E4 | فشل حساس | افصل DHT22 | NULL في القاعدة، التربة تستمر، لا Crash |
| E5 | توقع الري | تربة جافة 30 د | التوصية «اروِ» + احتمال ≥ العتبة |
| E6 | تنبيه | رطوبة صوبة ≥ 90% | Telegram ≤ 10 د + المروحة |
| E7 | إعادة تشغيل السيرفر | أعد تشغيل app.py و mqtt_ingest | لا فقد بيانات بعد العودة |
| E8 | الأمان | أمر بدون تسجيل / بدون CSRF | 401 / 403 |
توزيع الأدوار (كما في وثيقة الكورس)
Hardware: العقدة والعلبة والطاقة. Software: firmware والسيرفر والأتمتة. Data: النموذج والتحليل ومؤشرات الـ 48 ساعة. Web: اللوحة والخريطة والتقرير. كل عضو مسؤول عن اختبارات طبقته.
Lab: التجميع والاختبار على المنضدة
40 دقيقةقائمة ما قبل النشر (Pre-deployment checklist)
| الطبقة | الخطأ | السلوك المطلوب |
|---|---|---|
| Firmware | Wi-Fi فشل 10 ث | خزّن محلياً، أطفئ المضخة، أعد المحاولة لاحقاً — لا تعلق |
| Firmware | NaN من DHT22 | لا ترسل الحقل |
| Ingest | JSON فاسد | سجّل warning وتجاهل |
| API | مدخل غير صالح | 400 برسالة واضحة |
| Predictor | لا نموذج / لا إنترنت | قاعدة بديلة + قيم طقس احتياطية |
| Automation | Telegram فشل | سجّل الخطأ واستمر — لا تتوقف الحلقة |
المنصة كاملة
كل ملفات النظام النهائي في حزمة واحدة: السيرفر، اللوحة، الذكاء، الأتمتة، النسخ الاحتياطي، المراقبة، والـ firmware.
python app.py
python mqtt_ingest.py --broker localhost --user dashboard --password ***
python automation.py --loop
python network_status.py
python backup.py
التوثيق
30 دقيقةteam-03-smart-farm/
├── README.md # what, why, how to run, team roles, results
├── docs/
│ ├── wiring-diagram.png # Tinkercad / Fritzing / hand drawing (clear!)
│ ├── calibration.md # dry/wet values per sensor + date
│ ├── runbook.md # start/stop, troubleshooting, contacts
│ └── field-test-48h.md # KPIs + incident log
├── firmware/node_field_A/node_field_A.ino
├── server/ # your copy of smart-farm (+ your changes)
├── analysis/notebooks/ # sessions 13-16 + final analysis
└── .gitignore # farm.db, *.joblib, secrets.env, backups/
README جيد يجيب عن
- ما المشكلة الزراعية؟ وفي أي جزء من المزرعة؟
- كيف يعمل النظام (مخطط من صورة واحدة)؟
- كيف أشغله من الصفر (أوامر قابلة للنسخ)؟
- ما النتائج (أرقام الـ 48 ساعة + لقطة اللوحة)؟
- ما القيود والخطوات القادمة؟
الأسرار خارج المستودع
كلمات سر Wi-Fi و MQTT و Telegram Token و SF_ADMIN_PASSWORD لا تُرفع أبداً. ضعها في secrets.env مضاف لـ .gitignore، واكتب في README أسماء المتغيرات فقط.
ميداني: اختبار 48 ساعة
55 دقيقةنشر النظام الكامل في موقع حقيقي لمدة 48 ساعة
موقع كل فريق في المزرعة (الصوبة / حقل الخضر / حقل الذرة) + غرفة المزرعة للسيرفر
- النشر
ركّب العقدة في موقعها، شغّلها، وتحقق من E1 و E2 في الموقع نفسه.
- تجميد الكود
من هذه اللحظة لا تعديل إلا لإصلاح حرج (ويسجل في Incident log).
- جدول المناوبة
عضو من كل فريق يراجع اللوحة 3 مرات يومياً (8 ص، 2 م، 8 م) ويسجل الملاحظات.
- زيارة ميدانية يومية
صورة للنبات، فحص يدوي للتربة، فحص العلبة.
- بعد 48 ساعة
صدّر البيانات واحسب مؤشرات النجاح أدناه.
| الوقت | المراجِع | كل العقد online؟ | تنبيهات | أحداث ري | ملاحظات / حوادث |
|---|---|---|---|---|---|
- المضخة الحقيقية يشغلها فني المزرعة فقط عبر Relay معزول.
- إيقاف طوارئ: زر في اللوحة + المفتاح اليدوي للمضخة.
- في حالة مطر أو عاصفة: تأكد من إحكام العلب.
| المؤشر | طريقة الحساب | الهدف |
|---|---|---|
| Uptime العقدة | دقائق بها قراءة ÷ 2880 | ≥ 95% |
| نسبة التسليم PDR | قراءات مستلمة ÷ المتوقعة | ≥ 95% |
| قيم NULL | NULL ÷ القراءات | ≤ 2% |
| تنبيهات صحيحة | تنبيهات لها سبب حقيقي ÷ كل التنبيهات | ≥ 80% |
| أحداث الري | عددها + كل منها done + أثرها على الرطوبة | كلها موثقة |
| حوادث | من سجل الحوادث | كل حادث له سبب وعلاج |
import sqlite3
import pandas as pd
con = sqlite3.connect("smart-farm/farm.db")
r = pd.read_sql("SELECT node_id, ts, air_temp_c, soil_moisture_pct FROM readings", con, parse_dates=["ts"])
end = r.ts.max(); start = end - pd.Timedelta(hours=48)
w = r[r.ts > start]
EXPECTED = 48 * 60 # one reading per minute
kpi = w.groupby("node_id").agg(readings=("ts", "size"),
minutes_with_data=("ts", lambda s: s.dt.floor("min").nunique()),
null_temp=("air_temp_c", lambda s: s.isna().sum()))
kpi["uptime_%"] = (kpi.minutes_with_data / EXPECTED * 100).round(1)
kpi["pdr_%"] = (kpi.readings / EXPECTED * 100).clip(upper=100).round(1)
kpi["null_%"] = (kpi.null_temp / kpi.readings * 100).round(2)
print(kpi)
cmds = pd.read_sql("SELECT node_id, actuator, status, source, created_at FROM commands", con, parse_dates=["created_at"])
print(cmds[cmds.created_at > start].groupby(["node_id", "status"]).size())
اختبر فهمك
5 أسئلة · نتيجة فوريةالواجب والتسليم
الواجب الأسبوعي (Weekly Assignment)
إدارة اختبار الـ 48 ساعة حتى نهايته وملء سجل المناوبة والحوادث.
حساب KPIs بالكود أعلاه وكتابة field-test-48h.md.
إكمال المستودع: README + wiring diagram + calibration + runbook.
تجهيز العرض النهائي (السيشن 22): 10 دقائق + 5 عرض حي + 5 أسئلة.
قائمة التسليم (Submission Checklist)
مراجع ومصادر
استعد للسيشن القادمة
السيشن الأخيرة: العرض أمام أساتذة الكلية وخبراء الزراعة. جهز الشرائح والعرض الحي (والبديل المسجل لو انقطعت الشبكة!).