PHP を使わず全て Node-RED で賄う
気象庁予報の JSON ファイルを PHP で RSS 形式に変換してみる で Slideshow 用の RSS を生成したが、このところ MeePet や Termux の調子が悪いのか、1日に1度くらいサーバーが丸ごと落ちるようになった。
都度再起動して立ち上げ直してもよいが、 Node-RED に集約すれば Node-RED の再起動で済むと考え、 RSS 生成も Node-RED で行うこととした。
手動で XML を書いても RSS として認識可能
基本的には http in ノードと http response ノードを使えばよい。
http in はアクセスする URL のみ指定、 http response は何も指定しなくてよい。
JSON ファイルのダウンロードは http request ノードで。内容は以前紹介したものと同じ。
RSS 化に関しては関連のノードもあるが、 XML を JavaScript で手書きして出力することにした。
parser 部分は以下の通り。
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 文を回すのがよいようだ。