From 397b4ab5259319dc559d08d10f2134d623d600e9 Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Tue, 9 Jan 2024 18:36:44 +0100 Subject: [PATCH] update project --- mkp/fritzbox_smarthome-0.8.8-20240109.mkp | Bin 16744 -> 16947 bytes .../fritzbox_smarthome_power_meter.py | 59 +--------- .../fritzbox_smarthome_power_socket.py | 26 +++-- .../fritzbox_smarthome_thermostat.py | 2 +- .../agent_based/utils/fritzbox_smarthome.py | 56 +++++++++ .../check_parameters/fritzbox_smarthome.py | 5 + .../fritzbox_smarthome_power_coscket.py | 107 ++++++++++++++++++ source/packages/fritzbox_smarthome | 3 +- 8 files changed, 191 insertions(+), 67 deletions(-) create mode 100644 source/gui/wato/check_parameters/fritzbox_smarthome_power_coscket.py diff --git a/mkp/fritzbox_smarthome-0.8.8-20240109.mkp b/mkp/fritzbox_smarthome-0.8.8-20240109.mkp index 55f50e4a6086bd6befc34d4543250fdd1f40da67..581710903fe925e3e585000d1f839647ce19e431 100644 GIT binary patch literal 16947 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 literal 16744 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 diff --git a/source/agent_based/fritzbox_smarthome_power_meter.py b/source/agent_based/fritzbox_smarthome_power_meter.py index b7107ea..d966c89 100644 --- a/source/agent_based/fritzbox_smarthome_power_meter.py +++ b/source/agent_based/fritzbox_smarthome_power_meter.py @@ -9,14 +9,10 @@ # File : fritzbox_smarthome_power_meter.py (check plugin) # # -# import time + from time import localtime, time as time_now from typing import Dict -from os import environ -from pathlib import Path -from json import loads, dumps -from cmk.checkers import plugin_contexts from cmk.base.plugins.agent_based.agent_based_api.v1 import ( Metric, Result, @@ -27,58 +23,7 @@ from cmk.base.plugins.agent_based.agent_based_api.v1 import ( ) from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import CheckResult, DiscoveryResult from cmk.utils.render import physical_precision -from cmk.base.plugins.agent_based.utils.fritzbox_smarthome import AvmSmartHomeDevice - -OMD_ROOT = environ["OMD_ROOT"] - - -class FritzBoxValueStore: - """ - Persistent kind of value_store. Located under ~/var/fritzbox_smarthome/{hostname}_{service_description} - """ - def __init__(self): - self._host_name = plugin_contexts.host_name() - self._service_description = plugin_contexts.service_description().replace(' ', '_') - self._file = Path(f'{OMD_ROOT}/var/firtzbox_smarthome/{self._host_name}_{self._service_description}') - self._counters = {} - if self._file.exists(): - self._counters = loads(self._file.read_text()) - else: - self._counters = {} - - def get(self, key: str, default_value: int | str | float | bool | None = None): - """ - Get a value from the value store - Args: - key: the key in the value store - default_value: the default value to return if key not found - - Returns: - The value for key from the value store. If key not exists the default_value or None - """ - return self._counters.get(key, default_value) - - def set(self, key: str, value: str | int | float | None) -> None: - """ - Set a value in the value stare. Use "None" as value to remove a key. - Args: - key: the key in the value store - value: the value to set - """ - if value is None: - try: - self._counters.pop(key) - except KeyError: - pass - else: - self._counters[key] = value - - def save(self) -> None: - """ - Save the value_store as json to file - """ - self._file.parent.mkdir(exist_ok=True, parents=True) - self._file.write_text(dumps(self._counters)) +from cmk.base.plugins.agent_based.utils.fritzbox_smarthome import AvmSmartHomeDevice, FritzBoxValueStore def discovery_fritzbox_smarthome_voltage_single( diff --git a/source/agent_based/fritzbox_smarthome_power_socket.py b/source/agent_based/fritzbox_smarthome_power_socket.py index 3a96807..63439f8 100644 --- a/source/agent_based/fritzbox_smarthome_power_socket.py +++ b/source/agent_based/fritzbox_smarthome_power_socket.py @@ -46,14 +46,24 @@ def check_fritzbox_smarthome_power_socket_single( return def _get_status(status: int): - _switch_state = { - 0: 'off', - 1: 'on', + _state = { + 0: ('off', params.get('state', {}).get('off', 0)), + 1: ('on', params.get('state', {}).get('on', 0)), } - return _switch_state.get(status, f'unknown ({status})') + return _state.get(status, (f'unknown ({status})', 3)) - yield Result(state=State.OK, summary=f'State: {_get_status(section.switch.state)}') - yield Result(state=State.OK, summary=f'Mode: {section.switch.mode}') + state_readable, state = _get_status(section.switch.state) + yield Result(state=State(state), summary=f'State: {state_readable}') + + def _get_mode(mode: str): + _mode = { + 'manuell': ('manuell', params.get('mode', {}).get('manuell', 0)), + 'automatic': ('automatic', params.get('mode', {}).get('automatic', 0)), + } + return _mode.get(mode, (f'unknown ({mode})', 3)) + + mode_readable, mode = _get_mode(section.switch.mode) + yield Result(state=State(mode), summary=f'Mode: {mode_readable}') def check_fritzbox_smarthome_power_socket_multiple( @@ -72,7 +82,7 @@ register.check_plugin( sections=['fritzbox_smarthome'], discovery_function=discovery_fritzbox_smarthome_power_socket_single, check_function=check_fritzbox_smarthome_power_socket_single, - # check_ruleset_name='fritzbox_smarthome_power_socket', + check_ruleset_name='fritzbox_smarthome_power_socket_single', check_default_parameters={} ) @@ -83,6 +93,6 @@ register.check_plugin( sections=['fritzbox_smarthome'], discovery_function=discovery_fritzbox_smarthome_power_socket_multiple, check_function=check_fritzbox_smarthome_power_socket_multiple, - # check_ruleset_name='fritzbox_smarthome_power_socket', + check_ruleset_name='fritzbox_smarthome_power_socket_multiple', check_default_parameters={} ) diff --git a/source/agent_based/fritzbox_smarthome_thermostat.py b/source/agent_based/fritzbox_smarthome_thermostat.py index fcd6244..9828c3c 100644 --- a/source/agent_based/fritzbox_smarthome_thermostat.py +++ b/source/agent_based/fritzbox_smarthome_thermostat.py @@ -65,7 +65,7 @@ def check_fritzbox_smarthome_thermostat_single( if thermostat.temp_target == 126.5: # == radiator off yield Result(state=State.OK, summary=f'Temperature current: {thermostat.temp_current}°C') - yield Result(state=State.OK, summary=f'Temperature target: radiator off') + yield Result(state=State(params.get('state_off', 0)), summary=f'Temperature target: radiator off') else: deviation = thermostat.temp_current - thermostat.temp_target if deviation == 0: diff --git a/source/agent_based/utils/fritzbox_smarthome.py b/source/agent_based/utils/fritzbox_smarthome.py index 25c4b8b..b361852 100644 --- a/source/agent_based/utils/fritzbox_smarthome.py +++ b/source/agent_based/utils/fritzbox_smarthome.py @@ -14,6 +14,11 @@ from dataclasses import dataclass from typing import Any, List, Dict +from os import environ +from pathlib import Path +from json import loads, dumps + +from cmk.checkers import plugin_contexts @dataclass(frozen=True) @@ -93,6 +98,57 @@ _AVM_TEMPERATURE = 'temperature' _AVM_SIMPLE_ON_OFF = 'simpleonoff' _AVM_NEXT_CHANGE = 'nextchange' +_OMD_ROOT = environ["OMD_ROOT"] + + +class FritzBoxValueStore: + """ + Persistent kind of value_store. Located under ~/var/fritzbox_smarthome/{hostname}_{service_description} + """ + def __init__(self): + self._host_name = plugin_contexts.host_name() + self._service_description = plugin_contexts.service_description().replace(' ', '_') + self._file = Path(f'{_OMD_ROOT}/var/firtzbox_smarthome/{self._host_name}_{self._service_description}') + self._counters = {} + if self._file.exists(): + self._counters = loads(self._file.read_text()) + else: + self._counters = {} + + def get(self, key: str, default_value: int | str | float | bool | None = None): + """ + Get a value from the value store + Args: + key: the key in the value store + default_value: the default value to return if key not found + + Returns: + The value for key from the value store. If key not exists the default_value or None + """ + return self._counters.get(key, default_value) + + def set(self, key: str, value: str | int | float | None) -> None: + """ + Set a value in the value stare. Use "None" as value to remove a key. + Args: + key: the key in the value store + value: the value to set + """ + if value is None: + try: + self._counters.pop(key) + except KeyError: + pass + else: + self._counters[key] = value + + def save(self) -> None: + """ + Save the value_store as json to file + """ + self._file.parent.mkdir(exist_ok=True, parents=True) + self._file.write_text(dumps(self._counters)) + def _get_battery_low(device: Dict[str, Any]) -> int | None: try: diff --git a/source/gui/wato/check_parameters/fritzbox_smarthome.py b/source/gui/wato/check_parameters/fritzbox_smarthome.py index 3dc4c80..cf75d6a 100644 --- a/source/gui/wato/check_parameters/fritzbox_smarthome.py +++ b/source/gui/wato/check_parameters/fritzbox_smarthome.py @@ -73,6 +73,11 @@ def _parameter_valuespec_fritzbox_smarthome_thermostat(): Integer(title=_('Warning'), default_value=3, unit=_('°C')), Integer(title=_('Critical'), default_value=5, unit=_('°C')), ])), + ('state_off', + MonitoringState( + title=_('Monitoring state if thermostat is off'), + default_value=0, + )), ('state_on_error', MonitoringState( title=_('Monitoring state on error'), diff --git a/source/gui/wato/check_parameters/fritzbox_smarthome_power_coscket.py b/source/gui/wato/check_parameters/fritzbox_smarthome_power_coscket.py new file mode 100644 index 0000000..d22482e --- /dev/null +++ b/source/gui/wato/check_parameters/fritzbox_smarthome_power_coscket.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# License: GNU General Public License v2 +# +# Author: thl-cmk[at]outlook[dot]com +# URL : https://thl-cmk.hopto.org +# Date : 2024-01-09 +# File : fritzbox_smarthome_lock.py (WATO check plugin) +# + + +from cmk.gui.i18n import _ +from cmk.gui.valuespec import ( + Dictionary, + MonitoringState, + TextInput, + Alternative, +) +from cmk.gui.plugins.wato.utils import ( + CheckParameterRulespecWithItem, + CheckParameterRulespecWithoutItem, + RulespecGroupCheckParametersApplications, + rulespec_registry, +) + + +def _parameter_valuespec_fritzbox_smarthome_power_socket(): + return Dictionary( + title=_('Parameter'), + elements=[ + ('state', + Alternative( + title=_('Power Socket state'), + elements=[ + Dictionary( + title=_('Switched On'), + optional_keys=False, + elements=[ + ('on', + MonitoringState( + title=_('Monitoring state'), + default_value=0, + )), + ]), + Dictionary( + title=_('Switched off'), + optional_keys=False, + elements=[ + ('off', + MonitoringState( + title=_('Monitoring state'), + default_value=0, + )) + ]), + ] + )), + ('mode', + Alternative( + title=_('Power Socket switching mode'), + elements=[ + Dictionary( + title=_('Manuell'), + optional_keys=False, + elements=[ + ('manuell', + MonitoringState( + title=_('Monitoring state'), + default_value=0, + )), + ]), + Dictionary( + title=_('Automatic'), + optional_keys=False, + elements=[ + ('automatic', + MonitoringState( + title=_('Monitoring state'), + default_value=0, + )) + ]), + ] + )), + ], + ) + + +rulespec_registry.register( + CheckParameterRulespecWithoutItem( + check_group_name="fritzbox_smarthome_power_socket_single", + group=RulespecGroupCheckParametersApplications, + match_type="dict", + parameter_valuespec=_parameter_valuespec_fritzbox_smarthome_power_socket, + title=lambda: _('Fritz!Box Smarthome Power socket') + ) +) + +rulespec_registry.register( + CheckParameterRulespecWithItem( + check_group_name="fritzbox_smarthome_power_socket_multiple", + group=RulespecGroupCheckParametersApplications, + match_type="dict", + parameter_valuespec=_parameter_valuespec_fritzbox_smarthome_power_socket, + title=lambda: _('Fritz!Box Smarthome Power Socket (with Device-ID)'), + item_spec=lambda: TextInput(title=_('Device-ID')), + ) +) diff --git a/source/packages/fritzbox_smarthome b/source/packages/fritzbox_smarthome index bd5b1eb..adf1f52 100644 --- a/source/packages/fritzbox_smarthome +++ b/source/packages/fritzbox_smarthome @@ -44,7 +44,8 @@ 'metrics/fritzbox_smarthome.py', 'wato/check_parameters/temperature_single.py', 'wato/check_parameters/voltage_single.py', - 'wato/check_parameters/fritzbox_smarthome_lock.py'], + 'wato/check_parameters/fritzbox_smarthome_lock.py', + 'wato/check_parameters/fritzbox_smarthome_power_coscket.py'], 'lib': ['python3/cmk/special_agents/agent_fritzbox_smarthome.py'], 'web': ['plugins/wato/agent_fritzbox_smarthome.py', 'plugins/views/fritzbox_smarthome.py']}, -- GitLab