『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 1348|回复: 4

[教程系列] 通过Node-RED将互联网数据导入到Home Assistant

[复制链接]

2

主题

13

帖子

124

积分

注册会员

Rank: 2

积分
124
金钱
111
HASS币
0
发表于 2022-12-8 22:00:02 | 显示全部楼层 |阅读模式
本帖最后由 q2316367743 于 2022-12-9 11:17 编辑

通过Node-RED将互联网数据导入到Home Assistant

博客原文:通过Node-RED将互联网数据导入到Home Assistant | 刹那烟雨 (esion.xyz),阅读体验更好

本篇文章演示了通过定时执行HTTP请求获取数据、对数据处理进行处理,通过MQTT主题发送,并使Home Assistant自动发现。
演示

                               
登录/注册后可看大图

代码下载

思路定时取拿数据,获取到数据后通过mqtt传输到Home Assistant
第一步,拿数据数据接口网站:https://news.sina.cn/zt_d/yiqing0121
新浪新闻的疫情数据接口:https://gwpre.sina.cn/interface/news/ncp/data.d.json
后面有3个参数:
mod:查询模式,可选city
citycode:城市代码,通过网站选择获取城市代码
**_**:当前时间戳
http request模块

                               
登录/注册后可看大图

http request模块
相关配置

                               
登录/注册后可看大图

http request模块
此模块只需要配置一个URL,而请求体/请求参数是上一步的msg.payload对象,所以,我们需要在上一步增加一个function模块,构建msg.payload对象
function模块

                               
登录/注册后可看大图

function模块
// 构造请求头
msg.headers = {};
msg.headers['Content-Type'] = 'application/json';
// 构造请求体
msg.payload = {
    mod: "city",
    citycode: msg.citycode,
    _: msg.payload
};
// 此对象这个流内有效
flow.set('citycode', msg.citycode);
flow.set('nodeId', `covid_${msg.citycode}`);
return msg;
此处重点说一下flow对象,这个对象会在这个流程内有效,但是在其他流程内无效,与之相似的还有global对象,这个对象全局有效,比较常用的方法:flow#set(key: string, value: string)flow#get(key: string): string
第二步,将数据处理成我们想要的样子我们可以在下一个节点通过msg.payload获取响应内容,在编辑http request节点的时候,我们设置了返回为JSON数据,那么msg.payload将会是个对象。
比如说我们发送MQTT时需要一个当前时间,我们可以使用function模块将数据进行处理

                               
登录/注册后可看大图

function模块
msg.payload['time'] = new Date();
return msg;
这样,我们就在结果集里面增加了一个对象,key是time,值是当前时间
第三部,发送MQTT消息,并自动发现

MQTT集成文档:https://www.home-assistant.io/integrations/mqtt/


相关说明


消息结构:<discovery_prefix>/<component>/[<node_id>/]<object_id>/config
[size=14.6667px]
<component>:支持的 MQTT 组件之一,例如。.binary_sensor
<node_id> (可选):提供主题的节点的 ID,家庭助理不使用,但可用于构建 MQTT 主题。节点的 ID 只能包含字符类中的字符(字母数字、下划线和连字符)。[a-zA-Z0-9_-]
<object_id>:设备的 ID。这仅允许为每个设备提供单独的主题,不用于 .设备的 ID 只能包含字符类中的字符(字母数字、下划线和连字符)。entity_id [a-zA-Z0-9_-]
默认情况下,<discovery_prefix>homeassistant

MQTT默认支持的平台

Alarm control panel
Binary sensor
Button
Camera
Cover
Device Tracker
Device Trigger
Fan
Humidifier
Climate/HVAC
Light
Lock
Number
Scene
Select
Sensor
Siren
Switch
Update
Tag Scanner
Text
Vacuum

<node_id>:我把它理解为一个实体ID,一个实体一个
<object_id>:我把它理解为一个数据ID,一个数据一个


