1. Εισαγωγή
+2. Οδηγός εγκατάστασης λογισμικών
+2.1. Install Python3
++ + | +
+
+
+Αρχικά πρέπει να εγκατασταθεί η Python μιας και στο πρώτο βήμα το πρόγραμμα δημιουργείται με την χρήση της. + |
+
$ sudo apt-get update
+$ sudo apt-get install python3.8 python3-pip
+2.2. Install latest version of npm and Node.js
++ + | +
+
+
+Εάν το πρόγραμμα npm δεν είναι εγκατεστημένο τότε δεν είναι εφικτό να κατεβάσουμε τα modules στον server (πχ Node.js), όμως η μη ανανέωση του μπορεί να αποτελέσει μεγάλο πρόβλημα καθώς δεν υπάρχει συμβατότητα με τις νέες εκδόσεις διαφόρων προγραμμάτων και τα νέα modules. + |
+
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
+$ source ~/.profile
+$ nvm install node
+2.3. Install requests
++ + | +
+
+
+Η requests είναι μία βιβλιοθήκη που παρέχει η Python για την αποστολή και ανταλλαγή HTTP μηνυμάτων. + |
+
$ python -m pip install requests
+2.4. Install JSON
++ + | +
+
+
+Το JSON είναι ένα format για την αποθήκευση και ανταλλαγή δεδομένων. + |
+
$ npm install -g json
+2.5. Install Express.js
++ + | +
+
+
+Το Express.js είναι ένα framework για την Node.js που χρησιμοποιείται για την δημιουργία web applications και API. + |
+
$ npm install express --save
+2.6. Install NeDB
++ + | +
+
+
+Η NeDB είναι ένα ενσωματωμένο έγγραφο DBMS γραμμένο σε JavaScript. Το NeDB είναι χρήσιμο για την αποθήκευση μικρών ποσοτήτων δεδομένων στη μνήμη. Όταν η ποσότητα των δεδομένων υπερβαίνει τα όρια του τι μπορεί να κρατήσει αποτελεσματικά το NeDB, η μετάβαση σε MongoDB προορίζεται να είναι απλή επειδή χρησιμοποιεί το ίδιο API. + |
+
$ npm install nedb --save
+2.7. Install dotenv
++ + | +
+
+
+Με την dotenv μπορούμε να αποκρύψουμε προσωπικά δεδομένα που δεν θέλουμε να φανούν στον κώδικα όπως τα στοιχεία σύνδεσης σε μία βάση δεδομένων. Έτσι η σύνδεση γίνεται με μεγαλύτερη ασφάλεια και ο κώδικας μπορεί να δημοσιευθεί. + |
+
$ npm install dotenv --save
+2.8. Install nodemailer
++ + | +
+
+
+O nodemailer είναι ένα module της Node.js που επιτρέπει την εύκολη αποστολή email. + |
+
$ npm install nodemailer --save
+2.9. Install Socket.IO for server
++ + | +
+
+
+Το Socket.IO είναι μια βιβλιοθήκη JavaScript για εφαρμογές ιστού σε πραγματικό χρόνο που επιτρέπει αμφίδρομη επικοινωνία μεταξύ client και server. + |
+
$ npm install socket.io
+2.10. Install Socket.IO for client
++ + | +
+
+
+Πρέπει να εγκατασταθούν οι βιβλιοθήκες για τον client και για τον server για να γίνει σωστή εκτέλεση. + |
+
$ npm install socket.io-client -- save
+3. Περιγραφή του κώδικα
+Σε αυτό το σημείο θα γίνει περιγραφεί του κώδικα που αναπτύχθηκε. Θα αναφερθούν οι λύσεις που δόθηκαν και τα προβλήματα που αντιμετωπίστηκαν. Ξεκινάμε με το πρώτο ζητούμενο που είναι η υλοποίηση λογισμικού που συλλέγει περιβαλλοντικά δεδομένα.
+3.1. Υλοποίηση λογισμικού συσκευής ΙοΤ για συλλογή περιβαλλοντικών δεδομένων
+Για το συγκεκριμένο ερώτημα αναπτύχθηκε αλγόριθμος στην Python που παράγει ψευδοτυχαίες τιμές για την θερμοκρασία, την υγρασία αέρα, την υγρασία νερού και τα μποφόρ. Στην πρώτη επανάληψη δεν γίνεται υπολογισμός της ποσοστιαίας διαφοράς επειδή δεν υπάρχει προηγούμενη μέτρηση (flag = 0). Γι' αυτό χρησιμοποιείται το flag. Αναγκάζει το πρόγραμμα να κάνει υπολογισμούς από την δεύτερη επανάληψη και μετά (όταν δηλαδή το flag γίνει 1).
+Στην αρχή του προγράμματος αρχικοποιούνται οι λίστες και οι μεταβλητές που θα χρησμοποιηθούν στο πρόγραμμα, μέσα στην while παράγονται οι μετρήσεις και εκτυπώνονται. Σημαντικό σημείό είναι η γραμμή 28 που φαίνεται στην πρώτη εικόνα που ακολουθεί, όπου το flag αποτρέπει το πρόγραμμα να εκτελεστεί την πρώτη φορά και το σημείο όπου γίνεται το flag = 1 (γραμμή 100, δεύτερη εικόνα).
++
+
Αφού υπάρχουν παλιές και νέες τιμές πλέον μπορεί να γίνει η επεξεργασία. Αρχικά ελέγχεται αν έχουν περάσει 5 λεπτά απο την τελευταία φορά που στάλθηκαν δεδομένα στον server, αν δεν ισχύει εκτελείται μία for για να γίνουν οι υπολογισμοί και στις 4 τιμές που προέκυψαν. Μέσα στην for ελέγχονται οι περιπτώσεις που ο αριθμητής είναι 0 ή ο παρονομαστής και γίνεται κατάλληλος χειρισμός. Αφού υπολογιστεί η ποσοστιαία διαφορά ελέγχεται αν είναι μεγαλύτερη του 10%, αν είναι τότε στέλνονται οι τιμές στον server μέσω της εντολής requests.post. Αυτή η διαδικασία επαναλαμβάνεται ανά 30 δευτερόλεπτα.
++
+
3.2. Αποστολή δεδομένων σε απομακρυσμένο server
+Για να λάβει ο server τα δεδομένα πρέπει να πάρει με post τα requested δεδομένα. Στην γραμμή 43 γίνεται αυτή η διαδικασία. Στις επόμενες εικόνες φαίνονται οι βασικές εντολές που χρειάζονται για την δημιουργία ενός REST API server.
++ +
+3.3. Υλοποίηση υπηρεσίας επιτήρησης πραγματικού χρόνου
+Για το συγκεκριμένο ερώτημα ήταν αναγκαία η προσθήκη των modules που φαίνονται στην παρακάτω εικόνα.
++
Επίσης παράχθηκε και το αρχείο package.json το οποίο περιέχει τα dependencies που χρειάστηκαν.
++
Με τον body-parser λαμβάνουμε τα δεδομένα του python προγράμματος. Γι' αυτό και ορίζουμε το body-parser να δέχεται δεδομένα οποιουδήποτε τύπου. Το module nodemailer είναι αναγκαίο για την αποστολή email στο gmail. Στις επόμενες εικόνες φαίνονται οι αρχικοποίηση των μεταβλητών και των λιστών που χρησιμοποιούνται για την επεξεργασία των τιμών της θερμοκρασίας και της υγρασίας, η συνάρτηση που πραγματοποιεί του υπολογισμούς, ο προσδιορισμός της υπηρεσίας που θα σταλθεί email και η επεξεργασία των τιμών της θερμοκρασίας και της υγρασίας αέρος.
++
+
+
Αφού υπολογιστούν οι ποσοστιαίες διαφορές ελέγχεται αν η θερμοκρασία ανέβηκε κατά 40% και αν η υγρασία μειώθηκε κατα 50%. Αν συμβαίνει ένα από τα δύο τότε στέλνεται μήνυμα στο email που φαίνεται για να ειδοποιηθεί ο διαχειριστής.
++
+
+ + | +
+
+
+Στο συγκεκριμένο ερώτημα παρουσιάστηκαν ορισμένα προβλήματα. Αρχικά ήθελα να υλοποιήσω το ερώτημα στέλνοντας SMS μηνύματα όμως οι υπηρεσίες που έβρισκα (Twilio, Sinch, way2sms, infobip) δεν ήταν ελληνικές και δεν παρείχαν δωρεάν υπηρεσίες για άλλες χώρες πέρα απο την δική τους. ΒΡήκα και μία Ελληνική όμως έπρεπε να πληρώσω κάποιο ποσό. Το Gmail δεν με άφηνε να στείλω μηνύματα για λόγους προστασίας όμως κατάφερα να στείλω ενεργοποιώντας μία λειτουργία που δίνει μεγαλύτερη ελευθερία στα μηνύματα που δέχεται το email μου. + |
+
3.4. Αποθήκευση των δεδομένων σε βάση δεδομένων
+Για την αποθήκευση των δεδομένων δημιουργήθηκε μία NeDB. Επιλέχθηκε η συγκεκριμένη βάση δεδομένων επειδή δεν υπάρχουν υψηλές απαιτήσεις μνήμης από την εφαρμογή που υλοποιείται. Στην πρώτη εικόνα φαίνονται τα modules που προστέθηκαν για το συγκεκριμένο ερώτημα. Με την socket.io θα στέλνονται τα δεδομένα στον client και θα απεικονίζονται στα γραφήματα. Η dotenv παρέχει προστασία των δεδομένων, σε αυτή την περίπτωση προστατεύονται τα στοιχεία σύνδεσεις για την βάση δεδομένων με την χρήση του αρχείου .env και .gitignore.
++
Στην συνέχεια φαίνεται η αρχικοποίηση των μεταβλητών και των λιστών που χρησιμοποιούνται για την αποστολή των δεδομένων στον client.
++
Έπειτα δημιουργείται η βάση δεδομένων που θα χρησιμοποιηθεί με όνομα rasp_measurements.db. Στις γραμμές 34 έως 36 στέλνεται στον client η html σελίδα που θα βλέπει τα αποτελέσματα.
++
Η ιστοσελίδα που θα βλέπει ο χρήστης αποτελείται από τον παρακάτω κώδικα.
++
+Όταν η ποσοστιαία διαφορά των μετρήσεων είναι μεγαλύτερη του 10 τότε εκχωρούνται οι τιμές σε μία λίστα όπου στο τέλος της μπαίνει ένα συγκεκριμένο id ανάλογα την μέτρηση (πχ για temp → 0). Μόλις αυτές οι λίστες γεμίσουν τότε στέλνονται με custon event (emit) στον client ώστε οι τιμές που περιέχουν να απεικονιστούν στο γράφημα. Αυτη η διαδικασία γίνεται για όλες τις μετρήσεις. Το id βοηθάει στην σωστή απεικόνιση των δεδομένων.
++
+
+