docs(reports): init final presentation

Signed-off-by: Klagarge <remi@heredero.ch>
This commit is contained in:
2026-06-10 13:27:38 +02:00
parent 964a2d3375
commit 09ee22ff50
7 changed files with 326 additions and 10 deletions

View File

@@ -0,0 +1,10 @@
#import "/metadata.typ": *
#import "/tail/bibliography.typ": *
#import "/tail/glossary.typ": *
#import "/main/architecture/description.typ": *
#import "/resources/slides.typ": *
// server
// mqtt->db
// db->rest

View File

@@ -0,0 +1,67 @@
#import "/metadata.typ": *
#import "/tail/bibliography.typ": *
#import "/tail/glossary.typ": *
#import "/main/architecture/description.typ": *
#import "/resources/slides.typ": *
== Gateway — BLE to MQTT Bridge
#slide[
#grid(
columns: (1fr, 1fr),
gutter: 2em,
[
*Architecture*
- Raspberry Pi 4 Python
- Passive BLE scan (bleak)
- MQTTS publisher (paho-mqtt)
- systemd service auto-restart
- Remote access via Tailscale
],
[
*Data flow*
Thingy:52
-> BLE advertising
Raspberry Pi
-> MQTTS (TLS)
RabbitMQ broker
->
InfluxDB
]
)
]
== Gateway — Key Challenges
#slide[
#grid(
columns: (1fr, 1fr),
gutter: 2em,
[
*BLE filtering*
- GATT passive advertising
(BlueZ limitation)
- Filter: `company_id = 0xffff`
- exactly 14 bytes
- Continuous BLE scan (100% duty cycle)
- Deduplication: 10s cache per MAC address
],
[
*Reliability*
- MQTT auto-restart via systemd
- `os._exit(1)` on disconnection
- Validated with 2 cases:
- Network disconnection
- Wrong MQTT credentials
]
)
]
== Gateway — Data Collection Flow
#slide[
#align(center)[
#image("/resources/img/sequence_data_collection.svg", height: 85%)
]
]

View File

@@ -0,0 +1,62 @@
#import "/metadata.typ": *
#import "/tail/bibliography.typ": *
#import "/tail/glossary.typ": *
#import "/main/architecture/description.typ": *
#import "/resources/slides.typ": *
---
Input:
- Provence classrooms specifications - Space A #pause
- Open data #pause
- Ventilation standard formula #pause
- User parameters : Room name, number of students, initial @co2 concentration #pause
Output:
- Evolution of @co2 concentration without considering air ventilation #pause
- Time required to reach a threshold of 1400 ppm #pause
- Evolution of @co2 concentration decrease under natural ventilation #pause
- Time required to reach outdoor-equivalent concentration level
---
=== Modelling the temporal evolution of @co2:short concentration
#grid(
columns: (1fr, 1fr),
[
#figure(
image("../../resources/img/Physical model/CO2 concentration over time Simaria.png"),
caption: [Comparison of modelled and open data #cite(<Simaria>) @co2:short concentration evolution]
) <fig:comparison_open_data_model_no_window_opening>
],
[
#figure(
image("../../resources/img/Physical model/CO2 concentration over time INRS secondary school.png"),
caption: [Comparison of modelled and open data #cite(<INRS_Study>) @co2:short concentration evolution]
)
]
)
---
=== Modelling the @co2:short concentration increase without air ventilation and @co2:short decrease under natural ventilation
#grid(
columns: (1fr, 1fr),
[
#figure(
image("../../resources/img/Physical model/Window user window opening model.png"),
caption: [User input parameters and results]
) <fig:user_input_parameters_results>
],
[
#figure(
image("../../resources/img/Physical model/CO2 concentration over time user window opening model.png"),
caption: [Temporal evolution of @co2:short level using input parameters from @fig:user_input_parameters_results]
)
]
)
---
=== Comparison of experimental data and the physical model
#figure(
image("../../resources/img/Physical model/Comparison_expdata_model.png", width: 59%),
caption: [Comparison of experimental data and the physical model (A2 classroom, 11 students)]
)

View File

@@ -0,0 +1,43 @@
#import "/metadata.typ": *
#import "/tail/bibliography.typ": *
#import "/tail/glossary.typ": *
#import "/main/architecture/description.typ": *
#import "/resources/slides.typ": *
---
== Nodes | Class diagram
#let nodes_class_diagram_impl = [
#figure(
image("../..//resources/img/nodes_class_diagram_impl.svg"),
caption: [Nodes class diagram following implementation]
) <fig:nodes_class_diagram_impl>
]
#nodes_class_diagram_impl
== Nodes | Sequence diagram
#let nodes_sequence_diagram = [
#figure(
image("../../resources/img/nodes_sequence_diagram.svg", width: 60%),
caption: [Nodes sequence diagram]
) <fig:nodes_sequence_diagram>
]
#nodes_sequence_diagram
== Nodes | Nodes_interface
#figure(
table(
columns: (auto, auto, auto),
align: center,
table.header("name", "key", "data size"),
[Window opening status],[0x01],[1B],
[Humidity],[0x02],[1B],
[Temperature],[0x03],[2B],
[CO2 level],[0x04],[4B],
[Battery percent of charge],[0x05],[1B],
),
caption: [Data communicated in the nodes_interface],
)<tab:nodes_interface_content>
---
=== Nodes | Takeaways
- Breadboard validation #pause
- 28 days later #pause
- Improve nodes_interface reliability

