SCP1000+Arduino+Pachube+cacti

2011 年 9 月 21 日 コメントはありません

気圧をグラフにして残す

SCP1000+ArduinoをCentOS機(NEC 110ge)にUSB接続してデータを保管、Pachubeとcactiにてグラフ表示させてみました。

当初、cactiでひっそりこっそりデータを確認してたのですが、Pachubeが思ったより簡単だったので、同時にデータを投げるようにしました。今回もいきあたりばったりでDBは使用せず、テキストファイルを使っています。

USBデバイスからのデータを読み込む

ガイガーカウンターのときと同じような感じで、データ生成ツール(今回はPerlスクリプト)をcronで回して、テキストで追記。これをPHPで読み取り、cacti用にprintfした後、Pachubeに投げます。

Perlスクリプトは「ねこひげめも|Linux(CentOS)でUSBウェザーボードを使って遊ぶ」を参考にさせて頂きました。参考というか、まるごとパクリです。

追記
どうもSCP1000が返す数字を拾うのに失敗することが多いようで、グラフが歯抜けになってしまうので、ifを2回繰り返して、それでもダメなら空白を返すようにしました。0じゃなく、空白ならグラフも途切れるだけかな。3回待ってまで拾う意味のある数字でもないのでとりあえずこれで。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/perl
 
use strict;
open(PORT,"/dev/ttyUSB0") || die "NG!";
 
my $times = time();
(my $sec,my $min,my $hour,my $mday,my $mon,my $year,my $wday,my $stime) = localtime($times);
$year = $year +1900;
$mon++;
my $datetime=sprintf("%04d-%02d-%02dT%02d:%02d:%02d+09:00", $year,$mon,$mday,$hour,$min,$sec);
 
my $serial = <PORT>;
chomp $serial;
my @val = split /,/,$serial;
 
if($val[1]<1){
    sleep(5);
    my $serial = <PORT>;
    chomp $serial;
    my @val = split /,/,$serial;
}
 
my $temp = $val[0];
my $press = $val[1];
chomp $temp;
chomp $press;
 
printf("%s,%0.2f,%2.2f\n", $datetime, $press, $temp);
 
close(PORT);

定期実行させる

crontabはこんな感じで。

*/5 * * * * /hoge/scp1000.pl >> /hoge/scp1000tmp.txt
scp1000tmp.txt

2011-09-21T16:00:03+09:00,986.60,28.03
2011-09-21T16:05:03+09:00,986.90,28.03
2011-09-21T16:10:03+09:00,987.05,28.07
2011-09-21T16:15:02+09:00,987.32,28.03

追記2
cronで5分ごとにガイガーカウンターの数値もとっているためか、USBより数値を拾い損ねることが多発し、グラフが歯抜けすぎるので、1分ずらしてみました。

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /hoge/scp1000.pl >> /hoge/scp1000tmp.txt

なお、SCP1000が日光の影響を受けるという動画がありました。気温と連動してるのかと思ってたら陽射しと連動していたのか・・・。これは急いで対策しなければ。

cactiとPachubeへ送信

PHPスクリプトはcactiデータ取得用とPachube送信と兼用なのはガイガーカウンターのときと同様です

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
require_once('/PachubeAPI.php');
mb_internal_encoding("UTF-8");
 
$datafile = "/hoge/scp1000tmp.txt";
$t_file = file_get_contents($datafile);
 
//Pachube
$api_key = "your_api_key_here";
$feed = '5digit_feed_number';
 
//put all data into array
$rows = explode("\n", $t_file);
$cols = explode(",", $t_file);
$csv_arr = array_map("str_getcsv", $rows);
$row_c = count($csv_arr);
 
//read the last line
$last_1time = $csv_arr[$row_c-2][0];
$last_1pres = $csv_arr[$row_c-2][1];
$last_1temp = $csv_arr[$row_c-2][2];
 
$datetime = $last_1time;
$pressure = $last_1pres;
$temp = $last_1temp;
 
//print for cacti
printf("scppres:%0.2f scptemp:%2.2f", $pressure,$temp);
 
//max and min data for Pachube
$press_min = '800';
$press_max = '1050';
$temp_min = '-10';
$temp_max = '50';
 
//Pachube
//id1:Press id2:Temp
$json_arr = array(
                  'version' => '1.0.0',
                  'datastreams' => array(array('id' => '1', 'at' => $datetime, 'max_value' => $press_max, 'min_value' => $press_min, 'current_value' => $pressure),
                                         array('id' => '2', 'at' => $datetime, 'max_value' => $temp_max, 'min_value' => $temp_min, 'current_value' => $temp))
                  );
