Objectif
Mon objectif était de connecter mon compte bancaire à Home Assistant pour suivre mon solde et mes transactions en temps réel. Pour cela, j’ai utilisé l’API de Powens (anciennement Budget Insight), une plateforme qui permet gratuitement d’accéder aux données bancaires de manière sécurisée et conforme à la réglementation DSP2.
J’ai créé un compte Powens
Je me suis inscrit sur le site de Powens pour créer un compte. Powens propose une solution d’agrégation bancaire qui permet de récupérer des informations financières via des API. C’est parfait pour mon projet domotique.

Qui est Powens ?
Powens (anciennement Budget Insight) est une plateforme leader dans le domaine de l’agrégation bancaire et de l’Open Banking. Grâce à des API conformes à la réglementation DSP2 (Directive sur les Services de Paiement), Powens permet aux développeurs et aux entreprises d’accéder de manière sécurisée aux données bancaires des utilisateurs (avec leur consentement). Leur technologie est utilisée par des fintechs, des banques et des applications de gestion financière pour offrir des services innovants comme l’analyse des dépenses, la catégorisation des transactions ou la gestion de budget.
Dans mon cas, j’utilise une infime partie du potentiel de Powens via leur sandbox, un environnement de test qui me permet de me connecter à mon compte bancaire pour récupérer des informations comme le solde et les dernières transactions. Cette utilisation génère très peu de trafic et reste dans le cadre des offres gratuites proposées par Powens pour les développeurs et les petits projets. Cela me permet d’intégrer ces données dans mon système domotique sans coût supplémentaire, tout en bénéficiant de la puissance et de la fiabilité de leur plateforme.
Je trouve que c’est une très bonne initiative de la part de Powens de permettre cela. En offrant un accès gratuit à leur sandbox, ils permettent aux bidouilleurs en domotique comme moi d’expérimenter et de créer des solutions personnalisées. Ces bidouilleurs, souvent passionnés et influents dans leurs cercles professionnels ou personnels, peuvent ensuite recommander des plateformes solides et sérieuses comme Powens à des services plus larges ou à des entreprises. C’est une stratégie gagnant-gagnant : Powens gagne en visibilité et en crédibilité, tandis que les utilisateurs bénéficient d’un outil fiable et performant.
J’ai ajouté un workspace
Une fois connecté, j’ai créé un nouveau workspace. Un workspace est un espace de travail qui regroupe mes configurations et mes applications. J’ai nommé le mien sigalou-domotique pour garder une trace claire de mon projet.

J’ai ajouté un domaine
Ensuite, j’ai ajouté un domaine à mon workspace. Cela permet de configurer l’environnement pour les requêtes API. J’ai choisi le domaine sigalou.


La configuration a pris quelques minutes. Une fois terminée, j’ai noté que les commandes API devaient être envoyées à l’adresse suivante : https://sigalou-sandbox.biapi.pro.
J’ai ajouté une application
L’ajout d’une application est obligatoire pour établir la connexion avec mon compte bancaire. Cette application génère des identifiants uniques (client ID et client secret) qui seront utilisés pour authentifier les requêtes API.


Cette application m’a fourni un client ID et un client secret. Je les ai notés soigneusement, car ils seront nécessaires pour créer un utilisateur API.
J’ai installé Postman pour Windows
Pour interagir avec l’API Powens, j’ai utilisé Postman, un outil très pratique pour envoyer et tester des requêtes API. Postman permet de simuler des appels API et de visualiser les réponses en temps réel.

J’ai ajouté un utilisateur via l’API
Pour créer un utilisateur, j’ai envoyé une commande POST à l’URL suivante : https://sigalou-sandbox.biapi.pro/2.0/auth/init. J’ai utilisé le client ID et le client secret récupérés précédemment.

