降雨検知システムを作る2

降雨検知システムを作る2

■ 続稿 Seeedstudio 工業用 光学式 雨量計 RG-15 雨量センサ

SEEEDSTUDIO社製 RG-15
購入先 RobotShop Inc. 購入価格 ¥17,985

更に上位方式(フルスペック)のRG-15スクリプト

RG-15は高額ですが、値段に見合う機能も持っています。
雨が降っているかだけで無く本機の能力を最大限引き出す挑戦をしてみます。
新たに「通常運用モード(ope)」「管理モード(mag)」という2つのモードを作成します。

起動後 1秒ごとに「R」コマンドを送信している。(Polling固定)
JSONでセンサー側から送信 topic -> rain_sensor/rg15/data

取得項目:
Acc
EventAcc
TotalAcc
RInt
LensBad(あれば):レンズの状態劣化の告知
EmSat(あれば) :センサー内部赤外線LEDの劣化告知
spike_filtered 
spike_filteredは観測値の異常を検出した時に表示されます。
・ 1秒で0.2mm以上増加 → 異常
・EventAccだけ増えている場合→ 異常
・EmSat(内蔵赤外線LEDの異常)発生時は無効
spike_filteres信号以外は5秒遅らせて伝搬させているので異常値が発生した場合に、検知
がふらつくのを防止しています、検知されたら受信データーは破棄されます。
異常値が頻発に発生する場合には、RG-15に何らかの問題が発生している可能性が高いです。
リセットや蓄積データーをクリアすれば、一旦回復する場合もあるようですが完全な解決
方法ではありません。

管理モード(mag)に入る -> 通常観測停止
NODE-REDからMQTTで切替する topic -> rain_sensor/rg15/mode
payload -> mag (managerの略)
モードに入ったら続いてコマンドを送信する
例: topic -> rain_sensor/rg15/cmd
payload -> A  :「A」コマンド
センサー側から応答をJSON化して返す
topic -> rain_sensor/rg15/response
取得項目:
“Acc 0.000 in” :例

再度運用モードに戻るには
NODE-REDからMQTTで切替する topic -> rain_sensor/rg15/mode
payload -> ope (operationの略)

コマンドの詳細はメーカー告知の英文pdfを参照ください。
https://rainsensors.com/wp-content/uploads/sites/3/2020/07/rg-15_instructions_sw_1.000.pdf
RS232Cのボーレートだけは変更しないようにして下さい。

その前に

● RG-15コマンド操作に必要な用語解説 「エミッター(Emitter)」
光学式雨量計「RG-15」における「エミッター(Emitter)」は、赤外線(赤外光)を照射する発光部分(LED)を指します。
具体的には以下の役割や意味を持っています。
1. エミッター(発光部)の機能と原理
RG-15は光学式のセンサーであり、内部のLED(エミッター)から透明なプラスチックレンズの表面に向けて赤外線ビームを照射します。
雨がない時: エミッターから出た光は、レンズ内面で全反射し、検出器(レシーバー)
 に戻ります。
雨が降った時: レンズ表面に水滴が付くと、赤外光が外へ透過・分散し、検出器に戻る
 光の強さが変化します。
この「光がどれだけ透過したか」によって、降雨の有無や強度を精密に判定しています。 
2. RG-15における重要性
可動部なし: 従来の転倒ます型と異なり、物理的な可動部がないため、エミッターが正
 常に作動していれば目詰まりせず、メンテナンスフリーで動作します。
高感度・高精度: 微量の雨(水滴)を即座に検知する役割を担い、降り始めの雨を高速
 に測定します。
3. 注意点
RG-15の仕組み上、エミッター部分が泥や物理的な遮蔽物で覆われると、正常な赤外線照射ができず、感雨・雨量測定が正しく行えなくなる場合があります。 
要するに、RG-15のエミッターは、「雨を検知するために赤外線の目(光)を照射する部分」です。

● RG-15コマンド操作に必要な用語解説 「LEDが飽和している(Emitter is saturrated)」
センサー内部の赤外線エミッター(発光素子)から発せられた赤外線が、雨滴や汚れ、レンズ表面の異常などによって正常に受光側に届かず、受光センサーが限界値(飽和)に達して、正しく雨量を計測できなくなっている状態を指します。