MQTT的消息体在MQTT支持的平台中有详细的说明,这些参数可以使用缩写。


'act_t':               'action_topic',
'act_tpl':             'action_template',
'atype':               'automation_type',
'aux_cmd_t':           'aux_command_topic',
'aux_stat_tpl':        'aux_state_template',
'aux_stat_t':          'aux_state_topic',
'av_tones':            'available_tones',
'avty':                'availability',
'avty_mode':           'availability_mode',
'avty_t':              'availability_topic',
'avty_tpl':            'availability_template',
'away_mode_cmd_t':     'away_mode_command_topic',
'away_mode_stat_tpl':  'away_mode_state_template',
'away_mode_stat_t':    'away_mode_state_topic',
'b_tpl':               'blue_template',
'bri_cmd_t':           'brightness_command_topic',
'bri_cmd_tpl':         'brightness_command_template',
'bri_scl':             'brightness_scale',
'bri_stat_t':          'brightness_state_topic',
'bri_tpl':             'brightness_template',
'bri_val_tpl':         'brightness_value_template',
'clr_temp_cmd_tpl':    'color_temp_command_template',
'bat_lev_t':           'battery_level_topic',
'bat_lev_tpl':         'battery_level_template',
'chrg_t':              'charging_topic',
'chrg_tpl':            'charging_template',
'clr_temp_cmd_t':      'color_temp_command_topic',
'clr_temp_stat_t':     'color_temp_state_topic',
'clr_temp_tpl':        'color_temp_template',
'clr_temp_val_tpl':    'color_temp_value_template',
'clrm':                'color_mode',
'clrm_stat_t':         'color_mode_state_topic',
'clrm_val_tpl':        'color_mode_value_template',
'cln_t':               'cleaning_topic',
'cln_tpl':             'cleaning_template',
'cmd_off_tpl':         'command_off_template',
'cmd_on_tpl':          'command_on_template',
'cmd_t':               'command_topic',
'cmd_tpl':             'command_template',
'cod_arm_req':         'code_arm_required',
'cod_dis_req':         'code_disarm_required',
'cod_trig_req':        'code_trigger_required',
'curr_temp_t':         'current_temperature_topic',
'curr_temp_tpl':       'current_temperature_template',
'dev':                 'device',
'dev_cla':             'device_class',
'dock_t':              'docked_topic',
'dock_tpl':            'docked_template',
'e':                   'encoding',
'en':                  'enabled_by_default',
'ent_cat':             'entity_category',
'ent_pic':             'entity_picture',
'err_t':               'error_topic',
'err_tpl':             'error_template',
'fanspd_t':            'fan_speed_topic',
'fanspd_tpl':          'fan_speed_template',
'fanspd_lst':          'fan_speed_list',
'flsh_tlng':           'flash_time_long',
'flsh_tsht':           'flash_time_short',
'fx_cmd_t':            'effect_command_topic',
'fx_cmd_tpl':          'effect_command_template',
'fx_list':             'effect_list',
'fx_stat_t':           'effect_state_topic',
'fx_tpl':              'effect_template',
'fx_val_tpl':          'effect_value_template',
'exp_aft':             'expire_after',
'fan_mode_cmd_tpl':    'fan_mode_command_template',
'fan_mode_cmd_t':      'fan_mode_command_topic',
'fan_mode_stat_tpl':   'fan_mode_state_template',
'fan_mode_stat_t':     'fan_mode_state_topic',
'frc_upd':             'force_update',
'g_tpl':               'green_template',
'hold_cmd_tpl':        'hold_command_template',
'hold_cmd_t':          'hold_command_topic',
'hold_stat_tpl':       'hold_state_template',
'hold_stat_t':         'hold_state_topic',
'hs_cmd_t':            'hs_command_topic',
'hs_stat_t':           'hs_state_topic',
'hs_val_tpl':          'hs_value_template',
'ic':                  'icon',
'img_e':               'image_encoding',
'init':                'initial',
'hum_cmd_t':           'target_humidity_command_topic',
'hum_cmd_tpl':         'target_humidity_command_template',
'hum_stat_t':          'target_humidity_state_topic',
'hum_state_tpl':       'target_humidity_state_template',
'json_attr':           'json_attributes',
'json_attr_t':         'json_attributes_topic',
'json_attr_tpl':       'json_attributes_template',
'l_ver_t':             'latest_version_topic',
'l_ver_tpl':           'latest_version_template',
'lrst_t':              'last_reset_topic',
'lrst_val_tpl':        'last_reset_value_template',
'max':                 'max',
'min':                 'min',
'max_mirs':            'max_mireds',
'min_mirs':            'min_mireds',
'max_temp':            'max_temp',
'min_temp':            'min_temp',
'max_hum':             'max_humidity',
'min_hum':             'min_humidity',
'mode':                'mode',
'mode_cmd_tpl':        'mode_command_template',
'mode_cmd_t':          'mode_command_topic',
'mode_stat_tpl':       'mode_state_template',
'mode_stat_t':         'mode_state_topic',
'modes':               'modes',
'name':                'name',
'obj_id':              'object_id',
'off_dly':             'off_delay',
'on_cmd_type':         'on_command_type',
'ops':                 'options',
'opt':                 'optimistic',
'osc_cmd_t':           'oscillation_command_topic',
'osc_cmd_tpl':         'oscillation_command_template',
'osc_stat_t':          'oscillation_state_topic',
'osc_val_tpl':         'oscillation_value_template',
'pct_cmd_t':           'percentage_command_topic',
'pct_cmd_tpl':         'percentage_command_template',
'pct_stat_t':          'percentage_state_topic',
'pct_val_tpl':         'percentage_value_template',
'ptrn':                'pattern',
'pl':                  'payload',
'pl_arm_away':         'payload_arm_away',
'pl_arm_home':         'payload_arm_home',
'pl_arm_custom_b':     'payload_arm_custom_bypass',
'pl_arm_nite':         'payload_arm_night',
'pl_arm_vacation':     'payload_arm_vacation',
'pl_prs':              'payload_press',
'pl_rst':              'payload_reset',
'pl_avail':            'payload_available',
'pl_cln_sp':           'payload_clean_spot',
'pl_cls':              'payload_close',
'pl_disarm':           'payload_disarm',
'pl_home':             'payload_home',
'pl_inst':             'payload_install',
'pl_lock':             'payload_lock',
'pl_loc':              'payload_locate',
'pl_not_avail':        'payload_not_available',
'pl_not_home':         'payload_not_home',
'pl_off':              'payload_off',
'pl_on':               'payload_on',
'pl_open':             'payload_open',
'pl_osc_off':          'payload_oscillation_off',
'pl_osc_on':           'payload_oscillation_on',
'pl_paus':             'payload_pause',
'pl_stop':             'payload_stop',
'pl_strt':             'payload_start',
'pl_stpa':             'payload_start_pause',
'pl_ret':              'payload_return_to_base',
'pl_rst_hum':          'payload_reset_humidity',
'pl_rst_mode':         'payload_reset_mode',
'pl_rst_pct':          'payload_reset_percentage',
'pl_rst_pr_mode':      'payload_reset_preset_mode',
'pl_toff':             'payload_turn_off',
'pl_ton':              'payload_turn_on',
'pl_trig':             'payload_trigger',
'pl_unlk':             'payload_unlock',
'pos_clsd':            'position_closed',
'pos_open':            'position_open',
'pow_cmd_t':           'power_command_topic',
'pow_stat_t':          'power_state_topic',
'pow_stat_tpl':        'power_state_template',
'pr_mode_cmd_t':       'preset_mode_command_topic',
'pr_mode_cmd_tpl':     'preset_mode_command_template',
'pr_mode_stat_t':      'preset_mode_state_topic',
'pr_mode_val_tpl':     'preset_mode_value_template',
'pr_modes':            'preset_modes',
'r_tpl':               'red_template',
'rel_s':               'release_summary',
'rel_u':               'release_url',
'ret':                 'retain',
'rgb_cmd_t':           'rgb_command_topic',
'rgb_cmd_tpl':         'rgb_command_template',
'rgb_stat_t':          'rgb_state_topic',
'rgb_val_tpl':         'rgb_value_template',
'rgbw_cmd_t':          'rgbw_command_topic',
'rgbw_cmd_tpl':        'rgbw_command_template',
'rgbw_stat_t':         'rgbw_state_topic',
'rgbw_val_tpl':        'rgbw_value_template',
'rgbww_cmd_t':         'rgbww_command_topic',
'rgbww_cmd_tpl':       'rgbww_command_template',
'rgbww_stat_t':        'rgbww_state_topic',
'rgbww_val_tpl':       'rgbww_value_template',
'send_cmd_t':          'send_command_topic',
'send_if_off':         'send_if_off',
'set_fan_spd_t':       'set_fan_speed_topic',
'set_pos_tpl':         'set_position_template',
'set_pos_t':           'set_position_topic',
'pos_t':               'position_topic',
'pos_tpl':             'position_template',
'spd_rng_min':         'speed_range_min',
'spd_rng_max':         'speed_range_max',
'src_type':            'source_type',
'stat_cla':            'state_class',
'stat_clsd':           'state_closed',
'stat_closing':        'state_closing',
'stat_off':            'state_off',
'stat_on':             'state_on',
'stat_open':           'state_open',
'stat_opening':        'state_opening',
'stat_stopped':        'state_stopped',
'stat_locked':         'state_locked',
'stat_unlocked':       'state_unlocked',
'stat_t':              'state_topic',
'stat_tpl':            'state_template',
'stat_val_tpl':        'state_value_template',
'step':                'step',
'stype':               'subtype',
'sup_clrm':            'supported_color_modes',
'sup_dur':             'support_duration',
'sup_vol':             'support_volume_set',
'sup_feat':            'supported_features',
'swing_mode_cmd_tpl':  'swing_mode_command_template',
'swing_mode_cmd_t':    'swing_mode_command_topic',
'swing_mode_stat_tpl': 'swing_mode_state_template',
'swing_mode_stat_t':   'swing_mode_state_topic',
'temp_cmd_tpl':        'temperature_command_template',
'temp_cmd_t':          'temperature_command_topic',
'temp_hi_cmd_tpl':     'temperature_high_command_template',
'temp_hi_cmd_t':       'temperature_high_command_topic',
'temp_hi_stat_tpl':    'temperature_high_state_template',
'temp_hi_stat_t':      'temperature_high_state_topic',
'temp_lo_cmd_tpl':     'temperature_low_command_template',
'temp_lo_cmd_t':       'temperature_low_command_topic',
'temp_lo_stat_tpl':    'temperature_low_state_template',
'temp_lo_stat_t':      'temperature_low_state_topic',
'temp_stat_tpl':       'temperature_state_template',
'temp_stat_t':         'temperature_state_topic',
'temp_unit':           'temperature_unit',
'tilt_clsd_val':       'tilt_closed_value',
'tilt_cmd_t':          'tilt_command_topic',
'tilt_cmd_tpl':        'tilt_command_template',
'tilt_inv_stat':       'tilt_invert_state',
'tilt_max':            'tilt_max',
'tilt_min':            'tilt_min',
'tilt_opnd_val':       'tilt_opened_value',
'tilt_opt':            'tilt_optimistic',
'tilt_status_t':       'tilt_status_topic',
'tilt_status_tpl':     'tilt_status_template',
'tit':                 'title',
't':                   'topic',
'uniq_id':             'unique_id',
'unit_of_meas':        'unit_of_measurement',
'val_tpl':             'value_template',
'whit_cmd_t':          'white_command_topic',
'whit_scl':            'white_scale',
'whit_val_cmd_t':      'white_value_command_topic',
'whit_val_scl':        'white_value_scale',
'whit_val_stat_t':     'white_value_state_topic',
'whit_val_tpl':        'white_value_template',
'xy_cmd_t':            'xy_command_topic',
'xy_stat_t':           'xy_state_topic',
'xy_val_tpl':          'xy_value_template',

