From e8dcc82a250e8c1c0dc1e63b539a2b89e48bc061 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Tue, 9 Jan 2024 11:04:20 +0100
Subject: [PATCH] update project

---
 README.md                                     |   2 +-
 mkp/fritzbox_smarthome-0.8.8-20240109.mkp     | Bin 0 -> 16744 bytes
 .../fritzbox_smarthome_power_meter.py         |  78 +++++++++++++++---
 source/packages/fritzbox_smarthome            |   2 +-
 4 files changed, 69 insertions(+), 13 deletions(-)
 create mode 100644 mkp/fritzbox_smarthome-0.8.8-20240109.mkp

diff --git a/README.md b/README.md
index da24f00..c4ca544 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[PACKAGE]: ../../raw/master/mkp/fritzbox_smarthome-0.8.7-20240108.mkp "fritzbox_smarthome-0.8.7-20240108.mkp"
+[PACKAGE]: ../../raw/master/mkp/fritzbox_smarthome-0.8.8-20240109.mkp "fritzbox_smarthome-0.8.8-20240109.mkp"
 # AVM Fritz!Box Smarthome
 
 This repository contains a additional check_MK Fritz!Box Agent which can gather informations over the AVM AHA HTTP Interface about SmartHome Devices connected to an Fritz!Box. 
diff --git a/mkp/fritzbox_smarthome-0.8.8-20240109.mkp b/mkp/fritzbox_smarthome-0.8.8-20240109.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..55f50e4a6086bd6befc34d4543250fdd1f40da67
GIT binary patch
literal 16744
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

literal 0
HcmV?d00001

diff --git a/source/agent_based/fritzbox_smarthome_power_meter.py b/source/agent_based/fritzbox_smarthome_power_meter.py
index a337af5..b7107ea 100644
--- a/source/agent_based/fritzbox_smarthome_power_meter.py
+++ b/source/agent_based/fritzbox_smarthome_power_meter.py
@@ -12,20 +12,74 @@
 # 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,
     Service,
     State,
     check_levels,
-    get_value_store,
     register,
 )
 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))
+
 
 def discovery_fritzbox_smarthome_voltage_single(
         section: AvmSmartHomeDevice | Dict[str, AvmSmartHomeDevice]
@@ -174,7 +228,7 @@ def discovery_fritzbox_smarthome_energy_multiple(
 
 
 def _cost_period_x(
-        value_store: get_value_store,
+        value_store: FritzBoxValueStore,
         period_name: str,
         current_period: int,
         rate_name: str,
@@ -187,17 +241,17 @@ def _cost_period_x(
     # reset all
     # value_store[rate_name] = 0
 
-    if stored_period := value_store.get(period_name):
-        value_store[period_name] = current_period
+    if stored_period := value_store.get(key=period_name):
+        value_store.set(key=period_name, value=current_period)
 
     cost = last_reading / 1000 * cost_kwh
 
     if current_period != stored_period:
-        value_store[period_name] = current_period
-        value_store[rate_name] = cost
+        value_store.set(key=period_name, value=current_period)
+        value_store.set(key=rate_name, value=cost)
     else:
-        cost = value_store.get(rate_name, 0) + cost
-        value_store[rate_name] = cost
+        cost = value_store.get(key=rate_name, default_value=0) + cost
+        value_store.set(key=rate_name, value=cost)
 
     cost = round(cost, precision)
 
@@ -216,14 +270,14 @@ def check_fritzbox_smarthome_energy_single(
 
     energy = None
     time_span = None
-    value_store = get_value_store()
+    value_store = FritzBoxValueStore()
 
     if section.power_meter and section.power_meter.power is not None:
         if not (last_timestamp := value_store.get('last_timestamp')):
-            value_store['last_timestamp'] = time_now()
+            value_store.set(key='last_timestamp', value=time_now())
         else:
             time_span = time_now() - last_timestamp
-            value_store['last_timestamp'] = time_now()
+            value_store.set(key='last_timestamp', value=time_now())
 
             energy = section.power_meter.power / 3600 * time_span
 
@@ -316,6 +370,8 @@ def check_fritzbox_smarthome_energy_single(
                 )
                 yield Result(state=State.OK, notice=' ')
 
+    value_store.save()
+
     if energy:
         yield Result(
             state=State.OK,
diff --git a/source/packages/fritzbox_smarthome b/source/packages/fritzbox_smarthome
index e5b0668..bd5b1eb 100644
--- a/source/packages/fritzbox_smarthome
+++ b/source/packages/fritzbox_smarthome
@@ -50,7 +50,7 @@
                    'plugins/views/fritzbox_smarthome.py']},
  'name': 'fritzbox_smarthome',
  'title': 'Fritz!Box SmartHome',
- 'version': '0.8.7-20240108',
+ 'version': '0.8.8-20240109',
  'version.min_required': '2.2.0b1',
  'version.packaged': '2.2.0p17',
  'version.usable_until': None}
-- 
GitLab