気象庁の天気予報データをもとに蓄電池の充電時間を調整する

Programming

以前の記事でニチコン蓄電池の充電時間をECHONET Lite経由で変更できることが分かったので、今回は天気予報情報をもとに充電時間を変更するプログラムを作成してみることにします。

以前の記事:

スポンサーリンク

天気予報データの情報源

日中に太陽光パネルが十分に発電できるかどうかを知りたいので、天気予報の情報のうち重要なのは昼間の天気(雲量が分かると尚良い)です。そして、あくまでお遊びなので、データ利用が無料であることは絶対条件です。

OpenWeatherMap

調べてみると無料で雲量までわかるものはほとんどなかったのですが、OpenWeatherMapは対応しているようでした。

Сurrent weather and forecast - OpenWeatherMap
Get current weather, hourly forecast, daily forecast for 16 days, and 3-hourly forecast 5 days for your city. Historical weather data for 40 years back for any coordinate. Helpful stats, graphics, and this day in history charts are available for your reference. Interactive maps show precipitation, clouds, pressure, wind around your location.

無料でも5 day / 3 hour forecast dataであれば3時間単位で雲量もわかります。

雲量が細かくわかるのは嬉しいのですが、海外のサービスということもあり精度の面で不安です。細かくても精度が低ければ意味がないので…。

気象庁データ

広くアナウンスされているわけではないようなのですが、気象庁のウェブサイトでは天気予報を含む各種情報がJSONデータとして保管されていて、(現状)ダウンロードできるようになっています。

https://twitter.com/izutorishima/status/1364441626672685058?s=20

データフォーマットなどが公に規定されているわけではないのであくまでas isではあるものの、今回の用途には利用できるかもしれないので、調べてみることにします。

三日間・週間天気予報

https://www.jma.go.jp/bosai/forecast/data/forecast/AREA_CODE.json

にアクセスすることで、今日・明日・明後日の天気予報を取得できます。AREA_CODEは、気象台のコードを入れるのですが、その一覧自体もJSONファイルになっています。

https://www.jma.go.jp/bosai/common/const/area.json

このファイルの中の、offices配下のkeyを使います。例えば東京の場合は、

   "130000": {
      "name": "東京都",
      "enName": "Tokyo",
      "officeName": "気象庁",
      "parent": "010300",
      "children": [
        "130010",
        "130020",
        "130030",
        "130040"
      ]
    },

となっているので、130000を使います。

https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json

この中を覗いてみると、以下のような構造になっているようです。

