我立即警告,这个Retex只是为了教学目的,我写它是为了分享一种方法,即从那时起我就以不同的方式意识到了这个功能,所以我没有这个过程。
集成以运行 Python 脚本
出于我从未理解的原因,HA内置的python脚本功能是archi-mini,不可能导入,所以我必须使用称为集成。 pyscript 的.
我通过详细信息来安装它,它非常简单,HACS中的所有内容都在文档中。
在config.yaml中,我有以下行:
pyscript : allow_all_imports : True hass _is _global : 真实 的
我得到一个令牌
我打开 Home Assistant 用户界面。
在左下角,我点击我的用户名(或个人资料图标)。
点击"Profile"。
我向下滚动到『长期访问令牌』部分。
我点击『创建令牌』来生成一个新的令牌。
我给我的代币一个名字,让我更容易找到它。
一旦代币被创建,我就会看到它的内容。 我复制令牌的值,即字母数字字符系列,并将其粘贴到我的配置中(下段)
声明在Python和传感器之间建立链接的平台
在config.yaml中,我添加了以下行:
REST_COMMAND : send_data_to_api : URL : http://homeassistant.local:8123/api/states/sensor.wallbox _charges 方法: "post" content_type : "application/json"头: 授权: 《Bearer TOKEN》 # 用令牌cf上一段有效载荷替换TOKEN: {{data | toJSON }}
这是由Python脚本(下方)提供的前门,并将信息发送到传感器.wallbox _charges。
我的 Python 脚本
我将 _charges.pywallbox 文件放在 /config/pyscript 文件夹中
导入日期时间 pytz @service def wallbox _charges(LASTDATA=None, action=None, price="123", km="123", dateStart="01/01/2000 12:00, value="123"): _time _paris = pytz.timezone("Europe/Paris")现在 _timestamp = int(datetime.datetime.now().timestamp())现在 _time_paris = datetime.datetimestamp(现在 _timestamp, _time_time_paris)现在 _formatee = now _time_paris.strftime()%d/%m/%Y 位 %H:%M:%s)nowMoins20min = datetime.datetime.now()- datetime.timedelta(minutes=20)nowMoins20min_formatee = nowMoins20min.strftime(")%H:teDebutRecue = datetime.datetime.strptime(dateDebut,')%d/%m/%Y 位 %H:%M:%s'.replace(tzinfo=fuseau_heure_paris)debut_timestamp_formatee = dateDebutRecue.strftime(")%d/%m/%Y 位 %H:%M:%s")debut_timestamp_formatee_SansSecondes = dateDebutRecue.strftime(")%d/%m/%Y 位 %H:%M)) # 现在将字符串转换为 datetime 对象 _dt = datetime.datetime.strptime(现在 _formatee)%d/%m/%Y 位 %H:%M:%s)sirgin_dt = datetime.datetime.strptime(debut_timestamp_formatee),%d/%m/%Y 位 %H:%M:%S ) # 计算时间对象DeCharge = now_dt - debut_dt - datetime.timedelta(minutes=20) # 以小时,分钟和秒小时格式化持续时间,休息 = divmod(timeDeCharge.seconds, 3600)分钟,秒 = divmod(rest, 60) # 显示持续时间为 HH:MM:SS timeDeCharge_formatee = f"{hours:02}:{minutes:02}" # 在报纸上写一条信息信息 #log.info(action)如果 action == "register": valueaadd = [{ "saved_at"): 现在_timestamp,『开始』: 首次亮相_timestamp_formatee_SansSecondes,"end": nowLess20min _formatee, "Duration": TimeDeCharge_formatee,『消费』: 值"km": 公里『成本』: round(value * price, 2)}] 如果 LASTDATA 不是 None: valuea add = LASTDATA + valuea add data = { "state" : 首次亮相_timestamp_formatee_SansSecondes,"attributes": {"更新_at"): 现在 _dt.strftime()%d/%m/%Y 位 %H:%M:%"S"),"收费会话": ValueAdd } 如果 action == "init": 数据 = {'state': "on","attributes": {"更新_at"): '14/10/2023 16:42:39',"会话收费": [ {『消费』: 2.14 『成本』: 0.43,『持续时间』: "00:27","开始": "19/09/2023 20:36","结束": "21:03","km": 17、"Saved_at": 1695150359 }, { 『消费』 : 23.29 『成本』: 4.66『持续时间』: "4:19","开始": "21/09/2023 21:06","结束": "01:25","km": 第192章 "Saved_at": 1695323159 }, { 『消费』 : 7.68『成本』: 1.54『持续时间』: "01:23","开始": "22/09/2023 08:45","结束": "10:08","km": 63、"saved_at": 1695409559 }, { 『消费』 : 23.80『成本』: 4.76『持续时间』: "04:26","开始": "23/09/2023 16:57","结束": "21:23","km": 第196章 "Saved_at": 1695495959 } } } # 调用 REST 服务发送数据服务 _data = { "token": "XXXXXX", # 替换为令牌『数据』: 数据 } 如果 action == "register" 或 action == "init": # 调用 REST 服务异步等待 hass.services.async_call('rest_command', 'send_data_to_api', _data service) # 在日志中写出错误消息 #log.error("End script")
添加两个自动化
一个初始化传感器,另一个用于添加数据
初始化数据
化名 : 初始化加载会话描述 : 触发器: […]条件: [] 行动: 服务: pyscript.wallbox _ 充电数据: 行动: Init 模式 : 单 人 单
保存数据
化名 : 保存加载会话描述 : > - 当传感器在 20 分钟内未更改其值且未在 0 触发时触发此自动化: 平台: 国家实体_id: - sensor.wallbox _portal _added _range 用于: 小时 : 0分钟: 20秒: 启用 0 : 真实条件: 条件: 数字 _state 实体 _id : Sensor.wallbox _portal _added _energy 上面: 0 - 条件: 不是条件: 条件: 国家实体_id: Sensor.wallbox _ 充电状态: >- { as_timestamp(states('sensor.wallbox _portal _added_range _min'))| int Ω timestamp _custom('')%d/%m/%Y 位 %H:%M:%s', true)} 启用: 虚假行为: 服务: pyscript.wallbox _ 充电数据: 行动: 记录值 : {{States('sensor.wallbox _portal _added_energy')}} 奖: {{States('sensor.wallbox _portal _energy_price')}} "{{States('sensor.wallbox _portal _added_range')}" LASTDATA: {{State _attr('sensor.wallbox _charges', 'sessionscharge')}}" dateStart: >- { as_timestamp(states('sensor.wallbox _portal _added_range _min'))| int Ω timestamp _custom('')%d/%m/%Y 位 %H:%M:%S', true)} - 服务: variable.update _sensor 数据: 替换_attributes : 假值 : >- { as_timestamp(states('sensor.wallbox _portal _added_range _min'))| int Ω timestamp _custom('')%d/%m/%Y 位 %H:%M:%S', true)} 目标: entity_id : 启用 Sensor.wallbox _charge : 假模式 : 单 人 单
要具有负载的最小值,我使用统计来具有最小值。
该传感器在sensors.yaml中声明。
平台: 统计名称: "Wallbox Portal Added Range Min" entity_id: Sensor.wallbox _portal _added _range state _characteristic: DateTime _value _min max_age: 小时 : 10
存储信息的结果
显示所有会话卡
<div>收费会议</div>
上次更新 : { state_attr('sensor.wallbox _charges','updated _at')} <br><br>
{% 设置项目 = state_attr('sensor.wallbox _charges', 'sessionscharge') %}
<table width='100%'>
<tbody>
{% for i in range(0, items | count, 1) %}
<tr>
<td>{{ items[i].start } 到 {{ item[i].fin } }({{{ item[i].duration }})</td>
<td>{{ items[i].consumption } kWh</td>
<td>+{{ items[i].km } 公里</td>
<td>{{ item[i].cost } 欧元</td>
</tr>
{% 结束 于 %}
</tbody>
</table>
按年、月、周显示总计卡
类型 : Markdown 内容: >-
<div><h1>收费会议</div> {%- 设置默认_language = 'en' %最新更新: { state_attr('sensor.wallbox _charges','updated _at')} <br><br>
{% 设置项目 = state_attr('sensor.wallbox _charges', 'sessionscharge') %} {% 设置 septjours = now()- timedelta(days=7) %} {% 设置 power_semaine = namespace(value=0) %} {% 设置 cout_semaine = namespace(value=0) %} {% 设置 unmois = now()- timedelta(days=30) %} {% 设置 power_months = namespace(value=0) %} {% 设置 cout_mois = namespace(value=0) %} {% 设置uneannee = now()- timedelta(days=365) %} {% 设置 power_annee = namespace(value=0) %} {% 设置 cout_annee = namespace(value=0) %} {% for i in range(0, items | count, 1) %} {% 如果 items[i].saved_at | int >= as_timestamp(uneannee) %} {% 设置 power_annee.value = power_annee.value + items[i].consumption %} {% 设置 cout_annee.value = cout_annee.value + items[i]。 %} {% 如果 items[i].saved_at | int >= as_timestamp(unmonth) %} {% 设置 power_mois.value = power_mois.value + items[i].consumption %} {% 设置 cout_mois.value = cout_mois.value + items[i]。 %} {% 如果 items[i].saved_at | int >= as_timestamp(sevendays) %} {% 设置 power_semaine.value = power_semaine.value + items[i].consumption %} {% 设置 cout_semaine.value = cout_semaine.value + items[i]。 %} {% Endif 的 %} {% Endif 的 %} {% Endif 的 %} {% 结束 于 %}
</ha-alert> <ha-alert alert-type="info" title="上个月: { { power _mois.value | int }} kWh - { { cost _mois.value θ float Round(2)}} 欧元"></ha-alert> <ha-alert alert-type="info" title="去年: {{ power_annee.value | int }} kWh - {{{ cout _annee.value θ float θ round(2)}} 欧元"></ha-alert>
<br>
{% 设置项目 = state_attr('sensor.wallbox _charges', 'sessionscharge') %} {% 设置 septjours = now()- timedelta(days=7) %}
<table width='100%'> <tbody> {% for i in range(0, items | count, 1) %} {% 如果 items[i].saved_at | int >= as_timestamp(sevendays) %} {% 设置 datetime _obj = strptime(items[i].start, '%d/%m/%Y 位 %H:%M')) %}
<tr> <td><h5>{{{items[i].start } {{ items[i].fin } }({{{ items[i].duration }})</td> <td>{{ items[i].consumption } kWh</td> <td>+{{ items[i].km } 公里</td> <td>{{ item[i].cost } 欧元</td> </tr> {% Endif 的 %} {% 结束 于 %} </tbody> </table>
<ha-alert alert-type="success" title="上周: { { power_semaine.value | int}} kWh - { cost_semaine.value θ round(2)} €">
风格: .: | ha-card { margin: 0px 0px 0px 0px; Box-shadow : 无; }ha-markdown : $: | h5 { font-size: 15px! 重要 字体重量 : 正常!重要 填充 : 0px 0px 0px 8px! 边框左: 3px 固态 #429f46; }