$update_data = json_encode($json_arr);
 
$obj = new PachubeAPI($api_key);
$obj->updateFeed('json', $feed, $update_data);
 
?>
カテゴリー: プログラミング, 自宅サーバ タグ:

PHP + PachubeAPIでPachubeにデータを投げる

2011 年 9 月 17 日 コメントはありません

Pachube(パッチベイ)に挑戦

データを引っ張れるようになったストロベリーリナックス社のUSBガイガーカウンタキットをより活用すべく、cactiと同時にPachubeにデータをアップロードするようにしました。

PHPでデータを送信する

Pachube v2 API Documentationを流し読みしましたが、結局、PHP用のクラスPachubeAPIをみつけ、活用いたしました。ありがとうございます。

前回のに追加するコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
//頭に追加
require_once('PachubeAPI.php');//上記本文参照
 
.....
 
//Pachube
$api_key = 'your_api_key_here';//APIキー
$feed = '5_digit_feed_number'; //作成したfeedのURLの末尾の数字
 
.....
 
//(略)前の記事参照のこと
 
.....
 
//最後に追加
 
//Pachube用データ作成と投稿
 
//先に取得済みのcpmとusvを四捨五入。
//JSON化するために数値->文字列に
$cpm_round = strval(round($cpm, 0));
$usv_round = strval(round($usv, 4));
 
//json_encode用に配列を作成。idとcurrent_valueを代入。
$json_arr = array(
                  'version' => '1.0.0',
                  'datastreams' => array(array('id' => '1', 'current_value' => $cpm_round),
                                         array('id' => '2', 'current_value' => $usv_round))
                  );
//JSON化
$update_data = json_encode($json_arr);
 
//データを投稿
$obj = new PachubeAPI($api_key);
$obj->updateFeed('json', $feed, $update_data);

まとめ

Pachubeはなんとなく難しそうで敬遠していたのですが、PachubeAPIのおかげで特に新しい勉強をしなくても運用開始できました。改めて感謝です。

Pachubeから動的画像出力

カテゴリー: プログラミング, 自宅サーバ タグ:

CentOSでストロベリーリナックスUSBガイガーカウンタキット

2011 年 9 月 13 日 コメントはありません

ストロベリーリナックス社のUSBガイガーカウンタキット(以下文中ではUSBガイガー)をCentOSで利用できるようにしてみたので記録。なお、プログラミングは初心者です。よろしければ間違い、よりスマートな方法をご教示下さい。

概要

単品でサーバ機に接続すべきか、Arduinoを挟むか(少し)検討しました。

直結するメリット:

  1. GM管のパルスをカウントするアルゴリズムが他のユーザと共通であるため全国のユーザと比較することが可能。
  2. 追加投資が不要。

直結するデメリット:

  1. USB-GEIGERでモニタリングポストを作ろう3で解析されているように「連続稼動は「約194日」で、放射線カウントは同様に、最大「約43万」まで計測可能」という制限を受けてしまう。
  2. 既存のドライバ類がないので自力でなんとかしなくてはいけない。

下記のリンクを参考にしたところ、ドライバじゃなくてもアクセス可能であり、また、同類のボード用のツール・ドライバは存在することがわかりました。そこで、そのソースを勝手にいじくってUSBガイガーを利用しようと思い立ちました。

秋月Arduinoをいくつももってるのでメリット2)は無関係。といっても、電源が2つ必要なのは面倒だなーと思ってましたが、Arduinoからパルス・電源・GNDと3本引っ張ればよいのでありました(参考リンク9)。デメリット1は大きいのですが、メリット1のことも考えると・・・。そんなわけで、とりあえずソースいじくって数字をとれるところまでできましたので記録しておきます。でも今後Arduino経由に移行するかも。

参考

詳細な情報提供に感謝です。

  1. USB-GEIGERでモニタリングポストを作ろう3 – ITのある生活
  2. USB-RH で遊ぶ – daily dayflower
  3. USBRH on Linux
  4. USBRH driver for Linux
  5. Using USBRH on *BSD
  6. USBRH+Cactiで室温モニタリング(1) – # cat /var/log/stereocat | tail -n3
  7. libusbについて – Linux工作室
  8. ねこひげめも|Linux(CentOS)でUSBウェザーボードを使って遊ぶ
  9. ガイガーカウンターのカウント数をTwitterに投稿するアプリを作る – なんか作る

