目标 目标
我的目标是将我的银行账户连接到家庭助理,以实时跟踪我的余额和交易。 为此,我使用了Powens API(前身为Budget Insight),这是一个以安全和符合PSD2的方式免费访问银行数据的平台。
我创建了一个Powens帐户。
我在Powens网站上注册以创建一个帐户。 Powens提供了一个银行聚合解决方案,允许通过API检索财务信息。 这非常适合我的家庭自动化项目。

谁是波文斯?
波文斯 · 波文斯 (前身为Budget Insight)是该领域的领先平台。银行 聚合 以及开放 银行. 通过符合PSD2的API(支付服务指令),Powens使开发人员和企业能够安全地访问用户的银行数据(征得他们的同意)。 他们的技术被金融科技公司,银行和金融管理应用程序用于提供创新服务,如支出分析,交易分类或预算管理。
就我而言,我用的是a 小 部分 Powens通过他们的潜力 沙盒 箱, 测试环境允许我登录我的银行账户以检索余额和最新交易等信息。 此使用生成 交通量极少 并保持在Powens为开发人员和小型项目提供的免费优惠框架内。 这允许我将这些数据集成到家庭自动化系统中,无需额外成本,同时受益于其平台的强大和可靠性。
我想是A 非常好的倡议 波文斯允许这样做。 通过免费访问他们的沙箱,他们使像我这样的家庭自动化黑客能够实验和创建定制的解决方案。 这些黑客在他们的专业或个人圈子中经常充满激情和影响力,然后可以向更广泛的服务或公司推荐像Powens这样的坚实而严肃的平台。 这是一个双赢的战略: Powens 提高了知名度和可信度,而用户则受益于可靠和高效的工具。
我添加了一个工作空间
连接后,我创建了一个新的工作区。 工作空间是一个工作区,它汇集了我的配置和应用程序。 我取名我的 西加洛-多莫蒂斯 保持一个清晰的记录我的项目。

我增加了一个领域。
然后我在我的工作空间中添加了一个域。 这允许配置API查询的环境。 我选择了域名 西加洛 ,.


设置花了几分钟。 一旦完成,我注意到 API 命令必须发送到以下地址: https://sigalou-sandbox.biapi.pro.
我添加了一个APP
添加应用程序是强制性的,以建立与我的银行账户的连接。 此应用程序生成唯一标识符(客户端 ID 和秘密客户端),用于验证 API 请求。


这个应用程序给了我一个 客户 ID 和 一 秘密客户. 我已经仔细地注意到了它们,因为他们需要创建一个API用户。
安装 Postman for Windows
为了与Powens API进行交互,我使用了Postman,这是一个非常方便的工具,用于发送和测试API查询。 Postman允许您模拟API调用并实时查看响应。

我通过 API 添加了一个用户
为了创建用户,我向以下 URL 发送了一个 POST 命令: https://sigalou-sandbox.biapi.pro/2.0/auth/init. 我使用以前检索的ID客户端和秘密客户端。

在应用程序的主体(Body / raw / JSON)中,我添加了:
在回答中,我注意到了 id_user 的 以及 auth _token 的, 这将用于接下来的步骤。
我有一个临时代码。
这个临时代码是建立与我的银行账户的连接所必需的。 为了获得它,我向以下URL发送了一个GET命令: https://sigalou-sandbox.biapi.pro/2.0/auth/token/code?type=singleAccess.

我用过 auth _token 的 以前从 Authorization / Bearer Token 中检索。 在回答中,我注意到了 代码 代码 暂时的...
我推出了Webview来连接我的银行账户。

为了建立与我的银行账户的连接,我在Link Builder中构建了Webview URL,并通过点击开始连接。 开放 和 测试

我测试了账户余额的恢复情况
为了恢复帐户余额,我向以下URL发送了GET订单: https://sigalou-sandbox.biapi.pro/2.0/users/1/accounts, 何地 1 是我的id_user。

在回复中,我收回了我的账户余额,这是 599.84€ 在我的测试中。
我测试了最后一笔交易的恢复情况。
为了检索最新的交易,我向以下URL发送了一个GET命令: https://sigalou-sandbox.biapi.pro/2.0/users/1/transactions?limit=10, 何地 1 是我的id_user。

