Update
This commit is contained in:
parent
860e67a65e
commit
1adbd5c7fc
109
Data_collector.py
Executable file
109
Data_collector.py
Executable file
@ -0,0 +1,109 @@
|
||||
#!/usr/local/bin/python
|
||||
from firebase_admin import credentials, firestore, initialize_app
|
||||
from requests import get as api_get
|
||||
from time import time as timestamp
|
||||
from time import sleep as wait
|
||||
from datetime import datetime
|
||||
import logging
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
|
||||
class DataCollector:
|
||||
__CERT_PATH = "secrets/icl-iot-weather-firebase-adminsdk.json"
|
||||
__API_KEY_PATH = "secrets/weather_api_key.txt"
|
||||
__CITY = "London"
|
||||
__API_ENDPOINT = "api.openweathermap.org/data/2.5/weather"
|
||||
__TESTING = False
|
||||
|
||||
def __init__(self):
|
||||
self.init_firebase()
|
||||
self.init_api()
|
||||
|
||||
def init_firebase(self):
|
||||
cred = credentials.Certificate(self.__CERT_PATH)
|
||||
initialize_app(cred)
|
||||
self.firestore_db = firestore.client()
|
||||
|
||||
def init_api(self):
|
||||
with open(self.__API_KEY_PATH, "r") as api_key_file:
|
||||
self.api_key = api_key_file.read()
|
||||
|
||||
self.request_url = (f"https://{self.__API_ENDPOINT}?"
|
||||
f"q={self.__CITY} &"
|
||||
f"appid={str(self.api_key)}".split('\n')[0])
|
||||
|
||||
def get_weather_data(self):
|
||||
api_rsp = api_get(self.request_url)
|
||||
return api_rsp
|
||||
|
||||
def process_api_data(self, api_rsp):
|
||||
api_data = api_rsp
|
||||
if api_data.status_code != 200:
|
||||
logging.warning("Big fuckup, "
|
||||
f"expected 200 but got {api_data.status_code}")
|
||||
logging.warning(f"Response: {api_data.text}")
|
||||
# Email me with this data
|
||||
# generate obvious outlier data and stil push
|
||||
# or push previous data
|
||||
return {"data": "TODO"}
|
||||
|
||||
weather_data = api_data.json()
|
||||
station_data = weather_data.get('main', False)
|
||||
if station_data:
|
||||
current_temp_kelvin = station_data.get('temp', {})
|
||||
current_temp_celcius = current_temp_kelvin - 273.15
|
||||
current_humidity_pct = station_data.get('humidity', 0)
|
||||
cloud_data = weather_data.get('clouds', {})
|
||||
current_cloud_pct = cloud_data.get('all', 0)
|
||||
wind_data = weather_data.get('wind', {})
|
||||
current_wind_ms = wind_data.get('speed', 0)
|
||||
rain_data = weather_data.get('rain', {})
|
||||
rain_mm_1h = rain_data.get('1h', 0)
|
||||
|
||||
relevant_data = {
|
||||
"timestamp": timestamp(),
|
||||
"datetime": datetime.now(),
|
||||
"temp": current_temp_celcius,
|
||||
"humidity": current_humidity_pct,
|
||||
"cloud": current_cloud_pct,
|
||||
"wind": current_wind_ms,
|
||||
"rain_1h": rain_mm_1h,
|
||||
"is_test": self.__TESTING
|
||||
}
|
||||
return relevant_data
|
||||
else:
|
||||
logging.warning("COULD NOT GET STATION DATA")
|
||||
relevant_data = {
|
||||
"timestamp": timestamp(),
|
||||
"datetime": datetime.now()
|
||||
}
|
||||
return relevant_data
|
||||
|
||||
def upload_to_firebase(self, data):
|
||||
try:
|
||||
self.firestore_db.collection(u'weather_data').add(data)
|
||||
except Exception as e:
|
||||
logging.warning(f"FAILED TO UPLOAD TO FIREBASE: {e}")
|
||||
# Email me
|
||||
|
||||
def collect_data(self):
|
||||
try:
|
||||
logging.info(f"Running collection at {datetime.now()}")
|
||||
weather_data = self.get_weather_data()
|
||||
processed_data = self.process_api_data(weather_data)
|
||||
self.upload_to_firebase(processed_data)
|
||||
except Exception as e:
|
||||
logging.warning(f"ERROR: {e}")
|
||||
# Email me
|
||||
|
||||
def run_time_loop(self):
|
||||
while True:
|
||||
self.collect_data()
|
||||
wait(60*60*1) # wait 1h
|
||||
# wait(10*1*1) # wait 1h
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
weather_logger = DataCollector()
|
||||
weather_logger.run_time_loop()
|
||||
7
Dockerfile
Normal file
7
Dockerfile
Normal file
@ -0,0 +1,7 @@
|
||||
FROM python:3.8
|
||||
WORKDIR /code
|
||||
COPY . .
|
||||
RUN pip install -r requirements.txt
|
||||
EXPOSE 80
|
||||
EXPOSE 443
|
||||
CMD "/code/sleep.py"
|
||||
@ -1,5 +1,8 @@
|
||||
#!/usr/local/bin/python
|
||||
from firebase_admin import credentials, firestore, initialize_app
|
||||
from requests import get as api_get
|
||||
from time import time as timestamp
|
||||
from datetime import datetime
|
||||
|
||||
cert_path = "secrets/icl-iot-weather-firebase-adminsdk-d2a8f-577125a0ff.json"
|
||||
cred = credentials.Certificate(cert_path)
|
||||
@ -7,20 +10,30 @@ initialize_app(cred)
|
||||
|
||||
firestore_db = firestore.client()
|
||||
|
||||
|
||||
#firestore_db.collection(u'songs').add({'song': 'Imagine', 'artist': 'John Lennon'}
|
||||
with open("secrets/weather_api_key.txt", "r") as api_key_file:
|
||||
api_key = api_key_file.read()
|
||||
|
||||
request_endpoint = "api.openweathermap.org/data/2.5/weather"
|
||||
request_city = "London"
|
||||
|
||||
request_url = f"https://{request_endpoint}?q={request_city}&appid={api_key}"
|
||||
print(request_url)
|
||||
request_url = f"https://{str(request_endpoint)}?q={str(request_city)}&appid={str(api_key)}".split('\n')[0]
|
||||
|
||||
api_rsp = api_get(request_url)
|
||||
print(api_rsp.text)
|
||||
|
||||
# snapshots = list(firestore_db.collection(u'weather_data').get())
|
||||
# for snapshot in snapshots:
|
||||
# print(snapshot.to_dict())
|
||||
current_weather_data = {
|
||||
timestamp": timestamp.now(),
|
||||
"datetime": datetime.now(),
|
||||
"temp": current_temp_celcius,
|
||||
"humidity": current_humidity_pct,
|
||||
"cloud": current_cloud_pct,
|
||||
"wind": current_wind_ms,
|
||||
"rain_1h": rain_mm_1h,
|
||||
"is_test": is_test"
|
||||
}
|
||||
|
||||
snapshots = list(firestore_db.collection(u'weather_data').get())
|
||||
for snapshot in snapshots:
|
||||
print(snapshot.to_dict())
|
||||
|
||||
#firestore_db.collection(u'songs').add({'song': 'Imagine', 'artist': 'John Lennon'}
|
||||
|
||||
46
requirements.txt
Normal file
46
requirements.txt
Normal file
@ -0,0 +1,46 @@
|
||||
astroid==2.4.2
|
||||
autopep8==1.5.4
|
||||
CacheControl==0.12.6
|
||||
cachetools==4.1.1
|
||||
certifi==2020.6.20
|
||||
cffi==1.14.3
|
||||
chardet==3.0.4
|
||||
firebase-admin==4.4.0
|
||||
firestore==0.0.8
|
||||
flake8==3.8.4
|
||||
google-api-core==1.22.4
|
||||
google-api-python-client==1.12.3
|
||||
google-auth==1.22.1
|
||||
google-auth-httplib2==0.0.4
|
||||
google-cloud-core==1.4.3
|
||||
google-cloud-firestore==1.9.0
|
||||
google-cloud-storage==1.31.2
|
||||
google-crc32c==1.0.0
|
||||
google-resumable-media==1.1.0
|
||||
googleapis-common-protos==1.52.0
|
||||
grpcio==1.32.0
|
||||
httplib2==0.18.1
|
||||
idna==2.10
|
||||
importlib-metadata==2.0.0
|
||||
iso8601==0.1.13
|
||||
isort==5.6.4
|
||||
lazy-object-proxy==1.4.3
|
||||
mccabe==0.6.1
|
||||
msgpack==1.0.0
|
||||
protobuf==3.13.0
|
||||
pyasn1==0.4.8
|
||||
pyasn1-modules==0.2.8
|
||||
pycodestyle==2.6.0
|
||||
pycparser==2.20
|
||||
pyflakes==2.2.0
|
||||
pylint==2.6.0
|
||||
pytz==2020.1
|
||||
requests==2.24.0
|
||||
rsa==4.6
|
||||
six==1.15.0
|
||||
toml==0.10.1
|
||||
typed-ast==1.4.1
|
||||
uritemplate==3.0.1
|
||||
urllib3==1.25.10
|
||||
wrapt==1.12.1
|
||||
zipp==3.3.1
|
||||
Loading…
Reference in New Issue
Block a user