- 积分
- 128
- 金钱
- 115
- 威望
- 0
- 贡献
- 0
- HASS币
- 0
注册会员
- 积分
- 128
- 金钱
- 115
- HASS币
- 0
|
本帖最后由 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格式
|
|