[分享] Nodered HK bridge節點實例分享(一)_20220410 update

先前透過HA的fan template將紅外線控制的非智能家電整合進HK後,功能還蠻完整的,突然想到在HA內也同樣被分類為fan type的空氣清淨機整合進HK內會變什麼樣子?結果蠻令人失望,很多功能都沒被帶進,一些衍生出的配件如擺動、兒童鎖之類的也無法透過配件的方式和導入HK內的fan type空氣清淨機整合,後來經網友分享可透過NR的HK Bridge節點,可更有彈性的整合,節點連結如下:
https://nrchkb.github.io/

這邊直接進入重點分享實例:
本實例是利用Xiaomi Miio整合出來的Xiaomi Miio,HA內實際的整合長這樣:

看了一下節點的詳細內容,可整合的功能有這些:

按說明後將欲整合之功能加入:

幾個重點分享一下:

  1. 輸入需轉換為HK bridge node需要的格式,可直接先加入iOS Home.app,Home.app內的每個功能都按一下,利用Debug node得到輸出的object為何,舉例,當我按下開關鍵(off)後,輸出的property為“Active: 0",也可如本文所說參照官網所列之Characteristics去做設置

  1. 當你的entity為多重狀態輸出時,要利用debug node將資訊位置找出來,這邊以Dyson HP04為例,這邊有一點要注意,輸出的object要改用data才能帶出全部資訊(預設為state,只會有開跟關)

  1. 風扇風速在此分類沒有說明,在其他種類設備發現可以設置段速

  1. 利用function node簡化流程,這在小米空氣淨化器上非常好用,因為小米帶的資訊非常完整,當你要增加配件,例如空氣品質、濾網狀態、溫濕度等,不用再去HA另建一堆不必要的sensor或entity


  1. 搭配function node簡化流程
  1. 不需要的功能在HK node內不要填入即可

空氣淨化器 HK Node-Red Code:

[{"id":"66eba66da742b1ac","type":"comment","z":"e05bb790.045998","name":"Xiaomi Purifier 2S","info":"Function node can send multiple messages to output ports by returning an array of messages.  \n\nSee Node-RED user guide about [functions](https://nodered.org/docs/user-guide/writing-functions).","x":130,"y":1080,"wires":[]},{"id":"6f61068fdade14a1","type":"server-state-changed","z":"e05bb790.045998","name":"Xiaomi purifier","server":"2caefc09.0b4a04","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"fan.kong_qi_jing_hua_qi","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":false,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":110,"y":1140,"wires":[["e9a22d1fa9d05b23"]]},{"id":"5f4b98269db6b1b8","type":"server-state-changed","z":"e05bb790.045998","name":"Auto/ Maunal","server":"2caefc09.0b4a04","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_select.xiaomi_airpurifier_mode","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":false,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":110,"y":1200,"wires":[["da215ae3d856f8ae"]]},{"id":"da215ae3d856f8ae","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"change","p":"payload","pt":"msg","from":"Auto","fromt":"str","to":"{\"TargetAirPurifierState\":1}","tot":"json"},{"t":"change","p":"payload","pt":"msg","from":"Favorite","fromt":"str","to":"{\"TargetAirPurifierState\":0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":280,"y":1200,"wires":[["43451b7056f5684f"]]},{"id":"e9a22d1fa9d05b23","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"change","p":"payload","pt":"msg","from":"on","fromt":"str","to":"{\"CurrentAirPurifierState\":2,\"Active\":1}","tot":"json"},{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"{\"CurrentAirPurifierState\":0,\"Active\":0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":280,"y":1140,"wires":[["43451b7056f5684f"]]},{"id":"49a9fdb84a51f3b0","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"RotationSpeed\": $number(msg.payload) * 7}\t\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":1320,"wires":[["43451b7056f5684f"]]},{"id":"1d87767e44bf3012","type":"server-state-changed","z":"e05bb790.045998","name":"Speed","server":"2caefc09.0b4a04","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"number.kong_qi_jing_hua_qi_favorite_level","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":90,"y":1320,"wires":[["49a9fdb84a51f3b0"]]},{"id":"84a8854f55a0b1ac","type":"server-state-changed","z":"e05bb790.045998","name":"Lock","server":"2caefc09.0b4a04","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"switch.kong_qi_jing_hua_qi_child_lock","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":false,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":90,"y":1260,"wires":[["05d42249202b6794"]]},{"id":"43451b7056f5684f","type":"homekit-service","z":"e05bb790.045998","isParent":true,"hostType":"0","bridge":"3d5ca1527ce61722","accessoryId":"","parentService":"","name":"Xiaomi Purifier","serviceName":"AirPurifier","topic":"","filter":false,"manufacturer":"Xiaomi","model":"zhimi.airpurifier.mb1","serialNo":"Default Serial Number","firmwareRev":"1.3.6","hardwareRev":"1.3.6","softwareRev":"1.3.6","cameraConfigVideoProcessor":"ffmpeg","cameraConfigSource":"","cameraConfigStillImageSource":"","cameraConfigMaxStreams":2,"cameraConfigMaxWidth":1280,"cameraConfigMaxHeight":720,"cameraConfigMaxFPS":10,"cameraConfigMaxBitrate":300,"cameraConfigVideoCodec":"libx264","cameraConfigAudioCodec":"libfdk_aac","cameraConfigAudio":false,"cameraConfigPacketSize":1316,"cameraConfigVerticalFlip":false,"cameraConfigHorizontalFlip":false,"cameraConfigMapVideo":"0:0","cameraConfigMapAudio":"0:1","cameraConfigVideoFilter":"scale=1280:720","cameraConfigAdditionalCommandLine":"-tune zerolatency","cameraConfigDebug":false,"cameraConfigSnapshotOutput":"disabled","cameraConfigInterfaceName":"","characteristicProperties":"{\"LockPhysicalControls\":true,\"TargetAirPurifierState\":true,\"RotationSpeed\":{\"minValue\":0,\"maxValue\":100,\"minStep\":7}}","waitForSetupMsg":false,"outputs":2,"x":490,"y":1240,"wires":[["448ec1892b2ed9a8"],[]]},{"id":"05d42249202b6794","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"change","p":"payload","pt":"msg","from":"on","fromt":"str","to":"{\"LockPhysicalControls\":1}","tot":"json"},{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"{\"LockPhysicalControls\":0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":280,"y":1260,"wires":[["43451b7056f5684f"]]},{"id":"448ec1892b2ed9a8","type":"function","z":"e05bb790.045998","name":"BridgeTransfer","func":"\n//Switch\nif (msg.payload.Active === 1) {\n    msg.payload = 'on';\n    node.send([msg, null, null, null, null]);\n}\n\nif (msg.payload.Active === 0) {\n    msg.payload = 'off';\n    node.send([null, msg, null, null, null]);\n}\n//Auto mode\nif (msg.payload.TargetAirPurifierState === 1) {\n    msg.payload = 'Auto';\n    node.send([null, null, msg, null, null]);\n} \nif (msg.payload.TargetAirPurifierState === 0) {\n    msg.payload = 'Favorite';\n    node.send([null, null, msg, null, null]);\n}\n//Lock\nif (msg.payload.LockPhysicalControls === 1) {\n    msg.payload = 'on';\n    node.send([null, null, null, msg, null]);\n} \nif (msg.payload.LockPhysicalControls === 0) {\n    msg.payload = 'off';\n    node.send([null, null, null, msg, null]);\n}\n//Speed\nif (msg.payload.RotationSpeed) {\n    node.send([null, null, null, null, msg]);\n} \n\n","outputs":5,"noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":1240,"wires":[["5b7ff22fcba46bca","2b374bf028bffd8f","d38eaab06e1b1642"],["d38eaab06e1b1642"],["44a5ab4c18d6dd76"],["ed5a9c873592007e"],["f67ba08c13d775cf"]],"outputLabels":["on","off","auto/manual","lock","speed"]},{"id":"d38eaab06e1b1642","type":"api-call-service","z":"e05bb790.045998","name":"on/ off","server":"2caefc09.0b4a04","version":5,"debugenabled":false,"domain":"fan","service":"turn_{{payload}}","areaId":[],"deviceId":[],"entityId":["fan.kong_qi_jing_hua_qi"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":910,"y":1180,"wires":[["92ad15825d931da4"]]},{"id":"44a5ab4c18d6dd76","type":"api-call-service","z":"e05bb790.045998","name":"Auto","server":"2caefc09.0b4a04","version":5,"debugenabled":false,"domain":"fan","service":"set_preset_mode","areaId":[],"deviceId":[],"entityId":["fan.kong_qi_jing_hua_qi"],"data":"{\"preset_mode\":payload}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":910,"y":1240,"wires":[["92ad15825d931da4"]]},{"id":"ed5a9c873592007e","type":"api-call-service","z":"e05bb790.045998","name":"Lock","server":"2caefc09.0b4a04","version":5,"debugenabled":false,"domain":"switch","service":"turn_{{payload}}","areaId":[],"deviceId":[],"entityId":["switch.kong_qi_jing_hua_qi_child_lock"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":910,"y":1300,"wires":[["92ad15825d931da4"]]},{"id":"2b374bf028bffd8f","type":"trigger","z":"e05bb790.045998","name":"5 sec to on","op1":"","op2":"{\"CurrentAirPurifierState\":2}","op1type":"nul","op2type":"json","duration":"5","extend":false,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":930,"y":1120,"wires":[["88dfe918a25780a9"]]},{"id":"5b7ff22fcba46bca","type":"trigger","z":"e05bb790.045998","name":"2 sec to idle","op1":"","op2":"{\"CurrentAirPurifierState\":1}","op1type":"nul","op2type":"json","duration":"2","extend":false,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":930,"y":1080,"wires":[["88dfe918a25780a9"]]},{"id":"f67ba08c13d775cf","type":"api-call-service","z":"e05bb790.045998","name":"Speed Set","server":"2caefc09.0b4a04","version":5,"debugenabled":false,"domain":"number","service":"set_value","areaId":[],"deviceId":[],"entityId":["number.kong_qi_jing_hua_qi_favorite_level"],"data":"{\"value\":payload.RotationSpeed / 7}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":930,"y":1360,"wires":[["92ad15825d931da4"]]},{"id":"02d4e7ed4c8de0a0","type":"link in","z":"e05bb790.045998","name":"","links":["88dfe918a25780a9"],"x":385,"y":1340,"wires":[["43451b7056f5684f"]]},{"id":"88dfe918a25780a9","type":"link out","z":"e05bb790.045998","name":"","links":["02d4e7ed4c8de0a0"],"x":1085,"y":1100,"wires":[]},{"id":"92ad15825d931da4","type":"debug","z":"e05bb790.045998","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1180,"y":1240,"wires":[]},{"id":"2caefc09.0b4a04","type":"server","name":"Home Assistant","version":2,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30},{"id":"3d5ca1527ce61722","type":"homekit-bridge","bridgeName":"Purifier_Xiaomi","pinCode":"168-16-188","port":"","advertiser":"bonjour-hap","allowInsecureRequest":false,"manufacturer":"NRCHKB","model":"1.3.6","serialNo":"Default Serial Number","firmwareRev":"1.3.6","hardwareRev":"1.3.6","softwareRev":"1.3.6","customMdnsConfig":false,"mdnsMulticast":true,"mdnsInterface":"","mdnsPort":"","mdnsIp":"","mdnsTtl":"","mdnsLoopback":true,"mdnsReuseAddr":true,"allowMessagePassthrough":true}]

重點來了,可以比較一下差別:
NR HK bridge(空氣清淨機圖示!爽度一百)

image

NR整合進來之功能(童鎖/ 自手動)

此節點有非常多的設備可以整合,但還是會受限於作者有寫入之功能,但此節點的另一優勢是配件整合功能,會於實例分享(二)說明。

6個讚

透過Miio 整合進HA的空氣淨化器2S (代碼更新成新版的Miio,功能鍵全部拆開,HA版本 9.7)

Nodered code:

[{"id":"66eba66da742b1ac","type":"comment","z":"e05bb790.045998","name":"Xiaomi Purifier 2S","info":"Function node can send multiple messages to output ports by returning an array of messages.  \n\nSee Node-RED user guide about [functions](https://nodered.org/docs/user-guide/writing-functions).","x":130,"y":840,"wires":[]},{"id":"6f61068fdade14a1","type":"server-state-changed","z":"e05bb790.045998","name":"Xiaomi purifier","server":"2caefc09.0b4a04","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"fan.kong_qi_jing_hua_qi","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":false,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":110,"y":920,"wires":[["e9a22d1fa9d05b23"]]},{"id":"5f4b98269db6b1b8","type":"server-state-changed","z":"e05bb790.045998","name":"Auto/ Maunal","server":"2caefc09.0b4a04","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_select.xiaomi_airpurifier_mode","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":false,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":110,"y":980,"wires":[["da215ae3d856f8ae"]]},{"id":"da215ae3d856f8ae","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"change","p":"payload","pt":"msg","from":"Auto","fromt":"str","to":"{\"TargetAirPurifierState\":1}","tot":"json"},{"t":"change","p":"payload","pt":"msg","from":"Favorite","fromt":"str","to":"{\"TargetAirPurifierState\":0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":280,"y":980,"wires":[["43451b7056f5684f"]]},{"id":"e9a22d1fa9d05b23","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"change","p":"payload","pt":"msg","from":"on","fromt":"str","to":"{\"CurrentAirPurifierState\":2,\"Active\":1}","tot":"json"},{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"{\"CurrentAirPurifierState\":0,\"Active\":0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":280,"y":920,"wires":[["43451b7056f5684f"]]},{"id":"49a9fdb84a51f3b0","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"RotationSpeed\": $number(msg.payload) * 7}\t\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":1100,"wires":[["43451b7056f5684f"]]},{"id":"1d87767e44bf3012","type":"server-state-changed","z":"e05bb790.045998","name":"Speed","server":"2caefc09.0b4a04","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"number.kong_qi_jing_hua_qi_favorite_level","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":90,"y":1100,"wires":[["49a9fdb84a51f3b0"]]},{"id":"84a8854f55a0b1ac","type":"server-state-changed","z":"e05bb790.045998","name":"Lock","server":"2caefc09.0b4a04","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"switch.kong_qi_jing_hua_qi_child_lock","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":false,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":90,"y":1040,"wires":[["05d42249202b6794"]]},{"id":"43451b7056f5684f","type":"homekit-service","z":"e05bb790.045998","isParent":true,"hostType":"0","bridge":"3d5ca1527ce61722","accessoryId":"","parentService":"","name":"Xiaomi Purifier","serviceName":"AirPurifier","topic":"","filter":false,"manufacturer":"Xiaomi","model":"zhimi.airpurifier.mb1","serialNo":"Default Serial Number","firmwareRev":"1.3.6","hardwareRev":"1.3.6","softwareRev":"1.3.6","cameraConfigVideoProcessor":"ffmpeg","cameraConfigSource":"","cameraConfigStillImageSource":"","cameraConfigMaxStreams":2,"cameraConfigMaxWidth":1280,"cameraConfigMaxHeight":720,"cameraConfigMaxFPS":10,"cameraConfigMaxBitrate":300,"cameraConfigVideoCodec":"libx264","cameraConfigAudioCodec":"libfdk_aac","cameraConfigAudio":false,"cameraConfigPacketSize":1316,"cameraConfigVerticalFlip":false,"cameraConfigHorizontalFlip":false,"cameraConfigMapVideo":"0:0","cameraConfigMapAudio":"0:1","cameraConfigVideoFilter":"scale=1280:720","cameraConfigAdditionalCommandLine":"-tune zerolatency","cameraConfigDebug":false,"cameraConfigSnapshotOutput":"disabled","cameraConfigInterfaceName":"","characteristicProperties":"{\"LockPhysicalControls\":true,\"TargetAirPurifierState\":true,\"RotationSpeed\":{\"minValue\":0,\"maxValue\":100,\"minStep\":7}}","waitForSetupMsg":false,"outputs":2,"x":490,"y":1020,"wires":[["448ec1892b2ed9a8"],[]]},{"id":"05d42249202b6794","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"change","p":"payload","pt":"msg","from":"on","fromt":"str","to":"{\"LockPhysicalControls\":1}","tot":"json"},{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"{\"LockPhysicalControls\":0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":280,"y":1040,"wires":[["43451b7056f5684f"]]},{"id":"448ec1892b2ed9a8","type":"function","z":"e05bb790.045998","name":"BridgeTransfer","func":"\n//Switch\nif (msg.payload.Active === 1) {\n    msg.payload = 'on';\n    node.send([msg, null, null, null, null]);\n}\n\nif (msg.payload.Active === 0) {\n    msg.payload = 'off';\n    node.send([null, msg, null, null, null]);\n}\n//Auto mode\nif (msg.payload.TargetAirPurifierState === 1) {\n    msg.payload = 'Auto';\n    node.send([null, null, msg, null, null]);\n} \nif (msg.payload.TargetAirPurifierState === 0) {\n    msg.payload = 'Favorite';\n    node.send([null, null, msg, null, null]);\n}\n//Lock\nif (msg.payload.LockPhysicalControls === 1) {\n    msg.payload = 'on';\n    node.send([null, null, null, msg, null]);\n} \nif (msg.payload.LockPhysicalControls === 0) {\n    msg.payload = 'off';\n    node.send([null, null, null, msg, null]);\n}\n//Speed\nif (msg.payload.RotationSpeed) {\n    node.send([null, null, null, null, msg]);\n} \n\n","outputs":5,"noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":1020,"wires":[["5b7ff22fcba46bca","2b374bf028bffd8f","d38eaab06e1b1642"],["d38eaab06e1b1642"],["44a5ab4c18d6dd76"],["ed5a9c873592007e"],["f67ba08c13d775cf"]],"outputLabels":["on","off","auto/manual","lock","speed"]},{"id":"d38eaab06e1b1642","type":"api-call-service","z":"e05bb790.045998","name":"on/ off","server":"2caefc09.0b4a04","version":3,"debugenabled":false,"service_domain":"fan","service":"turn_{{payload}}","entityId":"fan.kong_qi_jing_hua_qi","data":"","dataType":"json","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":910,"y":960,"wires":[["92ad15825d931da4"]]},{"id":"44a5ab4c18d6dd76","type":"api-call-service","z":"e05bb790.045998","name":"Auto","server":"2caefc09.0b4a04","version":3,"debugenabled":false,"service_domain":"fan","service":"set_preset_mode","entityId":"fan.kong_qi_jing_hua_qi","data":"{\"preset_mode\":payload}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":910,"y":1020,"wires":[["92ad15825d931da4"]]},{"id":"ed5a9c873592007e","type":"api-call-service","z":"e05bb790.045998","name":"Lock","server":"2caefc09.0b4a04","version":3,"debugenabled":false,"service_domain":"switch","service":"turn_{{payload}}","entityId":"switch.kong_qi_jing_hua_qi_child_lock","data":"","dataType":"json","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":910,"y":1080,"wires":[["92ad15825d931da4"]]},{"id":"2b374bf028bffd8f","type":"trigger","z":"e05bb790.045998","name":"5 sec to on","op1":"","op2":"{\"CurrentAirPurifierState\":2}","op1type":"nul","op2type":"json","duration":"5","extend":false,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":930,"y":900,"wires":[["88dfe918a25780a9"]]},{"id":"5b7ff22fcba46bca","type":"trigger","z":"e05bb790.045998","name":"2 sec to idle","op1":"","op2":"{\"CurrentAirPurifierState\":1}","op1type":"nul","op2type":"json","duration":"2","extend":false,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":930,"y":860,"wires":[["88dfe918a25780a9"]]},{"id":"f67ba08c13d775cf","type":"api-call-service","z":"e05bb790.045998","name":"Speed Set","server":"2caefc09.0b4a04","version":3,"debugenabled":false,"service_domain":"number","service":"set_value","entityId":"number.kong_qi_jing_hua_qi_favorite_level","data":"{\"value\":payload.RotationSpeed / 7}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":930,"y":1140,"wires":[["92ad15825d931da4"]]},{"id":"16a661c1a6685e74","type":"homekit-service","z":"e05bb790.045998","isParent":false,"hostType":"0","bridge":"","accessoryId":"","parentService":"43451b7056f5684f","name":"AirQuality","serviceName":"AirQualitySensor","topic":"","filter":false,"manufacturer":"Default Manufacturer","model":"Default Model","serialNo":"Default Serial Number","firmwareRev":"","hardwareRev":"","softwareRev":"","cameraConfigVideoProcessor":"ffmpeg","cameraConfigSource":"","cameraConfigStillImageSource":"","cameraConfigMaxStreams":2,"cameraConfigMaxWidth":1280,"cameraConfigMaxHeight":720,"cameraConfigMaxFPS":10,"cameraConfigMaxBitrate":300,"cameraConfigVideoCodec":"libx264","cameraConfigAudioCodec":"libfdk_aac","cameraConfigAudio":false,"cameraConfigPacketSize":1316,"cameraConfigVerticalFlip":false,"cameraConfigHorizontalFlip":false,"cameraConfigMapVideo":"0:0","cameraConfigMapAudio":"0:1","cameraConfigVideoFilter":"scale=1280:720","cameraConfigAdditionalCommandLine":"-tune zerolatency","cameraConfigDebug":false,"cameraConfigSnapshotOutput":"disabled","cameraConfigInterfaceName":"","characteristicProperties":"{\"AirQuality\":true}","waitForSetupMsg":false,"outputs":2,"x":640,"y":1200,"wires":[[],[]]},{"id":"0ba41c9fc0a6ef8b","type":"server-state-changed","z":"e05bb790.045998","name":"Filter Status","server":"2caefc09.0b4a04","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.kong_qi_jing_hua_qi_filter_life_remaining","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":90,"y":1260,"wires":[["7308d9a85434f4cc"]]},{"id":"10bbd50eed7a931d","type":"homekit-service","z":"e05bb790.045998","isParent":false,"hostType":"0","bridge":"","accessoryId":"","parentService":"43451b7056f5684f","name":"FilterMaintenance","serviceName":"FilterMaintenance","topic":"","filter":false,"manufacturer":"Default Manufacturer","model":"Default Model","serialNo":"Default Serial Number","firmwareRev":"","hardwareRev":"","softwareRev":"","cameraConfigVideoProcessor":"","cameraConfigSource":"","cameraConfigStillImageSource":"","cameraConfigMaxStreams":"","cameraConfigMaxWidth":"","cameraConfigMaxHeight":"","cameraConfigMaxFPS":"","cameraConfigMaxBitrate":"","cameraConfigVideoCodec":"","cameraConfigAudioCodec":"","cameraConfigAudio":false,"cameraConfigPacketSize":"","cameraConfigVerticalFlip":false,"cameraConfigHorizontalFlip":false,"cameraConfigMapVideo":"","cameraConfigMapAudio":"","cameraConfigVideoFilter":"","cameraConfigAdditionalCommandLine":"","cameraConfigDebug":false,"cameraConfigInterfaceName":"","characteristicProperties":"{\"FilterChangeIndication\":true,\"FilterLifeLevel\":true}","waitForSetupMsg":false,"outputs":2,"x":670,"y":1260,"wires":[[],[]]},{"id":"02d4e7ed4c8de0a0","type":"link in","z":"e05bb790.045998","name":"","links":["88dfe918a25780a9"],"x":385,"y":1120,"wires":[["43451b7056f5684f"]]},{"id":"88dfe918a25780a9","type":"link out","z":"e05bb790.045998","name":"","links":["02d4e7ed4c8de0a0"],"x":1085,"y":880,"wires":[]},{"id":"92ad15825d931da4","type":"debug","z":"e05bb790.045998","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1180,"y":1020,"wires":[]},{"id":"a5e3052ceb09ca2c","type":"homekit-service","z":"e05bb790.045998","isParent":false,"hostType":"0","bridge":"","accessoryId":"","parentService":"43451b7056f5684f","name":"Humidity","serviceName":"HumiditySensor","topic":"","filter":false,"manufacturer":"Default Manufacturer","model":"Default Model","serialNo":"Default Serial Number","firmwareRev":"","hardwareRev":"","softwareRev":"","cameraConfigVideoProcessor":"","cameraConfigSource":"","cameraConfigStillImageSource":"","cameraConfigMaxStreams":"","cameraConfigMaxWidth":"","cameraConfigMaxHeight":"","cameraConfigMaxFPS":"","cameraConfigMaxBitrate":"","cameraConfigVideoCodec":"","cameraConfigAudioCodec":"","cameraConfigAudio":false,"cameraConfigPacketSize":"","cameraConfigVerticalFlip":false,"cameraConfigHorizontalFlip":false,"cameraConfigMapVideo":"","cameraConfigMapAudio":"","cameraConfigVideoFilter":"","cameraConfigAdditionalCommandLine":"","cameraConfigDebug":false,"cameraConfigInterfaceName":"","characteristicProperties":"","waitForSetupMsg":false,"outputs":2,"x":640,"y":1320,"wires":[[],[]]},{"id":"7e3ef20fcaa92146","type":"homekit-service","z":"e05bb790.045998","isParent":false,"hostType":"0","bridge":"","accessoryId":"","parentService":"43451b7056f5684f","name":"Temperature ","serviceName":"TemperatureSensor","topic":"","filter":false,"manufacturer":"Default Manufacturer","model":"Default Model","serialNo":"Default Serial Number","firmwareRev":"","hardwareRev":"","softwareRev":"","cameraConfigVideoProcessor":"","cameraConfigSource":"","cameraConfigStillImageSource":"","cameraConfigMaxStreams":"","cameraConfigMaxWidth":"","cameraConfigMaxHeight":"","cameraConfigMaxFPS":"","cameraConfigMaxBitrate":"","cameraConfigVideoCodec":"","cameraConfigAudioCodec":"","cameraConfigAudio":false,"cameraConfigPacketSize":"","cameraConfigVerticalFlip":false,"cameraConfigHorizontalFlip":false,"cameraConfigMapVideo":"","cameraConfigMapAudio":"","cameraConfigVideoFilter":"","cameraConfigAdditionalCommandLine":"","cameraConfigDebug":false,"cameraConfigInterfaceName":"","characteristicProperties":"","waitForSetupMsg":false,"outputs":2,"x":650,"y":1380,"wires":[[],[]]},{"id":"e592d018ff4214f0","type":"api-call-service","z":"e05bb790.045998","name":"on","server":"2caefc09.0b4a04","version":3,"debugenabled":false,"service_domain":"switch","service":"turn_{{payload}}","entityId":"switch.kong_qi_jing_hua_qi_buzzer","data":"","dataType":"json","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":910,"y":1440,"wires":[[]]},{"id":"69181a3423f199df","type":"function","z":"e05bb790.045998","name":"on/off","func":"\n//Switch\nif (msg.payload.On === true) {\n    msg.payload = 'on';\n} else {\n    msg.payload = 'off';\n}\n\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":1440,"wires":[["e592d018ff4214f0"]],"outputLabels":["on","off"]},{"id":"24c550b042d9a05b","type":"debug","z":"e05bb790.045998","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":630,"y":1500,"wires":[]},{"id":"dae56e1bc1bba3b1","type":"homekit-service","z":"e05bb790.045998","isParent":false,"hostType":"0","bridge":"","accessoryId":"","parentService":"43451b7056f5684f","name":"Buzzer","serviceName":"Switch","topic":"","filter":false,"manufacturer":"NRCHKB","model":"1.3.6","serialNo":"Default Serial Number","firmwareRev":"1.3.6","hardwareRev":"1.3.6","softwareRev":"1.3.6","cameraConfigVideoProcessor":"ffmpeg","cameraConfigSource":"","cameraConfigStillImageSource":"","cameraConfigMaxStreams":2,"cameraConfigMaxWidth":1280,"cameraConfigMaxHeight":720,"cameraConfigMaxFPS":10,"cameraConfigMaxBitrate":300,"cameraConfigVideoCodec":"libx264","cameraConfigAudioCodec":"libfdk_aac","cameraConfigAudio":false,"cameraConfigPacketSize":1316,"cameraConfigVerticalFlip":false,"cameraConfigHorizontalFlip":false,"cameraConfigMapVideo":"0:0","cameraConfigMapAudio":"0:1","cameraConfigVideoFilter":"scale=1280:720","cameraConfigAdditionalCommandLine":"-tune zerolatency","cameraConfigDebug":false,"cameraConfigSnapshotOutput":"disabled","cameraConfigInterfaceName":"","characteristicProperties":"","waitForSetupMsg":false,"outputs":2,"x":630,"y":1440,"wires":[["69181a3423f199df"],[]]},{"id":"66d4810256f27438","type":"server-state-changed","z":"e05bb790.045998","name":"pm2_5","server":"2caefc09.0b4a04","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.kong_qi_jing_hua_qi_pm2_5","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":110,"y":1200,"wires":[["7427ca27f63d9a18"]]},{"id":"78220e8053faba8c","type":"server-state-changed","z":"e05bb790.045998","name":"Humidity","server":"2caefc09.0b4a04","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.kong_qi_jing_hua_qi_humidity","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":100,"y":1320,"wires":[["62bb5cfc364d2191"]]},{"id":"ee478ec49c3831bf","type":"server-state-changed","z":"e05bb790.045998","name":"Temperature","server":"2caefc09.0b4a04","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.kong_qi_jing_hua_qi_temperature","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":90,"y":1380,"wires":[["4d2a6c3059ba703c"]]},{"id":"eb4e9a6a55198eb6","type":"server-state-changed","z":"e05bb790.045998","name":"Buzzer","server":"2caefc09.0b4a04","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"switch.kong_qi_jing_hua_qi_buzzer","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":110,"y":1440,"wires":[["5aca5d11ec3666ed"]]},{"id":"21c88647a86b939b","type":"function","z":"e05bb790.045998","name":"Xiaomi_info","func":"//Definition  of output Object\nvar PM2_5Density = {};//PM2.5\nvar AirQuality = {};//空氣質量\nvar StatusActive = {};//sensor狀態,這邊跟著主機走,可用可不用\nvar FilterLifeLevel = {};//濾網狀態\nvar FilterChangeIndication = {};//濾網更換提示<=10\nvar CurrentRelativeHumidity = {};//濕度\nvar CurrentTemperature = {};//溫度\nvar Buzzer = {}; //按鍵音\n//Definition of xiaomi output parameters \nvar pm2_5 = msg.payload.pm2_5;\nvar status = msg.payload.pm2_5; //這邊用2_5來看是否unavailable\nvar filter = msg.payload.filterstatus;\nvar humidity = msg.payload.humidity;\nvar temperature = msg.payload.temperature;\nvar buzzer = msg.payload.buzzer;\n//變數\nvar airQualityPM2_5, statusActive, filterStatus, switchBuzzer;\n\n//AirQuality\n// Banding AirQiality based on US AQI to provide HomeKit Levels\n//   Source: https://aqicn.org/calculator\nif (pm2_5 < 12) {\n    airQualityPM2_5 = 1;\n} else if (pm2_5 < 35.5) {\n    airQualityPM2_5 = 2\n} else if (pm2_5 < 55.5) {\n    airQualityPM2_5 = 3\n} else if (pm2_5 < 150.5) {\n    airQualityPM2_5 = 4\n} else if (pm2_5 >= 250.5) {\n    airQualityPM2_5 = 5;\n} else {\n  airQualityPM2_5 = 0;  \n}\nPM2_5Density.payload = {\n    \"PM2_5Density\" : Number(pm2_5)\n}\nAirQuality.payload = {\n    \"AirQuality\" : airQualityPM2_5\n}\n//StatusActive\nif (status === \"unavailable\") {\n    statusActive = false;\n} else {\n    statusActive = true\n}\nStatusActive.payload ={\n    \"StatusActive\" : statusActive\n}\n//FilterMaintenance\nif (filter <= 10) {\n    filterStatus = 1;\n} else {\n    filterStatus = 0\n}\n\nFilterChangeIndication.payload = {\n    \"FilterChangeIndication\" : filterStatus\n}\nFilterLifeLevel.payload = {\n    \"FilterLifeLevel\" : Number(filter)\n}\n//Humidity \nCurrentRelativeHumidity.payload = {\n    \"CurrentRelativeHumidity\" : Number(humidity)\n}\n//Temperature \nCurrentTemperature.payload = {\n    \"CurrentTemperature\" : Number(temperature)\n}\n//Switch_buzzer\nif (buzzer === \"on\") {\n    switchBuzzer = \"true\";\n} else {\n    switchBuzzer = \"false\"\n}\n\nBuzzer.payload = {\n    \"On\" : switchBuzzer\n}\n\nreturn [ [PM2_5Density, AirQuality, StatusActive], [FilterChangeIndication, FilterLifeLevel], [CurrentRelativeHumidity, StatusActive], [CurrentTemperature, StatusActive], [Buzzer] ];\n","outputs":5,"noerr":0,"initialize":"","finalize":"","libs":[],"x":450,"y":1320,"wires":[["16a661c1a6685e74","24c550b042d9a05b"],["10bbd50eed7a931d"],["a5e3052ceb09ca2c"],["7e3ef20fcaa92146"],["dae56e1bc1bba3b1"]],"outputLabels":["AirQuality","FilterMaintenance","Humidity ","Temperature ","Buzzer"]},{"id":"7427ca27f63d9a18","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"move","p":"payload","pt":"msg","to":"payload.pm2_5","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":1200,"wires":[["21c88647a86b939b","24c550b042d9a05b"]]},{"id":"7308d9a85434f4cc","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"move","p":"payload","pt":"msg","to":"payload.filterstatus","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":1260,"wires":[["21c88647a86b939b"]]},{"id":"62bb5cfc364d2191","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"move","p":"payload","pt":"msg","to":"payload.humidity","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":1320,"wires":[["21c88647a86b939b"]]},{"id":"4d2a6c3059ba703c","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"move","p":"payload","pt":"msg","to":"payload.temperature","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":1380,"wires":[["21c88647a86b939b"]]},{"id":"5aca5d11ec3666ed","type":"change","z":"e05bb790.045998","name":"轉換","rules":[{"t":"move","p":"payload","pt":"msg","to":"payload.buzzer","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":1440,"wires":[["21c88647a86b939b"]]},{"id":"2caefc09.0b4a04","type":"server","name":"Home Assistant","version":1,"legacy":true,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true},{"id":"3d5ca1527ce61722","type":"homekit-bridge","bridgeName":"Purifier_Xiaomi","pinCode":"168-16-188","port":"","advertiser":"bonjour-hap","allowInsecureRequest":false,"manufacturer":"NRCHKB","model":"1.3.6","serialNo":"Default Serial Number","firmwareRev":"1.3.6","hardwareRev":"1.3.6","softwareRev":"1.3.6","customMdnsConfig":false,"mdnsMulticast":true,"mdnsInterface":"","mdnsPort":"","mdnsIp":"","mdnsTtl":"","mdnsLoopback":true,"mdnsReuseAddr":true,"allowMessagePassthrough":true}]

到這邊應該就將HK bride node用很簡潔的NR流程完整地呈現出來,將單一設備的所有功能整合進HK內並且以單一設備去呈現,希望幫助到也有強迫症的朋友們 :rofl: :rofl: :rofl:

1個讚

實在感謝,希望有空多分享一些

謝謝分享~~晚上又要來燒腦一下了^^

請問這個作法,是不是限於本來就可以直接入homekit的產品呢?

感謝分享,不過我在加入homekit後發現所有sensor的數值都顯示不出來耶,有人有解嗎

應該不限,這個節點的任何service你都能隨便套用,但是他就是顯示那一個裝置類別,例如除濕機,風扇等等

你可能要吧debug訊息跟節點貼出來才能幫忙看喔

某一次重啟空氣淨化器後讀值就通通跑出來了!!
謝謝馬克大

小米MIIO近期大改版,Purifier的實體全部大更新,可以先依照相同的方式去修改

請問一下馬克大,您的2S在miio是用哪個model?我用miio他偵測不到型號,需要手動選取…

你是怎麼加進去的?我是綁去米家後,用xiaomi gateway3拿token,印象中你2S加到和HA同一個網段應該就會自己找到才對


馬克大您好,我用的是這個從整合裡找到的Miio應該沒錯吧?但好像跟您的敘述有出入,我一加入它就是直接雲整合需要直接輸入帳號密碼,難怪我怎麼試都和您的不一樣…

這樣也可以,但你說的不一樣是指?MIIO最近改版所以他entity全改了,我前面幾樓有說,還懶得改文章…你是指entity改了嗎

1個讚

感謝馬克大更新!想跟您確認一下,模式的開關和轉速的數值是用Template建出來的Entity嗎?

抱歉…回覆晚了,你是指小米的嗎?有另外建立template跟helper沒錯喔!

馬克大也可以分享一下Template和helper的建立方法嗎?我自己嘗試建立會導致Homekit錯亂,會出現一堆不相關的裝置開關…

回饋一下自己修改馬克大提供的NR程式碼的成果,機型是小米空氣清淨機2S,使用HA內置的miio載入,但因為機型上沒有被miio支援,用類似的機型套用。

感測器已經有提供溫溼度和空氣品質質量顯示,所以就不從NR載入了。另外2S只有14段風量,但套用的機型有17段,要修改一下以免API呼叫服務錯亂

HA版本是2022.01.1

[{"id":"3a932dda06ecf485","type":"tab","label":"空氣清淨機","disabled":false,"info":"","env":[]},{"id":"4cf032848d51a6ef","type":"server-state-changed","z":"3a932dda06ecf485","name":"空氣清淨機","server":"2caefc09.0b4a04","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"fan.kong_qi_jing_hua_qi","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":false,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":160,"y":160,"wires":[["efe37c7bab6e3748"]]},{"id":"efe37c7bab6e3748","type":"change","z":"3a932dda06ecf485","name":"轉換","rules":[{"t":"change","p":"payload","pt":"msg","from":"on","fromt":"str","to":"{\"CurrentAirPurifierState\":2,\"Active\":1}","tot":"json"},{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"{\"CurrentAirPurifierState\":0,\"Active\":0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":410,"y":160,"wires":[["91d3d5c628e99755"]]},{"id":"6a66dede4f0675ae","type":"server-state-changed","z":"3a932dda06ecf485","name":"安全鎖","server":"2caefc09.0b4a04","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"switch.kong_qi_jing_hua_qi_child_lock","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":false,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":150,"y":280,"wires":[["f1d2a5bd950fa8d9"]]},{"id":"91d3d5c628e99755","type":"homekit-service","z":"3a932dda06ecf485","isParent":true,"hostType":"0","bridge":"70de9b9cd5ac76ad","accessoryId":"","parentService":"","name":"空氣清淨機","serviceName":"AirPurifier","topic":"","filter":false,"manufacturer":"Xiaomi","model":"zhimi.airpurifier.mb1","serialNo":"Default Serial Number","firmwareRev":"1.3.6","hardwareRev":"1.3.6","softwareRev":"1.3.6","cameraConfigVideoProcessor":"ffmpeg","cameraConfigSource":"","cameraConfigStillImageSource":"","cameraConfigMaxStreams":2,"cameraConfigMaxWidth":1280,"cameraConfigMaxHeight":720,"cameraConfigMaxFPS":10,"cameraConfigMaxBitrate":300,"cameraConfigVideoCodec":"libx264","cameraConfigAudioCodec":"libfdk_aac","cameraConfigAudio":false,"cameraConfigPacketSize":1316,"cameraConfigVerticalFlip":false,"cameraConfigHorizontalFlip":false,"cameraConfigMapVideo":"0:0","cameraConfigMapAudio":"0:1","cameraConfigVideoFilter":"scale=1280:720","cameraConfigAdditionalCommandLine":"-tune zerolatency","cameraConfigDebug":false,"cameraConfigSnapshotOutput":"disabled","cameraConfigInterfaceName":"","characteristicProperties":"{\"LockPhysicalControls\":true,\"TargetAirPurifierState\":true,\"RotationSpeed\":{\"minValue\":0,\"maxValue\":100,\"minStep\":7}}","waitForSetupMsg":false,"outputs":2,"x":610,"y":220,"wires":[["c7b20dd438cb2ed6"],[]]},{"id":"f1d2a5bd950fa8d9","type":"change","z":"3a932dda06ecf485","name":"轉換","rules":[{"t":"change","p":"payload","pt":"msg","from":"on","fromt":"str","to":"{\"LockPhysicalControls\":1}","tot":"json"},{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"{\"LockPhysicalControls\":0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":410,"y":280,"wires":[["91d3d5c628e99755"]]},{"id":"c7b20dd438cb2ed6","type":"function","z":"3a932dda06ecf485","name":"BridgeTransfer","func":"//Switch\nif (msg.payload.Active === 1) {\n    msg.payload = 'on';\n    node.send([msg, null, null, null, null]);\n}\n\nif (msg.payload.Active === 0) {\n    msg.payload = 'off';\n    node.send([null, msg, null, null, null]);\n}\n//Auto mode\nif (msg.payload.TargetAirPurifierState === 1) {\n    msg.payload = 'Auto';\n    node.send([null, null, msg, null, null]);\n} \nif (msg.payload.TargetAirPurifierState === 0) {\n    msg.payload = 'Favorite';\n    node.send([null, null, msg, null, null]);\n}\n//Lock\nif (msg.payload.LockPhysicalControls === 1) {\n    msg.payload = 'on';\n    node.send([null, null, null, msg, null]);\n} \nif (msg.payload.LockPhysicalControls === 0) {\n    msg.payload = 'off';\n    node.send([null, null, null, msg, null]);\n}\n//Speed\nif (msg.payload.RotationSpeed) {\n    node.send([null, null, null, null, msg]);\n} ","outputs":5,"noerr":0,"initialize":"","finalize":"","libs":[],"x":780,"y":220,"wires":[["7149c513c171f895","a6dd9b373c7d931a","9446dddb0e081662"],["9446dddb0e081662"],["56b254f2033d2c2a"],["9698dfae51c49888"],["e4b5b3b42ec04fe7"]],"outputLabels":["on","off","auto/manual","lock",""]},{"id":"9446dddb0e081662","type":"api-call-service","z":"3a932dda06ecf485","name":"電源開關","server":"2caefc09.0b4a04","version":5,"debugenabled":false,"domain":"fan","service":"turn_{{payload}}","areaId":[],"deviceId":[],"entityId":["fan.kong_qi_jing_hua_qi"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":980,"y":240,"wires":[[]]},{"id":"56b254f2033d2c2a","type":"api-call-service","z":"3a932dda06ecf485","name":"模式切換","server":"2caefc09.0b4a04","version":5,"debugenabled":false,"domain":"fan","service":"set_preset_mode","areaId":[],"deviceId":[],"entityId":["fan.kong_qi_jing_hua_qi"],"data":"{\"preset_mode\":payload}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":980,"y":300,"wires":[[]]},{"id":"9698dfae51c49888","type":"api-call-service","z":"3a932dda06ecf485","name":"兒童安全鎖開關","server":"2caefc09.0b4a04","version":5,"debugenabled":false,"domain":"switch","service":"turn_{{payload}}","areaId":[],"deviceId":[],"entityId":["switch.kong_qi_jing_hua_qi_child_lock"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1000,"y":360,"wires":[[]]},{"id":"a6dd9b373c7d931a","type":"trigger","z":"3a932dda06ecf485","name":"5 sec to on","op1":"","op2":"{\"CurrentAirPurifierState\":2}","op1type":"nul","op2type":"json","duration":"5","extend":false,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":990,"y":200,"wires":[["9e306ed62607c7ba"]]},{"id":"7149c513c171f895","type":"trigger","z":"3a932dda06ecf485","name":"2 sec to idle","op1":"","op2":"{\"CurrentAirPurifierState\":1}","op1type":"nul","op2type":"json","duration":"2","extend":false,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":990,"y":160,"wires":[["9e306ed62607c7ba"]]},{"id":"58b2d32317c724f1","type":"server-state-changed","z":"3a932dda06ecf485","name":"濾網狀態","server":"2caefc09.0b4a04","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.kong_qi_jing_hua_qi_filter_life_remaining","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":160,"y":400,"wires":[["4d347757e0c2fd13"]]},{"id":"3bd272511c0f454f","type":"homekit-service","z":"3a932dda06ecf485","isParent":false,"hostType":"0","bridge":"","accessoryId":"","parentService":"91d3d5c628e99755","name":"FilterMaintenance","serviceName":"FilterMaintenance","topic":"","filter":false,"manufacturer":"Default Manufacturer","model":"Default Model","serialNo":"Default Serial Number","firmwareRev":"","hardwareRev":"","softwareRev":"","cameraConfigVideoProcessor":"","cameraConfigSource":"","cameraConfigStillImageSource":"","cameraConfigMaxStreams":"","cameraConfigMaxWidth":"","cameraConfigMaxHeight":"","cameraConfigMaxFPS":"","cameraConfigMaxBitrate":"","cameraConfigVideoCodec":"","cameraConfigAudioCodec":"","cameraConfigAudio":false,"cameraConfigPacketSize":"","cameraConfigVerticalFlip":false,"cameraConfigHorizontalFlip":false,"cameraConfigMapVideo":"","cameraConfigMapAudio":"","cameraConfigVideoFilter":"","cameraConfigAdditionalCommandLine":"","cameraConfigDebug":false,"cameraConfigInterfaceName":"","characteristicProperties":"{\"FilterChangeIndication\":true,\"FilterLifeLevel\":true}","waitForSetupMsg":false,"outputs":2,"x":630,"y":440,"wires":[[],[]]},{"id":"6f5ace74b5fe0c9d","type":"link in","z":"3a932dda06ecf485","name":"","links":["9e306ed62607c7ba"],"x":655,"y":120,"wires":[["91d3d5c628e99755"]]},{"id":"9e306ed62607c7ba","type":"link out","z":"3a932dda06ecf485","name":"","links":["6f5ace74b5fe0c9d"],"x":1125,"y":200,"wires":[]},{"id":"2052cbf5cf867d3d","type":"function","z":"3a932dda06ecf485","name":"Xiaomi_info","func":"//Definition  of output Object\nvar PM2_5Density = {};//PM2.5\nvar AirQuality = {};//空氣質量\nvar StatusActive = {};//sensor狀態,這邊跟著主機走,可用可不用\nvar FilterLifeLevel = {};//濾網狀態\nvar FilterChangeIndication = {};//濾網更換提示<=10\nvar CurrentRelativeHumidity = {};//濕度\nvar CurrentTemperature = {};//溫度\nvar Buzzer = {}; //按鍵音\n//Definition of xiaomi output parameters \nvar pm2_5 = msg.payload.pm2_5;\nvar status = msg.payload.pm2_5; //這邊用2_5來看是否unavailable\nvar filter = msg.payload.filterstatus;\nvar humidity = msg.payload.humidity;\nvar temperature = msg.payload.temperature;\nvar buzzer = msg.payload.buzzer;\n//變數\nvar airQualityPM2_5, statusActive, filterStatus, switchBuzzer;\n\n//AirQuality\n// Banding AirQiality based on US AQI to provide HomeKit Levels\n//   Source: https://aqicn.org/calculator\nif (pm2_5 < 12) {\n    airQualityPM2_5 = 1;\n} else if (pm2_5 < 35.5) {\n    airQualityPM2_5 = 2\n} else if (pm2_5 < 55.5) {\n    airQualityPM2_5 = 3\n} else if (pm2_5 < 150.5) {\n    airQualityPM2_5 = 4\n} else if (pm2_5 >= 250.5) {\n    airQualityPM2_5 = 5;\n} else {\n  airQualityPM2_5 = 0;  \n}\nPM2_5Density.payload = {\n    \"PM2_5Density\" : Number(pm2_5)\n}\nAirQuality.payload = {\n    \"AirQuality\" : airQualityPM2_5\n}\n//StatusActive\nif (status === \"unavailable\") {\n    statusActive = false;\n} else {\n    statusActive = true\n}\nStatusActive.payload ={\n    \"StatusActive\" : statusActive\n}\n//FilterMaintenance\nif (filter <= 10) {\n    filterStatus = 1;\n} else {\n    filterStatus = 0\n}\n\nFilterChangeIndication.payload = {\n    \"FilterChangeIndication\" : filterStatus\n}\nFilterLifeLevel.payload = {\n    \"FilterLifeLevel\" : Number(filter)\n}\n//Humidity \nCurrentRelativeHumidity.payload = {\n    \"CurrentRelativeHumidity\" : Number(humidity)\n}\n//Temperature \nCurrentTemperature.payload = {\n    \"CurrentTemperature\" : Number(temperature)\n}\n//Switch_buzzer\nif (buzzer === \"on\") {\n    switchBuzzer = \"true\";\n} else {\n    switchBuzzer = \"false\"\n}\n\nBuzzer.payload = {\n    \"On\" : switchBuzzer\n}\n\nreturn [ [PM2_5Density, AirQuality, StatusActive], [FilterChangeIndication, FilterLifeLevel], [CurrentRelativeHumidity, StatusActive], [CurrentTemperature, StatusActive], [Buzzer] ];","outputs":5,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":420,"wires":[["ed4f01d9be56a178"],["3bd272511c0f454f"],[],[],[]],"outputLabels":["AirQuality","",null,null,null]},{"id":"4d347757e0c2fd13","type":"change","z":"3a932dda06ecf485","name":"轉換","rules":[{"t":"move","p":"payload","pt":"msg","to":"payload.filterstatus","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":290,"y":400,"wires":[["2052cbf5cf867d3d"]]},{"id":"fb917c0bf836177f","type":"switch","z":"3a932dda06ecf485","name":"模式","property":"payload.new_state.attributes.preset_mode","propertyType":"msg","rules":[{"t":"eq","v":"Auto","vt":"str"},{"t":"eq","v":"Favorite","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":290,"y":220,"wires":[["7380f38d0758e2b2"],["304a59d8a84ee174"]]},{"id":"7380f38d0758e2b2","type":"change","z":"3a932dda06ecf485","name":"Auto","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"TargetAirPurifierState\":1}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":410,"y":200,"wires":[["91d3d5c628e99755"]]},{"id":"304a59d8a84ee174","type":"change","z":"3a932dda06ecf485","name":"Favorite","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"TargetAirPurifierState\":0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":420,"y":240,"wires":[["91d3d5c628e99755"]]},{"id":"0f3f9ef8498883f9","type":"server-state-changed","z":"3a932dda06ecf485","name":"模式","server":"2caefc09.0b4a04","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"fan.kong_qi_jing_hua_qi","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":false,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"eventData"}],"x":150,"y":220,"wires":[["fb917c0bf836177f"]]},{"id":"ec8e203ca789f7f3","type":"server-state-changed","z":"3a932dda06ecf485","name":"Speed","server":"2caefc09.0b4a04","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"number.kong_qi_jing_hua_qi_favorite_level","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":150,"y":340,"wires":[["b58638eab6a9f0d5"]]},{"id":"e4b5b3b42ec04fe7","type":"api-call-service","z":"3a932dda06ecf485","name":"Speed Set","server":"2caefc09.0b4a04","version":5,"debugenabled":false,"domain":"number","service":"set_value","areaId":[],"deviceId":[],"entityId":["number.kong_qi_jing_hua_qi_favorite_level"],"data":"{\"value\":payload.RotationSpeed / 7 + 1}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"last","x":990,"y":420,"wires":[[]]},{"id":"ed4f01d9be56a178","type":"debug","z":"3a932dda06ecf485","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":590,"y":400,"wires":[]},{"id":"b58638eab6a9f0d5","type":"change","z":"3a932dda06ecf485","name":"轉換","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"RotationSpeed\": $number(msg.payload) * 7 - 7}\t\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":410,"y":340,"wires":[["91d3d5c628e99755"]]},{"id":"2caefc09.0b4a04","type":"server","name":"Home Assistant","version":2,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30},{"id":"70de9b9cd5ac76ad","type":"homekit-bridge","bridgeName":"空氣清淨機","pinCode":"168-16-188","port":"","advertiser":"bonjour-hap","allowInsecureRequest":false,"manufacturer":"Xiaomi","model":"Xiaomi Air Purifier 2S","serialNo":"Default Serial Number","firmwareRev":"1.3.6","hardwareRev":"1.3.6","softwareRev":"1.3.6","customMdnsConfig":false,"mdnsMulticast":true,"mdnsInterface":"","mdnsPort":"","mdnsIp":"","mdnsTtl":"","mdnsLoopback":true,"mdnsReuseAddr":true,"allowMessagePassthrough":true}]

這篇讚~正好小弟需要,但圖片好像已失效?

記得我好像有把更新後的放在連結?? 我有空來修一下文章,感謝你