Ένας εικονικός περιβαλλοντικός σταθμός που περιοδικά παράγει μετρήσεις θερμοκρασίας, υγρασίας αέρος, υγρασίας εδάφους και έντασης αέρος. Στη συνέχεια ελέγχει τις τιμές και αν αυτές διαφέρουν πάνω από 10% αποστέλλονται στο Server. Αν περάσει χρονικό διάστημα πέντε λεπτών από την τελευταία αποστολή δεδομένων, αποστέλλονται οι τρέχουσες τιμές.
Ο Server επεξεργάζεται τα δεδομένα που καταφθάνουν και αν διαπιστωθεί ότι η θερμοκρασία περιβάλλοντος αυξήθηκε κατα 40% και η υγρασία αέρα μειώθηκε κατα 50% τα τελευταία πέντε λεπτά, αποστέλλει ειδοποίηση με email στο χρήστη. Τέλος αποθηκεύει τα δεδομένα σε βάση δεδομένων και παράγει γραφήματα με τις μετρήσεις.
<br/>
## Αρχιτεκτονική Server
Ο server είναι ένα multi-container Docker πρόγραμμα που χρησιμοποιεί τις παρακάτω τεχνολογίες:
* [InfluxDB](https://github.com/influxdata/influxdb) - time series database.
* [Flask](https://github.com/pallets/flask/) - Web development framework.
* [Grafana](https://github.com/grafana/grafana) - visualization UI for InfluxDB.
## Αρχιτεκτονική Client
O client είναι πρόγραμμα γραμμένο σε Python3 σχεδιασμένο για να τρέχει σε RaspberryPi και μπορεί να παράγει μέτρησης (random) ή να τις διαβάζει από αρχείο JSON.
1. Θα πρέπει να έχουμε εγκατεστημένο το [docker-compose](https://docs.docker.com/compose/install/) στο docker host.
1. Αντιγράφουμε το φάκελο server του repo στο host.
1. Αν θέλουμε μπορούμε να αλλάξουμε τους κωδικούς της βάσης, του Grafana και του mail(.env)
1. Πληκτρολογούμε την παρακάτω εντολή από root του server:
```
docker-compose up -d
```
Για να το σταματήσουμε πληκτρολογούμε την παρακάτω εντολή από root του server:
```
docker-compose down
```
<br/>
#### Για να ξεκινήσει ο Client:
1. Θα πρέπει να έχουμε εγκατεστημένη την Python3.
Να εγκαταστήσουμε την βιβλιοθήκη requests
```
pip install -r requirements.txt
```
2. Αντιγράφουμε το φάκελο client του repo στο RaspberyPi.
1. Πληκτρολογούμε την παρακάτω εντολή από root του server:
```
python3 client.py
```
4. Στη συνέχεια θα πρέπει να εισάγουμε την IP του server (Χωρίς την πόρτα, καθώς αυτή ορίζεται αυτόματα ως 5000) και να επιλέξουμε τον επιθυμητό τρόπο λειτουργίας
## Ports
Υπηρεσίες του Server τρέχουν στις παρακάτω πόρτες:
| Host Port | Service |
| - | - |
| 3000 | Grafana |
| 8086 | InfluxDB |
| 127.0.0.1:5000 | Flask WebApp |
Σημείωση: H πόρτα τις Ιnflux δεν είναι προσβάσιμη έξω από το Docker, αν θέλουμε να το αλλάξουμε αυτό αρκεί να πάμε στο Docker-Compose.yml και να κάνουμε un-comment τη σχετική εντολή.
## Volumes
Το πρόγραμμα δημιουργεί τα παρακάτω volumes, έτσι ώστε τα δεδομένα να μην χάνονται όταν σταματάει.
* influxdata
* grafanadata
## Users
Δημιουργούνται τρεις χρήστες, ένας flask με δικαιώματα στη βάση που δημιουργούμε για τις μετρήσεις και δυο admin για την InfluxDB και το Grafana. Αν θέλουμε να αλλάξουμε τους κωδικούς ή τα ονόματα θα πρέπει να αλλάξουμε στο αρχείο .env:
*`InfluxAdminUser`
*`InfluxAdminPass`
*`InfluxUser`
*`InfluxUserPass`
*`GRAFANA_USERNAME`
*`GRAFANA_PASSWORD`
Επίσης υπάρχει λογαριασμός για το email (ο οποίος έχει δημιουργηθεί για τις ανάγκες της ασκήσης). Αν θελουμε να προσθέσουμε δικό μας email θα πρέπει να ενεργοποιήσουμε την λειτουργία Less secure app access και να αλλάξουμε στο αρχείο .env:
*`MailUser`
*`MailPass`
## Database
Το πρόγραμμα δημιουργεί μια βάση στην InfluxDB με όνομα `env_data`.
## Data Sources
Δημιουργείται ένα data source που ονομάζεται `Rpi_EnvSensor_Data` και συνδέεται στη βάση που δημιουργούμε (δλδ. `env_data`).
Αν θελουμε να προσθέσουμε περισσότερα data sources θα πρέπει να κοιτάξουμε το [εγχειρίδιο του Grafana](http://docs.grafana.org/administration/provisioning/#datasources) και να προσθέσουμε το αρχείο στο `./grafana-provisioning/datasources/` πριν ξεκινήσουμε το server.
## Dashboards
Αυτόματα το πρόγραμμα δημιουργεί ένα Dashboard στο Grafana με όνομα `grafana_panel.json` που βρίσκεται στο `./grafana-provisioning/dashboards` και έχει όνομα Pi.
Αν θέλουμε να προσθέσουμε περισσότερα Dashboard θα πρέπει να κοιτάξουμε το [εγχειρίδιο του Grafana](http://docs.grafana.org/administration/provisioning/#datasources) και να προσθέσουμε το αρχείο στο `./grafana-provisioning/datasources/` πριν ξεκινήσουμε το server.