
Master
DepBo/AquaCare
AquaCare là hệ thống theo dõi và quản lý nuôi trồng thủy sản, gồm ứng dụng web, ứng dụng di động và backend kết nối dữ liệu cảm biến với thiết bị trong ao/bể.

AquaCare là hệ thống theo dõi và quản lý nuôi trồng thủy sản, gồm ứng dụng web, ứng dụng di động và backend kết nối dữ liệu cảm biến với thiết bị trong ao/bể.
Master-4layers is an open-source printed circuit board by DepBo, from the DepBo/AquaCare repository on GitHub. It is a 4-layer board of 100 × 100.1 mm with 135 parts on 150 nets, routed with 238 tracks and 36 vias.
It is built around the STM32F103C8T6, CH340C and ESP32-WROOM-32UE-N4, with the MAX31865AAP+, SS34 and S8050 among its other parts. Its parts include 40 resistors, 26 capacitors, 26 diodes, 12 connectors and 9 transistors. It belongs with the ESP32 and STM32 boards of this library.
AquaCare là hệ thống theo dõi và quản lý nuôi trồng thủy sản, gồm ứng dụng web, ứng dụng di động và backend kết nối dữ liệu cảm biến với thiết bị trong ao/bể.
Trong quá trình nuôi, chất lượng nước và trạng thái thiết bị có thể thay đổi nhanh, trong khi việc kiểm tra thủ công thường tốn thời gian và khó theo dõi liên tục. AquaCare tập trung đưa dữ liệu từ thiết bị IoT về một nơi để người nuôi theo dõi, nhận cảnh báo và chủ động điều khiển một số thiết bị từ xa. Hệ thống đồng thời cung cấp các màn hình quản lý cho khách hàng, nhân viên và quản trị viên.
Thiết bị gửi dữ liệu cảm biến về hệ thống thông qua MQTT. Backend tiếp nhận dữ liệu, xử lý và lưu vào Supabase để các ứng dụng truy vấn. Các chỉ số được sử dụng trong luồng theo dõi bao gồm nhiệt độ nước, độ pH, TDS và trạng thái mực nước. Dashboard giúp người dùng quan sát tình trạng hiện tại; phần lịch sử hỗ trợ xem lại biến động theo thời gian.
Ngưỡng đánh giá có thể được cấu hình theo loài nuôi. Dữ liệu được phân loại thành trạng thái bình thường, cần chú ý hoặc nguy hiểm để người vận hành nhận biết nhanh khi môi trường vượt khỏi khoảng phù hợp.
Khi chỉ số vượt ngưỡng hoặc phát hiện điều kiện bất thường, backend tạo cảnh báo gắn với bể và thiết bị liên quan. Hệ thống hỗ trợ gửi email và thông báo đẩy Firebase Cloud Messaging khi thông tin dịch vụ đã được cấu hình. Cơ chế xử lý cảnh báo có lọc và gộp trạng thái nhằm hạn chế gửi lặp liên tục cho cùng một tình trạng.
Người dùng có thể gửi lệnh điều khiển relay từ giao diện. Backend xác định thiết bị theo bể nuôi, phát lệnh qua MQTT và cập nhật trạng thái vào cơ sở dữ liệu. Endpoint lệnh thô cho phép chuyển một chuỗi lệnh tới thiết bị theo giao thức phần cứng đã triển khai. Tác vụ hẹn giờ chạy trong backend hỗ trợ các luồng điều khiển có lịch.
Hệ thống có luồng đăng ký, đăng nhập và khôi phục mật khẩu. Khu vực sau đăng nhập được phân theo vai trò: khách hàng sử dụng dashboard nuôi trồng; nhân viên truy cập màn hình nghiệp vụ; quản trị viên quản lý cấu hình và dữ liệu hệ thống. Các trang bảo vệ kiểm tra phiên Supabase và vai trò người dùng trước khi hiển thị.
Giao diện quản trị có các khu vực quản lý loài cá, thiết bị, nhân viên, đơn hàng và gói dịch vụ. Dữ liệu thiết bị có thể được theo dõi theo phiên bản và trạng thái sử dụng/kho. Quản trị viên cũng có thể cấu hình các khoảng ngưỡng nhiệt độ, pH và TDS theo loài, giúp hệ thống đánh giá dữ liệu sát với đối tượng nuôi.
Ứng dụng web còn có các trang giới thiệu sản phẩm và gói đăng ký, giỏ hàng, dashboard khách hàng và các trang nhân viên. Ứng dụng Flutter cung cấp trải nghiệm di động với các màn hình tổng quan, cảnh báo, điều khiển và quản trị.
Cảm biến / thiết bị IoT
│ MQTT telemetry và lệnh điều khiển
▼
Backend Node.js + Express ───── Firebase: thông báo đẩy
│ Email: cảnh báo
▼
Supabase
▲
├── AquaCare Web (React + TypeScript)
└── AquaCare App (Flutter)Backend nhận telemetry và xử lý cảnh báo, đồng thời cung cấp API cho đăng nhập, dashboard quản trị và điều khiển thiết bị. Web và ứng dụng di động đọc dữ liệu nghiệp vụ qua Supabase, sử dụng API backend cho các thao tác tương ứng. Supabase đảm nhiệm lưu trữ và xác thực dữ liệu; MQTT là kênh liên lạc với thiết bị.
Quản lý ao nuôi đòi hỏi người vận hành theo dõi chất lượng nước thường xuyên, nhận biết sớm các dấu hiệu bất thường và phản ứng kịp thời. Khi số lượng bể tăng lên, việc ghi chép thủ công khiến dữ liệu khó tổng hợp, khó đối chiếu và có thể bỏ lỡ những thay đổi quan trọng giữa các lần kiểm tra.
AquaCare kết hợp thiết bị cảm biến, phần mềm và lưu trữ dữ liệu để hỗ trợ các công việc đó trên cùng một hệ thống. Người dùng có thể xem thông tin từ nhiều bể, tra cứu lại lịch sử, nhận cảnh báo khi chỉ số lệch khỏi ngưỡng, và gửi lệnh đến các thiết bị được kết nối. Ngoài theo dõi kỹ thuật, hệ thống còn có các chức năng quản lý người dùng, nhân viên, thiết bị, đơn hàng và gói dịch vụ.
AquaCare là công cụ hỗ trợ quan sát và vận hành. Chất lượng kết quả phụ thuộc vào việc hiệu chuẩn cảm biến, kết nối mạng, cấu hình ngưỡng và cấu hình dịch vụ ngoài hệ thống.
Khách hàng sử dụng dashboard để xem bể nuôi thuộc tài khoản của mình, theo dõi các chỉ số môi trường và lịch sử, xem cảnh báo, cũng như sử dụng các thao tác điều khiển được cấp quyền. Giao diện web và ứng dụng di động hướng đến việc giúp người nuôi nắm nhanh tình trạng tổng thể rồi mở thông tin chi tiết khi cần.
Khu vực khách hàng trên web còn có các nội dung giới thiệu sản phẩm, gói dịch vụ, giỏ hàng và thông tin liên hệ. Việc truy cập các màn hình được bảo vệ dựa trên phiên xác thực và vai trò tài khoản.
Khu vực nhân viên phục vụ các tác vụ vận hành được phân công. Backend dashboard tổng hợp những thông tin như đơn hàng chờ xử lý, công việc đóng gói, đơn đang giao, thiết bị đã được gán và số lượng nhân viên. Màn hình quản trị còn tổ chức vai trò nhân viên theo nhóm công việc như kho, giao hàng, hỗ trợ và bảo trì.
Quản trị viên quản lý cấu hình và dữ liệu vận hành của hệ thống. Các phân hệ hiện diện trong giao diện gồm tổng quan, loài nuôi, thiết bị, nhân viên, đơn hàng và gói cước. Tùy dữ liệu và quyền đã thiết lập, quản trị viên có thể quản lý thông tin loài, ngưỡng môi trường, phân bổ thiết bị, tài khoản nhân viên, trạng thái đơn hàng và đặc tính các gói dịch vụ.
Dashboard tập trung thông tin theo bể nuôi để người vận hành không phải truy cập nhiều nguồn dữ liệu riêng lẻ. Tùy cấu hình dữ liệu, dashboard hiển thị thông số mới nhất, trạng thái chất lượng nước, cảnh báo và hoạt động điều khiển. Người dùng có thể chọn bể cần xem và đi sâu vào biểu đồ hoặc lịch sử cảm biến.
Các thành phần giao diện hỗ trợ tổng quan bể và phân tích lịch sử. Ứng dụng Flutter có màn hình tổng quan, màn hình chi tiết cảm biến và các tiện ích biểu đồ cảnh báo. Giao diện web có dashboard khách hàng và bảng điều khiển thiết bị.
Backend nhận telemetry theo topic MQTT của thiết bị, đối chiếu thiết bị với bể trong cơ sở dữ liệu, sau đó lưu các giá trị hợp lệ vào bảng lịch sử. Các luồng dữ liệu hiện có đề cập đến pH, nhiệt độ, TDS và tình trạng mực nước. Người dùng có thể xem lại dữ liệu theo thời gian nhằm nhận biết xu hướng thay đổi, thay vì chỉ nhìn vào một số đo tại thời điểm hiện tại.
Lịch sử cũng giúp việc xem xét cảnh báo có thêm bối cảnh: người vận hành có thể đánh giá chỉ số đã thay đổi ra sao, bất thường mới xuất hiện hay đã kéo dài, và cần kiểm tra thiết bị hoặc nguồn nước hay không. Độ chính xác của kết luận phụ thuộc vào cảm biến và tần suất thiết bị gửi dữ liệu.
Mỗi loài thủy sản có điều kiện môi trường phù hợp khác nhau. AquaCare tổ chức cấu hình ngưỡng theo loài để backend và giao diện có thể so sánh dữ liệu cảm biến với khoảng đánh giá tương ứng. Với các chỉ số có ngưỡng tốt và ngưỡng cảnh báo, dữ liệu được phân loại thành Good, Warn hoặc Danger.
Quản trị viên có thể quản lý loài và các khoảng giá trị môi trường được hệ thống sử dụng. Nên xác minh ngưỡng với yêu cầu thực tế của đối tượng nuôi trước khi đưa vào vận hành; cài đặt ứng dụng không thay thế tư vấn chuyên môn hoặc hiệu chuẩn thiết bị.
Khi chỉ số nằm ngoài khoảng được cấu hình hoặc trạng thái mực nước không bình thường, backend có thể ghi nhận sự kiện vào lịch sử cảnh báo. Cảnh báo được gắn với bể, thiết bị, loại chỉ số, giá trị thực tế và nội dung mô tả để tiện tra cứu.
Luồng cảnh báo có thể kiểm tra cấu hình nhận thông báo của bể, thông tin tài khoản và thời điểm cảnh báo gần nhất. Bộ lọc cooldown/gộp trạng thái giúp hạn chế việc phát đi nhiều thông báo lặp trong một khoảng ngắn. Người vận hành vẫn có thể mở màn hình cảnh báo để xem sự kiện đã lưu.
Backend hỗ trợ email cảnh báo. Khi cấu hình BREVO_API_KEY, email được gửi qua API HTTPS của Brevo; nếu không có khóa này, backend có thể dùng Gmail SMTP với EMAIL_USER và EMAIL_PASS khi môi trường cho phép. Chi tiết cấu hình triển khai email được ghi trong AquaCare_Backend/ALERT_EMAIL.md.
Thông báo đẩy được tích hợp qua Firebase Cloud Messaging. Ứng dụng web có luồng xin quyền trình duyệt và lấy token; ứng dụng Flutter khởi tạo Firebase Messaging và đồng bộ token sau khi đăng nhập. Backend cần thông tin Firebase Admin hợp lệ để gửi thông báo. Người dùng cũng cần cấp quyền thông báo trên trình duyệt hoặc thiết bị.
Từ bảng điều khiển, người dùng có thể gửi yêu cầu bật/tắt relay. Backend nhận mã bể, chân relay, trạng thái mong muốn và trường trạng thái cần cập nhật. Sau đó backend tra thiết bị theo mã bể, lấy địa chỉ MAC, gửi thông điệp MQTT tới topic lệnh của thiết bị và lưu trạng thái relay vào Supabase.
Endpoint gửi lệnh thô nhận mã bể cùng chuỗi lệnh, sau đó chuyển lệnh đến topic MQTT tương ứng với địa chỉ MAC. Lệnh chính xác cần phù hợp giao thức firmware của thiết bị. Việc gửi lệnh chỉ được xem là thành công hoàn toàn khi thiết bị nhận và thực hiện lệnh; phản hồi HTTP của backend chủ yếu xác nhận quá trình gửi/xử lý ở phía server.
Backend có worker xử lý tác vụ hẹn giờ và lịch điều khiển thiết bị. Web có tiện ích xử lý thời gian lịch thiết bị, còn backend có timer_worker.js để kiểm tra và phát lệnh theo lịch đã lưu. hardware_simulator.js hỗ trợ mô phỏng gửi telemetry trong quá trình phát triển hoặc trình diễn khi chưa có thiết bị thật; cần cấu hình Supabase trước khi chạy.
Web có màn hình đăng nhập, đăng ký, quên mật khẩu và đặt lại mật khẩu. Backend cung cấp API đăng ký/đăng nhập, trong khi Supabase được dùng cho xác thực và dữ liệu hồ sơ. Các trang dashboard, nhân viên và quản trị viên kiểm tra vai trò trước khi cho truy cập. Nếu phiên không hợp lệ hoặc vai trò không khớp với khu vực được yêu cầu, ứng dụng chuyển người dùng về trang phù hợp.
Ứng dụng di động có màn hình khởi động, hướng dẫn ban đầu, đăng nhập và đăng ký. Ứng dụng có thể ghi nhớ lựa chọn đăng nhập, khôi phục phiên khi khởi chạy và điều hướng theo vai trò đã xác thực.
Phân hệ thiết bị tập trung thông tin gắn với bể, địa chỉ MAC, phiên bản phần cứng và trạng thái sử dụng. Màn hình quản trị cung cấp bộ lọc theo phiên bản thiết bị (V1–V4) và trạng thái như đang dùng, đã được mua hoặc còn trong kho. Việc gán đúng thiết bị với đúng bể là điều kiện để backend định tuyến lệnh MQTT và gắn telemetry với dữ liệu nuôi.
Danh mục loài giúp hệ thống lưu thông tin đối tượng nuôi và các ngưỡng môi trường áp dụng. Dữ liệu này được dùng ở cả khâu đánh giá cảm biến lẫn giao diện hiển thị trạng thái. Khi tạo hoặc cập nhật ngưỡng, cần đảm bảo giá trị nhỏ nhất không lớn hơn giá trị lớn nhất và các khoảng tốt/cảnh báo được thiết lập nhất quán.
Quản trị viên có thể tổ chức nhân viên theo vai trò nghiệp vụ. Dashboard backend hiện tổng hợp một số chỉ số vận hành, bao gồm số nhân viên, đơn hàng chờ xử lý, công việc đóng gói đang thực hiện và đơn đang giao. Những dữ liệu này giúp theo dõi công việc nội bộ song song với tình trạng kỹ thuật của thiết bị.
Web có trang sản phẩm, gói đăng ký và giỏ hàng. Schema cơ sở dữ liệu có các bảng liên quan đến sản phẩm, đơn hàng, chi tiết đơn, mục giỏ hàng, gói đăng ký và đăng ký gói của người dùng. Phần quản trị đơn hàng hỗ trợ theo dõi các trạng thái như chờ duyệt, đã duyệt, đang giao và đã giao.
Web được xây dựng bằng React, TypeScript và Vite. Ứng dụng Flutter chứa các màn hình khách hàng, cảnh báo, điều khiển, nhân viên và quản trị, sử dụng chung Supabase làm nguồn dữ liệu nghiệp vụ. Tùy vai trò và nền tảng, một số tính năng hoặc cấu hình thông báo có thể khác nhau.
Ứng dụng di động lưu tùy chọn giao diện khách hàng và hỗ trợ tùy chỉnh chế độ sáng/tối. Giao diện dashboard và các biểu đồ giúp trình bày thông tin môi trường theo dạng trực quan hơn để người vận hành dễ nhận biết điểm cần chú ý.
AquaCare/
├── AquaCare_Backend/ # API Express, MQTT, xử lý cảnh báo và tác vụ hẹn giờ
├── AquaCare_Web/ # Giao diện React + TypeScript, chạy bằng Vite
├── AquaCare_App/ # Ứng dụng Flutter cho Android, iOS, Windows và các nền tảng Flutter hỗ trợ
├── migrations/ # Các tệp migration cơ sở dữ liệu
├── schema.sql # Schema cơ sở dữ liệu
├── database.txt # Tài liệu/thông tin cơ sở dữ liệu
└── README.mdAquaCare_App/pubspec.yaml.cd AquaCare_Backend
npm install
node server.jsBackend mặc định chạy tại http://localhost:5000. Kiểm tra trạng thái bằng GET /api/health.
Tạo AquaCare_Backend/.env với các giá trị phù hợp:
PORT=5000
SUPABASE_URL=https://<project-ref>.supabase.co
SUPABASE_SERVICE_ROLE_KEY=<supabase-service-role-key>
# Email cảnh báo: dùng SMTP Gmail khi chạy local
EMAIL_USER=<email>
EMAIL_PASS=<app-password>
# Tùy chọn trên môi trường triển khai: gửi email qua Brevo HTTPS
BREVO_API_KEY=<brevo-api-key>
ALERT_EMAIL_FROM=<verified-sender-email>
# Firebase Admin: JSON service account được tuần tự hóa thành một dòng
FIREBASE_SERVICE_ACCOUNT=<service-account-json>Nếu không đặt FIREBASE_SERVICE_ACCOUNT, backend tìm tệp config/firebase-service-account.json. Không commit tệp khóa hoặc biến môi trường chứa bí mật. Thông tin kết nối HiveMQ hiện được khai báo trong AquaCare_Backend/server.js; chuyển các thông tin đó sang biến môi trường trước khi sử dụng cấu hình broker riêng hoặc công khai mã nguồn.
cd AquaCare_Web
npm install
npm run devVite in địa chỉ truy cập local ra terminal (thông thường là http://localhost:5173). Các lệnh có sẵn:
npm run build
npm run previewCó thể tạo AquaCare_Web/.env.local để cấu hình dịch vụ:
VITE_API_URL=http://localhost:5000
VITE_SUPABASE_URL=https://<project-ref>.supabase.co
VITE_SUPABASE_ANON_KEY=<supabase-anon-key>Web có URL mặc định cho backend triển khai. Khi phát triển local, cần đặt VITE_API_URL để các API đăng nhập, điều khiển thiết bị và dashboard trỏ tới backend local. Các biến VITE_* được đưa vào mã phía trình duyệt; chỉ dùng khóa Supabase anon/public key, tuyệt đối không đưa service role key vào web.
Tạo AquaCare_App/.env:
SUPABASE_URL=https://<project-ref>.supabase.co
SUPABASE_ANON_KEY=<supabase-anon-key>Sau đó chạy:
cd AquaCare_App
flutter pub get
flutter runỨng dụng cũng hỗ trợ URL backend dashboard qua Dart define:
flutter run --dart-define=ADMIN_DASHBOARD_API_URL=http://localhost:5000| Phương thức | Đường dẫn | Mô tả |
|---|---|---|
GET | /api/health | Kiểm tra backend hoạt động |
POST | /api/auth/register | Đăng ký tài khoản |
POST | /api/auth/login | Đăng nhập |
GET | /api/admin/dashboard | Dữ liệu dashboard quản trị |
POST | /api/device/relay | Điều khiển relay qua MQTT |
POST | /api/device/command | Gửi lệnh thô tới thiết bị qua MQTT |
Các API quản trị yêu cầu phiên đăng nhập và quyền admin. Payload chi tiết xem trong mã nguồn tại AquaCare_Backend/routes/ và phần xử lý endpoint thiết bị trong AquaCare_Backend/server.js.
schema.sql để tham khảo schema ban đầu; các cập nhật sau có thể nằm trong migrations/.AquaCare_Backend/test/.AquaCare_Web/tests/.AquaCare_App/README.md..env, khóa Supabase service role, Firebase service account hoặc mật khẩu email.Quản lý ao nuôi đòi hỏi người vận hành theo dõi chất lượng nước thường xuyên, nhận biết sớm dấu hiệu bất thường và phản ứng kịp thời. Khi số lượng bể tăng, ghi chép thủ công khiến dữ liệu khó tổng hợp và có thể bỏ lỡ thay đổi giữa các lần kiểm tra. AquaCare kết hợp thiết bị cảm biến, phần mềm và lưu trữ dữ liệu để người dùng xem tình trạng nhiều bể, tra cứu lịch sử, nhận cảnh báo và điều khiển thiết bị từ xa. Hệ thống cũng có các chức năng quản lý nhân viên, thiết bị, đơn hàng và gói dịch vụ.
AquaCare là công cụ hỗ trợ quan sát và vận hành. Kết quả phụ thuộc vào độ chính xác cảm biến, kết nối mạng, ngưỡng cấu hình và dịch vụ ngoài hệ thống.
Khách hàng dùng dashboard để xem bể nuôi, chỉ số môi trường, lịch sử và cảnh báo. Tùy quyền và trạng thái thiết bị, người dùng có thể gửi lệnh điều khiển. Web còn có trang giới thiệu sản phẩm, gói dịch vụ, giỏ hàng và liên hệ. Ứng dụng di động cung cấp màn hình tổng quan, cảnh báo, điều khiển và lịch sử cảm biến.
Khu vực nhân viên phục vụ tác vụ vận hành được phân công. Hệ thống tổ chức vai trò theo nhóm công việc như kho, giao hàng, hỗ trợ và bảo trì. Dashboard tổng hợp số liệu như đơn chờ xử lý, công việc đóng gói, đơn đang giao, thiết bị đã gán và số lượng nhân viên.
Quản trị viên quản lý loài nuôi, ngưỡng môi trường, thiết bị, nhân viên, đơn hàng và gói dịch vụ. Màn hình thiết bị có bộ lọc theo phiên bản V1–V4 và tình trạng sử dụng/kho. API dashboard yêu cầu phiên hợp lệ và vai trò admin.
Backend nhận dữ liệu telemetry từ thiết bị qua MQTT, xác định thiết bị và bể tương ứng, rồi lưu bản ghi vào Supabase. Các chỉ số trong luồng hiện tại gồm pH, nhiệt độ, TDS và tình trạng mực nước. Dashboard tập trung dữ liệu hiện tại; biểu đồ và màn hình lịch sử giúp quan sát xu hướng theo thời gian.
Điều kiện phù hợp khác nhau giữa các loài. AquaCare cho phép lưu ngưỡng môi trường gắn với loài và dùng chúng để phân loại dữ liệu thành Good, Warn hoặc Danger. Quản trị viên có thể điều chỉnh ngưỡng; nên xác minh giá trị với yêu cầu nuôi thực tế trước khi sử dụng.
Khi chỉ số vượt khoảng cấu hình hoặc mực nước bất thường, backend có thể tạo sự kiện trong alerts_history, gắn với bể, thiết bị, loại chỉ số, giá trị và mô tả. Hệ thống kiểm tra cài đặt thông báo của bể và thời điểm cảnh báo trước đó. Cơ chế cooldown/gộp trạng thái hạn chế thông báo trùng lặp.
Email cảnh báo dùng Brevo API HTTPS khi cấu hình BREVO_API_KEY; nếu không, backend có thể dùng Gmail SMTP với EMAIL_USER và EMAIL_PASS trong môi trường hỗ trợ. Xem AquaCare_Backend/ALERT_EMAIL.md để biết chi tiết. Thông báo đẩy dùng Firebase Cloud Messaging. Web xin quyền trình duyệt và lấy FCM token; Flutter khởi tạo Firebase và đồng bộ token sau khi đăng nhập. Backend cần Firebase Admin service account hợp lệ.
Người dùng gửi yêu cầu bật/tắt relay từ bảng điều khiển. Backend tra thiết bị bằng tank_id, lấy địa chỉ MAC, gửi thông điệp tới topic MQTT của thiết bị và cập nhật trạng thái relay trong Supabase. API lệnh thô chuyển chuỗi lệnh nguyên dạng; nội dung phải khớp giao thức firmware. Phản hồi từ backend không thay thế xác nhận thiết bị đã thực sự thực thi lệnh.
timer_worker.js xử lý tác vụ theo lịch; web có tiện ích quản lý thời gian lịch thiết bị. hardware_simulator.js hỗ trợ mô phỏng telemetry trong lúc phát triển hoặc trình diễn, cần cấu hình Supabase trước khi sử dụng.
Web có đăng nhập, đăng ký, quên mật khẩu và đặt lại mật khẩu. Ứng dụng kiểm tra phiên Supabase và vai trò để điều hướng tới trang khách hàng, nhân viên hoặc quản trị. Flutter có các màn hình đăng nhập/đăng ký, có thể lưu lựa chọn đăng nhập và khôi phục phiên khi mở ứng dụng.
Phân hệ thiết bị quản lý địa chỉ MAC, phiên bản phần cứng, trạng thái kho và thiết bị được gán cho bể. Danh mục loài lưu thông tin đối tượng nuôi cùng ngưỡng đánh giá. Web có trang sản phẩm, gói đăng ký và giỏ hàng; schema có các nhóm bảng sản phẩm, đơn hàng, chi tiết đơn, giỏ hàng, gói đăng ký và đăng ký gói. Trạng thái đơn có thể gồm chờ duyệt, đã duyệt, đang giao và đã giao.
Ứng dụng xin quyền nhận thông báo, Firebase cấp token, ứng dụng đồng bộ token lên dữ liệu tài khoản. Khi phát sinh cảnh báo đủ điều kiện, backend kiểm tra cấu hình nhận thông báo và gửi qua email hoặc FCM. Người dùng cần cấp quyền trên trình duyệt/thiết bị và dịch vụ Firebase/email phải hoạt động.
| Thành phần | Công nghệ | Vai trò |
|---|---|---|
| Web | React, TypeScript, Vite, React Router | Trang giới thiệu, tài khoản, dashboard, mua sắm và quản trị |
| Giao diện web | Tailwind CSS, Recharts, Lucide React | Kiểu dáng, biểu đồ, biểu tượng |
| Backend | Node.js, Express | API, xác thực vai trò, MQTT, lịch và cảnh báo |
| Lưu trữ/xác thực | Supabase | Dữ liệu nghiệp vụ, hồ sơ và phiên đăng nhập |
| Giao tiếp IoT | MQTT qua TLS | Nhận telemetry, gửi lệnh |
| Thông báo | Firebase Cloud Messaging | Push cho web và ứng dụng di động |
| Nodemailer/Gmail SMTP hoặc Brevo API | Gửi email cảnh báo | |
| Ứng dụng di động | Flutter, Dart | Khách hàng, nhân viên, quản trị, cảnh báo và điều khiển |
Chuẩn bị dự án Supabase, schema và migration phù hợp; broker MQTT; Firebase nếu cần push; dịch vụ email nếu cần cảnh báo email. schema.sql và thư mục migrations/ mô tả cơ sở dữ liệu. Trước khi áp dụng migration lên môi trường có dữ liệu, hãy xem thứ tự và đối chiếu schema hiện tại.
cd AquaCare_Backend
npm installTạo .env theo bảng biến môi trường bên dưới, sau đó chạy:
node server.jsMặc định API chạy tại http://localhost:5000. Kiểm tra http://localhost:5000/api/health. Backend cần truy cập Supabase và broker để xử lý dữ liệu/thiết bị. Firebase Admin cần FIREBASE_SERVICE_ACCOUNT hoặc service account tại đường dẫn mà module cấu hình yêu cầu.
cd AquaCare_Web
npm install
npm run devTạo .env.local với URL backend local và thông tin Supabase. Mở địa chỉ Vite in trong terminal, thông thường http://localhost:5173. Nếu API bị chặn, kiểm tra VITE_API_URL và danh sách CORS của backend.
Lệnh khác:
npm run build
npm run previewTạo AquaCare_App/.env với Supabase URL/anon key, rồi chạy:
cd AquaCare_App
flutter pub get
flutter runNếu chạy Android emulator, localhost trong emulator không đại diện cho máy host. Dùng địa chỉ host phù hợp để gọi backend local. URL dashboard admin có thể truyền như sau:
flutter run --dart-define=ADMIN_DASHBOARD_API_URL=http://localhost:5000/api/health trả thành công.| Phương thức | Đường dẫn | Mô tả |
|---|---|---|
GET | /api/health | Health check |
POST | /api/auth/register | Đăng ký tài khoản |
POST | /api/auth/login | Đăng nhập |
GET | /api/admin/dashboard | Tổng hợp dashboard, yêu cầu token và vai trò admin |
POST | /api/device/relay | Điều khiển relay qua MQTT |
POST | /api/device/command | Chuyển lệnh thô qua MQTT |
Ví dụ health check:
GET /api/healthVí dụ điều khiển relay:
POST /api/device/relay
Content-Type: application/json
{
"tank_id": "<tank-id>",
"pin": 1,
"state": true,
"relay_field": "<device-relay-column>"
}Ví dụ gửi lệnh thô:
POST /api/device/command
Content-Type: application/json
{
"tank_id": "<tank-id>",
"command": "<command-expected-by-firmware>"
}Các trường đăng ký/đăng nhập cụ thể được định nghĩa trong AquaCare_Backend/controllers/auth.controller.js. Payload API chỉ là ví dụ cấu trúc; cần đối chiếu với schema và firmware đang dùng.
server.js: khởi tạo Express, CORS, endpoint thiết bị, MQTT subscriber, telemetry và cảnh báo.routes/auth.routes.js, controllers/auth.controller.js: định tuyến và xử lý xác thực.routes/admin-dashboard.routes.js: API dashboard admin và xác minh quyền.config/supabase.js: Supabase client phía server.config/species_thresholds.js: truy vấn ngưỡng theo loài.config/mailer.js, config/fcm.js: gửi email và push.timer_worker.js: tác vụ lịch.hardware_simulator.js: mô phỏng telemetry.test/: kiểm tra worker, mailer, dashboard admin.src/App.tsx: routes và kiểm tra vai trò.src/pages/: dashboard, đăng nhập/đăng ký, nhân viên, admin, giỏ hàng, khôi phục mật khẩu.src/components/: trang chủ, sản phẩm, gói dịch vụ, biểu đồ, điều khiển và thành phần giao diện.src/contexts/CartContext.tsx: trạng thái giỏ hàng.src/config/firebase.js: Firebase Messaging phía web.tests/: kiểm tra tiện ích thời gian lịch thiết bị.lib/main.dart: khởi tạo ứng dụng, Supabase, Firebase và phiên đăng nhập.lib/screens/: tổng quan, cảnh báo, điều khiển, admin, nhân viên, đăng nhập và đăng ký.lib/services/supabase_service.dart: thao tác dữ liệu và gọi dịch vụ backend.lib/services/fcm_service.dart: đăng ký và đồng bộ FCM.lib/models/: mô hình bể, thiết bị, cảm biến, loài, đơn hàng, nhân viên và gói dịch vụ.lib/widgets/: điều hướng, biểu đồ và xem lịch sử chi tiết.| Biến | Mục đích |
|---|---|
PORT | Cổng HTTP, mặc định 5000 |
SUPABASE_URL | URL dự án Supabase |
SUPABASE_SERVICE_ROLE_KEY | Khóa server để truy cập Supabase; giữ bí mật |
EMAIL_USER | Tài khoản SMTP khi gửi email local |
EMAIL_PASS | Mật khẩu ứng dụng SMTP |
BREVO_API_KEY | Chuyển gửi email qua Brevo API HTTPS |
ALERT_EMAIL_FROM | Sender đã xác minh của Brevo |
FIREBASE_SERVICE_ACCOUNT | JSON một dòng cho Firebase Admin |
Broker MQTT hiện được cấu hình trực tiếp trong AquaCare_Backend/server.js. Kiểm tra và chuyển cấu hình sang biến môi trường trước khi triển khai broker riêng.
| Biến | Mục đích |
|---|---|
VITE_API_URL | URL backend |
VITE_SUPABASE_URL | URL Supabase |
VITE_SUPABASE_ANON_KEY | Khóa anon/public của Supabase |
| Biến | Mục đích |
|---|---|
SUPABASE_URL | URL Supabase |
SUPABASE_ANON_KEY | Khóa anon/public của Supabase |
ADMIN_DASHBOARD_API_URL | URL dashboard backend, truyền bằng Dart define |
Schema hiện có các nhóm bảng chính:
users.subscriptions, subscription_plans, user_subscriptions.fish_species.tanks, devices.telemetry_logs.alerts_history, notifications, tank_notification_settings.relay_logs, mqtt_messages.products, orders, order_items, cart_items.tasks, support_requests, device_schedules.Tên bảng chỉ mô tả nhóm dữ liệu. Kiểm tra schema.sql và migrations/ để biết chính xác cột, khóa ngoại, chỉ mục, chính sách truy cập và thứ tự áp dụng.
# Backend
cd AquaCare_Backend
node --test
# Web
cd AquaCare_Web
npm run build
node --test tests/deviceScheduleTime.test.mjs
# Flutter
cd AquaCare_App
flutter analyze
flutter testBackend hiện chưa khai báo script test riêng trong package.json; node --test chạy các bài kiểm tra tích hợp. Kết quả còn phụ thuộc phiên bản runtime, cấu hình môi trường và dịch vụ ngoài.
Quy trình phát triển gợi ý:
npm install.SUPABASE_URL và SUPABASE_SERVICE_ROLE_KEY.VITE_API_URL.AquaCare_App/.env tồn tại và được khai báo trong assets của pubspec.yaml.SUPABASE_URL và SUPABASE_ANON_KEY.flutter pub get; xác nhận emulator/thiết bị có mạng.tank_id, MAC, topic, chân relay và tên relay_field..env, service role key, Firebase service account hoặc mật khẩu email..env Flutter được bundle như asset theo cấu hình hiện tại; không lưu khóa bí mật trong client vì có thể bị trích xuất.schema.sql: cấu trúc cơ sở dữ liệu.migrations/: các thay đổi schema theo phiên bản.database.txt: ghi chú về cơ sở dữ liệu.AquaCare_Backend/ALERT_EMAIL.md: cấu hình email cảnh báo.AquaCare_App/README.md: hướng dẫn Flutter.AquaCare_Backend/test/, AquaCare_Web/tests/: các bài kiểm tra có trong repository.| Qty | Value | Footprint | References |
|---|---|---|---|
| 11 | SS34 | Diode_SMD:D_SMA | D9, D11, D13, D14, D18, D19, D20, D21, D22, D23, D25 |
| 8 | 1kΩ | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R16, R17, R26, R29, R30, R36, R37, R41 |
| 6 | 10uf/ 50V | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C8, C10, C11, C12, C14, C15 |
| 6 | 330Ω | Resistor_SMD:R_0805_2012Metric | R27, R33, R34, R35, R40, R42 |
| 6 | RED | LED_SMD:LED_0805_2012Metric | D10, D12, D15, D16, D24, D26 |
| 6 | S8050 | Package_TO_SOT_THT:TO-92_Inline | Q4, Q6, Q7, Q9, Q10, Q11 |
| 5 | GREEN | LED_SMD:LED_0805_2012Metric | D1, D6, D7, D8, D17 |
| 4 | 104 | Capacitor_SMD:C_0805_2012Metric | C1, C19, C20, C21 |
| 3 | 10k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R7, R9, R18 |
| 2 | 10k | Resistor_SMD:R_0603_1608Metric | R10, R11 |
| 2 | 10kOhm | Resistor_SMD:R_0805_2012Metric | R3, R5 |
| 2 | 10kΩ | Resistor_SMD:R_0805_2012Metric | R20, R22 |
| 2 | 10nf | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C2, C3 |
| 2 | 10pF | Capacitor_SMD:C_0805_2012Metric | C26, C27 |
| 2 | 1k | Resistor_SMD:R_0603_1608Metric | R14, R15 |
| 2 | 1k | Resistor_SMD:R_0805_2012Metric | R21, R28 |
| 2 | 20pF | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C24, C25 |
| 2 | 4.7K | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R25, R38 |
| 2 | 5.1k | Resistor_SMD:R_0603_1608Metric | R12, R13 |
| 2 | SR360 | Diode_THT:D_DO-201AD_P15.24mm_Horizontal | D2, D5 |
| 2 | SS8050 | Package_TO_SOT_SMD:SOT-23 | Q5, Q8 |
| 2 | SW_Push | Button_Switch_THT:SW_PUSH_6mm_H5mm | SW1, SW2 |
| 1 | 0.1uF | Capacitor_SMD:C_0603_1608Metric | C17 |
| 1 | 0.1uf | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C9 |
| 1 | 0.1uf | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mm | C13 |
| 1 | 100kΩ. | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R1 |
| 1 | 100nF | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mm | C23 |
| 1 | 104 | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mm | C28 |
| 1 | 10K | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R39 |
| 1 | 10kΩ | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R2 |
| 1 | 10uF | Capacitor_SMD:C_0805_2012Metric | C22 |
| 1 | 10uF | Capacitor_SMD:C_0603_1608Metric | C18 |
| 1 | 1K | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R23 |
| 1 | 1M | Resistor_SMD:R_0805_2012Metric | R19 |
| 1 | 20K | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R24 |
| 1 | 22uf | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C4 |
| 1 | 22uh | Inductor_SMD:L_12x12mm_H8mm | L1 |
| 1 | 3.24kOhm | Resistor_SMD:R_0805_2012Metric | R4 |
| 1 | 300 Ohm | Resistor_SMD:R_0805_2012Metric | R8 |
| 1 | 330uF 16V | Capacitor_THT:CP_Radial_D6.3mm_P2.50mm | C5 |
| 1 | 33uh | Inductor_SMD:L_12x12mm_H8mm | L2 |
| 1 | 5.6kOhm | Resistor_SMD:R_0805_2012Metric | R6 |
| 1 | 560uF 16V | Capacitor_THT:CP_Radial_D6.3mm_P2.50mm | C6 |
| 1 | 8MHz | Crystal:Crystal_SMD_5032-2Pin_5.0x3.2mm | Y1 |
| 1 | AOD407 | Package_TO_SOT_SMD:TO-252-2 | Q1 |
| 1 | CBG201209U601T | Inductor_SMD:L_0805_2012Metric_Pad1.05x1.20mm_HandSolder | FB2 |
| 1 | CBW201209U121T | Inductor_SMD:L_0805_2012Metric_Pad1.05x1.20mm_HandSolder | FB1 |
| 1 | CH340C | Package_SO:SOP-16_4.4x10.4mm_P1.27mm | U4 |
| 1 | Conn_01x03 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-3-5.0-H_1x03_P5.00mm_Horizontal | J5 |
| 1 | Conn_01x04 | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | SWD1 |
| 1 | Conn_01x04 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-4-5.0-H_1x04_P5.00mm_Horizontal | J3 |
| 1 | Conn_01x06 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-6-5.0-H_1x06_P5.00mm_Horizontal | J8 |
| 1 | Conn_02x03_Odd_Even | Connector_PinHeader_2.54mm:PinHeader_2x03_P2.54mm_Vertical | JP2x32.1 |
| 1 | Crystal_GND23 | Crystal:Crystal_SMD_Abracon_ABS25-4Pin_8.0x3.8mm | Y2 |
| 1 | ESP32-WROOM-32UE | RF_Module:ESP32-WROOM-32UE | U1 |
| 1 | FS300A | Connector_PinSocket_2.54mm:PinSocket_1x03_P2.54mm_Vertical | J12 |
| 1 | Fuse | Fuse:Fuse_1812_4532Metric | F2 |
| 1 | JackDC - 12V | Connector_BarrelJack:BarrelJack_Horizontal | J2 |
| 1 | MAX31865 | Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical | J15 |
| 1 | PH_SENSOR | Connector_PinSocket_2.54mm:PinSocket_1x03_P2.54mm_Vertical | J16 |
| 1 | PZEM | Connector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_Vertical | J11 |
| 1 | SHT30 | Connector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_Vertical | J7 |
| 1 | SMAJ28A-E3/61 | Diode_SMD:D_SMA | D4 |
| 1 | STM32F103C8T6 | Package_QFP:LQFP-48_7x7mm_P0.5mm | U5 |
| 1 | TDS | Connector_PinSocket_2.54mm:PinSocket_1x03_P2.54mm_Vertical | J6 |
| 1 | TPS5430DDA 12V->3.3V | Package_SO:TI_SO-PowerPAD-8_ThermalVias | U3 |
| 1 | TPS5430DDA 12V->5V | Package_SO:TI_SO-PowerPAD-8_ThermalVias | U2 |
| 1 | USB_C_16P | Connector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal | J1 |
| 1 | Y26 | Connector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_Vertical | J4 |
| 1 | ZMM12 | Diode_SMD:D_MiniMELF | D3 |
| 1 | ~ | Button_Switch_THT:SW_PUSH_6mm_H5mm | SW3 |
The 130 most common of 135 parts.

DepBo/AquaCare
AquaCare là hệ thống theo dõi và quản lý nuôi trồng thủy sản, gồm ứng dụng web, ứng dụng di động và backend kết nối dữ liệu cảm biến với thiết bị trong ao/bể.


kholia/HF-PA-v10
HF-PA-v10 ;) Is this the end of the search for a 5W Digital PA? HF-PA-v10 is now a rugged 10W PA! We also do 100W+ now ;)

ambadran/Revolute_Joint
Optimal Cheap Robotic Actuator allowing high Torque and moderate Speed. Allow PRECISE Absolute, Speed and Torque Control. Using 3D-printed Cycloidal Drive, Custom PCB and LQR Control Algorithm.

ambadran/PCB-Manufacturer
A CNC machine with a kinematic mounting mechanism and customized GRBL Firmware to allow automated end-effector change; Allowing access to all the tools needed to create a PCB without human intervention.

mymakercorner/Leyden_Jar
A modernized controller PCB for the Brand New Model F and Beam Spring keyboards



czalinski/ThlHwTestDevices
KiCad designs, firmware and documentation for circuits that support testing of electrical hardware, such as HASS and HALT testing.
It measures 100 × 100.1 mm and has 4 copper layers, 1.6 mm thick.
135 parts, built around the STM32F103C8T6, CH340C, ESP32-WROOM-32UE-N4 and MAX31865AAP+. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the DepBo/AquaCare repository on GitHub, at the commit this page was made from: the board is Board master-slave/master/master-4layers.kicad_pcb and its schematic Board master-slave/master/master.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask DepBo before reusing the design.