如何使用Node-RED将家庭音量级别正常化

2020-05-29 22:48:34

这篇文章将介绍使用Home Assistant和Node-RED正常化所有media_player音量级别。如果您还没有,我建议您阅读我上一篇关于发送文本到语音通知的博客文章,其中更深入地介绍了此流消耗的可选辅助功能子流。

使用Amazon Alexa媒体播放器集成功能,此自动化功能可根据一天中的不同时间对我家中的所有音量级别进行标准化,以便将我所有的Amazon Echoand Ecobe Switch+设备带入Home Assistant。

这是我家里我最喜欢的自动化产品之一,我想你也会喜欢的!我写这个自动化有几个原因:

我希望所有的演讲者在就寝时间都保持安静。这样可以防止有人在凌晨2点被炸死。

早上喝完咖啡后,我想把音量调到可以接受的水平。

自动化允许通过子流进行重用。这意味着你可以在其他情况下触发它,比如朋友结束了,音乐正在播放,增加音量或降低音量。

少了一件我必须思考的事情,或者不断触摸才能改变的事情。在大流行的今天,这也是你可能要清理的一件事!

如果您还没有安装Alexa Media Player自定义组件,如果您使用的是Alexa,请安装该组件,否则跳过此部分。

这个插件令人惊叹,因为它将所有支持Alexa的设备(如Amazon Echoor ecobe Switch+)正常化为可供家庭助理使用的媒体播放器。

此自动化流通过调用media_player.volume_set服务控制音量级别。我建议您先打开Home Assistant开发人员工具并导航到“服务”选项卡,然后对其进行测试。

接下来,开始在media_player上播放一些音乐,并使用以下有效负载调用media_player.volume_set服务:

如果您没有听到音量变化,请尝试使用不同的VOLUME_LEVEL,以防设备已处于该音量级别。如果没有,则停止并检查日志。这将有助于诊断设备无法工作的原因,并在继续之前为您节省大量时间。

我强烈建议添加多个输入布尔来控制特定自动化或所有自动化是否可以运行。在维护的情况下,能够打开或关闭特定的自动化或所有的自动化总是很好的。下面是此Automation流中使用的三个INPUT_BOOLEAN。

AUTOMATION_ENABLE:名称:启用自动化图标:mdi:home-automationautomation_normalize_volume:名称:AUTOMATION-全天自动规格化音量图标:mdi:VOLUME-HUTOMATION_NOTIFICATIONS:名称:触发自动化时通知图标:mdi:HOME-AUTOMANIZATION。

此子流程将获得当前设备的音量级别,比较当前状态和所需状态。如果需要更改,它将调用所需的服务来更改设备音量级别。

然后,我创建了一个具有状态节点、一个输入和一个输出的新子流。此子流程(可选)取决于“发送自动语音通知”子流程。

Graph TDInputNode(Input)-->;ACurrentStateNode(FAS:FA-数据库获取当前音量级别)ACurrentStateNode-->;BFunctionNode(FAS:FA-代码设置音量级别有效负载)BFunctionNode-->;CCallServiceNode(FAS:FA-PLAY设置音量级别)BFunctionNode-->;DCallSubflowNode。StatusOutputNode(Status)style StatusNode Fill:#ECF5Fstyle StatusOutputNode Fill:#FAFBstyle InputNode Fill:#FAFBstyle ACurrentStateNode Fill:#66ACFDstyle BFunctionNode Fill:#FBB68Fstyle CCallServiceNode Fill:#66ACFDstyle DCallSubflowNode Fill:#FF75A1 style OutputNode Fill:#FAFAFB。

让我们分解一下子流。传入的消息被传递到Get Current Volume Level Current State节点,以使用实体填充msg.data。然后将其传递到设置音量级别有效负载节点,该节点检查是否需要进行任何更改以满足所需的音量级别,并输出文本到语音(TTS)状态消息。如果需要更改,设置音量级别节点将调用media_player.volume_set服务。

以下是Set Volume Level PayloadFunction节点中包含的JavaScript代码,用于仅在需要时智能调整音量。

const entity=msg.payload&;&;msg.payload.entity_id;const Attributes=msg.data&;&;msg.data.tributesif(!entity||!tributes){node.status({Fill:";red";,Shape:";dot";,text:";Invalid Volume payload";});返回[null,null];}const desired_({填充:";红色";,形状:";点";,文本:";无效卷有效负载";});返回[null,null];}const desired_。0.0||desired_volume_level>;1.0){let message=";音量级别必须在0到1之间。";;node.status({Fill:";red";,Shape:";dot";,text:message});node.error(Message);return[null,{payload:{entity_id:entity,message:message}}];}if(desired_volume_level==属性.volume_level)。音量级别已处于所需级别。";;node.status({填充:";灰色";,形状:";点";,文本:消息});node.log(Message);return[null,{payload:{entity_id:entity,message:message}}];}const volumePayload={payload:{data:{entity_id:entity,volume_level:desired_volume_level};let message=。+(RESENDED_VOLUME_LEVEL*100)+";百分比.";;const Speech Payload={payload:{entity_id:entity,message:message}};node.status({Fill:";green";,form:";dot";,text:message});return[volumePayload,talk Payload];

正如您所看到的,它将输出一个友好的语音通知有效负载,该负载将被发送到Send Automation Speech Notification子流。如果您没有使用Alexa_MEDIA_Player Home Assistant插件,您可能需要更新“设置音量级别有效负载”功能节点以获取您期望的音量范围。