Dans le corps de la requête (Body / raw / JSON), j’ai ajouté :
{
« client_id »: « icileclient_id_récupéré_plus_haut »,
« client_secret »: « icileclient_secret_récupéré_plus_haut »
}
Dans la réponse, j’ai relevé le id_user et le auth_token, qui seront utilisés pour les prochaines étapes.
J’ai obtenu un code temporaire
Ce code temporaire est nécessaire pour établir la connexion avec mon compte bancaire. Pour l’obtenir, j’ai envoyé une commande GET à l’URL suivante : https://sigalou-sandbox.biapi.pro/2.0/auth/token/code?type=singleAccess.

J’ai utilisé le auth_token récupéré précédemment dans l’en-tête d’autorisation (Authorization / Bearer Token). Dans la réponse, j’ai relevé le code temporaire.
J’ai lancé la Webview pour connecter mon compte bancaire
Pour établir la connexion avec mon compte bancaire, j’ai construit l’URL de la Webview en remplaçant les placeholders par mes identifiants :
https://sigalou-sandbox.biapi.pro/2.0/auth/webview/connect?redirect_uri=https%3A%2F%2Fintegrate.budget-insight.com%2Fdemos%2Fconnect%2Fcallback&client_id=xxxx&code=yyy
J’ai remplacé xxxx par mon client ID et yyy par le code temporaire. J’ai laissé le redirect_uri tel quel, comme indiqué dans la documentation.
Une fois la connexion établie, j’ai pu accéder à mes données bancaires.

J’ai testé la récupération du solde du compte
Pour récupérer le solde de mon compte, j’ai envoyé une commande GET à l’URL suivante : https://sigalou-sandbox.biapi.pro/2.0/users/1/accounts, où 1 est mon id_user.

Dans la réponse, j’ai récupéré le solde de mon compte, qui était de 599.84€ lors de mon test.
J’ai testé la récupération des dernières transactions
Pour récupérer les dernières transactions, j’ai envoyé une commande GET à l’URL suivante : https://sigalou-sandbox.biapi.pro/2.0/users/1/transactions?limit=10, où 1 est mon id_user.

La réponse contenait un JSON avec mes 10 dernières transactions.
J’ai transformé les requêtes API en capteurs Home Assistant
Pour intégrer ces données dans Home Assistant, j’ai créé deux capteurs REST : transactions_banque et solde_banque. Voici le code utilisé :
- platform: rest
name: "transactions_banque"
resource: https://sigalou-sandbox.biapi.pro/2.0/users/1/transactions
params:
limit: 25
headers:
Authorization: !secret token_banque
scan_interval: 31536000 # Désactive les mises à jour automatiques (1 an)
json_attributes:
- first_date
- last_date
- transactions
- total
value_template: "{{ now().strftime('%d/%m/%Y %H:%M:%S') }}"
- platform: rest
name: "solde_banque"
resource: https://sigalou-sandbox.biapi.pro/2.0/users/1/accounts
headers:
Authorization: !secret token_banque
scan_interval: 31536000 # Désactive les mises à jour automatiques
value_template: "{{ value_json.balance }}"
unit_of_measurement: "€"
Ces capteurs sont à placer dans le fichier sensors.yaml.

Pour que le token soit correctement envoyé, j’ai ajouté cette ligne dans le fichier secrets.yaml :
token_banque: Bearer a8N5q1aUVEa33wl0dCJM...

Une fois configurés, les capteurs sont apparus dans Home Assistant :

Observations sur ces capteurs :
- Le rafraîchissement est réglé à 3153600 secondes (environ 1 an), car j’ai prévu d’actualiser les données via une automatisation quotidienne à midi. Cela me permettra de recevoir des notifications en fonction du solde ou des dernières transactions.
- Les capteurs peuvent être simplifiés. J’avais initialement inclus des données comme first_date et last_date, mais je les ai finalement retirées car elles n’étaient pas utiles en production.
- Le paramètre limit: 25 peut être ajusté en fonction de la taille de l’écran et de la carte choisie sur le dashboard.
J’ai ajouté des templates pour calculer ce dont j’ai besoin
Dans le fichier templates.yaml, sous sensor, j’ai ajouté ces templates :

