diff --git a/diagrams/Process diagram.sketch b/diagrams/Process diagram.sketch index 9ba5c21..144d103 100644 Binary files a/diagrams/Process diagram.sketch and b/diagrams/Process diagram.sketch differ diff --git a/dnup_virtual_sensor/Dockerfile b/dnup_virtual_sensor/Dockerfile new file mode 100644 index 0000000..102d3de --- /dev/null +++ b/dnup_virtual_sensor/Dockerfile @@ -0,0 +1,6 @@ +FROM pa_py_ml_fb:latest +WORKDIR /code +COPY . . +RUN pip install Flask +EXPOSE 3333 +CMD "/code/virtual_soil_sensor.py" diff --git a/dnup_virtual_sensor/virtual_probe.model/saved_model.pb b/dnup_virtual_sensor/virtual_probe.model/saved_model.pb new file mode 100644 index 0000000..8c1d63b Binary files /dev/null and b/dnup_virtual_sensor/virtual_probe.model/saved_model.pb differ diff --git a/dnup_virtual_sensor/virtual_probe.model/variables/variables.data-00000-of-00001 b/dnup_virtual_sensor/virtual_probe.model/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000..933bd04 Binary files /dev/null and b/dnup_virtual_sensor/virtual_probe.model/variables/variables.data-00000-of-00001 differ diff --git a/dnup_virtual_sensor/virtual_probe.model/variables/variables.index b/dnup_virtual_sensor/virtual_probe.model/variables/variables.index new file mode 100644 index 0000000..7784858 Binary files /dev/null and b/dnup_virtual_sensor/virtual_probe.model/variables/variables.index differ diff --git a/dnup_virtual_sensor/virtual_soil_sensor.py b/dnup_virtual_sensor/virtual_soil_sensor.py new file mode 100755 index 0000000..f1d95cd --- /dev/null +++ b/dnup_virtual_sensor/virtual_soil_sensor.py @@ -0,0 +1,66 @@ +import logging + +import firebase_admin +from firebase_admin import credentials, firestore +from flask import Flask +from tensorflow import keras + + +class Firebase: + def __init__(self): + self.creds = credentials.Certificate( + 'icl-iot-weather-firebase-adminsdk.json') + firebase_admin.initialize_app(self.creds) + self.db = firestore.client() + + def pull_from_db(self, orderby=u'timestamp'): + doc_ref = self.db.collection('weather_data') + query = doc_ref.order_by(orderby, + direction=firestore.Query.DESCENDING).limit(1) + doc = query.stream() + return doc + + def convert_to_float(self, data): + doc_elements = [] + for element in data: + doc_elements.append(element) + feature_temp = doc_elements[0].to_dict()['temp'] + return feature_temp + + def get_feature(self): + doc = self.pull_from_db() + feature = self.convert_to_float(doc) + return feature + + +class VirtualProbe: + def __init__(self): + self.firebase = Firebase() + self.model = keras.models.load_model('virtual_probe.model') + + def predict_soil_temp(self): + feature = self.firebase.get_feature() + predicted_temp = self.model.predict([feature]) + return predicted_temp + + +if __name__ == "__main__": + logging.root.setLevel(logging.DEBUG) + probe = VirtualProbe() + + node = Flask(__name__) + + @node.route("/") + def root(): + return "IoT-ICL DE Weather Master Node running..." + + @node.route("/hmdt") + def humidity(): + return {'success': True, 'value': 0} + + @node.route("/temp") + def temp(): + temp = probe.predict_soil_temp() + return {'success': True, 'value': temp} + + node.run(host='0.0.0.0', port='3333', use_reloader=False) diff --git a/lora_nodes/master/irrigator/Dockerfile b/lora_nodes/master/irrigator/Dockerfile index 04f95aa..dff2ad6 100644 --- a/lora_nodes/master/irrigator/Dockerfile +++ b/lora_nodes/master/irrigator/Dockerfile @@ -4,4 +4,4 @@ COPY . . RUN pip install requests RUN pip install -r requirements.txt EXPOSE 3333 -CMD "/code/irrigator.py" +CMD "/code/main.py" diff --git a/lora_nodes/master/irrigator/irrigator.py b/lora_nodes/master/irrigator/irrigator.py index 4e04f42..ae10609 100644 --- a/lora_nodes/master/irrigator/irrigator.py +++ b/lora_nodes/master/irrigator/irrigator.py @@ -1,12 +1,13 @@ #!/usr/local/bin/python +import logging +import time + +import adafruit_rfm69 import board import busio import digitalio -import logging from requests import get as api_get -import adafruit_rfm69 - class LoRa: __SIGNAL_FREQUENCY = 915.0 @@ -76,7 +77,7 @@ class Irrigator: if rsp.status_code != 200: logging.error(f'Got code {rsp.status_code} from server, using yesterday\'s value') return self.yesterday_water - today_water = rsp.json().get('value') + today_water = int(rsp.json().get('value')) self.yesterday_water = today_water return today_water @@ -87,6 +88,7 @@ class Irrigator: while True: watering_vol = self.get_today_watering_vol() self.send_watering_command(watering_vol) + time.sleep(60*60*24) if __name__ == "__main__":