Преглед изворни кода

Fixed bug that considers no gateway data as not active beacon

GatewayStatusUpdate
Lorenzo Pollutri пре 4 дана
родитељ
комит
4c26f81aa0
1 измењених фајлова са 6 додато и 18 уклоњено
  1. +6
    -18
      mqtt_gateway_monitor.py

+ 6
- 18
mqtt_gateway_monitor.py Прегледај датотеку

@@ -3,7 +3,7 @@ import json
import logging
import os
import time
from typing import Dict, Optional, Tuple
from typing import Dict, Optional

import config_env
from logica_reslevis.gateway import GatewayJsonRepository
@@ -43,7 +43,7 @@ def _norm_mac(value: str) -> str:
return "".join(ch for ch in str(value).strip().lower() if ch.isalnum())


def _parse_line(line: str) -> Optional[Tuple[str, bool]]:
def _parse_line(line: str) -> Optional[str]:
line = line.strip()
if not line or " " not in line:
return None
@@ -75,14 +75,7 @@ def _parse_line(line: str) -> Optional[Tuple[str, bool]]:
return None

nums = gateway_entry.get("nums") if gateway_entry else None
has_data = len(data) > 1
if nums is not None:
try:
has_data = has_data and int(nums) > 0
except (TypeError, ValueError):
pass

return mac, has_data
return mac


class MqttGatewayMonitor:
@@ -107,7 +100,6 @@ class MqttGatewayMonitor:
self._gateway_repo = gateway_repo or GatewayJsonRepository()

self._last_seen: Dict[str, float] = {}
self._last_has_data: Dict[str, bool] = {}
self._lock = asyncio.Lock()
self._stop_event = asyncio.Event()
self._reader_task: Optional[asyncio.Task] = None
@@ -165,16 +157,14 @@ class MqttGatewayMonitor:
line = await self._proc.stdout.readline()
if not line:
break
parsed = _parse_line(line.decode("utf-8", errors="ignore"))
if not parsed:
mac = _parse_line(line.decode("utf-8", errors="ignore"))
if not mac:
continue
mac, has_data = parsed
mac_norm = _norm_mac(mac)
if not mac_norm:
continue
async with self._lock:
self._last_seen[mac_norm] = time.monotonic()
self._last_has_data[mac_norm] = bool(has_data)
finally:
if self._proc and self._proc.returncode is None:
self._proc.terminate()
@@ -194,7 +184,6 @@ class MqttGatewayMonitor:

async with self._lock:
last_seen = dict(self._last_seen)
last_has_data = dict(self._last_has_data)

status_by_mac: Dict[str, str] = {}
for gw in gateways:
@@ -203,8 +192,7 @@ class MqttGatewayMonitor:
continue

seen_at = last_seen.get(mac_norm)
has_data = last_has_data.get(mac_norm, False)
if seen_at is None or (now - seen_at) > self._stale_after or not has_data:
if seen_at is None or (now - seen_at) > self._stale_after:
status = "disabled"
else:
status = "active"


Loading…
Откажи
Сачувај