接続

まず、キットを組み立てます。GM管の扱いに注意すれば、半田付けするだけです。圧電ブザー音のオンオフはUSBガイガーの再起動で初期化されるごとにオンになるため、ブザーにはセロハンテープかなんかでフタをしておくとよいかもしれません。

USBガイガーをサーバに接続してlsusbするとずらずらっとUSB機器が表示されますが、「Bus 007 Device 002: ID 1774:1002」とID 1774:1002と出る行が当USBガイガー機です。BusとDeviceは環境によって異なります。

上記のBusとDeviceの数字を用いてlsusb -D /proc/bus/usb/007/002とすると、詳細情報が表示されます。Using USBRH on *BSDの一番下の資料のデータと突き合わせてみたところ、USBガイガーとUSBRHは接続に関しては同一と判断し、USBRH用ツールを改造することにしました。なお、ドライバーのソースも拝見しましたが、自分の実力では改造は到底無理と判断。

ソースいじりにとりかかる前にUSBデバイス接続後の振る舞いを予め設定しておきます。USB-RH で遊ぶ – daily dayflowerより、udevルールを設定。

ソースの改変

USBRH on LinuxよりUSBRHのソースを頂きます。これならなんとなく自分でも分かりそうです(USB絡みの難しいところは定番記述として無視するとして)。

最初にUSB-RH で遊ぶ – daily dayflowerのパッチを当てました。

いよいよ、USBガイガー用にソースを修正します。

計算にべき乗を使うのでmath.hをincludeしないといけないようです。VENDER IDとPRODUCT IDは上記、lsusbより得た「Bus 007 Device 002: ID 1774:1002」を使用。PRODUCT IDがひとつ違うだけです。

#include
 
#define USBGEIGER_VENDOR 0x1774
#define USBGEIGER_PRODUCT 0x1002

その他、USBRHとなっているところはUSBGEIGERに一括置換。カウントとタイマーをカンマ区切りで出力するオプションCを追加しました。

さて、USBデバイスから返された数値は変数buffの中にUSB-GEIGERでモニタリングポストを作ろう3 – ITのある生活での解析にあるように「91cc0100f34c07」と7バイトで入っています。

buffから数字を取り出すために以下のとおり、関数を作成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int calccount(unsigned char *in, int length)
{
int i, d, s;
d = s = 0;
 
    for(i=length;i>0;i--){
      if(i<5){
        d = in[i-1] * pow(16,(i-1)*2);
        //printf("%02x %d\n", in[i-1], d);
        s = s + d;
        }
    }
    return s;
}
 
 
int calctimer(unsigned char *in, int length)
{
int i, d, s;
d = s = 0;
 
    for(i=length;i>0;i--){
      if(i>4){
        d = in[i-1] * pow(16,(i-5)*2);
        //printf("%02x %d\n", in[i-1], d);
        s = s + d;
        }
    }
    return s;
}

あとは、出力内容を上記関数にいれかえ、printfで整形。

math.hを使うとコンパイルでエラーが出るのでMakefileの記述-lmオプション追加。無事コンパイル完了。

usbgeiger -cとすると「118037,479109」のように返すことができるようになりました。crontabで/usr/local/bin/usbgeiger -c >>/var/www/html/data/count.txtとして、5分ごとのログを残しています(このサーバではないです)。

これをcactiでグラフ化しました。PHPでログファイルを開き、5分間で増加したカウントから導いたCPMと変換係数を120とした参考uSvを表示するようにしました。

カウント、タイマー、それぞれ最終行とその前の行との差をもって算出していますが、再起動後は最終行とその前の行の数字のつながりがおかしくなると思うのでそこだけ条件分岐させています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
mb_internal_encoding("UTF-8");
 
//ログファイル指定
$datafile = "/var/www/html/hoge/counter.txt";
$t_file = file_get_contents($datafile);
 
//係数
$lnd712 = 120;
 
$rows = explode("\n", $t_file);
$cols = explode(",", $t_file);
$csv_arr = array_map("str_getcsv", $rows);
$row_c = count($csv_arr);
 
//最終行
$last_1c = $csv_arr[$row_c-2][0];
$last_1t = $csv_arr[$row_c-2][1];
 
//最終行の前の行
$last_2c = $csv_arr[$row_c-3][0];
$last_2t = $csv_arr[$row_c-3][1];
 
