<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wikidebrouillard.qualif.dokit.app/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AYOUB</id>
	<title>Wikidebrouillard - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wikidebrouillard.qualif.dokit.app/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AYOUB"/>
	<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/wiki/Sp%C3%A9cial:Contributions/AYOUB"/>
	<updated>2026-11-12T23:38:10Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22766</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22766"/>
		<updated>2026-05-30T12:12:57Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Main_Picture=Mobi_BOX_IMG_0412.jpeg&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Un dispositif fournissant des informations en temps réel sur la pertinence d’utiliser une voiture ou les transports en commun, en évaluant la qualité de l’air, les niveaux de pollution atmosphérique ainsi que la disponibilité des différents moyens de transport dans la zone&lt;br /&gt;
|Disciplines scientifiques=Arduino, Computing, Electricity, Mechanics&lt;br /&gt;
|Difficulty=Expert&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
|Tags=Pollution, transport, mobilité, qualité de l’air&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction&lt;br /&gt;
|Introduction=pour présenter l’expérience ou la réalisation technique de manière attractive.&lt;br /&gt;
}}&lt;br /&gt;
{{Materials&lt;br /&gt;
|ItemList={{ItemList&lt;br /&gt;
|Item=Découpeuse laser&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Moteur électrique&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Imprimante 3D&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=LED&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Boite en carton&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=ESP32&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Comprendre le terme ( Mobilité de transport commun)&lt;br /&gt;
|Step_Content=Chaque participant partage sa compréhension du thème. Toutes les idées et les mots-clés sont ensuite notés et organisés sous forme de schéma.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_IMG_1827.jpeg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_IMG_1829.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Recherche dans les sources disponibles&lt;br /&gt;
|Step_Content=Analyse des sources disponibles sur les sites de TBM et de Bordeaux Métropole pour identifier les bénéfices environnementaux du tramway et du réseau de bus.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.55.11.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Élaboration d’un schéma préliminaire&lt;br /&gt;
|Step_Content=Conception d’une machine capable d’analyser la qualité de l’air et le trafic, afin de proposer le meilleur moyen de transport entre bus, tram, voiture ou taxi.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_IMG_1832.jpeg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_Capture_d_e_cran_2025-12-05_a_10.36.02.png&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Choisir les matériaux pour la maquette&lt;br /&gt;
|Step_Content=Bois, LED, papier transparent, éléments imprimés en 3D, ainsi que des cartes électroniques(Arduino ) pour la rotation et l’éclairage des LED.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_93993C_zoo.jpg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_IMG_0413.jpeg&lt;br /&gt;
|Step_Picture_02=Mobi_BOX_IMG_0333.mov&lt;br /&gt;
|Step_Picture_03=Mobi_BOX_IMG_0326.jpeg&lt;br /&gt;
|Step_Picture_04=Mobi_BOX_WhatsApp_Image_2026-05-30_at_14.12.33.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Programmation sur Python&lt;br /&gt;
|Step_Content=import requests&lt;br /&gt;
&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
&lt;br /&gt;
class AQIRepository:&lt;br /&gt;
&lt;br /&gt;
URL = &amp;quot;&amp;lt;nowiki&amp;gt;https://www.atmo-nouvelleaquitaine.org/air-commune/Bordeaux/33063/indice-atmo?date=2025-10-14&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def __init__(self):&lt;br /&gt;
&lt;br /&gt;
self.cat_to_conc = {&lt;br /&gt;
&lt;br /&gt;
&#039;Bon&#039;:    {&#039;PM2.5&#039;: 5.0,  &#039;PM10&#039;: 15.0, &#039;O3&#039;: 0.040, &#039;NO2&#039;: 20.0, &#039;SO2&#039;: 5.0},&lt;br /&gt;
&lt;br /&gt;
&#039;Moyen&#039;:  {&#039;PM2.5&#039;: 20.0, &#039;PM10&#039;: 40.0, &#039;O3&#039;: 0.060, &#039;NO2&#039;: 60.0, &#039;SO2&#039;: 20.0},&lt;br /&gt;
&lt;br /&gt;
&#039;Mauvais&#039;:{&#039;PM2.5&#039;: 40.0, &#039;PM10&#039;: 100.0,&#039;O3&#039;: 0.100, &#039;NO2&#039;: 150.0,&#039;SO2&#039;: 100.0},&lt;br /&gt;
&lt;br /&gt;
&#039;Très mauvais&#039;:{&#039;PM2.5&#039;:120.0,&#039;PM10&#039;:300.0,&#039;O3&#039;:0.180,&#039;NO2&#039;:800.0,&#039;SO2&#039;:500.0}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
self.breakpoints = {&lt;br /&gt;
&lt;br /&gt;
&#039;PM2.5&#039;: [(0.0,12.0,0,50),(12.1,35.4,51,100),(35.5,55.4,101,150),(55.5,150.4,151,200)],&lt;br /&gt;
&lt;br /&gt;
&#039;PM10&#039;:  [(0,54,0,50),(55,154,51,100),(155,254,101,150),(255,354,151,200)],&lt;br /&gt;
&lt;br /&gt;
&#039;O3&#039;:    [(0.000,0.054,0,50),(0.055,0.070,51,100),(0.071,0.085,101,150)],&lt;br /&gt;
&lt;br /&gt;
&#039;NO2&#039;:   [(0,53,0,50),(54,100,51,100),(101,360,101,150),(361,649,151,200)],&lt;br /&gt;
&lt;br /&gt;
&#039;SO2&#039;:   [(0,35,0,50),(36,75,51,100),(76,185,101,150),(186,304,151,200)],&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
def linear_scale(self, C, C_low, C_high, I_low, I_high):&lt;br /&gt;
&lt;br /&gt;
return round((I_high - I_low) / (C_high - C_low) * (C - C_low) + I_low)&lt;br /&gt;
&lt;br /&gt;
def find_aqi_subindex(self, C, pollutant):&lt;br /&gt;
&lt;br /&gt;
for (C_low, C_high, I_low, I_high) in self.breakpoints[pollutant]:&lt;br /&gt;
&lt;br /&gt;
if C_low &amp;lt;= C &amp;lt;= C_high:&lt;br /&gt;
&lt;br /&gt;
return self.linear_scale(C, C_low, C_high, I_low, I_high)&lt;br /&gt;
&lt;br /&gt;
return None&lt;br /&gt;
&lt;br /&gt;
def scrape_categories(self):&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.URL, timeout=10)&lt;br /&gt;
&lt;br /&gt;
soup = BeautifulSoup(response.text, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
categories = {}&lt;br /&gt;
&lt;br /&gt;
blocks = soup.select(&amp;quot;.c-indice-polluant&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for block in blocks:&lt;br /&gt;
&lt;br /&gt;
title_tag = block.select_one(&amp;quot;.c-indice-polluant-title span&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cat_tag = block.select_one(&amp;quot;.home-map-legend-item span&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if title_tag and cat_tag:&lt;br /&gt;
&lt;br /&gt;
name = title_tag.get_text(strip=True).replace(&amp;quot;₂&amp;quot;, &amp;quot;2&amp;quot;).replace(&amp;quot;₃&amp;quot;, &amp;quot;3&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cat = cat_tag.get_text(strip=True)&lt;br /&gt;
&lt;br /&gt;
categories[name] = cat&lt;br /&gt;
&lt;br /&gt;
return categories&lt;br /&gt;
&lt;br /&gt;
def compute_aqi(self, categories):&lt;br /&gt;
&lt;br /&gt;
concentrations = {k: self.cat_to_conc[v][k] for k, v in categories.items() if k in self.cat_to_conc[v]}&lt;br /&gt;
&lt;br /&gt;
subindices = {k: self.find_aqi_subindex(concentrations[k], k) for k in concentrations}&lt;br /&gt;
&lt;br /&gt;
aqi_global = max(v for v in subindices.values() if v is not None)&lt;br /&gt;
&lt;br /&gt;
return aqi_global, subindices &lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
class MeteoRepository:&lt;br /&gt;
&lt;br /&gt;
def __init__(self, latitude=44.8378, longitude=-0.5792):&lt;br /&gt;
&lt;br /&gt;
self.latitude = latitude&lt;br /&gt;
&lt;br /&gt;
self.longitude = longitude&lt;br /&gt;
&lt;br /&gt;
self.api_url = (&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;nowiki&amp;gt;https://api.open-meteo.com/v1/forecast&amp;lt;/nowiki&amp;gt;?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
f&amp;quot;latitude={self.latitude}&amp;amp;longitude={self.longitude}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;hourly=temperature_2m,precipitation,weathercode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;current_weather=true&amp;amp;timezone=Europe%2FParis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
def get_weather(self):&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.api_url, timeout=10)&lt;br /&gt;
&lt;br /&gt;
data = response.json()&lt;br /&gt;
&lt;br /&gt;
return data.get(&amp;quot;current_weather&amp;quot;, {})&lt;br /&gt;
&lt;br /&gt;
def compute_weather_score(self, weather):&lt;br /&gt;
&lt;br /&gt;
wmo_scores = {&lt;br /&gt;
&lt;br /&gt;
0: 100, 1: 90, 2: 80, 3: 70, 45: 60, 48: 55,&lt;br /&gt;
&lt;br /&gt;
51: 50, 53: 45, 55: 40, 61: 35, 63: 25, 65: 15,&lt;br /&gt;
&lt;br /&gt;
71: 25, 73: 15, 75: 5, 95: 10, 99: 0,&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
temp = weather.get(&amp;quot;temperature&amp;quot;, 20)&lt;br /&gt;
&lt;br /&gt;
wind = weather.get(&amp;quot;windspeed&amp;quot;, 10)&lt;br /&gt;
&lt;br /&gt;
code = weather.get(&amp;quot;weathercode&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
base_score = wmo_scores.get(code, 60)&lt;br /&gt;
&lt;br /&gt;
if temp &amp;lt; 0:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 30&lt;br /&gt;
&lt;br /&gt;
elif temp &amp;lt; 10:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 15&lt;br /&gt;
&lt;br /&gt;
elif temp &amp;gt; 30:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 20&lt;br /&gt;
&lt;br /&gt;
else:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 0&lt;br /&gt;
&lt;br /&gt;
wind_penalty = 0&lt;br /&gt;
&lt;br /&gt;
if wind &amp;gt; 40:&lt;br /&gt;
&lt;br /&gt;
wind_penalty = 20&lt;br /&gt;
&lt;br /&gt;
elif wind &amp;gt; 25:&lt;br /&gt;
&lt;br /&gt;
wind_penalty = 10&lt;br /&gt;
&lt;br /&gt;
score = base_score - temp_penalty - wind_penalty&lt;br /&gt;
&lt;br /&gt;
return round(max(0, min(100, score)))&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
class TrafficRepository:&lt;br /&gt;
&lt;br /&gt;
BASE_URL = &amp;quot;&amp;lt;nowiki&amp;gt;https://data.bordeaux-metropole.fr/geojson&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def __init__(self, api_key=&amp;quot;2HH8S7FKPP&amp;quot;, typename=&amp;quot;ci_trafi_l&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
self.api_key = api_key&lt;br /&gt;
&lt;br /&gt;
self.typename = typename&lt;br /&gt;
&lt;br /&gt;
def get_traffic_by_gid(self, gid=2215):&lt;br /&gt;
&lt;br /&gt;
params = {&lt;br /&gt;
&lt;br /&gt;
&amp;quot;key&amp;quot;: self.api_key,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;typename&amp;quot;: self.typename,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;filter&amp;quot;: json.dumps({&amp;quot;gid&amp;quot;: gid}),&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.BASE_URL, params=params, timeout=10)&lt;br /&gt;
&lt;br /&gt;
if response.status_code != 200:&lt;br /&gt;
&lt;br /&gt;
raise Exception(f&amp;quot;Erreur API {response.status_code} : {response.text}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
return response.json()&lt;br /&gt;
&lt;br /&gt;
def compute_traffic_score(self, traffic_data):&lt;br /&gt;
&lt;br /&gt;
features = traffic_data.get(&amp;quot;features&amp;quot;, [])&lt;br /&gt;
&lt;br /&gt;
if not features:&lt;br /&gt;
&lt;br /&gt;
return 50&lt;br /&gt;
&lt;br /&gt;
props = features[0].get(&amp;quot;properties&amp;quot;, {})&lt;br /&gt;
&lt;br /&gt;
etat = props.get(&amp;quot;etat_trafic&amp;quot;) or props.get(&amp;quot;etat&amp;quot;) or &amp;quot;INCONNU&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mapping = {&amp;quot;FLUIDE&amp;quot;: 100, &amp;quot;RALENTI&amp;quot;: 70, &amp;quot;EMBOUTEILLE&amp;quot;: 30, &amp;quot;INCONNU&amp;quot;: 50}&lt;br /&gt;
&lt;br /&gt;
return mapping.get(etat.upper(), 50)&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
from datetime import datetime, timezone&lt;br /&gt;
&lt;br /&gt;
class TbmRepository:&lt;br /&gt;
&lt;br /&gt;
BASE_URL = &amp;quot;&amp;lt;nowiki&amp;gt;https://data.bordeaux-metropole.fr/geojson&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def __init__(self, api_key=&amp;quot;2HH8S7FKPP&amp;quot;, arret_id=4037):&lt;br /&gt;
&lt;br /&gt;
self.api_key = api_key&lt;br /&gt;
&lt;br /&gt;
self.arret_id = arret_id&lt;br /&gt;
&lt;br /&gt;
def get_next_tram(self, max_results=100):&lt;br /&gt;
&lt;br /&gt;
params = {&lt;br /&gt;
&lt;br /&gt;
&amp;quot;key&amp;quot;: self.api_key,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;typename&amp;quot;: &amp;quot;sv_horai_a&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;filter&amp;quot;: json.dumps({&amp;quot;rs_sv_arret_p&amp;quot;: self.arret_id}),&lt;br /&gt;
&lt;br /&gt;
&amp;quot;orderby&amp;quot;: json.dumps([&amp;quot;hor_theo&amp;quot;]),&lt;br /&gt;
&lt;br /&gt;
&amp;quot;maxfeatures&amp;quot;: max_results&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.BASE_URL, params=params)&lt;br /&gt;
&lt;br /&gt;
response.raise_for_status()&lt;br /&gt;
&lt;br /&gt;
data = response.json()&lt;br /&gt;
&lt;br /&gt;
now = datetime.now(timezone.utc)&lt;br /&gt;
&lt;br /&gt;
for feature in data.get(&amp;quot;features&amp;quot;, []):&lt;br /&gt;
&lt;br /&gt;
props = feature.get(&amp;quot;properties&amp;quot;, {})&lt;br /&gt;
&lt;br /&gt;
hor_theo = props.get(&amp;quot;hor_theo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if not hor_theo:&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
&lt;br /&gt;
tram_time = datetime.fromisoformat(hor_theo)&lt;br /&gt;
&lt;br /&gt;
except ValueError:&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
if tram_time &amp;gt; now:&lt;br /&gt;
&lt;br /&gt;
diff_sec = int((tram_time - now).total_seconds())&lt;br /&gt;
&lt;br /&gt;
return {&amp;quot;heure&amp;quot;: tram_time, &amp;quot;seconds&amp;quot;: diff_sec, &amp;quot;etat&amp;quot;: props.get(&amp;quot;etat&amp;quot;), &amp;quot;type&amp;quot;: props.get(&amp;quot;type&amp;quot;)}&lt;br /&gt;
&lt;br /&gt;
return None&lt;br /&gt;
&lt;br /&gt;
from AQIRepository import AQIRepository&lt;br /&gt;
&lt;br /&gt;
from MeteoRepository import MeteoRepository&lt;br /&gt;
&lt;br /&gt;
from TrafficRepository import TrafficRepository&lt;br /&gt;
&lt;br /&gt;
from TramRepository import TbmRepository&lt;br /&gt;
&lt;br /&gt;
from fastapi import FastAPI&lt;br /&gt;
&lt;br /&gt;
app = FastAPI()&lt;br /&gt;
&lt;br /&gt;
@app.get(&amp;quot;/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def read_root():&lt;br /&gt;
&lt;br /&gt;
longitude = -0.5935101&lt;br /&gt;
&lt;br /&gt;
latitude = 44.8538665&lt;br /&gt;
&lt;br /&gt;
borneTraficGID = 2215&lt;br /&gt;
&lt;br /&gt;
Aqirepo = AQIRepository()&lt;br /&gt;
&lt;br /&gt;
categories = Aqirepo.scrape_categories()&lt;br /&gt;
&lt;br /&gt;
aqi, details = Aqirepo.compute_aqi(categories)&lt;br /&gt;
&lt;br /&gt;
meteo = MeteoRepository(latitude=latitude, longitude=longitude)&lt;br /&gt;
&lt;br /&gt;
weather = meteo.get_weather()&lt;br /&gt;
&lt;br /&gt;
score_M = meteo.compute_weather_score(weather)&lt;br /&gt;
&lt;br /&gt;
traffic = TrafficRepository()&lt;br /&gt;
&lt;br /&gt;
data = traffic.get_traffic_by_gid(borneTraficGID)&lt;br /&gt;
&lt;br /&gt;
score_T = traffic.compute_traffic_score(data)&lt;br /&gt;
&lt;br /&gt;
tbm = TbmRepository(arret_id=4037)&lt;br /&gt;
&lt;br /&gt;
prochain = tbm.get_next_tram()&lt;br /&gt;
&lt;br /&gt;
if prochain and &#039;seconds&#039; in prochain:&lt;br /&gt;
&lt;br /&gt;
TP_seconds = prochain[&#039;seconds&#039;]&lt;br /&gt;
&lt;br /&gt;
else:&lt;br /&gt;
&lt;br /&gt;
TP_seconds = 3600&lt;br /&gt;
&lt;br /&gt;
max_tp_seconds = 3600&lt;br /&gt;
&lt;br /&gt;
TP_score = max(0, min(100, 100 - (TP_seconds / max_tp_seconds) * 100))&lt;br /&gt;
&lt;br /&gt;
IMR = (&lt;br /&gt;
&lt;br /&gt;
0.4 * (100 - aqi) +&lt;br /&gt;
&lt;br /&gt;
0.3 * (100 - score_T) +&lt;br /&gt;
&lt;br /&gt;
0.2 * TP_score +&lt;br /&gt;
&lt;br /&gt;
0.1 * score_M&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
return {&amp;quot;IMR&amp;quot;: round(IMR, 1)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.46.41.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Monter les éléments de la maquette et effectuer les tests&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_IMG_0308.jpeg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_IMG_0345.mov&lt;br /&gt;
|Step_Picture_02=Mobi_BOX_IMG_0418.jpeg&lt;br /&gt;
|Step_Picture_03=Mobi_BOX_IMG_0384.mov&lt;br /&gt;
|Step_Picture_04=Mobi_BOX_IMG_1836.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Vidéo final&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_POCL.mp4&lt;br /&gt;
}}&lt;br /&gt;
{{Notes&lt;br /&gt;
|Observations=Une rotation d’un cache dévoilé le moyen de transport conseillé à l’instant t.&lt;br /&gt;
|Avertissement=Connexion&lt;br /&gt;
&lt;br /&gt;
Disponibilité des Api externe&lt;br /&gt;
|Explanations=L’esp appelle une api sur un serveur (api en fast api). Cette api va appeler les autres apis et faire les calcule.&lt;br /&gt;
&lt;br /&gt;
Cette architecture permet de ne pas être limité par l’esp niveau performance.&lt;br /&gt;
|Applications=Ils sont installés dans les lieux publics, aux arrêts de tramway, aux stations de bus et dans les taxis, et sont signalés par un panneau indiquant leur présence.&lt;br /&gt;
|Related=- Ajouter un GPS afin d’avoir la position dynamiquement.&lt;br /&gt;
&lt;br /&gt;
- Ajouter un capteur qui permet d’analyser la qualité de l’air pour ne plus dépendre d’un service tier et être  plus précis&lt;br /&gt;
|Objectives=Améliorer notre capacité à travailler en équipe Améliorer notre capacité à s’adapter au différent profils et compétence des membres de notre équipe (oral, méthode de travail, contrainte)&lt;br /&gt;
|Notes=https://datahub.bordeaux-metropole.fr/pages/accueil/&lt;br /&gt;
&lt;br /&gt;
https://fastapi.tiangolo.com/&lt;br /&gt;
&lt;br /&gt;
https://open-meteo.com/&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_WhatsApp_Image_2026-05-30_at_14.12.33.jpeg&amp;diff=22765</id>
		<title>Fichier:Mobi BOX WhatsApp Image 2026-05-30 at 14.12.33.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_WhatsApp_Image_2026-05-30_at_14.12.33.jpeg&amp;diff=22765"/>
		<updated>2026-05-30T12:12:50Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_WhatsApp_Image_2026-05-30_at_14.12.33&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_WhatsApp_Image_2026-05-30_at_14.12.33&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22764</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22764"/>
		<updated>2026-05-30T12:03:16Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Main_Picture=Mobi_BOX_IMG_0412.jpeg&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Un dispositif fournissant des informations en temps réel sur la pertinence d’utiliser une voiture ou les transports en commun, en évaluant la qualité de l’air, les niveaux de pollution atmosphérique ainsi que la disponibilité des différents moyens de transport dans la zone&lt;br /&gt;
|Disciplines scientifiques=Arduino, Computing, Electricity, Mechanics&lt;br /&gt;
|Difficulty=Expert&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
|Tags=Pollution, transport, mobilité, qualité de l’air&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction&lt;br /&gt;
|Introduction=pour présenter l’expérience ou la réalisation technique de manière attractive.&lt;br /&gt;
}}&lt;br /&gt;
{{Materials&lt;br /&gt;
|ItemList={{ItemList&lt;br /&gt;
|Item=Découpeuse laser&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Moteur électrique&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Imprimante 3D&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=LED&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Boite en carton&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=ESP32&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Comprendre le terme ( Mobilité de transport commun)&lt;br /&gt;
|Step_Content=Chaque participant partage sa compréhension du thème. Toutes les idées et les mots-clés sont ensuite notés et organisés sous forme de schéma.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_IMG_1827.jpeg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_IMG_1829.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Recherche dans les sources disponibles&lt;br /&gt;
|Step_Content=Analyse des sources disponibles sur les sites de TBM et de Bordeaux Métropole pour identifier les bénéfices environnementaux du tramway et du réseau de bus.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.55.11.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Élaboration d’un schéma préliminaire&lt;br /&gt;
|Step_Content=Conception d’une machine capable d’analyser la qualité de l’air et le trafic, afin de proposer le meilleur moyen de transport entre bus, tram, voiture ou taxi.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_IMG_1832.jpeg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_Capture_d_e_cran_2025-12-05_a_10.36.02.png&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Choisir les matériaux pour la maquette&lt;br /&gt;
|Step_Content=Bois, LED, papier transparent, éléments imprimés en 3D, ainsi que des cartes électroniques pour la rotation et l’éclairage des LED.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_93993C_zoo.jpg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_IMG_0413.jpeg&lt;br /&gt;
|Step_Picture_02=Mobi_BOX_IMG_0333.mov&lt;br /&gt;
|Step_Picture_03=Mobi_BOX_IMG_0326.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Programmation sur Python&lt;br /&gt;
|Step_Content=import requests&lt;br /&gt;
&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
&lt;br /&gt;
class AQIRepository:&lt;br /&gt;
&lt;br /&gt;
URL = &amp;quot;&amp;lt;nowiki&amp;gt;https://www.atmo-nouvelleaquitaine.org/air-commune/Bordeaux/33063/indice-atmo?date=2025-10-14&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def __init__(self):&lt;br /&gt;
&lt;br /&gt;
self.cat_to_conc = {&lt;br /&gt;
&lt;br /&gt;
&#039;Bon&#039;:    {&#039;PM2.5&#039;: 5.0,  &#039;PM10&#039;: 15.0, &#039;O3&#039;: 0.040, &#039;NO2&#039;: 20.0, &#039;SO2&#039;: 5.0},&lt;br /&gt;
&lt;br /&gt;
&#039;Moyen&#039;:  {&#039;PM2.5&#039;: 20.0, &#039;PM10&#039;: 40.0, &#039;O3&#039;: 0.060, &#039;NO2&#039;: 60.0, &#039;SO2&#039;: 20.0},&lt;br /&gt;
&lt;br /&gt;
&#039;Mauvais&#039;:{&#039;PM2.5&#039;: 40.0, &#039;PM10&#039;: 100.0,&#039;O3&#039;: 0.100, &#039;NO2&#039;: 150.0,&#039;SO2&#039;: 100.0},&lt;br /&gt;
&lt;br /&gt;
&#039;Très mauvais&#039;:{&#039;PM2.5&#039;:120.0,&#039;PM10&#039;:300.0,&#039;O3&#039;:0.180,&#039;NO2&#039;:800.0,&#039;SO2&#039;:500.0}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
self.breakpoints = {&lt;br /&gt;
&lt;br /&gt;
&#039;PM2.5&#039;: [(0.0,12.0,0,50),(12.1,35.4,51,100),(35.5,55.4,101,150),(55.5,150.4,151,200)],&lt;br /&gt;
&lt;br /&gt;
&#039;PM10&#039;:  [(0,54,0,50),(55,154,51,100),(155,254,101,150),(255,354,151,200)],&lt;br /&gt;
&lt;br /&gt;
&#039;O3&#039;:    [(0.000,0.054,0,50),(0.055,0.070,51,100),(0.071,0.085,101,150)],&lt;br /&gt;
&lt;br /&gt;
&#039;NO2&#039;:   [(0,53,0,50),(54,100,51,100),(101,360,101,150),(361,649,151,200)],&lt;br /&gt;
&lt;br /&gt;
&#039;SO2&#039;:   [(0,35,0,50),(36,75,51,100),(76,185,101,150),(186,304,151,200)],&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
def linear_scale(self, C, C_low, C_high, I_low, I_high):&lt;br /&gt;
&lt;br /&gt;
return round((I_high - I_low) / (C_high - C_low) * (C - C_low) + I_low)&lt;br /&gt;
&lt;br /&gt;
def find_aqi_subindex(self, C, pollutant):&lt;br /&gt;
&lt;br /&gt;
for (C_low, C_high, I_low, I_high) in self.breakpoints[pollutant]:&lt;br /&gt;
&lt;br /&gt;
if C_low &amp;lt;= C &amp;lt;= C_high:&lt;br /&gt;
&lt;br /&gt;
return self.linear_scale(C, C_low, C_high, I_low, I_high)&lt;br /&gt;
&lt;br /&gt;
return None&lt;br /&gt;
&lt;br /&gt;
def scrape_categories(self):&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.URL, timeout=10)&lt;br /&gt;
&lt;br /&gt;
soup = BeautifulSoup(response.text, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
categories = {}&lt;br /&gt;
&lt;br /&gt;
blocks = soup.select(&amp;quot;.c-indice-polluant&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for block in blocks:&lt;br /&gt;
&lt;br /&gt;
title_tag = block.select_one(&amp;quot;.c-indice-polluant-title span&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cat_tag = block.select_one(&amp;quot;.home-map-legend-item span&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if title_tag and cat_tag:&lt;br /&gt;
&lt;br /&gt;
name = title_tag.get_text(strip=True).replace(&amp;quot;₂&amp;quot;, &amp;quot;2&amp;quot;).replace(&amp;quot;₃&amp;quot;, &amp;quot;3&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cat = cat_tag.get_text(strip=True)&lt;br /&gt;
&lt;br /&gt;
categories[name] = cat&lt;br /&gt;
&lt;br /&gt;
return categories&lt;br /&gt;
&lt;br /&gt;
def compute_aqi(self, categories):&lt;br /&gt;
&lt;br /&gt;
concentrations = {k: self.cat_to_conc[v][k] for k, v in categories.items() if k in self.cat_to_conc[v]}&lt;br /&gt;
&lt;br /&gt;
subindices = {k: self.find_aqi_subindex(concentrations[k], k) for k in concentrations}&lt;br /&gt;
&lt;br /&gt;
aqi_global = max(v for v in subindices.values() if v is not None)&lt;br /&gt;
&lt;br /&gt;
return aqi_global, subindices &lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
class MeteoRepository:&lt;br /&gt;
&lt;br /&gt;
def __init__(self, latitude=44.8378, longitude=-0.5792):&lt;br /&gt;
&lt;br /&gt;
self.latitude = latitude&lt;br /&gt;
&lt;br /&gt;
self.longitude = longitude&lt;br /&gt;
&lt;br /&gt;
self.api_url = (&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;nowiki&amp;gt;https://api.open-meteo.com/v1/forecast&amp;lt;/nowiki&amp;gt;?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
f&amp;quot;latitude={self.latitude}&amp;amp;longitude={self.longitude}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;hourly=temperature_2m,precipitation,weathercode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;current_weather=true&amp;amp;timezone=Europe%2FParis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
def get_weather(self):&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.api_url, timeout=10)&lt;br /&gt;
&lt;br /&gt;
data = response.json()&lt;br /&gt;
&lt;br /&gt;
return data.get(&amp;quot;current_weather&amp;quot;, {})&lt;br /&gt;
&lt;br /&gt;
def compute_weather_score(self, weather):&lt;br /&gt;
&lt;br /&gt;
wmo_scores = {&lt;br /&gt;
&lt;br /&gt;
0: 100, 1: 90, 2: 80, 3: 70, 45: 60, 48: 55,&lt;br /&gt;
&lt;br /&gt;
51: 50, 53: 45, 55: 40, 61: 35, 63: 25, 65: 15,&lt;br /&gt;
&lt;br /&gt;
71: 25, 73: 15, 75: 5, 95: 10, 99: 0,&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
temp = weather.get(&amp;quot;temperature&amp;quot;, 20)&lt;br /&gt;
&lt;br /&gt;
wind = weather.get(&amp;quot;windspeed&amp;quot;, 10)&lt;br /&gt;
&lt;br /&gt;
code = weather.get(&amp;quot;weathercode&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
base_score = wmo_scores.get(code, 60)&lt;br /&gt;
&lt;br /&gt;
if temp &amp;lt; 0:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 30&lt;br /&gt;
&lt;br /&gt;
elif temp &amp;lt; 10:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 15&lt;br /&gt;
&lt;br /&gt;
elif temp &amp;gt; 30:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 20&lt;br /&gt;
&lt;br /&gt;
else:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 0&lt;br /&gt;
&lt;br /&gt;
wind_penalty = 0&lt;br /&gt;
&lt;br /&gt;
if wind &amp;gt; 40:&lt;br /&gt;
&lt;br /&gt;
wind_penalty = 20&lt;br /&gt;
&lt;br /&gt;
elif wind &amp;gt; 25:&lt;br /&gt;
&lt;br /&gt;
wind_penalty = 10&lt;br /&gt;
&lt;br /&gt;
score = base_score - temp_penalty - wind_penalty&lt;br /&gt;
&lt;br /&gt;
return round(max(0, min(100, score)))&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
class TrafficRepository:&lt;br /&gt;
&lt;br /&gt;
BASE_URL = &amp;quot;&amp;lt;nowiki&amp;gt;https://data.bordeaux-metropole.fr/geojson&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def __init__(self, api_key=&amp;quot;2HH8S7FKPP&amp;quot;, typename=&amp;quot;ci_trafi_l&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
self.api_key = api_key&lt;br /&gt;
&lt;br /&gt;
self.typename = typename&lt;br /&gt;
&lt;br /&gt;
def get_traffic_by_gid(self, gid=2215):&lt;br /&gt;
&lt;br /&gt;
params = {&lt;br /&gt;
&lt;br /&gt;
&amp;quot;key&amp;quot;: self.api_key,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;typename&amp;quot;: self.typename,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;filter&amp;quot;: json.dumps({&amp;quot;gid&amp;quot;: gid}),&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.BASE_URL, params=params, timeout=10)&lt;br /&gt;
&lt;br /&gt;
if response.status_code != 200:&lt;br /&gt;
&lt;br /&gt;
raise Exception(f&amp;quot;Erreur API {response.status_code} : {response.text}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
return response.json()&lt;br /&gt;
&lt;br /&gt;
def compute_traffic_score(self, traffic_data):&lt;br /&gt;
&lt;br /&gt;
features = traffic_data.get(&amp;quot;features&amp;quot;, [])&lt;br /&gt;
&lt;br /&gt;
if not features:&lt;br /&gt;
&lt;br /&gt;
return 50&lt;br /&gt;
&lt;br /&gt;
props = features[0].get(&amp;quot;properties&amp;quot;, {})&lt;br /&gt;
&lt;br /&gt;
etat = props.get(&amp;quot;etat_trafic&amp;quot;) or props.get(&amp;quot;etat&amp;quot;) or &amp;quot;INCONNU&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mapping = {&amp;quot;FLUIDE&amp;quot;: 100, &amp;quot;RALENTI&amp;quot;: 70, &amp;quot;EMBOUTEILLE&amp;quot;: 30, &amp;quot;INCONNU&amp;quot;: 50}&lt;br /&gt;
&lt;br /&gt;
return mapping.get(etat.upper(), 50)&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
from datetime import datetime, timezone&lt;br /&gt;
&lt;br /&gt;
class TbmRepository:&lt;br /&gt;
&lt;br /&gt;
BASE_URL = &amp;quot;&amp;lt;nowiki&amp;gt;https://data.bordeaux-metropole.fr/geojson&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def __init__(self, api_key=&amp;quot;2HH8S7FKPP&amp;quot;, arret_id=4037):&lt;br /&gt;
&lt;br /&gt;
self.api_key = api_key&lt;br /&gt;
&lt;br /&gt;
self.arret_id = arret_id&lt;br /&gt;
&lt;br /&gt;
def get_next_tram(self, max_results=100):&lt;br /&gt;
&lt;br /&gt;
params = {&lt;br /&gt;
&lt;br /&gt;
&amp;quot;key&amp;quot;: self.api_key,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;typename&amp;quot;: &amp;quot;sv_horai_a&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;filter&amp;quot;: json.dumps({&amp;quot;rs_sv_arret_p&amp;quot;: self.arret_id}),&lt;br /&gt;
&lt;br /&gt;
&amp;quot;orderby&amp;quot;: json.dumps([&amp;quot;hor_theo&amp;quot;]),&lt;br /&gt;
&lt;br /&gt;
&amp;quot;maxfeatures&amp;quot;: max_results&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.BASE_URL, params=params)&lt;br /&gt;
&lt;br /&gt;
response.raise_for_status()&lt;br /&gt;
&lt;br /&gt;
data = response.json()&lt;br /&gt;
&lt;br /&gt;
now = datetime.now(timezone.utc)&lt;br /&gt;
&lt;br /&gt;
for feature in data.get(&amp;quot;features&amp;quot;, []):&lt;br /&gt;
&lt;br /&gt;
props = feature.get(&amp;quot;properties&amp;quot;, {})&lt;br /&gt;
&lt;br /&gt;
hor_theo = props.get(&amp;quot;hor_theo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if not hor_theo:&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
&lt;br /&gt;
tram_time = datetime.fromisoformat(hor_theo)&lt;br /&gt;
&lt;br /&gt;
except ValueError:&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
if tram_time &amp;gt; now:&lt;br /&gt;
&lt;br /&gt;
diff_sec = int((tram_time - now).total_seconds())&lt;br /&gt;
&lt;br /&gt;
return {&amp;quot;heure&amp;quot;: tram_time, &amp;quot;seconds&amp;quot;: diff_sec, &amp;quot;etat&amp;quot;: props.get(&amp;quot;etat&amp;quot;), &amp;quot;type&amp;quot;: props.get(&amp;quot;type&amp;quot;)}&lt;br /&gt;
&lt;br /&gt;
return None&lt;br /&gt;
&lt;br /&gt;
from AQIRepository import AQIRepository&lt;br /&gt;
&lt;br /&gt;
from MeteoRepository import MeteoRepository&lt;br /&gt;
&lt;br /&gt;
from TrafficRepository import TrafficRepository&lt;br /&gt;
&lt;br /&gt;
from TramRepository import TbmRepository&lt;br /&gt;
&lt;br /&gt;
from fastapi import FastAPI&lt;br /&gt;
&lt;br /&gt;
app = FastAPI()&lt;br /&gt;
&lt;br /&gt;
@app.get(&amp;quot;/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def read_root():&lt;br /&gt;
&lt;br /&gt;
longitude = -0.5935101&lt;br /&gt;
&lt;br /&gt;
latitude = 44.8538665&lt;br /&gt;
&lt;br /&gt;
borneTraficGID = 2215&lt;br /&gt;
&lt;br /&gt;
Aqirepo = AQIRepository()&lt;br /&gt;
&lt;br /&gt;
categories = Aqirepo.scrape_categories()&lt;br /&gt;
&lt;br /&gt;
aqi, details = Aqirepo.compute_aqi(categories)&lt;br /&gt;
&lt;br /&gt;
meteo = MeteoRepository(latitude=latitude, longitude=longitude)&lt;br /&gt;
&lt;br /&gt;
weather = meteo.get_weather()&lt;br /&gt;
&lt;br /&gt;
score_M = meteo.compute_weather_score(weather)&lt;br /&gt;
&lt;br /&gt;
traffic = TrafficRepository()&lt;br /&gt;
&lt;br /&gt;
data = traffic.get_traffic_by_gid(borneTraficGID)&lt;br /&gt;
&lt;br /&gt;
score_T = traffic.compute_traffic_score(data)&lt;br /&gt;
&lt;br /&gt;
tbm = TbmRepository(arret_id=4037)&lt;br /&gt;
&lt;br /&gt;
prochain = tbm.get_next_tram()&lt;br /&gt;
&lt;br /&gt;
if prochain and &#039;seconds&#039; in prochain:&lt;br /&gt;
&lt;br /&gt;
TP_seconds = prochain[&#039;seconds&#039;]&lt;br /&gt;
&lt;br /&gt;
else:&lt;br /&gt;
&lt;br /&gt;
TP_seconds = 3600&lt;br /&gt;
&lt;br /&gt;
max_tp_seconds = 3600&lt;br /&gt;
&lt;br /&gt;
TP_score = max(0, min(100, 100 - (TP_seconds / max_tp_seconds) * 100))&lt;br /&gt;
&lt;br /&gt;
IMR = (&lt;br /&gt;
&lt;br /&gt;
0.4 * (100 - aqi) +&lt;br /&gt;
&lt;br /&gt;
0.3 * (100 - score_T) +&lt;br /&gt;
&lt;br /&gt;
0.2 * TP_score +&lt;br /&gt;
&lt;br /&gt;
0.1 * score_M&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
return {&amp;quot;IMR&amp;quot;: round(IMR, 1)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.46.41.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Monter les éléments de la maquette et effectuer les tests&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_IMG_0308.jpeg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_IMG_0345.mov&lt;br /&gt;
|Step_Picture_02=Mobi_BOX_IMG_0418.jpeg&lt;br /&gt;
|Step_Picture_03=Mobi_BOX_IMG_0384.mov&lt;br /&gt;
|Step_Picture_04=Mobi_BOX_IMG_1836.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Vidéo final&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_POCL.mp4&lt;br /&gt;
}}&lt;br /&gt;
{{Notes&lt;br /&gt;
|Observations=Une rotation d’un cache dévoilé le moyen de transport conseillé à l’instant t.&lt;br /&gt;
|Avertissement=Connexion&lt;br /&gt;
&lt;br /&gt;
Disponibilité des Api externe&lt;br /&gt;
|Explanations=L’esp appelle une api sur un serveur (api en fast api). Cette api va appeler les autres apis et faire les calcule.&lt;br /&gt;
&lt;br /&gt;
Cette architecture permet de ne pas être limité par l’esp niveau performance.&lt;br /&gt;
|Applications=Ils sont installés dans les lieux publics, aux arrêts de tramway, aux stations de bus et dans les taxis, et sont signalés par un panneau indiquant leur présence.&lt;br /&gt;
|Related=- Ajouter un GPS afin d’avoir la position dynamiquement.&lt;br /&gt;
&lt;br /&gt;
- Ajouter un capteur qui permet d’analyser la qualité de l’air pour ne plus dépendre d’un service tier et être  plus précis&lt;br /&gt;
|Objectives=Améliorer notre capacité à travailler en équipe Améliorer notre capacité à s’adapter au différent profils et compétence des membres de notre équipe (oral, méthode de travail, contrainte)&lt;br /&gt;
|Notes=https://datahub.bordeaux-metropole.fr/pages/accueil/&lt;br /&gt;
&lt;br /&gt;
https://fastapi.tiangolo.com/&lt;br /&gt;
&lt;br /&gt;
https://open-meteo.com/&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_POCL.mp4&amp;diff=22763</id>
		<title>Fichier:Mobi BOX POCL.mp4</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_POCL.mp4&amp;diff=22763"/>
		<updated>2026-05-30T12:03:07Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_POCL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_POCL&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22762</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22762"/>
		<updated>2026-05-30T11:56:58Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Main_Picture=Mobi_BOX_IMG_0412.jpeg&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Un dispositif fournissant des informations en temps réel sur la pertinence d’utiliser une voiture ou les transports en commun, en évaluant la qualité de l’air, les niveaux de pollution atmosphérique ainsi que la disponibilité des différents moyens de transport dans la zone&lt;br /&gt;
|Disciplines scientifiques=Arduino, Computing, Electricity, Mechanics&lt;br /&gt;
|Difficulty=Expert&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
|Tags=Pollution, transport, mobilité, qualité de l’air&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction&lt;br /&gt;
|Introduction=pour présenter l’expérience ou la réalisation technique de manière attractive.&lt;br /&gt;
}}&lt;br /&gt;
{{Materials&lt;br /&gt;
|ItemList={{ItemList&lt;br /&gt;
|Item=Découpeuse laser&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Moteur électrique&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Imprimante 3D&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=LED&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Boite en carton&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=ESP32&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Comprendre le terme ( Mobilité de transport commun)&lt;br /&gt;
|Step_Content=Chaque participant partage sa compréhension du thème. Toutes les idées et les mots-clés sont ensuite notés et organisés sous forme de schéma.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_IMG_1827.jpeg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_IMG_1829.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Recherche dans les sources disponibles&lt;br /&gt;
|Step_Content=Analyse des sources disponibles sur les sites de TBM et de Bordeaux Métropole pour identifier les bénéfices environnementaux du tramway et du réseau de bus.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.55.11.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Élaboration d’un schéma préliminaire&lt;br /&gt;
|Step_Content=Conception d’une machine capable d’analyser la qualité de l’air et le trafic, afin de proposer le meilleur moyen de transport entre bus, tram, voiture ou taxi.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_IMG_1832.jpeg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_Capture_d_e_cran_2025-12-05_a_10.36.02.png&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Choisir les matériaux pour la maquette&lt;br /&gt;
|Step_Content=Bois, LED, papier transparent, éléments imprimés en 3D, ainsi que des cartes électroniques pour la rotation et l’éclairage des LED.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_93993C_zoo.jpg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_IMG_0413.jpeg&lt;br /&gt;
|Step_Picture_02=Mobi_BOX_IMG_0333.mov&lt;br /&gt;
|Step_Picture_03=Mobi_BOX_IMG_0326.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Programmation sur Python&lt;br /&gt;
|Step_Content=import requests&lt;br /&gt;
&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
&lt;br /&gt;
class AQIRepository:&lt;br /&gt;
&lt;br /&gt;
URL = &amp;quot;&amp;lt;nowiki&amp;gt;https://www.atmo-nouvelleaquitaine.org/air-commune/Bordeaux/33063/indice-atmo?date=2025-10-14&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def __init__(self):&lt;br /&gt;
&lt;br /&gt;
self.cat_to_conc = {&lt;br /&gt;
&lt;br /&gt;
&#039;Bon&#039;:    {&#039;PM2.5&#039;: 5.0,  &#039;PM10&#039;: 15.0, &#039;O3&#039;: 0.040, &#039;NO2&#039;: 20.0, &#039;SO2&#039;: 5.0},&lt;br /&gt;
&lt;br /&gt;
&#039;Moyen&#039;:  {&#039;PM2.5&#039;: 20.0, &#039;PM10&#039;: 40.0, &#039;O3&#039;: 0.060, &#039;NO2&#039;: 60.0, &#039;SO2&#039;: 20.0},&lt;br /&gt;
&lt;br /&gt;
&#039;Mauvais&#039;:{&#039;PM2.5&#039;: 40.0, &#039;PM10&#039;: 100.0,&#039;O3&#039;: 0.100, &#039;NO2&#039;: 150.0,&#039;SO2&#039;: 100.0},&lt;br /&gt;
&lt;br /&gt;
&#039;Très mauvais&#039;:{&#039;PM2.5&#039;:120.0,&#039;PM10&#039;:300.0,&#039;O3&#039;:0.180,&#039;NO2&#039;:800.0,&#039;SO2&#039;:500.0}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
self.breakpoints = {&lt;br /&gt;
&lt;br /&gt;
&#039;PM2.5&#039;: [(0.0,12.0,0,50),(12.1,35.4,51,100),(35.5,55.4,101,150),(55.5,150.4,151,200)],&lt;br /&gt;
&lt;br /&gt;
&#039;PM10&#039;:  [(0,54,0,50),(55,154,51,100),(155,254,101,150),(255,354,151,200)],&lt;br /&gt;
&lt;br /&gt;
&#039;O3&#039;:    [(0.000,0.054,0,50),(0.055,0.070,51,100),(0.071,0.085,101,150)],&lt;br /&gt;
&lt;br /&gt;
&#039;NO2&#039;:   [(0,53,0,50),(54,100,51,100),(101,360,101,150),(361,649,151,200)],&lt;br /&gt;
&lt;br /&gt;
&#039;SO2&#039;:   [(0,35,0,50),(36,75,51,100),(76,185,101,150),(186,304,151,200)],&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
def linear_scale(self, C, C_low, C_high, I_low, I_high):&lt;br /&gt;
&lt;br /&gt;
return round((I_high - I_low) / (C_high - C_low) * (C - C_low) + I_low)&lt;br /&gt;
&lt;br /&gt;
def find_aqi_subindex(self, C, pollutant):&lt;br /&gt;
&lt;br /&gt;
for (C_low, C_high, I_low, I_high) in self.breakpoints[pollutant]:&lt;br /&gt;
&lt;br /&gt;
if C_low &amp;lt;= C &amp;lt;= C_high:&lt;br /&gt;
&lt;br /&gt;
return self.linear_scale(C, C_low, C_high, I_low, I_high)&lt;br /&gt;
&lt;br /&gt;
return None&lt;br /&gt;
&lt;br /&gt;
def scrape_categories(self):&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.URL, timeout=10)&lt;br /&gt;
&lt;br /&gt;
soup = BeautifulSoup(response.text, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
categories = {}&lt;br /&gt;
&lt;br /&gt;
blocks = soup.select(&amp;quot;.c-indice-polluant&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for block in blocks:&lt;br /&gt;
&lt;br /&gt;
title_tag = block.select_one(&amp;quot;.c-indice-polluant-title span&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cat_tag = block.select_one(&amp;quot;.home-map-legend-item span&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if title_tag and cat_tag:&lt;br /&gt;
&lt;br /&gt;
name = title_tag.get_text(strip=True).replace(&amp;quot;₂&amp;quot;, &amp;quot;2&amp;quot;).replace(&amp;quot;₃&amp;quot;, &amp;quot;3&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cat = cat_tag.get_text(strip=True)&lt;br /&gt;
&lt;br /&gt;
categories[name] = cat&lt;br /&gt;
&lt;br /&gt;
return categories&lt;br /&gt;
&lt;br /&gt;
def compute_aqi(self, categories):&lt;br /&gt;
&lt;br /&gt;
concentrations = {k: self.cat_to_conc[v][k] for k, v in categories.items() if k in self.cat_to_conc[v]}&lt;br /&gt;
&lt;br /&gt;
subindices = {k: self.find_aqi_subindex(concentrations[k], k) for k in concentrations}&lt;br /&gt;
&lt;br /&gt;
aqi_global = max(v for v in subindices.values() if v is not None)&lt;br /&gt;
&lt;br /&gt;
return aqi_global, subindices &lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
class MeteoRepository:&lt;br /&gt;
&lt;br /&gt;
def __init__(self, latitude=44.8378, longitude=-0.5792):&lt;br /&gt;
&lt;br /&gt;
self.latitude = latitude&lt;br /&gt;
&lt;br /&gt;
self.longitude = longitude&lt;br /&gt;
&lt;br /&gt;
self.api_url = (&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;nowiki&amp;gt;https://api.open-meteo.com/v1/forecast&amp;lt;/nowiki&amp;gt;?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
f&amp;quot;latitude={self.latitude}&amp;amp;longitude={self.longitude}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;hourly=temperature_2m,precipitation,weathercode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;current_weather=true&amp;amp;timezone=Europe%2FParis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
def get_weather(self):&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.api_url, timeout=10)&lt;br /&gt;
&lt;br /&gt;
data = response.json()&lt;br /&gt;
&lt;br /&gt;
return data.get(&amp;quot;current_weather&amp;quot;, {})&lt;br /&gt;
&lt;br /&gt;
def compute_weather_score(self, weather):&lt;br /&gt;
&lt;br /&gt;
wmo_scores = {&lt;br /&gt;
&lt;br /&gt;
0: 100, 1: 90, 2: 80, 3: 70, 45: 60, 48: 55,&lt;br /&gt;
&lt;br /&gt;
51: 50, 53: 45, 55: 40, 61: 35, 63: 25, 65: 15,&lt;br /&gt;
&lt;br /&gt;
71: 25, 73: 15, 75: 5, 95: 10, 99: 0,&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
temp = weather.get(&amp;quot;temperature&amp;quot;, 20)&lt;br /&gt;
&lt;br /&gt;
wind = weather.get(&amp;quot;windspeed&amp;quot;, 10)&lt;br /&gt;
&lt;br /&gt;
code = weather.get(&amp;quot;weathercode&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
base_score = wmo_scores.get(code, 60)&lt;br /&gt;
&lt;br /&gt;
if temp &amp;lt; 0:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 30&lt;br /&gt;
&lt;br /&gt;
elif temp &amp;lt; 10:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 15&lt;br /&gt;
&lt;br /&gt;
elif temp &amp;gt; 30:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 20&lt;br /&gt;
&lt;br /&gt;
else:&lt;br /&gt;
&lt;br /&gt;
temp_penalty = 0&lt;br /&gt;
&lt;br /&gt;
wind_penalty = 0&lt;br /&gt;
&lt;br /&gt;
if wind &amp;gt; 40:&lt;br /&gt;
&lt;br /&gt;
wind_penalty = 20&lt;br /&gt;
&lt;br /&gt;
elif wind &amp;gt; 25:&lt;br /&gt;
&lt;br /&gt;
wind_penalty = 10&lt;br /&gt;
&lt;br /&gt;
score = base_score - temp_penalty - wind_penalty&lt;br /&gt;
&lt;br /&gt;
return round(max(0, min(100, score)))&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
class TrafficRepository:&lt;br /&gt;
&lt;br /&gt;
BASE_URL = &amp;quot;&amp;lt;nowiki&amp;gt;https://data.bordeaux-metropole.fr/geojson&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def __init__(self, api_key=&amp;quot;2HH8S7FKPP&amp;quot;, typename=&amp;quot;ci_trafi_l&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
self.api_key = api_key&lt;br /&gt;
&lt;br /&gt;
self.typename = typename&lt;br /&gt;
&lt;br /&gt;
def get_traffic_by_gid(self, gid=2215):&lt;br /&gt;
&lt;br /&gt;
params = {&lt;br /&gt;
&lt;br /&gt;
&amp;quot;key&amp;quot;: self.api_key,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;typename&amp;quot;: self.typename,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;filter&amp;quot;: json.dumps({&amp;quot;gid&amp;quot;: gid}),&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.BASE_URL, params=params, timeout=10)&lt;br /&gt;
&lt;br /&gt;
if response.status_code != 200:&lt;br /&gt;
&lt;br /&gt;
raise Exception(f&amp;quot;Erreur API {response.status_code} : {response.text}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
return response.json()&lt;br /&gt;
&lt;br /&gt;
def compute_traffic_score(self, traffic_data):&lt;br /&gt;
&lt;br /&gt;
features = traffic_data.get(&amp;quot;features&amp;quot;, [])&lt;br /&gt;
&lt;br /&gt;
if not features:&lt;br /&gt;
&lt;br /&gt;
return 50&lt;br /&gt;
&lt;br /&gt;
props = features[0].get(&amp;quot;properties&amp;quot;, {})&lt;br /&gt;
&lt;br /&gt;
etat = props.get(&amp;quot;etat_trafic&amp;quot;) or props.get(&amp;quot;etat&amp;quot;) or &amp;quot;INCONNU&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mapping = {&amp;quot;FLUIDE&amp;quot;: 100, &amp;quot;RALENTI&amp;quot;: 70, &amp;quot;EMBOUTEILLE&amp;quot;: 30, &amp;quot;INCONNU&amp;quot;: 50}&lt;br /&gt;
&lt;br /&gt;
return mapping.get(etat.upper(), 50)&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
from datetime import datetime, timezone&lt;br /&gt;
&lt;br /&gt;
class TbmRepository:&lt;br /&gt;
&lt;br /&gt;
BASE_URL = &amp;quot;&amp;lt;nowiki&amp;gt;https://data.bordeaux-metropole.fr/geojson&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def __init__(self, api_key=&amp;quot;2HH8S7FKPP&amp;quot;, arret_id=4037):&lt;br /&gt;
&lt;br /&gt;
self.api_key = api_key&lt;br /&gt;
&lt;br /&gt;
self.arret_id = arret_id&lt;br /&gt;
&lt;br /&gt;
def get_next_tram(self, max_results=100):&lt;br /&gt;
&lt;br /&gt;
params = {&lt;br /&gt;
&lt;br /&gt;
&amp;quot;key&amp;quot;: self.api_key,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;typename&amp;quot;: &amp;quot;sv_horai_a&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;filter&amp;quot;: json.dumps({&amp;quot;rs_sv_arret_p&amp;quot;: self.arret_id}),&lt;br /&gt;
&lt;br /&gt;
&amp;quot;orderby&amp;quot;: json.dumps([&amp;quot;hor_theo&amp;quot;]),&lt;br /&gt;
&lt;br /&gt;
&amp;quot;maxfeatures&amp;quot;: max_results&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
response = requests.get(self.BASE_URL, params=params)&lt;br /&gt;
&lt;br /&gt;
response.raise_for_status()&lt;br /&gt;
&lt;br /&gt;
data = response.json()&lt;br /&gt;
&lt;br /&gt;
now = datetime.now(timezone.utc)&lt;br /&gt;
&lt;br /&gt;
for feature in data.get(&amp;quot;features&amp;quot;, []):&lt;br /&gt;
&lt;br /&gt;
props = feature.get(&amp;quot;properties&amp;quot;, {})&lt;br /&gt;
&lt;br /&gt;
hor_theo = props.get(&amp;quot;hor_theo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if not hor_theo:&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
&lt;br /&gt;
tram_time = datetime.fromisoformat(hor_theo)&lt;br /&gt;
&lt;br /&gt;
except ValueError:&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
if tram_time &amp;gt; now:&lt;br /&gt;
&lt;br /&gt;
diff_sec = int((tram_time - now).total_seconds())&lt;br /&gt;
&lt;br /&gt;
return {&amp;quot;heure&amp;quot;: tram_time, &amp;quot;seconds&amp;quot;: diff_sec, &amp;quot;etat&amp;quot;: props.get(&amp;quot;etat&amp;quot;), &amp;quot;type&amp;quot;: props.get(&amp;quot;type&amp;quot;)}&lt;br /&gt;
&lt;br /&gt;
return None&lt;br /&gt;
&lt;br /&gt;
from AQIRepository import AQIRepository&lt;br /&gt;
&lt;br /&gt;
from MeteoRepository import MeteoRepository&lt;br /&gt;
&lt;br /&gt;
from TrafficRepository import TrafficRepository&lt;br /&gt;
&lt;br /&gt;
from TramRepository import TbmRepository&lt;br /&gt;
&lt;br /&gt;
from fastapi import FastAPI&lt;br /&gt;
&lt;br /&gt;
app = FastAPI()&lt;br /&gt;
&lt;br /&gt;
@app.get(&amp;quot;/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def read_root():&lt;br /&gt;
&lt;br /&gt;
longitude = -0.5935101&lt;br /&gt;
&lt;br /&gt;
latitude = 44.8538665&lt;br /&gt;
&lt;br /&gt;
borneTraficGID = 2215&lt;br /&gt;
&lt;br /&gt;
Aqirepo = AQIRepository()&lt;br /&gt;
&lt;br /&gt;
categories = Aqirepo.scrape_categories()&lt;br /&gt;
&lt;br /&gt;
aqi, details = Aqirepo.compute_aqi(categories)&lt;br /&gt;
&lt;br /&gt;
meteo = MeteoRepository(latitude=latitude, longitude=longitude)&lt;br /&gt;
&lt;br /&gt;
weather = meteo.get_weather()&lt;br /&gt;
&lt;br /&gt;
score_M = meteo.compute_weather_score(weather)&lt;br /&gt;
&lt;br /&gt;
traffic = TrafficRepository()&lt;br /&gt;
&lt;br /&gt;
data = traffic.get_traffic_by_gid(borneTraficGID)&lt;br /&gt;
&lt;br /&gt;
score_T = traffic.compute_traffic_score(data)&lt;br /&gt;
&lt;br /&gt;
tbm = TbmRepository(arret_id=4037)&lt;br /&gt;
&lt;br /&gt;
prochain = tbm.get_next_tram()&lt;br /&gt;
&lt;br /&gt;
if prochain and &#039;seconds&#039; in prochain:&lt;br /&gt;
&lt;br /&gt;
TP_seconds = prochain[&#039;seconds&#039;]&lt;br /&gt;
&lt;br /&gt;
else:&lt;br /&gt;
&lt;br /&gt;
TP_seconds = 3600&lt;br /&gt;
&lt;br /&gt;
max_tp_seconds = 3600&lt;br /&gt;
&lt;br /&gt;
TP_score = max(0, min(100, 100 - (TP_seconds / max_tp_seconds) * 100))&lt;br /&gt;
&lt;br /&gt;
IMR = (&lt;br /&gt;
&lt;br /&gt;
0.4 * (100 - aqi) +&lt;br /&gt;
&lt;br /&gt;
0.3 * (100 - score_T) +&lt;br /&gt;
&lt;br /&gt;
0.2 * TP_score +&lt;br /&gt;
&lt;br /&gt;
0.1 * score_M&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
return {&amp;quot;IMR&amp;quot;: round(IMR, 1)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.46.41.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Monter les éléments de la maquette et effectuer les tests&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_IMG_0308.jpeg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_IMG_0345.mov&lt;br /&gt;
|Step_Picture_02=Mobi_BOX_IMG_0418.jpeg&lt;br /&gt;
|Step_Picture_03=Mobi_BOX_IMG_0384.mov&lt;br /&gt;
|Step_Picture_04=Mobi_BOX_IMG_1836.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Vidéo final&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_WhatsApp_Video_2026-05-30_at_13.25.57.mp4&lt;br /&gt;
}}&lt;br /&gt;
{{Notes&lt;br /&gt;
|Observations=Une rotation d’un cache dévoilé le moyen de transport conseillé à l’instant t.&lt;br /&gt;
|Avertissement=Connexion&lt;br /&gt;
&lt;br /&gt;
Disponibilité des Api externe&lt;br /&gt;
|Explanations=L’esp appelle une api sur un serveur (api en fast api). Cette api va appeler les autres apis et faire les calcule.&lt;br /&gt;
&lt;br /&gt;
Cette architecture permet de ne pas être limité par l’esp niveau performance.&lt;br /&gt;
|Applications=Ils sont installés dans les lieux publics, aux arrêts de tramway, aux stations de bus et dans les taxis, et sont signalés par un panneau indiquant leur présence.&lt;br /&gt;
|Related=- Ajouter un GPS afin d’avoir la position dynamiquement.&lt;br /&gt;
&lt;br /&gt;
- Ajouter un capteur qui permet d’analyser la qualité de l’air pour ne plus dépendre d’un service tier et être  plus précis&lt;br /&gt;
|Objectives=Améliorer notre capacité à travailler en équipe Améliorer notre capacité à s’adapter au différent profils et compétence des membres de notre équipe (oral, méthode de travail, contrainte)&lt;br /&gt;
|Notes=https://datahub.bordeaux-metropole.fr/pages/accueil/&lt;br /&gt;
&lt;br /&gt;
https://fastapi.tiangolo.com/&lt;br /&gt;
&lt;br /&gt;
https://open-meteo.com/&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_WhatsApp_Video_2026-05-30_at_13.25.57.mp4&amp;diff=22761</id>
		<title>Fichier:Mobi BOX WhatsApp Video 2026-05-30 at 13.25.57.mp4</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_WhatsApp_Video_2026-05-30_at_13.25.57.mp4&amp;diff=22761"/>
		<updated>2026-05-30T11:56:53Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_WhatsApp_Video_2026-05-30_at_13.25.57&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_WhatsApp_Video_2026-05-30_at_13.25.57&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.55.11.jpeg&amp;diff=22760</id>
		<title>Fichier:Mobi BOX WhatsApp Image 2026-05-30 at 13.55.11.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.55.11.jpeg&amp;diff=22760"/>
		<updated>2026-05-30T11:55:41Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.55.11&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.55.11&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0412.jpeg&amp;diff=22759</id>
		<title>Fichier:Mobi BOX IMG 0412.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0412.jpeg&amp;diff=22759"/>
		<updated>2026-05-30T11:53:43Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_0412&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_0412&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_1836.jpeg&amp;diff=22758</id>
		<title>Fichier:Mobi BOX IMG 1836.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_1836.jpeg&amp;diff=22758"/>
		<updated>2026-05-30T11:53:28Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_1836&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_1836&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0384.mov&amp;diff=22757</id>
		<title>Fichier:Mobi BOX IMG 0384.mov</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0384.mov&amp;diff=22757"/>
		<updated>2026-05-30T11:53:03Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_0384&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_0384&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0418.jpeg&amp;diff=22756</id>
		<title>Fichier:Mobi BOX IMG 0418.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0418.jpeg&amp;diff=22756"/>
		<updated>2026-05-30T11:51:20Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_0418&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_0418&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0345.mov&amp;diff=22755</id>
		<title>Fichier:Mobi BOX IMG 0345.mov</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0345.mov&amp;diff=22755"/>
		<updated>2026-05-30T11:50:39Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_0345&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_0345&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0308.jpeg&amp;diff=22754</id>
		<title>Fichier:Mobi BOX IMG 0308.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0308.jpeg&amp;diff=22754"/>
		<updated>2026-05-30T11:50:10Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_0308&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_0308&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.46.41.jpeg&amp;diff=22753</id>
		<title>Fichier:Mobi BOX WhatsApp Image 2026-05-30 at 13.46.41.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.46.41.jpeg&amp;diff=22753"/>
		<updated>2026-05-30T11:47:21Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.46.41&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_WhatsApp_Image_2026-05-30_at_13.46.41&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0326.jpeg&amp;diff=22752</id>
		<title>Fichier:Mobi BOX IMG 0326.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0326.jpeg&amp;diff=22752"/>
		<updated>2026-05-30T11:23:06Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_0326&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_0326&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0333.mov&amp;diff=22751</id>
		<title>Fichier:Mobi BOX IMG 0333.mov</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0333.mov&amp;diff=22751"/>
		<updated>2026-05-30T11:22:03Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_0333&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_0333&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0413.jpeg&amp;diff=22750</id>
		<title>Fichier:Mobi BOX IMG 0413.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0413.jpeg&amp;diff=22750"/>
		<updated>2026-05-30T11:21:42Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_0413&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_0413&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_93993C_zoo.jpg&amp;diff=22749</id>
		<title>Fichier:Mobi BOX 93993C zoo.jpg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_93993C_zoo.jpg&amp;diff=22749"/>
		<updated>2026-05-30T11:21:09Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_93993C_zoo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_93993C_zoo&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_Capture_d_e_cran_2025-12-05_a_10.36.02.png&amp;diff=22748</id>
		<title>Fichier:Mobi BOX Capture d e cran 2025-12-05 a 10.36.02.png</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_Capture_d_e_cran_2025-12-05_a_10.36.02.png&amp;diff=22748"/>
		<updated>2026-05-30T10:47:39Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_Capture_d_e_cran_2025-12-05_a_10.36.02&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_Capture_d_e_cran_2025-12-05_a_10.36.02&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_1832.jpeg&amp;diff=22747</id>
		<title>Fichier:Mobi BOX IMG 1832.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_1832.jpeg&amp;diff=22747"/>
		<updated>2026-05-30T10:47:31Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_1832&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_1832&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22746</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22746"/>
		<updated>2026-05-30T10:41:56Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Un dispositif fournissant des informations en temps réel sur la pertinence d’utiliser une voiture ou les transports en commun, en évaluant la qualité de l’air, les niveaux de pollution atmosphérique ainsi que la disponibilité des différents moyens de transport dans la zone&lt;br /&gt;
|Disciplines scientifiques=Arduino, Computing, Electricity, Mechanics&lt;br /&gt;
|Difficulty=Expert&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
|Tags=Pollution, transport, mobilité, qualité de l’air&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction&lt;br /&gt;
|Introduction=pour présenter l’expérience ou la réalisation technique de manière attractive.&lt;br /&gt;
}}&lt;br /&gt;
{{Materials&lt;br /&gt;
|ItemList={{ItemList&lt;br /&gt;
|Item=Découpeuse laser&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Moteur électrique&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Imprimante 3D&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=LED&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Boite en carton&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=ESP32&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Comprendre le terme ( Mobilité de transport commun)&lt;br /&gt;
|Step_Content=Chaque participant partage sa compréhension du thème. Toutes les idées et les mots-clés sont ensuite notés et organisés sous forme de schéma.&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_IMG_1827.jpeg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_IMG_1829.jpeg&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Recherche dans les sources disponibles&lt;br /&gt;
|Step_Content={{#annotatedImageLight:Fichier:Mobi BOX Image.png|0=800px|hash=|jsondata=|mediaClass=Image|type=frameless|align=center|src=https://www.wikidebrouillard.org/images/2/2e/Mobi_BOX_Image.png|href=./Fichier:Mobi BOX Image.png|resource=./Fichier:Mobi BOX Image.png|caption=|size=800px}}Analyse des sources disponibles sur les sites de TBM et de Bordeaux Métropole pour identifier les bénéfices environnementaux du tramway et du réseau de bus.&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Élaboration d’un schéma préliminaire&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Choisir les matériaux pour la maquette&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=les rôles des membres du groupe&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Découpe laser&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Programmation du système de rotation&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Monter les éléments de la maquette et effectuer les tests&lt;br /&gt;
}}&lt;br /&gt;
{{Notes&lt;br /&gt;
|Observations=Une rotation d’un cache dévoilé le moyen de transport conseillé à l’instant t.&lt;br /&gt;
|Avertissement=Connexion&lt;br /&gt;
&lt;br /&gt;
Disponibilité des Api externe&lt;br /&gt;
|Explanations=L’esp appelle une api sur un serveur (api en fast api). Cette api va appeler les autres apis et faire les calcule.&lt;br /&gt;
&lt;br /&gt;
Cette architecture permet de ne pas être limité par l’esp niveau performance.&lt;br /&gt;
|Applications=Ils sont installés dans les lieux publics, aux arrêts de tramway, aux stations de bus et dans les taxis, et sont signalés par un panneau indiquant leur présence.&lt;br /&gt;
|Related=- Ajouter un GPS afin d’avoir la position dynamiquement.&lt;br /&gt;
&lt;br /&gt;
- Ajouter un capteur qui permet d’analyser la qualité de l’air pour ne plus dépendre d’un service tier et être  plus précis&lt;br /&gt;
|Objectives=Améliorer notre capacité à travailler en équipe Améliorer notre capacité à s’adapter au différent profils et compétence des membres de notre équipe (oral, méthode de travail, contrainte)&lt;br /&gt;
|Notes=https://datahub.bordeaux-metropole.fr/pages/accueil/&lt;br /&gt;
&lt;br /&gt;
https://fastapi.tiangolo.com/&lt;br /&gt;
&lt;br /&gt;
https://open-meteo.com/&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_Image.png&amp;diff=22745</id>
		<title>Fichier:Mobi BOX Image.png</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_Image.png&amp;diff=22745"/>
		<updated>2026-05-30T10:41:25Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22744</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22744"/>
		<updated>2026-05-30T10:29:50Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Un dispositif fournissant des informations en temps réel sur la pertinence d’utiliser une voiture ou les transports en commun, en évaluant la qualité de l’air, les niveaux de pollution atmosphérique ainsi que la disponibilité des différents moyens de transport dans la zone&lt;br /&gt;
|Disciplines scientifiques=Arduino, Computing, Electricity, Mechanics&lt;br /&gt;
|Difficulty=Expert&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
|Tags=Pollution, transport, mobilité, qualité de l’air&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction&lt;br /&gt;
|Introduction=pour présenter l’expérience ou la réalisation technique de manière attractive.&lt;br /&gt;
}}&lt;br /&gt;
{{Materials&lt;br /&gt;
|ItemList={{ItemList&lt;br /&gt;
|Item=Découpeuse laser&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Moteur électrique&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Imprimante 3D&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=LED&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Boite en carton&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=ESP32&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Comprendre le terme ( Mobilité de transport commun)&lt;br /&gt;
|Step_Picture_00=Mobi_BOX_IMG_1827.jpeg&lt;br /&gt;
|Step_Picture_01=Mobi_BOX_IMG_1829.jpeg&lt;br /&gt;
|Step_Picture_02=Mobi_BOX_IMG_0365.mov&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Identifier le problème visé par notre projet&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Recherche dans les sources disponibles&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Élaboration d’un schéma préliminaire&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Choisir les matériaux pour la maquette&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=les rôles des membres du groupe&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Découpe laser&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Programmation du système de rotation&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Monter les éléments de la maquette et effectuer les tests&lt;br /&gt;
}}&lt;br /&gt;
{{Notes&lt;br /&gt;
|Observations=Une rotation d’un cache dévoilé le moyen de transport conseillé à l’instant t.&lt;br /&gt;
|Avertissement=Connexion&lt;br /&gt;
&lt;br /&gt;
Disponibilité des Api externe&lt;br /&gt;
|Explanations=L’esp appelle une api sur un serveur (api en fast api). Cette api va appeler les autres apis et faire les calcule.&lt;br /&gt;
&lt;br /&gt;
Cette architecture permet de ne pas être limité par l’esp niveau performance.&lt;br /&gt;
|Applications=Ils sont installés dans les lieux publics, aux arrêts de tramway, aux stations de bus et dans les taxis, et sont signalés par un panneau indiquant leur présence.&lt;br /&gt;
|Related=- Ajouter un GPS afin d’avoir la position dynamiquement.&lt;br /&gt;
&lt;br /&gt;
- Ajouter un capteur qui permet d’analyser la qualité de l’air pour ne plus dépendre d’un service tier et être  plus précis&lt;br /&gt;
|Objectives=Améliorer notre capacité à travailler en équipe Améliorer notre capacité à s’adapter au différent profils et compétence des membres de notre équipe (oral, méthode de travail, contrainte)&lt;br /&gt;
|Notes=https://datahub.bordeaux-metropole.fr/pages/accueil/&lt;br /&gt;
&lt;br /&gt;
https://fastapi.tiangolo.com/&lt;br /&gt;
&lt;br /&gt;
https://open-meteo.com/&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0365.mov&amp;diff=22743</id>
		<title>Fichier:Mobi BOX IMG 0365.mov</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_0365.mov&amp;diff=22743"/>
		<updated>2026-05-30T10:29:39Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_0365&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_0365&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_1829.jpeg&amp;diff=22742</id>
		<title>Fichier:Mobi BOX IMG 1829.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_1829.jpeg&amp;diff=22742"/>
		<updated>2026-05-30T10:29:28Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_1829&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_1829&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_1827.jpeg&amp;diff=22741</id>
		<title>Fichier:Mobi BOX IMG 1827.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_IMG_1827.jpeg&amp;diff=22741"/>
		<updated>2026-05-30T10:29:15Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_IMG_1827&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_IMG_1827&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_WhatsApp_Image_2025-12-12_at_13.42.09.jpeg&amp;diff=22111</id>
		<title>Fichier:Mobi BOX WhatsApp Image 2025-12-12 at 13.42.09.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Fichier:Mobi_BOX_WhatsApp_Image_2025-12-12_at_13.42.09.jpeg&amp;diff=22111"/>
		<updated>2025-12-12T14:40:11Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Mobi_BOX_WhatsApp_Image_2025-12-12_at_13.42.09&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mobi_BOX_WhatsApp_Image_2025-12-12_at_13.42.09&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22037</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22037"/>
		<updated>2025-12-11T14:35:03Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Un dispositif fournissant des informations en temps réel sur la pertinence d’utiliser une voiture ou les transports en commun, en évaluant la qualité de l’air, les niveaux de pollution atmosphérique ainsi que la disponibilité des différents moyens de transport dans la zone&lt;br /&gt;
|Disciplines scientifiques=Arduino, Computing, Electricity, Mechanics&lt;br /&gt;
|Difficulty=Expert&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
|Tags=Pollution, transport, mobilité, qualité de l’air&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction&lt;br /&gt;
|Introduction=pour présenter l’expérience ou la réalisation technique de manière attractive.&lt;br /&gt;
}}&lt;br /&gt;
{{Materials&lt;br /&gt;
|ItemList={{ItemList&lt;br /&gt;
|Item=Découpeuse laser&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Moteur électrique&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Imprimante 3D&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=LED&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Boite en carton&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=ESP32&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Comprendre le terme ( Mobilité de transport commun)&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Identifier le problème visé par notre projet&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Recherche dans les sources disponibles&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Élaboration d’un schéma préliminaire&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Choisir les matériaux pour la maquette&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=les rôles des membres du groupe&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Découpe laser&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Programmation du système de rotation&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Monter les éléments de la maquette et effectuer les tests&lt;br /&gt;
}}&lt;br /&gt;
{{Notes&lt;br /&gt;
|Observations=Une rotation d’un cache dévoilé le moyen de transport conseillé à l’instant t.&lt;br /&gt;
|Avertissement=Connexion&lt;br /&gt;
&lt;br /&gt;
Disponibilité des Api externe&lt;br /&gt;
|Explanations=L’esp appelle une api sur un serveur (api en fast api). Cette api va appeler les autres apis et faire les calcule.&lt;br /&gt;
&lt;br /&gt;
Cette architecture permet de ne pas être limité par l’esp niveau performance.&lt;br /&gt;
|Applications=Ils sont installés dans les lieux publics, aux arrêts de tramway, aux stations de bus et dans les taxis, et sont signalés par un panneau indiquant leur présence.&lt;br /&gt;
|Related=- Ajouter un GPS afin d’avoir la position dynamiquement.&lt;br /&gt;
&lt;br /&gt;
- Ajouter un capteur qui permet d’analyser la qualité de l’air pour ne plus dépendre d’un service tier et être  plus précis&lt;br /&gt;
|Objectives=Améliorer notre capacité à travailler en équipe Améliorer notre capacité à s’adapter au différent profils et compétence des membres de notre équipe (oral, méthode de travail, contrainte)&lt;br /&gt;
|Notes=https://datahub.bordeaux-metropole.fr/pages/accueil/&lt;br /&gt;
&lt;br /&gt;
https://fastapi.tiangolo.com/&lt;br /&gt;
&lt;br /&gt;
https://open-meteo.com/&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22036</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22036"/>
		<updated>2025-12-11T14:10:49Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Un dispositif fournissant des informations en temps réel sur la pertinence d’utiliser une voiture ou les transports en commun, en évaluant la qualité de l’air, les niveaux de pollution atmosphérique ainsi que la disponibilité des différents moyens de transport dans la zone&lt;br /&gt;
|Disciplines scientifiques=Arduino, Computing, Electricity, Mechanics&lt;br /&gt;
|Difficulty=Expert&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
|Tags=Pollution, transport, mobilité, qualité de l’air&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction&lt;br /&gt;
|Introduction=pour présenter l’expérience ou la réalisation technique de manière attractive.&lt;br /&gt;
}}&lt;br /&gt;
{{Materials&lt;br /&gt;
|ItemList={{ItemList&lt;br /&gt;
|Item=Découpeuse laser&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Moteur électrique&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Imprimante 3D&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=LED&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Bois&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=ESP32&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Comprendre le terme ( Mobilité de transport commun)&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Identifier le problème visé par notre projet&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Recherche dans les sources disponibles&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Élaboration d’un schéma préliminaire&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Choisir les matériaux pour la maquette&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=les rôles des membres du groupe&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Découpe laser&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Programmation du système de rotation&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Monter les éléments de la maquette et effectuer les tests&lt;br /&gt;
}}&lt;br /&gt;
{{Notes&lt;br /&gt;
|Observations=Une rotation d’un cache dévoilé le moyen de transport conseillé à l’instant t.&lt;br /&gt;
|Avertissement=Connexion&lt;br /&gt;
&lt;br /&gt;
Disponibilité des Api externe&lt;br /&gt;
|Explanations=L’esp appelle une api sur un serveur (api en fast api). Cette api va appeler les autres apis et faire les calcule.&lt;br /&gt;
&lt;br /&gt;
Cette architecture permet de ne pas être limité par l’esp niveau performance.&lt;br /&gt;
|Applications=Ils sont installés dans les lieux publics, aux arrêts de tramway, aux stations de bus et dans les taxis, et sont signalés par un panneau indiquant leur présence.&lt;br /&gt;
|Related=- Ajouter un GPS afin d’avoir la position dynamiquement.&lt;br /&gt;
&lt;br /&gt;
- Ajouter un capteur qui permet d’analyser la qualité de l’air pour ne plus dépendre d’un service tier et être  plus précis&lt;br /&gt;
|Objectives=Améliorer notre capacité à travailler en équipe Améliorer notre capacité à s’adapter au différent profils et compétence des membres de notre équipe (oral, méthode de travail, contrainte)&lt;br /&gt;
|Notes=https://datahub.bordeaux-metropole.fr/pages/accueil/&lt;br /&gt;
&lt;br /&gt;
https://fastapi.tiangolo.com/&lt;br /&gt;
&lt;br /&gt;
https://open-meteo.com/&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22029</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22029"/>
		<updated>2025-12-11T13:55:16Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Un dispositif fournissant des informations en temps réel sur la pertinence d’utiliser une voiture ou les transports en commun, en évaluant la qualité de l’air, les niveaux de pollution atmosphérique ainsi que la disponibilité des différents moyens de transport dans la zone&lt;br /&gt;
|Disciplines scientifiques=Arduino, Computing, Electricity, Mechanics&lt;br /&gt;
|Difficulty=Expert&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
|Tags=Pollution, transport, mobilité, qualité de l’air&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction&lt;br /&gt;
|Introduction=pour présenter l’expérience ou la réalisation technique de manière attractive.&lt;br /&gt;
}}&lt;br /&gt;
{{Materials&lt;br /&gt;
|ItemList={{ItemList&lt;br /&gt;
|Item=Découpeuse laser&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Moteur électrique&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Imprimante 3D&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=LED&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Bois&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=ESP32&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Comprendre le terme ( Mobilité de transport commun)&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Identifier le problème visé par notre projet&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Recherche dans les sources disponibles&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Élaboration d’un schéma préliminaire&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Choisir les matériaux pour la maquette&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Définir les étapes de réalisation de la maquette et les rôles des membres du groupe&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step}}&lt;br /&gt;
{{Notes&lt;br /&gt;
|Observations=Une rotation d’un cache dévoilé le moyen de transport conseillé à l’instant t.&lt;br /&gt;
|Avertissement=Connexion&lt;br /&gt;
&lt;br /&gt;
Disponibilité des Api externe&lt;br /&gt;
|Explanations=L’esp appelle une api sur un serveur (api en fast api). Cette api va appeler les autres apis et faire les calcule.&lt;br /&gt;
&lt;br /&gt;
Cette architecture permet de ne pas être limité par l’esp niveau performance.&lt;br /&gt;
|Applications=Ils sont installés dans les lieux publics, aux arrêts de tramway, aux stations de bus et dans les taxis, et sont signalés par un panneau indiquant leur présence.&lt;br /&gt;
|Related=- Ajouter un GPS afin d’avoir la position dynamiquement.&lt;br /&gt;
&lt;br /&gt;
- Ajouter un capteur qui permet d’analyser la qualité de l’air pour ne plus dépendre d’un service tier et être  plus précis&lt;br /&gt;
|Objectives=Améliorer notre capacité à travailler en équipe Améliorer notre capacité à s’adapter au différent profils et compétence des membres de notre équipe (oral, méthode de travail, contrainte)&lt;br /&gt;
|Notes=https://datahub.bordeaux-metropole.fr/pages/accueil/&lt;br /&gt;
&lt;br /&gt;
https://fastapi.tiangolo.com/&lt;br /&gt;
&lt;br /&gt;
https://open-meteo.com/&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22027</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22027"/>
		<updated>2025-12-11T13:45:51Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Un dispositif fournissant des informations en temps réel sur la pertinence d’utiliser une voiture ou les transports en commun, en évaluant la qualité de l’air, les niveaux de pollution atmosphérique ainsi que la disponibilité des différents moyens de transport dans la zone&lt;br /&gt;
|Disciplines scientifiques=Arduino, Computing, Electricity, Mechanics&lt;br /&gt;
|Difficulty=Expert&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
|Tags=Pollution, transport, mobilité, qualité de l’air&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction&lt;br /&gt;
|Introduction=pour présenter l’expérience ou la réalisation technique de manière attractive.&lt;br /&gt;
}}&lt;br /&gt;
{{Materials&lt;br /&gt;
|ItemList={{ItemList&lt;br /&gt;
|Item=Découpeuse laser&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Moteur électrique&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Imprimante 3D&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=LED&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Bois&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=ESP32&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Comprendre le terme ( Mobilité de transport commun)&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Identifier le problème visé par notre projet&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Définir les rôles des membres du groupe&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Recherche dans les sources disponibles&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step&lt;br /&gt;
|Step_Title=Élaboration d’un schéma préliminaire&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step}}&lt;br /&gt;
{{Notes&lt;br /&gt;
|Observations=Une rotation d’un cache dévoilé le moyen de transport conseillé à l’instant t.&lt;br /&gt;
|Avertissement=Connexion&lt;br /&gt;
&lt;br /&gt;
Disponibilité des Api externe&lt;br /&gt;
|Explanations=L’esp appelle une api sur un serveur (api en fast api). Cette api va appeler les autres apis et faire les calcule.&lt;br /&gt;
&lt;br /&gt;
Cette architecture permet de ne pas être limité par l’esp niveau performance.&lt;br /&gt;
|Applications=Ils sont installés dans les lieux publics, aux arrêts de tramway, aux stations de bus et dans les taxis, et sont signalés par un panneau indiquant leur présence.&lt;br /&gt;
|Related=- Ajouter un GPS afin d’avoir la position dynamiquement.&lt;br /&gt;
&lt;br /&gt;
- Ajouter un capteur qui permet d’analyser la qualité de l’air pour ne plus dépendre d’un service tier et être  plus précis&lt;br /&gt;
|Objectives=Améliorer notre capacité à travailler en équipe Améliorer notre capacité à s’adapter au différent profils et compétence des membres de notre équipe (oral, méthode de travail, contrainte)&lt;br /&gt;
|Notes=https://datahub.bordeaux-metropole.fr/pages/accueil/&lt;br /&gt;
&lt;br /&gt;
https://fastapi.tiangolo.com/&lt;br /&gt;
&lt;br /&gt;
https://open-meteo.com/&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22026</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22026"/>
		<updated>2025-12-11T13:18:59Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Dispositif permettant d’indiquer en temps réel la pertinence de l’utilisation de la voiture ou des transports en commun&lt;br /&gt;
|Disciplines scientifiques=Arduino, Computing, Electricity, Mechanics&lt;br /&gt;
|Difficulty=Expert&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
|Tags=Pollution, transport, mobilité, qualité de l’air&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction&lt;br /&gt;
|Introduction=pour présenter l’expérience ou la réalisation technique de manière attractive.&lt;br /&gt;
}}&lt;br /&gt;
{{Materials&lt;br /&gt;
|ItemList={{ItemList&lt;br /&gt;
|Item=Découpeuse laser&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Moteur électrique&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Imprimante 3D&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=LED&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Bois&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=ESP32&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step}}&lt;br /&gt;
{{Notes&lt;br /&gt;
|Observations=Une rotation d’un cache dévoilé le moyen de transport conseillé à l’instant t.&lt;br /&gt;
|Avertissement=Connexion&lt;br /&gt;
&lt;br /&gt;
Disponibilité des Api externe&lt;br /&gt;
|Explanations=L’esp appelle une api sur un serveur (api en fast api). Cette api va appeler les autres apis et faire les calcule.&lt;br /&gt;
&lt;br /&gt;
Cette architecture permet de ne pas être limité par l’esp niveau performance.&lt;br /&gt;
|Applications=Ils sont installés dans les lieux publics, aux arrêts de tramway, aux stations de bus et dans les taxis, et sont signalés par un panneau indiquant leur présence.&lt;br /&gt;
|Related=- Ajouter un GPS afin d’avoir la position dynamiquement.&lt;br /&gt;
&lt;br /&gt;
- Ajouter un capteur qui permet d’analyser la qualité de l’air pour ne plus dépendre d’un service tier et être  plus précis&lt;br /&gt;
|Objectives=Améliorer notre capacité à travailler en équipe Améliorer notre capacité à s’adapter au différent profils et compétence des membres de notre équipe (oral, méthode de travail, contrainte)&lt;br /&gt;
|Notes=https://datahub.bordeaux-metropole.fr/pages/accueil/&lt;br /&gt;
&lt;br /&gt;
https://fastapi.tiangolo.com/&lt;br /&gt;
&lt;br /&gt;
https://open-meteo.com/&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22025</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=22025"/>
		<updated>2025-12-11T13:03:00Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Dispositif permettant d’indiquer en temps réel la pertinence de l’utilisation de la voiture ou des transports en commun&lt;br /&gt;
|Disciplines scientifiques=Arduino, Computing, Electricity, Mechanics&lt;br /&gt;
|Difficulty=Expert&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
|Tags=Pollution, transport, mobilité, qualité de l’air&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction&lt;br /&gt;
|Introduction=pour présenter l’expérience ou la réalisation technique de manière attractive.&lt;br /&gt;
}}&lt;br /&gt;
{{Materials&lt;br /&gt;
|ItemList={{ItemList&lt;br /&gt;
|Item=Découpeuse laser&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Moteur électrique&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Imprimante 3D&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=LED&lt;br /&gt;
}}{{ItemList&lt;br /&gt;
|Item=Bois&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{Tuto Step}}&lt;br /&gt;
{{Notes}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
	<entry>
		<id>https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=21944</id>
		<title>Mobi BOX</title>
		<link rel="alternate" type="text/html" href="https://wikidebrouillard.qualif.dokit.app/w/index.php?title=Mobi_BOX&amp;diff=21944"/>
		<updated>2025-12-05T11:34:40Z</updated>

		<summary type="html">&lt;p&gt;AYOUB : Page créée avec « {{Tuto Details |Licences=Attribution (CC-BY) |Description=Y |Disciplines scientifiques=Arduino |Difficulty=Technical |Duration=2 |Duration-type=day(s) }} {{Introduction}}... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tuto Details&lt;br /&gt;
|Licences=Attribution (CC-BY)&lt;br /&gt;
|Description=Y&lt;br /&gt;
|Disciplines scientifiques=Arduino&lt;br /&gt;
|Difficulty=Technical&lt;br /&gt;
|Duration=2&lt;br /&gt;
|Duration-type=day(s)&lt;br /&gt;
}}&lt;br /&gt;
{{Introduction}}&lt;br /&gt;
{{Materials}}&lt;br /&gt;
{{Tuto Step}}&lt;br /&gt;
{{Notes}}&lt;br /&gt;
{{Tuto Status&lt;br /&gt;
|Complete=Draft&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AYOUB</name></author>
	</entry>
</feed>