具体的には以下の状況が考えられます。
レンズの汚れ・劣化(大): レンズ表面に著しい汚れ、泥、または長年の使用によるクレーズ(細
 かい亀裂)が蓄積し、赤外線が散乱・反射して受光側が「光に埋め尽くされている」状態。
激しい豪雨: 一時的に雨滴がレンズ面を覆い尽くし、通常とは異なる信号を生成して飽和している。
障害物: レンズのすぐ近くに反射物がある
RG-15のLED挙動による診断
電源投入時のLEDの点滅回数で診断が可能です。
4回点滅 (Lens is not very transmissive): レンズの透過性が低い。精度は落ちるが、動作は可能。
5回点滅 (Lens is not able to get sufficient light/Saturated): 透過性が極めて低い(飽和状態)。正
 常な読み取りは困難。 
対処方法
1, レンズの清掃: 中性洗剤や水を使用して、レンズ表面の汚れや油分を取り除いてください。
2, レンズの交換: 長期間使用(目安7-10年)している場合、樹脂の経年劣化が原因であるため、レンズ
交換が必要です。
 入手先 例 paypal visa master amexなど使えるみたい us$18、買ったことは無いのでご自分の責任
でどうぞ
https://store.hydreon.com/shop/rain-sensor/RG-LENS.html
3,この状態になると「LensBad」や「Emsat」といった情報がシリアルインタフェースに出力されます。

管理コマンドも使えるフルスペックRG-15 ESP-WROOM-02用スクリプト

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SoftwareSerial.h>

#define WIFI_SSID "your_ssid"
#define WIFI_PWD  "your_passwd"

const char* mqtt_server = "192.168.1.200";

SoftwareSerial mySerial(4, 5);   // RX, TX

#define LED1 14
#define LED2 16

WiFiClient espClient;
PubSubClient client(espClient);

enum Mode {
  MODE_OPERATION,
  MODE_MANAGEMENT
};

Mode currentMode = MODE_OPERATION;

unsigned long lastSend = 0;
float prevAcc = 0;
float filteredAcc = 0;
unsigned long lastValidTime = 0;

// ================= WiFi =================
void connectWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PWD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
}

// ================= MQTT Callback =================
void callback(char* topic, byte* payload, unsigned int length) {

  String msg = "";
  for (unsigned int i = 0; i < length; i++)
    msg += (char)payload[i];

  msg.trim();
  String t = String(topic);

  // ===== モード切替 =====
  if (t == "rain_sensor/rg15/mode") {

    if (msg == "mag") {

      if (currentMode != MODE_MANAGEMENT) {
        currentMode = MODE_MANAGEMENT;
        client.publish("rain_sensor/rg15/mode", "mag", true); // retain
      }

    } else if (msg == "ope") {

      if (currentMode != MODE_OPERATION) {
        currentMode = MODE_OPERATION;
        client.publish("rain_sensor/rg15/mode", "ope", true); // retain
      }
    }
  }

  // ===== 管理コマンド =====
  else if (t == "rain_sensor/rg15/cmd" && currentMode == MODE_MANAGEMENT) {

    mySerial.print(msg);
    mySerial.print("\r\n");

    delay(200);

    String response = mySerial.readStringUntil('\n');
    response.trim();

    char payloadJson[256];
    snprintf(payloadJson, sizeof(payloadJson),
      "{\"mode\":\"mag\",\"cmd\":\"%s\",\"response\":\"%s\"}",
      msg.c_str(), response.c_str());

    client.publish("rain_sensor/rg15/response", payloadJson);
  }
}

// ================= MQTT Reconnect =================
void reconnect() {

  while (!client.connected()) {

    String clientId = "RG15-";
    clientId += String(random(0xffff), HEX);

    if (client.connect(clientId.c_str())) {

      client.subscribe("rain_sensor/rg15/mode");
      client.subscribe("rain_sensor/rg15/cmd");

      // 現在モード通知(retain)
      if (currentMode == MODE_OPERATION)
        client.publish("rain_sensor/rg15/mode", "ope", true);
      else
        client.publish("rain_sensor/rg15/mode", "mag", true);

    } else {
      delay(2000);
    }
  }
}

