アーカイブ

‘自宅サーバ’ カテゴリーのアーカイブ

関連投稿を表示するプラグイン Yet Another Related Posts Plugin

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

長らく愛用させていただいていたWordPress Related Post for Japanese (関連投稿表示プラグイン)がどうもうまく動作しないため、格闘していましたが、断念し、Yet Another Related Posts Pluginを試しているところです。

あちこちのサイトでは細かい設定ページが表示されているのに、私の設定画面にはでてこないなーと調べていたら、WordPress › Support » [Plugin: Yet Another Related Posts Plugin] where are these settings??という記事を発見しました。「表示オプション」でデフォルトで表示しない設定になっていました。

しかしやっぱり日本語にはWordPress Related Post for Japanese (関連投稿表示プラグイン)のほうがよさそうなので再度チャレンジしてみます。

追記

WordPress Related Post for Japanese (関連投稿表示プラグイン)ですが、WordPressのプラグイン,JRelatedがうまく動かない | Life in Los Alamosを読んで実践してみたところ、見事復活しました。

テーブルは勇み足でdropしてしまっていたのですが、再度テーブルを作ってくれないので手作業で復旧。やっぱりJRelatedは精度がよいです。WordPressのプラグイン,JRelatedがうまく動かない | Life in Los Alamosの記事に大感謝です。

カテゴリー: WordPress, 自宅サーバ タグ:

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");
カテゴリー: プログラミング, 自宅サーバ タグ:

CentOS5.2でPT1を録画予約(Express 5800/110Ge)

2009 年 3 月 21 日 コメントはありません

追記

下記の状態のままずっと稼働させてきたのですが、WOWOWのチャンネル再編成につき、PT1のドライバとrecpt1を再コンパイルしました。現在は情報が非常に豊富でとても簡単に作業できました。下記は一応、記録として残しておきますが、現状では役に立たないと思います。

なお、コピペでできる録画サーバー on Linux with PT2 (recpt1 録画編) – GeekなNooblogが大変参考になりました。なお、最新チャンネル関連のファイルはepgrec プロジェクト日本語トップページ – SourceForge.JP2011年10月1日からのBS新チャンネル対応ファイル群よりダウンロードさせて頂きました。ありがとうございました。

追記ここまで。


とりあえず、Friioでは録画予約できるようになったのですが、PT1が放置状態でしたので、この休み中になんとかすべく格闘してました。【視聴・録画】Linuxでテレビ総合【デジタル/アナログ】スレの252さんが作ってくださったPT1用ドライバ・ツールを持ってきて、makeします。252さん版にはREADMEがないので、tomyさんのほうを参考にしました。

252さん版は–b25オプションを付加できるようにしてあるので、まずarib25をmakeします。/usr/local/libだと(自分の能力では)うまく作れなかったので、すっきりしないですが、/arib25v023/arib25/srcのMakefileのPREFIX =/usr/local/を/usr/に変更して、/usr/lib/にインストールすることにしました。で、まずこちらをmake allでmake installしてから、次はドライバをmakeこちらは簡単。tomyさんのREADME

モジュール、ツールのビルド、デバイスファイル作成手順は以下の通りです。

1. モジュールの作成
$ make -C /lib/modules/`uname -r`/build M=`pwd` V=1
2. 作成したモジュールのコピー
#cp pt1_drv.ko /lib/modules/`uname -r`/kernel/drivers/video/pt1_drv.ko
#depmod -a
3. モジュールのロード
#modprobe pt1_drv

4.udev設定
Ubuntuなら/etc/udev/rules.d/40-permissions.rulesに、Debian lennyなら/etc/udev/rules.d/91-permissions.rulesに、

SUBSYSTEM==”pt1video”, MODE=”0644″,GROUP=”video”

を追加ればOK。

KERNEL==”pt[0-9]*”, GROUP=”tape”

より後ろに追加すること。

を参考にしました。私はfriioのときと同様に自作の/etc/udev/rules.d/98-local.rulesに

#PT1
SUBSYSTEM==”pt1video”,
MODE=”0664″, GROUP=”video”

と追記。

それからrecpt1をmake allしてmake install。

ls -al /dev/*pt1*
crw-rw-r– 1 root video 253, 0 3月 3 20:29 pt1video0
crw-rw-r– 1 root video 253, 1 3月 3 20:29 pt1video1
crw-rw-r– 1 root video 253, 2 3月 3 20:29 pt1video2
crw-rw-r– 1 root video 253, 3 3月 3 20:29 pt1video3

となっています。録画はrecpt1 –b25 22 10 ./test.tsでOKですが、BS/CSのチャンネル指定方法がrecfriioと異なりますので、recfriio serverのチャンネル設定は

$CHANNEL = array(
“22″ => “NHK総合・神戸”,
“13″ => “NHK教育1・大阪”,
“26″ => “サンテレビ”,
“16″ => “MBS毎日放送”,
“15″ => “ABCテレビ”,
“17″ => “関西テレビ”,
“14″ => “よみうりテレビ”,
“151″ => “BS-Asahi”,
“161″ => “BS-i”,
“191″ => “WOWOW”,
“171″ => “BS-Japan”,
“211″ => “BS11″,
“200″ => “Star Channel”,
“222″ => “TwellV”,
“141″ => “BS-NTV”,
“181″ => “BS-Fuji”,
“101″ => “NHK BS1″,
“102″ => “NHK BS2″,
“103″ => “NHK hi”
);

としました。それから、config.phpでrecpt1のパスを記述。

// recfriio までのフルパス
//define( ‘RECFRIIO’, ‘/usr/local/bin/recfriio’ );
define( ‘RECFRIIO’, ‘/usr/local/bin/recpt1′ );

define( ‘FRIIOOPT’, ‘–b25′ );

以上で動作するようになりました。さらにBS/CS録画時にLNB給電するために、driver/pt1_pci.cを

static int lnb = LNB_15V;

として、モジュールを再度コンパイルして、インストールしました。これでRD-XS57はスカパー専用機になってしまいました。

自分のようなタコ野郎でもLinuxでPT1を使えるのはひとえに作者の皆様方のおかげです。ありがとうございます。地デジ・BS/CSには録画したいものはないのですけど。。。

追記(2009.5.10)

BSでの録画は完璧なのですが、地上波でいつも失敗する(ファイルが1GB程度までしか生成されない。もしくは0KBになってしまう)ので、driver/pt1_pci.cを二ちゃん参考に書き換えました。

#define DMA_RING_SIZE 14 // RINGサイズ

としてみました。地上波はほとんど録画することもないので、放置でもよかったのですが、清志郎特番を録っておきたくて。とりあえず今のところは大丈夫っぽいのですが。。。

追記(2009.5.10)

どうやら上記変更は関係ないみたいで、相変わらず1GB付近で録画停止になってしまう。原点に立ち返り、配線周りを見直し、アンテナ側からの分波・分配器の順序を変えてみたところ、シグナルも上がってうまくいったっぽいかなというところです。

追記(2009.5.24)

上記5/10付けの追記以降、非常に快調に録画できています。清志郎特番でフジテレビ『This Time忌野清志郎』が関西では録画できなかったのが残念ですが、他は問題なく録画できてほっとしております。次はパケット飛ばしでのリアルタイム視聴に挑戦してみたいと思います。

カテゴリー: 自宅サーバ タグ: , , , , ,