Sensor de dispositivos indisponíveis

Brincando aqui com o NR e chatgpt, fiz um sensor para verificar dispositivos indisponíveis.

O fluxo basicamente gera um array com todos device_id e seus nomes, depois acrescenta no array todas entidades que pertencem ao device_id e verifica o estado delas, caso tenha alguma entidade indisponível ou desconhecida o dispositivo é dado como indisponível.

Excluí os domínios button, text e select (linha 39 do nó Entities) e também criei uma lista de exclusão de entidades (var exclusionList nó Entities) , para caso alguma entidade fique indisponível por algum motivo, não marcar o dispositivo como indisponível também.

[{"id":"e66f46cc57d0675e","type":"group","z":"0f7835e60dfdde53","style":{"stroke":"#999999","stroke-opacity":"1","fill":"none","fill-opacity":"1","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["6350adb9d3fccc87","e844977fcca2f374","ed08912f9e7782a5","663651a726431d22","742194443af2df4e","ad96b14222516e97","7503696fcfd2f932"],"x":154,"y":1039,"w":892,"h":142},{"id":"6350adb9d3fccc87","type":"inject","z":"0f7835e60dfdde53","g":"e66f46cc57d0675e","name":"","props":[],"repeat":"60","crontab":"","once":true,"onceDelay":"15","topic":"","x":250,"y":1080,"wires":[["e844977fcca2f374"]]},{"id":"e844977fcca2f374","type":"ha-api","z":"0f7835e60dfdde53","g":"e66f46cc57d0675e","name":"","server":"33803899.487d48","version":1,"debugenabled":false,"protocol":"websocket","method":"get","path":"","data":"{\"type\": \"config/device_registry/list\"}","dataType":"jsonata","responseType":"json","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"results"}],"x":510,"y":1080,"wires":[["ed08912f9e7782a5"]]},{"id":"ed08912f9e7782a5","type":"function","z":"0f7835e60dfdde53","g":"e66f46cc57d0675e","name":"Device List","func":"// Seus dados de entrada estão em msg.payload\n\n// Array para armazenar os dispositivos encontrados\nvar allDevices = [];\n\n// Percorre os objetos dentro de \"payload\" para obter o device_name e o device_id de cada dispositivo\nfor (var i = 0; i < msg.payload.length; i++) {\n    var device = msg.payload[i];\n    // Adiciona o dispositivo encontrado ao array\n    allDevices.push({\n        device_name: device.name,\n        device_id: device.id\n    });\n}\n\n// Adiciona o array de dispositivos ao msg e retorna\nmsg.devices = allDevices;\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":670,"y":1080,"wires":[["663651a726431d22"]]},{"id":"663651a726431d22","type":"ha-api","z":"0f7835e60dfdde53","g":"e66f46cc57d0675e","name":"","server":"33803899.487d48","version":1,"debugenabled":false,"protocol":"websocket","method":"get","path":"","data":"{\"type\": \"config/entity_registry/list\"}","dataType":"jsonata","responseType":"json","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"results"}],"x":510,"y":1140,"wires":[["ad96b14222516e97"]]},{"id":"742194443af2df4e","type":"debug","z":"0f7835e60dfdde53","g":"e66f46cc57d0675e","name":"debug 454","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":890,"y":1080,"wires":[]},{"id":"ad96b14222516e97","type":"function","z":"0f7835e60dfdde53","g":"e66f46cc57d0675e","name":"Entities","func":"// Seus dados de entrada estão em msg.payload\n// Seus dispositivos estão em msg.devices\n\n// Define a variável para acessar o estado global\nvar globalStates = global.get('homeassistant.homeAssistant.states');\n\n// Array para armazenar dispositivos com entidades no estado \"unknown\" ou \"unavailable\"\nvar devicesWithUnknownOrUnavailableEntities = [];\n\n// Array para armazenar apenas os nomes dos dispositivos da lista devicesWithUnknownOrUnavailableEntities\nvar deviceNamesWithIssues = [];\n\n// Define a lista de exclusão de entidades\nvar exclusionList = [\n    \"siren.entrada_siren\",\n    \"device_tracker.lg_v500\",\n    \"switch.requisicao_de_status\",\n    \"switch.particao_a\",\n    \"switch.particao_b\",\n    \"switch.particao_c\",\n    \"switch.particao_d\",\n    \"switch.central\",\n    \"switch.pgm_1\",\n    \"switch.pgm_2\",\n    \"switch.pgm_3\",\n    \"switch.sirene\"\n\n]; // Adicione mais entity_id aqui conforme necessário\n\n// Percorre os objetos dentro de \"payload\" para encontrar as entidades para cada device_id\nfor (var i = 0; i < msg.devices.length; i++) {\n    var device = msg.devices[i];\n    device.entities = []; // Inicializa o array de entidades para cada dispositivo\n    var hasUnknownOrUnavailableEntity = false; // Flag para indicar se há entidade com estado \"unknown\" ou \"unavailable\"\n\n    for (var j = 0; j < msg.payload.length; j++) {\n        var entity = msg.payload[j];\n        // Verifica se o entity_id não começa com \"button.\" ou \"select.\"\n        if (entity.device_id === device.device_id && !entity.entity_id.startsWith(\"button.\") && !entity.entity_id.startsWith(\"text.\") && !entity.entity_id.startsWith(\"select.\")) {\n            // Obtém o estado da entidade a partir da variável global\n            var entityState = globalStates[entity.entity_id] ? globalStates[entity.entity_id].state : null;\n\n            // Adiciona a entidade ao array de entidades do dispositivo correspondente, mantendo apenas as propriedades desejadas\n            device.entities.push({\n                area_id: entity.area_id,\n                entity_id: entity.entity_id,\n                original_name: entity.original_name,\n                state: entityState\n            });\n\n            // Verifica se o estado da entidade é \"unknown\" ou \"unavailable\", e se não está na lista de exclusão\n            if ((entityState === \"unknown\" || entityState === \"unavailable\") && !exclusionList.includes(entity.entity_id)) {\n                hasUnknownOrUnavailableEntity = true;\n            }\n        }\n    }\n\n    // Se o dispositivo tem entidades com estado \"unknown\" ou \"unavailable\" que não estão na lista de exclusão, adiciona ao array de dispositivos\n    if (hasUnknownOrUnavailableEntity) {\n        devicesWithUnknownOrUnavailableEntities.push(device);\n        deviceNamesWithIssues.push(device.device_name); // Adiciona o nome do dispositivo ao array de nomes com problemas\n    }\n}\n\n\n// Verifica se array está definido e é realmente um array\nif (deviceNamesWithIssues.length === 0) {\n    msg.deviceNamesWithIssues = \"\";\n    msg.deviceNamesWithIssuesCount = 0;\n} else if (deviceNamesWithIssues.length === 1) {\n    // Se o array tiver apenas um elemento, não precisa de transformação\n    msg.deviceNamesWithIssues = deviceNamesWithIssues[0];\n    msg.deviceNamesWithIssuesCount = deviceNamesWithIssues.length;\n} else if (deviceNamesWithIssues.length === 2) {\n    // Se o array tiver dois elementos, separa por \"e\"\n    msg.deviceNamesWithIssues = deviceNamesWithIssues.join(' e ');\n    msg.deviceNamesWithIssuesCount = deviceNamesWithIssues.length;\n} else if (deviceNamesWithIssues.length > 2) {\n    // Se o array tiver mais de dois elementos, separa por vírgulas exceto o último elemento que é separado por \"e\"\n    let lastElement = deviceNamesWithIssues.pop();\n    let texto = deviceNamesWithIssues.join(', ') + ' e ' + lastElement;\n    msg.deviceNamesWithIssues = texto;\n    msg.deviceNamesWithIssuesCount = deviceNamesWithIssues.length + 1;\n} \n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":660,"y":1140,"wires":[["742194443af2df4e","7503696fcfd2f932","ac821e2325819ba1"]]},{"id":"7503696fcfd2f932","type":"ha-sensor","z":"0f7835e60dfdde53","g":"e66f46cc57d0675e","name":"Dispositivos indisponíveis","entityConfig":"574187adfc253dc7","version":0,"state":"deviceNamesWithIssuesCount","stateType":"msg","attributes":[{"property":"Device Name","value":"deviceNamesWithIssues","valueType":"msg"}],"inputOverride":"allow","outputProperties":[],"x":910,"y":1140,"wires":[[]]},{"id":"33803899.487d48","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"574187adfc253dc7","type":"ha-entity-config","server":"33803899.487d48","deviceConfig":"","name":"Dispositivos indisponíveis","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Dispositivos indisponíveis"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""}],"resend":false,"debugEnabled":false}]

Edit: Arrumei o contador

3 Likes