Kansai Electric Power usage meter (Denki-yohou)

Dependencies:   mbed mbed-rtos EthernetInterface

関西電力 でんき予報メーター

関電のでんき予報のリアルタイム値(使用電力状況データ CSV )をもとに、mbedのLEDを点灯させます。

そのほかの情報はこちらへ: http://mbed.org/users/okini3939/notebook/denki-yohou/

Import programdenki-yohou_b

Kansai Electric Power usage meter (Denki-yohou)

  • LED1 動作中表示
  • LED2 70%以上
  • LED3 85%以上
  • LED4 95%以上

新しい Ethernet Interface ライブラリと、独自の Tiny HTTP クライアント ライブラリを使っています。

CSVの解析処理をはしょって改行を頼りにしているので、CSVファイルの構造が変わるとうまく動かなくなります。
東電でも同様に使えると思います。

Revision:
0:2a2f00cbc761
Child:
1:10bd46941b8b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jul 02 05:54:16 2012 +0000
@@ -0,0 +1,131 @@
+#include "mbed.h"
+#include "EthernetInterface.h"
+#include "TinyHTTP_b.h"
+
+// Kansai Electric Power
+#define HTTP_HOST "www.kepco.co.jp"
+#define HTTP_URI "/yamasou/juyo1_kansai.csv"
+
+Serial pc(USBTX, USBRX);
+EthernetInterface eth;
+
+DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
+
+int denki_usage = 0;
+struct tm denki_update;
+int year, month, day, hour, minute;
+
+void callback_denkiyohou (char *buf, int len) {
+    static int flg = 0, n = 0;
+    static char data[200];
+    int i;
+
+    for (i = 0; i < len; i ++) {
+        if (buf[i] == '\r') continue;
+
+        switch (flg) {
+        case 0:
+            // header
+            if (buf[i] == '\n') {
+                flg ++;
+            }
+            break;
+        case 1:
+            // end of header
+            if (buf[i] == '\n') {
+                flg ++;
+            } else {
+                flg = 0;
+            }
+            break;
+        case 2:
+            // update
+            if (buf[i] == '\n') {
+                data[n] = 0;
+                sscanf(data, "%d/%d/%d %d:%d", &year, &month, &day, &hour, &minute);
+                n = 0;
+                flg ++;
+            } else {
+                data[n] = buf[i];
+                n ++;
+            }
+            break;
+        case 4:
+            // peak
+            if (buf[i] == '\n') {
+                n = 0;
+                flg ++;
+            } else {
+                data[n] = buf[i];
+                n ++;
+            }
+            break;
+        case 7:
+            // yosou
+            if (buf[i] == '\n') {
+                n = 0;
+                flg ++;
+            } else {
+                data[n] = buf[i];
+                n ++;
+            }
+            break;
+        case 10:
+            // usage
+            if (buf[i] == '\n') {
+                data[n] = 0;
+                if (data[0] >= '0' && data[0] <= '9') {
+                    denki_usage = atoi(data);
+                }
+                n = 0;
+                flg ++;
+            } else {
+                data[n] = buf[i];
+                n ++;
+            }
+            break;
+        default:
+            // text
+            if (buf[i] == '\n') {
+                flg ++;
+            }
+            break;
+        }
+    }
+}
+
+int main() {
+    Timer timer;
+    int flg = 1, r;
+
+    pc.baud(115200);
+    eth.init(); //Use DHCP
+    if (eth.connect()) {
+        return -1;
+    }
+    
+    pc.printf("Denki-yohou %s\r\n", HTTP_HOST);
+
+    timer.start();
+    while(1) {
+        led1 = 1;
+    
+        if (flg || timer.read() >= 300) {
+            timer.reset();
+            r = httpRequest(METHOD_GET, HTTP_HOST, 80, HTTP_URI, NULL, NULL, &callback_denkiyohou);
+            if (r == 0) {
+                pc.printf("%04d-%02d-%02d %02d:%02d : ", year, month, day, hour, minute);
+                pc.printf("%d %%\r\n", denki_usage);
+                
+                led2 = denki_usage >= 70 ? 1 : 0;
+                led3 = denki_usage >= 85 ? 1 : 0;
+                led4 = denki_usage >= 95 ? 1 : 0;
+            }
+            flg = 0;
+        }
+
+        wait(0.1);
+        led1 = 0;
+        wait(0.9);
+    }
+}