Didactum monitoring and Icinga 2 integration
Complete step-by-step guide for integrating Didactum monitoring devices and sensors into Icinga 2 via SNMP – including host configuration, CheckCommand definitions, services for all sensor types, SNMP traps, and email notification.
- Software: Icinga 2 (from version 2.11) + Icinga Web 2
- OS: Ubuntu 20.04 / 22.04 LTS or Debian 11/12
- Protocol: SNMP v1 / v2c / v3 via check_snmp plugin
- Devices: Didactum Monitoring System 100T / 300T / 500T / 550T
- Sensors: Temperature, leakage, humidity, door contact, smoke
1. Prerequisites and System Overview
Icinga Server
- Icinga 2 and Icinga Web 2 installed and functional
- monitoring-plugins or nagios-plugins package installed
- UDP port 161 open outbound for SNMP polling
- UDP port 162 open inbound for SNMP traps
- Network access to the Didactum device
Didactum Device
- Monitoring System 100T / 300T / 500T or 550T
- SNMP enabled (v2c or v3)
- MIB file available for download in the web interface
- Network access to the Icinga server
Architecture
[Icinga 2 Server] [Didactum Monitoring System]
IP: 192.168.1.10 IP: 192.168.1.50
Icinga Web 2: Port 80/443
--SNMP Polling UDP 161-->
<--SNMP Traps UDP 162---
Important Icinga 2 Directories
/etc/icinga2/ <-- Main configuration /etc/icinga2/conf.d/ <-- Hosts, Services, Commands /etc/icinga2/conf.d/hosts/ <-- Host definitions /usr/lib/nagios/plugins/ <-- check_snmp plugin /usr/share/snmp/mibs/ <-- MIB files
2. Enable SNMP on the Didactum device
Step 1 – Open Web Interface
Open in the browser: [https://192.168.1.50](https://192.168.1.50) (adjust the IP of the Didactum device)
Step 2 – Open SNMP Settings
System Settings → SNMP
Step 3 – Enter the Following Values
| Field in the Didactum Web Interface | Value |
|---|---|
| Enable SNMP | Enabled |
| SNMP Version | v2c (recommended) or v3 for production environments |
| Community String (v1/v2c) | didactum_icinga (do not use “public”!) |
| SNMP Port | 161 |
| Trap Receiver IP | 192.168.1.10 (IP of the Icinga server) |
| Trap Port | 162 |
| Trap Version | v2c |
SNMPv3 Settings (optional, increased security)
| Field | Value / Example |
|---|---|
| Security Name | icinga_user |
| Auth Protocol | SHA |
| Auth Password | min. 8 characters |
| Priv Protocol | AES |
| Priv Password | min. 8 characters |
| Security Level | authPriv |
3. Install Required Packages on the Icinga Server
# Install SNMP tools and monitoring plugins
sudo apt update
sudo apt install -y snmp snmp-mibs-downloader \
monitoring-plugins nagios-plugins-contrib \
snmptrapd snmptt
# Test check_snmp
/usr/lib/nagios/plugins/check_snmp --help
Then adjust the SNMP configuration so that all MIBs are loaded:
sudo nano /etc/snmp/snmp.conf
Add the following line (or remove the comment):
mibs ALL mibdirs /usr/share/snmp/mibs
4. Install MIB File
Step 1 – Download MIB File from the Didactum Web Interface
System Settings → SNMP → "Download MIB File" → didactum.mib
Step 2 – Install MIB on the Icinga Server
# Copy MIB file to the standard directory
sudo cp didactum.mib /usr/share/snmp/mibs/
# Update SNMP configuration
echo "mibdirs /usr/share/snmp/mibs" | sudo tee -a /etc/snmp/snmp.conf
echo "mibs ALL" | sudo tee -a /etc/snmp/snmp.conf
# Test: MIB walk with plain-text names
snmpwalk -v 2c -c didactum_icinga -m ALL 192.168.1.50 \
.1.3.6.1.4.1.46501.5.1.1
Step 3 – Test Individual Sensor Value
# Query temperature value (raw value ÷ 10 = degrees Celsius)
snmpget -v 2c -c didactum_icinga 192.168.1.50 \
.1.3.6.1.4.1.46501.5.1.1.7.101001
# Query leakage status (0=dry, 1=water)
snmpget -v 2c -c didactum_icinga 192.168.1.50 \
.1.3.6.1.4.1.46501.5.1.1.7.107001
5. Create Didactum Host in Icinga 2
Step 1 – Create Host Configuration File
sudo mkdir -p /etc/icinga2/conf.d/didactum sudo nano /etc/icinga2/conf.d/didactum/hosts.conf
Step 2 – Enter the Following Content
// ============================================================
// Didactum Monitoring System – Host Configuration
// File: /etc/icinga2/conf.d/didactum/hosts.conf
// ============================================================
object Host "didactum-monitor-01" {
display_name = "Didactum Monitoring System 01"
address = "192.168.1.50"
check_command = "hostalive"
// SNMP credentials as custom variables
vars.snmp_community = "didactum_icinga"
vars.snmp_version = "2"
// Sensor IDs (determine from Didactum web interface)
vars.didactum_temp_oid = ".1.3.6.1.4.1.46501.5.1.1.7.101001"
vars.didactum_temp_stat_oid = ".1.3.6.1.4.1.46501.5.1.1.6.101001"
vars.didactum_leak_oid = ".1.3.6.1.4.1.46501.5.1.1.7.107001"
vars.didactum_hum_oid = ".1.3.6.1.4.1.46501.5.1.1.7.102001"
vars.didactum_door_oid = ".1.3.6.1.4.1.46501.5.1.1.7.104001"
vars.didactum_smoke_oid = ".1.3.6.1.4.1.46501.5.1.1.7.106001"
// Temperature thresholds (raw value × 10!)
vars.didactum_temp_warn = "280" // = 28.0 °C
vars.didactum_temp_crit = "350" // = 35.0 °C
// Host group
groups = [ "didactum-monitoring" ]
// Enable notification
vars.notification["mail"] = {
groups = [ "icingaadmins" ]
}
}
// ============================================================
// Second device (commented out – enable if needed)
// ============================================================
// object Host "didactum-monitor-02" {
// display_name = "Didactum Monitoring System 02"
// address = "192.168.1.51"
// check_command = "hostalive"
// import "didactum-monitor-01" // inherit settings
// }
Step 3 – Define Host Group
sudo nano /etc/icinga2/conf.d/didactum/groups.conf
object HostGroup "didactum-monitoring" {
display_name = "Didactum Monitoring Devices"
}
object ServiceGroup "didactum-sensoren" {
display_name = "Didactum Sensor Services"
}
6. CheckCommand Definitions for Didactum
Step 1 – Create commands.conf
sudo nano /etc/icinga2/conf.d/didactum/commands.conf
Step 2 – Enter the Following Content
// ============================================================
// Didactum CheckCommands
// File: /etc/icinga2/conf.d/didactum/commands.conf
// ============================================================
// ------------------------------------------------------------
// Based on the built-in check_snmp ITL command
// Temperature value with warning/critical thresholds
// Important: raw value × 10 = input value (25.0 °C = 250)
// ------------------------------------------------------------
object CheckCommand "didactum-temperature" {
import "plugin-check-command"
command = [ PluginDir + "/check_snmp" ]
arguments = {
"-H" = "$address$"
"-C" = "$snmp_community$"
"-P" = "$snmp_version$"
"-o" = "$didactum_temp_oid$"
"-w" = "$didactum_temp_warn$"
"-c" = "$didactum_temp_crit$"
"-l" = "Temperature"
"-u" = "0.1°C"
"--timeout" = "10"
}
vars.snmp_community = "$host.vars.snmp_community$"
vars.snmp_version = "$host.vars.snmp_version$"
vars.didactum_temp_oid = "$host.vars.didactum_temp_oid$"
vars.didactum_temp_warn = "$host.vars.didactum_temp_warn$"
vars.didactum_temp_crit = "$host.vars.didactum_temp_crit$"
}
// ------------------------------------------------------------
// Temperature sensor status (0=OK, 1=Alarm, 2=No signal)
// ------------------------------------------------------------
object CheckCommand "didactum-temp-status" {
import "plugin-check-command"
command = [ PluginDir + "/check_snmp" ]
arguments = {
"-H" = "$address$"
"-C" = "$snmp_community$"
"-P" = "$snmp_version$"
"-o" = "$didactum_temp_stat_oid$"
"-w" = "0:0"
"-c" = "1:2"
"-l" = "Temp Status"
"--timeout" = "10"
}
vars.snmp_community = "$host.vars.snmp_community$"
vars.snmp_version = "$host.vars.snmp_version$"
vars.didactum_temp_stat_oid = "$host.vars.didactum_temp_stat_oid$"
}
// ------------------------------------------------------------
// Leakage sensor (0=dry=OK, 1=water=CRITICAL)
// ------------------------------------------------------------
object CheckCommand "didactum-leakage" {
import "plugin-check-command"
command = [ PluginDir + "/check_snmp" ]
arguments = {
"-H" = "$address$"
"-C" = "$snmp_community$"
"-P" = "$snmp_version$"
"-o" = "$didactum_leak_oid$"
"-w" = "0:0"
"-c" = "1:1"
"-l" = "Leakage"
"--timeout" = "10"
}
vars.snmp_community = "$host.vars.snmp_community$"
vars.snmp_version = "$host.vars.snmp_version$"
vars.didactum_leak_oid = "$host.vars.didactum_leak_oid$"
}
// ------------------------------------------------------------
// Humidity with thresholds in %
// ------------------------------------------------------------
object CheckCommand "didactum-humidity" {
import "plugin-check-command"
command = [ PluginDir + "/check_snmp" ]
arguments = {
"-H" = "$address$"
"-C" = "$snmp_community$"
"-P" = "$snmp_version$"
"-o" = "$didactum_hum_oid$"
"-w" = "$didactum_hum_warn$"
"-c" = "$didactum_hum_crit$"
"-l" = "Humidity"
"-u" = "%"
"--timeout" = "10"
}
vars.snmp_community = "$host.vars.snmp_community$"
vars.snmp_version = "$host.vars.snmp_version$"
vars.didactum_hum_oid = "$host.vars.didactum_hum_oid$"
vars.didactum_hum_warn = "75"
vars.didactum_hum_crit = "85"
}
// ------------------------------------------------------------
// Door contact (0=closed=OK, 1=open=WARNING)
// ------------------------------------------------------------
object CheckCommand "didactum-door" {
import "plugin-check-command"
command = [ PluginDir + "/check_snmp" ]
arguments = {
"-H" = "$address$"
"-C" = "$snmp_community$"
"-P" = "$snmp_version$"
"-o" = "$didactum_door_oid$"
"-w" = "1:1"
"-c" = ""
"-l" = "Door contact"
"--timeout" = "10"
}
vars.snmp_community = "$host.vars.snmp_community$"
vars.snmp_version = "$host.vars.snmp_version$"
vars.didactum_door_oid = "$host.vars.didactum_door_oid$"
}
// ------------------------------------------------------------
// Smoke detector (0=no smoke=OK, 1=alarm=CRITICAL)
// ------------------------------------------------------------
object CheckCommand "didactum-smoke" {
import "plugin-check-command"
command = [ PluginDir + "/check_snmp" ]
arguments = {
"-H" = "$address$"
"-C" = "$snmp_community$"
"-P" = "$snmp_version$"
"-o" = "$didactum_smoke_oid$"
"-w" = "0:0"
"-c" = "1:1"
"-l" = "Smoke detector"
"--timeout" = "10"
}
vars.snmp_community = "$host.vars.snmp_community$"
vars.snmp_version = "$host.vars.snmp_version$"
vars.didactum_smoke_oid = "$host.vars.didactum_smoke_oid$"
}
7. Configure Services for All Sensor Types
Step 1 – Create services.conf
sudo nano /etc/icinga2/conf.d/didactum/services.conf
Step 2 – Enter the Following Content
// ============================================================
// Didactum Services
// File: /etc/icinga2/conf.d/didactum/services.conf
// ============================================================
// ------------------------------------------------------------
// Temperature sensor – measured value
// ------------------------------------------------------------
object Service "Didactum Temperature" {
host_name = "didactum-monitor-01"
display_name = "Temperature Sensor 01"
check_command = "didactum-temperature"
check_interval = 5m
retry_interval = 1m
max_check_attempts = 3
groups = [ "didactum-sensoren" ]
vars.notification["mail"] = {
groups = [ "icingaadmins" ]
}
}
// ------------------------------------------------------------
// Temperature sensor – status
// ------------------------------------------------------------
object Service "Didactum Temperature Status" {
host_name = "didactum-monitor-01"
display_name = "Temperature Sensor 01 – Status"
check_command = "didactum-temp-status"
check_interval = 5m
retry_interval = 1m
max_check_attempts = 3
groups = [ "didactum-sensoren" ]
}
// ------------------------------------------------------------
// Leakage sensor
// ------------------------------------------------------------
object Service "Didactum Leakage" {
host_name = "didactum-monitor-01"
display_name = "Water Sensor / Leakage 01"
check_command = "didactum-leakage"
check_interval = 2m
retry_interval = 30s
max_check_attempts = 2
// Immediately critical, no delay
enable_flapping = false
groups = [ "didactum-sensoren" ]
vars.notification["mail"] = {
groups = [ "icingaadmins" ]
}
}
// ------------------------------------------------------------
// Humidity
// ------------------------------------------------------------
object Service "Didactum Humidity" {
host_name = "didactum-monitor-01"
display_name = "Humidity Sensor 01"
check_command = "didactum-humidity"
check_interval = 5m
retry_interval = 1m
max_check_attempts = 3
groups = [ "didactum-sensoren" ]
}
// ------------------------------------------------------------
// Door contact
// ------------------------------------------------------------
object Service "Didactum Tuerkonakt" {
host_name = "didactum-monitor-01"
display_name = "Door Contact 01"
check_command = "didactum-door"
check_interval = 1m
retry_interval = 30s
max_check_attempts = 1
groups = [ "didactum-sensoren" ]
}
// ------------------------------------------------------------
// Smoke detector
// ------------------------------------------------------------
object Service "Didactum Smoke Detector" {
host_name = "didactum-monitor-01"
display_name = "Smoke Detector 01"
check_command = "didactum-smoke"
check_interval = 1m
retry_interval = 30s
max_check_attempts = 1
enable_flapping = false
groups = [ "didactum-sensoren" ]
vars.notification["mail"] = {
groups = [ "icingaadmins" ]
}
}
8. Dynamic Service Assignment with Apply Rules
If you operate multiple Didactum devices, you can automatically assign services to all devices in a host group using apply rules, without creating individual service objects for each device.
sudo nano /etc/icinga2/conf.d/didactum/apply-rules.conf
// ============================================================
// Didactum Apply Rules – automatic service assignment
// for all hosts in the group "didactum-monitoring"
// ============================================================
apply Service "Didactum Temperature" {
import "generic-service"
check_command = "didactum-temperature"
check_interval = 5m
retry_interval = 1m
assign where "didactum-monitoring" in host.groups
ignore where host.vars.didactum_temp_oid == ""
}
apply Service "Didactum Leakage" {
import "generic-service"
check_command = "didactum-leakage"
check_interval = 2m
retry_interval = 30s
assign where "didactum-monitoring" in host.groups
ignore where host.vars.didactum_leak_oid == ""
}
apply Service "Didactum Humidity" {
import "generic-service"
check_command = "didactum-humidity"
check_interval = 5m
assign where "didactum-monitoring" in host.groups
ignore where host.vars.didactum_hum_oid == ""
}
apply Service "Didactum Tuerkonakt" {
import "generic-service"
check_command = "didactum-door"
check_interval = 1m
assign where "didactum-monitoring" in host.groups
ignore where host.vars.didactum_door_oid == ""
}
apply Service "Didactum Smoke Detector" {
import "generic-service"
check_command = "didactum-smoke"
check_interval = 1m
assign where "didactum-monitoring" in host.groups
ignore where host.vars.didactum_smoke_oid == ""
}
Validate configuration and reload Icinga 2
# Check configuration for errors sudo icinga2 daemon -C # Reload Icinga 2 (no restart required) sudo systemctl reload icinga2 # In case of errors: full restart sudo systemctl restart icinga2
9. Receiving SNMP Traps (SNMPTT)
Icinga 2 does not receive SNMP traps directly. The workaround is via snmptrapd → snmptt → Icinga 2 passive check result.
Step 1 – Configure snmptrapd
sudo nano /etc/snmp/snmptrapd.conf
# Community string for trap reception authCommunity execute,log,net didactum_icinga # Forward all traps to snmptt traphandle default /usr/sbin/snmptthandler
Step 2 – Configure SNMPTT
sudo nano /etc/snmp/snmptt.ini
Find and adjust the following section:
mode = daemon net_snmp_perl_enable = 1 mibs_environment = ALL log_enable = 1 log_file = /var/log/snmptt/snmptt.log unknown_trap_log_enable = 1
Step 3 – Create SNMPTT event file for Didactum
sudo nano /etc/snmp/snmptt.conf
# ============================================================
# Didactum SNMP trap definitions
# ============================================================
# General Didactum alarm (enterprise trap)
EVENT didactumAlarm .1.3.6.1.4.1.46501.* "Status Events" Normal
FORMAT Didactum Alarm: $*
EXEC curl -s -k -u root:icinga \
-H 'Accept: application/json' \
-X POST 'https://localhost:5665/v1/actions/process-check-result' \
-d '{"type":"Service","filter":"host.name==\\"didactum-monitor-01\\" && service.name==\\"Didactum SNMP Trap\\"","exit_status":2,"plugin_output":"CRITICAL: Didactum alarm received - $*"}'
SDESC
General alarm from the Didactum monitoring system.
EDESC
# Temperature alarm
EVENT didactumTempAlarm .1.3.6.1.4.1.46501.5.1.1.6.101001 "Status Events" Normal
FORMAT Didactum Temperature Alarm: $*
EXEC curl -s -k -u root:icinga \
-H 'Accept: application/json' \
-X POST 'https://localhost:5665/v1/actions/process-check-result' \
-d '{"type":"Service","filter":"host.name==\\"didactum-monitor-01\\" && service.name==\\"Didactum Temperature Status\\"","exit_status":2,"plugin_output":"CRITICAL: Temperature alarm"}'
SDESC
Temperature alarm message from the Didactum device.
EDESC
# Leakage alarm
EVENT didactumLeakAlarm .1.3.6.1.4.1.46501.5.1.1.7.107001 "Status Events" Normal
FORMAT Didactum Leakage Alarm: $*
EXEC curl -s -k -u root:icinga \
-H 'Accept: application/json' \
-X POST 'https://localhost:5665/v1/actions/process-check-result' \
-d '{"type":"Service","filter":"host.name==\\"didactum-monitor-01\\" && service.name==\\"Didactum Leakage\\"","exit_status":2,"plugin_output":"CRITICAL: Water detected!"}'
SDESC
Leakage alarm – water detected.
EDESC
Step 4 – Enable Icinga 2 API for passive checks
# Enable API feature (if not already enabled) sudo icinga2 feature enable api sudo icinga2 api setup # Check API user sudo cat /etc/icinga2/conf.d/api-users.conf
Step 5 – Create passive check service for trap reception
sudo nano /etc/icinga2/conf.d/didactum/trap-service.conf
// Passive service for SNMP trap reception
object Service "Didactum SNMP Trap" {
host_name = "didactum-monitor-01"
display_name = "Didactum SNMP Trap Receiver"
check_command = "dummy"
enable_active_checks = false
enable_passive_checks = true
enable_notifications = true
// If no trap for 10 minutes: UNKNOWN
check_interval = 10m
max_check_attempts = 1
groups = [ "didactum-sensoren" ]
}
Step 6 – Start services
sudo systemctl enable snmptrapd snmptt sudo systemctl start snmptrapd snmptt sudo systemctl reload icinga2
10. SNMP OID Reference
All Didactum OIDs begin 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
| Sensor type | Sensor ID | OID measured value | OID status | Unit / note |
|---|---|---|---|---|
| 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 | Raw value ÷ 10 = °C, enter threshold × 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 | Raw value ÷ 10 = °C |
| 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 | 0 = dry, 1 = water detected |
| 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 | Value in % (65 = 65 %) |
| Potential-free 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 | 0 = open, 1 = closed |
| 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 | 0 = closed, 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 | 0 = no smoke, 1 = alarm |
Determine sensor ID:
In the Didactum web interface under System tree → select sensor → details. This ID is appended to the end of the OID.
Temperature thresholds in check_snmp:
Since check_snmp works with the raw value, thresholds must always be entered × 10. 28 °C corresponds to the input value 280.
MIB prefix per model:
Older devices use .1.3.6.1.4.1.46501, newer models may use .1.3.6.1.4.1.39052. The exact OIDs can be found in the MIB file of your device.
Test check_snmp directly (command line)
# Temperature value (SNMPv2c)
/usr/lib/nagios/plugins/check_snmp \
-H 192.168.1.50 -C didactum_icinga -P 2 \
-o .1.3.6.1.4.1.46501.5.1.1.7.101001 \
-w 280 -c 350 -l "Temperature" -u "0.1Degree"
# Leakage status
/usr/lib/nagios/plugins/check_snmp \
-H 192.168.1.50 -C didactum_icinga -P 2 \
-o .1.3.6.1.4.1.46501.5.1.1.7.107001 \
-w 0:0 -c 1:1 -l "Leakage"
# SNMPv3 example
/usr/lib/nagios/plugins/check_snmp \
-H 192.168.1.50 -P 3 \
-L authPriv -U icinga_user \
-a SHA -A "AuthPasswort" \
-x AES -X "PrivPasswort" \
-o .1.3.6.1.4.1.46501.5.1.1.7.101001 \
-w 280 -c 350
11. Configure Email Notifications
Step 1 – Enable notification feature
sudo icinga2 feature enable notification sudo systemctl reload icinga2
Step 2 – Create or adjust users
sudo nano /etc/icinga2/conf.d/users.conf
object User "admin" {
import "generic-user"
display_name = "Administrator"
email = "admin@yourdomain.com"
groups = [ "icingaadmins" ]
// Define alert types
types = [ Problem, Recovery, Acknowledgement ]
states = [ Critical, Warning, Unknown ]
}
object UserGroup "icingaadmins" {
display_name = "Icinga 2 Administrators"
}
Step 3 – Check email script
# Icinga 2 provides ready-made notification scripts: ls /etc/icinga2/scripts/ # mail-host-notification.sh # mail-service-notification.sh
A local mail transfer agent (e.g. Postfix) must be configured on the server:
sudo apt install postfix mailutils -y # Choose configuration type: "Internet Site" or "Satellite system" echo "Testmail Icinga" | mail -s "Test" admin@yourdomain.com
Step 4 – Create notification objects for Didactum services
sudo nano /etc/icinga2/conf.d/didactum/notifications.conf
// ============================================================
// Didactum notifications
// ============================================================
// Notification for leakage (immediate, all problems)
apply Notification "didactum-leckage-alert" to Service {
import "mail-service-notification"
command = "mail-service-notification"
users = [ "admin" ]
types = [ Problem, Recovery ]
states = [ Critical, Warning ]
interval = 0 // No repeats – alert once
assign where service.name == "Didactum Leakage"
}
// Notification for temperature (repeat every 30 minutes)
apply Notification "didactum-temperatur-alert" to Service {
import "mail-service-notification"
command = "mail-service-notification"
users = [ "admin" ]
types = [ Problem, Recovery ]
states = [ Critical, Warning ]
interval = 30m
assign where service.name == "Didactum Temperature"
}
// Notification for all Didactum sensors
apply Notification "didactum-sensor-alert" to Service {
import "mail-service-notification"
command = "mail-service-notification"
users = [ "admin" ]
types = [ Problem, Recovery, Acknowledgement ]
states = [ Critical, Warning, Unknown ]
interval = 1h
assign where "didactum-sensoren" in service.groups
}
Step 5 – Load configuration
sudo icinga2 daemon -C && sudo systemctl reload icinga2
12. Testing and Debugging
Test check_snmp directly
# Test temperature
/usr/lib/nagios/plugins/check_snmp \
-H 192.168.1.50 -C didactum_icinga -P 2 \
-o .1.3.6.1.4.1.46501.5.1.1.7.101001
# Expected output:
# SNMP OK - 235 | iso.3.6.1.4.1.46501.5.1.1.7.101001=235
# (235 = 23.5 °C)
Validate configuration
sudo icinga2 daemon -C # Output: "Configuration OK, ready to start."
Check service status
sudo systemctl status icinga2 sudo systemctl status snmptrapd sudo systemctl status snmptt
View Icinga 2 logs
# General log sudo tail -f /var/log/icinga2/icinga2.log # Error log sudo tail -f /var/log/icinga2/error.log # Enable debug mode (temporary) sudo icinga2 feature enable debuglog sudo systemctl reload icinga2 sudo tail -f /var/log/icinga2/debug.log
Error messages and solutions
| Problem | Cause & solution |
|---|---|
| check_snmp: No response from remote host | Firewall blocks UDP 161; SNMP not enabled on Didactum; wrong IP → check |
| check_snmp: Timeout | Community string incorrect; network connection interrupted → test with snmpwalk |
| SNMP OK, but temperature 10× too high | Raw value not scaled → thresholds × 10 in the CheckCommand configuration |
| Service remains permanently UNKNOWN | Plugin not found; PluginDir incorrect → run which check_snmp |
| Configuration error during reload | Run sudo icinga2 daemon -C and read the error message |
| No email on alert | Postfix not running; user email address missing; notification feature not enabled |
| SNMP traps not received | UDP 162 blocked in firewall; snmptrapd not running; community string incorrect |
| Apply rule not applied | Host not in host group “didactum-monitoring” → check groups entry in host |
snmpwalk for diagnostics
# List all sensors at once
snmpwalk -v 2c -c didactum_icinga 192.168.1.50 \
.1.3.6.1.4.1.46501.5.1.1
# With MIB names (after MIB installation)
snmpwalk -v 2c -c didactum_icinga -m ALL 192.168.1.50 \
DIDACTUM-MIB::sensorValue
13. Completion Checklist
Didactum Device
- SNMP enabled (v2c or v3)
- Community string set (not “public”)
- Trap receiver IP set to Icinga server
- Trap port 162 configured
- MIB file downloaded
Icinga 2 Server – Packages & MIB
- Packages snmp, snmp-mibs-downloader, monitoring-plugins installed
- MIB file stored under /usr/share/snmp/mibs/
- /etc/snmp/snmp.conf: mibs ALL configured
- snmpwalk test successful – sensor values visible
- check_snmp successfully tested directly on the command line
Icinga 2 Configuration
- Directory /etc/icinga2/conf.d/didactum/ created
- hosts.conf: host object created with SNMP variables and OIDs
- groups.conf: host group and service group created
- commands.conf: CheckCommands created for all sensor types
- services.conf: service objects created for all sensors
- Configuration validated with icinga2 daemon -C (no errors)
- Icinga 2 reloaded: systemctl reload icinga2
Services in Icinga Web 2
- Host “didactum-monitor-01” appears in the host overview
- Services appear and show current measured values
- Temperature thresholds correctly scaled (×10)
- Leakage sensor shows OK (value 0)
Notification
- Notification feature enabled
- Email address configured in the user object
- Postfix / mail delivery on the server is working
- Notification objects created for critical sensors
- Test alert triggered and email received
SNMP Traps (optional)
- snmptrapd and snmptt installed and configured
- snmptt.conf: Didactum enterprise OID configured
- Icinga 2 API enabled and reachable
- Passive service “Didactum SNMP Trap” created
- Test trap received and visible in Icinga Web 2