// ================= RG15 R読取 =================
void readRG15() {

  mySerial.print("R\r\n");
  delay(200);

  String data = mySerial.readStringUntil('\n');
  data.trim();

  if (data.length() == 0) return;

  float acc = 0;
  float eventAcc = 0;
  float totalAcc = 0;
  float rint = 0;

  int idx;

  idx = data.indexOf("Acc");
  if (idx >= 0)
    acc = data.substring(idx + 4).toFloat();

  idx = data.indexOf("EventAcc");
  if (idx >= 0)
    eventAcc = data.substring(idx + 9).toFloat();

  idx = data.indexOf("TotalAcc");
  if (idx >= 0)
    totalAcc = data.substring(idx + 9).toFloat();

  idx = data.indexOf("RInt");
  if (idx >= 0)
    rint = data.substring(idx + 5).toFloat();

  bool lensBad = data.indexOf("LensBad") >= 0;
  bool emSat   = data.indexOf("EmSat") >= 0;

  // ===============================
  // 異常値フィルタ
  // ===============================

  float diff = acc - prevAcc;
  bool spike = false;

  // 1秒で0.2mm以上増加 → 異常
  if (diff > 0.2) {
    spike = true;
  }

  // EventAccだけ増えている場合
  if (diff <= 0 && eventAcc > 0.1) {
    spike = true;
  }

  // EmSat発生時は無効
  if (emSat) {
    spike = true;
  }

  if (spike) {
    // 異常なので前回値を維持
    acc = prevAcc;
  } else {
    prevAcc = acc;
  }

  filteredAcc = acc;

  digitalWrite(LED1, filteredAcc > 0);

  char payload[256];

  snprintf(payload, sizeof(payload),
    "{\"mode\":\"ope\","
    "\"acc\":%.2f,"
    "\"event_acc\":%.2f,"
    "\"total_acc\":%.2f,"
    "\"rint\":%.2f,"
    "\"lens_bad\":%s,"
    "\"emsat\":%s,"
    "\"spike_filtered\":%s}",
    filteredAcc, eventAcc, totalAcc, rint,
    lensBad ? "true" : "false",
    emSat   ? "true" : "false",
    spike   ? "true" : "false");

  client.publish("rain_sensor/rg15/data", payload);
}
// ================= SETUP =================
void setup() {

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);

  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);

  mySerial.begin(9600);

  WiFi.config(IPAddress(192,168,1,100),
              IPAddress(192,168,1,1),
              IPAddress(255,255,255,0));

  connectWiFi();

  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  // Polling固定
  mySerial.print("P\r\n");
}

// ================= LOOP =================
void loop() {

  if (!client.connected())
    reconnect();

  client.loop();

  if (currentMode == MODE_OPERATION) {

    if (millis() - lastSend > 1000) {
      lastSend = millis();
      readRG15();
    }
  }

  // 動作確認用LED点滅
  static unsigned long ledTimer = 0;
  if (millis() - ledTimer > 500) {
    ledTimer = millis();
    digitalWrite(LED2, !digitalRead(LED2));
  }
}

管理コマンドも使えるフルスペックNODE-REDフロー

