「그, Node-RED가 아니어도 좋지?」라고 말하지 말고 싶은 녀석

포키오 ( @pokiiio )입니다.
Node-RED Advent Calendar 2018 의 12일째를 담당하겠습니다. 느슨한 재료로 잘 부탁드립니다.

TL;DR Node-RED is 대단하다 곤란하면 Function Node에 JS로 쓰레기 쓰면 좋다 JS와 친화성이 낮은 처리는 Exec Node에서 해 버리면 좋다 조금 까다롭지만 뭐든지 할 수 있습니다. 최고의 프로토타이핑 도구 논프로그래밍으로, 노드와 노드를 연결할 뿐의 플로우로 처리를 디자인할 수 있는 툴이라고 하는 것으로, Node-RED를 한 번 알고 나서는, 조금 사용해 주시고 있습니다. 개인적으로 좋아하는 (?) 사용법을 공유하십시오. Function Node의 굉장함 Node-RED는 그 풍부한 Node 덕분에 쉽게 처리를 디자인할 수 있는 것에 강점이 있다고 생각합니다. 단지, 너무 매니악한 처리를 할 수 있는 Node는 준비되어 있지 않은 것이 많습니다만, 그럴 때 도움이 되는 것이 Function Node입니다. 예를 들어, 나는 게이큐를 좋아하고, 게이큐의 운행 정보 페이지에서 운행 정보를 자주 파스 하지만 그런 노드 없으면 Function Node로 쓰면 됩니다.

평소 Arduino등의 C같은 언어에 익숙해져 있는 몸으로 하면, JavaScript는 HTTP-GET등을 간단하게 할 수 있고 require도 사용할 수 있으므로, 가장 편리합니다.

예:
[{"id":"3ad520c3.545e78","type":"tab","label":"フロー 1","disabled":false,"info":""},{"id":"80cbf517.c17cc8","type":"twitter-credentials","z":"","screen_name":"@pokiiiwo"},{"id":"3eb4297b.7362fe","type":"twitter in","z":"3ad520c3.545e78","twitter":"80cbf517.c17cc8","tags":"@keikyu_official","user":"user","name":"京急公式Twitterに新しい投稿","topic":"tweets","inputs":0,"x":180,"y":100,"wires":[["60533152.38f37"]]},{"id":"22429d61.35d622","type":"inject","z":"3ad520c3.545e78","name":"京急 + 山手線","topic":"","payload":"","payloadType":"date","repeat":"600","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":140,"wires":[["60533152.38f37"]]},{"id":"60533152.38f37","type":"http request","z":"3ad520c3.545e78","name":"京急運行情報取得","method":"GET","ret":"txt","url":"http://unkou.keikyu.co.jp","tls":"","x":150,"y":180,"wires":[["77d3de0e.446b9"]]},{"id":"77d3de0e.446b9","type":"function","z":"3ad520c3.545e78","name":"京急運行情報パース","func":"msg.payload = msg.payload.split(\"<div class=unko-panel>\")[1];\nmsg.payload = msg.payload.split(\"</div>\")[0];\nmsg.payload = msg.payload.replace(/\\r?\\n/g,\"\");\nmsg.keikyu = msg.payload;\nmsg.payload = null;\nreturn msg;","outputs":1,"noerr":0,"x":160,"y":220,"wires":[["49eb60e7.4544c"]]},{"id":"49eb60e7.4544c","type":"http request","z":"3ad520c3.545e78","name":"JR運行情報取得","method":"GET","ret":"txt","url":"https://transit.yahoo.co.jp/traininfo/detail/21/0/","tls":"","x":140,"y":260,"wires":[["8119d93e.e43388"]]},{"id":"8119d93e.e43388","type":"function","z":"3ad520c3.545e78","name":"JR運行情報パース","func":"msg.payload = msg.payload.split(\"\\\"og:description\\\" content=\\\"\")[1];\nmsg.payload = msg.payload.split(\"(\")[0];\nmsg.payload = msg.payload.replace(/\\r?\\n/g,\"\");\nmsg.yamanote = msg.payload;\nmsg.payload = null;\nreturn msg;","outputs":1,"noerr":0,"x":150,"y":300,"wires":[["1fbe8bb5.87f034"]]},{"id":"6f00e56f.8150ec","type":"exec","z":"3ad520c3.545e78","command":"python /home/pi/GitHub/TextToEPaper/text_to_e_paper.py","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"電子ペーパーに表示","x":480,"y":280,"wires":[[],[],[]]},{"id":"1fbe8bb5.87f034","type":"function","z":"3ad520c3.545e78","name":"keikyu, yamanote -> payload","func":"msg.payload = \"京浜急行 \\\"\" + msg.keikyu + \"\\\" 山手線 \\\"\" + msg.yamanote + \"\\\"\";\nreturn msg;","outputs":1,"noerr":0,"x":500,"y":140,"wires":[["71e04a63.eb8114"]]},{"id":"7dac4a68.ffcf04","type":"inject","z":"3ad520c3.545e78","name":"","topic":"起動時","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":"5","x":150,"y":60,"wires":[["60533152.38f37"]]},{"id":"71e04a63.eb8114","type":"switch","z":"3ad520c3.545e78","name":"差分があった場合だけ更新","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"info","vt":"global"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":500,"y":180,"wires":[["b6900e34.b64bb"],[]]},{"id":"b6900e34.b64bb","type":"function","z":"3ad520c3.545e78","name":"globalにセット","func":"global.set(\"info\",msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":220,"wires":[["6f00e56f.8150ec"]]}]

