Ich wollte via Munin meine Herde von DS18S20-Sensoren in Graphen malen lassen, dazu habe ich mir ein eigenes Munin-Plugin geschrieben.
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
So sehen die gezeichneten Graphen dann in der Praxis aus.
Auf dem Munin-Rechner muss Ruby installiert sein, da es sich beim Plugin um ein Ruby-Skript handelt.
#!/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