OWFS-Temperatursensoren mit Munin überwachen

Ich wollte via Munin meine Herde von DS18S20-Sensoren in Graphen malen lassen, dazu habe ich mir ein eigenes Munin-Plugin geschrieben.

Aufbau und Konfiguration

Die Temperatur-Sensoren hängen an einem DS9490R Busmaster. Dieser ist wiederum via USB mit dem Munin-Rechner verbunden. Auf dem Rechner installierte ich mir OWFS. Zusätzlich vergab ich meinen Sensoren im owfs Alias-Namen, um sie leichter zuzuordnen zu können. Wie das geht steht hier.

Hier meine aliases.txt, die Sensoren-IDs sind gekürzt wiedergegeben.

1003FA4801080098=10.heaterfwd
1044XXXXXXXXXXXX=10.ovencore
1047XXXXXXXXXXXX=10.buffer1
1049XXXXXXXXXXXX=10.solarback
1055XXXXXXXXXXXX=10.ovenpellet
105DXXXXXXXXXXXX=10.buffer6
1061XXXXXXXXXXXX=10.buffer0
10A7XXXXXXXXXXXX=10.heaterback
10A8XXXXXXXXXXXX=10.solarfwd
10B0XXXXXXXXXXXX=10.buffer4
10B7XXXXXXXXXXXX=10.ovenfwd
10BCXXXXXXXXXXXX=10.buffer3
10BFXXXXXXXXXXXX=10.buffer5
10E1XXXXXXXXXXXX=10.buffer2
10EFXXXXXXXXXXXX=10.ovenback
10FEXXXXXXXXXXXX=10.warmwater

Wie man sieht, habe zusammengehörende Sensoren, gleich benannt und hochgezählt oder anhand ihrer Messstelle (fwd = Vorlauf, back=Rücklauf) benannt. Das ermöglicht es mir, sie mit meinem Munin-Plugin gruppiert darzustellen. Das Plugin wird nach /usr/share/munin/plugins/ kopiert. Danach werden Links auf dieses Plugin im Verzeichnis /etc/munin/plugins/ erzeugt.

Hier der Auszug aus dem Verzeichnis /etc/munin/plugins/ für meine Sensorenkonfiguration.

/etc/munin/plugins/owfs_temp_10.buffer -> /usr/share/munin/plugins/owfs_temp_
/etc/munin/plugins/owfs_temp_10.heater -> /usr/share/munin/plugins/owfs_temp_
/etc/munin/plugins/owfs_temp_10.oven -> /usr/share/munin/plugins/owfs_temp_
/etc/munin/plugins/owfs_temp_10.solar -> /usr/share/munin/plugins/owfs_temp_
/etc/munin/plugins/owfs_temp_10.warmwater -> /usr/share/munin/plugins/owfs_temp_

Damit gruppiere ich anhand der Aliase verschiedene Sensoren in Graphen. Ich kann so später auch problemlos weitere Sensoren hinzufügen, ohne dass ich das Plugin anfassen muss. Einfach neuen Sensor an den Bus anklemmen in der aliases.txt entsprechend bezeichnen und das war es.

Da man in den Graphen noch schöne Bezeichnungen haben möchte, kann man in der Konfigurationsdatei /etc/munin/plugin-conf.d/munin-node zusätzlich die entsprechenden Variablen bestücken. Das muss man nicht machen, aber ich finde es schöner wenn im Graphen „Puffersensor 1“ statt „buffer0“ steht.

Hier wiederum die Konfiguration aus meiner munin-node-Datei

[owfs_temp_10.buffer]
env.owfsdir /mnt/1wire
env.10.buffer0 Puffersensor 1 (unten)
env.10.buffer1 Puffersensor 2
env.10.buffer2 Puffersensor 3
env.10.buffer3 Puffersensor 4
env.10.buffer4 Puffersensor 5
env.10.buffer5 Puffersensor 6
env.10.buffer6 Puffersensor 7 (oben)
env.info Temperaturen des Warmwasser-Pufferspeichers
env.title Pufferspeicher
env.vlabel °C

[owfs_temp_10.oven]
env.owfsdir /mnt/1wire
env.10.ovenfwd Ofenvorlauf
env.10.ovenback Ofenruecklauf
env.10.ovenpellet Pelleteinwurf
env.10.ovencore Kesseltemperatur
env.info Temperaturen des Pellino Kombi
env.title Ofen
env.vlabel °C

[owfs_temp_10.warmwater]
env.owfsdir /mnt/1wire
env.10.warmwater Zirkulationsruecklauf
env.info Temperaturen der Warmwasserzirkulation
env.title Warmwasser
env.vlabel °C

