Last update: July 20, 2023
This is a monitoring plugin to check power relay / power meter devices from Shelly. The checks show device information (such as firmware version) and show performance statistics for several sensors (power meter, temperature) which can be used to create graphs.
This plugin was developed for a Shelly Pro 4 PM device, which is a 2nd generation Shelly device. Other 2nd generation Shelly devices should therefore be compatible.
Since version 0.3 of check_shelly, 1st generation (Gen1) devices are also supported.
If you are looking for commercial support for this monitoring plugin, need customized modifications or in general customized monitoring plugins, contact us at Infiniroot.com.
859 downloads so far...
Download plugin and save it in your Nagios/Monitoring plugin folder (usually /usr/lib/nagios/plugins, depending on your distribution). Afterwards adjust the permissions (usually chmod 755).
Community contributions welcome on GitHub repository.
20220214-16: Development on Shelly Pro 4 PM (2nd Gen device)
20220216 0.1: Code published in public repository
20230120 0.2: Check whether relay switch is turned on or off (--expect-powerstatus)
20230718 0.3: Support for generation 1 shelly devices (Fabian Ihle)
Parameter short | Parameter long | Description |
-H * | --host * | Hostname or ip address of Shelly device |
-a | --auth | Toggle this if your Shelly device requires authentication |
-u | --user | Username if authentication is required (Shelly username is actually always admin) |
-p | --password | Password if authentication is required |
-t * | --type * | Type of check to run (see definition of the check types below) |
-v | --shelly-version | 1 or 2 (generation) of Shelly device, defaults to 2 |
-m + | --model + | Hardware model of Shelly device (defaults to Pro4PM) |
-s | --switch | Select the switch id of this Shelly device (e.g. switch_0 would be 0, defaults to 0) |
N/A | --ignore-restart | Do not warn when Shelly device requires a restart |
N/A | --expect-powerstatus | Used in combination with the "meter" check type, warn when the relay switch power status does not match the expected status. Value can be on (on,1) or off (off,0). |
-h | --help | Help! |
* mandatory parameter
+ reserved for future use (not used yet)
Type | Description |
info | Show device information (model, generation, firmware, ...) |
system | Check device's system (file system, memory, firmware) and health. Performance data for system statistics. |
meter | Shows statistics (power usage) from relay switch (defaults to switch_0, change with -s parameter). Automatically adds performance data for several statistics. |
Usage:
./check_shelly.py [-h] -H HOST [-a] [-u USER] [-p PASSWORD] -t {info,system,meter} [-m SHELLY_MODEL] [-s SHELLY_SWITCH] [--ignore-restart] [--expect-powerstatus]
Example: Info check. The Shelly device's information is retrieved and shown.
./check_shelly.py -H IPofShelly -t info
SHELLY OK: Device Pro4PM (Model: SPSW-004PE16EU, Generation: 2, Firmware: 0.9.3) is running - Authentication is enabled
Example: Authentication is required. When authentication is enabled on the Shelly device, the plugin will notify:
./check_shelly.py -H IPofShelly -t system
SHELLY WARNING: unable to authenticate (Shelly requires authentication)
Example: System check. Check the system health of the Shelly device using authentication. If the device requires a restart, a warning is shown:
./check_shelly.py -H IPofShelly -t system -a -p secret
SHELLY WARNING: Device (shellypro4pm-XXXXXXXXXXXX) requires a restart |uptime=154966 memory=110472B;;;0;234888 disk=229376B;;;0;524288
Example: Ignore restart required. The previous alert (Device requires restart) can be ignored with an additional parameter:
./check_shelly.py -H IPofShelly -t system -a -p secret --ignore-restart
SHELLY OK: Device (shellypro4pm-XXXXXXXXXXXX), uptime 155265 |uptime=155265 memory=110480B;;;0;234924 disk=229376B;;;0;524288
Example: Power Meter check. Show power statistics from the device's relay switches. Defaults to Switch_0 if there are multiple switches:
./check_shelly.py -H IPofShelly -t meter -a -p secret
SHELLY OK: Device (shellypro4pm-XXXXXXXXXX) SWITCH_0 is on, currently using 479 Watt / 2 Amp |power=479 current=2 total_power=11155.536 temp=51.3
Example: Power Meter check on different switch ID. Show power statistics from the device's Switch_1:
./check_shelly.py -H IPofShelly -t meter -a -p secret -s 1
SHELLY OK: Device (shellypro4pm-XXXXXXXXXXXX) SWITCH_1 is off, currently using 0 Watt / 0 Amp |power=0 current=0 total_power=0.000 temp=51.0
Example: Warn when relay switch is set to off:
./check_shelly.py -H IPofShelly -t meter -a -p secret -s 1 --expect-powerstatus 1
SHELLY WARNING: Device (shellypro4pm-XXXXXXXXXXXX) SWITCH_1 is off, currently using 0 Watt / 0 Amp |power=0 current=0 total_power=0.000 temp=51.0
The following command definition allows optional parameters all defined within ARG4.
# 'check_shelly' command definition
define command{
command_name check_shelly
command_line $USER1$/check_shelly.py -H $HOSTADDRESS$ -t $ARG1$ $ARG2$
}
object CheckCommand "check_shelly" {
import "plugin-check-command"
command = [ PluginContribDir + "/check_shelly.py" ]
arguments = {
"-H" = {
value = "$shelly_address$"
description = "Hostname or IP Address of Shelly device"
required = true
}
"-a" = {
set_if = "$shelly_authentication$"
description = "Use authentication (requires password)"
}
"-u" = {
value = "$shelly_user$"
description = "Username if authentication is required (default: admin)"
}
"-p" = {
value = "$shelly_password$"
description = "Password if authentication is required"
}
"-t" = {
value = "$shelly_checktype$"
description = "Define what you want to check"
required = true
}
"-v" = {
value = "$shelly_version$"
description = "Define the generation/version of this Shelly device"
}
"-m" = {
value = "$shelly_model$"
description = "Hardware model of Shelly device (defaults to Pro4PM) - not used yet"
}
"-s" = {
value = "$shelly_switch$"
description = "Define which Shelly switch ID should be monitored using the 'meter' check type (default: 0)"
}
"--ignore-restart" = {
set_if = "$shelly_ignore_restart$"
description = "Do not warn when Shelly device requires a restart"
}
"--expect-powerstatus" = {
set_if = "$shelly_powerstatus$"
description = "Expect power status of a relay switch (value can be one of: 1,on,0,off)"
}
}
vars.shelly_address = "$address$"
vars.shelly_user = "admin"
vars.shelly_switch = "0"
vars.shelly_version = "2"
}
# Check Shelly Information
define service{
use generic-service
host_name shelly1
service_description Shelly Info
check_command check_shelly!info
}
# Check Shelly System
define service{
use generic-service
host_name shelly1
service_description Shelly System
check_command check_shelly!system!-a -p secret
}
# Check Shelly Meter Switch_0
define service{
use generic-service
host_name shelly1
service_description Shelly Switch_0
check_command check_shelly!meter!-a -p secret -s 0
}
# Check Shelly Meter Switch_1
define service{
use generic-service
host_name shelly1
service_description Shelly Switch_1
check_command check_shelly!meter!-a -p secret -s 1
}
# Check Shelly Info
object Service "Shelly Info" {
import "generic-service"
host_name = "shelly1"
check_command = "check_shelly"
vars.shelly_checktype = "info"
}
# Check Shelly System
object Service "Shelly System" {
import "generic-service"
host_name = "shelly1"
check_command = "check_shelly"
vars.shelly_checktype = "system"
vars.shelly_password = "secret"
vars.shelly_authentication = true
}
# Check Shelly Switch_0 Meter
object Service "Shelly Switch_0 Meter" {
import "generic-service"
host_name = "shelly1"
check_command = "check_shelly"
vars.shelly_checktype = "meter"
vars.shelly_password = "secret"
vars.shelly_authentication = true
vars.shelly_switch = "0"
}
# Check Shelly Switch_1 Meter
object Service "Shelly Switch_1 Meter" {
import "generic-service"
host_name = "shelly1"
check_command = "check_shelly"
vars.shelly_checktype = "meter"
vars.shelly_password = "secret"
vars.shelly_authentication = true
vars.shelly_switch = "1"
vars.shelly_powerstatus = "1"
}