- name: "transactions_a_venir_montant"
state: >-
{% set transactions = state_attr('sensor.transactions_banque', 'transactions') %}
{% set total = namespace(amount=0) %}
{% for transaction in transactions if transaction.coming %}
{% set total.amount = total.amount + transaction.value %}
{% endfor %}
{{ total.amount }}
unit_of_measurement: "€"
- name: "solde_disponible"
unique_id: sensor.solde_disponible
unit_of_measurement: "€"
state: >-
{% set solde = states('sensor.solde_banque') | float %}
{% set depenses = states('sensor.transactions_a_venir_montant') | float %}
{{ (solde + depenses) | round(2) }}
- Le capteur transactions_a_venir_montant calcule le montant total des transactions à venir (comme les prélèvements programmés).
- Le capteur solde_disponible calcule le solde réel en soustrayant les transactions à venir du solde actuel.
J’ajoute une automatisation pour rafraîchir les données
Comme je l’ai expliqué plus tôt, j’ai volontairement désactivé le rafraîchissement automatique des capteurs REST en leur attribuant une valeur de scan_interval très élevée (31536000 secondes, soit environ 1 an). Cela me permet de contrôler manuellement quand les données sont actualisées, plutôt que de les rafraîchir toutes les x minutes. Cette approche est plus adaptée à mes besoins, car je prévois d’utiliser ces données pour déclencher des notifications en fonction de mon solde ou des dernières transactions importantes.
Pour gérer cela, j’ai ajouté une automatisation dans Home Assistant qui actualise mes deux capteurs (solde_banque et transactions_banque) tous les jours à midi. Voici le code de cette automatisation :
alias: Mettre à jour Compte bancaire
description: ""
triggers:
- trigger: time
at: "12:00:00"
conditions: []
actions:
- action: homeassistant.update_entity
data:
entity_id:
- sensor.solde_banque
- sensor.transactions_banque
mode: single

Cette automatisation est simple mais efficace : elle déclenche une mise à jour des capteurs à midi chaque jour. Cela me permet de garder mes données à jour sans surcharger l’API ou mon système avec des requêtes inutiles. De plus, cela me laisse la possibilité d’ajouter d’autres actions plus tard, comme l’envoi de notifications ou l’exécution de scripts en fonction des données récupérées.
Je réalise les cartes et le screen du dashboard
Après avoir configuré les capteurs et les automatismes, j’ai conçu un dashboard dans Home Assistant pour visualiser mes données bancaires de manière claire et organisée. Voici le résultat final de mes essais :

