Git Product home page Git Product logo

ha-nr-flows's Introduction

HA-NR-Flows

Sharing of smaller Home Assistant and Node-Red Flow used in my home automation applications. visitors

| Pre-requisites |

Applications | Solat OPENAI Prompter | Telegram | Frigate | Autogate | Blueiris | Synology Telegram File Downloader |

Utilities | Washing Machine Automata | Dryer Automata | Coffee Cup Counter | Power Monitoring | Application of Counter | Data logging |

Ad-Deen | Random Hadith| Pre-solat Broadcast

  1. Home Assistant with Node-Red. Ada banyak tutorial/videos on this with difficulty level as easy. This is one example. Test that you have enabled and can load Node-red on side bar. Make sure to also install Node-Red companion integration.
  2. Telegram bot and chat ids. I followed this tutorial which is clear and easy to follow.

Tip: Follow the steps to get botid/chatid only but you do not need to setup in Home Assistant Notify/Telegram platform. Use Node-Red fully for Telegram.

  1. In Node-red the following additional nodes may be required:
  • node-red-contrib-home-assistant-websocket - Comes pre-installed if using default HA Node-Red Docker from Supervisor store.
  • node-red-contrib-telegrambot - For Telegrambot. Setup as guide above.
[{"id":"25530ba312ac9cc8","type":"subflow","name":"Anas OpenAI","info":"","category":"","in":[{"x":120,"y":80,"wires":[{"id":"049ea185cd828c6a"}]}],"out":[{"x":660,"y":140,"wires":[{"id":"5242886db912e7e9","port":0}]},{"x":640,"y":220,"wires":[{"id":"afc7344eb36a785f","port":0}]}],"env":[],"meta":{},"color":"#DDAA99"},{"id":"5242886db912e7e9","type":"function","z":"25530ba312ac9cc8","name":"sanitize response","func":"const answer = msg\n    .answer\n    .data\n    .choices[0]\n    .message\n    .content\n    .replaceAll(\"\\n\", \" \")\n    .trim()\n\nmsg.gptAnswer = answer\n\nmsg.payload = answer\n\nreturn msg;\n\n\n//change to answer.data.choices[0].message.content\n//from answer.data.choices[0].text","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":370,"y":140,"wires":[["afc7344eb36a785f"]]},{"id":"049ea185cd828c6a","type":"function","z":"25530ba312ac9cc8","name":"Open AI","func":"const { Configuration, OpenAIApi } = openai;\n\nconst configuration = new Configuration({\n    apiKey: \"***Kunci OPENAI di sini***\"\n});\nconst openaiApi = new OpenAIApi(configuration);\n\n\nconst response = openaiApi.createChatCompletion({\n\n    model: \"gpt-3.5-turbo\",\n    messages: [\n        {\n            \"role\": \"system\",\n            \"content\": msg.prompt_system\n        },\n        {\n            \"role\": \"user\",\n            \"content\": msg.prompt_user\n        }\n\n    ],\n    max_tokens: 200,\n    top_p: 1,\n    frequency_penalty: 0,\n    presence_penalty: 0,\n}).then(answer => {\n    msg.answer = answer\n    node.send(msg);\n    node.done();\n});\n\nreturn","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[{"var":"openai","module":"openai"}],"x":340,"y":80,"wires":[["5242886db912e7e9"]]},{"id":"afc7344eb36a785f","type":"function","z":"25530ba312ac9cc8","name":"TTS Edge BM Rawak","func":"// @ts-nocheck\n\nlet voiceperson_random = getRndInteger(1,2);\n\nnode.status({fill:\"green\",shape:\"ring\",text:\" Playlist: \"+voiceperson_random}); \n\nswitch (voiceperson_random) {\n    case(1):\n        voiceperson = \"ms-MY-OsmanNeural\";\n        break;\n    case(2):\n        voiceperson = \"ms-MY-YasminNeural\";\n        break;\n    default:\n        voiceperson = \"ms-MY-OsmanNeural\";\n}\n\nif (msg.topic == \"ummi\")\n{\n    voiceperson = \"ms-MY-YasminNeural\";\n}\n\n//msg.payload = \"cubaan suara 123\";\nmsg.message = msg.gptAnswer;\nmsg.language = \"ms-MY\";\nmsg.cache = \"true\";\nmsg.options = { \"voice\": voiceperson, \"rate\": \"-5\\%\", \"volume\": \"+20\\%\" };\n\nmsg.payload = {\n    data: {\n        message: msg.message,\n        language: msg.language,\n        cache: true,\n        options: msg.options\n    }\n}\n\n\n//Return payload\nreturn msg;\n\n\n// this code gets a random interger\nfunction getRndInteger(min, max) {\n    return Math.floor(Math.random() * (max - min + 1) ) + min;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":380,"y":200,"wires":[[]]},{"id":"1828aea44aa8adc7","type":"debug","z":"a71bb471d54fd15e","name":"Output 1 - Text response","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":850,"y":820,"wires":[]},{"id":"0acdf9a598131aa9","type":"function","z":"a71bb471d54fd15e","name":"Craft OpenAI Message","func":"const {prompt} = msg\nconst prompt_user = `\n${prompt}\n`\n//get global variable\nvar g = global.get(\"homeassistant\");\n//get states variable\nvar states = g.homeAssistant.states;\n//get the actual entity that we want\n\n// helper input_text as prompt\n//msg.prompt_system = 'You are a  energetic assistant that likes to include a cheerful joke in every reply. You respond in bahasa melayu sajak format'\nmsg.prompt_system = states[\"input_text.sofia_system_prompt_solat_broadcast\"].state;\n\n// Fixed or helper here\nmsg.prompt_user = 'Announce no longer than 30 words to inform that it is now time for ' +msg.payload+ ' islamic prayer.'\n\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":360,"y":840,"wires":[["ad7587d40a1c7374"]]},{"id":"ad7587d40a1c7374","type":"subflow:25530ba312ac9cc8","z":"a71bb471d54fd15e","name":"","x":570,"y":840,"wires":[["1828aea44aa8adc7"],["fe5594b69fb763cd","f10f812be5849336"]]},{"id":"ef4acd82b7fa7a81","type":"inject","z":"a71bb471d54fd15e","name":"Test Inject Isyak","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"Isyak","payloadType":"str","x":360,"y":780,"wires":[["0acdf9a598131aa9"]]},{"id":"fe5594b69fb763cd","type":"debug","z":"a71bb471d54fd15e","name":"Output 2 - Call TTS Service","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":860,"y":880,"wires":[]},{"id":"f10f812be5849336","type":"api-call-service","z":"a71bb471d54fd15e","name":"TTS Edge","server":"71b7c783.42e358","version":5,"debugenabled":false,"domain":"tts","service":"ayat_ke_suara","areaId":[],"deviceId":[],"entityId":["media_player.walid_study_speaker"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":800,"y":920,"wires":[[]],"icon":"node-red-contrib-cast/google-home-mini2.svg"},{"id":"71b7c783.42e358","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}]

Telegram in out flow

  1. Make use of the link-in link-out nodes to create virtual links where multiple calls for Telegram can be centralize to a common sender node.

  2. Configure multiple link-in intended to parse different mode types i.e. message, picture, html where this is set respectively in the function block for parse mode along with ChatID.

  3. My personal preference is to two channel groups in Telegram - one being for logging hence muted for notifications (P2) while another is intended for critical notifications (P1).

[{"id":"b340e297.11a6","type":"function","z":"c8694ea1.9678f","name":"Creating message","func":"msg.payload = {\n chatId: '##P1 CHATID HERE##',\n type: 'message',\n content: msg.payload\n}\nmsg.payload.options = {parse_mode : \"Markdown\"};\n\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":635,"y":100,"wires":[["5ae73777.c96a18"]],"l":false},{"id":"8718a1dd.5beb7","type":"link in","z":"c8694ea1.9678f","name":"TelegramP1/message","links":["1e728149.1a3d9f","6207f8c8.4c3138","c1ecc3b6.5f7a","cdc3643e.25f498","cae18fa1.d1e76","4002d28e.02073c","2902516.c1262ae","cb4f929e.988ea","8a1bef97.bc983","944d419c.39e28","78ad1c9.b685de4","ebfb39ee.32cb58","8116579c.8f76d8"],"x":340,"y":100,"wires":[["b340e297.11a6"]],"icon":"node-red-contrib-telegrambot/telegram_cmd.png","l":true},{"id":"376edfb2.2e27b","type":"function","z":"c8694ea1.9678f","name":"Creating message","func":"msg.payload = {\n chatId: '##P2 CHATID HERE##',   // P2\n type: 'message',\n content: msg.payload\n }\nmsg.payload.options = {parse_mode : \"Markdown\"};\nreturn msg;\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":635,"y":260,"wires":[["87b3d4a9.9bec48"]],"l":false},{"id":"3bd8aa47.d839e6","type":"link in","z":"c8694ea1.9678f","name":"TelegramP2/message","links":["b9034afa.651308","29b724d3.00034c","b21413c.c2e05f","fdff9332.a0fb2","49e62860.2e77f8","5149d08.6aaf73","8846f4e0.f224a8","41a25d68.46b2a4","6753298a.6701d8","8e895913.617178","328fd291.4fd61e","539fee51.06081","40ade167.497ed","ace026da.9734a8","308c79be.40a506","9d883125.365dc","b308e31.dee102","c8223c0b.8a11f"],"x":320,"y":260,"wires":[["376edfb2.2e27b"]],"icon":"node-red-contrib-telegrambot/telegram_cmd.png","l":true},{"id":"17c45329.bd83cd","type":"function","z":"c8694ea1.9678f","name":"","func":"\nvar picture = {\n  content: msg.payload, // <-- check msg.payload is a buffer\n  caption: msg.message,\n  type : 'photo',\n  chatId: '##P2 CHATID HERE##'   // P2\n}\nmsg.payload = picture;\nreturn msg;\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":635,"y":300,"wires":[["87b3d4a9.9bec48"]],"l":false},{"id":"f41e4773.788428","type":"link in","z":"c8694ea1.9678f","name":"TelegramP2/picture","links":["569aae54.cb52c","b54e633a.8fe92","be8dcb41.88ff98","a2cbfe4d.94d2c","d1042c24.f3d98","8f0a1e69.a7512","80f2430f.673c3","6caf3bef.b35854"],"x":330,"y":300,"wires":[["17c45329.bd83cd"]],"icon":"node-red-contrib-telegrambot/telegram_cmd.png","l":true},{"id":"951a8dba.d4051","type":"function","z":"c8694ea1.9678f","name":"","func":"\nvar picture = {\n  content: msg.payload, // <-- check msg.payload is a buffer\n  caption: msg.message,\n  type : 'photo',\n  chatId: '##P1 CHATID HERE##' // P1\n}\nmsg.payload = picture;\nreturn msg;\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":635,"y":180,"wires":[["5ae73777.c96a18"]],"l":false},{"id":"d5fed255.7f8a4","type":"link in","z":"c8694ea1.9678f","name":"TelegramP1/picture","links":["e73e172.4e0b9e8","5476ad7e.f74af4","73d4b7ce.32f438"],"x":350,"y":180,"wires":[["951a8dba.d4051"]],"icon":"node-red-contrib-telegrambot/telegram_cmd.png","l":true},{"id":"e6e1d8da.45ee98","type":"function","z":"c8694ea1.9678f","name":"","func":"msg.payload = {\n chatId: '##P1 CHATID HERE##', // P1\n type: 'message',\n content: msg.payload\n }\nmsg.payload.options = {parse_mode : \"HTML\"};\nreturn msg;\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":635,"y":140,"wires":[["5ae73777.c96a18"]],"l":false},{"id":"c6e0b135.77de1","type":"link in","z":"c8694ea1.9678f","name":"TelegramP1/html","links":["425ca14d.eb33c","6a8413a1.0fa4cc"],"x":360,"y":140,"wires":[["e6e1d8da.45ee98"]],"icon":"node-red-contrib-telegrambot/telegram_cmd.png","l":true},{"id":"5ae73777.c96a18","type":"telegram sender","z":"c8694ea1.9678f","name":"P1 Channel","bot":"","haserroroutput":false,"outputs":1,"x":790,"y":140,"wires":[[]]},{"id":"87b3d4a9.9bec48","type":"telegram sender","z":"c8694ea1.9678f","name":"P2 Channel","bot":"","haserroroutput":false,"outputs":1,"x":790,"y":280,"wires":[[]]}]

Autogate flow

  1. This flow utilizes one open/close contact sensor and a camera pointed towards intended Autogate being tracked.
  2. Snapshot utilizes Home Assistant camera.snapshot service where the save path is set to www accessible directory for Node-Red to retrieve.
{
    "filename": "/config/www/snapshot_frontgatecam.jpg",
    "entity_id": [
        "camera.frontgatecam"
    ]
}
  1. During setting up this flow - discovered trigger node has the function to resend the message repeatedly at a required interval until a reset message is received. Superb ! Hence use this function to resend the message (snapshot and notify) should the autogate still be open every 2 minuntes.
[{"id":"59354a83.a84ae4","type":"group","z":"c8694ea1.9678f","style":{"stroke":"#2e333a","stroke-opacity":"1","fill":"#2e333a","fill-opacity":"0.75","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["a473b2a0.c9f01","d0d94bc5.640238","b15f601a.a13d1","dcd8c3.b4ab074","f3cbf084.9c554","73d4b7ce.32f438","7c493a75.a2f424","6834d249.ffeffc","81876d8f.dcfee","9966a4fd.0d33e8","d138bfa.9b7e94","3552b205.f58a3e","2fbce64e.5499ba"],"x":34,"y":1879,"w":1422,"h":262},{"id":"a473b2a0.c9f01","type":"server-state-changed","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"Autogate Open >30 minutes","server":"71b7c783.42e358","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.front_autogate","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"30","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":true,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":320,"y":1920,"wires":[["81876d8f.dcfee"],["9966a4fd.0d33e8"]]},{"id":"d0d94bc5.640238","type":"function","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"Set Snapshot URL","func":"msg.thumbnail    = \"http://FILLIN_HA_IPADDRESS:8123/local/snapshot_frontgatecam.jpg\"\nmsg.url = msg.thumbnail;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":950,"y":2060,"wires":[["dcd8c3.b4ab074"]]},{"id":"b15f601a.a13d1","type":"template","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"Telegram Image Caption","field":"message","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"⚠️ Autogate Left Open! ⚠️ \n\n\n\n\n\n\n","output":"str","x":490,"y":2040,"wires":[["6834d249.ffeffc"]]},{"id":"dcd8c3.b4ab074","type":"delay","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1095,"y":2060,"wires":[["f3cbf084.9c554"]],"l":false},{"id":"f3cbf084.9c554","type":"http request","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"GET snapshot picture","method":"GET","ret":"bin","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":1240,"y":2060,"wires":[["73d4b7ce.32f438","7c493a75.a2f424"]]},{"id":"73d4b7ce.32f438","type":"link out","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"T-Frontgate-Open","links":["d5fed255.7f8a4"],"x":1415,"y":2060,"wires":[],"icon":"node-red-contrib-telegrambot/telegram.png"},{"id":"7c493a75.a2f424","type":"debug","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"Debug","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1270,"y":2100,"wires":[]},{"id":"6834d249.ffeffc","type":"api-call-service","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"Take Snapshot","server":"71b7c783.42e358","version":3,"debugenabled":false,"service_domain":"camera","service":"snapshot","entityId":"","data":"{\"filename\":\"/config/www/snapshot_frontgatecam.jpg\",\"entity_id\":[\"camera.frontgatecam\"]}","dataType":"json","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":740,"y":2060,"wires":[["d0d94bc5.640238"]]},{"id":"81876d8f.dcfee","type":"trigger","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"Resend every 2 minutes until Normal","op1":"","op2":"","op1type":"pay","op2type":"pay","duration":"-2","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":810,"y":1920,"wires":[["3552b205.f58a3e"]]},{"id":"9966a4fd.0d33e8","type":"change","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"","rules":[{"t":"set","p":"reset","pt":"msg","to":"1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":535,"y":1940,"wires":[["81876d8f.dcfee"]],"l":false},{"id":"d138bfa.9b7e94","type":"template","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"Telegram Image Caption","field":"message","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"🟢 Autogate now closed 🟢 \n\n\n\n\n\n\n","output":"str","x":490,"y":2080,"wires":[["6834d249.ffeffc"]]},{"id":"3552b205.f58a3e","type":"api-current-state","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"Autogate Switch Status","server":"71b7c783.42e358","version":2,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"binary_sensor.front_autogate","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":190,"y":2060,"wires":[["b15f601a.a13d1"],["d138bfa.9b7e94"]]},{"id":"2fbce64e.5499ba","type":"comment","z":"c8694ea1.9678f","g":"59354a83.a84ae4","name":"Autogate","info":"","x":120,"y":1920,"wires":[]},{"id":"71b7c783.42e358","type":"server","name":"Home Assistant","version":1,"legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]
  • This is with Node-Red instance running in Synology NAS as Docker container.

  • Reference to /downloads in following nodes refers to volume mapping setup in Node-Red container volumes as below. Ubah host path to your NAS directory settings.

    Node Red Mapping

  • Refer Telegram notes above on setting up bot, setting up in Node-Red and also Flow Out in mapping To Telegram nodes.

  • Require to install node-red-contrib-fs-ops for file management.

  • To use - forward required files to bot and bot download receiver will run for received documents/video/picture/audio.

  • Second flow for file downloader will provide with bot commands

    • /list -listdown of files in /downloads
    • /organize - moves mp4/mkv/srt/pdf to subdirectory as specified according to file extension types in function node Array Set Path

Bot downloader

[{"id":"f201989b.70bfa8","type":"telegram receiver","z":"dbc79b0f11a3da2f","name":"","bot":"","saveDataDir":"/downloads","filterCommands":false,"x":130,"y":160,"wires":[["f06fa890.71b638","270f72a8.47cf8e"],[]]},{"id":"f06fa890.71b638","type":"debug","z":"dbc79b0f11a3da2f","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":340,"y":130,"wires":[]},{"id":"ff5b4743.e39658","type":"function","z":"dbc79b0f11a3da2f","name":"Set Path and File Name","func":"// anas-ivs,MYY,May 2021\n\n//FS - get path\nmsg.sourcePath = \"/downloads\";\n//get full path for fs switch change - file name and extension\nvar fullPath = msg.payload.path;\nmsg.file_path = fullPath;\n//FS - get file name only without name only from path\nvar telegramfull_file_name = fullPath.replace(/^.*[\\\\\\/]/, '');\nmsg.telegram_file_name = telegramfull_file_name;\n//get file extension only to append for photos/docs with caption\nvar file_extension = telegramfull_file_name.split('.').pop();\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.payload.type});\nif (msg.payload.type == 'photo')\n{\n    //FS - set destination path\n    msg.destinationPath = \"/downloads/photos\";\n    msg.doctype = 'Photo';\n    //if caption is defined - we want to rename the file to caption text + original file extension\n    //only for caption cases!\n    //var caption_text = msg.payload.caption;\n    if (typeof msg.payload.caption != 'undefined')\n    {\n    // get caption file\n    var captiontext = msg.payload.caption;\n    var newfile_name = captiontext+\".\"+file_extension;\n    msg.file_name = newfile_name;\n    }\n    else //if no caption - we let it be. Perhaps for future append date/userid\n    {\n    msg.file_name = msg.telegram_file_name;\n    }\n    return msg;\n    \n}\nelse if (msg.payload.type == 'audio' || msg.payload.type == 'voice')\n{\n    msg.destinationPath = \"/downloads/audio\";\n    msg.doctype = 'audio';\n    //if caption is defined - we want to rename the file to caption text + original file extension\n    //only for caption cases!\n    //var caption_text = msg.payload.caption;\n    if (typeof msg.payload.caption != 'undefined')\n    {\n    // get caption file\n    var captiontext = msg.payload.caption;\n    var newfile_name = captiontext+\".\"+file_extension;\n    msg.file_name = newfile_name;\n    }\n    else //if no caption - we let it be. Perhaps for future append date/userid\n    {\n    msg.file_name = msg.telegram_file_name;\n    }\n    return msg;\n}\nelse if (msg.payload.type == 'document')\n{\n    msg.destinationPath = \"/downloads/documents\";\n    msg.doctype = 'document';\n    msg.file_name = msg.originalMessage.document.file_name;\n    return msg;\n}\nelse if (msg.payload.type == 'video')\n{\n    msg.destinationPath = \"/downloads/video\";\n    msg.doctype = 'video';\n    msg.file_name = msg.originalMessage.video.file_name;\n    \n    //if caption is defined - we want to rename the file to caption text + original file extension\n    //only for caption cases!\n    //var caption_text = msg.payload.caption;\n    if (typeof msg.payload.caption != 'undefined')\n    {\n    // get caption file\n    var captiontext = msg.payload.caption;\n    var newfile_name = captiontext+\".\"+file_extension;\n    msg.file_name = newfile_name;\n    }\n    else //if no caption - we let it be. Perhaps for future append date/userid\n    {\n    msg.file_name = msg.telegram_file_name;\n    }\n    return msg;\n}\nelse if (msg.payload.type == 'video_note')\n{\n    msg.destinationPath = \"/downloads/video\";\n    msg.doctype = 'video_note';\n    msg.file_name = msg.originalMessage.document.file_name;\n    return msg;\n}\nelse if (msg.payload.type == 'message')\n{\n    msg.doctype = msg.payload.type;\n    msg.file_name = '';\n    return msg;\n}\nelse\n{\n    msg.doctype = msg.payload.type;\n    msg.file_name = '';\n    return msg;\n}\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":240,"wires":[["2ebb1e17.76dd82"]]},{"id":"2ebb1e17.76dd82","type":"debug","z":"dbc79b0f11a3da2f","name":"recognize file type","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":620,"y":240,"wires":[]},{"id":"ed107bbf.ed3dd8","type":"debug","z":"dbc79b0f11a3da2f","name":"filemove complete","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":880,"y":230,"wires":[]},{"id":"d32b5bd8.b1af98","type":"template","z":"dbc79b0f11a3da2f","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"File Received type: {{ doctype }}.\nSave Path: {{ destinationPath }}\nFile Name: {{ file_name }}\n\n\n\n\n","output":"str","x":675,"y":290,"wires":[["5cd2584a.035a78"]],"l":false},{"id":"5cd2584a.035a78","type":"link out","z":"dbc79b0f11a3da2f","name":"To Telegram","links":["cded121.86d7af"],"x":790,"y":290,"wires":[],"l":true},{"id":"6121f561.ffbe9c","type":"complete","z":"dbc79b0f11a3da2f","name":"File Received","scope":["ff5b4743.e39658","3cc2f3d4.5508fc"],"uncaught":false,"x":360,"y":290,"wires":[["4faf504f.25b7e"]]},{"id":"270f72a8.47cf8e","type":"switch","z":"dbc79b0f11a3da2f","name":"","property":"payload.type","propertyType":"msg","rules":[{"t":"eq","v":"message","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":340,"y":190,"wires":[[],["ff5b4743.e39658"]]},{"id":"4faf504f.25b7e","type":"fs-ops-move","z":"dbc79b0f11a3da2f","name":"Documents","sourcePath":"sourcePath","sourcePathType":"msg","sourceFilename":"telegram_file_name","sourceFilenameType":"msg","destPath":"destinationPath","destPathType":"msg","destFilename":"file_name","destFilenameType":"msg","link":false,"x":540,"y":290,"wires":[["ed107bbf.ed3dd8","d32b5bd8.b1af98"]]}]

File Sorter

[{"id":"efefa317.4288d","type":"change","z":"dbc79b0f11a3da2f","name":"","rules":[{"t":"move","p":"files","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":955,"y":740,"wires":[["bd57baa6.00f998"]],"l":false},{"id":"97fdd34e.c0398","type":"fs-ops-dir","z":"dbc79b0f11a3da2f","name":"","path":"/downloads","pathType":"str","filter":"filter","filterType":"msg","dir":"files","dirType":"msg","x":860,"y":740,"wires":[["efefa317.4288d"]]},{"id":"3d4e37a8.675478","type":"inject","z":"dbc79b0f11a3da2f","name":"mp4","props":[{"p":"payload"},{"p":"filter","v":"*.mp4","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":540,"y":580,"wires":[["efcbb15.f41005"]]},{"id":"bd57baa6.00f998","type":"split","z":"dbc79b0f11a3da2f","name":"Split array","splt":"\\n","spltType":"str","arraySplt":"1","arraySpltType":"len","stream":false,"addname":"","x":1050,"y":740,"wires":[["233d4784.d92898","c3fce652.532ca8"]]},{"id":"233d4784.d92898","type":"debug","z":"dbc79b0f11a3da2f","name":"array","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1260,"y":690,"wires":[]},{"id":"c3fce652.532ca8","type":"function","z":"dbc79b0f11a3da2f","name":"Array Set Path","func":"// anas-ivs,MYY,May 2021\n\n\n//FS - get path\nmsg.sourcePath = \"/downloads\";\n//get full path for fs switch change - file name and extension\n//var fullPath = msg.payload.path;\n//msg.file_path = fullPath;\n//FS - get file name only without name only from path\n//var telegramfull_file_name = fullPath.replace(/^.*[\\\\\\/]/, '');\n//msg.payload = filefull_file_name;\n//get file extension only to append for photos/docs with caption\nvar file_extension = msg.payload.split('.').pop();\n\nnode.status({fill:\"blue\",shape:\"ring\",text:file_extension});\n\nif (file_extension == 'mkv'|file_extension == 'mp4' | file_extension == 'srt'  )\n{\n    msg.destinationPath = \"/downloads/video\";\n    msg.filefull_file_name = msg.payload;\n    return msg;\n    \n}\nelse if (file_extension == 'pdf'|file_extension == 'cbr' )\n{\n    msg.destinationPath = \"/downloads/documents\";\n    msg.filefull_file_name = msg.payload;\n    return msg;\n    \n}\nelse\n{\n    return msg;\n}\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1230,"y":740,"wires":[[]]},{"id":"ce54184f.fbc4a8","type":"fs-ops-move","z":"dbc79b0f11a3da2f","name":"Documents","sourcePath":"sourcePath","sourcePathType":"msg","sourceFilename":"payload","sourceFilenameType":"msg","destPath":"destinationPath","destPathType":"msg","destFilename":"payload","destFilenameType":"msg","link":false,"x":1230,"y":790,"wires":[["627752c6.4859dc","7a2bbb3a.037ae4"]]},{"id":"627752c6.4859dc","type":"debug","z":"dbc79b0f11a3da2f","name":"filetransfer","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1440,"y":750,"wires":[]},{"id":"3de49de1.821c42","type":"complete","z":"dbc79b0f11a3da2f","name":"Array Set Path","scope":["c3fce652.532ca8"],"uncaught":false,"x":1060,"y":790,"wires":[["ce54184f.fbc4a8"]]},{"id":"7a2bbb3a.037ae4","type":"template","z":"dbc79b0f11a3da2f","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"File organize. Moving file {{filefull_file_name}}\nto {{destinationPath}}\n\n\n\n\n","output":"str","x":1375,"y":790,"wires":[["7449dc8d.d45164"]],"l":false},{"id":"7449dc8d.d45164","type":"link out","z":"dbc79b0f11a3da2f","name":"To Telegram","links":["cded121.86d7af"],"x":1510,"y":790,"wires":[],"l":true},{"id":"efcbb15.f41005","type":"change","z":"dbc79b0f11a3da2f","name":"mp4","rules":[{"t":"set","p":"filter","pt":"msg","to":"*.mp4","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":580,"wires":[["97fdd34e.c0398"]]},{"id":"db49d2f3.54574","type":"inject","z":"dbc79b0f11a3da2f","name":"mkv","props":[{"p":"payload"},{"p":"filter","v":"*.mkv","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":550,"y":630,"wires":[["b500053c.cdf458"]]},{"id":"b500053c.cdf458","type":"change","z":"dbc79b0f11a3da2f","name":"mkv","rules":[{"t":"set","p":"filter","pt":"msg","to":"*.mkv","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":630,"wires":[["97fdd34e.c0398"]]},{"id":"e8ce557a.c772a8","type":"catch","z":"dbc79b0f11a3da2f","name":"","x":310,"y":840,"wires":[["cd3e5352.717538"]]},{"id":"cd3e5352.717538","type":"debug","z":"dbc79b0f11a3da2f","name":"Debug","active":false,"console":"false","complete":"payload","x":760,"y":840,"wires":[]},{"id":"cfe3317f.d2ce7","type":"telegram sender","z":"dbc79b0f11a3da2f","name":"show keyboard","bot":"","haserroroutput":false,"outputs":1,"x":350,"y":680,"wires":[[]]},{"id":"db28aeae.a44ba8","type":"function","z":"dbc79b0f11a3da2f","name":"confirmation message","func":"// anas-ivs,MYY,May 2021\n\ncontext.global.keyboard = { pending : true };\n\nvar opts = {\n  reply_to_message_id: msg.payload.messageId,\n  reply_markup: JSON.stringify({\n    keyboard: [\n      ['MP4'],\n      ['MKV'],\n      ['SRT'],\n      ['PDF'],\n      ['Cancel']\n      ],\n      'resize_keyboard' : true, \n      'one_time_keyboard' : true\n  })\n};\n\nmsg.payload.content = 'Select filetype to organize';\nmsg.payload.options = opts;\n\nreturn [ msg ];\n","outputs":"1","noerr":0,"initialize":"","finalize":"","libs":[],"x":300,"y":630,"wires":[["cfe3317f.d2ce7"]]},{"id":"cc400aac.97c5f8","type":"telegram command","z":"dbc79b0f11a3da2f","name":"/organize","command":"/organize","description":"","registercommand":false,"language":"","bot":"","strict":false,"hasresponse":true,"useregex":false,"removeregexcommand":false,"outputs":2,"x":60,"y":750,"wires":[["db28aeae.a44ba8"],["469a1a73.b143cc"]]},{"id":"469a1a73.b143cc","type":"function","z":"dbc79b0f11a3da2f","name":"create response","func":"// anas-ivs,MYY,May 2021\n\nif (context.global.keyboard.pending) {\n    context.global.keyboard.pending = false;\n    \n    if(msg.payload.content === 'MP4') {\n        msg.filter = '*.mp4';\n        return [msg, null, null,null,null ];   \n    }\n    else if (msg.payload.content === 'MKV') {\n        msg.filter = '*.mkv';\n        return [null, msg, null,null,null ];   \n    }\n    else if (msg.payload.content === 'SRT') {\n        msg.filter = '*.srt';\n        return [null, null, msg,null,null ];   \n    }\n    else if (msg.payload.content === 'PDF') {\n        msg.filter = '*.pdf';\n        return [null, null, null, msg,null ];   \n    }\n    else     {\n        msg.payload.content = 'CANCEL';\n        return [null, null, null, null,msg ];   \n    }\n}\n\n","outputs":5,"noerr":0,"initialize":"","finalize":"","libs":[],"x":540,"y":760,"wires":[["cd3e5352.717538","97fdd34e.c0398"],["cd3e5352.717538","97fdd34e.c0398"],["cd3e5352.717538","97fdd34e.c0398"],["cd3e5352.717538","97fdd34e.c0398"],[]]},{"id":"322ec989.f45146","type":"inject","z":"dbc79b0f11a3da2f","name":"srt","props":[{"p":"payload"},{"p":"filter","v":"*.srt","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":540,"y":530,"wires":[["a3f6b64f.ecf278"]]},{"id":"a3f6b64f.ecf278","type":"change","z":"dbc79b0f11a3da2f","name":"mp4","rules":[{"t":"set","p":"filter","pt":"msg","to":"*.srt","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":530,"wires":[["97fdd34e.c0398"]]},{"id":"67bd238d.6a1f6c","type":"inject","z":"dbc79b0f11a3da2f","name":"pdf","props":[{"p":"payload"},{"p":"filter","v":"*.pdf","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":540,"y":680,"wires":[["8020e0a0.7911"]]},{"id":"8020e0a0.7911","type":"change","z":"dbc79b0f11a3da2f","name":"pdf","rules":[{"t":"set","p":"filter","pt":"msg","to":"*.pdf","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":680,"wires":[["97fdd34e.c0398"]]},{"id":"1c5f6b00.15bdb5","type":"telegram command","z":"dbc79b0f11a3da2f","name":"/list","command":"/list","bot":"","strict":false,"hasresponse":true,"useregex":false,"removeregexcommand":false,"outputs":2,"x":290,"y":950,"wires":[["f87b1bfd.99f1d8"],[]]},{"id":"f87b1bfd.99f1d8","type":"fs-ops-dir","z":"dbc79b0f11a3da2f","name":"","path":"/downloads","pathType":"str","filter":"*","filterType":"str","dir":"files","dirType":"msg","x":600,"y":940,"wires":[["6264c7a7.9096f8","6670e3a.a8b5f1c"]]},{"id":"6264c7a7.9096f8","type":"debug","z":"dbc79b0f11a3da2f","name":"Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":760,"y":910,"wires":[]},{"id":"7c75dbfe.c77644","type":"inject","z":"dbc79b0f11a3da2f","name":"test","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":380,"y":900,"wires":[["f87b1bfd.99f1d8"]]},{"id":"6670e3a.a8b5f1c","type":"change","z":"dbc79b0f11a3da2f","name":"","rules":[{"t":"move","p":"files","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":785,"y":980,"wires":[["13e4359b.b0967a"]],"l":false},{"id":"13e4359b.b0967a","type":"function","z":"dbc79b0f11a3da2f","name":"Join Array of listings","func":"// anas-ivs,MYY,May 2021\n\nmsg.dir_filecount = msg.payload.length;\nmsg.dir_list = msg.payload.join('\\n');\n\nreturn msg;\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":940,"y":980,"wires":[["36d857c4.cad8e8","df51f870.77a2b8"]]},{"id":"36d857c4.cad8e8","type":"debug","z":"dbc79b0f11a3da2f","name":"join","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1140,"y":910,"wires":[]},{"id":"df51f870.77a2b8","type":"template","z":"dbc79b0f11a3da2f","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"Directory Listing. {{dir_filecount}} files.\n\n{{dir_list}}\n\n\n\n\n","output":"str","x":1105,"y":980,"wires":[["8915b407.042b38"]],"l":false},{"id":"8915b407.042b38","type":"link out","z":"dbc79b0f11a3da2f","name":"To Telegram","links":["cded121.86d7af"],"x":1210,"y":980,"wires":[],"l":true}]

Washing Machine

Implementation : See Dryer below

WIP: Need to define and differentiate other possible states too i.e. Soaking that would help to reduce false notification of completion.

[{"id":"2526c2d8.623d7e","type":"group","z":"8c7f6f2e.a3208","style":{"stroke":"#2e333a","stroke-opacity":"1","fill":"#2e333a","fill-opacity":"0.75","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["ee9ff0c6.99625","1e224e1a.7bfd52","3bf72d5d.9a45b2","633886d5.3f8e28","d06a4437.a40368","4ae265ff.907cac","76be0646.8bab08","7f8e698e.797088","923aac16.10e","39dffa0e.079be6","bd42abea.a0c378","b985c80e.3b4fd8","a5b6bc4d.0de32","5cfc5b1c.493fa4","b3203e7a.ee98b","597cd820.eb35a8","78053a5e.a9b744","87b2e859.4927b8","83a63cdd.05d83","bdf14de0.1aeb3","c72f6ae8.bd6418","40600e06.962ed","7edbc2a9.49788c","17a08dbe.ef6c82","3dd2419f.edc21e","3fbd854.0e06a7a","6fd6c0a4.8eb63","688c2683.d376d8"],"x":34,"y":1559,"w":1712,"h":422},{"id":"ee9ff0c6.99625","type":"poll-state","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Washing Machine Power","server":"71b7c783.42e358","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"1","updateIntervalUnits":"minutes","outputinitially":true,"outputonchanged":false,"entity_id":"sensor.pwr2_washingmachine_energy_power","state_type":"str","halt_if":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"x":170,"y":1760,"wires":[["1e224e1a.7bfd52"]]},{"id":"1e224e1a.7bfd52","type":"power-monitor","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Washing M.","threshold":"12","startafter":"3","stopafter":"15","x":430,"y":1760,"wires":[["d06a4437.a40368","5cfc5b1c.493fa4"],["4ae265ff.907cac","b3203e7a.ee98b"]]},{"id":"3bf72d5d.9a45b2","type":"ha-entity","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Washing Machine Status","server":"71b7c783.42e358","version":1,"debugenabled":false,"outputs":1,"entityType":"sensor","config":[{"property":"name","value":"status_washingmachine"},{"property":"device_class","value":"device"},{"property":"icon","value":"mdi:washing-machine"},{"property":"unit_of_measurement","value":""}],"state":"payload","stateType":"msg","attributes":[],"resend":true,"outputLocation":"","outputLocationType":"none","inputOverride":"allow","outputOnStateChange":false,"outputPayload":"$entity().state ? \"on\": \"off\"","outputPayloadType":"jsonata","x":970,"y":1620,"wires":[["923aac16.10e"]]},{"id":"633886d5.3f8e28","type":"change","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"off","rules":[{"t":"set","p":"payload","pt":"msg","to":"Off","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":730,"y":1620,"wires":[["3bf72d5d.9a45b2"]]},{"id":"d06a4437.a40368","type":"change","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Washing","rules":[{"t":"set","p":"payload","pt":"msg","to":"Washing","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":1760,"wires":[["3bf72d5d.9a45b2"]]},{"id":"4ae265ff.907cac","type":"change","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Complete","rules":[{"t":"set","p":"payload","pt":"msg","to":"Complete","tot":"str"},{"t":"set","p":"increment","pt":"msg","to":"1","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":1800,"wires":[["3fbd854.0e06a7a","3bf72d5d.9a45b2"]]},{"id":"76be0646.8bab08","type":"server-state-changed","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"If Power <3 for 2 hours","server":"71b7c783.42e358","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.pwr2_washingmachine_energy_power","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"3","halt_if_type":"num","halt_if_compare":"lt","outputs":2,"output_only_on_state_change":true,"for":"2","forType":"num","forUnits":"hours","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":440,"y":1640,"wires":[["633886d5.3f8e28"],[]]},{"id":"7f8e698e.797088","type":"api-call-service","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Washing Completed","server":"71b7c783.42e358","version":3,"debugenabled":false,"service_domain":"notify","service":"all_handphones","entityId":"","data":"{\"title\":\"🧺 Washing Machine Status\",\"message\":\"⚠️ Washing Completed. Pindahkan baju ke dryer\",\"data\":{\"persistent\":\"true\",\"tag\":\"washingmachine_tag\",\"sticky\":\"true\",\"push\":{\"sound\":{\"name\":\"default\",\"critical\":\"1\",\"volume\":\"1\"}}}}","dataType":"json","mergecontext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":1620,"y":1760,"wires":[[]]},{"id":"923aac16.10e","type":"switch","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"Washing","vt":"str"},{"t":"eq","v":"Complete","vt":"str"},{"t":"eq","v":"Off","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":1170,"y":1620,"wires":[["c72f6ae8.bd6418","597cd820.eb35a8"],["39dffa0e.079be6"],["78053a5e.a9b744"]]},{"id":"39dffa0e.079be6","type":"trigger","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"resend every halfhour","op1":"","op2":"","op1type":"pay","op2type":"pay","duration":"-30","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":1400,"y":1760,"wires":[["7f8e698e.797088"]]},{"id":"bd42abea.a0c378","type":"change","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"","rules":[{"t":"set","p":"reset","pt":"msg","to":"1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1175,"y":1780,"wires":[["39dffa0e.079be6","78053a5e.a9b744"]],"l":false},{"id":"b985c80e.3b4fd8","type":"server-state-changed","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Topcover open","server":"71b7c783.42e358","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.zbds_washing_machine_contact","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"","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":1000,"y":1800,"wires":[["bd42abea.a0c378"],[]]},{"id":"a5b6bc4d.0de32","type":"inject","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1000,"y":1860,"wires":[["bd42abea.a0c378"]]},{"id":"5cfc5b1c.493fa4","type":"link out","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"out-washingmachine-start","links":["dde482c5.9d47a"],"x":575,"y":1720,"wires":[]},{"id":"b3203e7a.ee98b","type":"link out","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"out-washingmachine-stop","links":["af8022e2.3db9e"],"x":575,"y":1840,"wires":[]},{"id":"597cd820.eb35a8","type":"api-call-service","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Running","server":"71b7c783.42e358","version":3,"debugenabled":false,"service_domain":"notify","service":"all_handphones","entityId":"","data":"{\"title\":\"🧺 Washing Machine Status\",\"message\":\"🟢 Tengah basuh baju \",\"data\":{\"tag\":\"washingmachine_tag\"}}","dataType":"json","mergecontext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":1660,"y":1660,"wires":[[]]},{"id":"78053a5e.a9b744","type":"api-call-service","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Clear Notification","server":"71b7c783.42e358","version":3,"debugenabled":false,"service_domain":"notify","service":"all_handphones","entityId":"","data":"{\"message\":\"clear_notification\",\"data\":{\"tag\":\"washingmachine_tag\"}}","dataType":"json","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1630,"y":1840,"wires":[[]]},{"id":"87b2e859.4927b8","type":"comment","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Washing Machine","info":"","x":150,"y":1660,"wires":[]},{"id":"83a63cdd.05d83","type":"api-current-state","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Topcover closed","server":"71b7c783.42e358","version":2,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"binary_sensor.zbds_washing_machine_contact","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1480,"y":1600,"wires":[["bdf14de0.1aeb3"],[]]},{"id":"bdf14de0.1aeb3","type":"api-call-service","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"ERROR","server":"71b7c783.42e358","version":3,"debugenabled":false,"service_domain":"notify","service":"mobile_app_sm_n960f","entityId":"","data":"{\"title\":\"🧺 Washing Machine Status\",\"message\":\"⚠️ ERROR - Cover not closed\",\"data\":{\"persistent\":\"true\",\"tag\":\"washingmachine_tag\",\"sticky\":\"true\",\"push\":{\"sound\":{\"name\":\"default\",\"critical\":\"1\",\"volume\":\"1\"}}}}","dataType":"json","mergecontext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":1660,"y":1600,"wires":[[]]},{"id":"c72f6ae8.bd6418","type":"delay","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"","pauseType":"delay","timeout":"2","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1320,"y":1600,"wires":[["83a63cdd.05d83"]]},{"id":"40600e06.962ed","type":"server-state-changed","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Topcover closed","server":"71b7c783.42e358","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.zbds_washing_machine_contact","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"off","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"","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":1000,"y":1720,"wires":[["7edbc2a9.49788c"],[]]},{"id":"7edbc2a9.49788c","type":"api-current-state","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Unit Running","server":"71b7c783.42e358","version":2,"outputs":2,"halt_if":"Running","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.status_washingmachine","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1190,"y":1720,"wires":[["78053a5e.a9b744"],[]]},{"id":"17a08dbe.ef6c82","type":"cronplus","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Reset 1st Every Month","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[{"name":"schedule1","topic":"schedule1","payloadType":"default","payload":"","expressionType":"cron","expression":"0 0 0 1 * ? *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":380,"y":1940,"wires":[["3dd2419f.edc21e"]]},{"id":"3dd2419f.edc21e","type":"function","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Reset","func":"msg.reset = true;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":610,"y":1940,"wires":[["3fbd854.0e06a7a"]]},{"id":"3fbd854.0e06a7a","type":"counter","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"","init":"0","step":1,"lower":null,"upper":null,"mode":"increment","outputs":"1","x":840,"y":1940,"wires":[["6fd6c0a4.8eb63"]]},{"id":"6fd6c0a4.8eb63","type":"ha-entity","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"Washing Machine Cycles","server":"71b7c783.42e358","version":1,"debugenabled":false,"outputs":1,"entityType":"sensor","config":[{"property":"name","value":"status_washingmachine_cycles"},{"property":"device_class","value":"device"},{"property":"icon","value":"mdi:washing-machine"},{"property":"unit_of_measurement","value":""}],"state":"count","stateType":"msg","attributes":[],"resend":true,"outputLocation":"","outputLocationType":"none","inputOverride":"allow","outputOnStateChange":false,"outputPayload":"$entity().state ? \"on\": \"off\"","outputPayloadType":"jsonata","x":1070,"y":1940,"wires":[[]]},{"id":"688c2683.d376d8","type":"inject","z":"8c7f6f2e.a3208","g":"2526c2d8.623d7e","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":690,"y":1860,"wires":[["4ae265ff.907cac"]]},{"id":"71b7c783.42e358","type":"server","name":"Home Assistant","version":1,"legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]

Dryer

Dryer is much more straight forward - either it is running or not with power utilization boundaries clearer compared to Washing Machine states.

Additional hardware installed to make the dryer 'smart':

  1. Sonoff POWR2 for Power Monitoring.
  2. Zigbee Aqara Door Switch (much smaller than Sonoff's) on the Dryer door as a status indicator helper to identify if the dryer load has been removed once complete.

Additional node palettes required:

  • node-red-contrib-power-monitor - Power-monitor node. Quite handy - Provide Power input form Sonoff and define thresholds - it returns runtime and energy consumed.
  • node-red-contrib-counter - For usage counter. Tracking how many time used per month.
  • node-red-contrib-cron-plus - Helps to reset usage counter with scheduled defined cron -like at every first day of the month. Ada visual-helper so dont need to study howto write cron actually.

Additional sensor helpers:

  1. status_dryer as state machine status. Status could be Off/Drying/Complete.
  2. status_dryer_cycles to track monthly usages - counts up when power-monitor nodes changes dryer state to complete.
[{"id":"5783e71d.245278","type":"group","z":"8c7f6f2e.a3208","style":{"stroke":"#2e333a","stroke-opacity":"1","fill":"#2e333a","fill-opacity":"0.75","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["aa0ce5f4.07cfa8","576e39e6.79ffa8","3b04118d.92625e","ce25318a.7cff6","ffd8f94.89fb608","92007ca8.1f442","7881d7cb.805268","c58c205e.5670b","6759b1b5.40d77","b8d0f634.519c58","d4bb8216.90997","6890260a.8e3828","f67af494.aba208","da0ddc89.f474d","e9ece46.c541d18","37ebf1c7.b9268e","bca6290b.e96e48","90260a37.4708d8","4c733257.75985c","6a278a9c.a3ac04","4d7035c5.4694dc","afe0b7e1.b17468","20927fc.030418"],"x":34,"y":2039,"w":1712,"h":442},{"id":"aa0ce5f4.07cfa8","type":"ha-entity","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Dryer Status","server":"71b7c783.42e358","version":1,"debugenabled":false,"outputs":1,"entityType":"sensor","config":[{"property":"name","value":"status_dryer"},{"property":"device_class","value":"device"},{"property":"icon","value":"mdi:washing-machine"},{"property":"unit_of_measurement","value":""}],"state":"payload","stateType":"msg","attributes":[],"resend":true,"outputLocation":"","outputLocationType":"none","inputOverride":"allow","outputOnStateChange":false,"outputPayload":"$entity().state ? \"on\": \"off\"","outputPayloadType":"jsonata","x":930,"y":2160,"wires":[["7881d7cb.805268"]]},{"id":"576e39e6.79ffa8","type":"change","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"off","rules":[{"t":"set","p":"payload","pt":"msg","to":"Off","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":730,"y":2120,"wires":[["aa0ce5f4.07cfa8"]]},{"id":"3b04118d.92625e","type":"change","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Drying","rules":[{"t":"set","p":"payload","pt":"msg","to":"Drying","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":2180,"wires":[["aa0ce5f4.07cfa8","b8d0f634.519c58"]]},{"id":"ce25318a.7cff6","type":"change","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Complete","rules":[{"t":"set","p":"payload","pt":"msg","to":"Complete","tot":"str"},{"t":"set","p":"increment","pt":"msg","to":"1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":2220,"wires":[["aa0ce5f4.07cfa8","4d7035c5.4694dc"]]},{"id":"ffd8f94.89fb608","type":"server-state-changed","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"If Power <3 for 2 hours","server":"71b7c783.42e358","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.pwr2_washingmachine_energy_power","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"3","halt_if_type":"num","halt_if_compare":"lte","outputs":2,"output_only_on_state_change":true,"for":"2","forType":"num","forUnits":"hours","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":420,"y":2120,"wires":[["576e39e6.79ffa8"],[]]},{"id":"92007ca8.1f442","type":"api-call-service","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Dryer Completed","server":"71b7c783.42e358","version":3,"debugenabled":false,"service_domain":"notify","service":"all_handphones","entityId":"","data":"{\"title\":\"👕 Dryer Status\",\"message\":\"⚠️ Dryer Completed.\",\"data\":{\"tag\":\"dryer_tag\",\"push\":{\"sound\":{\"name\":\"default\",\"critical\":\"1\",\"volume\":\"1\"}}}}","dataType":"json","mergecontext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":1630,"y":2220,"wires":[[]]},{"id":"7881d7cb.805268","type":"switch","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"Off","vt":"str"},{"t":"eq","v":"Drying","vt":"str"},{"t":"eq","v":"Complete","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":1170,"y":2160,"wires":[["c58c205e.5670b","37ebf1c7.b9268e"],["e9ece46.c541d18"],["6759b1b5.40d77"]]},{"id":"c58c205e.5670b","type":"debug","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1330,"y":2080,"wires":[]},{"id":"6759b1b5.40d77","type":"trigger","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"resend every hour","op1":"","op2":"","op1type":"pay","op2type":"pay","duration":"-1","extend":false,"overrideDelay":false,"units":"hr","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":1370,"y":2220,"wires":[["92007ca8.1f442"]]},{"id":"b8d0f634.519c58","type":"change","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"","rules":[{"t":"set","p":"reset","pt":"msg","to":"1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1195,"y":2220,"wires":[["6759b1b5.40d77","37ebf1c7.b9268e"]],"l":false},{"id":"d4bb8216.90997","type":"server-state-changed","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"if door opened","server":"71b7c783.42e358","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.zbds_dryer_contact","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"","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":1010,"y":2260,"wires":[["b8d0f634.519c58"],[]]},{"id":"6890260a.8e3828","type":"inject","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1020,"y":2320,"wires":[["b8d0f634.519c58"]]},{"id":"f67af494.aba208","type":"link out","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"out-dryer-start","links":["64ab064b.2738e8"],"x":575,"y":2160,"wires":[]},{"id":"da0ddc89.f474d","type":"link out","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"out-dryer-stop","links":["50b9caf2.df55f4"],"x":575,"y":2240,"wires":[]},{"id":"e9ece46.c541d18","type":"api-call-service","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Running","server":"71b7c783.42e358","version":3,"debugenabled":false,"service_domain":"notify","service":"all_handphones","entityId":"","data":"{\"title\":\"👕 Dryer Status\",\"message\":\"🟢 Dryer tengah keringkan baju \",\"data\":{\"tag\":\"dryer_tag\"}}","dataType":"json","mergecontext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":1600,"y":2160,"wires":[[]]},{"id":"37ebf1c7.b9268e","type":"api-call-service","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Clear Notification","server":"71b7c783.42e358","version":3,"debugenabled":false,"service_domain":"notify","service":"all_handphones","entityId":"","data":"{\"message\":\"clear_notification\",\"data\":{\"tag\":\"dryer_tag\"}}","dataType":"json","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1630,"y":2100,"wires":[[]]},{"id":"bca6290b.e96e48","type":"poll-state","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Dryer Power","server":"71b7c783.42e358","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"1","updateIntervalUnits":"minutes","outputinitially":true,"outputonchanged":false,"entity_id":"sensor.tm_pwr2_dryer_energy_power","state_type":"str","halt_if":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"x":130,"y":2200,"wires":[["90260a37.4708d8"]]},{"id":"90260a37.4708d8","type":"power-monitor","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Dryer","threshold":"10","startafter":"2","stopafter":"6","x":430,"y":2200,"wires":[["3b04118d.92625e","f67af494.aba208"],["ce25318a.7cff6","da0ddc89.f474d"]]},{"id":"4c733257.75985c","type":"comment","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Dryer","info":"","x":110,"y":2080,"wires":[]},{"id":"6a278a9c.a3ac04","type":"function","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Reset","func":"msg.reset = true;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":2440,"wires":[["4d7035c5.4694dc"]]},{"id":"4d7035c5.4694dc","type":"counter","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"","init":"0","step":1,"lower":null,"upper":null,"mode":"increment","outputs":"1","x":840,"y":2440,"wires":[["20927fc.030418"]]},{"id":"afe0b7e1.b17468","type":"cronplus","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Reset 1st Every Month","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[{"name":"schedule1","topic":"schedule1","payloadType":"default","payload":"","expressionType":"cron","expression":"0 0 0 1 * ? *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":380,"y":2440,"wires":[["6a278a9c.a3ac04"]]},{"id":"20927fc.030418","type":"ha-entity","z":"8c7f6f2e.a3208","g":"5783e71d.245278","name":"Dryer Cycles","server":"71b7c783.42e358","version":1,"debugenabled":false,"outputs":1,"entityType":"sensor","config":[{"property":"name","value":"status_dryer_cycles"},{"property":"device_class","value":"device"},{"property":"icon","value":"mdi:washing-machine"},{"property":"unit_of_measurement","value":""}],"state":"count","stateType":"msg","attributes":[],"resend":true,"outputLocation":"","outputLocationType":"none","inputOverride":"allow","outputOnStateChange":false,"outputPayload":"$entity().state ? \"on\": \"off\"","outputPayloadType":"jsonata","x":1030,"y":2440,"wires":[[]]},{"id":"71b7c783.42e358","type":"server","name":"Home Assistant","version":1,"legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]

Random Hadith

  1. Utilizes sunnah.com API to retrieve a random hadith. API key is required and can be obtained here.
  2. Trigger function is set automatically at each Maghrib - send to Telegram for recital after Maghrib prayers and manually via /gethadith command.
[{"id":"d90544ba.c77558","type":"http request","z":"b192c009.52f1f","g":"22cc95d.eb1396a","name":"Random Hadith","method":"GET","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":1735,"y":2760,"wires":[["ffdef2de.a7f2d"]],"l":false},{"id":"498816d3.2fa8a8","type":"function","z":"b192c009.52f1f","g":"22cc95d.eb1396a","name":"Get Random Hadith from Sunnah.com","func":"\n\nmsg.url = \"https://api.sunnah.com/v1/hadiths/random\";\nmsg.payload = \"\"\nmsg.headers = {};\nmsg.headers['x-api-key'] = '##API_KEY_HERE###';\n\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1550,"y":2760,"wires":[["d90544ba.c77558"]]},{"id":"ffdef2de.a7f2d","type":"change","z":"b192c009.52f1f","g":"22cc95d.eb1396a","name":"set","rules":[{"t":"set","p":"payload.hadtih_title","pt":"msg","to":"payload.hadith[0].chapterTitle","tot":"msg"},{"t":"set","p":"payload.hadtih_en","pt":"msg","to":"payload.hadith[0].body","tot":"msg"},{"t":"set","p":"payload.hadtih_ar","pt":"msg","to":"payload.hadith[1].body","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1795,"y":2760,"wires":[["79dfebef.0f8044"]],"l":false},{"id":"20d9593d.682a16","type":"template","z":"b192c009.52f1f","g":"22cc95d.eb1396a","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"Collection: {{ payload.collection }}.\nBook Number: {{ payload.bookNumber }}.\nHadith Number: {{ payload.hadithNumber }}.\n\nTitle: {{ payload.hadtih_title }}.\n\n{{payload.hadtih_ar}}\n\n{{payload.hadtih_en}}\n\n\n","output":"str","x":2060,"y":2760,"wires":[["425ca14d.eb33c"]]},{"id":"425ca14d.eb33c","type":"link out","z":"b192c009.52f1f","g":"22cc95d.eb1396a","name":"T-Hadith","links":["c6e0b135.77de1"],"x":2175,"y":2760,"wires":[],"icon":"node-red-contrib-telegrambot/telegram.png"},{"id":"51fac522.6e50fc","type":"telegram command","z":"b192c009.52f1f","g":"22cc95d.eb1396a","name":"/gethadith","command":"/gethadith","description":"","registercommand":false,"language":"","bot":"","strict":false,"hasresponse":true,"useregex":false,"removeregexcommand":false,"outputs":2,"x":1280,"y":2820,"wires":[["498816d3.2fa8a8"],[]]},{"id":"8a34191d.af0b48","type":"link in","z":"b192c009.52f1f","g":"22cc95d.eb1396a","name":"Waktu Maghrib","links":["1b55833e.01921d"],"x":1280,"y":2760,"wires":[["498816d3.2fa8a8"]],"l":true},{"id":"95259768.a97368","type":"inject","z":"b192c009.52f1f","g":"22cc95d.eb1396a","name":"Inject","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1290,"y":2700,"wires":[["498816d3.2fa8a8"]]},{"id":"79dfebef.0f8044","type":"change","z":"b192c009.52f1f","g":"22cc95d.eb1396a","name":"set","rules":[{"t":"change","p":"payload.hadtih_en","pt":"msg","from":"<...>","fromt":"str","to":"","tot":"str"},{"t":"change","p":"payload.hadtih_ar","pt":"msg","from":"<...>","fromt":"re","to":"","tot":"str"},{"t":"change","p":"payload.hadtih_en","pt":"msg","from":"<.>","fromt":"re","to":"","tot":"str"},{"t":"change","p":"payload.hadtih_en","pt":"msg","from":"<.>","fromt":"re","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1895,"y":2760,"wires":[["20d9593d.682a16"]],"l":false}]

To-do: Further clean-up of characters retrieved that Telegram is unable to parse i.e.. <b><br>

ha-nr-flows's People

Contributors

anas-ivs avatar

Watchers

 avatar

Forkers

wemakerspace

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.