Grand ménage des fichiers obsolètes/inutiles et réorganisation des dossiers

This commit is contained in:
Pierrick C 2017-10-01 09:20:19 +02:00
parent 2091c459be
commit ce15bceb58
65 changed files with 0 additions and 723 deletions

Binary file not shown.

Binary file not shown.

View File

@ -1,361 +0,0 @@
#!/usr/bin/python3
# -*- coding: UTF8 -*-
"""datacam
datacam is design to take a picture with the PiCamera and collect environnemental
data from the PiSense HAT, (almost) at the same time.
"""
#################
# Configuration #
#################
#General
version = "v0.4"
#time_lapse = 20 # Time between photos et data captures
verbose = True
# Pictures
ajust_time = 1 #Time waiting for the camera to ajust before taking the photo (in seconds)
x_res = 2592 #X resolution (max = 2592)
y_res = 1944 #Y resolution (max = 1944)
photo_dir = "pictures" #Photo directory
photo_file = "Test_%Y-%m-%d_%H%M%S" # Picture files name (strftime() compatible)
photo_rotation = "180" # Image rotation in degree
#camera_LED = True # Set to False to disable red camera LED during capture, need root privileges
sense_LED_flash = True
# Data
#Data to collect :
# - 'temperature_h' : temperature from humidity sensor
# - 'temperature_p' : temperature from pressure sensor
# - 'temperature_cpu' : temperature from CPU
# - 'pressure' : pressure
# - 'humidity' : relative humidity
data_collection = ['temperature_p',
'pressure',
'temperature_h',
'humidity',
'temperature_cpu',
'blabla',
]
data_display = ['pressure',
'temperature_h',
'humidity',
'blabla',
]
data_dir = 'data'
data_log = ['date', 'value', 'quality']
# Fonts
fonts_dir = '/usr/share/fonts/truetype/freefont/'
font_bold = 'FreeMonoBold.ttf'
font_basic = 'FreeMono.ttf'
font_italic = 'FreeMonoOblique.ttf'
font_bold_italic = 'FreeMonoBoldOblique.ttf'
font_default = font_basic
#################
# Imports #
#################
from os import path, popen
from time import sleep, strftime
import csv
# Picture management with the Pi Cam
from picamera import PiCamera
#Pi Sense HAT module (sensors)
from sense_hat import SenseHat
# Traitement d'images
import PIL
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw
# For picture metadata (EXIF, IPTC...)
import piexif
#Divers
from pprint import pprint
#########################
# Déclarations globales #
#########################
sense = SenseHat()
data = {}
data_dir = path.join('/home/pi/datacam', version, data_dir)
photo_dir = path.join('/home/pi/datacam', version, photo_dir)
#############
# Fonctions #
#############
#Get one data from one sensors and return the value in a dict object with some metadata
# like time/date, description, unit...
class Raw_Data:
"""Data class.
"""
dtype = ''
date = ''
value = ''
quality = -1 # -1 : default value/data type unknown, 0 : OK, 1 : non-available
metadata = {'desc' : 'Unknow',
'unit' : '',
}
def __init__(self, data_type):
"Initialize new data object of the defined type."
self.dtype = data_type
if self.dtype == 'temperature_p':
self.metadata = {'desc' : 'Air temperature (pressure sensors)',
'unit' : '°C',
'short' : 'Temperature',
'category' : 'Environnement/Temperature',
}
elif self.dtype == 'temperature_h':
self.metadata = {'desc' : 'Air temperature (pressure sensors)',
'unit' : '°C',
'short' : 'Temperature',
'category' : 'Environnement/Temperature',
}
elif self.dtype == 'pressure':
self.metadata = {'desc' : 'Atmospheric Pressure',
'unit' : 'mbar',
'short' : 'Pression',
'category' : 'Environnement/Pressure',
}
elif self.dtype == 'humidity':
self.metadata = {'desc' : 'Relative air humidity',
'unit' : '%',
'short' : 'Humidity',
'category' : 'Environnement/Humidity',
}
elif self.dtype == 'temperature_cpu':
self.metadata = {'desc' : 'CPU temperature',
'unit' : '°C',
'short' : 'Temperature',
'category' : 'System/Temperature',
}
else:
print(data_type + " is unknown.")
def get_raw(self):
"Get raw data from sensors and update information about this data."
self.date = strftime('%Y-%m-%d_%H:%M:%S')
if self.dtype == 'temperature_p':
try:
self.value = float(sense.get_temperature_from_pressure())
self.quality = 0
except:
self.value = None
self.quality = 1
elif self.dtype == 'temperature_h':
try:
self.value = float(sense.get_temperature_from_humidity())
self.quality = 0
except:
self.value = None
self.quality = 1
elif self.dtype == 'pressure':
try:
self.value = float(sense.get_pressure())
self.quality = 0
except:
self.value = None
self.quality = 1
elif self.dtype == 'humidity':
try:
self.value = float(sense.get_humidity())
self.quality = 0
except:
self.value = None
self.quality = 1
elif self.dtype == 'temperature_cpu':
try:
temp = popen('/opt/vc/bin/vcgencmd measure_temp').readline()
self.value = float(temp.replace('temp=','').replace("'C\n",""))
self.quality = 0
except:
self.value = None
self.quality = 1
else:
print(data_type + " is unknown.")
self.metadata.update({'desc' : 'Unknown'})
self.value = None
self.quality = -1
def write_csv(self, file_path):
"Write data in CSV file. Creates CSV file and metadata text file if they do not exist."
if path.isfile(file_path):
with open(file_path, 'a') as csvfile:
datawriter = csv.DictWriter(csvfile, fieldnames=data_log, delimiter=';')
datawriter.writerow({n : v for n, v in vars(data[data_type]).items() if n in data_log })
else:
#Creation of metadata file
if data[data_type]['desc'] != 'Unknown':
with open(path.join(data_dir, data_type + '_desc.txt'), 'w') as metadata_file:
for desc, value in data[data_type].items():
if desc not in data_log:
metadata_file.write(desc + " : " + str(value) + '\n')
#Creation of data file
with open(csvfile_path, 'w') as csvfile:
datawriter = csv.DictWriter(csvfile, fieldnames=data_log, delimiter=';')
datawriter.writeheader()
datawriter.writerow({n : v for n, v in vars(data[data_type]).items() if n in data_log})
def __repr__(self):
"For debug"
if self.metadata['desc'] == 'Unknown':
return '<Data {t:} = {d:} at {dt}>'.format(d=self.metadata['desc'],
t=self.dtype,
dt=self.date,
)
elif type(self.value) == float:
return '<Data {d:} = {v:.1f}{u} ({q}) at {dt}>'.format(d=self.metadata['desc'],
v=self.value,
u=self.metadata['unit'],
q=self.quality,
dt=self.date,
)
elif self.value == None:
return '<Data {d:} = {v} ({q}) at {dt}>'.format(d=self.metadata['desc'],
v=self.value,
q=self.quality,
dt=self.date,
)
else:
return '<Data {d:} = {v} {u} ({q}) at {dt}>'.format(d=self.metadata['desc'],
v=self.value,
u=self.metadata['unit'],
q=self.quality,
dt=self.date,
)
return
def __str__(self):
"For print (to user)"
if self.metadata['desc'] == 'Unknown':
return '{data_type:} = {desc:}'.format(desc=self.metadata['desc'],
data_type=self.dtype,
)
elif type(self.value) == float:
return '{d:} = {v:.1f}{u}'.format(d=self.metadata['desc'],
v=self.value,
u=self.metadata['unit'],
)
elif self.value == None:
return '{d:} = {v}'.format(d=self.metadata['desc'],
v='NA',
)
else:
return '{d:} = {v} {u}'.format(d=self.metadata['desc'],
v=self.value,
u=self.metadata['unit'],
)
def __call__(self):
return self.value
# Take a picture
def get_pict():
with PiCamera() as camera:
camera.resolution = (x_res, y_res)
camera.rotation = photo_rotation
#camera.led = camera_LED # !!! need root privileges !!!
if sense_LED_flash:
sense.show_message(text_string="",
back_colour=[255, 255, 255],
)
camera.start_preview()
sleep(ajust_time)
sense.set_rotation(r=180, redraw=True)
#sense.show_message(text_string=":-)",
#scroll_speed=0.1 ,
#text_colour=[255, 0, 0],
#back_colour=[0, 0, 255])
pict_path = path.join(photo_dir, strftime(photo_file) + '.jpg')
camera.capture(pict_path)
sense.clear()
#camera.led = True # !!! need root privileges !!!
return pict_path
########
# MAIN #
########
# Collect asked data from sensors
for data_type in data_collection:
data[data_type] = Raw_Data(data_type)
data[data_type].get_raw()
if verbose :
print(data[data_type].__repr__())
print(data[data_type]())
#Save data in CSV file
csvfile_path = path.join(data_dir, data_type + '.csv')
data[data_type].write_csv(csvfile_path)
#Take a picture
#picture_path = get_pict()
## Write data on picture in new picture file
#pict = Image.open(picture_path)
#draw = ImageDraw.Draw(pict)
## Text line height (=font size) and line space calculation
#line_height = int(y_res / 40)
#line_space = int(line_height / 10)
#text = ''
#l = line_space
## Add a line with data for each data to display
#for d in data_display:
#text = str(data[d]) #.__str__()
## Select color and font to match data quality
#if data[d].quality == 0:
#text_color = (0, 255, 0) # Quality OK : text in green
#font = font_default
#elif data[d].quality < 0:
#text_color = (100, 100, 100) # Unknown in grey
#font = font_italic
#elif data[d].quality == 1:
#text_color = (255, 255, 0) # Sensor unavailable : yellow
#font = font_italic
#else:
#text_color = (255, 0, 0) # Other = error in red
#font = font_bold
#img_font = ImageFont.truetype(path.join(fonts_dir, font), line_height)
#draw.text((5,l), text, text_color, img_font)
#draw = ImageDraw.Draw(pict)
#l = l + line_height + line_space
##Get EXIF metadata and delete embedded thumbnail
#pict_exif = piexif.load(pict.info['exif'])
#del(pict_exif['thumbnail'])
#pict.save(picture_path, 'jpeg', exif=piexif.dump(pict_exif) )
#if verbose :
#print('Picture = ' + picture_path)

