Browse Source

original python source code of the simulator

master
Youen Toupin 3 years ago
parent
commit
73a7056587
  1. 198
      simulator/src/code site.py
  2. 219
      simulator/src/liste_météo.py
  3. 8764
      simulator/src/meteo_finale.csv
  4. 17
      simulator/src/readme.txt
  5. 3
      simulator/src/test.ts

198
simulator/src/code site.py

@ -0,0 +1,198 @@
import matplotlib.pyplot as plt
import numpy as np
import urllib.request
def meteo_choix(choix_utilisateur): #par heures sur la zone géographique concerné
lines = urllib.request.urlopen('https://vhelio.org/wp-content/uploads/2021/09/meteo_finale.csv').readlines()
H1a=[]
H1b=[]
H1c=[]
H2a=[]
H2b=[]
H2c=[]
H2d=[]
H3=[]
del lines[0]
del lines[0]
del lines[8761]
del lines[8760]#suppression des ';' en fin de csv
for line in lines:
line = line.split(';')
line[0]=line[0].rstrip(';')
H1a.append(float(line[0]))
H1b.append(float(line[1]))
H1c.append(float(line[2]))
H2a.append(float(line[3]))
H2b.append(float(line[4]))
H2c.append(float(line[5]))
H2d.append(float(line[6]))
H3.append(float(line[7]))
del line[8]
del line[9]
del line[10]
if choix_utilisateur=='h1a':
return H1a
if choix_utilisateur=='h1b':
return H1b
if choix_utilisateur=='h1c':
return H1c
if choix_utilisateur=='h2a':
return H2a
if choix_utilisateur=='h2b':
return H2b
if choix_utilisateur=='h2c':
return H2c
if choix_utilisateur=='h2d':
return H2d
if choix_utilisateur=='h3':
return H3
return 'erreur dans la saisie de la composante de la région'
def liste_annee_function(donnee_annee):#permet de séparer les 8760 données soit 365 jours avec 24 données + le jour de la semine (lundi,mardi,etc)
annee=[]
jour=[]
l=0
heure_aller=8
heure_retour=16
heure_promenade_week_end=10
semaine=['lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche']
for i in range (len(donnee_annee)):
if i==0:
jour.append([donnee_annee[i],0])
continue
else:
if i%24==0:#permet de diviser les données par pack de 24 (soit un jour)
jour.append(semaine[l])
if jour[-1]=='dimanche' or jour[-1]=='samedi' :
jour[heure_promenade_week_end][1]=2# pour le week end on suspose une balade qui dure la distance moyenne journalière
else:
jour[heure_aller-1][1]=1#le vhelio sera utiiser a cette heure là
jour[heure_retour-1][1]=1
annee.append(jour)
jour=[]
jour.append([donnee_annee[i],0])
if l==6:
l=0
else:
l=l+1
continue
jour.append([donnee_annee[i],0])
annee.append(jour)
return annee
def Capacite_batt_dans_le_temps(liste_annee,conso_WH_par_km, capacite_batt,distance_moyenne):
rendement_panneau=0.15
surface_panneau=1
capacite_batt_reel=capacite_batt
compteur_de_charges=0
liste_finale=[]
prix_moyen_kwh=0.192
electricite_utilise_par_le_moteur=0
for jours in range(len( liste_annee)):
for heures in range(len(liste_annee[jours])-1):
infos=liste_annee[jours][heures]
# la capacité de la batterie varie selon ce que le panneaux fournit et la consommation éléctrique pendant l'utilisation du vhélio
electricite_utilise_par_le_moteur= electricite_utilise_par_le_moteur+infos[1]*conso_WH_par_km*distance_moyenne/2
capacite_batt_reel=capacite_batt_reel+ infos[0]*rendement_panneau*surface_panneau*1-infos[1]*conso_WH_par_km*distance_moyenne/2
if capacite_batt_reel>capacite_batt:
capacite_batt_reel=capacite_batt
if capacite_batt_reel<=0:
capacite_batt_reel=capacite_batt
compteur_de_charges=compteur_de_charges+1
infos.append(capacite_batt_reel)
liste_finale.append(capacite_batt_reel/capacite_batt*100)
return liste_finale,liste_annee,compteur_de_charges,compteur_de_charges*(capacite_batt/1000)*prix_moyen_kwh, electricite_utilise_par_le_moteur
def consommation_wh_par_km_estimation (denivele,poids):
#Après les expèriences faites on arrive sur une moyenne de 16 sur du plat et 25 en montée (c'estdonnées seront mise à jour avec les nouveaux tests du vhélio 4)
composante_poids=0
composante_poids=(4/200)*poids# approche linéaire
if poids>=200:
composante_poids=4
if poids<=0:
composante_poids=0
if denivele==0:
return 14+composante_poids
if denivele>500:
return 21+composante_poids#21 est une moyenne entre la consommation en montée et la consommation en descente sur une distance moyenne
return 14+(7/500)*denivele+composante_poids# approximation linéaire de la consommation éléctrique
def fonction_fianale(capacite_battrie_desiree,distance_moyenne_jour,denivele,poids,liste_ensolleillement_annee):
#cette fonction utilise toute les fonctions définis avant et permet l'affichage
liste_ensolleillement_finale=liste_annee_function(liste_ensolleillement_annee)
liste_finale,liste_annee,compteur_de_charges,prix_annee,electricite_conso=Capacite_batt_dans_le_temps(liste_ensolleillement_finale,consommation_wh_par_km_estimation(denivele,poids),capacite_battrie_desiree,distance_moyenne_jour)
couverture_solaire=round(100*(electricite_conso-(compteur_de_charges+1)*capacite_battrie_desiree)/electricite_conso)
abs=np.linspace(0,8758,8759)
xlabels = ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin","Juillet","Aout", "Septembre", "octobre", "Novembre", "Décembre"]
ord=liste_finale
70
plt.plot(abs,ord)
plt.xlabel(" ------|------------été--------------|---------------")
plt.ylabel('%')
plt.title(" Pourcentage de charge dans la batterie en fonction des heures de l'année " )
plt.show()
print('il faudra recharger le vhelio sur secteur environ',compteur_de_charges,"fois sur l'annee")
print("cela coutera" ,round(prix_annee,2),"€ sur l'annee")
print("la couverture solaire du vhelio est de",couverture_solaire,'%')
#%%
print('Quelle capacite de batterie envisagez vous?\n(exemple: tapez" "700")' )
capacite_battrie_desiree=float(input())
print('Combien de kilometres fait vous chaque jour\n(exemple: tapez "10")')
distance_moyenne_jour=float(input())
print('Quel est le denivele moyen de votre trajet journalier (en metres).\nPour indication: "0" signifie que le trajet se fait sur du plat, "100"m :legerement vallonne, "200": plutot vallonne, "300": vallonne, "500": montagneux, (exemple: tapez "100")')
denivele=float(input())
print("Quel est le poids embarque en plus du conducteur (bagages + passagers).\n(exemple: un passagers de 80kg+50kg de chargement soit 130 kg.\nIl faut taper 130 dans le simulateur.)\n")
poids=(float(input()))
print("Veuillez rentrer votre zone climatique en miniscule.\nElle est indiquer sur la carte de france ci-dessus\n(exemple: taper h1a ou h2c) surtout ecrire les 3 caracteres en minuscules.")
zone_climatique=input()
liste_ensolleillement_annee=meteo_choix(zone_climatique)
fonction_fianale(capacite_battrie_desiree,distance_moyenne_jour,denivele,poids,liste_ensolleillement_annee)
# .Le projet Vhélio est libre et collaboratif. Cette version du simulateur est une première version largement améliorable. N'hésitez pas à vous inscrire en tant que faiseur pour nous aider à l'améliorer.
# Lien : https://www.helloasso.com/associations/velo-solaire-pour-tous/adhesions/adhesion-a-l-association-velo-solaire-pour-tous-faiseur