Voici le code complet de la page, que je vais décomposer pour expliquer chaque partie :
type: sections
max_columns: 4
path: ss
sections:
- type: grid
cards:
- type: entity
entity: sensor.solde_banque
name: Solde bancaire
icon: mdi:bank-transfer
grid_options:
columns: full
card_mod:
style: |
ha-card {
padding: 4px;
border-radius: 15px;
}
.icon ha-state-icon {
--mdc-icon-size: 50px !important; /* Taille de l'icône */
margin-bottom: 10px;
}
- type: markdown
content: >
{% set transactions = state_attr('sensor.transactions_banque', 'transactions') %}
## AUJOURD'HUI
{% for transaction in transactions %}
{% if not transaction.coming %}
{% if transaction.date %}
{% set date_obj = transaction.date | as_datetime %}
{% set formatted_date = date_obj.strftime('%d/%m/%Y') %}
{% else %}
{% set formatted_date = 'Date inconnue' %}
{% endif %}
{% if transaction.type == 'card' %}💳 {{ formatted_date }}
{% elif transaction.type == 'bank' %} 🏦 {{ formatted_date }}
{% elif transaction.type == 'check' %} 📝 {{ formatted_date }}
{% elif transaction.type == 'transfer' %}💸 {{ formatted_date }}
{% else %}⚪ {{ formatted_date }}
{% endif %}
<strong>
{% if transaction.value > 0 %} 🟢 {{ transaction.formatted_value }}
{% else %} 🔴 {{ transaction.formatted_value }}
{% endif %}
</strong>
<small>{{ transaction.wording }}</small>
{% endif %}
{% endfor %}
grid_options:
columns: 24
rows: auto
- type: vertical-stack
cards:
- type: markdown
content: >
{% set transactions = state_attr('sensor.transactions_banque', 'transactions') %}
## A VENIR {{ states('sensor.transactions_a_venir_montant')|float|round(2) }} €
{% for transaction in transactions %}
{% if transaction.coming %}
{% if transaction.date %}
{% set date_obj = transaction.date | as_datetime %}
{% set formatted_date = date_obj.strftime('%d/%m/%Y') %}
{% else %}
{% set formatted_date = 'Date inconnue' %}
{% endif %}
{% if transaction.type == 'card' %}💳 {{ formatted_date }}
{% elif transaction.type == 'bank' %} 🏦 {{ formatted_date }}
{% elif transaction.type == 'check' %} 📝 {{ formatted_date }}
{% elif transaction.type == 'transfer' %}💸 {{ formatted_date }}
{% else %}⚪ {{ formatted_date }}
{% endif %}
{% if transaction.value > 0 %} 🟢 {{ transaction.formatted_value }} - {{ transaction.wording }}
{% else %} 🔴 {{ transaction.formatted_value }} - {{ transaction.wording }}
{% endif %}
{% endif %}
{% endfor %}
grid_options:
columns: 12
rows: auto
- type: entity
entity: sensor.solde_disponible
name: Solde disponible
icon: mdi:bank-transfer
grid_options:
columns: full
card_mod:
style: |
ha-card {
padding: 4px;
border-radius: 15px;
}
.icon ha-state-icon {
--mdc-icon-size: 50px !important; /* Taille de l'icône */
margin-bottom: 10px;
}
- type: entities
entities:
- entity: sensor.transactions_banque
name: Dernière mise à jour des données
format: datetime
column_span: 3
cards: []
icon: mdi:currency-eur
Décomposition du dashboard
Mon dashboard est structuré en plusieurs sections et cartes pour afficher les informations de manière claire et intuitive. Voici ce que fait chaque carte :
1. Carte « Solde bancaire »
Cette carte affiche le solde actuel de mon compte bancaire. Elle utilise le capteur sensor.solde_banque et inclut une icône stylisée (mdi:bank-transfer) pour une meilleure visibilité. J’ai ajouté un style personnalisé pour arrondir les coins de la carte et agrandir l’icône.
2. Carte « AUJOURD’HUI »
Cette carte affiche les transactions effectuées aujourd’hui. Elle utilise un template Markdown pour formater les données :
- Les transactions sont classées par type (💳 pour les cartes, 🏦 pour les virements, etc.).
- Les montants sont affichés en vert (🟢) pour les crédits et en rouge (🔴) pour les débits.
- La date de chaque transaction est formatée au format jj/mm/aaaa.
3. Carte « A VENIR »
Cette carte affiche les transactions à venir (comme les prélèvements programmés). Elle utilise également un template Markdown :
- Le montant total des transactions à venir est affiché en haut de la carte.
- Chaque transaction est listée avec son type, sa date et son montant.
4. Carte « Solde disponible »
Cette carte affiche le solde disponible après déduction des transactions à venir. Elle utilise le capteur sensor.solde_disponible et partage le même style que la carte « Solde bancaire ».
5. Carte « Dernière mise à jour des données »
Cette carte affiche la date et l’heure de la dernière mise à jour des données bancaires. Elle utilise le capteur sensor.transactions_banque et formate la date au format datetime.