Node-RED で Slideshow 用の RSS を生成する

## PHP を使わず全て Node-RED で賄う
[気象庁予報の JSON ファイルを PHP で RSS 形式に変換してみる](https://qiita.com/harycurl/items/64b8958ce0e1914e900e) で Slideshow 用の RSS を生成したが、このところ MeePet や Termux の調子が悪いのか、1日に1度くらいサーバーが丸ごと落ちるようになった。
都度再起動して立ち上げ直してもよいが、 Node-RED に集約すれば Node-RED の再起動で済むと考え、 RSS 生成も Node-RED で行うこととした。

## 手動で XML を書いても RSS として認識可能
ノード図は以下の通り。
![nodered_rss1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/cf42400b-4ce8-07a7-f996-c5458abf311e.png)

基本的には http in ノードと http response ノードを使えばよい。

https://waku-take-a.github.io/node-red_http_001.html

http in はアクセスする URL のみ指定、 http response は何も指定しなくてよい。
![nodered_rss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/e5f353e2-1eea-9cdb-2b6b-766255d57098.png)
![nodered_rss3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/a635337f-bfc7-bfff-8626-7d6197dba3ed.png)

JSON ファイルのダウンロードは http request ノードで。内容は[以前紹介したもの](https://qiita.com/harycurl/items/649c964a401d98cf8aa9)と同じ。
![nodered_rss4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/d459cee1-1a38-2556-6396-28e5c2fd33e9.png)

RSS 化に関しては関連のノードもあるが、 XML を JavaScript で手書きして出力することにした。

parser 部分は以下の通り。
```javascript: parser
var weather_array = msg.payload;

var date = weather_array[0].timeSeries[0].timeDefines[0];
var day = date.substr(8,2);
var hour = date.substr(11,2);

var weather0_0 = weather_array[0].timeSeries[0].areas[0].weathers[0];
var weather0_1 = weather_array[0].timeSeries[0].areas[0].weathers[1];
var weather1_0 = weather_array[0].timeSeries[0].areas[1].weathers[0];
var weather1_1 = weather_array[0].timeSeries[0].areas[1].weathers[1];

var weather = [ [ weather0_0, weather0_1 ], [ weather1_0, weather1_1 ] ];


const keys = [/　/g, /晴れ/g, /くもり/g, /雨/g, /雪/g];
const reps = ["", "☀", "☁", "☂", "☃"];
for (let k = 0; k < 2; k++) {
    for (let j = 0; j < 2; j++) {
        for (let i = 0; i < keys.length; i++) {
            weather[k][j] = weather[k][j].replace(keys[i], reps[i]);
        }
    }
}

var pops1 = weather_array[0].timeSeries[1].areas[0].pops
var pop1 = pops1[0] + "/" + pops1[1] + "%"

var pops2 = weather_array[0].timeSeries[1].areas[1].pops
var pop2 = pops2[0] + "/" + pops2[1] + "%"

var temps1 = weather_array[0].timeSeries[2].areas[0].temps
var temp1_1 = temps1.at(-2);
var temp1_2 = temps1.at(-1);
var temp1 = temp1_1 + "/" + temp1_2 + "C"

var temps2 = weather_array[0].timeSeries[2].areas[1].temps
var temp2_1 = temps2.at(-2);
var temp2_2 = temps2.at(-1);
var temp2 = temp2_1 + "/" + temp2_2 + "C"

var rss = '';
rss = rss + '<?xml version="1.0" encoding="UTF-8"?>';
rss = rss + '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">';
rss = rss + '<channel><title>気象庁</title><link>https://www.jma.go.jp/</link>';
rss = rss + '<description>長野県の天気</description>';
rss = rss + '<lastBuildDate>' + new Date() + '</lastBuildDate>';
rss = rss + '<item><title>【長野・松本の予報】</title><description>' + day + '日' + hour + '時</description></item>';
rss = rss + '<item><title>【長野】今日</title><description>' + weather[0][0] + ' ' + pop1 +'</description></item>';
rss = rss + '<item><title>明日</title><description>' + weather[0][1] + ' ' + temp1 +'</description></item>';
rss = rss + '<item><title>【松本】今日</title><description>' + weather[1][0] + ' ' + pop2 +'</description></item>';
rss = rss + '<item><title>明日</title><description>' + weather[1][1] + ' ' + temp2 +'</description></item>';
rss = rss + '</channel></rss>';

msg.payload = rss;

return msg;
```
文字列の置換はリストを2つ用意して for 文を回すのがよいようだ。 

https://itblogger-note.blogspot.com/2022/05/javascript-replace-multiple-elements.html

このような形で RSS を出力でき、 Slideshow でも問題なく表示することができた。
![nodered_rss5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/ffde93c0-bbf7-6cfb-d7a2-87e0b8b5ad17.png)
![nodered_rss6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/77d5f471-2a34-3c52-5a17-3cc9ef63d4de.jpeg)