答案包含一个JSON,包括我最近10次交易。
我将 API 查询变成 Home Assistant 传感器
为了将这些数据集成到家庭助理中,我创建了两个REST传感器: _ 银行交易 以及 _ 银行结余. 以下是所使用的代码:
平台: 休息名 : "_bank transaction" 资源: https://sigalou-sandbox.biapi.pro/2.0/users/1/transactions Params: 限制 : 25个标题: 授权: secret token_bank scan_interval: 31536000 # 禁用自动更新(1年)json_attributes: first_date - last_date - transaction - total value_template: { now().strftime(')%d/%m/%Y 位 %H:%M:%S')}" - 平台: 休息名 : "_bank balance" 资源: https://sigalou-sandbox.biapi.pro/2.0/users/1/accounts: 授权: secret token_bank scan_interval: 31536000 # 禁用自动更新 value_template : "{value_json.balance }}" unit_of _measurement: 『 欧元』
这些传感器将被放置在文件中。 传感器.yaml.

为了正确发送令牌,我将此行添加到文件中。 Secrets.yaml :
Token_bank : A8N5q1aUVEa33wl0dCJM ...

配置后,传感器出现在 Home Assistant 中:

对这些传感器的观察:
- 刷新设置为3153600秒(大约1年),因为我计划在中午通过日常自动化更新数据。 这将允许我收到基于余额或最新交易的通知。
- 传感器可以简化。 最初我有数据,如 First_date 的 以及 Last_date 的, 但我最终撤回了它们,因为它们在生产中没有用处。
- 参数 限制 : 25 可以根据屏幕的大小和仪表板上选择的卡进行调整。
我添加模板来计算我需要什么
在文件中 模板.yaml, , 下 感应 器, 我添加了这些模板:

姓名: "_a _venir _montant transaction" 状态: >- {% 设置 transaction = state_attr('sensor.transactions_bank', 'transactions') %} {% 设置 Total = namespace(amount=0) %} {% 对于交易中的交易,如果 transaction.coming %} {% 设置 total.amount = total.amount + transaction.value %} {% 结束 于 %} { { total.amount }} 单位 _ of _measurement: "€" - 姓名: _id单曲"Available _ balance": 传感器.balance _ 可用单位 _ of _measurement : 『国家』: >- {% set balance = state('sensor.solde _banque')| float %} {% 集合 depenses = state('sensor.transactions _a _venir _montant')| float %} {{{{(balance + expenditure)| round(2)}}
- 传感器 The Sensor _a_venir _montant 交易 计算未来交易的总额(如计划提款)。
- 传感器 The Sensor _ 可用余额 通过从当前余额中减去未来交易来计算实际余额。
我添加自动化来刷新数据
正如我之前解释的那样,我自愿停用REST传感器的自动刷新,给它们分配一个非常高的扫描值(31536000秒,即大约1年)。 这允许我手动控制数据何时刷新,而不是每隔x分钟刷新数据。 这种方法更适合我的需求,因为我计划使用这些数据来根据我的余额或最新的重要交易触发通知。
为了管理这一点,我在家庭助理中添加了一个自动化功能,可以更新我的两个传感器。_ 银行结余 以及 _ 银行交易) 每天中午。 以下是这种自动化的代码:
化名 : 更新银行账户说明: 触发器: 触发器: 时间在: "12:00:00" 条件: [] 行动: 行动: Homeassistant.update _实体数据: entity_id : -Sensor.balance _bank - sensor.transactions _bank 模式: 单 人 单

这种自动化简单但有效: 它每天中午触发传感器的更新。 这允许我保持我的数据最新,而不会因为不必要的查询而过载API或我的系统。 此外,它还允许我稍后添加其他操作,例如根据恢复的数据发送通知或运行脚本。
我意识到地图和仪表板的屏幕
在配置了传感器和自动化后,我在Home Assistant中设计了一个仪表板,以清晰有条理的方式可视化我的银行数据。 以下是我测试的最终结果:

以下是页面的完整代码,我将分解以解释每个部分:
类型 : Max_columns 部分: 4路: SS 部分: 类型: 网格卡 : 类型: 实体: Sensor.solde _ 银行名称: 银行余额图标: MDI:bank-transfer grid_options: 栏目: 完整 Card_mod : 风格: | ha-card {padding: 4px; Border-radius: 15px; } .icon ha-state-icon { --mdc-icon-size: 50px! 重要 /* 图标大小 */ margin-bottom : 10px; 类型: Markdown 内容: > {% 设置 transaction = state_attr('sensor.transactions_bank', 'transactions') %} ## 今天 {% 交易中的交易 %} {% 如果没有 transaction.coming %} {% 如果 transaction.date %} {% 设置 date_obj = transaction.date | as_datetime %} {% 设置格式化的 _date = date_obj.strftime(')%d/%m/%Y')) %} {% 其他 其它 %} {% 设置格式 _date = '日期未知' %} {% Endif 的 %} {% 如果 transaction.type == "card" %{ formatted _date } { formatted _date } { { formatted _date } { formatted _date } { formatted _date }} {% Elif transaction.type == 银行 %} { formatted _date } { formatted _date } {% Elif transaction.type == 'check' %} { formatted _date } { formatted _date } {% Elif transaction.type == 'transfer' %{ formatted _date } { formatted _date } { { formatted _date } { formatted _date } { formatted _date }} {% 其他 其它 %⚪ { formatted _date } { formatted _date } {% Endif 的 %}
<strong>
{% 如果 transaction.value > 0 %} { transaction.formatted _value } { transaction.formatted _value } {% 其他 其它 %} { transaction.formatted _value } { transaction.formatted _value } {% Endif 的 %}
</strong>
<small>{transaction.wording }</small>
{% Endif 的 %} {% 结束 于 %} grid _options : 栏目: 24行: Auto-type : 垂直堆栈卡: 类型: Markdown 内容: > {% 设置 transaction = state_attr('sensor.transactions_bank', 'transactions') %} ## future { state('sensor.transactions _a_venir _montant')|float θround(2)} {€ {% 交易中的交易 %} {% 如果 transaction.coming %} {% 如果 transaction.date %} {% 设置 date_obj = transaction.date | as_datetime %} {% 设置格式化的 _date = date_obj.strftime(')%d/%m/%Y')) %} {% 其他 其它 %} {% 设置格式 _date = '日期未知' %} {% Endif 的 %} {% 如果 transaction.type == "card" %{ formatted _date } { formatted _date } { { formatted _date } { formatted _date } { formatted _date }} {% Elif transaction.type == 银行 %} { formatted _date } { formatted _date } {% Elif transaction.type == 'check' %} { formatted _date } { formatted _date } {% Elif transaction.type == 'transfer' %{ formatted _date } { formatted _date } { { formatted _date } { formatted _date } { formatted _date }} {% 其他 其它 %⚪ { formatted _date } { formatted _date } {% Endif 的 %} {% 如果 transaction.value > 0 %} { transaction.formatted _value } - { transaction.wording } { transaction.wording } { transaction.wording } {% 其他 其它 %} { transaction.formatted _value } - { transaction.wording } { transaction.wording } { transaction.wording } {% Endif 的 %} {% Endif 的 %} {% 结束 于 %} grid _options : 栏目: 12行: Auto-type : 实体: Sensor.solde _ 可用名称: 可用平衡图标 : MDI:bank-transfer grid_options: 栏目: 完整 Card_mod : 风格: | ha-card {padding: 4px; Border-radius: 15px; } .icon ha-state-icon { --mdc-icon-size: 50px! 重要 /* 图标大小 */ margin-bottom : 10px; 类型: 实体: - 实体: Sensor.transactions _ 银行名称: 数据格式的最后一次更新: DateTime 列 _span : 3张牌: [ ] 图标: mdi:currency-eur
仪表板的分解
我的仪表板由几个部分和地图组成,以清晰直观的方式显示信息。 以下是每张牌的作用:
1. 『银行平衡卡』
这张卡显示了我银行账户的当前余额。 它使用传感器 传感器 平衡 _ 银行 并包含一个风格化的图标(mdi:bank-transfer) 为了更好的能见度。 我添加了一个自定义的样式在地图的拐角处,并放大图标。
2. "Aujourd'HUI"卡
这张卡片显示了今天所做的交易。 它使用 Markdown 模板来格式化数据:
- 交易按类型分类(用于卡,用于转账等)。
- 金额以绿色显示为积分,以红色表示借记。
- 每笔交易的日期都以格式格式化 DD/mm/yyyy.
3. 『未来』卡
此卡显示即将发生的交易(如计划直接借记)。 它还使用Markdown模板:
- 未来交易总额显示在卡的顶部。
- 每笔交易都按其类型、日期和金额列出。
4. 『可用余额』卡
此卡显示扣除未来交易后的可用余额。 它使用传感器 传感器.balance _ 可用 并且与『银行平衡』卡具有相同的风格。
5. 地图『最新数据更新』
此卡显示银行详细信息最后一次更新的日期和时间。 它使用传感器 传感器.transactions _bank 并格式化日期 DateTime 日期 时间.