219
simulator/src/liste_météo.py

@ -0,0 +1,219 @@
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 9 11:56:41 2021
@author: hugo
"""
import csv
import numpy as np
import matplotlib.pyplot as plt
def charge_fichier_csv(fichier, delimiter=";",N=0):
"""
Charge un fichier csv et le renvoie sous forme de tableau
:param: nom de fichier, délimiteur de cellules (par défaut ";"),
nombre de lignes d'en-tête (en comptant les lignes vides)
:returns: tableau des données
"""
with open(fichier, 'r') as f :
rfichier = csv.reader(f, delimiter=delimiter)
tableau=[]
index_row=0
for row in rfichier:
if index_row < N:
index_row = index_row+1
else :
for i in range (len(row)):
if len(tableau) <= i:
X = []
tableau.append(X)
try:
tableau[i].append(float(row[i].replace(",",'.')))
except ValueError:
print('erreur:contenu de cellule non numerique')
continue
return (tableau)
tableau=charge_fichier_csv('meteo_moy.csv',delimiter=";",N=1)
H1a=tableau[4]
H1b=tableau[5]
H1c=tableau[6]
H2a=tableau[7]
H2b=tableau[8]
H2c=tableau[9]
H2d=tableau[10]
H3=tableau[11]
# print(H1a)
h1a=[40.5, 60.6, 98.5, 139.5, 159.9, 180.2, 130.1, 163.0, 131.9, 89.9, 32.6, 37.2]
h1b=[45.7, 62.3, 110.2, 147.4, 173.0, 157.2, 127.0, 150.7, 154.1, 57.5, 33.3, 23.0]
h1c=[33.0, 79.0, 127.5, 146.1, 146.9, 190.4, 140.5, 169.0, 98.7, 75.7, 44.0, 42.8]
h2a=[43.2, 68.6, 120.5, 146.5, 185.8, 184.6, 135.5, 163.0, 158.8, 86.2, 48.7, 46.3]
h2b=[56.6, 77.8, 126.2, 174.2, 205.9, 236.2, 167.7, 196.2, 204.3, 78.9, 58.7, 32.6]
h2c=[62.6, 86.5, 140.7, 153.0, 180.4, 196.9, 152.0, 174.3, 178.0, 101.9, 50.8, 41.3]
h2d=[97.9, 135.3, 185.5, 212.4, 214.4, 293.7, 217.5, 256.1, 196.4, 128.9, 105.5, 93.7]
h3=[120.2, 153.9, 179.4, 209.0, 247.8, 273.8, 219.9, 241.4, 173.6, 144.3, 92.0, 98.3]
liste_mois=[[31,14,10],[28,13,11],[31,12,12],[30,10,14],[31,8,16],[30,8,16],[31,8,16],[31,9,15],[30,11,13],[31,13,11],[30,15,9],[31,15,9]]
#liste mois est une liste contenant 3 infos pour chaque moi (mois janvier etc ) le nb de jours du mois
#le nombre d''heure de nuit par jour , et le nombre de jours par jours
#mois=[janvier,fevrier,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre]
def creation_liste_annee (zone_geo,liste_mois):
liste_annee=[]
#objectif créer la liste année soit 365 element(jours) contenant 24 (heurs et ensolleillement)element avec les heure de nuit ou y'a 0 soleil et les heure de jours qui sont la moyenne solaire du mois divisee par le nombre d'heure ensolleiller
#ci-dessous heure du matin
for mois in range (len(liste_mois )):
for jour_par_moi in range (liste_mois[mois][0]):
liste_jour=[]
if liste_mois[mois][2]%2==0:
for w in range (int(liste_mois[mois][1]//2)):
liste_jour.append(0)
else:
for w in range (int(liste_mois[mois][1]//2)+1):
liste_jour.append(0)
#ci dessus on ajoute les heure de soleil
for heure_soleil in range(liste_mois[mois][2]):
ratio_moy_heure_soleil=liste_mois[mois][0]/liste_mois[mois][2]
liste_jour.append(zone_geo[mois]*ratio_moy_heure_soleil)
# ci-dessous heure de la après midi nuit
for i in range (int(liste_mois[mois][1]//2)):
liste_jour.append(0)
liste_annee.append(liste_jour)
return liste_annee
def Specification_jour_semaine(liste_annee,heure_aller,heure_retour):
annee=[]
jour=[]
l=0
semaine=['lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche']
for i in range ((len(liste_annee))):
jour.append(liste_annee[i])
#le 0 c'est l'indicateur d'activité pourune heure donné
jour.append(semaine[l])
#if jour[-1]=='dimanche':
# jour[0][heure_promenade_dimanche]=2
# else:
# jour[0][heure_aller-1]=1
# " jour[0][heure_retour-1]=1
annee.append(jour)
jour=[]
if l==6:
l=0
else:
l=l+1
continue
annee.append(jour)
return annee
def Capacite_batt_dans_le_temps(liste_annee,conso_WH_par_km, capacite_batt,distance_moyenne,heure_de_rentre,heure_de_sortie):
rendement_panneau=0.15
surface_panneau=1
capacite_batt_reel=capacite_batt
compteur_de_charges=0
liste_finale=[]
prix_moyen_kwh=0.146
activite=0
for jours in range(len( liste_annee)):
for heures in range(len(liste_annee[jours][0])):#ya le jour dans la semaine en 25 position
infos=liste_annee[jours][0]#selection de la liste avec l'ensolleillement sur une journée
if liste_annee[jours][1]!='dimanche':
if heures==heure_de_rentre or heures==heure_de_sortie:
activite=1
else:
activite=0
else:
activite=0
capacite_batt_reel=capacite_batt_reel+ infos[heures]*rendement_panneau*surface_panneau*1-activite*conso_WH_par_km*distance_moyenne/2
if capacite_batt_reel>capacite_batt:
capacite_batt_reel=capacite_batt
if capacite_batt_reel<=0:
capacite_batt_reel=capacite_batt
compteur_de_charges=compteur_de_charges+1
infos.append(capacite_batt_reel)
liste_finale.append(capacite_batt_reel)
return liste_finale,liste_annee,compteur_de_charges,compteur_de_charges*(capacite_batt/1000)*prix_moyen_kwh
def consommation_wh_par_km_estimation (denivele):
if denivele==0:
return 16
if denivele>500:
return 25
return 16+(9/500)*denivele# approximation inéaire de la consommation éléctrique
#%%
meteo=h1a
capacite_battrie_desiree=700
distance_moyenne_jour=10
denivele=100
heure_aller=8
heure_retour=16
annee=creation_liste_annee(meteo,liste_mois)
annee2=Specification_jour_semaine(annee,heure_aller,heure_retour)
liste_finale,liste_annee,compteur_de_charges,prix_annee=Capacite_batt_dans_le_temps(annee2,consommation_wh_par_km_estimation(denivele),capacite_battrie_desiree,distance_moyenne_jour,heure_aller,heure_retour)
plt.figure(1)
abs=np.linspace(0,8759,8760)
ord=liste_finale
plt.plot(abs,ord)
plt.xlabel('heures')
#plt.grid(True)
plt.ylabel('Wh dans la batterie ')
plt.title(" Wh dans la batterie e fonction de l'annee " )
plt.legend()
plt.show()
print(compteur_de_charges)
print(prix_annee)
# def import_data(lien_zone_climatique):#fonction permettant de récupèrer es données d'ensolleillement
# #par heures sur la zone géographique concerné
# lines = urllib.request.urlopen(lien_zone_climatique).readlines()
# liste_data=[]
# del lines[0]
# for line in lines:
# line=line.decode("utf-8")
# line = line.split(';')
# data=line[0]
# data_float=float(data)
# liste_data.append(data_float)
# return liste_data

8764
simulator/src/meteo_finale.csv

File diff suppressed because it is too large Load Diff

17
simulator/src/readme.txt

@ -0,0 +1,17 @@
--Readme--
réalisé par
Trachsel Hugo
pour le projet Vhélio
--Utilisation du code python--
-télécharger puis dézipper les fichiers.
-mettre le fichier météo_finale.csv dans le même dossier que le fichier code.py .
-Lancer le fichier code.py sur une interface supportant le language python(éviter les versions en ligne qui n'ont pas toutes les bibliothèques).
-Lancer le code.
-Tapez les données demandées dans la console pyhton.
-Lire les résultats.

3
simulator/src/test.ts

@ -1,3 +0,0 @@
document.addEventListener("DOMContentLoaded", function() {
document.getElementById('test').innerText = "Hello world!";
});
Loading…
Cancel
Save