Language selection:
Skip to main navigation Skip to main content Skip to page footer

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 InterfaceValue
Enable SNMPEnabled
SNMP Versionv2c (recommended) or v3 for production environments
Community String (v1/v2c)didactum_icinga (do not use “public”!)
SNMP Port161
Trap Receiver IP192.168.1.10 (IP of the Icinga server)
Trap Port162
Trap Versionv2c

SNMPv3 Settings (optional, increased security)

FieldValue / Example
Security Nameicinga_user
Auth ProtocolSHA
Auth Passwordmin. 8 characters
Priv ProtocolAES
Priv Passwordmin. 8 characters
Security LevelauthPriv

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

FieldMeaningExample
.1.x.SENSOR_IDSensor ID.1.3.6.1.4.1.46501.5.1.1.1.101001
.5.x.SENSOR_IDSensor name.1.3.6.1.4.1.46501.5.1.1.5.101001
.6.x.SENSOR_IDStatus (0=OK, 1=Alarm, 2=No signal).1.3.6.1.4.1.46501.5.1.1.6.101001
.7.x.SENSOR_IDMeasured value (current).1.3.6.1.4.1.46501.5.1.1.7.101001

Sensor Types with OIDs

Sensor typeSensor IDOID measured valueOID statusUnit / 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.101001Raw 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.201001Raw value ÷ 10 = °C
Water sensor / leakage107001.1.3.6.1.4.1.46501.5.1.1.7.107001.1.3.6.1.4.1.46501.5.1.1.6.1070010 = dry, 1 = water detected
Humidity102001.1.3.6.1.4.1.46501.5.1.1.7.102001.1.3.6.1.4.1.46501.5.1.1.6.102001Value in % (65 = 65 %)
Potential-free contact101003.1.3.6.1.4.1.39052.5.1.1.7.101003.1.3.6.1.4.1.39052.5.1.1.6.1010030 = open, 1 = closed
Door contact104001.1.3.6.1.4.1.46501.5.1.1.7.104001.1.3.6.1.4.1.46501.5.1.1.6.1040010 = closed, 1 = open
Smoke detector106001.1.3.6.1.4.1.46501.5.1.1.7.106001.1.3.6.1.4.1.46501.5.1.1.6.1060010 = 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

ProblemCause & solution
check_snmp: No response from remote hostFirewall blocks UDP 161; SNMP not enabled on Didactum; wrong IP → check
check_snmp: TimeoutCommunity string incorrect; network connection interrupted → test with snmpwalk
SNMP OK, but temperature 10× too highRaw value not scaled → thresholds × 10 in the CheckCommand configuration
Service remains permanently UNKNOWNPlugin not found; PluginDir incorrect → run which check_snmp
Configuration error during reloadRun sudo icinga2 daemon -C and read the error message
No email on alertPostfix not running; user email address missing; notification feature not enabled
SNMP traps not receivedUDP 162 blocked in firewall; snmptrapd not running; community string incorrect
Apply rule not appliedHost 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

This website uses cookies

This website uses cookies to improve user experience. By using our website you consent to all cookies in accordance with our Cookie Policy.

Essential cookies enable basic functions and are necessary for the website to function properly.
Statistics cookies collect information anonymously. This information helps us to understand how our visitors use our website.
Marketing cookies are used by third parties or publishers to display personalized advertisements. They do this by tracking visitors across websites.