//最終行の前の前の行
$last_3c = $csv_arr[$row_c-4][0];
$last_3t = $csv_arr[$row_c-4][1];
 
//最終行の前の行と最終行との差
$count_1_2 = $last_1c - $last_2c;
$timer_1_2 = $last_1t - $last_2t;
 
//最終行は無視し、その一つ前の組み合わせ。
$count_2_3 = $last_2c - $last_3c;
$timer_2_3 = $last_2t - $last_3t;
 
//CPMとuSvを計算。
//最起動直後のデータは無視する
if ($count_1_2>0) {
  $counter = $last_1c;
  $timer = $last_1t;
  $cpm = $count_1_2 / $timer_1_2 * 60;
  $usv = $cpm / $lnd712;
 } else {
  $counter = $last_2c;
  $timer = $last_2t;
  $cpm = $count_2_3 / $timer_2_3 * 60;
  $usv = $cpm / $lnd712;
 }
 
printf("counter:%d timer:%d cpm:%d usv:%.3g", $counter, $timer, $cpm, $usv);
 
?>

最後にusbrh-0.05.tar.gz[25-Mar-2008]との差分も載せておきます。
ベタベタコードですいません。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
@@ -24,45 +24,10 @@
 #include <usb.h>
 #include <unistd.h>
 #include <string.h>
+#include <math.h>
 
-#define USBRH_VENDOR  0x1774
-#define USBRH_PRODUCT 0x1001
-
-// parameter
-// http://www.sensirion.com/en/pdf/product_information/Data_Sheet_humidity_sensor_SHT1x_SHT7x_E.pdf
-// http://www.syscom-inc.co.jp/pdf/sht_datasheet_j.pdf
-#define d1 -40.00
-#define d2 0.01
-#define c1 -4
-#define c2 0.0405
-#define c3 -0.0000028
-#define t1 0.01
-#define t2 0.00008
-
-// Temperature = d1+d2*SOt
-// d1  -40.00
-// d2  0.04
-double convert_temp(int in)
-{
-double tmp;
-
-    tmp = 0;
-
-    tmp = d1+d2*in;
-
-    return(tmp);
-}
-
-double convert_humidity(int in)
-{
-double tmp;
-
-    tmp = 0;
-
-    tmp = c1+c2*in+c3*(in*in);
-
-    return((t1-25)*(t1+t2*in)+tmp);
-}
+#define USBGEIGER_VENDOR  0x1774
+#define USBGEIGER_PRODUCT 0x1002
 
 void dump(unsigned char *in, int length)
 {
@@ -82,6 +47,34 @@
 
 }
 
