banshee is under active development: collectors will keep changing, and a version you publish will likely need adjustments. For stable use, wait for version 1.0.0.

Storage

banshee/storage-collection/storage/synology/snmp/

system

The state of a Synology NAS by SNMP: system partition, power, fans, temperature, DSM update and version.

  • storage
  • synology
  • dsm
  • nas
  • snmp
  • fan
  • power
  • temperature

by banshee1 installation1 version

v1Latest

Published on October 27, 2026. First version.

Keen 1.0.0 · 46 lines
// The state of a Synology NAS, by SNMP (SYNOLOGY-SYSTEM-MIB): the system partition, the power supplies,
// the fans and the thermal state, its temperature, whether a DSM update is available, and its model and
// DSM version. For DSM 6.2.4 and later, DSM UC and DSM Enterprise, as Synology's MIB guide says.
// The branch is walked once: an object a model does not serve (the thermal state on DSM UC) is left out
// rather than stop the collector.
need('protocol:snmp');

per('component', 'Components');
output('status', 'text', array('label' => 'Status', 'per' => 'component'));
output('temperature', 'number', array('label' => 'Temperature', 'unit' => '°C'));
output('update', 'text', array('label' => 'DSM update'));
output('model', 'text', array('label' => 'Model'));
output('version', 'text', array('label' => 'DSM version'));

watch.state('failed', 'Component failed', 'status', array('critical' => array('failed')));
watch.above('hot', 'High temperature', 'temperature', array('warning' => 50, 'critical' => 60, 'for' => '3 runs'));
watch.state('update-available', 'DSM update available', 'update', array('warning' => array('available'), 'enabled' => false));
watch.expect('version', 'Unexpected DSM version', 'version', array(
    'help'    => 'Raises when the NAS runs a DSM version other than those given, for instance after an update that should not have happened.',
    'enabled' => false,
));

// SYNOLOGY-SYSTEM-MIB, under 1.3.6.1.4.1.6574.1, by suffix: systemStatus (1.0), temperature (2.0), powerStatus
// (3.0), systemFanStatus (4.1.0), cpuFanStatus (4.2.0), modelName (5.1.0), version (5.3.0),
// upgradeAvailable (5.4.0), thermalStatus (8.0).
$system = snmp.walk('1.3.6.1.4.1.6574.1');
if (!list.has($system, '1.0')) {
    fail('misconfigured', 'The agent serves no Synology system state (SYNOLOGY-SYSTEM-MIB)',
        'Not a Synology, or a view that does not include 1.3.6.1.4.1.6574.');
}

// Normal (1) and Failed (2), for each component the MIB gives a state.
$statuses = array(1 => 'normal', 2 => 'failed');
$components = array('System partition' => '1.0', 'Power supplies' => '3.0', 'System fan' => '4.1.0',
    'CPU fan' => '4.2.0', 'Thermal' => '8.0');
foreach ($components as $component => $suffix) {
    if (list.has($system, $suffix)) {
        value('status', list.get($statuses, $system[$suffix], 'unknown'), $component);
    }
}

$updates = array(1 => 'available', 2 => 'unavailable', 3 => 'connecting', 4 => 'disconnected', 5 => 'others');
value('temperature', $system['2.0']);
value('update', list.get($updates, list.get($system, '5.4.0', ''), 'unknown'));
value('model', $system['5.1.0']);
value('version', $system['5.3.0']);