Sharing of smaller Home Assistant and Node-Red Flow used in my home automation applications.
| 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
- 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.
- 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.
- 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}]
-
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. -
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. -
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":[[]]}]
- This flow utilizes one open/close contact sensor and a camera pointed towards intended Autogate being tracked.
- Snapshot utilizes Home Assistant
camera.snapshot
service where the save path is set towww
accessible directory for Node-Red to retrieve.
{
"filename": "/config/www/snapshot_frontgatecam.jpg",
"entity_id": [
"camera.frontgatecam"
]
}
- 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. -
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 nodeArray Set Path
[{"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"]]}]
[{"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}]
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 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':
- Sonoff POWR2 for Power Monitoring.
- 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 definedcron
-like at every first day of the month. Ada visual-helper so dont need to study howto writecron
actually.
Additional sensor
helpers:
status_dryer
as state machine status. Status could be Off/Drying/Complete.status_dryer_cycles
to track monthly usages - counts up whenpower-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}]
- Utilizes sunnah.com API to retrieve a random hadith. API key is required and can be obtained here.
- 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>