Ένα ενσωματωμένο σύστημα συνδεδεμένο με αισθητήρες και πρόσβαση στο διαδίκτυο για ειδοποίηση αν οι ενδείξεις από τους αισθητήρες ξεπεράσουν κάποιο προκαθορισμένο όριο. Τα δεδομένα από τους αισθητήρες θα αποθηκεύονται και οπτικοποιούνται για μελλοντική αναφορά.
Hardware Components:
- Raspberry Pi 4
- ESP8266 microchips
- Temperature & Humidity Sensors
- Rain-Drop Sensors
- Motion & Contact Sensors
- LEDs & Buzzers
Software Components:
- Raspberry Pi OS
- Database (influxdb)
- Visualization (grafana)
- MQTT Server (mosquitto)
- Orchestrator (node-red)
- Git
- Ansible
- Docker
Στο πρώτο μέρος υλοποίησης θα προετοιμάσουμε το raspberry ώστε να μπορέσει να υποδεχθεί το σύνολο των εφαρμογών που απαιτούνται για το project. Ξεκινάμε με την εγκατάσταση του βασικού λειτουργικού συστήματος Raspberry Pi OS Lite. Στη συνέχεια ενεργοποιούμε την απομακρυσμένη πρόσβαση με SSH. Αναβαθμίζουμε το σύνολο των πακέτων που υποστηρίζονται από το λειτουργικό και τέλος γίνεται η εγκατάσταση του Docker και Docker-Compose.
Προαπαιτούμενα:
- Raspberry Pi, SD card, καλώδιο ethernet και τροφοδοσία
- Raspberry Pi OS Lite
- SSH key pair (How To Set up SSH Keys on a Linux / Unix System)
- Ansible (Installation Guide)
- Git (Installing Git)
Ένας τρόπος να γίνει η εγκατάσταση του λειτουργικού συστήματος είναι χρησιμοποιώντας το Raspberry Pi Imager που έχει γραφικό περιβάλλον ενώ ένας δεύτερος τρόπος είναι από terminal με την εντολή dd. Βάζουμε την SD κάρτα στον υπολογιστή μας και τρέχουμε τις παρακάτω εντολές. Με την πρώτη εντολή βλέπουμε τον αριθμό του δίσκου που έχει πάρει η κάρτα SD. Στη συνέχεια την κάνουμε unmount και με την εντολή dd γράφουμε το image στην SD κάρτα. (ΠΡΟΣΟΧΗ να δώσουμε τον σωστό αριθμό δίσκου (rdisk? or sd*) στην εντολή dd.
MacOS
diskutil list
diskutil unmountDisk /dev/disk4
dd if=2022-01-28-raspios-bullseye-armhf-lite.img of=/dev/rdisk4 bs=1m
Linux
lsblk
dd if=2022-01-28-raspios-bullseye-armhf-lite.img of=/dev/sdc bs=1m
By default το ssh είναι απενεργοποιημένο στο raspberry. Το ενεργοποιούμε δημιουργώντας ένα κενό αρχείο με όνομα ssh στο root folder. Έπειτα κάνουμε unmount την SD κάρτα και την βάζουμε στο raspberry.
touch /Volumes/boot/ssh
Αφού γίνει boot το raspberry τρέχουμε την παρακάτω εντολή. Έτσι θα μπορούμε να κάνουμε login στο raspberry χωρίς να εισάγουμε κωδικό πρόσβασης αλλά με το ιδιωτικό μας κλειδί (SSH key pair). Θα μας ζητήσει το default password που είναι το raspberry. Αν δεν υπάρχει local dns στην υποδομή μας αντί για raspberrypi βάζουμε την IP διεύθυνση που πήρε το raspberry.
ssh-copy-id pi@raspberrypi
Κάνουμε login στο raspberry και τρέχουμε την παρακάτω εντολή ορίζοντας έτσι την τοποθεσία μας ώστε να έχει το raspberry την σωστή ώρα.
ssh pi@raspberrypi
sudo timedatectl set-timezone Europe/Athens
Στον υπολογιστή μας κατεβάζουμε το project από το git και γεμίζουμε το αρχείο config.yml με μεταβλητές της επιλογής μας. Οι μεταβλητές αφορούν το όνομα της βάσης και credentials για αυτή καθώς και credentials για την διαχείριση της influxdb και του grafana.
git clone https://github.com/theohitman/pms-thesis.git
cd pms-thesis
cp config.yml.example config.yml
Από υπολογιστή που έχουμε εγκατεστημένη την ansible εκτελούμε τα playbooks. Με το παρακάτω playbook γίνονται οι εξής ενέργειες στο raspberry:
- Απενεργοποίηση του password authentication. SSH μόνο με κλειδί (SSH key pair)
- Αναβάθμιση όλων των πακέτων του raspberry
- Εγκατάσταση απαραίτητων πακέτων για το docker
- Εγκατάσταση docker
- Προσθήκη δικαιωμάτων στον χρήστη pi ώστε να τρέχει εντολές για το docker
- Εγκατάσταση docker-compose
ansible-playbook playbooks/docker-install.yml
Σε αυτό το μέρος θα γίνει η διασύνδεση των components (αισθητήρων, leds, κτλ.) με το ESP8266 καθώς και ο προγραμματισμός του.
Προαπαιτούμενα:
- ESP8266 microchips
- Καλώδιο microusb to usb
- Arduino IDE
- Αισθητήρες Humidity Sensor DHT11, Rain Sensor Module, PIR Sensor Module HC-SR501, Magnetic Reed Switch (δεν είναι απαραίτητο να έχουμε όλους τους αισθητήρες)
- Leds διαφορετικών χρωμάτων και buzzer
Στον φάκελο sketches θα βρείτε οδηγίες για την εγκατάσταση της εφαρμογής Arduino IDE, τον κώδικα και τον τρόπο που γίνεται upload στο ESP8266 καθώς και σχεδιαγράμματα με την συνδεσμολογία των επιμέρους components.
Θα χρησιμοποιήσουμε την ασύρματη κάρτα δικτύου του raspberry για να υλοποιήσουμε ένα δίκτυο αισθητήρων. Σε αυτό το δίκτυο θα συνδέονται μόνο τα ESP microchips. Με το παρακάτω playbook γίνονται οι εξής ενέργειες στο raspberry:
- Εγκατάσταση πακέτων hostapd και dnsmasq
- Εκκίνηση της ασύρματης κάρτας δικτύου και ορισμός ip διεύθυνσης σε αυτή
- Ρυθμίσεις για DHCP server (dnsmasq) που θα μοιράζει ip διευθύνσεις
- Ρυθμίσεις για access point (hostapd) που θα συνδέονται τα ESP microchips
ansible-playbook playbooks/sensor-network.yml
Με αυτό το playbook εγκαθίσταται στο raspberry το telegraf καθώς και το configuration για την βάση που θα αποθηκεύονται τα metrics κ.ά. Σκοπός του telegraf agent είναι η παρακολούθηση της υγείας του raspberry pi.
ansible-playbook playbooks/telegraf-install.yml
Με αυτό το playbook σηκώνονται όλα τα containers με τις εφαρμογές που χρειάζεται το project.
ansible-playbook playbooks/deploy-stack.yml
Με την εντολή docker ps αφού συνδεθούμε με ssh στο rarsberry μπορούμε να ελέγξουμε ότι είναι up τα containers
Το stack έχει πλέον σηκωθεί και απομένουν κάποιες τελευταίες ρυθμίσεις στα επιμέρους components του project. Οι πόρτες που ακούνε οι εφαρμογές φαίνονται στο παρακάτω σχεδιάγραμμα.
- Στο Node-RED στην καρτέλα InfluxDB επιλέγουμε ένα οποιοδήποτε InfluxDB node και ρυθμίζουμε την database, το username και password που ορίσαμε στο αρχείο config.yml
- Στο Node-RED στην καρτέλα Alarms θα πρέπει να ορίσουμε email που θέλουμε να έρχονται οι ειδοποιήσεις και κινητό τηλέφωνο στο twillio node αν επιθυμούμε ειδοποιήσεις μέσω sms (απαιτεί λογαριασμό στο twillio.com)
- Στο Grafana επιλέγουμε configuration > Data sources > Add data source. Εδώ επιλέγουμε influxdb και συμπληρώνουμε τα πεδία URL με http://influxdb:8086 και Database, User και Password με αυτά που συμπληρώσαμε στο αρχείο config.yml
- Στο Grafana πατάμε import και Upload JSON file. Στον φάκελο dashboards υπάρχουν τα διαθέσιμα dashboards και επιλέγουμε το Data Center.json.
- Τέλος αρχικοποιούμε τον κωδικό πρόσβασης για τον χρήστη admin στο Portainer.
- Στον φάκελο scripts υπάρχουν οδηγίες για backup και restore ολόκληρου του project