Aller au contenu
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.

Intégration Fork
  • Mis à jour
  • 14
  • Python · 99.51%
Python Crédit amont
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.

Python99.51%
99.51%144 406 octets
Dockerfile0.49%
0.49%711 octets
Langage%Octets
Python99.51%144 406
Dockerfile0.49%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.

Diagramme de cas d’utilisation de hass_renpho : Se connecter, choisir l’usager; Interroger les mesures; Afficher les mesures; Passer par un mandataire; Tester un compte dans l’APIhass_renphoSe connecter, choisir l’usagerInterroger les mesuresAfficher les mesuresPasser par un mandataireTester un compte dans l’APIUsager Home Assistant«système»Home Assistant«système»API nuagique Renpho
Acteurs à gauche (personnes) et à droite (systèmes externes) ; chaque ovale est un cas d’utilisation appuyé par les fichiers cités ci-dessous.
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

  1. Copier custom_components/renpho dans <config_dir>/custom_components/renpho/ (ou installer via HACS).
  2. Ajouter renpho: avec email, password et refresh: 600 dans configuration.yaml, plus sensor: platform: renpho.
  3. Redémarrer Home Assistant ; l’intégration se connecte à l’ancienne API Renpho et retrouve l’identifiant de l’usager.
  4. Monter sur la balance avec l’ancienne appli Renpho pour que la mesure arrive dans le nuage.
  5. 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.

Ouvrir dans un nouvel onglet https://hass-renpho.vercel.app/docs

4. Démarrage

Ces commandes viennent de la documentation du dépôt. Elles n’ont pas été exécutées pendant cette revue.

README.md · Installation
Stable
Use the latest release
Not stable
git clone https://github.com/antoinebou12/hass_renpho

5. 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

  1. You must have a Renpho scale. If you don’t have one, you can purchase one here.
  2. You must have the Renpho app installed on your mobile device. You can download it here for Android and here for iOS.
  3. You must have the Home Assistant Community Store (HACS) installed and running.
Lire les instructions complètes ↗

5.2. Installation

README.md

Copy this folder to /custom_components/renpho/.
Lire les instructions complètes ↗

5.3. Prerequisites (README.md)

docs/README.md

  1. You must have a Renpho account. If you don’t have one, you can create one here.
  2. You must have Home Assistant installed and running.
  3. Visual Studio Code is recommended for editing the files.
Lire les instructions complètes ↗

5.4. Installation (README.md)

docs/README.md

  1. Copy this folder to /custom_components/hass_renpho/.
  2. Add the necessary configuration to your configuration.yaml file.
Lire les instructions complètes ↗
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:

Lire les instructions complètes ↗

5.6. Parameters

docs/README.md

None
Lire les instructions complètes ↗

5.7. Parameters (README.md)

docs/README.md

  • metric (str): The specific metric to retrieve (e.g., ‘weight’, ‘bmi’).
Lire les instructions complètes ↗

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.
Lire les instructions complètes ↗

5.9. Parameters (docs/README.md)

docs/README.md

  • polling_interval (int): Time in seconds between each polling call. Defaults to 60 seconds.
Lire les instructions complètes ↗
API et intégration

5.10. API Documentation

docs/README.md

The RenphoWeight class is the core of this integration, providing methods to interact with the Renpho API. Below are detailed explanations of the methods available in this class.
Lire les instructions complètes ↗

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.

Lire les instructions complètes ↗

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.
Lire les instructions complètes ↗
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
Lire les instructions complètes ↗

5.14. Step by Step debugging

.devcontainer/README.md

With the development container, you can test your custom component in Home Assistant with step by step debugging. You need to modify the configuration.yaml file in .devcontainer folder by uncommenting the line: Then launch the task Run Home Assistant on port 9123, and launch the debugger with the existing debugging configuration Python: Attach Local. For more information, look at the Remote Python Debugger integration documentation.
Lire les instructions complètes ↗
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.
Lire les instructions complètes ↗

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:
  1. Fork the repository.
Lire les instructions complètes ↗
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.

Composants du système Contexte
Mermaid Diagramme interactif

Vue générale des composants et des échanges vérifiés dans le dépôt.

Vue statique de l’architecture de hass_renpho
Aperçu statique. Le diagramme interactif le remplace après le chargement de Mermaid.
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
Modules et couche principale
ModuleCoucheFichiersTypesExtensions
custom_components/renphoSource principale918.py
apiPoints d’entrée et API315.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
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
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
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
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
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éthodeCheminSource
GET/api/app.py:1301
GET/authapi/app.py:1305
GET/generate_api_keyapi/app.py:1310
GET/infoapi/app.py:1319
GET/usersapi/app.py:1330
GET/measurementsapi/app.py:1374
GET/measurements_historyapi/app.py:1385
GET/all_users_measurements_historyapi/app.py:1396
Afficher 8 routes de plus
GET/weightapi/app.py:1407
GET/specific_metricapi/app.py:1418
GET/device_infoapi/app.py:1429
GET/latest_modelapi/app.py:1440
GET/girth_infoapi/app.py:1451
GET/girth_goalapi/app.py:1462
GET/growth_recordapi/app.py:1473
GET/message_listapi/app.py:1484

