-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrevgraph.pl
108 lines (80 loc) · 2.23 KB
/
revgraph.pl
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
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Net::MQTT::Simple;
use Net::Graphite;
# Setup mqtt connection
my $mqtt = Net::MQTT::Simple->new('revspace.nl');
# Setup mqtt connection
my $graphite = Net::Graphite->new(
host => '127.0.0.1',
port => 2003,
trace => 0,
proto => 'tcp',
timeout => 1,
fire_and_forget => 1,
return_connect_error => 0
);
my %topics;
# "Connect" to graphite
$graphite->connect;
# subscribe to sensors with weird topics
$mqtt->subscribe(
"revspace/sensors/+" => sub {
my ($topic, $message) = @_;
my $since = $topics{$topic} ? ( time() - $topics{$topic} ) : ( time() - 0 );
my ($type) = $topic =~ /revspace\/sensors\/(.*)/;
($message) = $message =~ m{(\d+(?:\.\d+)?)};
my $graphite_path = "revgraph.sensor.$type.general.0";
$graphite->send(
path => $graphite_path,
value => $message,
time => time(),
) unless $since > 1800;
$topics{$topic} = time();
}
);
$mqtt->subscribe(
"revspace/sensors/co2/mhz19" => sub {
my ($topic, $message) = @_;
my $since = $topics{$topic} ? ( time() - $topics{$topic} ) : ( time() - 0 );
($message) = $message =~ m{(\-?\d+(?:\.\d+)?)};
$graphite->send(
path => 'revgraph.sensor.co2.mhz19.0',
value => $message,
time => time(),
) unless $since > 1800;
$topics{$topic} = time();
}
);
# subscribe to standard sensor topics
$mqtt->subscribe(
"revspace/sensors/+/+/+" => sub {
my ($topic, $message) = @_;
my $since = $topics{$topic} ? ( time() - $topics{$topic} ) : ( time() - 0 );
my ($type, $room, $id) = $topic =~ /revspace\/sensors\/([^\/]+)\/([^\/]+)\/([^\/]+)/;
($message) = $message =~ m{(\-?\d+(?:\.\d+)?)};
my $graphite_path = "revgraph.sensor.$type.$room.$id";
$graphite->send(
path => $graphite_path,
value => $message,
time => time(),
) unless $since > 1800;
$topics{$topic} = time();
}
);
# subscribe to open/closed space
$mqtt->subscribe(
"revspace/state" => sub {
my ($topic, $message) = @_;
$message = $message eq 'open' ? 1 : 0;
$graphite->send(
path => "revgraph.state",
value => $message,
time => time(),
);
}
);
# Run this thing
$mqtt->run;