View File

@@ -1,14 +1,15 @@
#import "/metadata.typ": *
#import "/tail/bibliography.typ": *
#import "/tail/glossary.typ": *
#import "/main/architecture/description.typ": *
#import "/resources/slides.typ": *
#show:make-glossary
#register-glossary(entry-list)
#let HANDOUT = true
#let NOTES = false
#let HANDOUT = false
#let NOTES = true
#show: metropolis-theme.with(
aspect-ratio: "16-9",
@@ -33,7 +34,7 @@
#title-slide()
// 20 min presentation
// 5 (students) + 25 (teacher) min Q&A
// 5 (students) + 25 (teachers) min Q&A
/*
technical -> each section should go for around (3min / pers)
@@ -58,16 +59,138 @@ TECHNIQUE
*/
= Intro
= Intro // (50s) Rémi
// Context of the project
// Dimitri missing
---
@co2
== foo
#speaker-note[
This is a personal note
here also @co2
]
Yolo
== Architecture // (50s) Ibrahima
TODO
== bar
Hello world
== Organisation & Task Management // (50s) Djelal
#slide[
#grid(
columns: (1fr, 1fr),
gutter: 2em,
[
*Project management*
- Weekly meetings Thursday 17h (1h)
- PV after each meeting (Thank's to Adrien)
- GitHub Issues & sub-issues
- Pull Requests with code review
- Teams for daily communication
- GULAG Git conventions
],
[
*Work distribution*
- Adrien Nodes firmware (Zephyr)
- Djelal Gateway (BLE-to-MQTT)
- Rémi Database & API
- Ibrahima User Interface
- Alison Physical model
]
)
]
= Nodes // (3min) Adrien
#include "nodes.typ"
= Gateway // (3min) Djelal
#include "gateway.typ"
= Database & API // (3min) Rémi
#include "db.typ"
= User interface // (3min) Ibrahima
#include "ui.typ"
= Physical model // (3min) Alison
#include "models.typ"
= Conclusion
---
It's the end of the world
== Whole project's takeaways // (50s) Adrien (Regard critique)
- @trl 4 #pause
- Forecasting and Teams notifications
== Future perspectives // (50s) Alison
- Deployment in every room #pause
- Equip the door with sensors #pause
- Calibrate the sensors and, if necessary, replace them with higher-performance devices #pause
- Conduct multiple measurement campaigns knowing the number of students to adjust the physical model #pause
- Display the predicted time to reach the threshold and the window opening duration on the board #pause
- Teams notifications #pause
- Implement a forecasting using machine learning
#focus-slide[Questions?]
#show: appendix
== Glossary
#print-glossary(
entry-list,
// show all term even if they are not referenced, default to true
show-all: false,
// disable the back ref at the end of the descriptions
disable-back-references: false,
deduplicate-back-references: true
)
== Bibliography
#bibliography(title: i18n("bib-title", lang: option.lang), bib.path, style:bib.style)
= Annexes
== Backup slide example
This slide is an example for create a backup slide.
== Description of the model
#grid(
columns: (1.7fr,0.1fr,1fr),
[#figure(
image("../../resources/img/Physical model/data flow diagram window opening .png"),
caption: [Description of the model]
) <fig:physical_model_no_ventilation>],
[
],
[
Formulas for determining the evolution of @co2 concentration :
#text(size: 12pt)[
- $C_"CO2" (t) = C_"CO2" (t=0) + frac(N.Q_"CO2_prod".t,V)
$
- $C_"CO2" (t) = (C_"CO2_indoor" (t=0) - C_"CO2_outdoor" - frac(0.001 . Q_"CO2_prod", Q_"air")) . \ exp (frac(-Q_"air", V) . t)
+ C_"CO2_outdoor" + frac(0.001 . Q_"CO2_prod", Q_"air")
$
where,
$C_"CO2" (t=0)$ #h(1.5cm) initial co2 concentration [ppm]
N #h(3.4cm) number of students
$Q_"CO2_prod"$ #h(2cm) co2 flow rate per person [l/h]
$C_"CO2_indoor" (t=0)$ #h(0.6cm) indoor co2 level before window-opening [ppm]
$C_"CO2_outdoor"$ #h(1.7cm) outdoor air concentration [ppm]
$Q_"air"$ #h(3cm) incoming air flow rate [$m^3$/h]
$V$ #h(3.3cm) room volume [$m^3$]
$t$ #h(3.5cm) time [h]]
]
)

View File

@@ -0,0 +1,6 @@
#import "/metadata.typ": *
#import "/tail/bibliography.typ": *
#import "/tail/glossary.typ": *
#import "/main/architecture/description.typ": *
#import "/resources/slides.typ": *

View File

@@ -128,6 +128,11 @@
key: "svg",
short: "SVG",
long: "Scalable Vector Graphics"
),
(
key: "trl",
short: "TRL",
long: "Technical Readiness Level"
)
)