Points 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

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éNaturePremiers champs
DeviceBindSchéma validéid, mac, scale_name, demo, hw_ble_version, device_type, hw_software_version, created_at
GirthSchéma validégirth_id, user_id, time_stamp, time_zone, mac, internal_model, scale_name, neck_value
GirthGoalSchéma validégirth_goal_id, user_id, girth_type, setup_goal_at, goal_value, goal_unit, initial_value, initial_unit
MeasurementDetailSchéma validéid, b_user_id, time_stamp, created_at, created_stamp, scale_type, scale_name, mac
UserResponseSchéma validéstatus_code, status_message, terminal_user_session_key, device_binds_ary, new_bodyage_logic_flag, cooling_period_flag, id, email
MeasurementResponseSchéma validéstatus_code, status_message, last_at, previous_flag, previous_at, measurements
UsersSchéma validéscale_user_id, user_id, mac, index, key, method
GirthResponseSchéma validéstatus_code, status_message, girths, deleted_girth_ids, last_updated_at
Afficher 3 entités de plus
APIResponseSchéma validéstatus, message, data
GirthGoalsResponseSchéma validéstatus_code, status_message, girth_goals
ClientFingerprintDataclassuser_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.

RenphoWeight Points d’entrée et API, 31 méthodes
_json_session_headers, get_timestamp, prepare_data, open_session, check_proxy, _request
RenphoSensor Source principale, 8 méthodes
_apply_native_metadata, _schedule_update, _handle_coordinator_update, unique_id, extra_state_attributes, category
CannotConnect Source principale, 2 méthodes
__str__, get_details
RenphoConfigFlow Source principale, 2 méthodes
async_step_user, async_step_select_user
RenphoWeightCoordinator Source principale, 2 méthodes
_async_update_data, last_updated

8.7. Intégrations externes

Clients HTTP

httpx aiohttp

Hôtes nommés dans le code

8.8. Stack et dépendances

Python requirements.txt 3 à l’exécution

Ouvrir le manifeste

Python api/requirements.txt 16 à l’exécution

Ouvrir le manifeste

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
Dépendances externes
PaquetVersionUsageRôleRegistre
pycryptodome>=3.3.1exécutionCryptographic library for Pythonpypi.org
requests>=2.26.0exécutionClient HTTPpypi.org
aiohttp>=3.6.1exécutionClient HTTPpypi.org
fastapi—exécutionCadriciel webpypi.org
uvicorn—exécutionServeur d’applicationpypi.org
jinja2—exécutionGabaritspypi.org
pydantic—exécutionValidation des donnéespypi.org
python-multipart—exécutionA streaming multipart parser for Pythonpypi.org
cryptography—exécutionAuthentification et sécuritépypi.org
pyjwt—exécutionAuthentification et sécuritépypi.org
python-dotenv—exécutionConfigurationpypi.org
starlette—exécutionCadriciel webpypi.org
aiohttp_socks—exécutionClient HTTPpypi.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
Workflows, déclencheurs, tâches et cibles
WorkflowDéclencheursTâchesPublie vers
Validate HACS
.github/workflows/hacs-workflow.yml
push, demande de fusion, planification, lancement manuel
  • validate-hacs ubuntu-latest
    actions/checkout · HACS validation · home-assistant/actions/hassfest
—
Create Release
.github/workflows/release.yml
push
  • release ubuntu-latest
    Checkout code · Generate Changelog · Create Release · Zip custom_components/renpho directory · Zip complete code · Upload custom_components/renpho ZIP to Release
—
Build
.github/workflows/sonar.yml
push
  • Build ubuntu-latest
    actions/checkout · sonarsource/sonarqube-scan-action
—
Python Unittest Workflow Inside Home Assistant VM
.github/workflows/tests.yml
push, demande de fusion
  • build ubuntu-latest
    actions/checkout · Set up Python 3 · Install Dependencies · Run Tests
—

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
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

python:3.12.2-slim python:3.12.2-slim

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.

PASSWORD RSA_PRIVATE_KEY RSA_PUBLIC_KEY EMAIL USER_ID

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

  1. antoinebou12. (2026, 5 novembre). hass_renpho. [Software repository] github.com.
  2. antoinebou12. (2026, 5 novembre). hass_renpho: README. [Repository documentation] github.com.
  3. antoinebou12. (2026, 5 novembre). custom_components/renpho/coordinator.py. [Source file] github.com.
  4. antoinebou12. (2026, 5 novembre). custom_components/renpho/sensor.py. [Source file] github.com.
  5. antoinebou12. (2026, 5 novembre). custom_components/renpho/api_renpho.py. [Source file] github.com.
  6. Boucher, A. (2021, 10 octobre). Balance Renpho, Home Assistant et rétro-ingénierie de l’API. [Project article] antoineboucher.info.
  7. 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.