实现流程1、配置状态


此处配置一个实体状态,告诉Home Assistant此实体处于在线状态

主题home/nodes/sensor/<实体ID>/status
消息online
2、发送相关配置


发送一个配置项,告诉Home Assistant数据的基本信息和取值方式

主题homeassistant/sensor/<实体ID>/<数据ID>/config
消息
{
    name: '<这个数据的名字,比如:湖北-武汉 新增确诊人数>',
    uniq_id: '<uniq_id>',
    unit_of_measurement: '<unit_of_measurement>',
    stat_t: '<stat_t>',
    val_tpl: '<val_tpl>',
    pl_avail: 'online',
    pl_not_avail: 'offline',
    ic: '<icon>',
    avty_t: '<availability_topic>',
    dev: {
        name: '<dev.name>',
        manufacturer: '新浪新闻',
        sw_version: '1.0.0',
        identifiers: [flow.get('nodeId')]
    }
}

name:这个数据的名字,比如:湖北-武汉 新增确诊人数
uniq_id:唯一ID,建议使用主题中数据ID。
unit_of_measurement:单位,比如:
stat_t:获取实体数据的主题,自定义。
val_tpl:一个取值模板,value_json代表着实体数据,比如实体数据为{time: '2022-12-08'},我们需要取出time,那么取值方式就是{{ value_json.time }}
icon:显示的默认图标,使用的是mdi图标,可以在Material Design Icons进行预览。
availability_topic:可用性主题,此处主题为第一步主题,获取实体数据可用性,这个主题所有数据用一个就可以
dev:设备信息
dev.name:设备名称,在Home Assistant中设备的名称
dev.manufacturer:生产厂家
dev.sw_version:设备版本

                               
登录/注册后可看大图

