6 Commits

Author SHA1 Message Date
32fffa3fee docs(report): compress remi's self-assessment to 1 page
Signed-off-by: Klagarge <remi@heredero.ch>
2026-06-14 14:44:35 +00:00
922c2f8bf5 docs(report): proofreading on remi's self-assessment 2026-06-14 14:44:35 +00:00
e8043def69 docs(report): initial self-assessement remi
Signed-off-by: Klagarge <remi@heredero.ch>
2026-06-14 14:44:35 +00:00
4d30e1dd6e chore(changelog): add AI assistance mention to changelog
Signed-off-by: Klagarge <remi@heredero.ch>
2026-06-14 14:42:09 +00:00
7b2a879440 chore(changelog): add AI assistance mention to changelog
Add a mention next to the commit message when the commit is AI assisted
and group AI models used in an 'AI Assistance Repartition' section.

Assisted-by: Zed:gemini-3.1-pro
2026-06-14 14:42:09 +00:00
48e121313c chore: add changelogs
Signed-off-by: Klagarge <remi@heredero.ch>
2026-06-14 14:42:09 +00:00
7 changed files with 503 additions and 0 deletions

110
cliff.toml Normal file
View File

@@ -0,0 +1,110 @@
# git-cliff ~ default configuration file
# https://git-cliff.org/docs/configuration
#
# Lines starting with "#" are comments.
# Configuration options are organized into tables and keys.
# See documentation for more information on available options.
[changelog]
# template for the changelog header
header = """
# Changelog\n
All notable changes to this project will be documented in this file.\n
"""
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | striptags | trim | upper_first }}
{% for commit in commits %}
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
{% if commit.breaking %}[**breaking**] {% endif %}\
{{ commit.message | upper_first }}\
{%- for footer in commit.footers -%}
{%- if footer.token == "Assisted-by" %} *(🤖 {{ footer.value | split(pat=" ") | first | trim }})*{%- endif -%}
{%- endfor %}\
{% endfor %}
{% endfor %}
{%- set ai_models = [] -%}
{%- for commit in commits -%}
{%- for footer in commit.footers -%}
{%- if footer.token == "Assisted-by" -%}
{%- set clean_value = footer.value | split(pat=" ") | first | trim -%}
{%- set_global ai_models = ai_models | concat(with=clean_value) -%}
{%- endif -%}
{%- endfor -%}
{%- endfor -%}
{%- if ai_models | length > 0 %}
### 🤖 AI Assistance Repartition
{%- for model in ai_models | unique | sort -%}
{%- set_global count = 0 -%}
{%- for m in ai_models -%}
{%- if m == model -%}
{%- set_global count = count + 1 -%}
{%- endif -%}
{%- endfor %}
- **{{ model }}**: {{ count }} commit{% if count > 1 %}s{% endif %}
{%- endfor %}
{% endif %}\n
"""
# template for the changelog footer
footer = """
<!-- generated by git-cliff -->
"""
# remove the leading and trailing s
trim = true
# postprocessors
postprocessors = [
# { pattern = '<REPO>', replace = "https://github.com/orhun/git-cliff" }, # replace repository URL
]
# render body even when there are no releases to process
# render_always = true
# output file path
# output = "test.md"
[git]
# parse the commits based on https://www.conventionalcommits.org
conventional_commits = true
# filter out the commits that are not conventional
filter_unconventional = true
# process each line of a commit as an individual commit
split_commits = false
# regex for preprocessing the commit messages
commit_preprocessors = [
# Replace issue numbers
#{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](<REPO>/issues/${2}))"},
# Check spelling of the commit with https://github.com/crate-ci/typos
# If the spelling is incorrect, it will be automatically fixed.
#{ pattern = '.*', replace_command = 'typos --write-changes -' },
]
# regex for parsing and grouping commits
commit_parsers = [
{ message = "^feat", group = "<!-- 0 -->🚀 Features" },
{ message = "^fix", group = "<!-- 1 -->🐛 Bug Fixes" },
{ message = "^doc", group = "<!-- 3 -->📚 Documentation" },
{ message = "^perf", group = "<!-- 4 -->⚡ Performance" },
{ message = "^refactor", group = "<!-- 2 -->🚜 Refactor" },
{ message = "^style", group = "<!-- 5 -->🎨 Styling" },
{ message = "^test", group = "<!-- 6 -->🧪 Testing" },
{ message = "^chore\\(release\\): prepare for", skip = true },
{ message = "^chore: update CHANGELOG.md", skip = true },
{ message = "^chore\\(deps.*\\)", skip = true },
{ message = "^chore\\(pr\\)", skip = true },
{ message = "^chore\\(pull\\)", skip = true },
{ message = "^chore|^ci", group = "<!-- 7 -->⚙️ Miscellaneous Tasks" },
{ body = ".*security", group = "<!-- 8 -->🛡️ Security" },
{ message = "^revert", group = "<!-- 9 -->◀️ Revert" },
{ message = ".*", group = "<!-- 10 -->💼 Other" },
]
# filter out the commits that are not matched by commit parsers
filter_commits = false
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
sort_commits = "oldest"

102
db/CHANGELOG.md Normal file
View File

@@ -0,0 +1,102 @@
# Changelog
All notable changes to this project will be documented in this file.
## [unreleased]
### ⚙️ Miscellaneous Tasks
- Add changelogs
## [db-gateway-v1.0.0] - 2026-06-04
### 🚀 Features
- *(db)* Add influx in db stack
- *(db)* Add traefik config example with actual server
- *(db)* Add rabittmq as mqtt stack
- *(db)* Add influx gateway from previous project
- *(db)* Add mqtt gateway from previous project
- *(db)* Merge datapoint and message
- *(db)* Add SubscribeTyped function and refactor DataPoint structure
- *(db)* Add initial main implementation
- *(db)* Add rest gateway
- *(db)* Add GET current value endpoint
- *(db)* Add GET history endpoint
- *(db)* Add mapping *(🤖 Junie:gemini-3-flash)*
- *(db)* Add swagger doc *(🤖 Junie:gemini-3-flash)*
- *(db)* Add parameter for time window in history endpoint
- *(db)* Add basic auth
- *(db)* Add deploiement stack
- *(db)* Add node tag for influx
- *(db)* Remove CO2PPM data over 1'000'000'000
- *(db)* Add battery field
- *(db)* Add battery REST endpoint *(🤖 Junie:claude-sonnet-4.6)*
- *(db)* Get mapping dynamically from file *(🤖 Junie:claude-sonnet-4.6)*
- *(db)* Add endpoint to export influx data to csv *(🤖 Junie:claude-sonnet-4.6)*
- *(server)* Add traefik entry for ui dashboard
- *(db)* Add co2 watchdog on each room *(🤖 Junie:gemini-3-flash)*
- *(db)* Add co2-status endpoint in REST API *(🤖 Junie:gemini-3-flash)*
### 🐛 Bug Fixes
- *(db)* Add missing entrypoint for influx explorer *(🤖 Gemini:gemini-3.1-pro)*
- *(db)* Add missing hostname for influx access in traefik
- *(db)* Wrong mqtt port
- *(db)* Typo in certResolver
- *(db)* Fail if now defaut user / password for mqtt
- *(db)* Allow gRPC proxy in traefik *(🤖 Gemini:gemini-3.1-pro)*
- *(db)* Proper api url instead of using swagger doc url
- *(db)* CORS request *(🤖 Gemini:gemini-3.1-pro)*
- *(db)* Url for api start with https
- *(db)* Get rooms from mapping file
- *(db)* Set time interval for influx limitations
- *(db)* Set higher file limit for influx limitations
- *(db)* Remove authorization for battery status endpoint
- *(db)* Window -> window_open
- *(db)* Push data with partial mapping
- *(db)* Filter random value
- *(db)* Mqtt hostname to keep internal config identique in case of rebuild
- *(db)* Add the room in the returned json
- *(db)* Return time in RFC3339 to avoid breakchange *(🤖 Junie:claude-opus-4.8)*
- *(db)* Return window tag in room status
- *(db)* Return only high co2 room for co2-status endpoint
- *(db)* Return error directly
### 🚜 Refactor
- *(db)* Move package
- *(db)* Unify env getters
- *(db)* Split campus and room mapping error detection
- *(db)* Map room and node on REST API
- *(db)* Add flag to run without MQTT part
- *(db)* Adapt SQL query for 5 min average
- *(db)* Round averages in SQL queries
- *(db)* Using moving average for room history *(🤖 Junie:gemini-3-flash)*
- *(db)* Change order for history
- *(db)* Add constante for max QOS
- *(db)* Add constante for defaultTimeout
### 📚 Documentation
- *(db)* Add deployement documentation
- *(db)* Fix typo in doc
### ⚙️ Miscellaneous Tasks
- Init
- *(db)* Typo and respect go guidelines
- *(db)* Get InfluxDB token by secrets *(🤖 Gemini:gemini-3-flash)*
- *(db)* Update critical dependancy
- *(db)* Add pre-commit for swagger documentation
- *(db)* Add local gitignore
- *(db)* Set 30min before offline for battery endpoint
### 🤖 AI Assistance Repartition
- **Gemini:gemini-3-flash**: 1 commit
- **Gemini:gemini-3.1-pro**: 3 commits
- **Junie:claude-opus-4.8**: 1 commit
- **Junie:claude-sonnet-4.6**: 3 commits
- **Junie:gemini-3-flash**: 5 commits
<!-- generated by git-cliff -->

59
gateway/CHANGELOG.md Normal file
View File

@@ -0,0 +1,59 @@
# Changelog
All notable changes to this project will be documented in this file.
## [unreleased]
### ⚙️ Miscellaneous Tasks
- Remove useless gitkeep file
- Add changelogs
## [gateway-v1.0.0] - 2026-06-04
### 🚀 Features
- Add BLE-to-MQTT gateway implementation
- *(gateway)* Add configuration file
- *(gateway)* Implement BLE-to-MQTT gateway *(🤖 Claude:claude-sonnet-4-6)*
- *(gateway)* Add MQTTS support with TLS and authentication *(🤖 Claude:claude-sonnet-4-6)*
- *(gateway)* Add battery level support (key 0x05)
- *(gateway)* Add deduplication and continuous BLE scan *(🤖 Claude:claude-sonnet-4-6)*
### 🐛 Bug Fixes
- *(gateway)* Fix architecture diagram code block in README
- *(gateway)* Fix architecture diagram code block in README
- *(gateway)* Fix payload decoding endianness and skip preamble Switch temperature and CO2 decoding from little-endian to big-endian to match the Zephyr firmware implementation. Skip the 2-byte company id preamble (0xffff) at the start of the manufacturer data payload.
- *(gateway)* Replace UUID filter with manufacturer data preamble filter
- *(gateway)* Replace UUID filter with manufacturer data preamble filter
- *(gateway)* Fix BLE filtering and MQTT connection validation
- *(gateway)* Use exact payload size filter and improve robustness
- *(gateway)* Revert CO2 range check and add MQTT auto-reconnect
### 🚜 Refactor
- *(gateway)* Switch from GATT connection to passive BLE advertising *(🤖 Claude:claude-sonnet-4-6)*
### 📚 Documentation
- Add gateway README
- Add overnight test results and measurements graph
- Add overnight test results section to README
- *(gateway)* Add README with architecture and MQTT interface *(🤖 Claude:claude-sonnet-4-6)*
- *(gateway)* Document MQTT_PASSWORD environment variable in README
- *(gateway)* Add deployment checklist, systemd service and update README
- *(gateway)* Update README with battery field, security fixes and warnings
### ⚙️ Miscellaneous Tasks
- Init
- *(gateway)* Add Python dependencies file
- *(gateway)* Exclude config.json from repo, add example config
- *(gateway)* Use placeholder values in config.example.json
- *(gateway)* Update config.example.json with TLS and auth fields
### 🤖 AI Assistance Repartition
- **Claude:claude-sonnet-4-6**: 5 commits
<!-- generated by git-cliff -->

62
nodes/CHANGELOG.md Normal file
View File

@@ -0,0 +1,62 @@
# Changelog
All notable changes to this project will be documented in this file.
## [unreleased]
### ⚙️ Miscellaneous Tasks
- Add changelogs
## [project-submission] - 2026-06-04
### ⚙️ Miscellaneous Tasks
- Remove useless gitkeep file
- Remove zephyr sample file
- Remove release file from repo
## [nodes-v1.1.0] - 2026-06-04
### 🚀 Features
- *(nodes)* Adding management of read error on each values, hence
- *(nodes)* Add the battery level in the ble frame
- *(nodes)* Adding battery percent as new key/value in the BLE frame
- *(nodes)* Using an explicit thread, as it may cause the huge battery usage
- *(nodes)* Setting the fastest BLE advertising frequency to 1 minute instead of 2
### 🐛 Bug Fixes
- *(nodes)* Changing incorrect comment
- *(nodes)* Using MAC address as BT_ADDR
- *(nodes)* Reduce battery consumption
### 📚 Documentation
- *(nodes)* Adding comments in the nodes code
## [nodes-v1.0.0] - 2026-06-04
### 🚀 Features
- *(nodes)* WIP supervisor first implementation
- *(nodes)* Adding thermometer and hygrometer
- *(nodes)* WIP adding first implementation for BLE advertising.
- *(nodes)* Adding co2_level retrieval
- *(nodes)* Adding window status reading
- *(nodes)* Adding nodes firmware v1.0
### 🐛 Bug Fixes
- *(nodes)* Adjusting broadcasted data to fit definition
- *(nodes)* Fixing switch device tree and wrong ordering of ble values
- *(nodes)* Properly fetching data from temp/hygro sensor
- *(nodes)* Co2 level fetched as desibed in the documentation
- *(nodes)* Changing window status sensor to have unequipped nodes return 'window is closed' status
### ⚙️ Miscellaneous Tasks
- Init
<!-- generated by git-cliff -->

View File

@@ -0,0 +1,32 @@
# Changelog
All notable changes to this project will be documented in this file.
## [unreleased]
### 🚀 Features
- *(notification)* Spring Boot Teams notification service (#19)
- *(notification)* Add mock mode for local testing without backend (#19 #21)
- *(notification-service)* Replace Teams with Telegram notifications *(🤖 Claude:claude-sonnet-4-6)*
- *(notification-service)* Add Dockerfile, actuator health and alert deduplication *(🤖 Claude:claude-sonnet-4-6)*
- *(notification-service)* Adapt to Go backend /api/v1/rooms/high-co2 endpoint
### 🐛 Bug Fixes
- *(notification)* Remove non-existent starter-scheduling dep, target Java 17
### 🧪 Testing
- *(notification-service)* Add unit tests and clean up Co2Level *(🤖 Claude:claude-sonnet-4-6)*
### ⚙️ Miscellaneous Tasks
- *(notification-service)* Add CI/CD pipeline with Docker, SSH deploy and API credentials
- *(notification-service)* Add SAST, dependency scan and DAST security gates
- Add changelogs
### 🤖 AI Assistance Repartition
- **Claude:claude-sonnet-4-6**: 3 commits
<!-- generated by git-cliff -->

View File

@@ -0,0 +1,94 @@
//
// Description: Main document to stitch everything together
//
#import "/metadata.typ": *
#import "/tail/bibliography.typ": *
#import "/tail/glossary.typ": *
#import "/resources/mse-title-page.typ": *
#show:make-glossary
#register-glossary(entry-list)
#set text(region: "gb")
//-------------------------------------
// Template config
//
#show: thesis.with(
option: option + (type: "final"),
doc: doc,
school: school,
date: date,
tableof: (toc: false),
logos: logos,
custom-title-page: mse-title-page(
title: [Self-assessment],
subtitle: [Team: Pleeeeein deeeee eeeeeeeeeeeeeeeeee],
authors: (
(name: "Rémi Heredero"),
),
date: date,
),
)
// #show "e": "ee"
//-------------------------------------
// Content
//
/*
Un rapport d'auto-évaluation doit dans le grandes lignes :
- Reprendre les points qui avaient été annoncé lors de la définition du projet, est-ce que les objectifs et buts de formations fixés en début de projets on été atteints.
- Evoquer votre role dans l'équipe, les compétences que vous avez pu mettre à disposition, et celles qui vous ont fait défaut.
- Lister les gains en compétences que vous ressentez après ce projet.
*/
#show heading.where(level: 1): (it) => {
set text(size: huge)
set block(above: 1.2em, below: 1.0em)
if it.numbering != none {
let num = numbering(it.numbering, ..counter(heading).at(it.location()))
let prefix = num + h(0.5em) + text(code-border)[|] + h(0.5em)
unshift-prefix(prefix, it.body)
} else {
it
}
}
#show heading.where(level: 2): (it) => {
if it.numbering != none {
let num = numbering(it.numbering, ..counter(heading).at(it.location()))
unshift-prefix(num + h(0.8em), it.body)
} else {
it
}
}
= Introduction
This report is a self-assessment provided alongside the team report. It is meant to be a personal reflection on the project, and should be read after the team report.
I want to be upfront, as hinted at in the team report, that this project ran in parallel with a similar hobby project I was doing with some friends. At least, similar regarding my specific tasks.
// However, the skills I was developing there directly benefited my work here, and vice versa.
= Role in the Team
My primary role was to set up the server, and develop the APIs for the database and cloud data management.
It also became apparent early on that I'd naturally take on a broader technical role. We decided at the beginning to establish clear Git rules to work efficiently. I was responsible for writing these "Guidelines & Unified Laws for Advanced Gitflow" (GULAG) and making sure everyone respected them. It quickly turned out that I also had to do most of the code reviews. This was quite time-consuming but very formative, especially since we all came into this project with different backgrounds and coding approaches.
Beyond doing most of the reviews, I also ended up helping my teammates with debugging and code design. I became the team's troubleshooter.
I was basically the person picking up all the tasks we forgot to plan for at the beginning. I didn't mind this role at all; I like helping out and sharing my knowledge.
= Objective & skills review
My initial objective was to #quote(strike[Solve Maxwell's equations])
#par(text(size: 0.8em, emph[
A data infrastructure is automated, deployed both in productive and development environment. The database is automatically configured and populated by external MeteoSwiss data.
The student didn't experiment automatic deploy /configuration and multi-environment.
]))
This objective was partially completed and shifted during the project. I did successfully deploy a server infrastructure with a database and a broker, including the corresponding APIs to push and retrieve data. However, the MeteoSwiss data integration was abandoned because it fell out of scope after one student left the group.
The database is indeed automatically configured. I didn't focus on setting up automatic deployment for my part. Another student ended up doing automatic deployment on the project.
I still learned a lot on this project overall. It wasn't really what I expected technically, but I gained much more experience in technical project management and figuring out how to work with people from very different backgrounds and horizons. I became much more versatile during this project, which, I think, is essential for an engineer. We should all be able to do a bit of everything and communicate with anyone.

44
ui/CHANGELOG.md Normal file
View File

@@ -0,0 +1,44 @@
# Changelog
All notable changes to this project will be documented in this file.
## [unreleased]
### 🚀 Features
- *(ui)* Initialize Angular 18 dashboard project
- *(ui)* Create organized folder structure for application
- *(ui)* Configure routing with lazy-loaded components
- *(ci)* Add Docker build, push and SSH deploy pipeline *(🤖 Claude:claude-sonnet-4-6)*
- *(ui)* Implement interactive room map with REST services and unit tests
- *(ui)* Interactive room map, detail panel redesign and polling
- *(ui)* Dynamic room polling, secure credentials and CO2 levels
### 🐛 Bug Fixes
- *(ui)* Add environment.prod.ts for production builds
- *(ui)* Address code review feedback
- *(ui)* Remove hardcoded credentials and make CO2 spec config-driven
### 🚜 Refactor
- *(ui)* Simplify room names and remove dead code
### 🎨 Styling
- *(ui)* Apply Prettier formatting
- *(ui)* Apply Prettier formatting *(🤖 Claude:claude-sonnet-4-6)*
### ⚙️ Miscellaneous Tasks
- Init
- *(ui)* Setup GitHub Actions CI/CD pipeline
- *(ui)* Remove commented-out gitignore line for environment.prod.ts
- *(ui)* Add plan.svg floor plan asset
- Remove useless gitkeep file
- Add changelogs
### 🤖 AI Assistance Repartition
- **Claude:claude-sonnet-4-6**: 2 commits
<!-- generated by git-cliff -->