무엇이든 할 수 있는 Exec Node



Function Node만으로도 최강입니다만, 그것을 훨씬 능가하는 것이 Exec Node입니다(개인의 감상입니다).
라는 것 이전, Raspberry Pi용 전자 종이 모자를 사서, 거기에 일기 예보를 표시하는 가젯을 만들었습니다만・・・

전자 페이퍼라고 해도 구조는 간단하고, 딱 좋은 사이즈의 화상을 프로그램상에서 작성해, 그것을 특별한 커멘드로 전자 페이퍼에 붙여 넣는 것 뿐. 커맨드는, 이른바 커맨드 라인으로부터 두드리는 것 같고, 또 이미지 작성에는 JavaScript가 아니고 Python의 Pillow를 사용하고 있었습니다(화상 처리는 Python 쪽이 편하다). 정기적인 처리를 하는 것은 Node-RED로 간단하게 설계할 수 있지만, Python이나 커맨드 라인 툴과는 그다지 친화성이 높게 느껴지지 않을지도 모릅니다. 그래서 Exec Node입니다. 결론부터 말하면, Node-RED일 것이지만 Python의 스크립트나 커맨드 라인 툴은 간단하게 두드려, cd ~/GitHub/WeatherDisplayForEPapers;python create_weather_image.py;papirus-draw image.png 예를 들어 이런 명령을 Exec Node에서 실행할 뿐. 그 Node가, 좋게 정기적으로 실행되도록(듯이) 넣어 버리면, 항상 최신의 일기 예보를 전자 페이퍼에 표시할 수 있다고 하는 것입니다. 그 외, 전자 페이퍼 모자 상의 하드 스위치의 이벤트도 Node-RED로 간단하게 픽업할 수 있으므로, 버튼을 누르면 표시 내용을 바꾸거나 하는 등의 처리도 간단하게 걸립니다. 그것, Node-RED가 아니고 좋지? 라고 말하면 마지막입니다만, 별로 제품의 코드가 아니고, 선데이 프로그래머의 빌어 먹을 코드이므로, 뭐라고 말해도 강한 기분으로 살아갑니다. Appendix
  • Node-RED UG 연구회 Vol.7 「Node-RED x Connected」
  • 게이큐 가젯을 만드는 엔지니어가 본 Node-RED
  • 좋은 웹페이지 즐겨찾기