3、发送监控数据


主题:此处为第二步中availability_topic的值
消息:就是真正的数据了,此处为json格式



新冠疫情.zip

2.42 KB, 下载次数: 7

Node-RED

回复

使用道具 举报

2

主题

13

帖子

124

积分

注册会员

Rank: 2

积分
124
金钱
111
HASS币
0
 楼主| 发表于 2022-12-8 22:09:45 | 显示全部楼层
尽力调整样式了,还是很短,建议直接到我博客里看吧,
回复

使用道具 举报

4

主题

45

帖子

311

积分

中级会员

Rank: 3Rank: 3

积分
311
金钱
266
HASS币
0
发表于 2022-12-9 09:58:26 | 显示全部楼层
新冠检测取消后 一时间还真不知道是需要格外关注这个问题 还是不关注这个问题了
回复

使用道具 举报

2

主题

13

帖子

124

积分

注册会员

Rank: 2

积分
124
金钱
111
HASS币
0
 楼主| 发表于 2022-12-9 11:17:01 | 显示全部楼层
DUWENINK 发表于 2022-12-9 09:58
新冠检测取消后 一时间还真不知道是需要格外关注这个问题 还是不关注这个问题了 ...

只是举个例子而已,重点是如何将互联网数据导入到ha,只不过这个接口最简单,所以用的这个
回复

使用道具 举报

0

主题

68

帖子

831

积分

高级会员

Rank: 4

积分
831
金钱
763
HASS币
0
发表于 2022-12-10 21:21:41 | 显示全部楼层
不错不错!学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-9 04:27 , Processed in 1.338122 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表