[owfs_temp_10.heater]
env.owfsdir /mnt/1wire
env.10.heaterback Heizungsruecklauf
env.10.heaterfwd Heizungsvorlauf
env.info Temperaturen des Heizkreislaufs
env.title Heizkreislauf
env.vlabel °C

[owfs_temp_10.solar]
env.owfsdir /mnt/1wire
env.10.solarback Solarruecklauf
env.10.solarfwd Solarvorlauf
env.info Temperaturen des Solarkreislaufs
env.title Solarthermie
env.vlabel °C

Beispiel-Graphen

So sehen die gezeichneten Graphen dann in der Praxis aus. Warmwasserpuffer Tagesansicht

Warmwasserpuffer Jahresansicht

Solarthermieanlage Tagesübersicht

Munin-Plugin

Auf dem Munin-Rechner muss Ruby installiert sein, da es sich beim Plugin um ein Ruby-Skript handelt.

owfs_temp_
#!/usr/bin/env ruby
@burps = <<-'=cuthere'
 
=head1 NAME
 
owfs_temp_ - Munin plugin to monitor temperature sensors via owfs.
 
=head1 APPLICABLE SYSTEMS
 
Systems with a running OWFS installation
 
=head1 USAGE
 
This script can show multiple sensors in one graph. It will 
automatically detect if the owfs sensor name matches multiple sensors. 
 
Simply link to the owfs_temp_ script and add your sensor name:
 
 ln -s /usr/share/munin/plugins/owfs_temp_ /etc/munin/plugins/owfs_temp_10.
 
This will show all temperature sensors (type 10) in one graph. The script scans the
owfs directory for all sensors that match 10.*. In case you're using 
aliases, you can group sensors in one graph:
 
 ln -s /usr/share/munin/plugins/owfs_temp_ /etc/munin/plugins/owfs_temp_kitchen
 ln -s /usr/share/munin/plugins/owfs_temp_ /etc/munin/plugins/owfs_temp_outside
 
This means that the kitchen sensor will be shown one graph and outside1 and outside2 will 
be shown together in another graph.
 
=head1 CONFIGURATION
 
This plugin uses the following environment variables:
 
=item owfsdir
specify the one wire filesystem directory
 
=head2 CONFIGURATION EXAMPLE
 
  [owfs_temp_kitchen]
  env.owfsdir /mnt/1wire
  env.title Kitchen
  env.vlabel °C
  env.room Kitchen
  env.info Temperature in kitchen
 
Without aliases:
 
  [owfs_temp_10.*]
  env.owfsdir /mnt/1wire
  env.title Temperatures
  env.vlabel °C
  env.10.00000000 Outside
  env.10.00000001 Room A
  env.10.00000002 Room B
  env.info All my temperature sensors
 
=head1 AUTHORS
 
Björn 2011
 
=head1 LICENSE
 
GPLv3
=cuthere
 
# error reporting
err = IO.new(2, "w")
 
# grab env variables
@owfsdir = ENV.member?('owfsdir') ? ENV['owfsdir']: "/mnt/1wire"
if !File.directory?(@owfsdir)
        err.puts "#{@owfsdir} doesn't exist or isn't a directory"
end
 
# grab sensor name(s)
sensors = Array.new
sensorname = $0.gsub /.*\/owfs_temp_/, ""
Dir.foreach( @owfsdir ) do |entry| 
        if entry =~ /#{sensorname}/ 
                sensors.push(entry) 
        end
end
sensors.sort!
 
# config
if ARGV[0] == "config"
        print "graph_title "
        puts ENV.member?('title') ? ENV['title'] : "OWFS Temperature Sensors"
        print "graph_vlabel "
        puts ENV.member?('vlabel') ? ENV['vlabel'] : "Temperature"
        puts "graph_category homeautomation"
        print "graph_info "
        puts ENV.member?('info') ? ENV['info'] : "Monitor some temperature sensors via onwire file system (owfs)"
        sensors.each do |sensor|                
                print "#{sensor.gsub(".","_")}.label " 
                puts ENV.member?(sensor) ? ENV[sensor] : sensor
        end
exit
end
 
# output data
sensors.each do |sensor| 
        filename = @owfsdir + "/" + sensor + "/temperature"
        if File.file?(filename)
                sensorinput = (File.open(filename, &:readline).strip!).to_f
                if (sensorinput != 85 && sensorinput > -40 && sensorinput < 200 )
                        puts sensor.gsub(".","_") + ".value " + sensorinput.to_s
                end
        else
                err.puts "#{@owfsdir} doesn't exist or isn't readable"
        end
end
Anmelden