Didactum Monitoring & Munin Integration
Complete step-by-step guide for integrating Didactum Monitoring devices and sensors into Munin via SNMP – including plugin symlinks, plugin configuration, complete custom Perl plugin file for all sensor types (Temperature, Leakage, Humidity, Door Contact, Smoke) and email alerting.
Architecture Note: SNMP plugins are activated on the Munin node machine as an SNMP gateway. Both munin and munin-node run on this node. The SNMP plugins are activated via symlinks in /etc/munin/plugins, with the name of the host being monitored inserted between the first two underscores.
- Software: Munin 2.x (munin-master + munin-node)
- Plugin Language: Perl (Munin::Plugin::SNMP module)
- Protocol: SNMP v1 / v2c / v3
- Devices: Didactum Monitoring System 100T / 300T / 500T / 550T
- Sensors: Temperature, Leakage, Humidity, Door Contact, Smoke
1. Prerequisites & System Overview
Munin Server
- Ubuntu 20.04 / 22.04 LTS or Debian 11/12
- munin and munin-node installed
- Perl modules libsnmp-session-perl and libnet-snmp-perl installed
- Packages: snmp, snmp-mibs-downloader
- UDP Port 161 outbound for SNMP Polling opened
- Network access to the Didactum device
Didactum Device
- Monitoring System 100T, 300T, 500T or 550T
- SNMP enabled (v2c recommended)
- Device reachable via network from the Munin server
- MIB file available in the Web Interface
Important Munin Directories
/etc/munin/munin.conf <-- Main configuration (hosts, groups) /etc/munin/plugin-conf.d/ <-- Plugin-specific configuration (Community, Env variables) /etc/munin/plugins/ <-- Active plugins (symlinks) /usr/share/munin/plugins/ <-- Supplied plugins /usr/local/share/munin/plugins/ <-- Place custom plugins here /var/lib/munin/ <-- RRD database and graphs /var/log/munin/ <-- Log files
Munin SNMP Plugin Naming Convention
SNMP plugins are named in the format snmp_HOSTNAME_METRIC. The hostname of the device being monitored is inserted between the first two underscores. Example: snmp_didactum01_temperature monitors the temperature of the device named "didactum01".
2. Enable SNMP on the Didactum Device
Step 1 – Open Web Interface
Open in browser: 192.168.1.50 (adjust Didactum device IP)
Step 2 – Access SNMP Settings
System Settings → SNMP
Step 3 – Enter the following values
| Field in Didactum Web Interface | Value |
|---|---|
| Enable SNMP | Enabled |
| SNMP Version | v2c (recommended) |
| Community String | didactum_munin (do not use „public"!) |
| SNMP Port | 161 |
Save settings.
3. Install Packages & Test SNMP
sudo apt update
sudo apt install -y munin munin-node \
libnet-snmp-perl libsnmp-session-perl \
snmp snmp-mibs-downloader
# Test SNMP connection to the Didactum device
snmpwalk -v 2c -c didactum_munin 192.168.1.50 \
.1.3.6.1.4.1.46501.5.1.1
# Query single temperature value (raw value ÷ 10 = degrees Celsius)
snmpget -v 2c -c didactum_munin 192.168.1.50 \
.1.3.6.1.4.1.46501.5.1.1.7.101001
4. Install MIB File
# Download MIB from Didactum Web Interface:
# System Settings → SNMP → "Download MIB File" → didactum.mib
sudo cp didactum.mib /usr/share/snmp/mibs/
echo "mibdirs /usr/share/snmp/mibs" | sudo tee -a /etc/snmp/snmp.conf
echo "mibs ALL" | sudo tee -a /etc/snmp/snmp.conf
# Test with MIB names
snmpwalk -v 2c -c didactum_munin -m ALL 192.168.1.50 \
DIDACTUM-MIB::sensorValue
5. Munin Host Configuration for Didactum
The Didactum device is entered in munin.conf as a standalone host. Since munin-node performs the SNMP queries through itself as a gateway, address 127.0.0.1 (localhost) is entered as the address of the munin-node.
sudo nano /etc/munin/munin.conf
# ================================================================
# Didactum Monitoring System – Munin Host Configuration
# ================================================================
[Didactum]
# Didactum Monitoring System 01
# address = localhost, because munin-node acts as SNMP gateway
[Didactum;didactum-monitor-01]
address 127.0.0.1
use_node_name no
6. SNMP Plugin Configuration
As a rule, SNMP plugins require site-specific configuration. The default configuration only works on insecure devices. The community string of the devices should not be „public".
sudo nano /etc/munin/plugin-conf.d/didactum
# ================================================================
# Didactum SNMP Plugin Configuration
# File: /etc/munin/plugin-conf.d/didactum
# ================================================================
# Applies to all plugins of the Didactum device
[snmp_didactum-monitor-01_*]
env.host 192.168.1.50
env.port 161
env.version 2
env.community didactum_munin
env.timeout 5
# Temperature sensor specific
[snmp_didactum-monitor-01_didactum_temp]
env.host 192.168.1.50
env.community didactum_munin
env.version 2
env.warning 280
env.critical 350
# Leakage sensor specific
[snmp_didactum-monitor-01_didactum_leak]
env.host 192.168.1.50
env.community didactum_munin
env.version 2
env.critical 1
# Humidity specific
[snmp_didactum-monitor-01_didactum_humidity]
env.host 192.168.1.50
env.community didactum_munin
env.version 2
env.warning 80
env.critical 90
7. Custom Perl Plugin for Didactum Sensors
The following plugin monitors all Didactum sensors in a single plugin. It follows the official Munin SNMP plugin standard with magic markers and the Munin::Plugin::SNMP module.
Create Plugin File
sudo nano /usr/local/share/munin/plugins/snmp__didactum_sensors
#!/usr/bin/perl
# ================================================================
# Munin SNMP Plugin – Didactum Monitoring System
# File: /usr/local/share/munin/plugins/snmp__didactum_sensors
#
# Monitors: Temperature sensor, Leakage, Humidity,
# Door contact, Smoke detector via SNMPv2c
#
# Enterprise OID (older devices): .1.3.6.1.4.1.46501
# Enterprise OID (newer devices): .1.3.6.1.4.1.39052
#
# Configuration in /etc/munin/plugin-conf.d/:
# [snmp_HOSTNAME_didactum_sensors]
# env.host 192.168.1.50
# env.community didactum_munin
# env.version 2
# env.warning_temp 280 (= 28.0 degrees C – raw value x10)
# env.critical_temp 350 (= 35.0 degrees C – raw value x10)
#
# IMPORTANT – Temperature thresholds:
# Didactum delivers temperature as raw value x10.
# 25.5 degrees C = OID value 255.
# Configure warning/critical as raw value x10!
#
# =head1 MAGIC MARKERS
#%# family=snmpauto
#%# capabilities=snmpconf
# ================================================================
use strict;
use warnings;
use Net::SNMP;
use Munin::Plugin;
# ================================================================
# OID definitions
# ================================================================
my $base_oid_old = '1.3.6.1.4.1.46501.5.1.1'; # older devices
my $base_oid_new = '1.3.6.1.4.1.39052.5.1.1'; # newer devices
# Sensor OIDs (adjust sensor ID at the end!)
my %oids = (
'temp_value' => '1.3.6.1.4.1.46501.5.1.1.7.101001',
'temp_status' => '1.3.6.1.4.1.46501.5.1.1.6.101001',
'leak_value' => '1.3.6.1.4.1.46501.5.1.1.7.107001',
'humidity_value'=> '1.3.6.1.4.1.46501.5.1.1.7.102001',
'door_value' => '1.3.6.1.4.1.46501.5.1.1.7.104001',
'smoke_value' => '1.3.6.1.4.1.46501.5.1.1.7.106001',
);
# ================================================================
# Environment variables (from plugin-conf.d)
# ================================================================
my $host = $ENV{host} || '192.168.1.50';
my $port = $ENV{port} || 161;
my $version = $ENV{version} || '2';
my $community = $ENV{community} || 'public';
my $timeout = $ENV{timeout} || 5;
my $warn_temp = $ENV{warning_temp} || 280;
my $crit_temp = $ENV{critical_temp} || 350;
my $warn_hum = $ENV{warning_hum} || 80;
my $crit_hum = $ENV{critical_hum} || 90;
# ================================================================
# snmpconf – for munin-node-configure auto-detection
# ================================================================
if (defined $ARGV[0] and $ARGV[0] eq 'snmpconf') {
# Device detection: check Didactum sysObjectID
print "require 1.3.6.1.4.1.46501.5.1.1.7.101001\n";
exit 0;
}
# ================================================================
# Establish SNMP connection
# ================================================================
my ($session, $error) = Net::SNMP->session(
-hostname => $host,
-port => $port,
-version => $version,
-community => $community,
-timeout => $timeout,
);
if (!defined $session) {
die "# Error: SNMP connection to $host failed: $error\n";
}
# Query OIDs
my $result = $session->get_request(
-varbindlist => [ values %oids ]
);
if (!defined $result) {
die "# Error: SNMP query failed: " . $session->error() . "\n";
}
$session->close();
# ================================================================
# config – Munin graph configuration
# ================================================================
if (defined $ARGV[0] and $ARGV[0] eq 'config') {
print "host_name $host\n";
# --- Temperature Graph ---
print "multigraph didactum_temperature\n";
print "graph_title Didactum Temperature Sensor 01\n";
print "graph_vlabel Degrees Celsius\n";
print "graph_category sensors\n";
print "graph_info Temperature Sensor 01 (raw value divided by 10 = degrees Celsius)\n";
print "temp.label Temperature\n";
print "temp.type GAUGE\n";
print "temp.draw LINE2\n";
print "temp.colour 0000FF\n";
print "temp.warning $warn_temp\n";
print "temp.critical $crit_temp\n";
print "temp.info Raw value of the temperature sensor (x0.1 = degrees C). Warning: " .
($warn_temp/10) . " C, Critical: " . ($crit_temp/10) . " C\n";
# --- Temperature Status Graph ---
print "multigraph didactum_temp_status\n";
print "graph_title Didactum Temp Sensor Status\n";
print "graph_vlabel Status\n";
print "graph_category sensors\n";
print "graph_info Sensor status: 0=OK, 1=Alarm, 2=No Signal\n";
print "status.label Status\n";
print "status.type GAUGE\n";
print "status.draw LINE1\n";
print "status.warning 0.5\n";
print "status.critical 1.5\n";
# --- Leakage Graph ---
print "multigraph didactum_leakage\n";
print "graph_title Didactum Leakage Sensor 01\n";
print "graph_vlabel State\n";
print "graph_category sensors\n";
print "graph_info Leakage sensor: 0=dry, 1=water detected\n";
print "leak.label Leakage\n";
print "leak.type GAUGE\n";
print "leak.draw AREA\n";
print "leak.colour FF0000\n";
print "leak.critical 0.5\n";
print "leak.info 0 = dry (OK), 1 = water detected (CRITICAL)\n";
# --- Humidity Graph ---
print "multigraph didactum_humidity\n";
print "graph_title Didactum Humidity Sensor 01\n";
print "graph_vlabel Percent (%)\n";
print "graph_category sensors\n";
print "humidity.label Humidity\n";
print "humidity.type GAUGE\n";
print "humidity.draw LINE2\n";
print "humidity.colour 00AAFF\n";
print "humidity.warning $warn_hum\n";
print "humidity.critical $crit_hum\n";
print "humidity.min 0\n";
print "humidity.max 100\n";
# --- Door Contact Graph ---
print "multigraph didactum_door\n";
print "graph_title Didactum Door Contact 01\n";
print "graph_vlabel State\n";
print "graph_category sensors\n";
print "door.label Door Contact\n";
print "door.type GAUGE\n";
print "door.draw AREA\n";
print "door.warning 0.5\n";
print "door.info 0 = closed (OK), 1 = open (Warning)\n";
# --- Smoke Detector Graph ---
print "multigraph didactum_smoke\n";
print "graph_title Didactum Smoke Detector 01\n";
print "graph_vlabel State\n";
print "graph_category sensors\n";
print "smoke.label Smoke Detector\n";
print "smoke.type GAUGE\n";
print "smoke.draw AREA\n";
print "smoke.colour FF6600\n";
print "smoke.critical 0.5\n";
print "smoke.info 0 = no smoke (OK), 1 = Alarm (CRITICAL)\n";
exit 0;
}
# ================================================================
# Output values (normal plugin run)
# ================================================================
# Read raw values from SNMP result
my $temp_raw = $result->{$oids{temp_value}} // 'U';
my $temp_status = $result->{$oids{temp_status}} // 'U';
my $leak_val = $result->{$oids{leak_value}} // 'U';
my $humidity_val = $result->{$oids{humidity_value}} // 'U';
my $door_val = $result->{$oids{door_value}} // 'U';
my $smoke_val = $result->{$oids{smoke_value}} // 'U';
# Temperature: output raw value (warning/critical set on raw value x10)
print "multigraph didactum_temperature\n";
print "temp.value $temp_raw\n";
# Temperature Status
print "multigraph didactum_temp_status\n";
print "status.value $temp_status\n";
# Leakage
print "multigraph didactum_leakage\n";
print "leak.value $leak_val\n";
# Humidity
print "multigraph didactum_humidity\n";
print "humidity.value $humidity_val\n";
# Door Contact
print "multigraph didactum_door\n";
print "door.value $door_val\n";
# Smoke Detector
print "multigraph didactum_smoke\n";
print "smoke.value $smoke_val\n";
exit 0;
sudo chmod +x /usr/local/share/munin/plugins/snmp__didactum_sensors
8. Create Plugin Symlinks
To activate SNMP plugins, they are created as symlinks in /etc/munin/plugins, with the name of the host being monitored inserted between the first two underscores.
Create Symlink for the Custom Plugin
# Activate plugin for Didactum-Monitor-01
sudo ln -s /usr/local/share/munin/plugins/snmp__didactum_sensors \
/etc/munin/plugins/snmp_didactum-monitor-01_didactum_sensors
# Check plugin list
ls -la /etc/munin/plugins/ | grep didactum
Test Plugin directly (before restarting munin-node)
# Test plugin configuration sudo munin-run snmp_didactum-monitor-01_didactum_sensors config # Test plugin values (normal run) sudo munin-run snmp_didactum-monitor-01_didactum_sensors # Expected output: # multigraph didactum_temperature # temp.value 235 # multigraph didactum_leakage # leak.value 0 # ...
Restart munin-node
sudo systemctl restart munin-node sudo systemctl status munin-node
munin-node-configure for automatic plugin detection (optional)
The munin-node-configure script can automatically check which SNMP plugins are available for a device.
# Automatically determine available plugins for Didactum device
sudo munin-node-configure --shell \
--snmp 192.168.1.50 \
--snmpversion 2c \
--snmpcommunity didactum_munin \
--libdir /usr/local/share/munin/plugins
9. Configure Munin Alarms (Warn/Critical)
Munin can trigger alarms when warning or critical thresholds are exceeded. Thresholds are defined either directly in the plugin (warning/critical lines in the config section) or in the plugin configuration file.
Set thresholds in the plugin configuration file
sudo nano /etc/munin/plugin-conf.d/didactum
# ================================================================
# Didactum Plugin Configuration – Thresholds
# IMPORTANT: Specify temperature thresholds as raw value x10!
# 28 degrees C = 280, 35 degrees C = 350
# ================================================================
[snmp_didactum-monitor-01_didactum_sensors]
env.host 192.168.1.50
env.port 161
env.version 2
env.community didactum_munin
env.timeout 5
# Temperature thresholds (raw value x10!)
env.warning_temp 280
env.critical_temp 350
# Humidity thresholds (direct in %)
env.warning_hum 80
env.critical_hum 90
Override individual data point thresholds in munin.conf
sudo nano /etc/munin/munin.conf
[Didactum;didactum-monitor-01]
address 127.0.0.1
use_node_name no
# Override individual data point thresholds (optional)
# Format: Plugin.Datapoint.warning / .critical
snmp_didactum-monitor-01_didactum_sensors.temp.warning 280
snmp_didactum-monitor-01_didactum_sensors.temp.critical 350
snmp_didactum-monitor-01_didactum_sensors.leak.critical 0.5
snmp_didactum-monitor-01_didactum_sensors.smoke.critical 0.5
10. Configure Email Notification
Munin sends notifications via the contacts system. An email is sent when a warning or critical threshold is exceeded.
Step 1 – Configure Munin notification in munin.conf
sudo nano /etc/munin/munin.conf
# ================================================================
# Munin Notification Configuration for Didactum Alarms
# ================================================================
# Define contact
contact.admin.command mail -s "Munin: ${var:host} – ${var:plugin}: ${var:state}" \
admin@yourdomain.com
# Email format
contact.admin.text \
Timestamp: ${var:timestamp}\n\
Host: ${var:host}\n\
Plugin: ${var:plugin}\n\
Datapoint: ${var:graph_title} – ${var:fieldname}\n\
Status: ${var:state}\n\
Value: ${var:value}\n\
Warning from: ${var:warnhi}\n\
Critical from: ${var:crithi}\n\
Graph URL: ${var:url}
# Enable notifications (WARNING and CRITICAL)
contact.admin.always_send warning critical
# Enable notifications for Didactum host
[Didactum;didactum-monitor-01]
address 127.0.0.1
use_node_name no
contacts admin
Step 2 – Install Postfix for local mail delivery
sudo apt install postfix mailutils -y # Configuration type: "Internet Site" # Test: echo "Test Munin Didactum" | mail -s "Test" admin@yourdomain.com
Step 3 – Restart munin-master
sudo systemctl restart munin-node # Munin usually runs via Cron – check: sudo crontab -l -u munin # Default: */5 * * * * /usr/bin/munin-cron
11. SNMP OID Reference
All Didactum OIDs start with 1.3.6.1.4.1.46501 (older firmware) or 1.3.6.1.4.1.39052 (newer models). The sensor ID is appended at the end.
OID fields per sensor
| Field | Meaning | Example |
|---|---|---|
| .1.x.SENSOR_ID | Sensor ID | 1.3.6.1.4.1.46501.5.1.1.1.101001 |
| .5.x.SENSOR_ID | Sensor Name | 1.3.6.1.4.1.46501.5.1.1.5.101001 |
| .6.x.SENSOR_ID | Status (0=OK, 1=Alarm, 2=No Signal) | 1.3.6.1.4.1.46501.5.1.1.6.101001 |
| .7.x.SENSOR_ID | Measured value (current) | 1.3.6.1.4.1.46501.5.1.1.7.101001 |
Sensor types with OIDs and Munin thresholds
| Sensor Type | Sensor ID | OID Measured Value | OID Status | Munin Threshold |
|---|---|---|---|---|
| Temperature Sensor (digital) | 101001 | 1.3.6.1.4.1.46501.5.1.1.7.101001 | 1.3.6.1.4.1.46501.5.1.1.6.101001 | warning 280 / critical 350 (raw value × 10) |
| Temperature Sensor (analog) | 201001 | 1.3.6.1.4.1.39052.5.2.1.7.201001 | 1.3.6.1.4.1.39052.5.2.1.6.201001 | warning 280 / critical 350 (× 10) |
| Water Sensor / Leakage | 107001 | 1.3.6.1.4.1.46501.5.1.1.7.107001 | 1.3.6.1.4.1.46501.5.1.1.6.107001 | critical 0.5 (from 1 = water) |
| Humidity | 102001 | 1.3.6.1.4.1.46501.5.1.1.7.102001 | 1.3.6.1.4.1.46501.5.1.1.6.102001 | warning 80 / critical 90 (direct %) |
| Dry Contact | 101003 | 1.3.6.1.4.1.39052.5.1.1.7.101003 | 1.3.6.1.4.1.39052.5.1.1.6.101003 | warning 0.5 (from 1 = active) |
| Door Contact | 104001 | 1.3.6.1.4.1.46501.5.1.1.7.104001 | 1.3.6.1.4.1.46501.5.1.1.6.104001 | warning 0.5 (from 1 = open) |
| Smoke Detector | 106001 | 1.3.6.1.4.1.46501.5.1.1.7.106001 | 1.3.6.1.4.1.46501.5.1.1.6.106001 | critical 0.5 (from 1 = alarm) |
Find Sensor ID: In the Didactum Web Interface under System Tree → Select Sensor → Details. This ID is appended to the end of the OID and updated in the %oids hash table in the plugin.
Temperature thresholds in Munin: The Didactum device delivers temperature values as raw value × 10. 28.0 °C = OID value 280. Munin thresholds (warning/critical) must therefore also be specified × 10. The raw value appears in the graph; the graph label indicates the ÷10 conversion.
MIB Prefix per model: Older devices use 1.3.6.1.4.1.46501, newer models possibly 1.3.6.1.4.1.39052. Adjust the OIDs in the plugin code accordingly.
12. Test & Troubleshooting
Test Plugin directly
# Show plugin configuration (config mode)
sudo -u munin munin-run \
snmp_didactum-monitor-01_didactum_sensors config
# Query plugin values (normal run)
sudo -u munin munin-run \
snmp_didactum-monitor-01_didactum_sensors
# Expected output:
# multigraph didactum_temperature
# temp.value 235
# multigraph didactum_leakage
# leak.value 0
# multigraph didactum_humidity
# humidity.value 65
# multigraph didactum_door
# door.value 0
# multigraph didactum_smoke
# smoke.value 0
Test SNMP directly
snmpget -v 2c -c didactum_munin 192.168.1.50 \
1.3.6.1.4.1.46501.5.1.1.7.101001
# Expected output: INTEGER: 235 (= 23.5 degrees C)
snmpget -v 2c -c didactum_munin 192.168.1.50 \
1.3.6.1.4.1.46501.5.1.1.7.107001
# Expected output for dry sensor: INTEGER: 0
Run Munin Master manually
sudo -u munin munin-cron # Graphs are generated under /var/cache/munin/www/ ls /var/cache/munin/www/Didactum/didactum-monitor-01/
Error Messages and Solutions
| Problem | Cause & Solution |
|---|---|
| Plugin returns „U" (unknown) | SNMP connection failed → check Community String, IP, UDP 161 |
| Perl error on plugin start | Missing Perl modules → sudo apt install libnet-snmp-perl |
| Symlink not found | ls -la /etc/munin/plugins/ | grep didactum – check symlink and recreate if necessary |
| Temperature value appears 10× too high in graph | Not a problem – raw value × 10 is correct. Set thresholds also × 10 (280, 350) |
| No email on alarm | Postfix not running; contacts configuration missing; munin-cron not running |
| Graph does not appear in web interface | munin-cron has not run yet; plugin returns „U" → wait 5 minutes |
| Plugin file: „Permission denied" | sudo chmod +x /usr/local/share/munin/plugins/snmp__didactum_sensors |
View Munin Logs
# Munin Master Log sudo tail -f /var/log/munin/munin-update.log # Munin Node Log sudo tail -f /var/log/munin/munin-node.log # Alarm Log sudo tail -f /var/log/munin/munin-limits.log
13. Final Checklist
Didactum Device
- SNMP enabled (v2c)
- Community String set (not „public"): didactum_munin
- snmpwalk from Munin server successful
- MIB file downloaded
Munin Server
- Packages munin, munin-node, libnet-snmp-perl installed
- MIB file saved under /usr/share/snmp/mibs/
- Plugin file /usr/local/share/munin/plugins/snmp__didactum_sensors created
- Plugin file executable (chmod +x)
- Symlink created in /etc/munin/plugins/
- Plugin configuration set in /etc/munin/plugin-conf.d/didactum
- munin.conf: Host entry and contacts created
Plugin Test
- munin-run config: All graph definitions appear without errors
- munin-run (normal run): All sensor values are returned (no „U")
- munin-node restarted
- munin-cron executed manually once
- Graphs visible in web interface
Alarms & Notification
- Temperature thresholds set as raw value × 10 (280 / 350)
- Leakage critical threshold: 0.5
- Postfix installed and test email received
- contacts configured in munin.conf
- Test alarm triggered and email received