From a9e9ac19742aca452afa22771e6e7d3d94fc3ea5 Mon Sep 17 00:00:00 2001 From: Dirk Alders Date: Sun, 31 Dec 2023 17:57:24 +0100 Subject: [PATCH] linkqaulity added for zigbee devices --- check_z_heartbeat | 5 ++++- check_z_linkquality | 1 + z_server/devices/__init__.py | 22 ++++++++++++++++++++++ z_server/z_protocol.py | 2 ++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 120000 check_z_linkquality diff --git a/check_z_heartbeat b/check_z_heartbeat index f2d97c1..8112b16 100755 --- a/check_z_heartbeat +++ b/check_z_heartbeat @@ -7,7 +7,7 @@ import time from z_server import config from z_server import tcp_socket from z_server.z_protocol import server as client_prot -from z_server.z_protocol import DID_FOLLOWS_SETPOINT, DID_BATTERY_LEVEL, DID_HEARTBEAT +from z_server.z_protocol import DID_FOLLOWS_SETPOINT, DID_BATTERY_LEVEL, DID_HEARTBEAT, DID_LINKQUALITY from z_server import socket_protocol import sys @@ -38,6 +38,9 @@ if __name__ == '__main__': elif sys.argv[0].endswith('check_z_battery'): sp.send(socket_protocol.SID_READ_REQUEST, DID_BATTERY_LEVEL, data) sp_data = sp.receive(socket_protocol.SID_READ_RESPONSE, DID_BATTERY_LEVEL).get_data() + elif sys.argv[0].endswith('check_z_linkquality'): + sp.send(socket_protocol.SID_READ_REQUEST, DID_LINKQUALITY, data) + sp_data = sp.receive(socket_protocol.SID_READ_RESPONSE, DID_LINKQUALITY).get_data() elif sys.argv[0].endswith('check_z_follow'): sp.send(socket_protocol.SID_READ_REQUEST, DID_FOLLOWS_SETPOINT, data) sp_data = sp.receive(socket_protocol.SID_READ_RESPONSE, DID_FOLLOWS_SETPOINT).get_data() diff --git a/check_z_linkquality b/check_z_linkquality new file mode 120000 index 0000000..9d4fee9 --- /dev/null +++ b/check_z_linkquality @@ -0,0 +1 @@ +check_z_follow \ No newline at end of file diff --git a/z_server/devices/__init__.py b/z_server/devices/__init__.py index d5b6987..1709336 100644 --- a/z_server/devices/__init__.py +++ b/z_server/devices/__init__.py @@ -15,6 +15,7 @@ class base(object): MONITORING_HEARTBEAT = "heartbeat" MONITORING_BATTERY = "battery" MONITORING_FOLLOW_SETPOINT = "follow_setpoint" + MONITORING_LINKQUALITY = "linkquality" # FOLLOW_REQUEST_WARNING = 5 # Seconds, till warning comes up, if device does not follow the command FOLLOW_REQUEST_ERROR = 60 # Seconds, till error comes up, if device does not follow the command @@ -23,6 +24,9 @@ class base(object): BATTERY_LVL_WARNING = 15 BATTERY_LVL_ERROR = 5 # + LINKQUALITY_WARNING = 50 + LINKQUALITY_ERROR = 25 + # LAST_MSG_WARNING = 6 * 60 * 60 LAST_MSG_ERROR = 24 * 60 * 60 @@ -40,6 +44,7 @@ class base(object): self.__state_storage__ = {} # self.battery = None + self.linkquality = None def __rx__(self, client, userdata, message): try: @@ -66,6 +71,11 @@ class base(object): # if self.MONITORING_BATTERY in payload and message.topic == self.topic: self.battery = payload[self.MONITORING_BATTERY] + # + # linkquality + # + if self.MONITORING_LINKQUALITY in payload and message.topic == self.topic: + self.linkquality = payload[self.MONITORING_LINKQUALITY] def target(self, key, value): tm_t, value_t = self.__target_storage__.get(key, (0, None)) @@ -126,6 +136,18 @@ class base(object): return self.__nagios_return__(self.MONITORING_BATTERY, nagios.Nagios.WARNING, "Battery level low (%.1f%%)" % self.battery) else: return self.__nagios_return__(self.MONITORING_BATTERY, nagios.Nagios.OK, "Battery okay (%.1f%%)" % self.battery) + # + # LINKQUALITY + # + elif key == self.MONITORING_LINKQUALITY: + if self.linkquality is None: + return self.__nagios_return__(self.MONITORING_LINKQUALITY, nagios.Nagios.UNKNOWN, "Device exists, but no data received or unknown monitoring") + elif self.linkquality <= self.LINKQUALITY_ERROR: + return self.__nagios_return__(self.MONITORING_LINKQUALITY, nagios.Nagios.ERROR, "Linkquality critical low (%d)" % self.linkquality) + elif self.linkquality <= self.LINKQUALITY_WARNING: + return self.__nagios_return__(self.MONITORING_LINKQUALITY, nagios.Nagios.WARNING, "Linkquality level low (%d)" % self.linkquality) + else: + return self.__nagios_return__(self.MONITORING_LINKQUALITY, nagios.Nagios.OK, "Linkquality okay (%d)" % self.linkquality) def __nagios_return__(self, monitoring_name, status, msg, force=False): tm = time.time() diff --git a/z_server/z_protocol.py b/z_server/z_protocol.py index 940193b..90708b8 100644 --- a/z_server/z_protocol.py +++ b/z_server/z_protocol.py @@ -5,6 +5,7 @@ import socket_protocol DID_FOLLOWS_SETPOINT = 'follow_setpoint' DID_BATTERY_LEVEL = 'battery' DID_HEARTBEAT = 'heartbeat' +DID_LINKQUALITY = 'linkquality' class server(socket_protocol.pure_json_protocol): @@ -16,6 +17,7 @@ class server(socket_protocol.pure_json_protocol): if not self.__comm_inst__.IS_CLIENT: self.register_callback(socket_protocol.SID_READ_REQUEST, DID_FOLLOWS_SETPOINT, self.device_status) self.register_callback(socket_protocol.SID_READ_REQUEST, DID_BATTERY_LEVEL, self.device_status) + self.register_callback(socket_protocol.SID_READ_REQUEST, DID_LINKQUALITY, self.device_status) self.register_callback(socket_protocol.SID_READ_REQUEST, DID_HEARTBEAT, self.device_status) def device_status(self, msg):