Table des matières
hass_renpho : Interroger une API cloud pour Home Assistant
hass_renpho est un fork d’intégration Home Assistant pour les mesures Renpho. Un coordinateur actualise les données cloud et les entités de capteurs exposent cet état. Le dépôt avertit que l’ancien parcours API ne fonctionne plus de façon fiable.
- Langages
- 2Répartition du code
- Composants documentés
- 2Explorer les modules
- Documents source
- 3Lire les instructions
Langages du dépôtPython 99.51%2
Parts calculées à partir des octets GitHub Linguist.
| Langage | % | Octets |
|---|---|---|
| Python | 144 406 | |
| Dockerfile | 711 |
1. Aperçu
1.1. Pourquoi il existe
Composant Home Assistant personnalisé décodant la télémétrie biométrique des balances connectées Renpho.
1.2. Cas d’usage
Centralisation des données de santé privées dans Home Assistant.
2. Cas d’utilisation
Une intégration Home Assistant qui interroge l’ancienne API infonuagique Renpho et expose les mesures de la balance en capteurs.
- Se connecter, choisir l’usager
- Usager Home AssistantHome AssistantAPI nuagique Renpho
config_flow.py valide le courriel et le mot de passe auprès de Renpho, puis affiche l’étape select_user si le compte a plusieurs usagers.
- Interroger les mesures
- Home AssistantAPI nuagique Renpho
RenphoWeightCoordinator appelle get_measurements(), list_girth() et list_girth_goal() toutes les refresh secondes via un DataUpdateCoordinator.
- Afficher les mesures
- Usager Home AssistantHome Assistant
sensor.py et sensor_configs.py créent des capteurs pour le poids, l’IMC, la masse grasse, l’eau, le métabolisme de base, les tours de taille et objectifs, en kg ou lb.
- Passer par un mandataire
- Usager Home AssistantAPI nuagique Renpho
Le paramètre facultatif proxy (http:// ou socks5://) est vérifié par check_proxy() avant les appels, pour les adresses IP bloquées par renpho.qnclouds.com.
- Tester un compte dans l’API
- Usager Home AssistantAPI nuagique Renpho
api/app.py est une application FastAPI avec des routes comme /auth, /users, /measurements et /girth_info ; vercel.json la déploie et le README renvoie à sa page /docs.
2.1. Scénario : Faire arriver la pesée du matin dans Home Assistant
- Copier custom_components/renpho dans <config_dir>/custom_components/renpho/ (ou installer via HACS).
- Ajouter renpho: avec email, password et refresh: 600 dans configuration.yaml, plus sensor: platform: renpho.
- Redémarrer Home Assistant ; l’intégration se connecte à l’ancienne API Renpho et retrouve l’identifiant de l’usager.
- Monter sur la balance avec l’ancienne appli Renpho pour que la mesure arrive dans le nuage.
- Au prochain cycle de rafraîchissement, les capteurs de poids et de masse grasse se mettent à jour dans le tableau de bord.
Fichiers consultésREADME.mdhacs.jsoncustom_components/renpho/manifest.jsoncustom_components/renpho/config_flow.pycustom_components/renpho/coordinator.pycustom_components/renpho/sensor.pycustom_components/renpho/api_renpho.pyapi/app.pyvercel.json
3. Essayer
Adresse publiée dans le README du dépôt. La page s’ouvre dans un cadre isolé, seulement quand vous le demandez.
https://hass-renpho.vercel.app/docs4. Démarrage
Ces commandes viennent de la documentation du dépôt. Elles n’ont pas été exécutées pendant cette revue.
Stable
Use the latest release
Not stable
git clone https://github.com/antoinebou12/hass_renpho5. Références du dépôt
Extraits des guides du dépôt, dans leur langue d’origine. Les liens ouvrent la version du code consultée.
Prérequis et premier essai
5.1. Prerequisites
README.md
- You must have a Renpho scale. If you don’t have one, you can purchase one here.
- You must have the Renpho app installed on your mobile device. You can download it here for Android and here for iOS.
- You must have the Home Assistant Community Store (HACS) installed and running.
5.2. Installation
README.md
5.3. Prerequisites (README.md)
docs/README.md
- You must have a Renpho account. If you don’t have one, you can create one here.
- You must have Home Assistant installed and running.
- Visual Studio Code is recommended for editing the files.
5.4. Installation (README.md)
docs/README.md
- Copy this folder to /custom_components/hass_renpho/.
- Add the necessary configuration to your configuration.yaml file.
Configuration et utilisation
5.5. Configuration
README.md
Add the following entry in your configuration.yaml: And then add the sensor platform:
:warning: Note: Refresh is the time in seconds to check for updates. Keep in mind that logging in will log you out of the app. Restart home assistant and you should see the sensors:
5.6. Parameters
docs/README.md
5.7. Parameters (README.md)
docs/README.md
- metric (str): The specific metric to retrieve (e.g., ‘weight’, ‘bmi’).
5.8. Parameters (docs/README.md)
docs/README.md
- metric (str): The metric to fetch (e.g., ‘bodyfat’, ‘water’).
- user_id (str, optional): The user ID for whom the metric should be fetched. Defaults to the object’s user_id if not provided.
5.9. Parameters (docs/README.md)
docs/README.md
- polling_interval (int): Time in seconds between each polling call. Defaults to 60 seconds.
API et intégration
5.10. API Documentation
docs/README.md
5.11. API endpoints
docs/README.md
This document describes the API endpoints and methods utilized by the RenphoWeight class in the Home Assistant custom component for Renpho weight scales. It outlines the endpoints, expected parameters, and returned data.
5.12. API Documentation (README.md)
docs/README.md
Endpoint: /api/v3/users/sign_in.json Method: POST Parameters:
- app_id: Application identifier.
- secure_flag: Indicates secure login.
- email: User’s email address.
- password: User’s password.
Exploitation et dépannage
5.13. Troubleshooting
README.md
- Legacy Renpho app vs Renpho Health This integration uses the legacy Renpho cloud API (renpho.qnclouds.com) and the same account type as the older Renpho mobile app (not Renpho Health). Credentials and APIs differ; Renpho Health is not supported here.
- “No users found” / empty scale_users Renpho sometimes returns an empty list_scale_user list while sign-in and measurements still work. The integration now falls back to the account user id from the sign-in response. The hosted API explorer behaves the same: if the list is empty but you are logged in, /users returns a single synthetic user built from that account id.
- Rate limiting and IP blocks
5.14. Step by Step debugging
.devcontainer/README.md
Développement et contributions
5.15. List Latest Device Model
docs/README.md
Endpoint: /api/v3/devices/list_lastest_model.json Method: GET (attempted but failed due to parameter issues) and POST Parameters:
- user_id: The user’s identifier.
- last_updated_at: Timestamp for last update.
- locale: Locale setting.
- app_id: Application identifier.
- terminal_user_session_key: Session key obtained from signing in.
- internal_model_json: An array of model identifiers.
5.16. Developing with Visual Studio Code + devcontainer
.devcontainer/README.md
The easiest way to get started with custom integration development is to use Visual Studio Code with devcontainers. This approach will create a preconfigured development environment with all the tools you need. In the container you will have a dedicated Home Assistant core instance running with your custom component code. You can configure this instance by updating the ./devcontainer/configuration.yaml file. Prerequisites
- git
- Docker
- For Linux, macOS, or Windows 10 Pro/Enterprise/Education use the current release version of Docker
- Windows 10 Home requires WSL 2 and the current Edge version of Docker Desktop (see instructions here). This can also be used for Windows Pro/Enterprise/Education.
- Visual Studio code
- [Remote - Containers (VSC Extension)][extension-link] More info about requirements and devcontainer in general Getting started:
- Fork the repository.
Documentation source
3 documents lus parmi 3 candidats.
6. Fonctions et composants 2
- Actualisation coordonnée
- RenphoWeightCoordinator étend DataUpdateCoordinator avec un intervalle configurable. Une actualisation appelle get_measurements, list_girth et list_girth_goal, puis conserve l’heure de mise à jour.
- Erreurs et état des capteurs
- Le coordinateur transforme les délais et erreurs API en UpdateFailed. L’annulation lors de l’arrêt est traitée séparément. Les définitions des capteurs et le client API restent hors de cette classe.
7. Architecture
Ouvrez un composant pour suivre ses connexions, ou explorez le diagramme complet.
Coordinateur Home Assistant
- Vers Client API Renpho
Client API Renpho
- Depuis Coordinateur Home Assistant
- Vers Mesures cloud
Mesures cloud
- Depuis Client API Renpho
- Vers État partagé actualisé
État partagé actualisé
- Depuis Mesures cloud
- Vers Entités de capteurs
Entités de capteurs
- Depuis État partagé actualisé
Mermaid Diagramme interactif
Vue générale des composants et des échanges vérifiés dans le dépôt.

flowchart LR
n0["Coordinateur Home Assistant"]
n1["Client API Renpho"]
n2["Mesures cloud"]
n3["État partagé actualisé"]
n4["Entités de capteurs"]
n0 --> n1
n1 --> n2
n2 --> n3
n3 --> n4
Version texte du diagramme
- Coordinateur Home Assistant → Client API Renpho
- Client API Renpho → Mesures cloud
- Mesures cloud → État partagé actualisé
- État partagé actualisé → Entités de capteurs
Suivre un parcours dans le code
Suivez _async_update_data à travers ses trois appels et exceptions. Une valeur peut être la dernière lecture réussie; l’état et l’heure d’actualisation permettent de la distinguer d’une nouvelle mesure.
8. Dossier technique
Établi à partir du code au commit b38c9df (26 fichiers). Chaque élément vient d’une correspondance de motif dans le code: ouvrez le fichier lié avant de vous y fier.
8.1. Couches et modules
Les dossiers sont classés par couche selon leur nom, de l’interface utilisateur jusqu’à l’accès aux données. Comme le classement repose sur les noms seulement, le diagramme ne dit rien des appels entre couches.
Mermaid Vue en couches
flowchart TB
subgraph L_interface["Points d’entrée et API"]
direction TB
interface_0["api<br/>3 fichiers"]
end
subgraph L_core["Source principale"]
direction TB
core_0["custom_components/renpho<br/>9 fichiers"]
end
subgraph L_hosting["Build, CI et hébergement"]
direction TB
hosting_0[".github<br/>7 fichiers"]
hosting_1[".devcontainer<br/>3 fichiers"]
hosting_2["api<br/>2 fichiers"]
hosting_3["(root)<br/>1 fichier"]
end
L_interface ~~~ L_core
L_core ~~~ L_hosting
| Module | Couche | Fichiers | Types | Extensions |
|---|---|---|---|---|
custom_components/renpho | Source principale | 9 | 18 | .py |
api | Points d’entrée et API | 3 | 15 | .py |
8.2. Modèle C4
Du contexte du système aux déclarations du code. Chaque niveau conserve les limites des sources disponibles.
UML 1 · Contexte du système
La vue C4 la plus large : qui utilise le projet et sur quels systèmes et stockages externes il s’appuie. Rendu avec uml-mcp.
Source PlantUML
@startuml
!include <C4/C4_Context>
LAYOUT_LEFT_RIGHT()
Person(P_http, "Client HTTP")
System(SYS, "hass_renpho", "hass_renpho est un fork d’intégration Home Assistant pour les mesures…")
System_Ext(E0, "API infonuagique Renpho")
System_Ext(E1, "Home Assistant")
Rel(P_http, SYS, "Utilise")
Rel(SYS, E0, "Appelle")
Rel(SYS, E1, "Appelle")
@enduml
UML 2 · Conteneurs
Un niveau plus près : les parties qui s’exécutent séparément dans le projet, leur langage principal et le chemin des appels entre elles. Rendu avec uml-mcp.
Source PlantUML
@startuml
!include <C4/C4_Container>
LAYOUT_LEFT_RIGHT()
Person(P_http, "Client HTTP")
System_Boundary(SYS, "hass_renpho") {
Container(APP, "hass_renpho", "Python")
}
System_Ext(E0, "API infonuagique Renpho")
System_Ext(E1, "Home Assistant")
Rel(P_http, APP, "Utilise")
Rel(APP, E0, "Appelle")
Rel(APP, E1, "Appelle")
@enduml
UML 3 · Composants et couches
Modules regroupés par couche du code. Les limites indiquent l’organisation, sans affirmer une isolation à l’exécution ni des appels. Rendu avec uml-mcp.
Source PlantUML
@startuml
!include <C4/C4_Component>
LAYOUT_TOP_DOWN()
System_Boundary(SYS, "hass_renpho") {
Boundary(L0, "Points d’entrée et API", "layer") {
Component(M0_0, "api", "Python", "3 fichiers")
}
Boundary(L1, "Source principale", "layer") {
Component(M1_0, "custom_components/renpho", "Python", "9 fichiers")
}
Boundary(L2, "Build, CI et hébergement", "layer") {
Component(M2_0, ".github", ".yml, .md", "7 fichiers")
Component(M2_1, ".devcontainer", ".md, .yaml, .json", "3 fichiers")
Component(M2_2, "api", "Dockerfile, .yml", "2 fichiers")
Component(M2_3, "(root)", ".json", "1 fichiers")
}
}
@enduml
UML 4 · Code
Déclarations, champs et méthodes sélectionnés, regroupés par fichier source. Aucun héritage ni appel n’est déduit. Rendu avec uml-mcp.
Source PlantUML
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
top to bottom direction
hide empty members
package "hass_renpho" {
package "api/app.py" as F0 {
class "RenphoWeight" as T0_0 {
_json_session_headers()
get_timestamp()
prepare_data()
open_session()
check_proxy()
_request()
}
class "DeviceBind" as T0_1 {
id
mac
scale_name
demo
hw_ble_version
device_type
hw_software_version
created_at
}
class "Girth" as T0_2 {
girth_id
user_id
time_stamp
time_zone
mac
internal_model
scale_name
neck_value
}
class "GirthGoal" as T0_3 {
girth_goal_id
user_id
girth_type
setup_goal_at
goal_value
goal_unit
initial_value
initial_unit
}
class "MeasurementDetail" as T0_4 {
id
b_user_id
time_stamp
created_at
created_stamp
scale_type
scale_name
mac
}
class "UserResponse" as T0_5 {
status_code
status_message
terminal_user_session_key
device_binds_ary
new_bodyage_logic_flag
cooling_period_flag
id
email
}
class "MeasurementResponse" as T0_6 {
status_code
status_message
last_at
previous_flag
previous_at
measurements
}
class "Users" as T0_7 {
scale_user_id
user_id
mac
index
key
method
}
class "GirthResponse" as T0_8 {
status_code
status_message
girths
deleted_girth_ids
last_updated_at
}
class "APIResponse" as T0_9 {
status
message
data
}
class "GirthGoalsResponse" as T0_10 {
status_code
status_message
girth_goals
}
}
package "custom_components/renpho/sensor.py" as F1 {
class "RenphoSensor" as T1_0 {
_apply_native_metadata()
_schedule_update()
_handle_coordinator_update()
unique_id()
extra_state_attributes()
category()
}
}
package "custom_components/renpho/config_flow.py" as F2 {
class "CannotConnect" as T2_0 {
__str__()
get_details()
}
class "RenphoConfigFlow" as T2_1 {
async_step_user()
async_step_select_user()
}
}
package "custom_components/renpho/coordinator.py" as F3 {
class "RenphoWeightCoordinator" as T3_0 {
_async_update_data()
last_updated()
}
}
package "api/http_fingerprint.py" as F4 {
class "ClientFingerprint" as T4_0 {
user_agent
accept_language
extra_headers
}
}
}
@enduml
8.3. Interface publique
Du code extérieur peut utiliser tout ce qui est listé ici. Le projet déclare aussi 33 types publics.
UML Cas d’utilisation
Chaque acteur est un type d’appelant, relié à ce qu’il peut demander au projet. Rendu avec uml-mcp.
Source PlantUML
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
left to right direction
actor "Client HTTP" as A_http
rectangle "hass_renpho" {
usecase "GET /" as U0
usecase "GET /auth" as U1
usecase "GET /generate_api_key" as U2
usecase "GET /info" as U3
usecase "GET /users" as U4
usecase "GET /measurements" as U5
}
A_http --> U0
A_http --> U1
A_http --> U2
A_http --> U3
A_http --> U4
A_http --> U5
@enduml
Routes HTTP 16
Mermaid Carte des routes par préfixe
flowchart LR
api(["HTTP API"])
g0["/"]
api --> g0
g0r0["GET /"]
g0 --> g0r0
g1["/all_users_measurements_his…"]
api --> g1
g1r0["GET /all_users_measurements_history"]
g1 --> g1r0
g2["/auth"]
api --> g2
g2r0["GET /auth"]
g2 --> g2r0
g3["/device_info"]
api --> g3
g3r0["GET /device_info"]
g3 --> g3r0
g4["/generate_api_key"]
api --> g4
g4r0["GET /generate_api_key"]
g4 --> g4r0
g5["/girth_goal"]
api --> g5
g5r0["GET /girth_goal"]
g5 --> g5r0
g6["/girth_info"]
api --> g6
g6r0["GET /girth_info"]
g6 --> g6r0
g7["/growth_record"]
api --> g7
g7r0["GET /growth_record"]
g7 --> g7r0
g8["/info"]
api --> g8
g8r0["GET /info"]
g8 --> g8r0
g9["/latest_model"]
api --> g9
g9r0["GET /latest_model"]
g9 --> g9r0
more["+6 groups"]
api --> more
| Méthode | Chemin | Source |
|---|---|---|
| GET | / | api/app.py:1301 |
| GET | /auth | api/app.py:1305 |
| GET | /generate_api_key | api/app.py:1310 |
| GET | /info | api/app.py:1319 |
| GET | /users | api/app.py:1330 |
| GET | /measurements | api/app.py:1374 |
| GET | /measurements_history | api/app.py:1385 |
| GET | /all_users_measurements_history | api/app.py:1396 |
Afficher 8 routes de plus
| GET | /weight | api/app.py:1407 |
| GET | /specific_metric | api/app.py:1418 |
| GET | /device_info | api/app.py:1429 |
| GET | /latest_model | api/app.py:1440 |
| GET | /girth_info | api/app.py:1451 |
| GET | /girth_goal | api/app.py:1462 |
| GET | /growth_record | api/app.py:1473 |
| GET | /message_list | api/app.py:1484 |
Points d’entrée
api/app.pyfichier d’entrée
8.4. Interface privée
Ces noms sont internes selon les conventions du langage: tiret bas initial, private, static ou pub(crate).
- Assistant préfixé _
- 8
_json_session_headersapi/app.py:396_requestapi/app.py:458_json_session_headerscustom_components/renpho/api_renpho.py:95
8.5. Entités et modèle de données 11
Mermaid Diagramme de classes des entités
classDiagram
direction LR
class E0["DeviceBind"] {
+int id
+str mac
+str scale_name
+str demo
+int hw_ble_version
+int device_type
}
class E1["Girth"] {
+int girth_id
+int user_id
+int time_stamp
+str time_zone
+str mac
+str internal_model
}
class E2["GirthGoal"] {
+int girth_goal_id
+int user_id
+str girth_type
+int setup_goal_at
+float goal_value
+int goal_unit
}
class E3["MeasurementDetail"] {
+int id
+int b_user_id
+int time_stamp
+str created_at
+int created_stamp
+int scale_type
}
class E4["UserResponse"] {
+str status_code
+str status_message
+str terminal_user_session_key
+List~DeviceBind~ device_binds_ary
+int new_bodyage_logic_flag
+int cooling_period_flag
}
class E5["MeasurementResponse"] {
+str status_code
+str status_message
+int last_at
+int previous_flag
+int previous_at
+List~MeasurementDetail~ measurements
}
class E6["Users"] {
+str scale_user_id
+str user_id
+str mac
+int index
+int key
+int method
}
class E7["GirthResponse"] {
+str status_code
+str status_message
+List~Girth~ girths
+List~int~ deleted_girth_ids
+int last_updated_at
}
class E8["APIResponse"] {
+str status
+str message
+Any data
}
class E9["GirthGoalsResponse"] {
+str status_code
+str status_message
+List~GirthGoal~ girth_goals
}
E4 --> E0 : device_binds_ary
E5 --> E3 : measurements
E7 --> E1 : girths
E9 --> E2 : girth_goals
Une flèche relie un champ à l’entité que son type nomme.
| Entité | Nature | Premiers champs |
|---|---|---|
DeviceBind | Schéma validé | id, mac, scale_name, demo, hw_ble_version, device_type, hw_software_version, created_at |
Girth | Schéma validé | girth_id, user_id, time_stamp, time_zone, mac, internal_model, scale_name, neck_value |
GirthGoal | Schéma validé | girth_goal_id, user_id, girth_type, setup_goal_at, goal_value, goal_unit, initial_value, initial_unit |
MeasurementDetail | Schéma validé | id, b_user_id, time_stamp, created_at, created_stamp, scale_type, scale_name, mac |
UserResponse | Schéma validé | status_code, status_message, terminal_user_session_key, device_binds_ary, new_bodyage_logic_flag, cooling_period_flag, id, email |
MeasurementResponse | Schéma validé | status_code, status_message, last_at, previous_flag, previous_at, measurements |
Users | Schéma validé | scale_user_id, user_id, mac, index, key, method |
GirthResponse | Schéma validé | status_code, status_message, girths, deleted_girth_ids, last_updated_at |
Afficher 3 entités de plus
APIResponse | Schéma validé | status, message, data |
|---|---|---|
GirthGoalsResponse | Schéma validé | status_code, status_message, girth_goals |
ClientFingerprint | Dataclass | user_agent, accept_language, extra_headers |
8.6. Logique métier
Une fois écartés le code d’interface et les services et entités ci-dessus, ces classes ont le plus de méthodes.
RenphoWeightPoints d’entrée et API, 31 méthodes_json_session_headers, get_timestamp, prepare_data, open_session, check_proxy, _requestRenphoSensorSource principale, 8 méthodes_apply_native_metadata, _schedule_update, _handle_coordinator_update, unique_id, extra_state_attributes, categoryCannotConnectSource principale, 2 méthodes__str__, get_detailsRenphoConfigFlowSource principale, 2 méthodesasync_step_user, async_step_select_userRenphoWeightCoordinatorSource principale, 2 méthodes_async_update_data, last_updated
8.7. Intégrations externes
Clients HTTP
Hôtes nommés dans le code
httpbin.org2 fichiersapi/app.py:441renpho.qnclouds.com2 fichiersapi/app.py:44
8.8. Stack et dépendances
Python requirements.txt 3 à l’exécution
Python api/requirements.txt 16 à l’exécution
Dépendances externes
13 paquets déclarés (13 à l’exécution, 0 pour le développement) dans requirements.txt, api/requirements.txt.
Tableau des paquets 13
| Paquet | Version | Usage | Rôle | Registre |
|---|---|---|---|---|
pycryptodome | >=3.3.1 | exécution | Cryptographic library for Python | pypi.org |
requests | >=2.26.0 | exécution | Client HTTP | pypi.org |
aiohttp | >=3.6.1 | exécution | Client HTTP | pypi.org |
fastapi | — | exécution | Cadriciel web | pypi.org |
uvicorn | — | exécution | Serveur d’application | pypi.org |
jinja2 | — | exécution | Gabarits | pypi.org |
pydantic | — | exécution | Validation des données | pypi.org |
python-multipart | — | exécution | A streaming multipart parser for Python | pypi.org |
cryptography | — | exécution | Authentification et sécurité | pypi.org |
pyjwt | — | exécution | Authentification et sécurité | pypi.org |
python-dotenv | — | exécution | Configuration | pypi.org |
starlette | — | exécution | Cadriciel web | pypi.org |
aiohttp_socks | — | exécution | Client HTTP | pypi.org |
8.9. Pipeline CI/CD
4 workflows GitHub Actions, 4 tâches. Chaque boîte est une tâche ; les boîtes à double bord publient ou déploient, et les flèches suivent les dépendances needs.
Mermaid Déroulement du pipeline
flowchart LR
subgraph wf0["Validate HACS"]
direction LR
wf0_validate_hacs["validate-hacs<br/>ubuntu-latest"]
end
subgraph wf1["Create Release"]
direction LR
wf1_release[["release<br/>ubuntu-latest"]]
end
subgraph wf2["Build"]
direction LR
wf2_build["Build<br/>ubuntu-latest"]
end
subgraph wf3["Python Unittest Workflow Inside Home Assist…"]
direction LR
wf3_build["build<br/>ubuntu-latest"]
end
t0(["push · demande de fusion · planification · …"])
t1(["push"])
t2(["push · demande de fusion"])
t0 --> wf0_validate_hacs
t1 --> wf1_release
t1 --> wf2_build
t2 --> wf3_build
| Workflow | Déclencheurs | Tâches | Publie vers |
|---|---|---|---|
Validate HACS.github/workflows/hacs-workflow.yml | push, demande de fusion, planification, lancement manuel |
| — |
Create Release.github/workflows/release.yml | push |
| — |
Build.github/workflows/sonar.yml | push |
| — |
Python Unittest Workflow Inside Home Assistant VM.github/workflows/tests.yml | push, demande de fusion |
| — |
8.10. Déploiement
Mermaid Schéma de déploiement
flowchart LR
repo[("Dépôt GitHub")]
ci[["GitHub Actions<br/>4 workflows"]]
image["Image Docker<br/>FROM python:3.12.2-slim"]
host_Vercel("Vercel<br/>vercel.json")
repo -->|"push ou demande de fusion"| ci
ci -->|"docker build"| image
ci -.->|"configuré"| host_Vercel
UML Déploiement
Le nœud extérieur est l’endroit où le code s’exécute. Chaque image de base pointe vers ce qu’elle construit, les flèches pleines mènent aux bases de données et les pointillées aux services externes. Rendu avec uml-mcp.
Source PlantUML
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
node "Image Docker" as H {
artifact "hass_renpho" as APP
}
artifact "FROM python:3.12.2-slim" as IMG0
IMG0 ..> APP : construit
artifact "FROM python:3.12.2-slim" as IMG1
IMG1 ..> APP : construit
cloud "Vercel" as X0
X0 ..> APP
cloud "API infonuagique Renpho" as E0
APP ..> E0
cloud "Home Assistant" as E1
APP ..> E1
@enduml
Où il s’exécute
Images Docker de base
8.11. Supervision
Ce que le code consigne, mesure et expose pour savoir s’il fonctionne.
8.12. Sécurité
Contrôles
Chaîne d’approvisionnement
Variables d’environnement 5
La page reprend les noms sans leurs valeurs et souligne ceux qui ressemblent à des secrets.
Rien trouvé pour: Services, Base de données, Tests automatisés.
9. Types et structure des fichiers
33 types déclarés, dont 12 dans l’aperçu des relations de base.
Diagramme des types
classDiagram
direction TB
class t1c013f7e1614["RenphoWeight"] {
__init__()
_json_session_headers()
get_timestamp()
prepare_data()
}
class t018fc6091cac["AuthenticationError"] {
}
class tf6d6f400bcb6["APIError"] {
}
class t3f96fd588bea["ClientSSLError"] {
}
class teb0533bd5d5d["RenphoWeightCoordinator"] {
__init__()
_async_update_data()
last_updated()
}
class t16ebe0abcf92["RenphoSensor"] {
__init__()
_apply_native_metadata()
_schedule_update()
_handle_coordinator_update()
}
class t21aebcf929af["DeviceBind"] {
get()
}
class ta3053775281d["UserResponse"] {
get()
}
class t7807df8cb6f0["MeasurementDetail"] {
get()
}
class ta4f92b147e4f["MeasurementResponse"] {
get()
}
class td4123c774424["Users"] {
get()
}
class t9147ce26b037["GirthGoal"] {
get()
}
class bbff3815f3008["Exception"] {
<<unresolved_base>>
}
bbff3815f3008 <|-- t018fc6091cac
bbff3815f3008 <|-- tf6d6f400bcb6
bbff3815f3008 <|-- t3f96fd588bea
class b86550088d462["DataUpdateCoordinator"] {
<<unresolved_base>>
}
b86550088d462 <|-- teb0533bd5d5d
class b861c1788888f["SensorEntity"] {
<<unresolved_base>>
}
b861c1788888f <|-- t16ebe0abcf92
class bb33e03eb53a5["BaseModel"] {
<<unresolved_base>>
}
bb33e03eb53a5 <|-- t21aebcf929af
bb33e03eb53a5 <|-- ta3053775281d
bb33e03eb53a5 <|-- t7807df8cb6f0
bb33e03eb53a5 <|-- ta4f92b147e4f
bb33e03eb53a5 <|-- td4123c774424
bb33e03eb53a5 <|-- t9147ce26b037
Les bases non résolues restent identifiées; les signatures complètes ne sont pas reconstruites.
10. Référence
17 / 17 fichiers admissibles lus (59 dans l’arbre); 0 trop volumineux, 0 échec de lecture et 0 diagnostic de syntaxe.
Ce que couvre l’analyse
Les dossiers connus de dépendances et de compilation, les fichiers d’identifiants et les binaires sont exclus. La collecte couvre les README, les manifestes reconnus et les fichiers source pris en charge.
Les statistiques Linguist couvrent l’ensemble du dépôt et peuvent inclure d’autres langages.
12. Fichiers à lire 3
13. Glossaire
Dépôt
Les fichiers source, la configuration et l’historique versionné d’un projet.
README
Le document d’entrée du dépôt, qui présente généralement son rôle et son installation.
Dépendance
Une bibliothèque, un outil ou un service nécessaire à la compilation ou à l’exécution d’un composant.
API
Une interface par laquelle des composants logiciels échangent des requêtes et des résultats. Une API n’utilise pas nécessairement HTTP.
Conteneur
Un environnement de processus isolé créé à partir d’une image. Les données persistantes nécessitent un stockage hors de son système de fichiers temporaire.
Port publié
Un port de l’hôte associé au port d’un service dans un conteneur. Sa publication peut rendre le service accessible hors du réseau des conteneurs.
Fork
Un dépôt distinct dérivé d’un autre projet. Une modification du fork ne devient pas automatiquement une modification du projet amont.
14. Références
- antoinebou12. (2026, 5 novembre). hass_renpho. [Software repository] github.com.
- antoinebou12. (2026, 5 novembre). hass_renpho: README. [Repository documentation] github.com.
- antoinebou12. (2026, 5 novembre). custom_components/renpho/coordinator.py. [Source file] github.com.
- antoinebou12. (2026, 5 novembre). custom_components/renpho/sensor.py. [Source file] github.com.
- antoinebou12. (2026, 5 novembre). custom_components/renpho/api_renpho.py. [Source file] github.com.
- Boucher, A. (2021, 10 octobre). Balance Renpho, Home Assistant et rétro-ingénierie de l’API. [Project article] antoineboucher.info.
- Boucher, A. (2026, 23 octobre). hass_renpho : Interroger une API cloud pour Home Assistant. [Project article] antoineboucher.info.
Les sources sans date de publication indiquent la date de leur dernière vérification, le 5 novembre 2026. Les liens des fichiers conservent la révision inspectée lorsqu’elle est disponible.