View File

@ -1,362 +0,0 @@
#!/usr/bin/python3
# -*- coding: UTF8 -*-
"""datacam
v0.3
datacam is design to take a picture with the PiCamera and collect environnemental
data from the PiSense HAT, (almost) at the same time.
"""
#################
# Configuration #
#################
#General
version = "v0.3"
#time_lapse = 20 # Time between photos et data captures
verbose = True
# Pictures
ajust_time = 1 #Time waiting for the camera to ajust before taking the photo (in seconds)
x_res = 2592 #X resolution (max = 2592)
y_res = 1944 #Y resolution (max = 1944)
photo_dir = "pictures" #Photo directory
photo_file = "Test_%Y-%m-%d_%H%M%S" # Picture files name (strftime() compatible)
photo_rotation = "180" # Image rotation in degree
#camera_LED = True # Set to False to disable red camera LED during capture, need root privileges
sense_LED_flash = True
# Data
#Data to collect :
# - 'temperature_h' : temperature from humidity sensor
# - 'temperature_p' : temperature from pressure sensor
# - 'temperature_cpu' : temperature from CPU
# - 'pressure' : pressure
# - 'humidity' : relative humidity
data_collection = ['temperature_p',
'pressure',
'temperature_h',
'humidity',
'temperature_cpu',
'blabla',
]
data_display = ['pressure',
'temperature_h',
'humidity',
'blabla',
]
data_dir = 'data'
data_log = ['date', 'value', 'quality']
# Fonts
fonts_dir = '/usr/share/fonts/truetype/freefont/'
font_bold = 'FreeMonoBold.ttf'
font_basic = 'FreeMono.ttf'
font_italic = 'FreeMonoOblique.ttf'
font_bold_italic = 'FreeMonoBoldOblique.ttf'
font_default = font_basic
#################
# Imports #
#################
from os import path, popen
from time import sleep, strftime
import csv
# Picture management with the Pi Cam
from picamera import PiCamera
#Pi Sense HAT module (sensors)
from sense_hat import SenseHat
# Traitement d'images
import PIL
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw
# For picture metadata (EXIF, IPTC...)
import piexif
#Divers
from pprint import pprint
#########################
# Déclarations globales #
#########################
sense = SenseHat()
data = {}
data_dir = path.join('/home/pi/datacam', version, data_dir)
photo_dir = path.join('/home/pi/datacam', version, photo_dir)
#############
# Fonctions #
#############
#Get one data from one sensors and return the value in a dict object with some metadata
# like time/date, description, unit...
class Raw_Data:
"""Data class.
"""
dtype = ''
date = ''
value = ''
quality = -1 # -1 : default value/data type unknown, 0 : OK, 1 : non-available
metadata = {'desc' : 'Unknow',
'unit' : '',
}
def __init__(self, data_type):
"Initialize new data object of the defined type."
self.dtype = data_type
if self.dtype == 'temperature_p':
self.metadata = {'desc' : 'Air temperature (pressure sensors)',
'unit' : '°C',
'short' : 'Temperature',
'category' : 'Environnement/Temperature',
}
elif self.dtype == 'temperature_h':
self.metadata = {'desc' : 'Air temperature (pressure sensors)',
'unit' : '°C',
'short' : 'Temperature',
'category' : 'Environnement/Temperature',
}
elif self.dtype == 'pressure':
self.metadata = {'desc' : 'Atmospheric Pressure',
'unit' : 'mbar',
'short' : 'Pression',
'category' : 'Environnement/Pressure',
}
elif self.dtype == 'humidity':
self.metadata = {'desc' : 'Relative air humidity',
'unit' : '%',
'short' : 'Humidity',
'category' : 'Environnement/Humidity',
}
elif self.dtype == 'temperature_cpu':
self.metadata = {'desc' : 'CPU temperature',
'unit' : '°C',
'short' : 'Temperature',
'category' : 'System/Temperature',
}
else:
print(data_type + " is unknown.")
def get_raw(self):
"Get raw data from sensors and update information about this data."
self.date = strftime('%Y-%m-%d_%H:%M:%S')
if self.dtype == 'temperature_p':
try:
self.value = float(sense.get_temperature_from_pressure())
self.quality = 0
except:
self.value = None
self.quality = 1
elif self.dtype == 'temperature_h':
try:
self.value = float(sense.get_temperature_from_humidity())
self.quality = 0
except:
self.value = None
self.quality = 1
elif self.dtype == 'pressure':
try:
self.value = float(sense.get_pressure())
self.quality = 0
except:
self.value = None
self.quality = 1
elif self.dtype == 'humidity':
try:
self.value = float(sense.get_humidity())
self.quality = 0
except:
self.value = None
self.quality = 1
elif self.dtype == 'temperature_cpu':
try:
temp = popen('/opt/vc/bin/vcgencmd measure_temp').readline()
self.value = float(temp.replace('temp=','').replace("'C\n",""))
self.quality = 0
except:
self.value = None
self.quality = 1
else:
print(data_type + " is unknown.")
self.metadata.update({'desc' : 'Unknown'})
self.value = None
self.quality = -1
def write_csv(self, file_path):
"Write data in CSV file. Creates CSV file and metadata text file if they do not exist."
if path.isfile(file_path):
with open(file_path, 'a') as csvfile:
datawriter = csv.DictWriter(csvfile, fieldnames=data_log, delimiter=';')
datawriter.writerow({n : v for n, v in vars(data[data_type]).items() if n in data_log })
else:
#Creation of metadata file
if data[data_type]['desc'] != 'Unknown':
with open(path.join(data_dir, data_type + '_desc.txt'), 'w') as metadata_file:
for desc, value in data[data_type].items():
if desc not in data_log:
metadata_file.write(desc + " : " + str(value) + '\n')
#Creation of data file
with open(csvfile_path, 'w') as csvfile:
datawriter = csv.DictWriter(csvfile, fieldnames=data_log, delimiter=';')
datawriter.writeheader()
datawriter.writerow({n : v for n, v in vars(data[data_type]).items() if n in data_log})
def __repr__(self):
"For debug"
if self.metadata['desc'] == 'Unknown':
return '<Data {t:} = {d:} at {dt}>'.format(d=self.metadata['desc'],
t=self.dtype,
dt=self.date,
)
elif type(self.value) == float:
return '<Data {d:} = {v:.1f}{u} ({q}) at {dt}>'.format(d=self.metadata['desc'],
v=self.value,
u=self.metadata['unit'],
q=self.quality,
dt=self.date,
)
elif self.value == None:
return '<Data {d:} = {v} ({q}) at {dt}>'.format(d=self.metadata['desc'],
v=self.value,
q=self.quality,
dt=self.date,
)
else:
return '<Data {d:} = {v} {u} ({q}) at {dt}>'.format(d=self.metadata['desc'],
v=self.value,
u=self.metadata['unit'],
q=self.quality,
dt=self.date,
)
return
def __str__(self):
"For print (to user)"
if self.metadata['desc'] == 'Unknown':
return '{data_type:} = {desc:}'.format(desc=self.metadata['desc'],
data_type=self.dtype,
)
elif type(self.value) == float:
return '{d:} = {v:.1f}{u}'.format(d=self.metadata['desc'],
v=self.value,
u=self.metadata['unit'],
)
elif self.value == None:
return '{d:} = {v}'.format(d=self.metadata['desc'],
v='NA',
)
else:
return '{d:} = {v} {u}'.format(d=self.metadata['desc'],
v=self.value,
u=self.metadata['unit'],
)
def __call__(self):
return self.value
# Take a picture
def get_pict():
with PiCamera() as camera:
camera.resolution = (x_res, y_res)
camera.rotation = photo_rotation
#camera.led = camera_LED # !!! need root privileges !!!
if sense_LED_flash:
sense.show_message(text_string="",
back_colour=[255, 255, 255],
)
camera.start_preview()
sleep(ajust_time)
sense.set_rotation(r=180, redraw=True)
#sense.show_message(text_string=":-)",
#scroll_speed=0.1 ,
#text_colour=[255, 0, 0],
#back_colour=[0, 0, 255])
pict_path = path.join(photo_dir, strftime(photo_file) + '.jpg')
camera.capture(pict_path)
sense.clear()
#camera.led = True # !!! need root privileges !!!
return pict_path
########
# MAIN #
########
# Collect asked data from sensors
for data_type in data_collection:
data[data_type] = Raw_Data(data_type)
data[data_type].get_raw()
if verbose :
print(data[data_type].__repr__())
print(data[data_type]())
#Save data in CSV file
csvfile_path = path.join(data_dir, data_type + '.csv')
data[data_type].write_csv(csvfile_path)
#Take a picture
picture_path = get_pict()
# Write data on picture in new picture file
pict = Image.open(picture_path)
draw = ImageDraw.Draw(pict)
# Text line height (=font size) and line space calculation
line_height = int(y_res / 40)
line_space = int(line_height / 10)
text = ''
l = line_space
# Add a line with data for each data to display
for d in data_display:
text = str(data[d]) #.__str__()
# Select color and font to match data quality
if data[d].quality == 0:
text_color = (0, 255, 0) # Quality OK : text in green
font = font_default
elif data[d].quality < 0:
text_color = (100, 100, 100) # Unknown in grey
font = font_italic
elif data[d].quality == 1:
text_color = (255, 255, 0) # Sensor unavailable : yellow
font = font_italic
else:
text_color = (255, 0, 0) # Other = error in red
font = font_bold
img_font = ImageFont.truetype(path.join(fonts_dir, font), line_height)
draw.text((5,l), text, text_color, img_font)
draw = ImageDraw.Draw(pict)
l = l + line_height + line_space
#Get EXIF metadata and delete embedded thumbnail
pict_exif = piexif.load(pict.info['exif'])
del(pict_exif['thumbnail'])
pict.save(picture_path, 'jpeg', exif=piexif.dump(pict_exif) )
if verbose :
print('Picture = ' + picture_path)