您可以通过传递具有以下有效负载的消息对象来触发此子流。我建议使用Inject Node来测试这一点。

请注意,对于我的Alexa演讲者。我使用介于[0.0..0.10]之间的音量级别。要静音,请传递0.0。

该子流程将获取所有MEDIA_Player‘,然后将它们逐个发送到设置的音量级子流程。

如果您没有使用Alexa,您可能需要调整获取所有媒体播放器节点,因为它将返回具有特定功能属性的所有设备,该属性表示我支持更改音量级别。

Graph TDInputNode(Input)-->;AFunctionNode(FAS:FA代码解析音量级别)AFunctionNode-->;BGetEntiesNode(FAS:FA-搜索获取所有媒体播放器)BGetEntiesNode-->;CChangeNode(FAS:FA-随机设置音量级别有效负载)CChangeNode-->;DSubflowNode(FAS:FA-随机设置音量级别有效负载)CChangeNode-->;DSubflowNode(FAS:FA-随机设置音量级别有效负载)CChangeNode-->;DSubflowNode(FAS。StatusOutputNode(Status)style StatusNode Fill:#ECF5Fstyle StatusOutputNode Fill:#FAFBstyle InputNode Fill:#FAFBstyle AFunctionNode Fill:#FBB68Fstyle BGetEntiesNode Fill:#66ACFDstyle CChangeNode Fill:#FEA530style DSubflowNode Fill:#FF75A1 style OutputNode Fill:#FAFAFBlinkStingNode Fill。

您可以通过传递具有以下浮点(例如0.1)有效负载的消息对象来触发此子流。我建议使用Inject Node来测试这一点。

此流将前面的两个子流结合在一起,以基于一天中的时间将所有成交量级别正常化。在我家,我把早上9点到晚上9点的水平设置为30%,否则我设置为10%。

为了让流在一天中的不同时间设置音量级别,我使用BigTimer节点,打开时间为09:00,关闭时间为21:00。然后我将开味精设为0.3,关味精设为1。当计时器打开和关闭时,它将检查我的自动化标志是否打开。如果是,它将枚举所有媒体设备,并根据计时器输出消息(例如,.1或.3)设置音量。

Graph TDABigTimerNode(FAS:FA-Clock Normize Volume)-->;B CurrentStateNode(FAS:FA-启用数据库自动化?)B CurrentStateNode-->;CCurrentStateNode(FAS:FA-数据库标准化音量级别?)CCurrentStateNode-->;DRbeNode(FAS:FA-滚动只允许更改的值)DRbeNode--&。StatusOutputNode(Status)style StatusNode Fill:#ECF5FFstyle StatusOutputNode Fill:#FAFBstyle ABigTimerNode Fill:#3DB39Fstyle B CurrentStateNode Fill:#66ACFDstyle CCurrentStateNode Fill:#66ACFDDbeNode Fill:#FEB95Estyle ECallSubflow Fill:#FF75A1 linkStyle默认笔划宽度:2px,Fill。

[{";id";:";7a62a2d3.c0f4a4";,";类型";子流";,";名称";:";发送自动化语音通知";,";信息";:";";,";类别";:";";,&。:[{";x";:60,";y";:100,";y";:[{";id";:";87411254.a6ed18";}]}],";out";:[{";x";:1120,";y";:100,";wire";:[{";id";:";d44cc51a.be0668";,";port";:0}]}],";状态";:{";x";:220,";y";:40,";wire";::[{";id";:";aef53056.742438。port";:0}]}},{";id";:";89300b1.595bcf8";,";类型";:";函数";,";z";::";7a62a2d3.c0f4a4";,";名称";:";设置语音负载";,&。Const Entity=flow.get(\";$parent.speech_entity_id\";)||(msg.payload&;&;msg.payload.entity_id)||\";media_player.office_echo_plus\";;\nconst消息=(msg.payload&;&;msg.payload.message)||\";自动化未提供消息\";;\nconst公告=msg.payload&;&;msg.payload.宣告;\n\n如果(公告){\n node.status({填充:\";绿色\";,形状:\";点\";,文本:\";公告消息:\";+消息});\n返回{\n有效负载:{\n数据:{\n消息:消息,\n数据:{\";类型\";:\";公告\";,\";方法\";:\";全部\";},\n目标:!!实体?[实体]:[]\n}\n}\n};\n}\n\nnode.status({填充:\";绿色\";,形状:\";点\";,文本:\";TTS消息:\";+消息});\n返回{\n负载:{\n数据:{\n消息:消息,\n数据:{type:\";TTS\";},\n目标:[实体]\n}\n}\n};";,";输出";:1,";noerr";:0,";x";:700,";y";:100,";wire";:[[";d44cc51a.be0668";]]},{";id";:d44cc51a.be0668";,";类型";:";api-call-service";,";7a62a2d3.c0f4a4";,";name";:";发送语音通知";,";server";:";61956bd4.93dff。:false,";service_domain";:";Notify";,";service";:";Alexa_media";,";entityId";:";";,";data";:";";,";dataType";:";json";,";mergecontext。";,";output_location";:";payload";,";output_location_type";:";msg";,";mustack heAltTags";:false,";x";:950,";y";:100,";wire";:[[]]},{";id&34;:";6add9bc6.4c3624";,";类型";:";api-c