ブログパーツ レンタルCGI
TAKAさんの毎日が発見・ブログ
アマチュア無線の機器製作を中心にした日常の活動記録です (by Taka JA2GRC、このブログはFC2_BLOGを使わせていただいてます。)
≪05月   2017年06月   07月≫
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  
Munin
 Xively も便利なのですが、一般的にクラウドコンピューティングと言われている分野は、サーバー側の対応が終わってしまえばそれまでになる訳で、何となく不安です。 そんな訳でXively に代わるロギング手段を準備して置こうかなと思っています。
 一時は(現在もそうですが)ネットワークストレージと言うのが大々的に喧伝されていましたが、一部の経営的に不安定なネットワークストレージを使っていて、突然終了なんてなって痛い目に遭うこともあったみたいです。 ネットワークロギングシステムも、現在はXivelyとなっていますが、元々はPchubeで始まって、その後、Cosmに買収され、現在はXivelyとなっている訳で、必ずしも安定した運用とは言い切れない経過ですね。

 そんなんで、安定なロギングシステムとなると、「自前」でやるのが一番確実なんで、この方面で探してみましたら、身近にMuninと言うシステムが有ることに気がつきました。 元々はLunuxのシステム運用情報をロギングするシステムのようで、ネットワークからのロギングや、逆にロギング結果のネットワークからの参照なども準備されているようです。

 実は、Muninはかなり以前に触ったことが有りましたが、その時はそれで終わっていました。 その時はRaspberry Pi で動かしていたのですが、Muninのサーバーも、センサー端末も、ログデータの閲覧も全てRaspberry Pi 上で実行されていて、ネットワークからのデータ取り込みとか、ネットワークからのログデータ参照とかまでは広げていませんでした。

160323_munin_01.jpg

 で、やりたいのは、センサー端末からネットワーク経由でデータを取り込み、連続運転のMuninサーバでセンサーデータをロギングし、ネットワーク経由でMuninサーバにアクセスしてロギングデータを読み込むという事です。 例によって使えそうな物をネットで探していたら、ピッタリの実例がありました。 Arduino側は聞き慣れないセンサーを使っていましたが、ここをLM35用に単純化してテストしてみました。

#include <Ethernet.h>

// assign a MAC address for the ethernet controller.
// fill in your address here:
// MAC address for your Ethernet shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// assign an IP address for the controller:
IPAddress ip(192,168,0,33);
IPAddress gateway(192,168,0,3);	
IPAddress subnet(255, 255, 255, 0);
// Initialize the Ethernet server library with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

int sensorValue_temp = 0;   //value read from pin_temp
float offset = 0;       //offset 424mv
float vc = 0.01;         //+6.25mv/1℃
float vref = 5.0;           //デフォルト参照電圧5V=電源電圧

void setup() {
  Serial.begin(9600);
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  // give the sensor and Ethernet shield time to set up:
  delay(3000);
}

void loop() { 
  // listen for incoming Ethernet connections:
  listenForEthernetClients();
}

void listenForEthernetClients() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("Got a client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // if you've gotten to the end of the line (received a newline character)
        // and the line is blank, the http request has ended, so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          // print the current readings, in HTML format:
          client.print("Sensor1.value ");
          Serial.print("Sensor1 : " );
          client.print(get_temp(A1));
          client.print("
"); client.print("Sensor2.value "); Serial.print("Sensor2 : " ); client.print(get_temp(A2)); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1000); // close the connection: client.stop(); } } float get_temp(int pin_temp){ sensorValue_temp = analogRead(pin_temp); float v_temp = sensorValue_temp * vref / 1024; float temp = (v_temp - offset) / vc; //電圧から温度に変換 Serial.print("Port = " ); Serial.print(pin_temp); Serial.print("\t LM35 = " ); Serial.print(sensorValue_temp); Serial.print("\t Volt = " ); Serial.print(v_temp,4); Serial.print("\t TEMP = "); Serial.println(temp); return(temp); }

 Arduino側は単純に測定値をwebサーバとして表示するだけです。

160323_munin_02.jpg

 そして、このwebサーバ上の測定データを取り込むMuninプラグインも少し修正しました。

#!/usr/bin/perl
=head1 NAME
arduinotemp - Munin plugin to receive temperature from an Arduino running a webserver.

=head1 CONFIGURATION
ln -s /usr/share/munin/plugins/arduinotemp /etc/munin/plugins/arduinotemp

Set the $ipAddress variable below.
Set the $tempx variables below to give each temp a graph title.

=cut

use LWP::Simple;

# URL to use.
$address = "http://192.168.0.33/";
# Don't use spaces in the array below.
# Name the sensors in order in the array.
@tempName = ("Sensor1","Sensor2");

if($ARGV[0] eq "config"){
	# Configuration for the main page graph.
	print "multigraph temperature\n";
	print "graph_title Temperature\n";
	print "graph_vlabel degrees\n";
	print "graph_category sensors\n";
	for my $temp (@tempName){
		print "$temp.label $temp\n";
	}
	
	print "\n";

	# Configuration for the individual graphs.
	for my $temp (@tempName){
		print "multigraph temperature.$temp\n";
		print "graph_title $temp Temperature\n";
		print "$temp.label $temp\n\n";
	}
	exit;
}

# Get the data
$sensorDatum = get($address);

# Parse the data
@sensorData = split /
/, $sensorDatum; # Print the main graph. print "multigraph temperature\n"; $i = 0; for my $temp (@tempName){ print "$sensorData[$i]\n"; $i++; } print "\n"; $i = 0; for my $temp(@tempName){ print "multigraph temperature.$temp\n"; print "$sensorData[$i]\n"; $i++; } print "\n";

 これで、何とかMuninに測定データを取り込むことが出来る様になりました。 これで、ロギングデータ収集は、センサー(LM35)→Arduino (with Ethernet shield)→[LAN経由]→Raspberry Pi(Munin) と言う経路で、ログデータの参照は、Raspberry Pi(Munin))→[LAN経由]→メインパソコン(ブラウザ)という経路で出来る様になりました。 今のところ、家庭内LAN内だけで、外部からはアクセスできませんが。

160323_munin_03.jpg
コメント
この記事へのコメント
URL :
コメント :
パスワード :
管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
Template designed by アクセラと+αな生活

Powered by まとめ .