0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

PHP を使わず全て Node-RED で賄う

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

手動で XML を書いても RSS として認識可能

ノード図は以下の通り。
nodered_rss1.png

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

http in はアクセスする URL のみ指定、 http response は何も指定しなくてよい。
nodered_rss2.png
nodered_rss3.png

JSON ファイルのダウンロードは http request ノードで。内容は以前紹介したものと同じ。
nodered_rss4.png

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 文を回すのがよいようだ。

このような形で RSS を出力でき、 Slideshow でも問題なく表示することができた。
nodered_rss5.png
nodered_rss6.jpg

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?