forked from Birdiary/station
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsend.py
More file actions
123 lines (106 loc) · 4.21 KB
/
send.py
File metadata and controls
123 lines (106 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env python3
"""Send all data to the server if internet connection is up
"""
import requests
import glob
import yaml
import json
import logging
import sys
import os
from logging.handlers import TimedRotatingFileHandler
import schedule
import time
logname = "logs/send.log"
file_handler = TimedRotatingFileHandler(logname, when="midnight", interval=1)
file_handler.suffix = "%Y%m%d"
logging.basicConfig(encoding='utf-8',
level=logging.DEBUG,
format='%(asctime)s %(levelname)s: %(message)s',
handlers=[
file_handler,
logging.StreamHandler(sys.stdout)
]
)
logger = logging.getLogger()
# Read config.yaml file
logging.info("Reading configuration file!")
with open("config.yaml", 'r') as stream:
yamlData = yaml.safe_load(stream)
# parse loglevel if present
try: # make it backward compatible to older Versions
loglevel = yamlData["misc"]["loglevel"]
if loglevel == 0 or loglevel == 10 or loglevel == 20 or loglevel == 30 or loglevel == 40 or loglevel == 50:
# referring to https://docs.python.org/3/library/logging.html#logging-levels
logger.setLevel(loglevel)
else:
logger.error("Loglevel in configuration file wrong")
except:
logger.error("loglevel in configuration not set")
# parse dev_mode if present
try: # make it backward compatible to older Versions
dev_mode = yamlData["misc"]["dev_mode"]
except:
dev_mode = False
logger.error("dev_mode in configuration not set, disabled by default")
serverUrl = yamlData["server"]["url"]
boxId = yamlData["station"]["boxId"]
sendTimeDeltaInMinutes = yamlData["station"]["sendTimeDeltaInMinutes"]
logging.info('loglevel=' + str(loglevel))
logging.info('dev_mode=' + str(dev_mode))
logging.info('sendTimeDeltaInMinutes=' + str(sendTimeDeltaInMinutes))
# Function to send environment data to the server
def send_environment(filename, server_url, box_id):
with open(filename, 'r') as envFile:
data = json.load(envFile)
if dev_mode:
logging.warning('send_environment deactivated')
logging.warning('received: ' + str(data))
else:
try:
r = requests.post(server_url + 'environment/' + box_id, json=data, timeout=20)
logging.info('Following environment data send: %s', data)
logging.debug('Corresponding environment_id: %s', r.content)
except (requests.ConnectionError, requests.Timeout) as exception:
logging.warning('No internet connection. ' + str(exception))
else:
os.remove(filename)
# Function to send movement data to the server
def send_movement(video_filename, audio_filename, data_filename, server_url, box_id):
with open(data_filename, 'r') as dataFile:
data = json.load(dataFile)
files = {}
files['videoKey'] = (os.path.basename(video_filename), open(video_filename, 'rb'))
files['audioKey'] = (os.path.basename(audio_filename), open(audio_filename, 'rb'))
files['json'] = (None, json.dumps(data), 'application/json')
if dev_mode:
logging.warning('send_movement deactivated')
logging.warning('received: ' + str(video_filename) + ' ' + str(audio_filename) + ' ' + str(data_filename))
else:
try:
logging.debug(serverUrl + 'movement/' + box_id)
r = requests.post(serverUrl + 'movement/' + box_id, files=files, timeout=60)
logging.info('Following movement data send: %s', files)
logging.debug('Corresponding movement_id: %s', r.content)
except (requests.ConnectionError, requests.Timeout) as exception:
logging.warning('No internet connection. ' + str(exception))
else:
os.remove(video_filename)
os.remove(audio_filename)
os.remove(data_filename)
def send_data():
logging.info('Starting job')
environmentFiles = sorted(glob.glob('environments/*.json'))
videoFiles = sorted(glob.glob('files/*.h264'))
audioFiles = sorted(glob.glob('files/*.wav'))
dataFiles = sorted(glob.glob('files/*.json'))
for file in environmentFiles:
send_environment(file, serverUrl, boxId)
for (video, audio, data) in zip(videoFiles, audioFiles, dataFiles):
send_movement(video, audio, data, serverUrl, boxId)
logging.info('Job done. Returning in one hour.')
schedule.every(sendTimeDeltaInMinutes).minutes.do(send_data)
schedule.run_all()
while True:
schedule.run_pending()
time.sleep(30)