[{"id":"3c7d328b1c656560","type":"tab","label":"RG-15 降雨センサー 管理機能付き","disabled":false,"info":"","env":[]},{"id":"c580e1f0a53e7c9e","type":"inject","z":"3c7d328b1c656560","name":"RG-15センサーをリセットする","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"Reset","payloadType":"str","x":330,"y":1180,"wires":[["87550c5068f58ff9"]]},{"id":"efa7b8f9a7fb74d2","type":"mqtt in","z":"3c7d328b1c656560","name":"","topic":"rain_sensor/rg15/data","qos":"2","datatype":"auto-detect","broker":"ec7e282464ec4f73","nl":false,"rap":true,"rh":0,"inputs":0,"x":220,"y":580,"wires":[["1a15413cc4403b86","55bb0591c76c611d"]]},{"id":"19b55c9171967a67","type":"inject","z":"3c7d328b1c656560","name":"雨->0","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"str","x":310,"y":240,"wires":[["8fa3ae9b5a7a2613"]]},{"id":"59c92712031913d3","type":"inject","z":"3c7d328b1c656560","name":"快晴->1","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"1","payloadType":"str","x":310,"y":280,"wires":[["8fa3ae9b5a7a2613"]]},{"id":"846c8d3d0c8a24eb","type":"inject","z":"3c7d328b1c656560","name":"晴れ->2","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"2","payloadType":"str","x":310,"y":320,"wires":[["8fa3ae9b5a7a2613"]]},{"id":"867d49a31f07b554","type":"inject","z":"3c7d328b1c656560","name":"曇天->3","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"3","payloadType":"str","x":310,"y":360,"wires":[["8fa3ae9b5a7a2613"]]},{"id":"aa8cafc754880fa9","type":"inject","z":"3c7d328b1c656560","name":"雪->4","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"4","payloadType":"str","x":310,"y":400,"wires":[["8fa3ae9b5a7a2613"]]},{"id":"55bb0591c76c611d","type":"json","z":"3c7d328b1c656560","name":"","property":"payload","action":"obj","pretty":false,"x":370,"y":480,"wires":[["e1eec65695fdacb2","c531c77ab3066cbf"]]},{"id":"1a15413cc4403b86","type":"debug","z":"3c7d328b1c656560","name":"debug 11","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":420,"y":580,"wires":[]},{"id":"f44e619753f51472","type":"comment","z":"3c7d328b1c656560","name":"RG-15 運用 管理 モード切替","info":"","x":240,"y":640,"wires":[]},{"id":"fe6c94b7f05c8ed1","type":"inject","z":"3c7d328b1c656560","name":"運用モード (ope)","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"ope","payloadType":"str","x":230,"y":680,"wires":[["c9a401dadd8084ec"]]},{"id":"c9a401dadd8084ec","type":"mqtt out","z":"3c7d328b1c656560","name":"","topic":"rain_sensor/rg15/mode","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"ec7e282464ec4f73","x":470,"y":680,"wires":[]},{"id":"67b6b785c804268b","type":"inject","z":"3c7d328b1c656560","name":"管理モード (mag)","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"mag","payloadType":"str","x":220,"y":760,"wires":[["322089145366dc67"]]},{"id":"322089145366dc67","type":"mqtt out","z":"3c7d328b1c656560","name":"","topic":"rain_sensor/rg15/mode","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"ec7e282464ec4f73","x":470,"y":760,"wires":[]},{"id":"2dbdb8c1962a8abc","type":"mqtt in","z":"3c7d328b1c656560","name":"","topic":"rain_sensor/rg15/mode","qos":"2","datatype":"auto-detect","broker":"ec7e282464ec4f73","nl":false,"rap":true,"rh":0,"inputs":0,"x":740,"y":680,"wires":[["d012b66f294ebb45"]]},{"id":"d012b66f294ebb45","type":"debug","z":"3c7d328b1c656560","name":"debug 12","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":940,"y":680,"wires":[]},{"id":"8dda03249fd8a578","type":"mqtt in","z":"3c7d328b1c656560","name":"","topic":"rain_sensor/rg15/response","qos":"2","datatype":"auto-detect","broker":"ec7e282464ec4f73","nl":false,"rap":true,"rh":0,"inputs":0,"x":750,"y":740,"wires":[["d5456ee99fe105d7"]]},{"id":"d5456ee99fe105d7","type":"debug","z":"3c7d328b1c656560","name":"debug 13","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":960,"y":740,"wires":[]},{"id":"78c4be504684d978","type":"inject","z":"3c7d328b1c656560","name":"Acc累積データーの読み込み","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"A","payloadType":"str","x":320,"y":820,"wires":[["87550c5068f58ff9"]]},{"id":"87550c5068f58ff9","type":"mqtt out","z":"3c7d328b1c656560","name":"","topic":"rain_sensor/rg15/cmd","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"ec7e282464ec4f73","x":680,"y":820,"wires":[]},{"id":"719e10c8bb8c7cba","type":"inject","z":"3c7d328b1c656560","name":"全降雨データーの読み込み","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"R","payloadType":"str","x":310,"y":860,"wires":[["87550c5068f58ff9"]]},{"id":"7f4706756daf96b6","type":"inject","z":"3c7d328b1c656560","name":"RG-15センサーの再起動","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"K","payloadType":"str","x":310,"y":900,"wires":[["87550c5068f58ff9"]]},{"id":"c9814a7b66b0a2ec","type":"inject","z":"3c7d328b1c656560","name":"高解像度指定を強制","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"H","payloadType":"str","x":290,"y":940,"wires":[["87550c5068f58ff9"]]},{"id":"5d908cfd20e4724d","type":"inject","z":"3c7d328b1c656560","name":"低解像指定を強制","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"L","payloadType":"str","x":290,"y":980,"wires":[["87550c5068f58ff9"]]},{"id":"8fa3ae9b5a7a2613","type":"function","z":"3c7d328b1c656560","name":"天候画像変換","func":"var icon;\nvar weather = msg.payload;\nswitch(weather){\n    case \"0\":\n        icon = \"/Weather/rain.png\";\n        break;\n    case \"1\":\n        icon = \"/Weather/sunny.png\";\n        break; \n    case \"2\":\n        icon = \"/Weather/sunny_cloudy.png\";\n        break; \n    case \"3\":\n        icon = \"/Weather/cloudy.png\";\n        break;\n    case \"4\":\n        icon = \"/Weather/snow.png\";\n        break;\n}\nmsg.payload = icon;\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":240,"wires":[["ef043d9cb4a88012"]]},{"id":"cdee9cbb28ddaa59","type":"function","z":"3c7d328b1c656560","name":"雨以外は通過","func":"var status =global.get(\"rain_status\");\nvar data = \"\";\nif (status == \"0\"){\n     data = String(msg.payload);\n     global.set(\"sun_status\",data);\n}else{\n data = \"0\";\n}\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":160,"wires":[["8fa3ae9b5a7a2613"]]},{"id":"af020ffa9c4bf041","type":"mqtt in","z":"3c7d328b1c656560","name":"","topic":"sky_pat","qos":"2","datatype":"auto-detect","broker":"ec7e282464ec4f73","nl":false,"rap":true,"rh":0,"inputs":0,"x":310,"y":160,"wires":[["cdee9cbb28ddaa59"]]},{"id":"ef043d9cb4a88012","type":"ui-template","z":"3c7d328b1c656560","group":"a2862a7d5d758378","page":"","ui":"","name":"今の天気","order":1,"width":0,"height":0,"head":"","format":"<template>\n    <div style=\"text-align:center\">\n        <img\n      :src=\"msg.payload\"\n      alt=\"weather_icon\"\n      width=\"92\"\n      height=\"92\"\n    />\n    </div>\n</template>","storeOutMessages":true,"passthru":true,"resendOnRefresh":true,"templateScope":"local","className":"","x":720,"y":240,"wires":[[]]},{"id":"833783cce9bc1e1b","type":"ui-gauge","z":"3c7d328b1c656560","name":"検知された雨量mm","group":"a2862a7d5d758378","order":2,"value":"payload","valueType":"msg","width":"2","height":"2","gtype":"gauge-half","gstyle":"needle","title":"1時間累積雨量mm","alwaysShowTitle":false,"floatingTitlePosition":"top-left","units":"","icon":"","prefix":"","suffix":"","segments":[{"from":"0","color":"#b8d987","text":"","textType":"label"},{"from":"20","color":"#9ac6a9","text":"","textType":"label"},{"from":"30","color":"#fee690","text":"","textType":"label"},{"from":"50","color":"#f38686","text":"","textType":"label"},{"from":"100","color":"#f90606","text":"","textType":"label"}],"min":0,"max":"100","sizeThickness":16,"sizeGap":4,"sizeKeyThickness":8,"styleRounded":true,"styleGlow":false,"className":"","x":890,"y":520,"wires":[[]]},{"id":"1248484e8a44aae7","type":"comment","z":"3c7d328b1c656560","name":"デバッグ用","info":"","x":160,"y":320,"wires":[]},{"id":"786998221f88076e","type":"comment","z":"3c7d328b1c656560","name":"1mm〜5mm未満: シトシトと降る。傘が必要。","info":"","x":1020,"y":200,"wires":[]},{"id":"5566bebe0fbd4069","type":"comment","z":"3c7d328b1c656560","name":"10mm〜20mm未満: ザーザーと降る。地面からの跳ね返りで足元が濡れる。","info":"","x":1110,"y":240,"wires":[]},{"id":"10dee76293678985","type":"comment","z":"3c7d328b1c656560","name":"20mm〜30mm未満: どしゃ降り。ワイパーを速くしても見づらい。","info":"","x":1080,"y":280,"wires":[]},{"id":"dc84100ffd8685d4","type":"comment","z":"3c7d328b1c656560","name":"30mm〜50mm未満: 激しい雨。バケツをひっくり返したよう。道路が川のようになる。","info":"","x":1140,"y":320,"wires":[]},{"id":"9adc0767658193bd","type":"comment","z":"3c7d328b1c656560","name":"50mm〜80mm未満: 非常に激しい雨。滝のように降る。車は運転危険、地下空間は危険。","info":"","x":1150,"y":360,"wires":[]},{"id":"3c907ac53515edc6","type":"comment","z":"3c7d328b1c656560","name":"80mm以上: 猛烈な雨。息苦しく、恐怖を感じる。土砂災害や浸水の危険。","info":"","x":1100,"y":400,"wires":[]},{"id":"6d83484134a7c2c4","type":"comment","z":"3c7d328b1c656560","name":"1時間の降雨量 EventACC ","info":"","x":960,"y":140,"wires":[]},{"id":"d0948f1bae3e3715","type":"inject","z":"3c7d328b1c656560","name":"インチ単位を強制","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"I","payloadType":"str","x":290,"y":1020,"wires":[["87550c5068f58ff9"]]},{"id":"f9667869630bd275","type":"inject","z":"3c7d328b1c656560","name":"メートル単位を強制","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"M","payloadType":"str","x":290,"y":1060,"wires":[["87550c5068f58ff9"]]},{"id":"ce5dd8e8e4ddb5da","type":"inject","z":"3c7d328b1c656560","name":"分解能はスイッチ設定に従う","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"S","payloadType":"str","x":320,"y":1100,"wires":[["87550c5068f58ff9"]]},{"id":"da9f81c52e0cd2ae","type":"inject","z":"3c7d328b1c656560","name":"累積カウンターをリセットする","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"O","payloadType":"str","x":330,"y":1140,"wires":[["87550c5068f58ff9"]]},{"id":"61abb250224e89d1","type":"inject","z":"3c7d328b1c656560","name":"ファームウエアのバージョン日を表示する","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"SW","payloadType":"str","x":360,"y":1220,"wires":[["87550c5068f58ff9"]]},{"id":"d4c4a0f384e02cb6","type":"inject","z":"3c7d328b1c656560","name":"内部赤外線LED1 LED2のレベルを表示","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"Emitters","payloadType":"str","x":350,"y":1260,"wires":[["87550c5068f58ff9"]]},{"id":"e5e5f0cb154fd6bb","type":"inject","z":"3c7d328b1c656560","name":"内部赤外線LED1 LED2のレベル合計値","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"EmTotal","payloadType":"str","x":350,"y":1300,"wires":[["87550c5068f58ff9"]]},{"id":"eb9997c5b668a05e","type":"inject","z":"3c7d328b1c656560","name":"デバイスの電源がONになっている日数","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"PwrDays","payloadType":"str","x":350,"y":1340,"wires":[["87550c5068f58ff9"]]},{"id":"1f02cd03a515ab2f","type":"inject","z":"3c7d328b1c656560","name":"レンズは適切な読み取りが出来ない状態かどうか表示する","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"LensBad","payloadType":"str","x":410,"y":1380,"wires":[["87550c5068f58ff9"]]},{"id":"38cc9835d139f978","type":"inject","z":"3c7d328b1c656560","name":"内部赤外線の光がレンズの汚れなどにより受光センサーの届かないかどうかを表示する","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"EmSat","payloadType":"str","x":500,"y":1420,"wires":[["87550c5068f58ff9"]]},{"id":"fe94416404fb8a06","type":"comment","z":"3c7d328b1c656560","name":"私のは何も応答が無かった","info":"","x":670,"y":1220,"wires":[]},{"id":"918f39019e9ab386","type":"comment","z":"3c7d328b1c656560","name":"私のは何も応答が無かった","info":"","x":670,"y":1260,"wires":[]},{"id":"bac98f476bf571e7","type":"comment","z":"3c7d328b1c656560","name":"私のは何も応答が無かった","info":"","x":670,"y":1300,"wires":[]},{"id":"1da7d3645a6a3736","type":"comment","z":"3c7d328b1c656560","name":"私のは何も応答が無かった","info":"","x":670,"y":1340,"wires":[]},{"id":"0c7b32a57a944764","type":"comment","z":"3c7d328b1c656560","name":"恐らくトラブル発生時のみ表示される","info":"","x":790,"y":1380,"wires":[]},{"id":"b0907a2c260b5f65","type":"comment","z":"3c7d328b1c656560","name":"恐らくトラブル発生時のみ表示される","info":"","x":970,"y":1420,"wires":[]},{"id":"4d5226877986c05f","type":"function","z":"3c7d328b1c656560","name":"rain = \"0\"","func":"var spike = global.get(\"spike\");\nif(!spike){\nvar temp = parseFloat(msg.payload.acc);\nif (temp > 0.0){\n    global.set(\"rain_status\",\"1\");\n}else{\n    global.set(\"rain_status\",\"0\");\n}\n}\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":480,"wires":[[]]},{"id":"5a7ec78ad55b19bb","type":"function","z":"3c7d328b1c656560","name":"event_acc","func":"var spike = global.get(\"spike\");\nif (!spike){\nvar temp = msg.payload.event_acc;\nmsg.payload = temp;\nreturn msg;\n}","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":520,"wires":[["833783cce9bc1e1b"]]},{"id":"c531c77ab3066cbf","type":"function","z":"3c7d328b1c656560","name":"spike","func":"var temp = msg.payload.spike_filtered;\nglobal.set(\"spike\",temp);\nmsg.payload = temp;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":670,"y":560,"wires":[["d3bc82ebbbd7dcd1"]]},{"id":"d3bc82ebbbd7dcd1","type":"function","z":"3c7d328b1c656560","name":"異常値?","func":"var spike = msg.payload;\nvar data =\"\";\nif (spike){\n    data = \"異常値検知\";\n}else{\n    data = \"正常\";\n}\nmsg.payload = data;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":560,"wires":[["90fb6e5f46f778b5"]]},{"id":"90fb6e5f46f778b5","type":"ui-text","z":"3c7d328b1c656560","group":"a2862a7d5d758378","order":3,"width":0,"height":0,"name":"警告","label":"","format":"{{msg.payload}}","layout":"row-spread","style":true,"font":"","fontSize":16,"color":"#fafafa","wrapText":false,"className":"","value":"payload","valueType":"msg","x":930,"y":560,"wires":[]},{"id":"e1eec65695fdacb2","type":"delay","z":"3c7d328b1c656560","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":520,"y":480,"wires":[["5a7ec78ad55b19bb","4d5226877986c05f"]]},{"id":"ec7e282464ec4f73","type":"mqtt-broker","name":"","broker":"192.168.1.200","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"a2862a7d5d758378","type":"ui-group","name":"今日の天気","page":"cef20d4917f1c9a7","width":6,"height":1,"order":1,"showTitle":false,"className":"","visible":"true","disabled":"false","groupType":"default"},{"id":"cef20d4917f1c9a7","type":"ui-page","name":"気象","ui":"debf650e7f1343d3","path":"/page1","icon":"home","layout":"grid","theme":"a45c7f2adf09be21","breakpoints":[{"name":"Default","px":"0","cols":"3"},{"name":"Tablet","px":"576","cols":"6"},{"name":"Small Desktop","px":"768","cols":"9"},{"name":"Desktop","px":"1024","cols":"12"}],"order":1,"className":"","visible":"true","disabled":"false"},{"id":"debf650e7f1343d3","type":"ui-base","name":"画面名","path":"/dashboard","appIcon":"","includeClientData":true,"acceptsClientConfig":["ui-notification","ui-control"],"showPathInSidebar":false,"headerContent":"page","navigationStyle":"default","titleBarStyle":"default","showReconnectNotification":true,"notificationDisplayTime":1,"showDisconnectNotification":true,"allowInstall":true},{"id":"a45c7f2adf09be21","type":"ui-theme","name":"気象","colors":{"surface":"#505050","primary":"#505050","bgPage":"#505050","groupBg":"#5f5f5f","groupOutline":"#cccccc"},"sizes":{"density":"default","pagePadding":"12px","groupGap":"12px","groupBorderRadius":"4px","widgetGap":"12px"}},{"id":"0a8a8bc110a71ab1","type":"global-config","env":[],"modules":{"@flowfuse/node-red-dashboard":"1.30.2"}}]