[
  {
    "publishingOffice": "気象庁",
    "reportDatetime": "2023-03-14T17:00:00+09:00",
    "timeSeries": [
      {
        "timeDefines": [
          "2023-03-14T17:00:00+09:00",
          "2023-03-15T00:00:00+09:00",
          "2023-03-16T00:00:00+09:00"
        ],
        "areas": [
          {
            "area": {
              "name": "東京地方",
              "code": "130010"
            },
            "weatherCodes": [
              "100",
              "101",
              "101"
            ],
            "weathers": [
              "晴れ",
              "晴れ 朝晩 くもり",
              "晴れ 時々 くもり"
            ],
            "winds": [
              "東の風",
              "北の風 後 南の風",
              "北の風 後 南の風"
            ],
            "waves": [
              "0.5メートル",
              "0.5メートル",
              "0.5メートル"
            ]
          },
          {
            "area": {
              "name": "伊豆諸島北部",
              "code": "130020"
            },
            "weatherCodes": [
              "111",
              "101",
              "101"
            ],
.
.
.
  • root[0]['timeSeries'][0]が直近三日間の予報情報
  • root[0]['timeSeries'][0]['areas'][0]が東京地方の直近三日間の予報情報
  • root[0]['timeSeries'][0]['areas'][0]['weatherCodes']が東京地方の三日間の天気
  • root[0]['timeSeries'][0]['areas'][0]['weatherCodes'][1]が東京地方の明日の天気

となります(他にも気温や風速などいろいろな情報が入っています)。

weatherCodesは、

https://twitter.com/izutorishima/status/1364455657169031169?s=20

こちらにあるように、気象庁の天気予報ページでConsoleを叩くと上記のデータが取得できます。

雲量の情報はなく、かつ一日単位の予報ではあるものの、「時々」や「一時」といった割合を示す情報も含まれていますので、この情報を使って昼間の発電量をざっくり見積もることにしましょう。

ちなみに、天気予報で用いる用語についてはこちらのページに説明があります。「時々」は1/2未満、「一時」は1/4未満とのことです。

スポンサーリンク

天気に応じて深夜時間帯の充電時間を変更する

weatherCodeをもとに細かく充電時間を変えることができそうですが、サンプルとして百の位を見てざっくり判断してみます。

コードは前回と同じくNode.jsで、JSONファイルのダウンロードには特に何も考えずhttpsモジュールを使っています。

const https = require('https');
const EL = require('echonet-lite');

const url = "https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json"
const area = 0
const battery = "192.168.0.XXX"
const chargeSunny = 15;
const chargeCloudy = 60;
const chargeRainy = 120;

let data = [];
https.get(url, function (res) {
    res.on('data', function (chunk) {
        data.push(chunk);
    }).on('end', function () {

        const events = Buffer.concat(data);
        const json = JSON.parse(events);
        const weatherCode = json[0]['timeSeries'][0]['areas'][area]['weatherCodes'][1];
        const weather = parseInt(weatherCode.substring(0,1));

        console.log(weatherCode);
        let chargeMin = 0;

        switch (weather) {
            case 1: //晴れ
                chargeMin = chargeSunny;
                break;
            case 2: //くもり
                chargeMin = chargeCloudy;
                break;
            default:
                chargeMin = chargeRainy;
        }
        const chargeEnd = new Date(Date.now());
        chargeEnd.setHours(5);
        chargeEnd.setMinutes(50);
        chargeEnd.setSeconds(0);

        const chargeStart = new Date(chargeEnd);
        chargeStart.setMinutes(chargeStart.getMinutes() - chargeMin);

        const dischargeEnd = new Date(chargeStart);
        dischargeEnd.setMinutes(dischargeEnd.getMinutes() - 15);
        
        const dischargeStart = new Date(chargeEnd);
        dischargeStart.setHours(6);
        dischargeStart.setMinutes(0);
        dischargeStart.setSeconds(0);

        const time = [0x02, chargeStart.getHours(), chargeStart.getMinutes(), chargeEnd.getHours(), chargeEnd.getMinutes(), dischargeStart.getHours(), dischargeStart.getMinutes(), dischargeEnd.getHours(), dischargeEnd.getMinutes()];
        console.log(time);
        EL.sendOPC1(battery, [0x05, 0xff, 0x01], [0x02, 0x7d], EL.SETI, 0xf8, time);

    });
});

特に説明するまでもないですが、

  1. JSONファイルをダウンロード
  2. その中から明日のweathercodeを引っ張り出す
  3. weathercodeの百の位をもとに充電時間を決定
  4. 充電完了が5:50になるように、充電開始時刻を計算
  5. 6:00に放電開始、充電開始時刻の15分前を放電完了時刻として計算
  6. それぞれの時間をセットして蓄電池に情報を送信

です。

weathercodeをベースにもう少し細かく調整しないとわざわざ気象庁のデータを引っ張ってきた意味がないのですが、あくまでここはサンプルということで。

スポンサーリンク

まとめ

気象庁のデータを使って蓄電池の充電時間を変更し、蓄電池に設定変更の命令を送るサンプルプログラムを作成しました。

このプログラムを日が変わる頃にcronで定期実行させれば、いい感じで充電してくれるはずです。

自宅のルーター(UniFi Dream Machine SE)にはnodeの実行環境がもともと入っているので、そこで動かすのが一番手っ取り早そうです。

コメント

タイトルとURLをコピーしました