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ファイルの構造が変わるとうまく動かなくなります。
東電でも同様に使えると思います。
Diff: main.cpp
- Revision:
- 2:b50c974ed0d5
- Parent:
- 1:10bd46941b8b
- Child:
- 3:ef5af1e8558d
--- a/main.cpp Mon Jul 02 06:55:49 2012 +0000 +++ b/main.cpp Mon Jul 02 16:23:41 2012 +0000 @@ -12,6 +12,7 @@ DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); volatile int denki_flg = 0; +volatile int denki_capacity = 0; volatile int denki_usage = 0; volatile int year, month, day, hour, minute; @@ -24,85 +25,63 @@ for (i = 0; i < len; i ++) { if (buf[i] == '\r') continue; - switch (denki_flg) { - case 0: + if (denki_flg <= 1) { // header if (buf[i] == '\n') { - denki_flg ++; - } - break; - case 1: - // end of header - if (buf[i] == '\n') { n = 0; denki_flg ++; } else { denki_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; - denki_flg ++; - } else - if (n < sizeof(data)) { - data[n] = buf[i]; - n ++; + continue; + } + + // body + if (buf[i] == '\n') { + data[n] = 0; + switch (denki_flg) { + case 2: + // update + break; + case 4: + // capacity + if (data[0] >= '0' && data[0] <= '9') { + denki_capacity = atoi(data); + } + break; + case 7: + // yosou1 + break; + case 10: + // yosou2 + break; + default: + // text + if (data[0] == 'D' && data[1] == 'A') { + denki_flg = denki_flg < 100 ? 100 : 200; + } + break; } - break; - case 4: - // peak - if (buf[i] == '\n') { - n = 0; - denki_flg ++; - } else - if (n < sizeof(data)) { + if (denki_flg > 200 && data[i - 1] >= '0' && data[i - 1] <= '9') { + sscanf(data, "%d/%d/%d,%d:%d,%d", &year, &month, &day, &hour, &minute, &denki_usage); + } + n = 0; + denki_flg ++; + } else { + // data + if (n < sizeof(data) - 1) { data[n] = buf[i]; n ++; } - break; - case 7: - // yosou - if (buf[i] == '\n') { - n = 0; - denki_flg ++; - } else - if (n < sizeof(data)) { - 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; - denki_flg ++; - } else - if (n < sizeof(data)) { - data[n] = buf[i]; - n ++; - } - break; - default: - // text - if (buf[i] == '\n') { - denki_flg ++; - } - break; } + } } int main() { Timer timer; int flg = 1, r; + float denki_percentage = 0; pc.baud(115200); eth.init(); //Use DHCP @@ -121,12 +100,14 @@ denki_flg = 0; 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); + denki_percentage = (float)denki_usage / (float)denki_capacity * 100.0; - led2 = denki_usage >= 70 ? 1 : 0; - led3 = denki_usage >= 85 ? 1 : 0; - led4 = denki_usage >= 95 ? 1 : 0; + pc.printf("%04d-%02d-%02d %02d:%02d : ", year, month, day, hour, minute); + pc.printf("%0.1f %%\r\n", denki_percentage); + + led2 = denki_percentage >= 70 ? 1 : 0; + led3 = denki_percentage >= 85 ? 1 : 0; + led4 = denki_percentage >= 95 ? 1 : 0; } else { pc.printf("http error\r\n"); }