+int calccount(unsigned char *in, int length)
+{
+int i, d, s;
+d = s = 0;
+
+    for(i=length;i>0;i--){
+      if(i<5){
+       d = in[i-1] * pow(16,(i-1)*2);
+       s = s + d;
+        }
+    }
+    return s;
+}
+
+int calctimer(unsigned char *in, int length)
+{
+int i, d, s;
+d = s = 0;
+
+    for(i=length;i>0;i--){
+      if(i>4){
+       d = in[i-1] * pow(16,(i-5)*2);
+       s = s + d;
+        }
+    }
+    return s;
+}
+
 struct usb_device *searchdevice(unsigned int vendor, unsigned int product, int num)
 {
 struct usb_bus *bus;
@@ -113,7 +106,7 @@
 
     count=0;
 
-    puts("listing:USBRH");
+    puts("listing:USBGEIGER");
 
     for (bus = usb_get_busses(); bus; bus = bus->next){
         for (dev = bus->devices; dev; dev = dev->next){
@@ -132,14 +125,16 @@
 
 void usage()
 {
-    puts("USBRH on Linux 0.05 by Briareos\nusage: usbrh [-vthm1fl]\n"
+    puts("USBGEIGER on Linux 0.00 by Masaki Kamimura\n(originally published as USBRH on Linux by Mr. Briareos)\n\nusage: usbgeiger [-vthm1cfls]\n"
          "       -v : verbose\n"
-         "       -t : temperature (for MRTG2)\n"
-         "       -h : humidity (for MRTG2)\n"
-         "       -m : temperature/humidity output(for MRTG2)\n"
+         "       -t : counter (for MRTG2)\n"
+         "       -h : timer (for MRTG2)\n"
+         "       -m : counter/timer output(for MRTG2)\n"
          "       -1 : 1-line output\n"
+         "       -c : csv\n"
          "       -fn: set device number(n>0)\n"
-         "       -l : Device list\n" );
+         "       -l : Device list\n"
+         "       -sn: set sleep duration in n msec (default: 100ms)\n" );
 }
 
 int main(int argc, char *argv[])
@@ -148,24 +143,26 @@
 usb_dev_handle *dh;
 char buff[512];
 int rc;
-int iTemperature, iHumidity, opt;
-double temperature, humidity;
+int opt;
+int iCounter, iTimer;
 unsigned char data[8];
-char flag_v, flag_t, flag_h, flag_d, flag_f, flag_1line, flag_mrtg, flag_l;
+char flag_v, flag_t, flag_h, flag_d, flag_f, flag_1line, flag_mrtg, flag_l, flag_c;
 char tmpDevice[8];
 int  DeviceNum;
+unsigned long sleep_usec;
 
     dev = NULL;
     dh = NULL;
     rc = 0;
     DeviceNum = 1;
-    flag_f = flag_v = flag_t = flag_h = flag_d = flag_1line = flag_mrtg = flag_l = 0;
-    temperature = humidity = 0;
+    flag_f = flag_v = flag_t = flag_h = flag_d = flag_1line = flag_mrtg = flag_l = flag_c = 0;
+    counter = timer = 0;
+    sleep_usec = 1000 * 1000;
     memset(buff, 0, sizeof(buff));
     memset(data, 0, sizeof(data));
     memset(tmpDevice, 0, sizeof(tmpDevice));
 
-    while((opt = getopt(argc, argv,"lvth1dmf:?")) != -1){
+    while((opt = getopt(argc, argv,"lcvth1dmf:s:?")) != -1){
         switch(opt){
             case 'v':
                 flag_v = 1;
@@ -196,6 +193,12 @@
             case 'l':
                 flag_l = 1;
                 break;
+           case 's':
+               sleep_usec = atoi(optarg) * 1000;
+               break;
+           case 'c':
+               flag_c = 1;
+               break;
             default:
                 usage();
                 exit(0);
@@ -208,20 +211,20 @@
     usb_find_devices();
 
     if(flag_l){
-        listdevice(USBRH_VENDOR, USBRH_PRODUCT);
+        listdevice(USBGEIGER_VENDOR, USBGEIGER_PRODUCT);
         exit(0);
     }
 
     if(flag_d)
         usb_set_debug(5);
 
-    if((dev = searchdevice(USBRH_VENDOR, USBRH_PRODUCT, DeviceNum)) == (struct usb_device *)NULL){
-        puts("USBRH not found");
+    if((dev = searchdevice(USBGEIGER_VENDOR, USBGEIGER_PRODUCT, DeviceNum)) == (struct usb_device *)NULL){
+        puts("USBGEIGER not found");
         exit(1);
     }
 
     if(flag_d){
-        puts("USBRH is found");
+        puts("USBGEIGER is found");
     }
     dh = usb_open(dev);
     if(dh == NULL){
@@ -230,15 +233,21 @@
     }
 
     if((rc = usb_set_configuration(dh, dev->config->bConfigurationValue))<0){
-        puts("usb_set_configuration error");
-        usb_close(dh);
-        exit(3);
-    }
-
+      if((rc = usb_detach_kernel_driver_np(dh, dev->config->interface->altsetting->bInterfaceNumber))<0){
+       printf("usb_detach_kernel_driver_np error: %s\n", usb_strerror());
+       usb_close(dh);
+       exit(3);
+      }else{
+       if((rc =usb_set_configuration(dh, dev->config->bConfigurationValue))<0){
+         printf("usb_set_configuration error: %s\n", usb_strerror());
+         usb_close(dh);
+         exit(3);
+       }
+      }
+   }
     if((rc =usb_claim_interface(dh, dev->config->interface->altsetting->bInterfaceNumber))<0){
-        //puts("usb_claim_interface error");
         if((rc = usb_detach_kernel_driver_np(dh, dev->config->interface->altsetting->bInterfaceNumber))<0){
-            puts("usb_detach_kernel_driver_np error");
+           printf("usb_detach_kernel_driver_np error: %s\n", usb_strerror());
             usb_close(dh);
             exit(4);
         }else{
@@ -266,47 +275,50 @@
 
     // usb_control_msg() is successed
     if(rc>=0){
-        sleep(1);
+        usleep(sleep_usec);
 
         // Read data from device
-        rc = usb_bulk_read(dh, 1, buff, 7, 5000);
+       rc = usb_bulk_read(dh, 1, buff, 7, 5000);
         if(flag_d){
             if(rc<0){
                 puts("usb_bulk_read error");
             } else {
-                printf("usb_bulk_read:[%d] bytes readed.\n", rc);
+                printf("usb_bulk_read:[%d] bytes read.\n", rc);
                 dump(buff, rc);
             }
         }
+
+       iCounter = calccount(buff, rc);
+       iTimer = calctimer(buff,rc);
 
-        iTemperature = buff[2]<<8|(buff[3]&0xff);
-        iHumidity = buff[0]<<8|(buff[1]&0xff);
         if(flag_d){
-            printf("convert to integer(temperature):[%02x %02x] -> [%04x]\n", buff[2], buff[3], iTemperature);
-            printf("convert to integer(humidity):[%02x %02x] -> [%04x]\n", buff[0], buff[1], iHumidity);
+
+          printf("Counter: %d\n", iCounter);
+         printf("Timer: %d\n", iTimer);
         }
-        temperature = convert_temp(iTemperature);
-        humidity    = convert_humidity(iHumidity);
     }
 
     // Display Result
     if(flag_v){
-        printf("Temperature: %.2f C\n", temperature);
-        printf("Humidity: %.2f %\n", humidity);
+        printf("Counter: %d \n", iCounter);
+        printf("Timer: %d \n", iTimer);
     }else
     if(flag_t){
-        printf("%.2f\n%.2f\n\nTemperature\n", temperature, temperature);
+        printf("%d\n%d\n\nCounter\n", iCounter, iCounter);
     }else
     if(flag_h){
-        printf("%.2f\n%.2f\n\nHumidity\n", humidity, humidity);
+        printf("%d\n%d\n\nTimer\n", iTimer, iTimer);
     }else
     if(flag_mrtg){
-        printf("%.2f\n%.2f\n\nTemperature/Humidity\n", temperature, humidity);
+        printf("%d\n%d\n\nCounter/Timer\n", iCounter, iTimer);
+    }else
+    if(flag_c){
+        printf("%d,%d\n", iCounter, iTimer);
     }else
     if(flag_1line){
-        printf("Temperature: %.2f C Humidity: %.2f %%\n", temperature, humidity);
+        printf("Counter:%d Timer:%d \n", iCounter, iTimer);
     }else
-        printf("%.2f %.2f\n", temperature, humidity);
+        printf("%d %d\n", iCounter, iTimer);
 
     if((rc = usb_release_interface(dh, dev->config->interface->altsetting->bInterfaceNumber))<0){
         puts("usb_release_interface error");
カテゴリー: プログラミング, 自宅サーバ タグ:

あのgomiteが新製品を

2011 年 7 月 27 日 コメントはありません

 

iPod touch用GPSを製品化するということで話題になっていたgomiteですが、GPSの商品化はいつの間にか立ち消えてしまっておりましたが、久しぶりにサイトが更新され、The tiltpodというコンデジ用の三脚的なものがリリースされるようです。

 

The tiltpodは磁力を用いたボールジョイントでフレーミングを決めやすく、携帯するのが楽ちんな三脚的撮影補助ツールのようです。

 

カテゴリー: camera, いろいろ タグ:

Chrome用電力使用モニター拡張 DENRYOKUモニターVer1.15

2011 年 7 月 19 日 コメントはありません

電力使用状況データを取得し、表示します。電気の使い方の参考にご利用下さい。サーバー側を大幅に修正し、なるべくリアルタイムの数値を確認できるようにしました。東北電力で短期間更新データを提供しているChromeエクステンションは少ないのではないかと思います。

【Ver1.15の変更点】
従来、Yahoo! JAPANのAPIを使用していましたが、自サーバで電力会社各社のCSVデータを取得するものに変更。

東北電力、東京電力は現在時刻より10分程度の遅延で取得可能。関西電力はデータ更新が遅いのでもう少しかかっているようです。中部電力は1時間ごとのデータしか配信していないため、従来と変わらない更新間隔になっています。

※注意※
深夜0時の各社ファイル更新の狭間でデータが表示できなくなっているのに昨夜ベッドで気づきましたが、取り急ぎ公開いたしました。今晩、取得プログラムを修正して、問題なければよいのですが、今晩もまた0時過ぎに取得・更新に失敗すると直しはまた翌日ということになります。

DENRYOKUモニター – Chrome Web Store

カテゴリー: DENRYOKUモニター タグ: