Procházet zdrojové kódy

Multi campagna rilevazione

master
root před 1 měsícem
rodič
revize
e66549a7a1
100 změnil soubory, kde provedl 1998 přidání a 2276 odebrání
  1. +3
    -1
      Dockerfile
  2. +77
    -46
      app/beacons.py
  3. +1
    -0
      app/config
  4. +23
    -55
      app/csv_config.py
  5. +25
    -29
      app/gateways.py
  6. +75
    -49
      app/infer_mode.py
  7. +57
    -799
      app/main.py
  8. +125
    -47
      app/map_manager.py
  9. +21
    -43
      app/normalize.py
  10. +1
    -1
      app/settings.py
  11. +135
    -337
      app/train_collect.py
  12. +112
    -0
      app/train_executor.py
  13. +66
    -400
      app/train_mode.py
  14. +97
    -75
      app/web_beacon.py
  15. +77
    -112
      app/web_status.py
  16. +139
    -145
      app/web_suite.py
  17. +146
    -0
      app/web_test_inference.py
  18. +126
    -56
      app/web_training_data.py
  19. +3
    -2
      config/config.yaml
  20. +113
    -0
      config/config.yaml_v1
  21. +68
    -0
      config/config.yaml_v2
  22. +114
    -0
      config/config.yaml_v3
  23. +0
    -1
      data/.web_state
  24. +2
    -0
      data/config/beacongroup.csv
  25. +6
    -5
      data/config/beacons.csv
  26. +9
    -9
      data/infer/infer.csv
  27. binární
      data/maps.bck/floor_0.png
  28. binární
      data/maps.bck/floor_1.png
  29. +0
    -1
      data/maps.bck/meta_0.json
  30. +0
    -1
      data/maps.bck/meta_1.json
  31. binární
      data/maps.old/floor_0.png
  32. binární
      data/maps.old/floor_1.png
  33. +0
    -9
      data/maps.old/meta_0.json
  34. +0
    -1
      data/maps.old/meta_1.json
  35. binární
      data/model/model.joblib
  36. +1
    -0
      data/model/model.joblib
  37. binární
      data/model/model_1770027181.joblib
  38. binární
      data/model/model_1770027851.joblib
  39. binární
      data/model/model_1770047673.joblib
  40. binární
      data/model/model_1770051207.joblib
  41. binární
      data/model/model_1770167688.joblib
  42. binární
      data/model/model_1770167694.joblib
  43. binární
      data/model/model_1770196914.joblib
  44. binární
      data/model/model_1770196917.joblib
  45. binární
      data/model/model_1770207345.joblib
  46. binární
      data/model/model_1770207346.joblib
  47. binární
      data/model/model_1770207359.joblib
  48. binární
      data/model/model_1770207362.joblib
  49. binární
      data/model/model_1770224119.joblib
  50. binární
      data/model/model_1770302194.joblib
  51. binární
      data/model/model_1770302198.joblib
  52. binární
      data/model/model_1770302200.joblib
  53. binární
      data/model/model_1770302354.joblib
  54. binární
      data/model/model_1770302511.joblib
  55. binární
      data/model/model_camp_00_20260209_004706.joblib
  56. binární
      data/model/model_camp_04_20260209_004711.joblib
  57. binární
      data/model/model_camp_08_20260209_004726.joblib
  58. binární
      data/model/model_camp_12_20260209_004751.joblib
  59. +0
    -0
      data/mqtt_raw/mqtt_raw_20260209_021743.log
  60. +0
    -0
      data/mqtt_raw/mqtt_raw_20260209_023024.log
  61. +313
    -0
      data/mqtt_raw/mqtt_raw_20260209_023636.log
  62. +0
    -2
      data/train/jobs/done/0_1450_500.csv
  63. +0
    -2
      data/train/jobs/done/0_1550_850.csv
  64. +0
    -2
      data/train/jobs/done/1_1050_1450.csv
  65. +0
    -2
      data/train/jobs/done/1_1250_600.csv
  66. +0
    -2
      data/train/jobs/done/1_1600_450.csv
  67. +0
    -2
      data/train/jobs/done/BC-21_-1_1050_250.csv
  68. +0
    -2
      data/train/jobs/done/BC-21_0_195_1425.csv
  69. +0
    -2
      data/train/jobs/done/BC-21_0_2114_796.csv
  70. +0
    -2
      data/train/jobs/done/BC-21_0_2115_697.csv
  71. +0
    -2
      data/train/jobs/done/BC-21_0_2568_946.csv
  72. +0
    -2
      data/train/jobs/done/BC-21_0_400_100.csv
  73. +0
    -2
      data/train/jobs/done/BC-21_0_619_122.csv
  74. +0
    -2
      data/train/jobs/done/BC-21_1_1050_500.csv
  75. +0
    -2
      data/train/jobs/done/BC-21_1_950_750.csv
  76. +0
    -2
      data/train/jobs/done/BC-22_-1_1650_1100.csv
  77. +0
    -2
      data/train/jobs/done/BC-22_-1_170_1418.csv
  78. +0
    -2
      data/train/jobs/done/BC-22_0_534_999.csv
  79. +0
    -2
      data/train/jobs/done/BC-23_0_1580_180.csv
  80. +0
    -2
      data/train/jobs/done/BC-23_1_130_1386.csv
  81. +0
    -2
      data/train/jobs/done/BC-23_1_1800_600.csv
  82. +0
    -2
      data/train/jobs/done/BC-24_1_1900_1400.csv
  83. +0
    -2
      data/train/jobs/done/BC-24_1_2200_1000.csv
  84. +0
    -2
      data/train/jobs/done/BC-25_0_562_239.csv
  85. +0
    -2
      data/train/jobs/done/BC-25_1_1450_600.csv
  86. +0
    -2
      data/train/jobs/done/BC-25_1_2400_300.csv
  87. +0
    -2
      data/train/jobs/done/BC-25_1_2500_1300.csv
  88. +5
    -0
      data/train/jobs/done/GBC-00_-1_1291_655.csv
  89. +5
    -0
      data/train/jobs/done/GBC-00_-1_1417_1081.csv
  90. +5
    -0
      data/train/jobs/done/GBC-00_-1_152_1379.csv
  91. +5
    -0
      data/train/jobs/done/GBC-00_-1_1687_221.csv
  92. +3
    -0
      data/train/jobs/done/GBC-00_-1_2122_693.csv
  93. +5
    -0
      data/train/jobs/done/GBC-00_-1_2547_235.csv
  94. +5
    -0
      data/train/jobs/done/GBC-00_-1_2642_1057.csv
  95. +5
    -0
      data/train/jobs/done/GBC-00_0_1105_707.csv
  96. +5
    -0
      data/train/jobs/done/GBC-00_0_2026_707.csv
  97. +5
    -0
      data/train/jobs/done/GBC-00_0_2897_72.csv
  98. +5
    -0
      data/train/jobs/done/GBC-00_0_2925_1485.csv
  99. +5
    -0
      data/train/jobs/done/GBC-00_0_70_1485.csv
  100. +5
    -0
      data/train/jobs/done/GBC-00_0_98_58.csv

+ 3
- 1
Dockerfile Zobrazit soubor

@@ -2,9 +2,11 @@ FROM python:3.10-slim
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

# Installiamo solo libgomp1 (necessaria per scikit-learn)
# Installiamo libgomp1, mosquitto-clients e coreutils (per stdbuf)
RUN apt-get update && apt-get install -y --no-install-recommends \
libgomp1 \
mosquitto-clients \
coreutils \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /app


+ 77
- 46
app/beacons.py Zobrazit soubor

@@ -1,51 +1,82 @@
from typing import Tuple, Dict, Any, Set, Iterable, List
from .normalize import normalize_mac, is_mac
import os
import csv
import io
from pathlib import Path
from typing import List, Dict, Any, Optional
import pandas as pd
from .normalize import norm_mac

DEFAULT_MAC_FIELDS: tuple[str, ...] = (
"mac",
"beacon_mac",
"beaconMac",
"device_mac",
"deviceMac",
"tag_mac",
"tagMac",
)
def _coord_token(v: float) -> str:
"""Trasforma coordinata in stringa sicura per nome file (es. -1 -> -1, 120.5 -> 120_5)."""
try:
fv = float(v)
except:
return str(v)
if abs(fv - round(fv)) < 1e-9:
return str(int(round(fv)))
s = f"{fv:.3f}".rstrip('0').rstrip('.')
return s.replace('.', '_')

def _first_present(item: dict, keys: Iterable[str]) -> str:
for k in keys:
if k in item and item.get(k):
return str(item.get(k))
return ""
def read_job_csv(job_path: Path, delimiter: str) -> List[Dict[str, Any]]:
"""Legge il Job CSV esteso e normalizza i campi per il Core."""
text = job_path.read_text(encoding="utf-8", errors="replace")
if not text.strip():
return []
# Rilevamento automatico delimitatore se diverso dal config
first_line = next((ln for ln in text.splitlines() if ln.strip()), "")
use_delim = delimiter
if ";" in first_line: use_delim = ";"
elif "," in first_line: use_delim = ","

def extract_beacon_macs(data: object, mac_fields: tuple[str, ...] = DEFAULT_MAC_FIELDS
) -> Tuple[Set[str], Dict[str, Any], List[str]]:
allowed: Set[str] = set()
by_mac: Dict[str, Any] = {}
invalid: List[str] = []

items = None
if isinstance(data, list):
items = data
elif isinstance(data, dict):
for key in ("items", "beacons", "trackers", "data", "result"):
v = data.get(key)
if isinstance(v, list):
items = v
break

if not items:
return allowed, by_mac, invalid

for item in items:
if not isinstance(item, dict):
f = io.StringIO(text)
r = csv.reader(f, delimiter=use_delim)
header = next(r, None)
if not header:
return []
# Normalizzazione Header (minuscolo, senza spazi)
header_norm = [h.strip().lower() for h in header]
idx = {name: i for i, name in enumerate(header_norm)}
rows = []
for cols in r:
if not cols or len(cols) < len(header):
continue
try:
# Estrazione usando i nomi esatti dei tuoi file
rows.append({
"mac": cols[idx["mac"]].strip(),
"x": float(cols[idx["x"]]),
"y": float(cols[idx["y"]]),
"z": float(cols[idx["z"]]),
"beaconname": cols[idx["beaconname"]].strip()
})
except Exception as e:
continue
raw = _first_present(item, mac_fields)
mac = normalize_mac(raw)
if mac and is_mac(mac):
allowed.add(mac)
by_mac[mac] = item
else:
if raw:
invalid.append(str(raw))
return rows

return allowed, by_mac, invalid
def write_samples_csv(path: Path, rows: List[Dict[str, Any]], gateway_headers: List[str], delimiter: str = ";", rssi_decimals: int = 0):
"""Scrive il campione con l'ordine colonne corretto: mac, x, y, z, ts_start, ts_end, GW..."""
# Aggiungiamo i timestamp all'header prima dei gateway
header = ["mac", "x", "y", "z", "ts_start", "ts_end"] + gateway_headers
tmp_path = path.with_suffix(".tmp")
with open(tmp_path, "w", newline="", encoding="utf-8") as f:
w = csv.writer(f, delimiter=delimiter)
w.writerow(header)
for row in rows:
line = []
for col in header:
val = row.get(col, "nan")
if col == "mac":
line.append(val)
elif isinstance(val, float):
if pd.isna(val): line.append("nan")
elif col in ["x", "y", "z"]: line.append(f"{val:.1f}")
# Timestamp e RSSI
else: line.append(f"{val:.{rssi_decimals if col not in ['ts_start', 'ts_end'] else 3}f}")
else:
line.append(str(val))
w.writerow(line)
os.replace(tmp_path, path)

+ 1
- 0
app/config Zobrazit soubor

@@ -0,0 +1 @@
../config/

+ 23
- 55
app/csv_config.py Zobrazit soubor

@@ -1,66 +1,34 @@
from __future__ import annotations

# app/csv_config.py
import csv
from dataclasses import dataclass
from pathlib import Path
from typing import List, Optional
from typing import List
from dataclasses import dataclass

# RIPRISTINATO IMPORT RELATIVO: Necessario per il Core Orchestrator
from .normalize import norm_mac


@dataclass
class GatewayDef:
class GatewayConfig:
mac: str
name: str = ""
id: str = ""
label: str = ""


def _sniff_delimiter(sample: str) -> str:
# fallback robusto: prova a sniffare, altrimenti ';'
def load_gateway_features_csv(file_path: str, delimiter: str = ";") -> List[GatewayConfig]:
"""Carica l'anagrafica gateway per definire l'ordine delle feature del modello."""
gws = []
p = Path(file_path)
if not p.exists():
return gws
try:
return csv.Sniffer().sniff(sample, delimiters=";,\t").delimiter
with open(p, "r", encoding="utf-8") as f:
reader = csv.DictReader(f, delimiter=delimiter)
# Normalizzazione header
reader.fieldnames = [fn.strip().lower() for fn in reader.fieldnames]
for row in reader:
raw_mac = row.get("mac", "").strip()
if raw_mac:
gws.append(GatewayConfig(mac=norm_mac(raw_mac)))
except Exception:
return ";"


def load_gateway_features_csv(path: str) -> List[GatewayDef]:
"""
Carica gateway.csv.
Attesi header: mac;name;id (name/id opzionali)
Normalizza MAC in formato canonico 'AA:BB:CC:DD:EE:FF'
"""
p = Path(path)
if not p.exists():
raise FileNotFoundError(f"gateway csv not found: {path}")

txt = p.read_text(encoding="utf-8", errors="ignore")
delim = _sniff_delimiter(txt[:2048])

rows: List[GatewayDef] = []
with p.open("r", encoding="utf-8", errors="ignore", newline="") as f:
rd = csv.DictReader(f, delimiter=delim)
for r in rd:
# accetta anche varianti tipo 'MAC' o 'gw_mac'
mac_raw = r.get("mac") or r.get("MAC") or r.get("gw_mac") or r.get("gateway_mac")
if not mac_raw:
continue
mac = norm_mac(mac_raw)
if not mac:
continue

name = (r.get("name") or r.get("NAME") or "").strip()
gid = (r.get("id") or r.get("ID") or "").strip()
rows.append(GatewayDef(mac=mac, name=name, id=gid))

return rows


# ---------------------------------------------------------------------------
# BACKWARD COMPATIBILITY
# main.py si aspetta load_gateway_csv() -> List[GatewayDef]
# ---------------------------------------------------------------------------
def load_gateway_csv(path: str) -> List[GatewayDef]:
"""
Alias compatibile per vecchie versioni.
"""
return load_gateway_features_csv(path)
pass
return gws

+ 25
- 29
app/gateways.py Zobrazit soubor

@@ -1,30 +1,26 @@
from typing import Tuple, Dict, Any, Set, List
from .normalize import normalize_mac, is_mac
import pandas as pd
from .normalize import norm_mac, is_mac # Usiamo norm_mac che esiste sicuramente

def extract_gateway_macs(data: object) -> Tuple[Set[str], Dict[str, Any], List[str]]:
"""
ritorna:
- allowed MAC (validi)
- mapping mac->record
- lista raw MAC invalidi (normalizzati quando possibile)
"""
allowed: Set[str] = set()
by_mac: Dict[str, Any] = {}
invalid: List[str] = []

if not isinstance(data, list):
return allowed, by_mac, invalid

for item in data:
if not isinstance(item, dict):
continue
raw = item.get("mac", "")
mac = normalize_mac(raw)
if mac and is_mac(mac):
allowed.add(mac)
by_mac[mac] = item
else:
if raw:
invalid.append(str(raw))

return allowed, by_mac, invalid
def load_gateway_csv(path, delimiter=";"):
"""Carica i gateway validi dal CSV."""
try:
df = pd.read_csv(path, sep=delimiter)
# Normalizziamo colonne
df.columns = [c.strip().lower() for c in df.columns]
if 'mac' not in df.columns:
return [], 0, 0
valid_macs = []
invalid_count = 0
for m in df['mac'].astype(str):
if is_mac(m):
valid_macs.append(norm_mac(m))
else:
invalid_count += 1
return valid_macs, invalid_count, 0
except Exception as e:
print(f"Errore gateways.py: {e}")
return [], 0, 0

+ 75
- 49
app/infer_mode.py Zobrazit soubor

@@ -15,7 +15,7 @@ from .logger_utils import log_msg as log
# Importiamo la funzione per caricare i gateway per mantenere l'ordine delle feature
from .csv_config import load_gateway_features_csv

BUILD_TAG = "infer-debug-v19-hierarchical-final"
BUILD_TAG = "infer-debug-v20-autoreload"

# -------------------------
# UTILITIES
@@ -27,12 +27,6 @@ def _norm_mac(s: str) -> str:
return ":".join([s[i:i+2] for i in range(0, 12, 2)])

def _predict_xyz(model_pkg: Dict[str, Any], X: np.ndarray) -> Tuple[int, float, float]:
"""
Logica di predizione basata su train_mode.py:
1. Predice Z (piano) tramite KNeighborsClassifier
2. Predice X, Y tramite KNeighborsRegressor specifico per quel piano
"""
# 1. Predizione del Piano (Z)
floor_clf = model_pkg.get("floor_clf")
if floor_clf is None:
raise ValueError("Il pacchetto modello non contiene 'floor_clf'")
@@ -40,16 +34,14 @@ def _predict_xyz(model_pkg: Dict[str, Any], X: np.ndarray) -> Tuple[int, float,
z_pred = floor_clf.predict(X)
z = int(z_pred[0])
# 2. Predizione X, Y (Coordinate)
xy_models = model_pkg.get("xy_by_floor", {})
regressor = xy_models.get(z)
if regressor is None:
# Se il piano predetto non ha un regressore XY, restituiamo solo il piano
return z, -1.0, -1.0
xy_pred = regressor.predict(X)
x, y = xy_pred[0] # L'output del regressore multi-output è [x, y]
x, y = xy_pred[0]
return z, float(x), float(y)

@@ -87,7 +79,6 @@ class RollingRSSI:
else:
feats.append(np.nan)
X = np.array(feats).reshape(1, -1)
# Sostituisce i NaN con il valore di riempimento definito nel training
return np.where(np.isnan(X), fill, X), found_count

# -------------------------
@@ -98,29 +89,54 @@ def run_infer(settings: Dict[str, Any]):
inf_c = settings.get("infer", {})
api_c = settings.get("api", {})
mqtt_c = settings.get("mqtt", {})
model_path = inf_c.get("model_path", "/data/model/model.joblib")
log(f"INFER_MODE build tag={BUILD_TAG}")

# Caricamento Modello e Configurazione Training
try:
model_pkg = joblib.load(inf_c.get("model_path", "/data/model/model.joblib"))
# Recuperiamo l'ordine dei gateway e il nan_fill direttamente dal modello salvato
gateways_ordered = model_pkg.get("gateways_order")
nan_fill = float(model_pkg.get("nan_fill", -110.0))
log(f"Model loaded. Features: {len(gateways_ordered)}, Fill: {nan_fill}")
except Exception as e:
log(f"CRITICAL: Failed to load model: {e}")
return
# Variabili di stato per il caricamento dinamico
model_pkg = None
last_model_mtime = 0
gateways_ordered = []
gateways_set = set()
nan_fill = -110.0

def load_model_dynamic():
nonlocal model_pkg, last_model_mtime, gateways_ordered, gateways_set, nan_fill
try:
current_mtime = os.path.getmtime(model_path)
if current_mtime != last_model_mtime:
log(f"🧠 Caricamento/Aggiornamento modello: {model_path}")
model_pkg = joblib.load(model_path)
last_model_mtime = current_mtime
# METADATI PER DEBUG
gateways_ordered = model_pkg.get("gateways_order", [])
gateways_set = set(gateways_ordered)
nan_fill = float(model_pkg.get("nan_fill", -110.0))
floors = list(model_pkg.get("xy_by_floor", {}).keys())
log(f"✅ MODELLO PRONTO: {len(gateways_ordered)} GW allenati.")
log(f"🏢 Piani mappati: {floors}")
log(f"🧪 Valore Fill (NaN): {nan_fill}")
if len(gateways_ordered) > 0:
log(f"📡 Primi 3 GW di riferimento: {gateways_ordered[:3]}")
return True
except Exception as e:
if model_pkg is None:
log(f"⚠️ In attesa di un modello valido in {model_path}...")
return False
return True

# Primo caricamento
load_model_dynamic()

gateways_set = set(gateways_ordered)
rolling = RollingRSSI(float(inf_c.get("window_seconds", 5.0)))
# --- Gestione Token e Beacons (identica a prima) ---
# --- Gestione Token e Beacons ---
token_cache = {"token": None, "expires_at": 0}
def get_token():
if time.time() < token_cache["expires_at"]: return token_cache["token"]
try:
# Recupero credenziali da secrets.yaml
with open("/config/secrets.yaml", "r") as f:
sec = yaml.safe_load(f).get("oidc", {})
payload = {
@@ -147,6 +163,7 @@ def run_infer(settings: Dict[str, Any]):
except: return []

def on_message(client, userdata, msg):
if not gateways_set: return
gw = _norm_mac(msg.topic.split("/")[-1])
if gw not in gateways_set: return
try:
@@ -158,9 +175,12 @@ def run_infer(settings: Dict[str, Any]):

mqtt_client = mqtt.Client()
mqtt_client.on_message = on_message
mqtt_client.connect(mqtt_c["host"], mqtt_c["port"])
mqtt_client.subscribe(mqtt_c["topic"])
mqtt_client.loop_start()
try:
mqtt_client.connect(mqtt_c["host"], mqtt_c["port"])
mqtt_client.subscribe(mqtt_c["topic"])
mqtt_client.loop_start()
except Exception as e:
log(f"MQTT Connect Error: {e}")

last_predict, last_api_refresh = 0.0, 0.0
beacons = []
@@ -168,6 +188,9 @@ def run_infer(settings: Dict[str, Any]):
while True:
now = time.time()
rolling.prune()
# Verifica se il link simbolico model.joblib è cambiato
load_model_dynamic()

if now - last_api_refresh >= float(api_c.get("refresh_seconds", 30)):
beacons = fetch_beacons()
@@ -175,28 +198,31 @@ def run_infer(settings: Dict[str, Any]):

if now - last_predict >= float(inf_c.get("refresh_seconds", 10.0)):
rows, count_ok = [], 0
for bm in beacons:
bm_n = _norm_mac(bm)
X, n_found = rolling.aggregate_features(bm_n, gateways_ordered, inf_c.get("aggregate", "median"), nan_fill)
z, x, y = -1, -1.0, -1.0
if n_found >= int(inf_c.get("min_non_nan", 1)):
try:
z, x, y = _predict_xyz(model_pkg, X)
if z != -1: count_ok += 1
except Exception as e:
log(f"Infer error {bm_n}: {e}")
rows.append(f"{bm_n};{int(z)};{int(round(x))};{int(round(y))}")

try:
out_p = Path(inf_c.get("output_csv", "/data/infer/infer.csv"))
with open(str(out_p) + ".tmp", "w") as f:
f.write("mac;z;x;y\n")
for r in rows: f.write(r + "\n")
os.replace(str(out_p) + ".tmp", out_p)
log(f"CYCLE: {count_ok}/{len(rows)} localized")
except Exception as e: log(f"File Error: {e}")
if model_pkg:
for bm in beacons:
bm_n = _norm_mac(bm)
X, n_found = rolling.aggregate_features(bm_n, gateways_ordered, inf_c.get("aggregate", "median"), nan_fill)
z, x, y = -1, -1.0, -1.0
if n_found >= int(inf_c.get("min_non_nan", 1)):
try:
z, x, y = _predict_xyz(model_pkg, X)
if z != -1: count_ok += 1
except Exception as e:
pass
rows.append(f"{bm_n};{int(z)};{int(round(x))};{int(round(y))}")

try:
out_p = Path(inf_c.get("output_csv", "/data/infer/infer.csv"))
out_p.parent.mkdir(parents=True, exist_ok=True)
with open(str(out_p) + ".tmp", "w") as f:
f.write("mac;z;x;y\n")
for r in rows: f.write(r + "\n")
os.replace(str(out_p) + ".tmp", out_p)
log(f"CYCLE: {count_ok}/{len(rows)} localized")
except Exception as e: log(f"File Error: {e}")
last_predict = now
time.sleep(0.5)

+ 57
- 799
app/main.py Zobrazit soubor

@@ -1,817 +1,75 @@
from .logger_utils import setup_global_logging, log_msg as log
import csv
import io
import json
import os
import ssl
import time
import traceback
from dataclasses import dataclass
from pathlib import Path
from typing import Any, Dict, List, Optional, Tuple
import hashlib
import re
import math
import statistics
import pandas as pd
import numpy as np
import requests
import joblib
import paho.mqtt.client as mqtt

# Import locali corretti
import threading
from .logger_utils import setup_global_logging, log_msg as log
from .settings import load_settings

def build_info() -> str:
return "infer-debug-v19-fixed"

def main() -> None:
# 1. Carica impostazioni
settings = load_settings()
# 2. Setup immediato dei log e dei silenziatori (PRIMA di ogni altra cosa)
setup_global_logging(settings)
# 3. Ora puoi loggare e tutto sarà sincronizzato e pulito
cfg_file = settings.get("_config_file", "/config/config.yaml")
keys = [k for k in settings.keys() if not str(k).startswith("_")]
log(f"Settings loaded from {cfg_file}. Keys: {keys}")
log(f"BUILD: {build_info()}")

def mac_plain(s: str) -> str:
"""Normalizza MAC a 12 hex uppercase senza separatori."""
return re.sub(r"[^0-9A-Fa-f]", "", (s or "")).upper()

def mac_colon(s: str) -> str:
"""MAC in formato AA:BB:CC:DD:EE:FF."""
p = mac_plain(s)
if len(p) != 12:
return p
return ":".join(p[i:i+2] for i in range(0, 12, 2))

def fmt_rssi(v, decimals: int) -> str:
"""Formatta RSSI come stringa, evitando '-82.0' quando decimals=0."""
if v is None:
return "nan"
try:
fv = float(v)
except Exception:
return "nan"
if math.isnan(fv):
return "nan"
if decimals <= 0:
return str(int(round(fv)))
return f"{round(fv, decimals):.{decimals}f}"


# -----------------------------

# Build info (printed at startup for traceability)
BUILD_ID = "ble-ai-localizer main.py 2026-01-30 build-floatagg-v1"
# --- NUOVO IMPORT ---
from .train_executor import run_train_monitor

def build_info() -> str:
"""Return a short build identifier for logs (no external deps, no git required)."""
try:
p = Path(__file__)
data = p.read_bytes()
sha = hashlib.sha256(data).hexdigest()[:12]
size = p.stat().st_size
return f"{BUILD_ID} sha256={sha} size={size}"
except Exception:
return f"{BUILD_ID} sha256=? size=?"

# Settings
# -----------------------------
def load_settings() -> Dict[str, Any]:
cfg = os.environ.get("CONFIG", "/config/config.yaml")
import yaml
with open(cfg, "r", encoding="utf-8") as f:
data = yaml.safe_load(f) or {}
data["_config_file"] = cfg

# Normalize config sections: prefer collect_train
if "collect_train" not in data and "training" in data:
log("WARNING: config usa 'training:' (alias). Consiglio: rinomina in 'collect_train:'")
data["collect_train"] = data.get("training", {}) or {}
return data


# -----------------------------
# MAC helpers
# -----------------------------
def norm_mac(mac: str) -> str:
"""Return MAC as AA:BB:CC:DD:EE:FF (upper), ignoring separators."""
m = (mac or "").strip().replace("-", "").replace(":", "").replace(".", "")
m = m.upper()
if len(m) != 12:
return mac.strip().upper()
return ":".join(m[i:i+2] for i in range(0, 12, 2))


# -----------------------------
# CSV write helpers
# -----------------------------
def safe_write_csv(
path: Path,
header: List[str],
rows: List[Dict[str, Any]],
delimiter: str = ";",
rssi_decimals: int = 0,
):
"""Scrive CSV in modo atomico e formattazione 'umana'.

- numeri interi: senza decimali (es. -82 invece di -82.0)
- RSSI: arrotondamento controllato da rssi_decimals (0 -> intero, >0 -> N cifre decimali)
*si applica solo alle colonne RSSI (dopo mac/x/y/z)*
- NaN: 'nan'
- colonna 'mac': normalizzata in formato con ':' (es. C3:00:00:57:B9:E7) se passa un MAC valido
"""
tmp = path.with_suffix(path.suffix + ".tmp")
# csv.writer richiede un singolo carattere come delimiter
if not isinstance(delimiter, str) or len(delimiter) != 1:
delimiter = ";"

try:
rssi_decimals = int(rssi_decimals)
except Exception:
rssi_decimals = 0
if rssi_decimals < 0:
rssi_decimals = 0

def fmt_cell(v: Any, col: str, idx: int) -> str:
if v is None:
return "nan"

# MAC normalizzato con ':'
if col.lower() == "mac" and isinstance(v, str):
v2 = mac_colon(v)
return v2

# NaN float
if isinstance(v, float):
if math.isnan(v):
return "nan"

# colonne RSSI (dopo mac/x/y/z)
if idx >= 4:
if rssi_decimals == 0:
return str(int(round(v)))
return f"{v:.{rssi_decimals}f}"

# altre colonne: compatta i (quasi) interi
if abs(v - round(v)) < 1e-9:
return str(int(round(v)))
return str(v)

# int / numpy int
if isinstance(v, (int, np.integer)):
# RSSI columns (after mac/x/y/z): respect rssi_decimals even for integer values
if idx >= 4:
if rssi_decimals == 0:
return str(int(v))
return f"{float(v):.{rssi_decimals}f}"
return str(int(v))

# numpy float
if isinstance(v, np.floating):
fv = float(v)
if math.isnan(fv):
return "nan"
if idx >= 4:
if rssi_decimals == 0:
return str(int(round(fv)))
return f"{fv:.{rssi_decimals}f}"
if abs(fv - round(fv)) < 1e-9:
return str(int(round(fv)))
return str(fv)

return str(v)

with tmp.open("w", newline="") as f:
w = csv.writer(f, delimiter=delimiter)
w.writerow(header)
for row in rows:
w.writerow([fmt_cell(row.get(col), col, idx) for idx, col in enumerate(header)])

tmp.replace(path)




def _coord_token(v: float) -> str:
# Stable token for filenames from coordinates.
# - if integer-ish -> '123'
# - else keep up to 3 decimals, strip trailing zeros, replace '.' with '_'
try:
fv=float(v)
except Exception:
return str(v)
if abs(fv - round(fv)) < 1e-9:
return str(int(round(fv)))
s=f"{fv:.3f}".rstrip('0').rstrip('.')
return s.replace('.', '_')
def read_job_csv(job_path: Path, delimiter: str) -> List[Dict[str, Any]]:
"""Legge job CSV supportando due formati:

1) Legacy:
mac;x;y;z
C3000057B9F4;1200;450;0

2) Esteso (storico):
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
A21;1;P1-NETW;800;1050;1;BC-21;C3:00:00:57:B9:E6

Estrae solo X,Y,Z,MAC e normalizza MAC in formato compatto (senza ':', uppercase).
"""
text = job_path.read_text(encoding="utf-8", errors="replace")
if not text.strip():
return []

first_line = next((ln for ln in text.splitlines() if ln.strip()), "")
use_delim = delimiter
if use_delim not in first_line:
if ";" in first_line and "," not in first_line:
use_delim = ";"
elif "," in first_line and ";" not in first_line:
use_delim = ","

def hnorm(h: str) -> str:
h = (h or "").strip().lower()
h = re_sub_non_alnum(h)
return h

f = io.StringIO(text)
r = csv.reader(f, delimiter=use_delim)
header = next(r, None)
if not header:
return []

header_norm = [hnorm(h) for h in header]
idx = {name: i for i, name in enumerate(header_norm) if name}

def find_idx(names: List[str]) -> Optional[int]:
for n in names:
if n in idx:
return idx[n]
return None

mac_i = find_idx(["mac", "beaconmac", "beacon_mac", "trackermac", "tracker_mac", "device", "devicemac"])
x_i = find_idx(["x"])
y_i = find_idx(["y"])
z_i = find_idx(["z"])

if mac_i is None or x_i is None or y_i is None or z_i is None:
raise ValueError(
f"Job CSV header non riconosciuto: {header}. "
f"Attesi campi MAC/X/Y/Z (case-insensitive)."
)

rows: List[Dict[str, Any]] = []
for cols in r:
if not cols:
continue
if len(cols) <= max(mac_i, x_i, y_i, z_i):
continue
mac_raw = (cols[mac_i] or "").strip()
if not mac_raw:
continue

mac_compact = norm_mac(mac_raw).replace(":", "")

try:
x = float((cols[x_i] or "").strip())
y = float((cols[y_i] or "").strip())
z = float((cols[z_i] or "").strip())
except Exception:
continue

rows.append({"mac": mac_compact, "x": x, "y": y, "z": z})

return rows


def re_sub_non_alnum(s: str) -> str:
out = []
for ch in s:
if ("a" <= ch <= "z") or ("0" <= ch <= "9"):
out.append(ch)
return "".join(out)


def write_samples_csv(
out_path: Path,
sample_rows: List[Dict[str, Any]],
gateway_macs: List[str],
*,
delimiter: str = ";",
rssi_decimals: int = 0,
) -> None:
header = ["mac", "x", "y", "z"] + gateway_macs
safe_write_csv(out_path, header, sample_rows, delimiter=delimiter, rssi_decimals=rssi_decimals)

def load_gateway_csv(path: Path, delimiter: str = ";") -> Tuple[List[str], int, int]:
df = pd.read_csv(path, delimiter=delimiter)
cols = [c.strip().lower() for c in df.columns]
df.columns = cols

invalid = 0
macs: List[str] = []
seen = set()

if "mac" not in df.columns:
raise ValueError(f"gateway.csv must have a 'mac' column, got columns={list(df.columns)}")

for v in df["mac"].astype(str).tolist():
nm = norm_mac(v)
if len(nm.replace(":", "")) != 12:
invalid += 1
continue
if nm in seen:
continue
seen.add(nm)
macs.append(nm)

duplicates = max(0, len(df) - invalid - len(macs))
return macs, invalid, duplicates


# -----------------------------
# Fingerprint collector
# -----------------------------
@dataclass
class FingerprintStats:
counts: Dict[str, Dict[str, int]]
last: Dict[str, Dict[str, float]]
return "core-orchestrator-v1.4-background-train"

def run_all_modes(settings):
"""Lancia in simultanea i processi core: Collect, Infer e il nuovo Train Executor."""
log("Avvio modalità SIMULTANEA (Collect + Train Executor + Infer)...")
# 1. Importiamo le funzioni dai rispettivi moduli
from .train_collect import run_collect_train
from .infer_mode import run_infer

class FingerprintCollector:
def __init__(self) -> None:
self._lock = None
try:
import threading
self._lock = threading.Lock()
except Exception:
self._lock = None

# beacon_norm -> gw_norm -> list of rssi
self.rssi: Dict[str, Dict[str, List[float]]] = {}
self.last_seen_gw: Dict[str, float] = {}
self.last_seen_beacon: Dict[str, float] = {}

def _with_lock(self):
if self._lock is None:
class Dummy:
def __enter__(self): return None
def __exit__(self, *a): return False
return Dummy()
return self._lock

def update(self, gw_mac: str, beacon_mac: str, rssi: float) -> None:
gw = norm_mac(gw_mac)
b = norm_mac(beacon_mac)
now = time.time()
with self._with_lock():
self.last_seen_gw[gw] = now
self.last_seen_beacon[b] = now
self.rssi.setdefault(b, {}).setdefault(gw, []).append(float(rssi))

def stats(self, beacons: List[str], gateways: List[str]) -> FingerprintStats:
with self._with_lock():
counts: Dict[str, Dict[str, int]] = {b: {g: 0 for g in gateways} for b in beacons}
last: Dict[str, Dict[str, float]] = {b: {g: float("nan") for g in gateways} for b in beacons}
for b in beacons:
bm = norm_mac(b)
for g in gateways:
gm = norm_mac(g)
vals = self.rssi.get(bm, {}).get(gm, [])
counts[bm][gm] = len(vals)
if vals:
last[bm][gm] = vals[-1]
return FingerprintStats(counts=counts, last=last)

def feature_row(
self,
beacon_mac: str,
gateways: List[str],
aggregate: str,
rssi_min: float,
rssi_max: float,
min_samples_per_gateway: int,
outlier_method: str,
mad_z: float,
iqr_k: float,
max_stddev: Optional[float],
) -> Dict[str, float]:
b = norm_mac(beacon_mac)
out: Dict[str, float] = {}
with self._with_lock():
for g in gateways:
gm = norm_mac(g)
vals = list(self.rssi.get(b, {}).get(gm, []))

# hard clamp
vals = [v for v in vals if (rssi_min <= v <= rssi_max)]
if len(vals) < min_samples_per_gateway:
out[gm] = float("nan")
continue

# outlier removal
vals2 = vals
if outlier_method == "mad":
vals2 = mad_filter(vals2, z=mad_z)
elif outlier_method == "iqr":
vals2 = iqr_filter(vals2, k=iqr_k)

if len(vals2) < min_samples_per_gateway:
out[gm] = float("nan")
continue

if max_stddev is not None:
import statistics
try:
sd = statistics.pstdev(vals2)
if sd > max_stddev:
out[gm] = float("nan")
continue
except Exception:
pass

# Aggregate: mantieni float (niente cast a int) per poter usare rssi_decimals.
if aggregate == "median":
out[gm] = float(statistics.median(vals2))
elif aggregate == "median_low":
out[gm] = float(statistics.median_low(sorted(vals2)))
elif aggregate == "median_high":
out[gm] = float(statistics.median_high(sorted(vals2)))
elif aggregate == "mean":
out[gm] = float(statistics.fmean(vals2))
else:
out[gm] = float(statistics.median(vals2))
return out


def mad_filter(vals: List[float], z: float = 3.5) -> List[float]:
if not vals:
return vals
s = pd.Series(vals)
med = s.median()
mad = (s - med).abs().median()
if mad == 0:
return vals
mz = 0.6745 * (s - med).abs() / mad
return [float(v) for v, keep in zip(vals, (mz <= z).tolist()) if keep]


def iqr_filter(vals: List[float], k: float = 1.5) -> List[float]:
if not vals:
return vals
s = pd.Series(vals)
q1 = s.quantile(0.25)
q3 = s.quantile(0.75)
iqr = q3 - q1
if iqr == 0:
return vals
lo = q1 - k * iqr
hi = q3 + k * iqr
return [float(v) for v in vals if lo <= v <= hi]


# -----------------------------
# MQTT parsing
# -----------------------------
def parse_topic_gateway(topic: str) -> Optional[str]:
# expected: publish_out/<gwmac>
parts = (topic or "").split("/")
if len(parts) < 2:
return None
return parts[-1]


def parse_payload_list(payload: bytes) -> Optional[List[Dict[str, Any]]]:
try:
obj = json.loads(payload.decode("utf-8", errors="replace"))
if isinstance(obj, list):
return obj
return None
except Exception:
return None


def is_gateway_announce(item: Dict[str, Any]) -> bool:
return str(item.get("type", "")).strip().lower() == "gateway" and "mac" in item


# -----------------------------
# Collect train
# -----------------------------
def run_collect_train(settings: Dict[str, Any]) -> None:
cfg = settings.get("collect_train", {}) or {}
paths = settings.get("paths", {}) or {}
mqtt_cfg = settings.get("mqtt", {}) or {}
debug = settings.get("debug", {}) or {}

window_seconds = float(cfg.get("window_seconds", 180))
poll_seconds = float(cfg.get("poll_seconds", 2))
min_non_nan = int(cfg.get("min_non_nan", 3))
min_samples_per_gateway = int(cfg.get("min_samples_per_gateway", 5))
aggregate = str(cfg.get("aggregate", "median"))
# Numero di cifre decimali per i valori RSSI nei file samples (0 = intero)
try:
rssi_decimals = int(cfg.get("rssi_decimals", 0))
except Exception:
rssi_decimals = 0
if rssi_decimals < 0:
rssi_decimals = 0
rssi_min = float(cfg.get("rssi_min", -110))
rssi_max = float(cfg.get("rssi_max", -25))
outlier_method = str(cfg.get("outlier_method", "mad"))
mad_z = float(cfg.get("mad_z", 3.5))
iqr_k = float(cfg.get("iqr_k", 1.5))
max_stddev = cfg.get("max_stddev", None)
max_stddev = float(max_stddev) if max_stddev is not None else None

gateway_csv = Path(paths.get("gateways_csv", "/data/config/gateway.csv"))
csv_delimiter = str(paths.get("csv_delimiter", ";"))

jobs_dir = Path(cfg.get("jobs_dir", "/data/train/jobs"))
pending_dir = jobs_dir / "pending"
done_dir = jobs_dir / "done"
error_dir = jobs_dir / "error"
samples_dir = Path(cfg.get("samples_dir", "/data/train/samples"))

pending_dir.mkdir(parents=True, exist_ok=True)
done_dir.mkdir(parents=True, exist_ok=True)
error_dir.mkdir(parents=True, exist_ok=True)
samples_dir.mkdir(parents=True, exist_ok=True)

gw_ready_log_seconds = float(cfg.get("gw_ready_log_seconds", 10))
gw_ready_sleep_seconds = float(cfg.get("gw_ready_sleep_seconds", 5))
gw_ready_check_before_job = bool(cfg.get("gw_ready_check_before_job", True))
online_max_age_s = float(debug.get("online_check_seconds", 30))
progress_log_seconds = float(cfg.get("wait_all_gateways_log_seconds", 30))

gateway_macs, invalid, duplicates = load_gateway_csv(gateway_csv, delimiter=csv_delimiter)
log(f"[gateway.csv] loaded gateways={len(gateway_macs)} invalid={invalid} duplicates={duplicates}")

log(
"COLLECT_TRAIN config: gateway_csv=%s gateways(feature-set)=%d window_seconds=%.1f poll_seconds=%.1f rssi_decimals=%d jobs_dir=%s "
"pending_dir=%s done_dir=%s error_dir=%s samples_dir=%s mqtt=%s:%s topic=%s"
% (
gateway_csv,
len(gateway_macs),
window_seconds,
poll_seconds,
rssi_decimals,
jobs_dir,
pending_dir,
done_dir,
error_dir,
samples_dir,
mqtt_cfg.get("host", ""),
mqtt_cfg.get("port", ""),
mqtt_cfg.get("topic", "publish_out/#"),
)
)

fp = FingerprintCollector()

# MQTT setup
host = mqtt_cfg.get("host", "127.0.0.1")
port = int(mqtt_cfg.get("port", 1883))
topic = mqtt_cfg.get("topic", "publish_out/#")
client_id = mqtt_cfg.get("client_id", "ble-ai-localizer")
keepalive = int(mqtt_cfg.get("keepalive", 60))
proto = mqtt.MQTTv311

def on_connect(client, userdata, flags, rc):
log(f"MQTT connected rc={rc}, subscribed to {topic}")
client.subscribe(topic)

def on_message(client, userdata, msg):
gw_from_topic = parse_topic_gateway(msg.topic)
if not gw_from_topic:
return
payload_list = parse_payload_list(msg.payload)
if not payload_list:
return

for it in payload_list:
if not isinstance(it, dict):
continue
if is_gateway_announce(it):
gwm = it.get("mac", gw_from_topic)
fp.last_seen_gw[norm_mac(gwm)] = time.time()
continue

bmac = it.get("mac")
rssi = it.get("rssi")
if not bmac or rssi is None:
continue
try:
fp.update(gw_from_topic, bmac, float(rssi))
except Exception:
continue

client = mqtt.Client(client_id=client_id, protocol=proto)
client.on_connect = on_connect
client.on_message = on_message

username = str(mqtt_cfg.get("username", "") or "")
password = str(mqtt_cfg.get("password", "") or "")
if username:
client.username_pw_set(username, password)
# 2. Thread per la RACCOLTA DATI (Collect)
t_collect = threading.Thread(target=run_collect_train, args=(settings,), name="CollectorThread", daemon=True)
# 3. Thread per il MONITOR ADDESTRAMENTO (Train Executor)
# Rileva i file .lock inviati dal Web e addestra il modello in background
t_train_exec = threading.Thread(target=run_train_monitor, name="TrainExecutorThread", daemon=True)

tls = bool(mqtt_cfg.get("tls", False))
if tls:
client.tls_set(cert_reqs=ssl.CERT_NONE)
client.tls_insecure_set(True)
# 4. Thread per l'INFERENZA (Predict)
t_infer = threading.Thread(target=run_infer, args=(settings,), name="InferenceThread", daemon=True)

log("MQTT thread started (collect_train)")
client.connect(host, port, keepalive=keepalive)
client.loop_start()
# Avvio di tutti i processi in parallelo
t_collect.start()
t_train_exec.start()
t_infer.start()

# Wait gateways online
last_ready_log = 0.0
while True:
now = time.time()
online = 0
missing = []
for g in gateway_macs:
seen = fp.last_seen_gw.get(norm_mac(g))
if seen is not None and (now - seen) <= online_max_age_s:
online += 1
else:
missing.append(norm_mac(g))
if online == len(gateway_macs):
log(f"GW READY: online={online}/{len(gateway_macs)} (max_age_s={online_max_age_s:.1f})")
break
if now - last_ready_log >= gw_ready_log_seconds:
log(f"WAIT gateways online ({len(missing)} missing, seen={online}/{len(gateway_macs)}): {missing} (max_age_s={online_max_age_s:.1f})")
last_ready_log = now
time.sleep(gw_ready_sleep_seconds)

# Job loop
log("Tutti i processi core (incluso Train Executor) sono attivi.")
# Mantieni il main process attivo
while True:
try:
# periodic gw ready log
now = time.time()
if now - last_ready_log >= gw_ready_log_seconds:
online = 0
for g in gateway_macs:
seen = fp.last_seen_gw.get(norm_mac(g))
if seen is not None and (now - seen) <= online_max_age_s:
online += 1
log(f"GW READY: online={online}/{len(gateway_macs)} (max_age_s={online_max_age_s:.1f})")
last_ready_log = now

# pick job
job_files = sorted(pending_dir.glob("*.csv"))
if not job_files:
time.sleep(poll_seconds)
continue

job_path = job_files[0]
job_name = job_path.name

rows = read_job_csv(job_path, delimiter=csv_delimiter)
if not rows:
# move empty/bad jobs to error
log(f"TRAIN job ERROR: {job_name} err=EmptyJob: no valid rows")
job_path.rename(error_dir / job_path.name)
continue

# normalize beacons for stats keys
job_beacons_norm = [norm_mac(r["mac"]) for r in rows]

# optionally wait gateways online before starting the window
if gw_ready_check_before_job:
while True:
now = time.time()
online = 0
missing = []
for g in gateway_macs:
seen = fp.last_seen_gw.get(norm_mac(g))
if seen is not None and (now - seen) <= online_max_age_s:
online += 1
else:
missing.append(norm_mac(g))
if online == len(gateway_macs):
break
log(f"WAIT gateways online before job ({len(missing)} missing, seen={online}/{len(gateway_macs)}): {missing}")
time.sleep(1.0)

log(f"TRAIN job START: {job_name} beacons={len(rows)}")

start = time.time()
deadline = start + window_seconds
next_progress = start + progress_log_seconds

while time.time() < deadline:
time.sleep(0.5)
if progress_log_seconds > 0 and time.time() >= next_progress:
st = fp.stats(job_beacons_norm, gateway_macs)
parts = []
for b in job_beacons_norm:
total = sum(st.counts[b].values())
gw_seen = sum(1 for g in gateway_macs if st.counts[b][g] > 0)
parts.append(f"{b.replace(':','')}: total={total} gw={gw_seen}/{len(gateway_macs)}")
elapsed = int(time.time() - start)
log(f"COLLECT progress: {elapsed}s/{int(window_seconds)}s " + " | ".join(parts))
next_progress = time.time() + progress_log_seconds

out_rows: List[Dict[str, Any]] = []
st = fp.stats(job_beacons_norm, gateway_macs)

for r, b_norm in zip(rows, job_beacons_norm):
feats = fp.feature_row(
beacon_mac=b_norm,
gateways=gateway_macs,
aggregate=aggregate,
rssi_min=rssi_min,
rssi_max=rssi_max,
min_samples_per_gateway=min_samples_per_gateway,
outlier_method=outlier_method,
mad_z=mad_z,
iqr_k=iqr_k,
max_stddev=max_stddev,
)

non_nan = sum(1 for g in gateway_macs if feats.get(g) == feats.get(g))
if non_nan < min_non_nan:
sample_info = []
for g in gateway_macs:
c = st.counts[b_norm][g]
if c > 0:
sample_info.append(f"{g} n={c} last={st.last[b_norm][g]}")
preview = ", ".join(sample_info[:8]) + (" ..." if len(sample_info) > 8 else "")
log(
f"WARNING: beacon {b_norm.replace(':','')} low features non_nan={non_nan} "
f"(seen_gw={sum(1 for g in gateway_macs if st.counts[b_norm][g]>0)}) [{preview}]"
)

out_row: Dict[str, Any] = {
"mac": r["mac"], # MAC sempre compatto, senza ':'
"x": float(r["x"]),
"y": float(r["y"]),
"z": float(r["z"]),
}
out_row.update(feats)
out_rows.append(out_row)

written = []
for out_row in out_rows:
# Nome file: Z_X_Y.csv (Z, X, Y presi dal job)
zt = _coord_token(out_row.get("z"))
xt = _coord_token(out_row.get("x"))
yt = _coord_token(out_row.get("y"))
base_name = f"{zt}_{xt}_{yt}.csv"
out_path = samples_dir / base_name
write_samples_csv(out_path, [out_row], gateway_macs, delimiter=csv_delimiter, rssi_decimals=rssi_decimals)
written.append(out_path.name)

job_path.rename(done_dir / job_path.name)
if written:
shown = ", ".join(written[:10])
more = "" if len(written) <= 10 else f" (+{len(written)-10} altri)"
log(f"TRAIN job DONE: wrote {len(written)} sample files to {samples_dir}: {shown}{more}")
else:
log(f"TRAIN job DONE: no output rows (empty job?)")

except Exception as e:
log(f"TRAIN job ERROR: {job_name} err={type(e).__name__}: {e}")
try:
job_path.rename(error_dir / job_path.name)
except Exception:
pass
time.sleep(0.5)

time.sleep(10)

def main() -> None:
settings = load_settings()
cfg_file = settings.get("_config_file", "")
keys = [k for k in settings.keys() if not str(k).startswith("_")]
log(f"Settings loaded from {cfg_file}. Keys: {keys}")
log(f"BUILD: {build_info()}")

mode = str(settings.get("mode", "collect_train")).strip().lower()

if mode == "collect_train":
run_collect_train(settings)
return

if mode == "train":
from .train_mode import run_train
run_train(settings)
return

if mode == "infer":
from .infer_mode import run_infer
run_infer(settings)
return

raise ValueError(f"unknown mode: {mode}")
# Fix percorsi configurazione
if not os.environ.get("CONFIG"):
os.environ["CONFIG"] = "/config/config.yaml"

try:
settings = load_settings()
setup_global_logging(settings)
log(f"Core Orchestrator avviato. BUILD: {build_info()}")
mode = str(settings.get("mode", "all")).strip().lower()

if mode == "all":
run_all_modes(settings)
elif mode == "collect_train":
from .train_collect import run_collect_train
run_collect_train(settings)
elif mode == "infer":
from .infer_mode import run_infer
run_infer(settings)
elif mode == "train":
# Questa rimane la vecchia modalità manuale one-shot
from .train_mode import run_train
run_train(settings)
else:
log(f"Modalità {mode} non riconosciuta.")
except Exception as e:
print(f"ERRORE CRITICO ALL'AVVIO: {e}")
import traceback
traceback.print_exc()

if __name__ == "__main__":
main()

+ 125
- 47
app/map_manager.py Zobrazit soubor

@@ -33,15 +33,29 @@ def force_save_json(path, data):

def show_mapper(cfg):
MAPS_DIR = Path(cfg['maps']['map_dir'])
SAMPLES_DIR = Path("/data/train/samples")
# Riferimenti directory per Addestramento e Test
TRAIN_BASE = Path("/data/train")
SAMPLES_DIR = TRAIN_BASE / "samples"
TEST_SAMPLES_DIR = TRAIN_BASE / "testsamples"
JOBS_BASE = Path(cfg['collect_train']['jobs_dir'])
PENDING_DIR = JOBS_BASE / "pending"
ERROR_DIR = JOBS_BASE / "error"
TEST_PENDING_DIR = TRAIN_BASE / "testjobs/pending"
TEST_ERROR_DIR = TRAIN_BASE / "testjobs/error"
# File configurazione
BEACONS_FILE = "/data/config/beacons.csv"
[p.mkdir(parents=True, exist_ok=True) for p in [MAPS_DIR, SAMPLES_DIR, PENDING_DIR, ERROR_DIR]]
GROUPS_FILE = "/data/config/beacongroup.csv"
CSV_DELIM = cfg.get('paths', {}).get('csv_delimiter', ';')

# Creazione directory se mancano
for p in [MAPS_DIR, SAMPLES_DIR, TEST_SAMPLES_DIR, PENDING_DIR, ERROR_DIR, TEST_PENDING_DIR, TEST_ERROR_DIR]:
p.mkdir(parents=True, exist_ok=True)

# --- 1. GESTIONE UPLOAD ---
# La logica ora gestisce stringhe per floor_id permettendo il carattere "-"
maps = sorted([f.replace(cfg['maps']['floor_prefix'], "").split('.')[0]
for f in os.listdir(MAPS_DIR) if f.startswith(cfg['maps']['floor_prefix'])])
@@ -52,7 +66,6 @@ def show_mapper(cfg):
if st.button("🚀 SALVA PIANO", use_container_width=True):
if new_f_id and up_file:
ext = Path(up_file.name).suffix
# Il nome file includerà il "-" se presente in new_f_id
img_save_path = MAPS_DIR / f"{cfg['maps']['floor_prefix']}{new_f_id}{ext}"
with open(img_save_path, "wb") as f:
f.write(up_file.getbuffer())
@@ -85,22 +98,13 @@ def show_mapper(cfg):
with c_s: st.info(f"📏 Scala: {'✅' if meta['calibrated'] else '❌'}\n({meta['pixel_ratio']:.4f} px/cm)")
with c_o: st.info(f"🎯 Origine: {'✅' if meta['origin'] != [0,0] else '❌'}\n(X:{meta['origin'][0]}, Y:{meta['origin'][1]})")

if not meta["calibrated"] or meta["origin"] == [0, 0]:
st.warning(f"💡 **Piano {floor_id} da configurare**: Esegui **Calibra** e imposta l'**Origine**.")

# --- 3. IMPOSTAZIONI GLOBALI (Default disabilitati) ---
# --- 3. IMPOSTAZIONI GLOBALI ---
st.markdown("---")
g1, g2, g3, g4 = st.columns([1.2, 1.5, 1.2, 2])
with g1:
# Griglia disattivata di default per evitare interferenze iniziali
show_grid = st.toggle("Griglia", value=False, key="grid_v21")
with g2:
grid_cm = st.select_slider("Passo (cm):", options=[25, 50, 100, 200], value=50, key="step_v21")
with g3:
# Stay Grid disattivato di default
snap_on = st.toggle("Stay Grid", value=False, key="snap_v21")
with g4:
m_size = st.slider("Dimensione Marker:", 5, 20, 8, key="msize_v21")
with g1: show_grid = st.toggle("Griglia", value=False, key="grid_v21")
with g2: grid_cm = st.select_slider("Passo (cm):", options=[25, 50, 100, 200], value=50, key="step_v21")
with g3: snap_on = st.toggle("Stay Grid", value=False, key="snap_v21")
with g4: m_size = st.slider("Dimensione Marker:", 5, 20, 8, key="msize_v21")
st.markdown("---")

# --- 4. TOOLSET ---
@@ -121,12 +125,10 @@ def show_mapper(cfg):
m.options.update({"minZoom": -6, "maxZoom": 6, "zoomSnap": 0.25, "maxBounds": bounds, "maxBoundsViscosity": 1.0})
folium.raster_layers.ImageOverlay(image=img_data, bounds=bounds, interactive=True).add_to(m)

# ORIGINE (Sempre visibile se impostata)
if meta["origin"] != [0, 0]:
ox, oy = meta["origin"]
folium.CircleMarker(location=[oy, ox], radius=6, color="black", fill=True, zindex=1000, tooltip="Origine (0,0)").add_to(m)
folium.CircleMarker(location=[oy, ox], radius=6, color="black", fill=True, zindex=1000).add_to(m)

# GRIGLIA
if show_grid and meta["calibrated"] and meta["origin"] != [0, 0]:
px_step = grid_cm * meta["pixel_ratio"]
ox, oy = meta["origin"]
@@ -135,34 +137,73 @@ def show_mapper(cfg):
for y in sorted(list(range(int(oy), h, int(px_step))) + list(range(int(oy), 0, -int(px_step)))):
folium.PolyLine([[y, 0], [y, w]], color="blue", weight=1, opacity=0.1).add_to(m)

# Disegno Punti Storici
def draw_points(directory, color, shape="circle"):
# --- DISEGNO PUNTI STORICI (OTTIMIZZATO TRAMITE NOME FILE) ---
def draw_historical_samples(directory, color, shape="circle", is_test=False):
if not meta["calibrated"] or meta["origin"] == [0,0]: return
for f in Path(directory).glob("*.csv"):
try:
# Parsing nome file: CAMPAGNA_Z_X_Y.csv
# Usiamo parts[-1], parts[-2], parts[-3] per gestire campagne con underscore
parts = f.stem.split('_')
if len(parts) < 4: continue
fz = parts[-3] # Piano Z
fx = float(parts[-2].replace(',', '.')) # Coordinata X
fy = float(parts[-1].replace(',', '.')) # Coordinata Y
if str(fz) == str(floor_id):
px_x = (fx * meta["pixel_ratio"]) + meta["origin"][0]
px_y = meta["origin"][1] - (fy * meta["pixel_ratio"])
dash = "5, 5" if is_test else None
weight = 3 if is_test else 1
if shape == "circle":
folium.CircleMarker(
location=[px_y, px_x], radius=m_size, color=color,
weight=weight, dash_array=dash, fill=True, fill_opacity=0.7
).add_to(m)
except: continue

# 1. ADDESTRAMENTO: Verde, Tondo, Solido
draw_historical_samples(SAMPLES_DIR, "green", "circle", is_test=False)
# 2. TEST: Celeste (#00FFFF), Tondo, Tratteggiato
draw_historical_samples(TEST_SAMPLES_DIR, "#00FFFF", "circle", is_test=True)

# 3. PENDING/ERROR: (Manteniamo la lettura CSV per questi perché i nomi file sono diversi)
def draw_jobs(directory, color, shape="diamond", is_test=False):
if not meta["calibrated"] or meta["origin"] == [0,0]: return
for f in Path(directory).glob("*.csv"):
try:
df = pd.read_csv(f, sep=";")
df.columns = [c.lower() for c in df.columns]
# Confronto tra stringhe per gestire piani negativi e ID complessi
if str(df.iloc[0].get('z', df.iloc[0].get('floor'))) == str(floor_id):
px_x = (df.iloc[0]['x'] * meta["pixel_ratio"]) + meta["origin"][0]
px_y = meta["origin"][1] - (df.iloc[0]['y'] * meta["pixel_ratio"])
if shape == "circle": folium.CircleMarker(location=[px_y, px_x], radius=m_size, color=color, fill=True, fill_opacity=0.8).add_to(m)
elif shape == "square": folium.RegularPolygonMarker(location=[px_y, px_x], number_of_sides=4, radius=m_size, color="black", weight=2, fill=True, fill_color=color).add_to(m)
elif shape == "diamond": folium.RegularPolygonMarker(location=[px_y, px_x], number_of_sides=4, rotation=45, radius=m_size, color="black", weight=1, fill=True, fill_color=color).add_to(m)
row = df.iloc[0]
z_val = str(row.get('z', row.get('floor')))
if z_val == str(floor_id):
px_x = (row['x'] * meta["pixel_ratio"]) + meta["origin"][0]
px_y = meta["origin"][1] - (row['y'] * meta["pixel_ratio"])
dash = "3, 3" if is_test else None
folium.RegularPolygonMarker(
location=[px_y, px_x], number_of_sides=4,
rotation=45 if shape=="diamond" else 0,
radius=m_size, color=color, weight=2,
dash_array=dash, fill=True
).add_to(m)
except: continue

draw_points(SAMPLES_DIR, "green", "circle")
draw_points(PENDING_DIR, "yellow", "diamond")
draw_points(ERROR_DIR, "red", "square")
draw_jobs(PENDING_DIR, "orange", "diamond", False)
draw_jobs(TEST_PENDING_DIR, "#f1c40f", "diamond", True)
draw_jobs(ERROR_DIR, "red", "square", False)
draw_jobs(TEST_ERROR_DIR, "#e74c3c", "square", True)

# Feedback Visivo Click
if tool == "Calibra" and st.session_state.get("cal_points"):
for p in st.session_state.cal_points: folium.CircleMarker(location=p, radius=6, color="red", fill=True).add_to(m)
if len(st.session_state.cal_points) == 2: folium.PolyLine(st.session_state.cal_points, color="red", weight=3).add_to(m)
elif st.session_state.get("temp_lat") is not None:
folium.CircleMarker(location=[st.session_state.temp_lat, st.session_state.temp_lng], radius=m_size+2, color="blue", fill=True, zindex=500).add_to(m)

out = st_folium(m, height=600, width=None, key=f"map_v21_{floor_id}_{tool}")
out = st_folium(m, height=600, width=None, key=f"map_v24_{floor_id}_{tool}")
click = out.get("last_clicked")
if click:
clat, clng = click["lat"], click["lng"]
@@ -181,9 +222,6 @@ def show_mapper(cfg):
# --- 6. LOGICA UI ---
with col_ui:
st.write(f"### Tool: **{tool}**")
err_files = list(ERROR_DIR.glob("*.csv"))
if err_files and st.button(f"🗑️ PULISCI ERRORI", use_container_width=True):
for f in err_files: os.remove(f); st.rerun()
if tool == "Calibra":
pts = st.session_state.get("cal_points", [])
@@ -201,17 +239,57 @@ def show_mapper(cfg):
if st.button("💾 SALVA ORIGINE", use_container_width=True, type="primary"):
meta["origin"] = [int(px_x), int(px_y)]
if force_save_json(meta_path, meta): st.rerun()
elif tool == "Rileva" and meta["calibrated"]:
rx = (px_x - meta["origin"][0]) / meta["pixel_ratio"]
ry = (meta["origin"][1] - px_y) / meta["pixel_ratio"]
sx, sy = int(round(rx)), int(round(ry))
st.metric("X (cm)", sx); st.metric("Y (cm)", sy)
if os.path.exists(BEACONS_FILE):
b_df = pd.read_csv(BEACONS_FILE, sep=";")
sel_b = st.selectbox("Beacon:", b_df.apply(lambda x: f"{x['BeaconName']} | {x['MAC']}", axis=1))
if st.button("🚀 REGISTRA", use_container_width=True, type="primary"):
b_name, b_mac = sel_b.split(" | ")
id_str = f"{b_name}_{floor_id}_{sx}_{sy}"
# Salvataggio Z come stringa per mantenere il "-"
data = {"Position": id_str, "Floor": floor_id, "RoomName": b_name, "X": sx, "Y": sy, "Z": floor_id, "BeaconName": b_name, "MAC": b_mac}
pd.DataFrame([data]).to_csv(PENDING_DIR / f"{id_str}.csv", sep=";", index=False); st.rerun()

st.divider()
job_mode = st.radio("Scopo Rilevamento:", ["Addestramento", "Test"], horizontal=True, key="job_mode_v24")
b_df = pd.read_csv(Path(BEACONS_FILE), sep=CSV_DELIM) if Path(BEACONS_FILE).exists() else pd.DataFrame(columns=['BeaconName','MAC'])
beacon_name_map = {row['MAC']: row['BeaconName'] for _, row in b_df.iterrows()}

options = [f"Beacon: {n} | {m}" for n, m in zip(b_df['BeaconName'], b_df['MAC'])]
if Path(GROUPS_FILE).exists():
g_df = pd.read_csv(Path(GROUPS_FILE), sep=CSV_DELIM)
options += [f"Gruppo: {n}" for n in g_df['BeaconGroupName']]

sel_target = st.selectbox("Seleziona Target:", options, key="sel_target_v24")
if st.button("🚀 REGISTRA JOB", use_container_width=True, type="primary"):
sub_dir = "jobs" if job_mode == "Addestramento" else "testjobs"
current_pending = Path(f"/data/train/{sub_dir}/pending")
current_pending.mkdir(parents=True, exist_ok=True)

job_rows = []
if sel_target.startswith("Gruppo: "):
g_name = sel_target.replace("Gruppo: ", "")
g_df = pd.read_csv(Path(GROUPS_FILE), sep=CSV_DELIM)
macs_str = g_df[g_df['BeaconGroupName'] == g_name]['GroupMAC'].iloc[0]
mac_list = [m.strip() for m in macs_str.split(',')]
job_filename = f"{g_name}_{floor_id}_{sx}_{sy}.csv"
for m in mac_list:
b_name = beacon_name_map.get(m, g_name)
pos_id = f"{b_name}_{floor_id}_{sx}_{sy}"
job_rows.append({"Position": pos_id, "Floor": floor_id, "RoomName": b_name, "X": sx, "Y": sy, "Z": floor_id, "BeaconName": b_name, "MAC": m})
else:
b_info = sel_target.replace("Beacon: ", "").split(" | ")
b_name, b_mac = b_info[0], b_info[1]
job_filename = f"{b_name}_{floor_id}_{sx}_{sy}.csv"
pos_id = f"{b_name}_{floor_id}_{sx}_{sy}"
job_rows.append({"Position": pos_id, "Floor": floor_id, "RoomName": b_name, "X": sx, "Y": sy, "Z": floor_id, "BeaconName": b_name, "MAC": b_mac})

header = ["Position", "Floor", "RoomName", "X", "Y", "Z", "BeaconName", "MAC"]
pd.DataFrame(job_rows)[header].to_csv(current_pending / job_filename, sep=CSV_DELIM, index=False)
st.success(f"Job registrato!")
time.sleep(0.5)
st.rerun()

# Pulizia errori nel menu laterale
err_files = list(ERROR_DIR.glob("*.csv")) + list(TEST_ERROR_DIR.glob("*.csv"))
if err_files and st.sidebar.button(f"🗑️ PULISCI ERRORI ({len(err_files)})"):
for f in err_files: os.remove(f)
st.rerun()

+ 21
- 43
app/normalize.py Zobrazit soubor

@@ -1,46 +1,24 @@
"""normalize.py

Helper per normalizzare i MAC address in due formati:

- compact: 12 hex uppercase senza separatori (es: AC233FC1DD3C)
- colon: 6 byte separati da ":" (es: AC:23:3F:C1:DD:3C)

Nota: nel progetto usiamo **compact** come chiave interna per fare matching tra:
- gateway.csv (spesso con i ":")
- topic MQTT (publish_out/<gw> in genere senza ":")
- payload JSON (mac beacon/gateway spesso senza ":")

Il formato colon rimane utile solo per *rendering* (es: header CSV).
"""

from __future__ import annotations

import re

_HEX_ONLY = re.compile(r"[^0-9A-Fa-f]")


def mac_to_compact(mac: object) -> str:
"""Ritorna 12 hex uppercase senza separatori."""
if mac is None:
def norm_mac(mac: str) -> str:
"""Ritorna MAC come AA:BB:CC:DD:EE:FF (upper), ignorando separatori."""
if not mac:
return ""
s = _HEX_ONLY.sub("", str(mac)).upper()
if len(s) == 12:
return s
if len(s) > 12:
# se arriva qualcosa di più lungo (es. UUID), prendiamo gli ultimi 12
return s[-12:]
return s


def compact_to_colon(mac12: object) -> str:
"""Converte 'AC233FC1DD3C' -> 'AC:23:3F:C1:DD:3C'."""
s = mac_to_compact(mac12)
if len(s) != 12:
return s
return ":".join(s[i : i + 2] for i in range(0, 12, 2))


def norm_mac(mac: object) -> str:
"""Alias storico: ritorna il formato con ':'."""
return compact_to_colon(mac)
m = str(mac).strip().replace("-", "").replace(":", "").replace(".", "")
m = m.upper()
if len(m) != 12:
return mac.strip().upper()
return ":".join(m[i:i+2] for i in range(0, 12, 2))

def is_mac(mac: str) -> bool:
"""Verifica se la stringa è un MAC valido."""
if not mac: return False
m = str(mac).strip().replace("-", "").replace(":", "").replace(".", "")
return len(m) == 12 and all(c in "0123456789ABCDEFabcdef" for c in m)

# Alias per compatibilità con gli altri script (gateways.py e train_collect.py)
normalize_mac = norm_mac

def mac_to_compact(mac: str) -> str:
"""Ritorna MAC senza separatori (es: AC233FC1DD3C)."""
return norm_mac(mac).replace(":", "").upper()

+ 1
- 1
app/settings.py Zobrazit soubor

@@ -16,7 +16,7 @@ def deep_merge(a: dict, b: dict) -> dict:
return out

def load_settings() -> dict:
cfg_path = os.getenv("CONFIG_FILE", "/app/config/config.yaml")
cfg_path = os.getenv("CONFIG_FILE", "/config/config.yaml")
settings = _read_yaml(cfg_path)

secrets_path = os.getenv("SECRETS_FILE", "")


+ 135
- 337
app/train_collect.py Zobrazit soubor

@@ -1,349 +1,147 @@
"""train_collect.py

Modalità COLLECT_TRAIN:
- attende che tutti i gateway del feature-set (gateway.csv) siano online (traffic MQTT)
- prende job CSV da jobs_dir/pending/*.csv
- per ogni job: apre una finestra di raccolta di window_seconds, aggrega RSSI per GW
- scrive sample CSV in samples_dir

Bugfix fondamentale (per i tuoi NAN):
- matching interno su MAC in formato **compact** (12 hex senza ':').
"""

from __future__ import annotations

import os
import time
import shutil
import glob
import math
import datetime
from dataclasses import dataclass
from typing import Dict, List, Optional, Tuple

import ssl
from pathlib import Path
from typing import Dict, Any, List
import pandas as pd
import paho.mqtt.client as mqtt

from .normalize import mac_to_compact, compact_to_colon
from .mqtt_client import MqttSubscriber
from .normalize import norm_mac, mac_to_compact
from .mqtt_parser import parse_publish_out
from .fingerprint import FingerprintWindow
from .fingerprint import FingerprintWindow
from .logger_utils import log_msg as log


def _ensure_dir(path: str) -> None:
os.makedirs(path, exist_ok=True)


def _read_delimited_csv(path: str, prefer_delim: str = ";") -> pd.DataFrame:
for sep in [prefer_delim, ",", "\t"]:
try:
df = pd.read_csv(path, sep=sep, dtype=str, keep_default_na=False)
if len(df.columns) >= 1:
return df
except Exception:
continue
return pd.read_csv(path, dtype=str, keep_default_na=False)


def load_gateway_csv(path: str, delimiter: str = ";") -> Tuple[List[str], List[str]]:
df = _read_delimited_csv(path, prefer_delim=delimiter)
if df.empty:
return [], []

mac_col = None
for c in df.columns:
if c.strip().lower() == "mac":
mac_col = c
break
if mac_col is None:
mac_col = df.columns[0]

headers: List[str] = []
keys: List[str] = []
seen = set()
invalid = 0
dup = 0

for raw in df[mac_col].tolist():
k = mac_to_compact(raw)
if len(k) != 12:
invalid += 1
continue
if k in seen:
dup += 1
continue
seen.add(k)
keys.append(k)
headers.append(compact_to_colon(k))

log(f"[gateway.csv] loaded gateways={len(keys)} invalid={invalid} duplicates={dup}")
return headers, keys


@dataclass
class TrainTarget:
mac: str # compact
x: float
y: float
z: float


def read_job_csv(job_path: str, delimiter: str = ";") -> List[TrainTarget]:
df = _read_delimited_csv(job_path, prefer_delim=delimiter)
if df.empty:
return []

cols = {c.strip().lower(): c for c in df.columns}

def col(name: str) -> Optional[str]:
return cols.get(name)

mac_c = col("mac")
x_c = col("x")
y_c = col("y")
z_c = col("z")
if not mac_c:
raise ValueError(f"Job CSV senza colonna 'mac': {job_path}")

out: List[TrainTarget] = []
for _, row in df.iterrows():
m = mac_to_compact(row[mac_c])
if len(m) != 12:
continue
x = float(row[x_c]) if x_c else 0.0
y = float(row[y_c]) if y_c else 0.0
z = float(row[z_c]) if z_c else 0.0
out.append(TrainTarget(mac=m, x=x, y=y, z=z))
return out


def _pick_collect_cfg(settings: Dict) -> Dict:
if "collect_train" in settings and isinstance(settings["collect_train"], dict):
return settings["collect_train"]
if "training" in settings and isinstance(settings["training"], dict):
log("WARNING: config usa 'training:' (alias). Consiglio: rinomina in 'collect_train:'")
return settings["training"]
return {}


def run_collect_train(settings: Dict) -> None:
ct = _pick_collect_cfg(settings)
paths = settings.get("paths", {}) or {}
mqtt_cfg = settings.get("mqtt", {}) or {}
dbg = settings.get("debug", {}) or {}

jobs_dir = str(ct.get("jobs_dir", "/data/train/jobs"))
samples_dir = str(ct.get("samples_dir", "/data/train/samples"))
job_glob = str(ct.get("job_glob", "*.csv"))
poll_seconds = float(ct.get("poll_seconds", ct.get("poll_pending_seconds", 2)))
window_seconds = float(ct.get("window_seconds", 10))
min_non_nan = int(ct.get("min_non_nan", 3))

aggregate = str(ct.get("aggregate", "median")).lower()
rssi_min = float(ct.get("rssi_min", -110))
rssi_max = float(ct.get("rssi_max", -25))
outlier_method = str(ct.get("outlier_method", "none")).lower()
mad_z = float(ct.get("mad_z", 3.5))
min_samples_per_gateway = int(ct.get("min_samples_per_gateway", 1))
max_stddev = ct.get("max_stddev", None)
max_stddev = float(max_stddev) if max_stddev is not None else None

gateway_ready_max_age_seconds = float(ct.get("gateway_ready_max_age_seconds", 30))
gw_ready_log_seconds = float(ct.get("gw_ready_log_seconds", 10))
gw_ready_sleep_seconds = float(ct.get("gw_ready_sleep_seconds", 5))
gw_ready_check_before_job = bool(ct.get("gw_ready_check_before_job", True))

csv_delim = str(paths.get("csv_delimiter", ";"))
gateway_csv = str(paths.get("gateways_csv", "/data/config/gateway.csv"))

# Debug opzionale durante finestra
log_progress = bool(dbg.get("collect_train_log_samples", False))
log_first_seen = bool(dbg.get("collect_train_log_first_seen", False))
log_every_s = float(dbg.get("collect_train_log_every_seconds", 15))

pending_dir = os.path.join(jobs_dir, "pending")
done_dir = os.path.join(jobs_dir, "done")
error_dir = os.path.join(jobs_dir, "error")

_ensure_dir(pending_dir)
_ensure_dir(done_dir)
_ensure_dir(error_dir)
_ensure_dir(samples_dir)

gateway_headers, gateway_keys = load_gateway_csv(gateway_csv, delimiter=csv_delim)
if not gateway_keys:
log("ERROR: Nessun gateway valido nel gateway.csv -> non posso partire.")
from .gateways import load_gateway_csv
from .beacons import read_job_csv, write_samples_csv, _coord_token

def extract_campaign_id(beacon_name: str) -> str:
"""Estrae la campagna dal nome beacon (es. BC-00-41 -> 00)."""
if not beacon_name: return "default"
parts = str(beacon_name).split('-')
if len(parts) >= 2:
return parts[1]
return "default"

def run_collect_train(settings: Dict[str, Any]) -> None:
cfg = settings.get("collect_train", {})
paths = settings.get("paths", {})
mqtt_cfg = settings.get("mqtt", {})
modes = [
{"pending": Path("/data/train/jobs/pending"), "done": Path("/data/train/jobs/done"), "samples": Path("/data/train/samples"), "label": "TRAIN"},
{"pending": Path("/data/train/testjobs/pending"), "done": Path("/data/train/testjobs/done"), "samples": Path("/data/train/testsamples"), "label": "TEST"}
]
for m in modes:
for d in [m["pending"], m["done"], m["samples"]]: d.mkdir(parents=True, exist_ok=True)

gateway_csv_path = paths.get("gateways_csv", "/data/config/gateway.csv")
csv_delim = paths.get("csv_delimiter", ";")
try:
gw_df = pd.read_csv(gateway_csv_path, sep=csv_delim)
gw_df.columns = [c.strip().lower() for c in gw_df.columns]
gateway_headers = gw_df['mac'].tolist()
gateway_compacts = [mac_to_compact(m) for m in gateway_headers]
total_gw = len(gateway_headers)
except Exception as e:
log(f"ERRORE caricamento gateway: {e}")
return

mqtt_host = str(mqtt_cfg.get("host", "mosquitto"))
mqtt_port = int(mqtt_cfg.get("port", 1883))
mqtt_topic = str(mqtt_cfg.get("topic", "publish_out/#"))
mqtt_proto = str(mqtt_cfg.get("protocol", "mqttv311")).lower()
client_id = str(mqtt_cfg.get("client_id", "ble-ai-localizer"))
keepalive = int(mqtt_cfg.get("keepalive", 60))
qos = int(mqtt_cfg.get("qos", 0))
username = str(mqtt_cfg.get("username", ""))
password = str(mqtt_cfg.get("password", ""))

last_seen: Dict[str, float] = {}
active_window: Optional[FingerprintWindow] = None
active_logged_pairs: set = set()

def on_mqtt_message(topic: str, payload: bytes) -> None:
nonlocal active_window, active_logged_pairs
events = parse_publish_out(topic, payload)
now = time.time()
for gw_key, b_key, rssi, _ts in events:
if len(gw_key) == 12:
last_seen[gw_key] = now

if active_window is None:
continue

accepted = active_window.add(gw_key, b_key, rssi)
if accepted and log_first_seen:
pair = (b_key, gw_key)
if pair not in active_logged_pairs:
active_logged_pairs.add(pair)
log(f"SEEN target beacon={b_key} gw={compact_to_colon(gw_key)} rssi={rssi:.1f}")

sub = MqttSubscriber(
host=mqtt_host,
port=mqtt_port,
topic=mqtt_topic,
mqtt_proto=mqtt_proto,
client_id=client_id,
keepalive=keepalive,
qos=qos,
username=username if username else None,
password=password if password else None,
)

import threading
t = threading.Thread(target=sub.start_forever, args=(on_mqtt_message,), daemon=True)
t.start()

log("MQTT thread started (collect_train)")
log(
f"COLLECT_TRAIN config: gateway_csv={gateway_csv} gateways(feature-set)={len(gateway_keys)} "
f"window_seconds={window_seconds:.1f} poll_seconds={poll_seconds:.1f} "
f"jobs_dir={jobs_dir} pending_dir={pending_dir} done_dir={done_dir} error_dir={error_dir} "
f"samples_dir={samples_dir} mqtt={mqtt_host}:{mqtt_port} topic={mqtt_topic}"
)

def gateways_online() -> Tuple[int, List[str]]:
now = time.time()
missing: List[str] = []
for gk, hdr in zip(gateway_keys, gateway_headers):
last = last_seen.get(gk)
if last is None or (now - last) > gateway_ready_max_age_seconds:
missing.append(hdr)
return len(missing), missing

def wait_for_gateways() -> None:
last_log = 0.0
while True:
miss_n, missing = gateways_online()
if miss_n == 0:
log(f"GW READY: online={len(gateway_keys)}/{len(gateway_keys)} (max_age_s={gateway_ready_max_age_seconds:.1f})")
return
now = time.time()
if now - last_log >= gw_ready_log_seconds:
last_log = now
log(
f"WAIT gateways online ({miss_n} missing, seen={len(gateway_keys)-miss_n}/{len(gateway_keys)}): {missing} "
f"(max_age_s={gateway_ready_max_age_seconds:.1f})"
)
time.sleep(gw_ready_sleep_seconds)
# --- LOGICA GATEWAY ONLINE ---
online_tracker = {mac_to_compact(m): {"original": m, "online": False} for m in gateway_headers}
def on_check_message(client, userdata, msg):
events = parse_publish_out(msg.topic, msg.payload)
for gw_c, _, _, _ in events:
if gw_c in online_tracker and not online_tracker[gw_c]["online"]:
online_tracker[gw_c]["online"] = True
curr = sum(1 for v in online_tracker.values() if v["online"])
log(f" [{curr}/{total_gw}] ONLINE: {online_tracker[gw_c]['original']}")

check_client = mqtt.Client(protocol=mqtt.MQTTv311)
if mqtt_cfg.get("username"): check_client.username_pw_set(mqtt_cfg["username"], mqtt_cfg.get("password"))
check_client.on_message = on_check_message
check_client.connect(mqtt_cfg.get("host", "localhost"), mqtt_cfg.get("port", 1883))
check_client.subscribe(mqtt_cfg.get("topic", "publish_out/#"))
check_client.loop_start()
while not all(v["online"] for v in online_tracker.values()): time.sleep(1)
check_client.loop_stop()

log("Collector pronto. Monitoraggio directory Job...")

while True:
jobs = sorted(glob.glob(os.path.join(pending_dir, job_glob)))
if not jobs:
time.sleep(poll_seconds)
continue

for job_path in jobs:
job_name = os.path.basename(job_path)
try:
if gw_ready_check_before_job:
wait_for_gateways()

targets = read_job_csv(job_path, delimiter=csv_delim)
if not targets:
raise RuntimeError("job CSV vuoto o senza MAC validi")

beacon_keys = [t.mac for t in targets]
log(f"TRAIN job START: {job_name} beacons={len(beacon_keys)}")

active_logged_pairs = set()
active_window = FingerprintWindow(
beacon_keys=beacon_keys,
gateway_headers=gateway_headers,
gateway_keys=gateway_keys,
rssi_min=rssi_min,
rssi_max=rssi_max,
outlier_method=outlier_method,
mad_z=mad_z,
min_samples_per_gateway=min_samples_per_gateway,
max_stddev=max_stddev,
)

t0 = time.time()
next_log = t0 + log_every_s

while True:
elapsed = time.time() - t0
if elapsed >= window_seconds:
break
if log_progress and time.time() >= next_log:
next_log = time.time() + log_every_s
parts = []
for b in beacon_keys:
tops = active_window.top_gateways(b, aggregate=aggregate, top_n=3)
if not tops:
parts.append(f"{b}:0gw")
else:
top_s = ",".join([f"{hdr}({n})" for n, hdr, _agg in tops])
parts.append(f"{b}:{top_s}")
log(f"WINDOW progress {elapsed:.0f}/{window_seconds:.0f}s -> " + " | ".join(parts))
time.sleep(0.25)

rows: List[Dict[str, object]] = []
for tt in targets:
feats = active_window.features_for(tt.mac, aggregate=aggregate)
non_nan = sum(0 if (isinstance(v, float) and math.isnan(v)) else 1 for v in feats.values())
if non_nan < min_non_nan:
log(f"WARNING: beacon {tt.mac} low features non_nan={non_nan}")

tops = active_window.top_gateways(tt.mac, aggregate=aggregate, top_n=5)
if tops:
top_s = ", ".join([f"{hdr} n={n} agg={agg:.1f}" for n, hdr, agg in tops])
log(f"SUMMARY beacon {tt.mac}: {top_s}")
else:
log(f"SUMMARY beacon {tt.mac}: no samples captured")

row: Dict[str, object] = {"mac": tt.mac, "x": float(tt.x), "y": float(tt.y), "z": float(tt.z)}
row.update(feats)
rows.append(row)

out_df = pd.DataFrame(rows)
cols = ["mac", "x", "y", "z"] + gateway_headers
out_df = out_df.reindex(columns=cols)

epoch = int(time.time())
out_name = f"{os.path.splitext(job_name)[0]}__{epoch}.csv"
out_path = os.path.join(samples_dir, out_name)
out_df.to_csv(out_path, sep=csv_delim, index=False, float_format="%.1f", na_rep="nan")

log(f"TRAIN job DONE: wrote {out_path} rows={len(out_df)}")

shutil.move(job_path, os.path.join(done_dir, job_name))
job_found = False
for m in modes:
job_files = sorted(m["pending"].glob("*.csv"))
if not job_files: continue
job_found = True
job_path = job_files[0]
log(f"[{m['label']}] Elaborazione: {job_path.name}")

job_rows = read_job_csv(job_path, delimiter=csv_delim)
if not job_rows:
job_path.rename(Path("/data/train/jobs/error") / job_path.name)
continue

except Exception as e:
log(f"ERROR processing job {job_name}: {e}")
try:
shutil.move(job_path, os.path.join(error_dir, job_name))
except Exception:
pass
finally:
active_window = None
job_beacon_keys = [mac_to_compact(r["mac"]) for r in job_rows]

active_window = FingerprintWindow(
beacon_keys=job_beacon_keys,
gateway_keys=gateway_compacts,
gateway_headers=gateway_headers,
rssi_min=float(cfg.get("rssi_min", -110)),
rssi_max=float(cfg.get("rssi_max", -25)),
outlier_method=cfg.get("outlier_method", "mad"),
min_samples_per_gateway=int(cfg.get("min_samples_per_gateway", 5))
)

mqtt_timestamps = []
def on_job_message(c, u, msg):
events = parse_publish_out(msg.topic, msg.payload)
for gw_c, b_c, rssi, ts in events:
if b_c in job_beacon_keys:
active_window.add(gw_c, b_c, rssi)
if ts: mqtt_timestamps.append(ts)

client = mqtt.Client(protocol=mqtt.MQTTv311)
if mqtt_cfg.get("username"): client.username_pw_set(mqtt_cfg["username"], mqtt_cfg.get("password"))
client.on_message = on_job_message
client.connect(mqtt_cfg.get("host", "localhost"), mqtt_cfg.get("port", 1883))
client.subscribe(mqtt_cfg.get("topic", "publish_out/#"))
client.loop_start()
time.sleep(int(cfg.get("window_seconds", 30)))
client.loop_stop()
client.disconnect()

ts_start = min(mqtt_timestamps) if mqtt_timestamps else 0
ts_end = max(mqtt_timestamps) if mqtt_timestamps else 0

valid_count = 0
for r in job_rows:
b_mac = r["mac"]
b_compact = mac_to_compact(b_mac)
b_name = r.get("beaconname", b_compact)
campaign = extract_campaign_id(b_name)
feats = active_window.features_for(b_compact, aggregate=cfg.get("aggregate", "median"))
if sum(1 for v in feats.values() if v == v and v is not None) >= int(cfg.get("min_non_nan", 3)):
out_row = {
"mac": b_mac, "x": r["x"], "y": r["y"], "z": r["z"],
"ts_start": ts_start, "ts_end": ts_end
}
out_row.update(feats)
zt, xt, yt = _coord_token(r["z"]), _coord_token(r["x"]), _coord_token(r["y"])
# NUOVA NOMENCLATURA: $CAMPAGNA_$Z_$X_$Y.csv
out_filename = f"{campaign}_{zt}_{xt}_{yt}.csv"
write_samples_csv(m["samples"] / out_filename, [out_row], gateway_headers, delimiter=csv_delim, rssi_decimals=int(cfg.get("rssi_decimals", 0)))
valid_count += 1
shutil.move(str(job_path), str(m["done"] / job_path.name))
log(f" Job completato. Campioni: {valid_count} (MQTT TS: {ts_start}-{ts_end})")
break

if not job_found: time.sleep(2)

+ 112
- 0
app/train_executor.py Zobrazit soubor

@@ -0,0 +1,112 @@
import os
import json
import time
import joblib
import pandas as pd
import numpy as np
from pathlib import Path
from datetime import datetime
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor

# Import delle utility esistenti
from .logger_utils import log_msg as log
from .csv_config import load_gateway_features_csv

def process_train_jobs():
"""Monitora ed esegue i job di addestramento salvando backup cronologici."""
JOBS_DIR = Path("/data/train/train_jobs")
JOBS_DIR.mkdir(parents=True, exist_ok=True)
job_files = list(JOBS_DIR.glob("*.lock"))
if not job_files:
return

for job_path in job_files:
try:
log(f"[TRAIN-CORE] Rilevato nuovo job: {job_path.name}")
with open(job_path, "r") as f:
job = json.load(f)
campagna = job["campaign"]
knn_cfg = job["knn"]
nan_fill = job["nan_fill"]
gw_csv = job["gateways_csv"]
# --- GENERAZIONE NOME FILE CON TIMESTAMP (BACKUP) ---
now_str = datetime.now().strftime("%Y%m%d_%H%M%S")
model_filename = f"model_camp_{campagna}_{now_str}.joblib"
model_path = Path("/data/model") / model_filename
# Caricamento Gateway
gws = load_gateway_features_csv(gw_csv)
gateways_order = [g.mac for g in gws]

# Analisi file campioni
samples_dir = Path("/data/train/samples")
sample_files = list(samples_dir.glob(f"{campagna}_*.csv"))
X_list, y_z, y_xy = [], [], []
for fp in sample_files:
try:
df = pd.read_csv(fp, sep=";")
if df.empty: continue
row = df.iloc[0]
# Mapping RSSI basato su gateway.csv (risolve errore 'mac')
X_list.append([float(row.get(gw, nan_fill)) for gw in gateways_order])
y_z.append(int(round(float(row.get("z")))))
y_xy.append([float(row.get("x")), float(row.get("y"))])
except: continue

if not X_list:
log(f"[TRAIN-CORE] ERRORE: Dati non validi per campagna {campagna}")
job_path.unlink()
continue

X, Y_z, Y_xy = np.array(X_list), np.array(y_z), np.array(y_xy)

# Fitting KNN
log(f"[TRAIN-CORE] Fitting modello per {model_filename}...")
floor_clf = KNeighborsClassifier(
n_neighbors=int(knn_cfg.get('k', 5)),
weights=knn_cfg.get('weights', 'distance'),
metric=knn_cfg.get('metric', 'euclidean')
).fit(X, Y_z)
models_xy = {}
for z in np.unique(Y_z):
idx = np.where(Y_z == z)[0]
models_xy[int(z)] = KNeighborsRegressor(
n_neighbors=min(int(knn_cfg.get('k', 5)), len(idx)),
weights=knn_cfg.get('weights', 'distance'),
metric=knn_cfg.get('metric', 'euclidean')
).fit(X[idx], Y_xy[idx])

# Salvataggio Pacchetto
model_pkg = {
"floor_clf": floor_clf,
"xy_by_floor": models_xy,
"gateways_order": gateways_order,
"nan_fill": nan_fill,
"created_at": datetime.now().isoformat(),
"campaign": campagna,
"filename": model_filename
}
Path("/data/model").mkdir(parents=True, exist_ok=True)
joblib.dump(model_pkg, model_path)
log(f"[TRAIN-CORE] ✅ Addestramento COMPLETATO: {model_filename}")

except Exception as e:
log(f"[TRAIN-CORE] ❌ ERRORE CRITICO: {str(e)}")
finally:
if job_path.exists():
job_path.unlink()

def run_train_monitor():
"""Loop di monitoraggio per il Core Orchestrator."""
while True:
process_train_jobs()
time.sleep(5)

+ 66
- 400
app/train_mode.py Zobrazit soubor

@@ -1,419 +1,85 @@
# app/train_mode.py
# Training mode: build hierarchical KNN model (floor classifier + per-floor X/Y regressors)
# Adds verbose dataset statistics useful for large training runs.

from __future__ import annotations

import glob
import os
import glob
import time
import math
from dataclasses import dataclass
from typing import Any, Callable, Dict, List, Optional, Tuple

import joblib
from datetime import datetime
import numpy as np
import pandas as pd
from datetime import datetime
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
import sklearn

# NOTE: these are already present in the project
from .csv_config import load_gateway_features_csv
from .logger_utils import log_msg as log


@dataclass
class GatewayStats:
mac: str
total_samples: int = 0 # total rows processed (per sample point)
non_missing: int = 0 # non-missing rssi count
missing: int = 0 # missing (nan) count
sum_: float = 0.0
sumsq: float = 0.0
min_: float = float("inf")
max_: float = float("-inf")

def add(self, v: float, is_missing: bool) -> None:
self.total_samples += 1
if is_missing:
self.missing += 1
return
self.non_missing += 1
self.sum_ += v
self.sumsq += v * v
if v < self.min_:
self.min_ = v
if v > self.max_:
self.max_ = v

def mean(self) -> float:
return self.sum_ / self.non_missing if self.non_missing else float("nan")

def std(self) -> float:
if self.non_missing <= 1:
return float("nan")
mu = self.mean()
var = max(0.0, (self.sumsq / self.non_missing) - (mu * mu))
return math.sqrt(var)

def missing_pct(self) -> float:
return (self.missing / self.total_samples) * 100.0 if self.total_samples else 0.0


def _get(d: Dict[str, Any], key: str, default: Any = None) -> Any:
return d.get(key, default) if isinstance(d, dict) else default


def _as_bool(v: Any, default: bool = False) -> bool:
if v is None:
return default
if isinstance(v, bool):
return v
if isinstance(v, (int, float)):
return bool(v)
s = str(v).strip().lower()
return s in ("1", "true", "yes", "y", "on")


def _safe_float(v: Any) -> Optional[float]:
try:
if v is None:
return None
if isinstance(v, float) and math.isnan(v):
return None
return float(v)
except Exception:
return None

# Import assoluti garantiti
from csv_config import load_gateway_features_csv
from logger_utils import log_msg as log

def _collect_dataset(
sample_files: List[str],
gateways_order: List[str],
nan_fill: float,
log: Callable[[str], None],
verbose: bool,
) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, Dict[str, GatewayStats], Dict[str, Any]]:
def run_train(settings, log_fn=None, target_files=None):
"""
Build dataset from per-point sample csv files.

Each sample file is expected to contain:
header: mac;x;y;z;<GW1>;<GW2>...
1 row: beacon_mac; x; y; z; rssi_gw1; rssi_gw2; ...

Returns:
X (N, G), y_floor (N,), y_xy (N,2), meta_xy (N,2),
gw_stats, global_stats
Esegue l'addestramento Hierarchical KNN su un set di file specifico (Campagna).
"""
X_rows: List[List[float]] = []
y_floor: List[int] = []
y_xy: List[List[float]] = []
meta_xy: List[List[float]] = []

gw_stats: Dict[str, GatewayStats] = {gw: GatewayStats(mac=gw) for gw in gateways_order}

floors_counter: Dict[int, int] = {}
bad_files: int = 0
missing_cols_files: int = 0

expected_cols: Optional[List[str]] = None

for fp in sample_files:
try:
df = pd.read_csv(fp, sep=";", dtype=str)
except Exception as e:
bad_files += 1
if verbose:
log(f"TRAIN WARN: cannot read sample file {fp}: {type(e).__name__}: {e}")
continue

if df.shape[0] < 1:
bad_files += 1
if verbose:
log(f"TRAIN WARN: empty sample file {fp}")
continue

row = df.iloc[0].to_dict()

if verbose:
cols = list(df.columns)
if expected_cols is None:
expected_cols = cols
elif cols != expected_cols:
missing_cols_files += 1
if missing_cols_files <= 5:
log(f"TRAIN WARN: columns mismatch in {os.path.basename(fp)} (expected {len(expected_cols)} cols, got {len(cols)})")

x = _safe_float(row.get("x"))
y = _safe_float(row.get("y"))
z = _safe_float(row.get("z"))
if x is None or y is None or z is None:
bad_files += 1
if verbose:
log(f"TRAIN WARN: missing x/y/z in {fp}")
continue

z_i = int(round(z))
floors_counter[z_i] = floors_counter.get(z_i, 0) + 1

feats: List[float] = []
for gw in gateways_order:
v = row.get(gw)
fv = _safe_float(v)
if fv is None:
feats.append(nan_fill)
gw_stats[gw].add(nan_fill, is_missing=True)
else:
feats.append(fv)
gw_stats[gw].add(fv, is_missing=False)

X_rows.append(feats)
y_floor.append(z_i)
y_xy.append([x, y])
meta_xy.append([x, y])

if not X_rows:
raise RuntimeError("No valid samples found in samples_dir (dataset empty).")

X = np.asarray(X_rows, dtype=np.float32)
y_floor_arr = np.asarray(y_floor, dtype=np.int32)
y_xy_arr = np.asarray(y_xy, dtype=np.float32)
meta_xy_arr = np.asarray(meta_xy, dtype=np.float32)

global_stats: Dict[str, Any] = {
"samples_total_files": len(sample_files),
"samples_used": int(X.shape[0]),
"samples_bad": int(bad_files),
"floors_counts": dict(sorted(floors_counter.items(), key=lambda kv: kv[0])),
"missing_cols_files": int(missing_cols_files),
"gateways": int(len(gateways_order)),
"nan_fill": float(nan_fill),
}

return X, y_floor_arr, y_xy_arr, meta_xy_arr, gw_stats, global_stats


def _log_train_stats(
log: Callable[[str], None],
X: np.ndarray,
y_floor: np.ndarray,
y_xy: np.ndarray,
gateways_order: List[str],
nan_fill: float,
gw_stats: Dict[str, GatewayStats],
global_stats: Dict[str, Any],
top_k: int = 8,
) -> None:
"""Human-friendly statistics for training runs."""
log(
"TRAIN stats: "
f"samples_used={global_stats.get('samples_used')} "
f"samples_bad={global_stats.get('samples_bad')} "
f"files_total={global_stats.get('samples_total_files')} "
f"gateways={len(gateways_order)} "
f"floors={list(global_stats.get('floors_counts', {}).keys())}"
)
if global_stats.get("missing_cols_files", 0):
log(f"TRAIN stats: files_with_column_mismatch={global_stats['missing_cols_files']} (see earlier WARN lines)")

xs = y_xy[:, 0]
ys = y_xy[:, 1]
log(
"TRAIN stats: XY range "
f"X[min,max]=[{float(np.min(xs)):.2f},{float(np.max(xs)):.2f}] "
f"Y[min,max]=[{float(np.min(ys)):.2f},{float(np.max(ys)):.2f}]"
)

miss = int((X == nan_fill).sum())
total = int(X.size)
miss_pct = (miss / total) * 100.0 if total else 0.0
log(f"TRAIN stats: feature sparsity missing={miss}/{total} ({miss_pct:.1f}%) using nan_fill={nan_fill}")

gw_list = list(gw_stats.values())
gw_list_sorted = sorted(gw_list, key=lambda s: (s.missing_pct(), -s.non_missing), reverse=True)

worst = gw_list_sorted[: max(1, min(top_k, len(gw_list_sorted)))]
worst_str = " | ".join(
f"{g.mac}: miss={g.missing_pct():.1f}% (seen={g.non_missing}) mean={g.mean():.1f} std={g.std():.1f}"
for g in worst
)
log(f"TRAIN stats: gateways with highest missing%: {worst_str}")

best = list(reversed(gw_list_sorted))[: max(1, min(top_k, len(gw_list_sorted)))]
best_str = " | ".join(
f"{g.mac}: miss={g.missing_pct():.1f}% (seen={g.non_missing}) mean={g.mean():.1f} std={g.std():.1f}"
for g in best
)
log(f"TRAIN stats: gateways with lowest missing%: {best_str}")

floors = global_stats.get("floors_counts", {})
if floors:
floor_str = ", ".join(f"z={k}:{v}" for k, v in floors.items())
log(f"TRAIN stats: floor distribution: {floor_str}")


def run_train(settings: Dict[str, Any], log: Optional[Callable[[str], None]] = None) -> None:
"""
Train hierarchical KNN:
- KNeighborsClassifier for floor (Z)
- For each floor, a KNeighborsRegressor for (X,Y) as multioutput

Model saved with joblib to paths.model (or train.model_path).
"""
if log is None:
def log(msg: str) -> None:
print(msg, flush=True)

# Build stamp for this module (helps verifying which file is running)
try:
import hashlib
from pathlib import Path
_b = Path(__file__).read_bytes()
log(f"TRAIN_MODE build sha256={hashlib.sha256(_b).hexdigest()[:12]} size={len(_b)}")
except Exception:
pass

train_cfg = _get(settings, "train", {})
paths = _get(settings, "paths", {})
debug = _get(settings, "debug", {})

samples_dir = _get(train_cfg, "samples_dir", _get(paths, "samples_dir", "/data/train/samples"))
gateways_csv = _get(train_cfg, "gateways_csv", _get(paths, "gateways_csv", "/data/config/gateway.csv"))
model_path = _get(train_cfg, "model_path", _get(paths, "model", "/data/model/model.joblib"))

nan_fill = float(_get(train_cfg, "nan_fill", -110.0))

k_floor = int(_get(train_cfg, "k_floor", _get(_get(settings, "ml", {}), "k", 7)))
k_xy = int(_get(train_cfg, "k_xy", _get(_get(settings, "ml", {}), "k", 7)))

weights = str(_get(train_cfg, "weights", _get(_get(settings, "ml", {}), "weights", "distance")))
metric = str(_get(train_cfg, "metric", _get(_get(settings, "ml", {}), "metric", "euclidean")))

verbose = _as_bool(_get(debug, "train_verbose", True), True)
top_k = int(_get(debug, "train_stats_top_k", 8))

backup_existing_model = _as_bool(_get(train_cfg, "backup_existing_model", True), True)

log(
"TRAIN config: "
f"samples_dir={samples_dir} "
f"gateways_csv={gateways_csv} "
f"model_path={model_path} "
f"nan_fill={nan_fill} "
f"k_floor={k_floor} k_xy={k_xy} "
f"weights={weights} metric={metric} "
f"train_verbose={verbose} backup_existing_model={backup_existing_model}"
)

# 1) Load gateways definition to know feature order
gws = load_gateway_features_csv(str(gateways_csv))
if log_fn is None:
log_fn = log

train_cfg = settings.get("train", {})
knn_cfg = train_cfg.get("knn", {})
# Parametri da config.yaml
samples_dir = train_cfg.get("samples_dir", "/data/train/samples")
gateways_csv = train_cfg.get("gateways_csv", "/data/config/gateway.csv")
model_path = train_cfg.get("model_path", "/data/model/model.joblib")
nan_fill = float(train_cfg.get("nan_fill", -110.0))
k_val = int(knn_cfg.get("k", 5))
weights = knn_cfg.get("weights", "distance")
metric = knn_cfg.get("metric", "euclidean")

log_fn(f"TRAIN: Caricamento gateway da {gateways_csv}")
gws = load_gateway_features_csv(gateways_csv)
gateways_order = [g.mac for g in gws]
if not gateways_order:
raise RuntimeError("No gateways found in gateways_csv (feature-set empty).")

if verbose:
preview = ", ".join(gateways_order[: min(6, len(gateways_order))])
log(f"TRAIN: gateways(feature-order)={len(gateways_order)} first=[{preview}{'...' if len(gateways_order) > 6 else ''}]")

# 2) Collect sample files
sample_files = sorted(glob.glob(os.path.join(samples_dir, "*.csv")))
if not sample_files:
raise RuntimeError(f"No sample files found in samples_dir={samples_dir}")

X, y_floor, y_xy, meta_xy, gw_stats, global_stats = _collect_dataset(
sample_files=sample_files,
gateways_order=gateways_order,
nan_fill=nan_fill,
log=log,
verbose=verbose,
)

if verbose:
_log_train_stats(
log=log,
X=X,
y_floor=y_floor,
y_xy=meta_xy,
gateways_order=gateways_order,
nan_fill=nan_fill,
gw_stats=gw_stats,
global_stats=global_stats,
top_k=top_k,
)
# Selezione file (Campagna specifica o globale)
files = target_files if target_files else glob.glob(os.path.join(samples_dir, "*.csv"))
if not files:
raise RuntimeError("Nessun file CSV trovato per l'addestramento.")

# 3) Fit floor classifier
floor_clf = KNeighborsClassifier(
n_neighbors=k_floor,
weights=weights,
metric=metric,
)
floor_clf.fit(X, y_floor)

# 4) Fit per-floor XY regressors (multioutput)
models_xy: Dict[int, Any] = {}
floors = sorted(set(int(z) for z in y_floor.tolist()))
for z in floors:
idx = np.where(y_floor == z)[0]
Xz = X[idx, :]
yz = y_xy[idx, :] # (N,2)
reg = KNeighborsRegressor(
n_neighbors=k_xy,
weights=weights,
metric=metric,
)
reg.fit(Xz, yz)
models_xy[int(z)] = reg

if verbose:
xs = yz[:, 0]
ys = yz[:, 1]
log(
f"TRAIN: floor z={z} samples={int(len(idx))} "
f"Xrange=[{float(np.min(xs)):.1f},{float(np.max(xs)):.1f}] "
f"Yrange=[{float(np.min(ys)):.1f},{float(np.max(ys)):.1f}]"
)

model = {
"type": "hier_knn_floor_xy",
"gateways_order": gateways_order,
"nan_fill": nan_fill,
"k_floor": k_floor,
"k_xy": k_xy,
"weights": weights,
"metric": metric,
# Costruzione dataset
X_list, y_z, y_xy = [], [], []
for fp in files:
try:
df = pd.read_csv(fp, sep=";")
if df.empty: continue
row = df.iloc[0]
X_list.append([float(row.get(gw, nan_fill)) for gw in gateways_order])
y_z.append(int(round(float(row.get("z")))))
y_xy.append([float(row.get("x")), float(row.get("y"))])
except: continue

X, Y_z, Y_xy = np.array(X_list), np.array(y_z), np.array(y_xy)

# Step 1: Classificatore Piano (Z)
log_fn(f"TRAIN: Fitting Piano Classifier (K={k_val})")
floor_clf = KNeighborsClassifier(n_neighbors=k_val, weights=weights, metric=metric).fit(X, Y_z)
# Step 2: Regressori X,Y per ogni piano trovato
models_xy = {}
for z in np.unique(Y_z):
idx = np.where(Y_z == z)[0]
log_fn(f"TRAIN: Fitting XY Regressor piano {z} ({len(idx)} campioni)")
models_xy[int(z)] = KNeighborsRegressor(
n_neighbors=min(k_val, len(idx)),
weights=weights,
metric=metric
).fit(X[idx], Y_xy[idx])

# Salvataggio
model_data = {
"floor_clf": floor_clf,
"xy_by_floor": models_xy,
"floors": floors,
"gateways_order": gateways_order,
"nan_fill": nan_fill,
"created_at": datetime.now().isoformat()
}

os.makedirs(os.path.dirname(model_path), exist_ok=True)

# Backup previous model (così inferenza può continuare ad usare una versione nota)
backup_path = None
if backup_existing_model and os.path.exists(model_path):
root, ext = os.path.splitext(model_path)
ts = int(time.time())
# evita collisioni se lanci due train nello stesso secondo
for bump in range(0, 1000):
cand = f"{root}_{ts + bump}{ext}"
if not os.path.exists(cand):
backup_path = cand
break
try:
if backup_path:
os.replace(model_path, backup_path)
log(f"TRAIN: previous model moved to {backup_path}")
except Exception as e:
log(f"TRAIN WARNING: cannot backup previous model {model_path}: {type(e).__name__}: {e}")

# Metadata utile (tipo 'modinfo' minimale)
model["created_at_utc"] = datetime.utcnow().replace(microsecond=0).isoformat() + "Z"
model["sklearn_version"] = getattr(sklearn, "__version__", "unknown")
model["numpy_version"] = getattr(np, "__version__", "unknown")

joblib.dump(model, model_path)

log(
f"TRAIN DONE: model saved to {model_path} "
f"(samples={int(X.shape[0])}, gateways={len(gateways_order)}, floors={len(floors)})"
)
joblib.dump(model_data, model_path)
log_fn(f"✅ TRAIN SUCCESS: Modello salvato in {model_path}")

+ 97
- 75
app/web_beacon.py Zobrazit soubor

@@ -1,88 +1,110 @@
import streamlit as st
import pandas as pd
import os
from pathlib import Path
# CORREZIONE: rimosso il punto per evitare ImportError
from normalize import norm_mac

def load_beacons(file_path, delimiter):
"""Carica i beacon dal file CSV utilizzando il delimitatore configurato."""
if not os.path.exists(file_path):
return pd.DataFrame(columns=["BeaconName", "MAC"])
try:
return pd.read_csv(file_path, sep=delimiter)
except Exception:
return pd.DataFrame(columns=["BeaconName", "MAC"])
def show_beacon_manager(cfg):
st.subheader("🏷️ Gestione Beacon e Gruppi")
paths = cfg.get("paths", {})
beacon_csv = paths.get("beacons_csv", "/data/config/beacons.csv")
group_csv = "/data/config/beacongroup.csv"
csv_delim = paths.get("csv_delimiter", ";")

def save_beacons(file_path, df, delimiter):
"""Salva i beacon su CSV con il separatore corretto e crea le cartelle se necessario."""
folder = os.path.dirname(file_path)
if folder and not os.path.exists(folder):
os.makedirs(folder, exist_ok=True)
df.to_csv(file_path, index=False, sep=delimiter)
# --- CARICAMENTO DATI ---
def load_df(path, cols):
if os.path.exists(path):
try:
df = pd.read_csv(path, sep=csv_delim)
df.columns = [c.strip() for c in df.columns]
return df
except:
return pd.DataFrame(columns=cols)
return pd.DataFrame(columns=cols)

def show_beacon_manager(config):
st.subheader("🏷️ Gestione Anagrafica Beacon")
# Recupero parametri dalla gerarchia paths del config.yaml
paths_cfg = config.get("paths", {})
beacons_file = paths_cfg.get("beacons_csv", "/data/config/beacons.csv")
delimiter = paths_cfg.get("csv_delimiter", ";")
# Caricamento dati
df = load_beacons(beacons_file, delimiter)
df_beacons = load_df(beacon_csv, ["BeaconName", "MAC"])
df_groups = load_df(group_csv, ["BeaconGroupName", "GroupMAC"])

# --- SEZIONE AGGIUNTA ---
with st.expander("➕ Aggiungi Nuovo Beacon", expanded=len(df) == 0):
col1, col2 = st.columns(2)
with col1:
name = st.text_input("Nome Beacon (es. BC-21)")
with col2:
mac = st.text_input("Indirizzo MAC (es. C3:00:00:57:B9:E6)")
if st.button("REGISTRA BEACON"):
if name and mac:
mac = mac.strip().upper()
if mac in df['MAC'].values:
st.error("Errore: Questo MAC è già presente in lista.")
else:
new_line = pd.DataFrame([{"BeaconName": name, "MAC": mac}])
df = pd.concat([df, new_line], ignore_index=True)
save_beacons(beacons_file, df, delimiter)
st.success(f"Beacon {name} registrato correttamente!")
st.rerun()
else:
st.warning("Inserisci sia il Nome che il MAC address.")
# --- UI: TABS INTERNI ---
sub_tab1, sub_tab2 = st.tabs(["Individuali", "Gruppi"])

# --- SEZIONE VISUALIZZAZIONE E MODIFICA ---
if not df.empty:
st.markdown("---")
st.write("### Lista Beacon")
st.info("💡 Puoi modificare i nomi o i MAC direttamente cliccando nelle celle della tabella e poi cliccare su SALVA.")
# Editor interattivo per modifiche "al volo"
edited_df = st.data_editor(
df,
with sub_tab1:
st.markdown("### 📋 Anagrafica Beacon Singoli")
# Editor interattivo per i beacon
edited_beacons = st.data_editor(
df_beacons,
num_rows="dynamic",
use_container_width=True,
hide_index=True,
column_config={
"BeaconName": st.column_config.TextColumn("Nome Beacon", help="Nome identificativo", required=True),
"MAC": st.column_config.TextColumn("Indirizzo MAC", help="Formato AA:BB:CC...", required=True)
}
key="editor_beacons",
hide_index=True
)
# Controllo se ci sono state modifiche
if not edited_df.equals(df):
if st.button("💾 SALVA MODIFICHE TABELLA"):
save_beacons(beacons_file, edited_df, delimiter)
st.success("Anagrafica aggiornata!")
if st.button("💾 Salva Beacon Individuali"):
# Applichiamo la normalizzazione ai MAC inseriti
try:
edited_beacons['MAC'] = edited_beacons['MAC'].apply(norm_mac)
edited_beacons.to_csv(beacon_csv, index=False, sep=csv_delim)
st.success("Anagrafica Beacon salvata correttamente!")
st.rerun()
except Exception as e:
st.error(f"Errore durante il salvataggio: {e}")

with sub_tab2:
st.markdown("### 🏗️ Creazione e Gestione Gruppi")
# Mostra i gruppi esistenti se il file esiste
if not df_groups.empty:
st.write("#### Gruppi Attivi")
st.dataframe(df_groups, use_container_width=True, hide_index=True)
else:
st.info("Nessun gruppo configurato.")
st.divider()
st.write("#### Aggiungi o Modifica un Gruppo")
# Form per la gestione dei gruppi
with st.form("form_gruppo"):
gn = st.text_input("Nome Gruppo", help="Esempio: 4dBm_Power, Gruppo_A, ecc.")
# Recuperiamo i beacon disponibili per popolare la selezione
available_macs = df_beacons["MAC"].tolist()
available_names = df_beacons["BeaconName"].tolist()
options = [f"{name} ({mac})" for name, mac in zip(available_names, available_macs)]
selected_options = st.multiselect("Seleziona i Beacon da includere:", options)
submit = st.form_submit_button("💾 Salva Gruppo")
if submit:
if not gn:
st.error("Inserisci un nome per il gruppo.")
elif not selected_options:
st.error("Seleziona almeno un beacon.")
else:
# Estraiamo i MAC eliminando la parte del nome
selected_macs = [opt.split("(")[-1].replace(")", "") for opt in selected_options]
mac_list_str = ",".join(selected_macs)
# Aggiorna se esiste, altrimenti aggiungi
if gn in df_groups["BeaconGroupName"].values:
df_groups.loc[df_groups["BeaconGroupName"] == gn, "GroupMAC"] = mac_list_str
else:
new_row = pd.DataFrame([{"BeaconGroupName": gn, "GroupMAC": mac_list_str}])
df_groups = pd.concat([df_groups, new_row], ignore_index=True)
# Assicuriamoci che la cartella esista
os.makedirs(os.path.dirname(group_csv), exist_ok=True)
df_groups.to_csv(group_csv, index=False, sep=csv_delim)
st.success(f"Gruppo '{gn}' creato/aggiornato con successo!")
st.rerun()

if not df_groups.empty:
if st.button("🗑️ Elimina tutti i Gruppi"):
if os.path.exists(group_csv):
os.remove(group_csv)
st.warning("Configurazione gruppi rimossa.")
st.rerun()

# --- SEZIONE ELIMINAZIONE ---
st.markdown("---")
st.subheader("Elimina Beacon")
to_del = st.selectbox("Seleziona il beacon da rimuovere:", df['BeaconName'].tolist())
if st.button("🗑️ ELIMINA SELEZIONATO"):
df = df[df['BeaconName'] != to_del]
save_beacons(beacons_file, df, delimiter)
st.success(f"Beacon {to_del} rimosso.")
st.rerun()
else:
st.info("Nessun beacon configurato. Inserisci il primo beacon per creare il file.")
return df_beacons, df_groups

+ 77
- 112
app/web_status.py Zobrazit soubor

@@ -1,128 +1,93 @@
import streamlit as st
import pandas as pd
import psutil
import os
import time
import json
import paho.mqtt.client as mqtt
from datetime import datetime
import requests
import paho.mqtt.client as mqtt
import psutil # AGGIUNTO per monitoraggio processi

def get_system_metrics():
"""Recupera statistiche hardware del server."""
return {
"cpu": psutil.cpu_percent(interval=None),
"ram": psutil.virtual_memory().percent,
"disk": psutil.disk_usage('/').percent,
"net_recv": psutil.net_io_counters().bytes_recv / (1024**2)
}
def is_main_running():
"""Verifica se il processo main.py è attualmente in esecuzione."""
for proc in psutil.process_iter(['cmdline']):
try:
cmd = proc.info['cmdline']
if cmd and 'app.main' in ' '.join(cmd):
return True
except (psutil.NoSuchProcess, psutil.AccessDenied):
continue
return False

def get_api_data(cfg, sec):
"""Fetch reale dei beacon dalle API OIDC."""
if not sec or 'oidc' not in sec:
return None, "Segreti mancanti"

def check_mqtt_broker(host, port, protocol_str="mqttv311"):
try:
auth_res = requests.post(
cfg['api']['token_url'],
data={
"grant_type": "password",
"client_id": cfg['api']['client_id'],
"client_secret": sec['oidc']['client_secret'],
"username": sec['oidc']['username'],
"password": sec['oidc']['password'],
},
verify=cfg['api'].get('verify_tls', False),
timeout=5
)
token = auth_res.json().get("access_token")
res = requests.get(
cfg['api']['get_beacons_url'],
headers={"Authorization": f"Bearer {token}"},
verify=cfg['api'].get('verify_tls', False),
timeout=5
)
return res.json(), "OK"
# Mappatura protocollo per compatibilità paho-mqtt
proto = mqtt.MQTTv311
if protocol_str == "mqttv5":
proto = mqtt.MQTTv5
client = mqtt.Client(protocol=proto)
# Aumentiamo il timeout a 5 secondi per maggiore stabilità
client.connect(host, port, keepalive=5)
client.disconnect()
return True
except Exception as e:
return None, str(e)

def show_system_status(cfg, sec=None):
st.title("🛰️ Diagnostica & Sniffer")
# Utile per il debug interno se necessario
return False

# --- 1. RISORSE DI SISTEMA ---
st.subheader("🖥️ Risorse Hardware")
m = get_system_metrics()
c1, c2, c3, c4 = st.columns(4)
c1.metric("CPU", f"{m['cpu']}%")
c2.metric("RAM", f"{m['ram']}%")
c3.metric("Disco", f"{m['disk']}%")
c4.metric("Rete", f"{m['net_recv']:.1f} MB")
def check_api_server(token_url, verify_tls):
try:
response = requests.get(token_url, timeout=2, verify=verify_tls)
return True
except:
return False

st.divider()
def show_system_status(cfg, secrets):
st.subheader("🖥️ Stato Infrastruttura")
col1, col2, col3, col4 = st.columns(4)
# 1. CORE ENGINE
main_active = is_main_running()
col1.metric("Core Engine", "ON" if main_active else "OFF",
delta=None, delta_color="normal")
if main_active: col1.success("✅ Main Attivo")
else: col1.error("❌ Main Fermo")

# --- 2. CONNETTIVITÀ & DATI API ---
st.subheader("🔌 Connettività & API")
col_api, col_mq = st.columns(2)
# 2. MQTT BROKER
mqtt_cfg = cfg.get('mqtt', {})
mqtt_ok = check_mqtt_broker(
mqtt_cfg.get('host', 'localhost'),
mqtt_cfg.get('port', 1883),
mqtt_cfg.get('protocol', 'mqttv311')
)
col2.metric("MQTT Broker", "Online" if mqtt_ok else "Offline")
if mqtt_ok: col2.success("✅ Broker OK")
else: col2.error("❌ Errore MQTT")

with col_api:
st.markdown("**Server API OIDC**")
beacons_api_data, api_msg = get_api_data(cfg, sec)
if beacons_api_data:
st.success(f"✅ Connesso ({len(beacons_api_data)} beacon)")
with st.expander("Visualizza Tabella Dati API"):
# Mostriamo i dati API in una tabella senza scroll eccessivo
df_api = pd.DataFrame(beacons_api_data)
st.table(df_api.head(10))
else:
st.error(f"❌ Errore: {api_msg}")
# 3. API SERVER
api_cfg = cfg.get('api', {})
api_ok = check_api_server(api_cfg.get('token_url', ''), api_cfg.get('verify_tls', False))
col3.metric("API System", "Ready" if api_ok else "Error")
if api_ok: col3.success("✅ API OK")
else: col3.error("❌ API Down")

with col_mq:
st.markdown("**Broker MQTT**")
mq_host = cfg.get('mqtt', {}).get('host', '127.0.0.1')
st.info(f"Host: `{mq_host}`")
st.success("✅ Configurazione Caricata")
# 4. DISCO (Data Dir)
try:
usage = psutil.disk_usage('/data')
col4.metric("Spazio Disco", f"{usage.percent}%")
if usage.percent < 90: col4.success(f"✅ {usage.free // (1024**3)} GB Liberi")
else: col4.warning("⚠️ Disco quasi pieno")
except:
col4.write("N/D")

# LOG RECENTI (Ripristinati dal tuo originale)
st.divider()

# --- 3. SNIFFER DATI MQTT ---
st.subheader("🎯 Sniffer Real-Time")
st.caption("Inserisci un MAC per intercettare il traffico live (10 secondi)")

target_mac = st.text_input("MAC da sniffare (es. ac233fc1dd49)", "").lower().replace(":", "")

if st.button("🚀 AVVIA CATTURA", use_container_width=True, type="primary"):
if not target_mac:
st.warning("Inserisci un MAC prima di iniziare.")
else:
captured = []
def on_message(client, userdata, message):
payload = message.payload.decode()
topic = message.topic
if target_mac in topic.lower() or target_mac in payload.lower():
captured.append({
"Ora": time.strftime("%H:%M:%S"),
"Topic": topic,
"Dati": payload[:100] + "..." # Accorciamo per la tabella
})

client = mqtt.Client(client_id=f"Sniffer_{int(time.time())}")
try:
client.on_message = on_message
client.connect(cfg['mqtt']['host'], cfg['mqtt']['port'], 60)
client.subscribe("#")
client.loop_start()

with st.status("Cattura in corso...") as status:
progress = st.progress(0)
for i in range(100):
time.sleep(0.1)
progress.progress(i + 1)
client.loop_stop()
status.update(label="Cattura completata!", state="complete")

if captured:
st.success(f"Intercettati {len(captured)} messaggi per `{target_mac}`")
# Usiamo st.table per evitare le slidebar (renderizza tutto il contenuto)
st.table(pd.DataFrame(captured))
else:
st.warning("Nessun messaggio trovato. Controlla che il dispositivo sia acceso.")
except Exception as e:
st.error(f"Connessione fallita: {e}")
st.subheader("📝 Ultimi Eventi Log")
LOG_FILE = "/tmp/main_process.log"
if os.path.exists(LOG_FILE):
with open(LOG_FILE, "r") as f:
lines = f.readlines()
st.text_area("Log in tempo reale:", "".join(lines[-20:]), height=300)
else:
st.info("Nessun file di log trovato in /tmp/main_process.log")

+ 139
- 145
app/web_suite.py Zobrazit soubor

@@ -2,183 +2,177 @@ import streamlit as st
import yaml
import subprocess
import os
import web_status # Nuovo modulo
import time
import signal
import web_status
import psutil

# --- COSTANTI E UTILS (Invariati) ---
CONFIG_PATH = os.environ.get("CONFIG") or os.environ.get("CONFIG_FILE") or "/config/config.yaml"
SECRETS_PATH = os.environ.get("SECRETS_FILE") or "/config/secrets.yaml"
LOG_FILE = "/tmp/main_process.log"
STATE_FILE = "/data/.web_state"

def load_yaml(path):
if not os.path.exists(path): return {}
with open(path, 'r') as f: return yaml.safe_load(f) or {}

def save_yaml(path, data):
with open(path, 'w') as f: yaml.dump(data, f, default_flow_style=False)

cfg = load_yaml(CONFIG_PATH)

# --- CONFIGURAZIONE PAGINA E MENU ABOUT ---
# --- 1. CONFIGURAZIONE PAGINA ---
st.set_page_config(
page_title="BLE Localizer Manager",
layout="wide",
initial_sidebar_state="auto",
menu_items={
'Get Help': None,
'Report a bug': None,
'About': "🛰️BLE AI Localizer - Suite\nSistema professionale di posizionamento BLE."
}
initial_sidebar_state="auto"
)

st.title("🛰️ BLE AI Localizer - Suite") # Forza il titolo qui
# --- 2. CONFIGURAZIONE PERCORSI ---
REAL_CONFIG_PATH = "/config/config.yaml"
if not os.path.exists(REAL_CONFIG_PATH):
REAL_CONFIG_PATH = "/app/config/config.yaml"

# --- CSS OTTIMIZZATO (Sidebar Fina + Mobile) ---
st.markdown("""
<style>
[data-testid="stSidebar"] { min-width: 200px !important; max-width: 230px !important; }
[data-testid="stSidebar"] .stButton > button { width: 100%; height: 2.5rem; border-radius: 8px; font-size: 0.9rem !important; }
.stTextInput input, .stSelectbox div, .stNumberInput input { height: 3rem !important; }
button[data-baseweb="tab"] { height: 3.5rem !important; }
.stButton > button { border-radius: 10px; font-weight: bold; }
</style>
""", unsafe_allow_html=True)
LOG_FILE = "/tmp/main_process.log"

if "main_login_user" not in st.session_state:
st.session_state["main_login_user"] = ""
def load_yaml(path):
if not os.path.exists(path): return {}
with open(path, 'r', encoding='utf-8') as f: return yaml.safe_load(f) or {}

# --- LOGIN (Tua versione originale) ---
def save_yaml(path, data):
with open(path, 'w', encoding='utf-8') as f: yaml.dump(data, f, default_flow_style=False)

cfg = load_yaml(REAL_CONFIG_PATH)

def stop_core_engine():
for proc in psutil.process_iter(['cmdline']):
try:
cmd = proc.info['cmdline']
if cmd and ('app.main' in ' '.join(cmd) or 'main.py' in ' '.join(cmd)):
proc.terminate()
proc.wait(timeout=2)
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.TimeoutExpired):
try: proc.kill()
except: pass

def start_core_engine():
env = os.environ.copy()
env["CONFIG"] = REAL_CONFIG_PATH
env["PYTHONPATH"] = "/app"
with open(LOG_FILE, "a") as log_f:
subprocess.Popen(
["python3", "-m", "app.main"],
env=env,
cwd="/app",
stdout=log_f,
stderr=log_f,
start_new_session=True
)

# --- 3. TITOLO FISSO ---
st.title("🛰️ BLE AI Localizer - Suite")

# --- 4. LOGICA LOGIN ---
if "password_correct" not in st.session_state:
st.session_state["password_correct"] = False

if not st.session_state["password_correct"]:
user = st.text_input("Username", key="main_login_user")
pw = st.text_input("Password", type="password", key="main_login_pw")
user = st.text_input("Username")
pw = st.text_input("Password", type="password")
if st.button("ACCEDI"):
if user == os.environ.get("UI_USER", "admin") and pw == os.environ.get("UI_PASSWORD", "password"):
st.session_state["password_correct"] = True
st.rerun()
else: st.error("Credenziali errate")
else:
st.error("Credenziali errate")
st.stop()

# Import moduli dopo login
from map_manager import show_mapper
from web_gateway import show_gateway_manager
from web_beacon import show_beacon_manager
import web_training_data
import web_inference
# --- 5. AUTO-START ---
if not web_status.is_main_running():
if "core_auto_launched" not in st.session_state:
start_core_engine()
st.session_state["core_auto_launched"] = True
time.sleep(1)
st.rerun()

def is_proc_alive():
return st.session_state.get('proc') is not None and st.session_state.proc.poll() is None

# Auto-riavvio (Tua logica)
if os.path.exists(STATE_FILE):
with open(STATE_FILE, "r") as f:
if f.read().strip() == "running" and not is_proc_alive():
log_out = open(LOG_FILE, "a")
st.session_state.proc = subprocess.Popen(
["python", "-u", "-m", "app.main"],
env={**os.environ, "PYTHONUNBUFFERED": "1", "CONFIG": CONFIG_PATH},
stdout=log_out, stderr=subprocess.STDOUT, text=True
)

# --- SIDEBAR ---
# --- 6. SIDEBAR: CONTROLLI SISTEMA ---
with st.sidebar:
st.header("Stato Sistema")
alive = is_proc_alive()
if not alive:
if st.button("▶️ AVVIA MAIN"):
if os.path.exists(LOG_FILE): os.remove(LOG_FILE)
st.session_state.proc = subprocess.Popen(
["python", "-u", "-m", "app.main"],
env={**os.environ, "PYTHONUNBUFFERED": "1", "CONFIG": CONFIG_PATH},
stdout=open(LOG_FILE, "w"), stderr=subprocess.STDOUT, text=True
)
with open(STATE_FILE, "w") as f: f.write("running")
st.rerun()
st.header("🛠️ Core Control")
is_running = web_status.is_main_running()
if is_running:
st.markdown("STATO: :green[**CORE ATTIVO**]")
else:
if st.button("⏹️ FERMA MAIN"):
st.session_state.proc.terminate()
st.session_state.proc = None
with open(STATE_FILE, "w") as f: f.write("stopped")
st.markdown("STATO: :red[**CORE FERMO**]")
if st.button("🚀 RIAVVIA CORE" if is_running else "▶️ AVVIA CORE", use_container_width=True):
with st.spinner("Gestione Core..."):
stop_core_engine()
time.sleep(1)
start_core_engine()
time.sleep(2)
st.rerun()

st.divider()
# --- GESTIONE MQTT RAW (DINAMICA DA CONFIG) ---
m_cfg = cfg.get('mqtt', {})
m_host = m_cfg.get('host', '127.0.0.1')
m_port = m_cfg.get('port', 1883)
m_proto = m_cfg.get('protocol', 'mqttv311')
# Estraiamo la parola chiave dal topic (es: 'publish_out' da 'publish_out/#')
m_filter = m_cfg.get('topic', 'publish_out').split('/')[0]

RAW_LOG_DIR = cfg.get('paths', {}).get('mqtt_raw_dir', '/data/mqtt_raw/')
os.makedirs(RAW_LOG_DIR, exist_ok=True)
raw_active = st.toggle("🔴 MQTT RAW RECORDING", value=st.session_state.get("mqtt_logging", False))
st.write(f"Stato: {':green[Running]' if alive else ':red[Stopped]'}")
st.write(f"Modo: **{cfg.get('mode', 'N/D').upper()}**")
if st.button("LOGOUT"):
st.session_state["password_correct"] = False
st.rerun()
if raw_active and not st.session_state.get("mqtt_logging"):
dt = time.strftime("%Y%m%d_%H%M%S")
filepath = os.path.join(RAW_LOG_DIR, f"mqtt_raw_{dt}.log")
# Comando generato dinamicamente dai parametri YAML
cmd = f"stdbuf -oL mosquitto_sub -v -h {m_host} -p {m_port} -t '#' -V {m_proto} | stdbuf -oL grep '{m_filter}' > {filepath}"
proc = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid)
st.session_state["mqtt_logging"] = True
st.session_state["mqtt_proc_pid"] = proc.pid
st.success(f"Log avviato: {m_host}")
st.divider()
st.caption("🚦 LIVE STATUS")
c1, c2, c3 = st.columns(3)
c1.markdown("`MQTT` 🟢")
c2.markdown("`GWs` 🟢")
c3.markdown("`API` 🟢")

# --- TABS (Incluso il nuovo tab Stato) ---
tab_log, tab_cfg, tab_sec, tab_gw, tab_beac, tab_map, tab_data, tab_infer, tab_status = st.tabs([
"📜 Log", "⚙️ Config", "🔑 Secrets", "🌐 Gateway", "🏷️ Beacon", "🗺️ Mappa", "📂 Dati", "🤖 Inferenza", "🖥️ Stato"
if not raw_active and st.session_state.get("mqtt_logging"):
try:
os.killpg(os.getpgid(st.session_state["mqtt_proc_pid"]), signal.SIGTERM)
except:
pass
st.session_state["mqtt_logging"] = False

# --- 7. IMPORT MODULI E TABS ---
from map_manager import show_mapper
from web_gateway import show_gateway_manager
from web_beacon import show_beacon_manager
from web_test_inference import show_test_inference
import web_training_data
import web_inference

tab_log, tab_cfg, tab_sec, tab_gw, tab_beac, tab_map, tab_model, tab_infer_test, tab_infer, tab_status = st.tabs([
"📜 Log", "⚙️ Config", "🔑 Secrets", "🌐 Gateway", "🏷️ Beacon", "📍 Rilevamento", "🧠 Modello", "🧪 InferTest", "🤖 Inferenza", "🖥️ Stato"
])

with tab_status:
import web_status
# Carica i segreti e passali alla funzione
sec_data = load_yaml(SECRETS_PATH)
web_status.show_system_status(cfg, sec_data)
with tab_log:
col_l1, col_l2 = st.columns(2)
if col_l1.button("🔄 AGGIORNA LOG", use_container_width=True): st.rerun()
if col_l2.button("🗑️ AZZERA LOG", use_container_width=True):
try:
with open(LOG_FILE, "w") as f: f.write(f"--- Log resettato il {time.strftime('%Y-%m-%d %H:%M:%S')} ---\n")
st.success("Log azzerato!"); time.sleep(1); st.rerun()
except: st.error("Errore pulizia log")
if os.path.exists(LOG_FILE):
with open(LOG_FILE, "r") as f: st.code("".join(f.readlines()[-100:]))

with tab_cfg:
# RIPRISTINATA TUTTA LA TUA LOGICA ORIGINALE
c_cfg = load_yaml(CONFIG_PATH)
st.subheader("🚀 Stato Operativo")
mode_options = ["infer", "train", "collect_train"]
new_mode = st.selectbox("Modalità:", mode_options, index=mode_options.index(c_cfg.get('mode', 'infer')))

with st.expander("📊 Parametri Raccolta Dati", expanded=True):
p_cfg = c_cfg.get('collect_train', {})
col_a, col_b = st.columns(2)
win_sec = col_a.number_input("Finestra (sec)", value=int(p_cfg.get('window_seconds', 30)))
min_gw = col_a.number_input("Min. Gateway", value=int(p_cfg.get('min_non_nan', 3)))
rssi_min = col_b.slider("RSSI Min", -120, -50, int(p_cfg.get('rssi_min', -110)))
rssi_max = col_b.slider("RSSI Max", -40, 0, int(p_cfg.get('rssi_max', -25)))
outlier = col_b.selectbox("Outlier", ["mad", "iqr", "none"], index=0)

with st.expander("📡 MQTT & 🌐 API", expanded=False):
m_cfg = c_cfg.get('mqtt', {})
mq_host = st.text_input("Broker", value=m_cfg.get('host', '127.0.0.1'))
mq_port = st.number_input("Porta", value=int(m_cfg.get('port', 1883)))
a_cfg = c_cfg.get('api', {})
t_url = st.text_input("Token URL", value=a_cfg.get('token_url', ''))
v_tls = st.checkbox("Verify TLS", value=a_cfg.get('verify_tls', False))

with st.expander("🛠️ Expert Mode (YAML)", expanded=False):
cfg_text = st.text_area("Edit manuale", yaml.dump(c_cfg), height=300)

if st.button("💾 SALVA TUTTO"):
try:
final_cfg = yaml.safe_load(cfg_text)
final_cfg['mode'] = new_mode
# Aggiorna con i valori dei widget per sicurezza
if 'collect_train' not in final_cfg: final_cfg['collect_train'] = {}
final_cfg['collect_train'].update({'window_seconds': win_sec, 'rssi_min': rssi_min})
save_yaml(CONFIG_PATH, final_cfg)
st.success("Salvato!")
except Exception as e: st.error(e)
st.subheader("🚀 Configurazione Operativa")
cfg_text = st.text_area("Expert Mode (YAML)", yaml.dump(cfg), height=400)
if st.button("💾 SALVA CONFIG"):
save_yaml(REAL_CONFIG_PATH, yaml.safe_load(cfg_text)); st.success("Salvato!")

with tab_sec:
sec = load_yaml(SECRETS_PATH)
CURR_SECRETS = os.environ.get("SECRETS_FILE") or "/config/secrets.yaml"
sec = load_yaml(CURR_SECRETS)
sec_edit = st.text_area("Secrets YAML", yaml.dump(sec), height=200)
if st.button("SALVA SECRETS"):
save_yaml(SECRETS_PATH, yaml.safe_load(sec_edit))
st.success("ApiToken salvati!")

with tab_log:
if os.path.exists(LOG_FILE):
with open(LOG_FILE, "r") as f: st.code("".join(f.readlines()[-50:]))
if st.button("🔄 AGGIORNA LOG"): st.rerun()
if st.button("SALVA SECRETS"):
save_yaml(CURR_SECRETS, yaml.safe_load(sec_edit)); st.success("OK!")

with tab_gw: show_gateway_manager(cfg)
with tab_beac: show_beacon_manager(cfg)
with tab_map: show_mapper(cfg)
with tab_gw: show_gateway_manager(load_yaml(CONFIG_PATH))
with tab_beac: show_beacon_manager(load_yaml(CONFIG_PATH))
with tab_data: web_training_data.show_training_data_manager(cfg)
with tab_model: web_training_data.show_training_data_manager(cfg)
with tab_infer_test: show_test_inference(cfg)
with tab_infer: web_inference.show_inference_page(cfg)
with tab_status:
sec_data = load_yaml(os.environ.get("SECRETS_FILE") or "/config/secrets.yaml")
web_status.show_system_status(cfg, sec_data)

+ 146
- 0
app/web_test_inference.py Zobrazit soubor

@@ -0,0 +1,146 @@
import streamlit as st
import pandas as pd
import os
import joblib
import numpy as np
import math
import folium
import json
import base64
from io import BytesIO
from pathlib import Path
from PIL import Image
from streamlit_folium import st_folium

# --- UTILS ---
@st.cache_data
def get_image_base64(img_path):
img = Image.open(img_path).convert("RGBA")
w, h = img.size
buffered = BytesIO()
img.save(buffered, format="PNG")
img_str = base64.b64encode(buffered.getvalue()).decode("ascii")
return f"data:image/png;base64,{img_str}", w, h

def calculate_error(z_real, x_real, y_real, z_pred, x_pred, y_pred):
z_err = abs(z_real - z_pred)
dist_err = math.sqrt((x_real - x_pred)**2 + (y_real - y_pred)**2)
return z_err, dist_err

def show_test_inference(cfg):
st.subheader("🧪 Test Inferenza Offline")
MODEL_DIR = Path("/data/model")
TEST_SAMPLES_DIR = Path("/data/train/testsamples")
MAPS_DIR = Path("/data/maps")

available_models = sorted([m.name for m in MODEL_DIR.glob("model_camp_*.joblib")], reverse=True)
test_files = sorted([f.name for f in TEST_SAMPLES_DIR.glob("*.csv")])

if not available_models or not test_files:
st.warning("Verifica la presenza di modelli e campioni di test.")
return

col1, col2 = st.columns(2)
selected_model = col1.selectbox("🎯 Seleziona Modello:", available_models)
selected_test = col2.selectbox("📄 Seleziona Fingerprint:", test_files)

if "test_results" not in st.session_state:
st.session_state.test_results = None

if st.button("🚀 ESEGUI TEST DI PRECISIONE", type="primary", use_container_width=True):
try:
m_pkg = joblib.load(MODEL_DIR / selected_model)
delim = cfg.get('paths', {}).get('csv_delimiter', ';')
df_test = pd.read_csv(TEST_SAMPLES_DIR / selected_test, sep=delim)
row = df_test.iloc[0]
z_real, x_real, y_real = int(round(float(row['z']))), float(row['x']), float(row['y'])
gws = m_pkg['gateways_order']
fill = m_pkg.get('nan_fill', -110.0)
X_in = np.array([[float(row.get(gw, fill)) for gw in gws]])
z_pred = int(m_pkg['floor_clf'].predict(X_in)[0])
x_pred, y_pred = -1.0, -1.0
if z_pred in m_pkg['xy_by_floor']:
xy = m_pkg['xy_by_floor'][z_pred].predict(X_in)[0]
x_pred, y_pred = float(xy[0]), float(xy[1])

z_err, dist_err = calculate_error(z_real, x_real, y_real, z_pred, x_pred, y_pred)
st.session_state.test_results = {
"z_real": z_real, "x_real": x_real, "y_real": y_real,
"z_pred": z_pred, "x_pred": x_pred, "y_pred": y_pred,
"z_err": z_err, "dist_err": dist_err,
"model_used": selected_model
}
except Exception as e:
st.error(f"Errore: {e}")

if st.session_state.test_results:
res = st.session_state.test_results
# --- RIPRISTINO INFORMAZIONI COORDINATE ---
c_info1, c_info2 = st.columns(2)
with c_info1:
st.info(f"📍 **Test Reale** | Piano: {res['z_real']} | X: **{res['x_real']}** | Y: **{res['y_real']}**")
with c_info2:
st.success(f"🔮 **Predizione** | Piano: {res['z_pred']} | X: **{round(res['x_pred'],1)}** | Y: **{round(res['y_pred'],1)}**")

# --- LEGENDA AGGIORNATA CON NUOVI COLORI ---
st.markdown(f"""
<div style="background-color: #f8f9fa; padding: 12px; border-radius: 8px; border-left: 5px solid #00bcd4; margin: 10px 0;">
<h5 style="margin:0 0 8px 0;">📍 Legenda Mappa</h5>
<span style="color: #00bcd4; font-weight: bold;">● PUNTO DI TEST:</span> Posizione reale del rilievo.<br>
<span style="color: #ff9800; font-weight: bold;">● PUNTO PREDETTO:</span> Posizione calcolata dal modello AI.<br>
<span style="color: #ffeb3b; font-weight: bold;">--- LINEA GIALLA:</span> Scostamento di <b>{round(res['dist_err'], 2)} px</b>.
</div>
""", unsafe_allow_html=True)

img_filename = f"floor_{res['z_pred']}.png"
meta_filename = f"meta_{res['z_pred']}.json"
img_p = MAPS_DIR / img_filename
meta_p = MAPS_DIR / meta_filename

if img_p.exists() and meta_p.exists():
with open(meta_p, "r") as f: meta = json.load(f)
img_data, w, h = get_image_base64(img_p)
bounds = [[0, 0], [h, w]]
m = folium.Map(location=[h/2, w/2], crs="Simple", tiles=None, zoom_start=0, attribution_control=False)
m.fit_bounds(bounds)
m.options.update({"minZoom": -5, "maxZoom": 5, "maxBounds": bounds, "zoomSnap": 0.25})
folium.raster_layers.ImageOverlay(image=img_data, bounds=bounds).add_to(m)

if meta.get("calibrated"):
def to_px(mx, my):
px = (mx * meta["pixel_ratio"]) + meta["origin"][0]
py = meta["origin"][1] - (my * meta["pixel_ratio"])
return [py, px]

p_real = to_px(res['x_real'], res['y_real'])
p_pred = to_px(res['x_pred'], res['y_pred'])

# 🔵 PUNTO DI TEST (Celeste)
folium.CircleMarker(
location=p_real, radius=11, color="#00838f", fill=True,
fill_color="#00bcd4", fill_opacity=0.85,
tooltip="PUNTO DI TEST (REALE)"
).add_to(m)
# 🟠 PUNTO PREDETTO (Arancio)
if res['x_pred'] != -1.0:
folium.CircleMarker(
location=p_pred, radius=11, color="#e65100", fill=True,
fill_color="#ff9800", fill_opacity=0.85,
tooltip=f"PREDIZIONE (Modello: {res['model_used']})"
).add_to(m)
# Linea Errore
folium.PolyLine(
locations=[p_real, p_pred], color="#ffeb3b",
weight=4, opacity=0.7, dash_array='8'
).add_to(m)

st_folium(m, height=700, width=None, key=f"test_map_final", use_container_width=True)

+ 126
- 56
app/web_training_data.py Zobrazit soubor

@@ -1,72 +1,142 @@
import streamlit as st
import os
import pandas as pd
from pathlib import Path
import os
import json
import shutil
import time
from datetime import datetime
import joblib
from pathlib import Path

def get_campaigns_info(directory: Path):
"""Raggruppa i file per prefisso campagna."""
if not directory.exists(): return {}
files = list(directory.glob("*.csv"))
campaigns = {}
for f in files:
parts = f.name.split('_')
if len(parts) >= 4:
camp_id = parts[0]
campaigns.setdefault(camp_id, []).append(str(f))
return campaigns

def show_training_data_manager(cfg):
st.subheader("📂 Gestione Campioni Training")
st.subheader("🧠 Console Gestione Modelli e Rilievi")
try:
raw_path = cfg.get('collect_train', {}).get('samples_dir', '/data/train/samples')
samples_dir = Path(raw_path)
except Exception as e:
st.error(f"Errore config: {e}")
return
MODEL_DIR = Path("/data/model")
JOBS_DIR = Path("/data/train/train_jobs")
MODEL_DIR.mkdir(parents=True, exist_ok=True)
JOBS_DIR.mkdir(parents=True, exist_ok=True)

# --- 1. RECUPERO E FILTRO DATI ---
all_files = [f for f in os.listdir(samples_dir) if f.endswith('.csv')]
files_data = []
# --- 1. GESTIONE MODELLI E LINK SIMBOLICO ---
st.write("### 🎯 Modelli Generati ed Attivazione")
for file in all_files:
path = samples_dir / file
ts = os.path.getmtime(path)
files_data.append({
"File": file,
"Data": datetime.fromtimestamp(ts).strftime("%Y-%m-%d %H:%M"),
"ts": ts
})
available_models = sorted(
[m for m in MODEL_DIR.glob("model_camp_*.joblib")],
key=os.path.getmtime,
reverse=True
)

df = pd.DataFrame(files_data).sort_values("ts", ascending=False)
if available_models:
# Visualizzazione stato attuale link simbolico
target_path = MODEL_DIR / "model.joblib"
if target_path.is_symlink():
try:
current_link = os.readlink(target_path)
st.info(f"🔗 **Modello operativo attuale:** `{os.path.basename(current_link)}`")
except Exception:
st.warning("⚠️ Impossibile leggere il link simbolico.")
# Tabella modelli esistenti
m_list = []
for m in available_models:
m_list.append({
"Nome Modello": m.name,
"Data": time.strftime('%d/%m/%Y %H:%M', time.localtime(m.stat().st_mtime)),
"Size": f"{round(m.stat().st_size / 1024, 1)} KB"
})
st.dataframe(pd.DataFrame(m_list), use_container_width=True, hide_index=True)

# Barra di ricerca
search = st.text_input("🔍 Cerca coordinata:", "").strip().lower()
if search:
df = df[df['File'].str.lower().str.contains(search)]
selected_model = st.selectbox("Scegli il modello da analizzare o attivare:", [m.name for m in available_models])
# --- NUOVA SEZIONE: ANALISI TECNICA ---
with st.expander("🔍 Ispezione Metadati Modello", expanded=False):
try:
m_data = joblib.load(MODEL_DIR / selected_model)
st.write(f"**Data Creazione:** {m_data.get('created_at', 'N/D')}")
st.write(f"**Gateway allenati:** {len(m_data.get('gateways_order', []))}")
st.code(", ".join(m_data.get('gateways_order', [])))
floors = list(m_data.get('xy_by_floor', {}).keys())
st.write(f"**Piani mappati nel regressore:** {floors}")
if not floors or len(m_data.get('gateways_order', [])) == 0:
st.error("⚠️ Attenzione: Il modello sembra non contenere dati validi.")
except Exception as e:
st.error(f"Errore caricamento per analisi: {e}")

# --- 2. VISUALIZZAZIONE COMPATTA (SENZA TREMOLIO) ---
# Usiamo le colonne per restringere la tabella al centro
col_tab, col_empty = st.columns([3, 1])
with col_tab:
# st.table non ha scrollbar e non ha interazioni JS che causano tremolio
st.table(df[["File", "Data"]].head(20))
if st.button("🔗 IMPOSTA COME OPERATIVO (Symlink)", type="primary", use_container_width=True):
try:
if target_path.exists() or target_path.is_symlink():
target_path.unlink()
current_dir = os.getcwd()
os.chdir(str(MODEL_DIR))
os.symlink(selected_model, "model.joblib")
os.chdir(current_dir)
st.success(f"Link aggiornato con successo a {selected_model}")
time.sleep(1)
st.rerun()
except Exception as e:
st.error(f"Errore: {e}")
else:
st.info("Nessun modello disponibile.")

st.divider()

# --- 3. AZIONI ---
st.markdown("### 🛠️ Azioni")
selected = st.selectbox("Seleziona file per operare:", df["File"].tolist())
# --- 2. ISPEZIONE RILIEVI E NUOVO ADDESTRAMENTO ---
st.write("### 🚀 Analisi Dati e Nuovo Addestramento")
if selected:
file_path = samples_dir / selected
c1, c2, c3 = st.columns([1,1,1])
with c1:
if st.button("👁️ Dettagli", use_container_width=True):
content = pd.read_csv(file_path, sep=";")
st.markdown(f"**Dati di `{selected}`**")
st.table(content.T.reset_index().rename(columns={'index': 'AP', 0: 'RSSI'}))
with c2:
with open(file_path, "rb") as f:
st.download_button("📥 Scarica", f, file_name=selected, use_container_width=True)
with c3:
if st.button("🗑️ Elimina", use_container_width=True, type="primary"):
os.remove(file_path)
st.rerun()
train_cfg = cfg.get("train", {})
samples_dir = Path(train_cfg.get("samples_dir", "/data/train/samples"))
campaigns_map = get_campaigns_info(samples_dir)
if not campaigns_map:
st.info("Nessun dato di rilievo trovato."); return

camp_list = sorted(campaigns_map.keys())
selected_camp = st.radio("Seleziona Campagna:", camp_list, horizontal=True)

current_files = campaigns_map[selected_camp]
files_df = pd.DataFrame([
{"File": os.path.basename(f), "Size": f"{round(os.path.getsize(f)/1024, 1)} KB", "Path": f}
for f in current_files
]).sort_values("File")
st.dataframe(files_df[["File", "Size"]], use_container_width=True, hide_index=True)

sel_file = st.selectbox("Ispeziona contenuto file CSV:", ["-- seleziona --"] + files_df["File"].tolist())
if sel_file != "-- seleziona --":
f_path = files_df[files_df["File"] == sel_file]["Path"].iloc[0]
try:
delim = cfg.get('paths', {}).get('csv_delimiter', ';')
st.dataframe(pd.read_csv(f_path, sep=delim), use_container_width=True)
except Exception as e:
st.error(f"Errore lettura: {e}")

# Stats discrete in sidebar
st.sidebar.caption(f"Totale campioni: {len(all_files)}")
# Bottone di Addestramento
pending_jobs = list(JOBS_DIR.glob("*.lock"))
if pending_jobs:
st.warning(f"⏳ Addestramento in corso: {pending_jobs[0].name}")
else:
if st.button(f"🏋️ AVVIA ADDESTRAMENTO CAMPAGNA {selected_camp}", type="primary", use_container_width=True):
job_data = {
"campaign": selected_camp,
"knn": train_cfg.get("knn", {}),
"nan_fill": train_cfg.get("nan_fill", -110),
"gateways_csv": train_cfg.get("gateways_csv", "/data/config/gateway.csv"),
"timestamp": time.time()
}
with open(JOBS_DIR / f"train_{selected_camp}.lock", "w") as f:
json.dump(job_data, f)
st.success("Richiesta inviata al Core.")
time.sleep(1)
st.rerun()

+ 3
- 2
config/config.yaml Zobrazit soubor

@@ -60,7 +60,7 @@ infer:
refresh_seconds: 10
rssi_max: -25
rssi_min: -110
window_seconds: 5
window_seconds: 7
xy_round: 0
maps:
default_dot_size: 20
@@ -74,7 +74,7 @@ ml:
method: knn
metric: euclidean
weights: distance
mode: collect_train
mode: all
mqtt:
ca_file: ''
client_id: ble-ai-localizer
@@ -93,6 +93,7 @@ paths:
csv_delimiter: ;
dataset: /data/fingerprint.parquet
gateways_csv: /data/config/gateway.csv
mqtt_raw_dir: /data/mqtt_raw/
train:
backup_existing_model: true
gateways_csv: /data/config/gateway.csv


+ 113
- 0
config/config.yaml_v1 Zobrazit soubor

@@ -0,0 +1,113 @@
api:
audience: Fastapi
client_id: Fastapi
get_beacons_url: https://10.251.0.30:5050/reslevis/getTrackers
get_gateways_url: https://10.251.0.30:5050/reslevis/getGateways
refresh_seconds: 30
timeout_s: 10.0
token_url: https://10.251.0.30:10002/realms/API.Server.local/protocol/openid-connect/token
verify_tls: false
collect_train:
aggregate: median
gateway_ready_check_before_job: true
gateway_ready_log_seconds: 10
gateway_ready_max_age_seconds: 30
iqr_k: 1.5
job_glob: '*.csv'
jobs_dir: /data/train/jobs
mad_z: 3.5
max_stddev: 8
min_non_nan: 3
min_samples_per_gateway: 5
outlier_method: mad
poll_seconds: 2
rssi_decimals: 3
rssi_max: -25
rssi_min: -110
samples_dir: /data/train/samples
window_seconds: 30
debug:
collect_train_log_every_seconds: 10
collect_train_log_first_seen: true
collect_train_log_samples: true
csv: true
dump_beacons_api: true
dump_gateways_api: true
enabled: true
log_each_mqtt_message: false
log_inference_detail: true
log_mqtt_raw: false
monitor_online: true
offline_after_seconds_beacons: 240
offline_after_seconds_gateways: 90
online_check_seconds: 30
show_library_warnings: false
target_mac: ''
timezone: Europe/Rome
train_stats_top_k: 8
train_verbose: true
infer:
aggregate: median
gateways_csv: /data/config/gateway.csv
include_mac: true
mad_z: 3.5
model_path: /data/model/model.joblib
nan_fill: -110
out_file: infer.csv
outlier_method: mad
output_dir: /data/infer
output_format: csv
refresh_seconds: 10
rssi_max: -25
rssi_min: -110
window_seconds: 5
xy_round: 0
maps:
default_dot_size: 20
default_grid_size: 100
floor_prefix: floor_
map_dir: /data/maps
meta_prefix: meta_
show_grid_default: true
ml:
k: 5
method: knn
metric: euclidean
weights: distance
mode: infer
mqtt:
ca_file: ''
client_id: ble-ai-localizer
host: 192.168.1.101
keepalive: 60
password: ''
port: 1883
protocol: mqttv311
qos: 0
tls: false
topic: publish_out/#
username: ''
verify_tls: false
paths:
beacons_csv: /data/config/beacons.csv
csv_delimiter: ;
dataset: /data/fingerprint.parquet
gateways_csv: /data/config/gateway.csv
train:
backup_existing_model: true
gateways_csv: /data/config/gateway.csv
knn:
cv:
enabled: false
folds: 5
k_max: 15
k_min: 3
k: 5
metric: euclidean
weights: distance
model_path: /data/model/model.joblib
nan_fill: -110
sample_glob: '*.csv'
samples_dir: /data/train/samples
ui:
font_path: /app/DejaVuSans-Bold.ttf

+ 68
- 0
config/config.yaml_v2 Zobrazit soubor

@@ -0,0 +1,68 @@
api:
audience: Fastapi
client_id: Fastapi
get_beacons_url: https://10.251.0.30:5050/reslevis/getTrackers
get_gateways_url: https://10.251.0.30:5050/reslevis/getGateways
refresh_seconds: 30
timeout_s: 10.0
token_url: https://10.251.0.30:10002/realms/API.Server.local/protocol/openid-connect/token
verify_tls: false
collect_train:
aggregate: median
gateway_ready_check_before_job: true
gateway_ready_log_seconds: 10
gateway_ready_max_age_seconds: 30
iqr_k: 1.5
job_glob: '*.csv'
jobs_dir: /data/train/jobs
mad_z: 3.5
max_stddev: 8
min_non_nan: 3
min_samples_per_gateway: 5
outlier_method: mad
poll_seconds: 2
rssi_decimals: 3
rssi_max: -25
rssi_min: -110
samples_dir: /data/train/samples
window_seconds: 30
debug:
collect_train_log_every_seconds: 10
collect_train_log_first_seen: true
infer:
aggregate: median
gateways_csv: /data/config/gateway.csv
include_mac: true
mad_z: 3.5
model_path: /data/model/model.joblib
nan_fill: -110
out_file: infer.csv
outlier_method: mad
output_dir: /data/infer
output_format: csv
refresh_seconds: 10
rssi_max: -25
rssi_min: -110
window_seconds: 5
xy_round: 0
maps:
default_dot_size: 20
default_grid_size: 100
floor_prefix: floor_
map_dir: /data/maps
meta_prefix: meta_
show_grid_default: true
ml:
k: 5
method: knn
metric: euclidean
weights: distance
mode: all
mqtt:
ca_file: ''
client_id: ble-ai-localizer
host: 192.168.1.101
keepalive: 60
password: ''
port: 1883
protocol: mqtt

+ 114
- 0
config/config.yaml_v3 Zobrazit soubor

@@ -0,0 +1,114 @@
api:
audience: Fastapi
client_id: Fastapi
get_beacons_url: https://10.251.0.30:5050/reslevis/getTrackers
get_gateways_url: https://10.251.0.30:5050/reslevis/getGateways
refresh_seconds: 30
timeout_s: 10.0
token_url: https://10.251.0.30:10002/realms/API.Server.local/protocol/openid-connect/token
verify_tls: false
collect_train:
aggregate: median
gateway_ready_check_before_job: true
gateway_ready_log_seconds: 10
gateway_ready_max_age_seconds: 30
iqr_k: 1.5
job_glob: '*.csv'
jobs_dir: /data/train/jobs
mad_z: 3.5
max_stddev: 8
min_non_nan: 3
min_samples_per_gateway: 5
outlier_method: mad
poll_seconds: 2
rssi_decimals: 3
rssi_max: -25
rssi_min: -110
samples_dir: /data/train/samples
window_seconds: 30
debug:
collect_train_log_every_seconds: 10
collect_train_log_first_seen: true
collect_train_log_samples: true
csv: true
dump_beacons_api: true
dump_gateways_api: true
enabled: true
log_each_mqtt_message: false
log_inference_detail: true
log_mqtt_raw: false
monitor_online: true
offline_after_seconds_beacons: 240
offline_after_seconds_gateways: 90
online_check_seconds: 30
show_library_warnings: false
target_mac: ''
timezone: Europe/Rome
train_stats_top_k: 8
train_verbose: true
infer:
aggregate: median
gateways_csv: /data/config/gateway.csv
include_mac: true
mad_z: 3.5
model_path: /data/model/model.joblib
nan_fill: -110
out_file: infer.csv
outlier_method: mad
output_dir: /data/infer
output_format: csv
refresh_seconds: 10
rssi_max: -25
rssi_min: -110
window_seconds: 5
xy_round: 0
maps:
default_dot_size: 20
default_grid_size: 100
floor_prefix: floor_
map_dir: /data/maps
meta_prefix: meta_
show_grid_default: true
ml:
k: 5
method: knn
metric: euclidean
weights: distance
mode: all
mqtt:
ca_file: ''
client_id: ble-ai-localizer
host: 192.168.1.101
keepalive: 60
password: ''
port: 1883
protocol: mqttv311
qos: 0
tls: false
topic: publish_out/#
username: ''
verify_tls: false
paths:
beacons_csv: /data/config/beacons.csv
csv_delimiter: ;
dataset: /data/fingerprint.parquet
gateways_csv: /data/config/gateway.csv
mqtt_raw_dir: /data/mqtt_raw/
train:
backup_existing_model: true
gateways_csv: /data/config/gateway.csv
knn:
cv:
enabled: false
folds: 5
k_max: 15
k_min: 3
k: 5
metric: euclidean
weights: distance
model_path: /data/model/model.joblib
nan_fill: -110
sample_glob: '*.csv'
samples_dir: /data/train/samples
ui:
font_path: /app/DejaVuSans-Bold.ttf

+ 0
- 1
data/.web_state Zobrazit soubor

@@ -1 +0,0 @@
running

+ 2
- 0
data/config/beacongroup.csv Zobrazit soubor

@@ -0,0 +1,2 @@
BeaconGroupName;GroupMAC
GBC-00;C3:00:00:57:B9:E6,C3:00:00:57:B9:D4,C3:00:00:57:B9:E8,C3:00:00:57:B9:F1

+ 6
- 5
data/config/beacons.csv Zobrazit soubor

@@ -1,6 +1,7 @@
BeaconName;MAC
BC-21;C3:00:00:57:B9:E6
BC-22;C3:00:00:57:B9:D4
BC-23;C3:00:00:57:B9:E8
BC-24;C3:00:00:57:B9:F1
BC-25;C3:00:00:57:B9:E7
BC-00-21;C3:00:00:57:B9:E6
BC-04-22;C3:00:00:57:B9:D4
BC-08-23;C3:00:00:57:B9:E8
BC-12-24;C3:00:00:57:B9:F1
BC-00-25;C3:00:00:57:B9:E7
BC-04-26;C3:00:00:57:B9:E9

+ 9
- 9
data/infer/infer.csv Zobrazit soubor

@@ -1,13 +1,13 @@
mac;z;x;y
C8:3F:8F:17:DB:35;1;1058;1294
C8:3F:8F:17:DB:35;-1;-1;-1
C3:00:00:39:47:DF;-1;-1;-1
C3:00:00:39:47:C4;1;1304;1478
C3:00:00:39:47:C4;-1;1917;650
C3:00:00:39:47:E2;-1;-1;-1
C7:AE:56:1E:38:B7;1;1323;1499
C7:AE:56:1E:38:B7;-1;1917;650
E0:1F:9A:7A:47:D2;-1;-1;-1
C3:00:00:57:B9:D9;1;1058;1382
C3:00:00:57:B9:DB;1;1060;1293
C3:00:00:57:B9:F4;1;1059;1296
C3:00:00:57:B9:DC;1;1060;1291
C3:00:00:57:B9:DD;1;1203;1452
C3:00:00:57:B9:DF;1;1061;1294
C3:00:00:57:B9:D9;-1;1917;650
C3:00:00:57:B9:DB;-1;1917;650
C3:00:00:57:B9:F4;-1;1917;650
C3:00:00:57:B9:DC;-1;1917;650
C3:00:00:57:B9:DD;-1;1917;650
C3:00:00:57:B9:DF;-1;1917;650

binární
data/maps.bck/floor_0.png Zobrazit soubor

Před Za
Šířka: 8337  |  Výška: 4803  |  Velikost: 528 KiB

binární
data/maps.bck/floor_1.png Zobrazit soubor

Před Za
Šířka: 8238  |  Výška: 4672  |  Velikost: 556 KiB

+ 0
- 1
data/maps.bck/meta_0.json Zobrazit soubor

@@ -1 +0,0 @@
{"pixel_ratio": 1.5843674344166205, "calibrated": true, "origin": [1296, 3744], "grid_size": 50, "show_grid": true}

+ 0
- 1
data/maps.bck/meta_1.json Zobrazit soubor

@@ -1 +0,0 @@
{"pixel_ratio": 1.5919341046277666, "calibrated": true, "origin": [1251, 1143], "grid_size": 50}

binární
data/maps.old/floor_0.png Zobrazit soubor

Před Za
Šířka: 8337  |  Výška: 4803  |  Velikost: 528 KiB

binární
data/maps.old/floor_1.png Zobrazit soubor

Před Za
Šířka: 8238  |  Výška: 4672  |  Velikost: 556 KiB

+ 0
- 9
data/maps.old/meta_0.json Zobrazit soubor

@@ -1,9 +0,0 @@
{
"pixel_ratio": 1.584476207254857,
"calibrated": true,
"origin": [
1248,
3790
],
"grid_size": 50
}

+ 0
- 1
data/maps.old/meta_1.json Zobrazit soubor

@@ -1 +0,0 @@
{"pixel_ratio": 1.5924732396126005, "calibrated": true, "origin": [1297, 3586], "grid_size": 50}

binární
data/model/model.joblib Zobrazit soubor


+ 1
- 0
data/model/model.joblib Zobrazit soubor

@@ -0,0 +1 @@
model_camp_00_20260209_004706.joblib

binární
data/model/model_1770027181.joblib Zobrazit soubor


binární
data/model/model_1770027851.joblib Zobrazit soubor


binární
data/model/model_1770047673.joblib Zobrazit soubor


binární
data/model/model_1770051207.joblib Zobrazit soubor


binární
data/model/model_1770167688.joblib Zobrazit soubor


binární
data/model/model_1770167694.joblib Zobrazit soubor


binární
data/model/model_1770196914.joblib Zobrazit soubor


binární
data/model/model_1770196917.joblib Zobrazit soubor


binární
data/model/model_1770207345.joblib Zobrazit soubor


binární
data/model/model_1770207346.joblib Zobrazit soubor


binární
data/model/model_1770207359.joblib Zobrazit soubor


binární
data/model/model_1770207362.joblib Zobrazit soubor


binární
data/model/model_1770224119.joblib Zobrazit soubor


binární
data/model/model_1770302194.joblib Zobrazit soubor


binární
data/model/model_1770302198.joblib Zobrazit soubor


binární
data/model/model_1770302200.joblib Zobrazit soubor


binární
data/model/model_1770302354.joblib Zobrazit soubor


binární
data/model/model_1770302511.joblib Zobrazit soubor


binární
data/model/model_camp_00_20260209_004706.joblib Zobrazit soubor


binární
data/model/model_camp_04_20260209_004711.joblib Zobrazit soubor


binární
data/model/model_camp_08_20260209_004726.joblib Zobrazit soubor


binární
data/model/model_camp_12_20260209_004751.joblib Zobrazit soubor


+ 0
- 0
data/mqtt_raw/mqtt_raw_20260209_021743.log Zobrazit soubor


+ 0
- 0
data/mqtt_raw/mqtt_raw_20260209_023024.log Zobrazit soubor


+ 313
- 0
data/mqtt_raw/mqtt_raw_20260209_023636.log Zobrazit soubor

@@ -0,0 +1,313 @@
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:36.583Z","type":"Gateway","mac":"AC233FC1DD49","nums":1},{"timestamp":"2026-02-09T00:36:36.944Z","mac":"C300003947C4","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2A100002C32FFD152F8478"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:36.561Z","type":"Gateway","mac":"AC233FC1DD40","nums":2},{"timestamp":"2026-02-09T00:36:36.649Z","mac":"C3000057B9F5","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1D707BA77D0"},{"timestamp":"2026-02-09T00:36:37.048Z","mac":"C3000057B9DC","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC260776BB62"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:36.654Z","type":"Gateway","mac":"AC233FC1DD51","nums":5},{"timestamp":"2026-02-09T00:36:36.849Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A0D03095336"},{"timestamp":"2026-02-09T00:36:36.865Z","mac":"C3000057B9F4","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2A100002089BA307BE4374"},{"timestamp":"2026-02-09T00:36:37.090Z","mac":"C3000057B9DB","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2410000204664807B0D432"},{"timestamp":"2026-02-09T00:36:37.154Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:37.459Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:36.747Z","type":"Gateway","mac":"AC233FC1DD3C","nums":6},{"timestamp":"2026-02-09T00:36:36.944Z","mac":"C300003947C4","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2A100002C32FFD152F8478"},{"timestamp":"2026-02-09T00:36:36.983Z","mac":"C3000057B9D4","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C540F0002000BA206BB32CA"},{"timestamp":"2026-02-09T00:36:37.370Z","mac":"E017085443A7","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:37.391Z","mac":"C3000057B9E8","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F406F29E22"},{"timestamp":"2026-02-09T00:36:37.463Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:37.667Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:36.740Z","type":"Gateway","mac":"AC233FC1DD50","nums":1},{"timestamp":"2026-02-09T00:36:37.561Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:36.888Z","type":"Gateway","mac":"AC233FC1DD48","nums":2},{"timestamp":"2026-02-09T00:36:37.507Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:37.587Z","mac":"C3000057B9D9","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFEC075D668A"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:36.951Z","type":"Gateway","mac":"AC233FC1DD4B","nums":5},{"timestamp":"2026-02-09T00:36:37.286Z","mac":"C3000057B9DF","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C330B0001F989520794445C"},{"timestamp":"2026-02-09T00:36:37.597Z","mac":"C3000057B9D9","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFEC075D668A"},{"timestamp":"2026-02-09T00:36:37.850Z","mac":"C3000057B9E6","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C3F100001EDC4A606F4FFDC"},{"timestamp":"2026-02-09T00:36:37.870Z","mac":"C3000057B9F4","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2A100002089BA407BE437E"},{"timestamp":"2026-02-09T00:36:37.883Z","mac":"C300003946AC","rssi":-78,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:36.871Z","type":"Gateway","mac":"AC233FC1DD55","nums":8},{"timestamp":"2026-02-09T00:36:36.945Z","mac":"C300003947C4","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C2A100002C32FFD152F8478"},{"timestamp":"2026-02-09T00:36:36.983Z","mac":"C3000057B9D4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C540F0002000BA206BB32CA"},{"timestamp":"2026-02-09T00:36:37.005Z","mac":"D54E908B7972","rssi":-82,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:37.271Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:37.370Z","mac":"E017085443A7","rssi":-82,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:37.391Z","mac":"C3000057B9E8","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F406F29E22"},{"timestamp":"2026-02-09T00:36:37.736Z","mac":"F045AEE31DB4","rssi":-77,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:37.855Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:37.063Z","type":"Gateway","mac":"AC233FC1DD4E","nums":13},{"timestamp":"2026-02-09T00:36:37.283Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:37.285Z","mac":"C3000057B9DF","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C330B0001F989520794445C"},{"timestamp":"2026-02-09T00:36:37.298Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:37.596Z","mac":"C3000057B9D9","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFEC075D668A"},{"timestamp":"2026-02-09T00:36:37.599Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:37.605Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:37.667Z","mac":"C3000057B9F5","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1D807BA77DA"},{"timestamp":"2026-02-09T00:36:37.736Z","mac":"F045AEE31DB4","rssi":-74,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:37.767Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:37.869Z","mac":"C3000057B9F4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2A100002089BA407BE437E"},{"timestamp":"2026-02-09T00:36:37.882Z","mac":"C300003946AC","rssi":-79,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:37.912Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:37.922Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:37.060Z","type":"Gateway","mac":"AC233FC1DCCD","nums":8},{"timestamp":"2026-02-09T00:36:37.090Z","mac":"C3000057B9DB","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2410000204664807B0D432"},{"timestamp":"2026-02-09T00:36:37.152Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:37.160Z","mac":"C3000057B9F1","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CBFE06E55A32"},{"timestamp":"2026-02-09T00:36:37.456Z","mac":"C7AE561E38B7","rssi":-86,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:37.732Z","mac":"F045AEE31DB4","rssi":-76,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:37.764Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:38.004Z","mac":"D54E908B7972","rssi":-80,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:38.050Z","mac":"C3000057B9DC","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC270776BB6C"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:37.256Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:37.259Z","type":"Gateway","mac":"AC233FC1DCD1","nums":10},{"timestamp":"2026-02-09T00:36:37.552Z","mac":"C300003946B1","rssi":-63,"rawData":"0201061AFF4C000215E2C56DB5DFFB48D2B060D0F5A71096E000000000EC"},{"timestamp":"2026-02-09T00:36:37.848Z","mac":"C3000057B9E6","rssi":-53,"rawData":"0201060303AAFE1116AAFE20000C3F100001EDC4A606F4FFDC"},{"timestamp":"2026-02-09T00:36:37.866Z","mac":"C3000057B9F4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C2A100002089BA407BE437E"},{"timestamp":"2026-02-09T00:36:37.879Z","mac":"C300003946AC","rssi":-58,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:37.990Z","mac":"C3000057B9D4","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C540F0002000BA306BB32D4"},{"timestamp":"2026-02-09T00:36:38.002Z","mac":"D54E908B7972","rssi":-58,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:38.050Z","mac":"C3000057B9DC","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC270776BB6C"},{"timestamp":"2026-02-09T00:36:38.068Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A0F03095336"},{"timestamp":"2026-02-09T00:36:38.096Z","mac":"C3000057B9DB","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2410000204664907B0D43C"},{"timestamp":"2026-02-09T00:36:38.175Z","mac":"C3000057B9F1","rssi":-48,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CBFF06E55A3C"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:37.383Z","type":"Gateway","mac":"AC233FC1DCEE","nums":3},{"timestamp":"2026-02-09T00:36:37.948Z","mac":"C300003947C4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2A100002C32FFE152F8482"},{"timestamp":"2026-02-09T00:36:37.992Z","mac":"C3000057B9D4","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C540F0002000BA306BB32D4"},{"timestamp":"2026-02-09T00:36:38.359Z","mac":"C3000057B9E7","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40C0710B484"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:37.385Z","type":"Gateway","mac":"AC233FC1DD31","nums":4},{"timestamp":"2026-02-09T00:36:37.597Z","mac":"C3000057B9D9","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFEC075D668A"},{"timestamp":"2026-02-09T00:36:37.850Z","mac":"C3000057B9E6","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C3F100001EDC4A606F4FFDC"},{"timestamp":"2026-02-09T00:36:37.869Z","mac":"C3000057B9F4","rssi":-47,"rawData":"0201060303AAFE1116AAFE20000C2A100002089BA407BE437E"},{"timestamp":"2026-02-09T00:36:38.177Z","mac":"C3000057B9F1","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CBFF06E55A3C"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:37.543Z","type":"Gateway","mac":"AC233FC1DD49","nums":0}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:37.551Z","type":"Gateway","mac":"AC233FC1DD40","nums":1},{"timestamp":"2026-02-09T00:36:37.861Z","mac":"C3000057B9F4","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2A100002089BA407BE437E"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:37.506Z","type":"Gateway","mac":"AC233FC1DCCB","nums":6},{"timestamp":"2026-02-09T00:36:37.596Z","mac":"C3000057B9D9","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFEC075D668A"},{"timestamp":"2026-02-09T00:36:37.666Z","mac":"C3000057B9F5","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1D807BA77DA"},{"timestamp":"2026-02-09T00:36:37.868Z","mac":"C3000057B9F4","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C2A100002089BA407BE437E"},{"timestamp":"2026-02-09T00:36:37.882Z","mac":"C300003946AC","rssi":-73,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:37.951Z","mac":"C300003947C4","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C2A100002C32FFE152F8482"},{"timestamp":"2026-02-09T00:36:38.176Z","mac":"C3000057B9F1","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CBFF06E55A3C"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:37.525Z","type":"Gateway","mac":"AC233FC1DCD2","nums":22},{"timestamp":"2026-02-09T00:36:37.554Z","mac":"C300003946B1","rssi":-79,"rawData":"0201061AFF4C000215E2C56DB5DFFB48D2B060D0F5A71096E000000000EC"},{"timestamp":"2026-02-09T00:36:37.596Z","mac":"C3000057B9D9","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFEC075D668A"},{"timestamp":"2026-02-09T00:36:37.654Z","mac":"D920A4A6D237","rssi":-66,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:37.667Z","mac":"C3000057B9F5","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1D807BA77DA"},{"timestamp":"2026-02-09T00:36:37.855Z","mac":"E43883D93326","rssi":-85,"rawData":"1106B93D2E1D72D12592F94FD44ACDC5392109162A25E43883D93324"},{"timestamp":"2026-02-09T00:36:37.869Z","mac":"C3000057B9F4","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2A100002089BA407BE437E"},{"timestamp":"2026-02-09T00:36:37.882Z","mac":"C300003946AC","rssi":-57,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:37.952Z","mac":"C300003947C4","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C2A100002C32FFE152F8482"},{"timestamp":"2026-02-09T00:36:37.995Z","mac":"C3000057B9D4","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C540F0002000BA306BB32D4"},{"timestamp":"2026-02-09T00:36:38.007Z","mac":"D54E908B7972","rssi":-74,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:38.052Z","mac":"C3000057B9DC","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC270776BB6C"},{"timestamp":"2026-02-09T00:36:38.070Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A0F03095336"},{"timestamp":"2026-02-09T00:36:38.099Z","mac":"C3000057B9DB","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2410000204664907B0D43C"},{"timestamp":"2026-02-09T00:36:38.140Z","mac":"A0D05BD2E2E5","rssi":-80,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:38.177Z","mac":"C3000057B9F1","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CBFF06E55A3C"},{"timestamp":"2026-02-09T00:36:38.297Z","mac":"C3000057B9DF","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C330B0001F9895307944466"},{"timestamp":"2026-02-09T00:36:38.362Z","mac":"C3000057B9E7","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40C0710B484"},{"timestamp":"2026-02-09T00:36:38.364Z","mac":"E017085443A7","rssi":-46,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:38.375Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A0F03095336"},{"timestamp":"2026-02-09T00:36:38.390Z","mac":"C3000057B9E8","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F506F29E2C"},{"timestamp":"2026-02-09T00:36:38.410Z","mac":"C3000057B9DD","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C81F07922122"},{"timestamp":"2026-02-09T00:36:38.439Z","mac":"A0D05BD2E2E5","rssi":-80,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:37.664Z","type":"Gateway","mac":"AC233FC1DD51","nums":6},{"timestamp":"2026-02-09T00:36:37.735Z","mac":"F045AEE31DB4","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:37.767Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:38.053Z","mac":"C3000057B9DC","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC270776BB6C"},{"timestamp":"2026-02-09T00:36:38.071Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A0F03095336"},{"timestamp":"2026-02-09T00:36:38.099Z","mac":"C3000057B9DB","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C2410000204664907B0D43C"},{"timestamp":"2026-02-09T00:36:38.375Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A0F03095336"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:37.766Z","type":"Gateway","mac":"AC233FC1DD3C","nums":5},{"timestamp":"2026-02-09T00:36:38.390Z","mac":"C3000057B9E8","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F506F29E2C"},{"timestamp":"2026-02-09T00:36:38.432Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:38.633Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:38.656Z","mac":"D920A4A6D237","rssi":-83,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:38.739Z","mac":"F045AEE31DB4","rssi":-73,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:37.760Z","type":"Gateway","mac":"AC233FC1DD50","nums":1},{"timestamp":"2026-02-09T00:36:38.486Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:37.862Z","type":"Gateway","mac":"AC233FC1DD55","nums":4},{"timestamp":"2026-02-09T00:36:37.869Z","mac":"C3000057B9F4","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C2A100002089BA407BE437E"},{"timestamp":"2026-02-09T00:36:38.177Z","mac":"C3000057B9F1","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CBFF06E55A3C"},{"timestamp":"2026-02-09T00:36:38.831Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:38.848Z","mac":"C3000057B9E6","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C3F100001EDC4A706F4FFE6"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:37.888Z","type":"Gateway","mac":"AC233FC1DD4B","nums":0}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:37.890Z","type":"Gateway","mac":"AC233FC1DD48","nums":4},{"timestamp":"2026-02-09T00:36:38.401Z","mac":"C3000057B9DD","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C81F07922122"},{"timestamp":"2026-02-09T00:36:38.430Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:38.590Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:38.672Z","mac":"C3000057B9F5","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1D907BA77E4"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:38.055Z","type":"Gateway","mac":"AC233FC1DCCD","nums":10},{"timestamp":"2026-02-09T00:36:38.068Z","mac":"C7AE561E38B7","rssi":-85,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A0F03095336"},{"timestamp":"2026-02-09T00:36:38.096Z","mac":"C3000057B9DB","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2410000204664907B0D43C"},{"timestamp":"2026-02-09T00:36:38.360Z","mac":"C3000057B9E7","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40C0710B484"},{"timestamp":"2026-02-09T00:36:38.361Z","mac":"E017085443A7","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:38.387Z","mac":"C3000057B9E8","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F506F29E2C"},{"timestamp":"2026-02-09T00:36:38.407Z","mac":"C3000057B9DD","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C81F07922122"},{"timestamp":"2026-02-09T00:36:38.675Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A0F03095336"},{"timestamp":"2026-02-09T00:36:38.678Z","mac":"C3000057B9F5","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1D907BA77E4"},{"timestamp":"2026-02-09T00:36:38.981Z","mac":"C7AE561E38B7","rssi":-85,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:38.999Z","mac":"C3000057B9D4","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C540E0002000BA406BB32DE"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:38.181Z","type":"Gateway","mac":"AC233FC1DCD1","nums":7},{"timestamp":"2026-02-09T00:36:38.846Z","mac":"C3000057B9E6","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C3F100001EDC4A706F4FFE6"},{"timestamp":"2026-02-09T00:36:38.966Z","mac":"C300003947C4","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C32FFF152F848C"},{"timestamp":"2026-02-09T00:36:38.981Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:38.999Z","mac":"C3000057B9D4","rssi":-55,"rawData":"0201060303AAFE1116AAFE20000C540E0002000BA406BB32DE"},{"timestamp":"2026-02-09T00:36:39.007Z","mac":"D54E908B7972","rssi":-58,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:39.108Z","mac":"C3000057B9DB","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2410000204664A07B0D446"},{"timestamp":"2026-02-09T00:36:39.172Z","mac":"C3000057B9F1","rssi":-44,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0006E55A46"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:38.026Z","type":"Gateway","mac":"AC233FC1DD4E","nums":10},{"timestamp":"2026-02-09T00:36:38.177Z","mac":"C3000057B9F1","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CBFF06E55A3C"},{"timestamp":"2026-02-09T00:36:38.217Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:38.238Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:38.529Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:38.560Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:38.681Z","mac":"C3000057B9F5","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1D907BA77E4"},{"timestamp":"2026-02-09T00:36:38.851Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:38.955Z","mac":"E6E749BA2D00","rssi":-83,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:38.983Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:39.059Z","mac":"C3000057B9DC","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC280776BB76"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:38.375Z","type":"Gateway","mac":"AC233FC1DD31","nums":3},{"timestamp":"2026-02-09T00:36:38.476Z","mac":"E43883D93326","rssi":-85,"rawData":"1106B93D2E1D72D12592F94FD44ACDC5392109162A25E43883D93324"},{"timestamp":"2026-02-09T00:36:39.061Z","mac":"C3000057B9DC","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC280776BB76"},{"timestamp":"2026-02-09T00:36:39.112Z","mac":"C3000057B9DB","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2410000204664A07B0D446"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:38.255Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:38.366Z","type":"Gateway","mac":"AC233FC1DCEE","nums":1},{"timestamp":"2026-02-09T00:36:38.360Z","mac":"E017085443A7","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:38.544Z","type":"Gateway","mac":"AC233FC1DCD2","nums":6},{"timestamp":"2026-02-09T00:36:38.849Z","mac":"C3000057B9E6","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C3F100001EDC4A706F4FFE6"},{"timestamp":"2026-02-09T00:36:38.877Z","mac":"C3000057B9F4","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C2A100002089BA507BE4388"},{"timestamp":"2026-02-09T00:36:39.111Z","mac":"C3000057B9DB","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C2410000204664A07B0D446"},{"timestamp":"2026-02-09T00:36:39.178Z","mac":"C3000057B9F1","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0006E55A46"},{"timestamp":"2026-02-09T00:36:39.392Z","mac":"C3000057B9E8","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F606F29E36"},{"timestamp":"2026-02-09T00:36:39.415Z","mac":"C3000057B9DD","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C8200792212C"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:38.561Z","type":"Gateway","mac":"AC233FC1DD40","nums":2},{"timestamp":"2026-02-09T00:36:39.053Z","mac":"C3000057B9DC","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC280776BB76"},{"timestamp":"2026-02-09T00:36:39.357Z","mac":"E017085443A7","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:38.542Z","type":"Gateway","mac":"AC233FC1DD49","nums":3},{"timestamp":"2026-02-09T00:36:38.849Z","mac":"C3000057B9E6","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C3F100001EDC4A706F4FFE6"},{"timestamp":"2026-02-09T00:36:39.364Z","mac":"E017085443A7","rssi":-78,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:39.391Z","mac":"C3000057B9E8","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F606F29E36"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:38.575Z","type":"Gateway","mac":"AC233FC1DCCB","nums":5},{"timestamp":"2026-02-09T00:36:38.849Z","mac":"C3000057B9E6","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C3F100001EDC4A706F4FFE6"},{"timestamp":"2026-02-09T00:36:38.876Z","mac":"C3000057B9F4","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2A100002089BA507BE4388"},{"timestamp":"2026-02-09T00:36:39.111Z","mac":"C3000057B9DB","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2410000204664A07B0D446"},{"timestamp":"2026-02-09T00:36:39.176Z","mac":"C3000057B9F1","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0006E55A46"},{"timestamp":"2026-02-09T00:36:39.391Z","mac":"C3000057B9E8","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F606F29E36"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:38.674Z","type":"Gateway","mac":"AC233FC1DD51","nums":5},{"timestamp":"2026-02-09T00:36:38.677Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A0F03095336"},{"timestamp":"2026-02-09T00:36:38.984Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:39.288Z","mac":"C7AE561E38B7","rssi":-81,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:39.309Z","mac":"C3000057B9DF","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C330B0001F9895407944470"},{"timestamp":"2026-02-09T00:36:39.592Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:38.745Z","type":"Gateway","mac":"AC233FC1DD3C","nums":4},{"timestamp":"2026-02-09T00:36:38.848Z","mac":"C3000057B9E6","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C3F100001EDC4A706F4FFE6"},{"timestamp":"2026-02-09T00:36:39.223Z","mac":"504C97555B00","rssi":-75,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:39.392Z","mac":"C3000057B9E8","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F606F29E36"},{"timestamp":"2026-02-09T00:36:39.615Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:38.793Z","type":"Gateway","mac":"AC233FC1DD50","nums":3},{"timestamp":"2026-02-09T00:36:38.790Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:39.406Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:39.716Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:38.854Z","type":"Gateway","mac":"AC233FC1DD55","nums":6},{"timestamp":"2026-02-09T00:36:39.364Z","mac":"E017085443A7","rssi":-71,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:39.368Z","mac":"C3000057B9E7","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40D0710B48E"},{"timestamp":"2026-02-09T00:36:39.392Z","mac":"C3000057B9E8","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F606F29E36"},{"timestamp":"2026-02-09T00:36:39.735Z","mac":"F045AEE31DB4","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:39.813Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:39.855Z","mac":"C3000057B9E6","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4A806F4FFF0"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:38.890Z","type":"Gateway","mac":"AC233FC1DD4B","nums":6},{"timestamp":"2026-02-09T00:36:39.060Z","mac":"C3000057B9DC","rssi":-54,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC280776BB76"},{"timestamp":"2026-02-09T00:36:39.112Z","mac":"C3000057B9DB","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2410000204664A07B0D446"},{"timestamp":"2026-02-09T00:36:39.365Z","mac":"E017085443A7","rssi":-77,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:39.416Z","mac":"C3000057B9DD","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C8200792212C"},{"timestamp":"2026-02-09T00:36:39.690Z","mac":"C3000057B9F5","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DA07BA77EE"},{"timestamp":"2026-02-09T00:36:39.735Z","mac":"F045AEE31DB4","rssi":-74,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:38.970Z","type":"Gateway","mac":"AC233FC1DD48","nums":3},{"timestamp":"2026-02-09T00:36:39.300Z","mac":"C3000057B9DF","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C330B0001F9895407944470"},{"timestamp":"2026-02-09T00:36:39.657Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:39.680Z","mac":"C3000057B9F5","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DA07BA77EE"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:39.101Z","type":"Gateway","mac":"AC233FC1DCCD","nums":7},{"timestamp":"2026-02-09T00:36:39.285Z","mac":"C7AE561E38B7","rssi":-85,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:39.589Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:39.605Z","mac":"C3000057B9D9","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFEE075D669E"},{"timestamp":"2026-02-09T00:36:39.853Z","mac":"C3000057B9E6","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4A806F4FFF0"},{"timestamp":"2026-02-09T00:36:39.871Z","mac":"C3000057B9F4","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA607BE4392"},{"timestamp":"2026-02-09T00:36:39.881Z","mac":"C300003946AC","rssi":-75,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:39.892Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:39.066Z","type":"Gateway","mac":"AC233FC1DD4E","nums":14},{"timestamp":"2026-02-09T00:36:39.092Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:39.110Z","mac":"C3000057B9DB","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2410000204664A07B0D446"},{"timestamp":"2026-02-09T00:36:39.159Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:39.176Z","mac":"C3000057B9F1","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0006E55A46"},{"timestamp":"2026-02-09T00:36:39.364Z","mac":"E017085443A7","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:39.368Z","mac":"C3000057B9E7","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40D0710B48E"},{"timestamp":"2026-02-09T00:36:39.410Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:39.415Z","mac":"C3000057B9DD","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C8200792212C"},{"timestamp":"2026-02-09T00:36:39.472Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:39.688Z","mac":"C3000057B9F5","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DA07BA77EE"},{"timestamp":"2026-02-09T00:36:39.786Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:39.876Z","mac":"C3000057B9F4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA607BE4392"},{"timestamp":"2026-02-09T00:36:39.976Z","mac":"C300003947C4","rssi":-85,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33000152F8496"},{"timestamp":"2026-02-09T00:36:40.047Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:39.179Z","type":"Gateway","mac":"AC233FC1DCD1","nums":14},{"timestamp":"2026-02-09T00:36:39.363Z","mac":"E017085443A7","rssi":-37,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:39.367Z","mac":"C3000057B9E7","rssi":-57,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40D0710B48E"},{"timestamp":"2026-02-09T00:36:39.389Z","mac":"C3000057B9E8","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F606F29E36"},{"timestamp":"2026-02-09T00:36:39.687Z","mac":"C3000057B9F5","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DA07BA77EE"},{"timestamp":"2026-02-09T00:36:39.732Z","mac":"F045AEE31DB4","rssi":-38,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:39.850Z","mac":"C3000057B9E6","rssi":-51,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4A806F4FFF0"},{"timestamp":"2026-02-09T00:36:39.871Z","mac":"C3000057B9F4","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA607BE4392"},{"timestamp":"2026-02-09T00:36:39.881Z","mac":"C300003946AC","rssi":-64,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:39.893Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:39.975Z","mac":"C300003947C4","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33000152F8496"},{"timestamp":"2026-02-09T00:36:40.002Z","mac":"C3000057B9D4","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C540E0002000BA506BB32E8"},{"timestamp":"2026-02-09T00:36:40.009Z","mac":"D54E908B7972","rssi":-59,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:40.110Z","mac":"C3000057B9DB","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C2710000204664B07B0D450"},{"timestamp":"2026-02-09T00:36:40.183Z","mac":"C3000057B9F1","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0106E55A50"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:39.253Z","type":"Gateway","mac":"AC233FC1DCD3","nums":1},{"timestamp":"2026-02-09T00:36:40.057Z","mac":"C3000057B9DC","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC290776BB80"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:39.315Z","type":"Gateway","mac":"AC233FC1DD31","nums":11},{"timestamp":"2026-02-09T00:36:39.365Z","mac":"E017085443A7","rssi":-68,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:39.369Z","mac":"C3000057B9E7","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40D0710B48E"},{"timestamp":"2026-02-09T00:36:39.392Z","mac":"C3000057B9E8","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F606F29E36"},{"timestamp":"2026-02-09T00:36:39.416Z","mac":"C3000057B9DD","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C8200792212C"},{"timestamp":"2026-02-09T00:36:39.690Z","mac":"C3000057B9F5","rssi":-32,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DA07BA77EE"},{"timestamp":"2026-02-09T00:36:39.735Z","mac":"F045AEE31DB4","rssi":-66,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:39.977Z","mac":"C300003947C4","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33000152F8496"},{"timestamp":"2026-02-09T00:36:40.005Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C540E0002000BA506BB32E8"},{"timestamp":"2026-02-09T00:36:40.012Z","mac":"D54E908B7972","rssi":-78,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:40.060Z","mac":"C3000057B9DC","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC290776BB80"},{"timestamp":"2026-02-09T00:36:40.332Z","mac":"C3000057B9DF","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C330B0001F989550794447A"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:39.373Z","type":"Gateway","mac":"AC233FC1DCEE","nums":3},{"timestamp":"2026-02-09T00:36:39.389Z","mac":"C3000057B9E8","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F606F29E36"},{"timestamp":"2026-02-09T00:36:39.974Z","mac":"C300003947C4","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33000152F8496"},{"timestamp":"2026-02-09T00:36:40.001Z","mac":"C3000057B9D4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C540E0002000BA506BB32E8"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:39.511Z","type":"Gateway","mac":"AC233FC1DCD2","nums":15},{"timestamp":"2026-02-09T00:36:39.734Z","mac":"F045AEE31DB4","rssi":-48,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.005Z","mac":"C3000057B9D4","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C540E0002000BA506BB32E8"},{"timestamp":"2026-02-09T00:36:40.012Z","mac":"D54E908B7972","rssi":-76,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:40.060Z","mac":"C3000057B9DC","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC290776BB80"},{"timestamp":"2026-02-09T00:36:40.115Z","mac":"C3000057B9DB","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2710000204664B07B0D450"},{"timestamp":"2026-02-09T00:36:40.185Z","mac":"C3000057B9F1","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0106E55A50"},{"timestamp":"2026-02-09T00:36:40.202Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1103095336"},{"timestamp":"2026-02-09T00:36:40.287Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:40.330Z","mac":"C3000057B9DF","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C330B0001F989550794447A"},{"timestamp":"2026-02-09T00:36:40.340Z","mac":"E43883D93326","rssi":-84,"rawData":"1106B93D2E1D72D12592F94FD44ACDC5392109162A25E43883D93324"},{"timestamp":"2026-02-09T00:36:40.369Z","mac":"E017085443A7","rssi":-50,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.383Z","mac":"C3000057B9E7","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40E0710B498"},{"timestamp":"2026-02-09T00:36:40.389Z","mac":"C3000057B9E8","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F706F29E40"},{"timestamp":"2026-02-09T00:36:40.432Z","mac":"C3000057B9DD","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82107922136"},{"timestamp":"2026-02-09T00:36:40.507Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1103095336"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:39.596Z","type":"Gateway","mac":"AC233FC1DCCB","nums":5},{"timestamp":"2026-02-09T00:36:39.734Z","mac":"F045AEE31DB4","rssi":-65,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.004Z","mac":"C3000057B9D4","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C540E0002000BA506BB32E8"},{"timestamp":"2026-02-09T00:36:40.115Z","mac":"C3000057B9DB","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2710000204664B07B0D450"},{"timestamp":"2026-02-09T00:36:40.369Z","mac":"E017085443A7","rssi":-69,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.388Z","mac":"C3000057B9E8","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F706F29E40"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:39.561Z","type":"Gateway","mac":"AC233FC1DD40","nums":1},{"timestamp":"2026-02-09T00:36:39.682Z","mac":"C3000057B9F5","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DA07BA77EE"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:39.594Z","type":"Gateway","mac":"AC233FC1DD49","nums":0}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:39.694Z","type":"Gateway","mac":"AC233FC1DD51","nums":5},{"timestamp":"2026-02-09T00:36:39.874Z","mac":"C3000057B9F4","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA607BE4392"},{"timestamp":"2026-02-09T00:36:39.884Z","mac":"C300003946AC","rssi":-86,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:39.895Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:40.203Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1103095336"},{"timestamp":"2026-02-09T00:36:40.505Z","mac":"C7AE561E38B7","rssi":-81,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1103095336"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:39.715Z","type":"Gateway","mac":"AC233FC1DD3C","nums":8},{"timestamp":"2026-02-09T00:36:39.734Z","mac":"F045AEE31DB4","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:39.812Z","mac":"504C97555B00","rssi":-77,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:40.005Z","mac":"C3000057B9D4","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C540E0002000BA506BB32E8"},{"timestamp":"2026-02-09T00:36:40.369Z","mac":"E017085443A7","rssi":-76,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.382Z","mac":"C3000057B9E7","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40E0710B498"},{"timestamp":"2026-02-09T00:36:40.401Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:40.667Z","mac":"D920A4A6D237","rssi":-82,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:40.732Z","mac":"F045AEE31DB4","rssi":-76,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:39.821Z","type":"Gateway","mac":"AC233FC1DD50","nums":2},{"timestamp":"2026-02-09T00:36:40.329Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:40.643Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:39.862Z","type":"Gateway","mac":"AC233FC1DD55","nums":9},{"timestamp":"2026-02-09T00:36:40.003Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:40.005Z","mac":"C3000057B9D4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C540E0002000BA506BB32E8"},{"timestamp":"2026-02-09T00:36:40.012Z","mac":"D54E908B7972","rssi":-84,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:40.369Z","mac":"E017085443A7","rssi":-72,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.388Z","mac":"C3000057B9E8","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F706F29E40"},{"timestamp":"2026-02-09T00:36:40.402Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:40.597Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:40.733Z","mac":"F045AEE31DB4","rssi":-77,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.872Z","mac":"C3000057B9F4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA707BE439C"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:39.980Z","type":"Gateway","mac":"AC233FC1DD48","nums":4},{"timestamp":"2026-02-09T00:36:40.604Z","mac":"C3000057B9D9","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFEF075D66A8"},{"timestamp":"2026-02-09T00:36:40.694Z","mac":"C3000057B9F5","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DB07BA77F8"},{"timestamp":"2026-02-09T00:36:40.741Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:40.896Z","mac":"A0D05BD2E2E5","rssi":-85,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:39.941Z","type":"Gateway","mac":"AC233FC1DD4B","nums":6},{"timestamp":"2026-02-09T00:36:39.977Z","mac":"C300003947C4","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33000152F8496"},{"timestamp":"2026-02-09T00:36:40.060Z","mac":"C3000057B9DC","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC290776BB80"},{"timestamp":"2026-02-09T00:36:40.332Z","mac":"C3000057B9DF","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C330B0001F989550794447A"},{"timestamp":"2026-02-09T00:36:40.614Z","mac":"C3000057B9D9","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFEF075D66A8"},{"timestamp":"2026-02-09T00:36:40.668Z","mac":"D920A4A6D237","rssi":-78,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:40.704Z","mac":"C3000057B9F5","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DB07BA77F8"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:40.054Z","type":"Gateway","mac":"AC233FC1DD4E","nums":15},{"timestamp":"2026-02-09T00:36:40.059Z","mac":"C3000057B9DC","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC290776BB80"},{"timestamp":"2026-02-09T00:36:40.308Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:40.330Z","mac":"C3000057B9DF","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C330B0001F989550794447A"},{"timestamp":"2026-02-09T00:36:40.358Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:40.613Z","mac":"C3000057B9D9","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFEF075D66A8"},{"timestamp":"2026-02-09T00:36:40.631Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:40.671Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:40.702Z","mac":"C3000057B9F5","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DB07BA77F8"},{"timestamp":"2026-02-09T00:36:40.733Z","mac":"F045AEE31DB4","rssi":-73,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.813Z","mac":"C7AE561E38B7","rssi":-75,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1103095336"},{"timestamp":"2026-02-09T00:36:40.871Z","mac":"C3000057B9F4","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA707BE439C"},{"timestamp":"2026-02-09T00:36:40.878Z","mac":"C300003946B1","rssi":-79,"rawData":"0201060303E1FF1116E1FFA10826B146390000C34D57423031"},{"timestamp":"2026-02-09T00:36:40.949Z","mac":"E6E749BA2D00","rssi":-76,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:40.988Z","mac":"C300003947C4","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33001152F84A0"},{"timestamp":"2026-02-09T00:36:41.070Z","mac":"C3000057B9DC","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC2A0776BB8A"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:40.090Z","type":"Gateway","mac":"AC233FC1DCCD","nums":5},{"timestamp":"2026-02-09T00:36:40.183Z","mac":"C3000057B9F1","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0106E55A50"},{"timestamp":"2026-02-09T00:36:40.200Z","mac":"C7AE561E38B7","rssi":-84,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1103095336"},{"timestamp":"2026-02-09T00:36:40.505Z","mac":"C7AE561E38B7","rssi":-85,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1103095336"},{"timestamp":"2026-02-09T00:36:40.810Z","mac":"C7AE561E38B7","rssi":-84,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1103095336"},{"timestamp":"2026-02-09T00:36:40.854Z","mac":"C3000057B9E6","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4A906F4FFFA"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:40.253Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:40.338Z","type":"Gateway","mac":"AC233FC1DD31","nums":6},{"timestamp":"2026-02-09T00:36:40.369Z","mac":"E017085443A7","rssi":-67,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.383Z","mac":"C3000057B9E7","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40E0710B498"},{"timestamp":"2026-02-09T00:36:40.613Z","mac":"C3000057B9D9","rssi":-47,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFEF075D66A8"},{"timestamp":"2026-02-09T00:36:40.668Z","mac":"D920A4A6D237","rssi":-79,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:40.704Z","mac":"C3000057B9F5","rssi":-38,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DB07BA77F8"},{"timestamp":"2026-02-09T00:36:41.017Z","mac":"D54E908B7972","rssi":-78,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:40.191Z","type":"Gateway","mac":"AC233FC1DCD1","nums":16},{"timestamp":"2026-02-09T00:36:40.366Z","mac":"E017085443A7","rssi":-35,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.378Z","mac":"C3000057B9E7","rssi":-50,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40E0710B498"},{"timestamp":"2026-02-09T00:36:40.383Z","mac":"C3000057B9E8","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F706F29E40"},{"timestamp":"2026-02-09T00:36:40.665Z","mac":"D920A4A6D237","rssi":-55,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:40.698Z","mac":"C3000057B9F5","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DB07BA77F8"},{"timestamp":"2026-02-09T00:36:40.728Z","mac":"F045AEE31DB4","rssi":-35,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.810Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1103095336"},{"timestamp":"2026-02-09T00:36:40.855Z","mac":"C3000057B9E6","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4A906F4FFFA"},{"timestamp":"2026-02-09T00:36:40.869Z","mac":"C3000057B9F4","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA707BE439C"},{"timestamp":"2026-02-09T00:36:40.875Z","mac":"C300003946B1","rssi":-47,"rawData":"0201060303E1FF1116E1FFA10826B146390000C34D57423031"},{"timestamp":"2026-02-09T00:36:41.011Z","mac":"D54E908B7972","rssi":-58,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:41.017Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C540F0002000BA606BB32F2"},{"timestamp":"2026-02-09T00:36:41.064Z","mac":"C3000057B9DC","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC2A0776BB8A"},{"timestamp":"2026-02-09T00:36:41.120Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:41.128Z","mac":"C3000057B9DB","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2710000204664C07B0D45A"},{"timestamp":"2026-02-09T00:36:41.189Z","mac":"C3000057B9F1","rssi":-48,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0206E55A5A"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:40.303Z","type":"Gateway","mac":"AC233FC1DCEE","nums":2},{"timestamp":"2026-02-09T00:36:40.366Z","mac":"E017085443A7","rssi":-78,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:41.018Z","mac":"C3000057B9D4","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C540F0002000BA606BB32F2"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:40.711Z","type":"Gateway","mac":"AC233FC1DD51","nums":5},{"timestamp":"2026-02-09T00:36:40.811Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1103095336"},{"timestamp":"2026-02-09T00:36:40.870Z","mac":"C3000057B9F4","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA707BE439C"},{"timestamp":"2026-02-09T00:36:41.120Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:41.129Z","mac":"C3000057B9DB","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C2710000204664C07B0D45A"},{"timestamp":"2026-02-09T00:36:41.429Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:40.592Z","type":"Gateway","mac":"AC233FC1DD49","nums":2},{"timestamp":"2026-02-09T00:36:40.989Z","mac":"C300003947C4","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33001152F84A0"},{"timestamp":"2026-02-09T00:36:41.368Z","mac":"E017085443A7","rssi":-86,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:40.581Z","type":"Gateway","mac":"AC233FC1DD40","nums":0}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:40.586Z","type":"Gateway","mac":"AC233FC1DCCB","nums":6},{"timestamp":"2026-02-09T00:36:40.667Z","mac":"D920A4A6D237","rssi":-81,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:40.703Z","mac":"C3000057B9F5","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DB07BA77F8"},{"timestamp":"2026-02-09T00:36:40.733Z","mac":"F045AEE31DB4","rssi":-67,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.989Z","mac":"C300003947C4","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33001152F84A0"},{"timestamp":"2026-02-09T00:36:41.021Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C540F0002000BA606BB32F2"},{"timestamp":"2026-02-09T00:36:41.342Z","mac":"C3000057B9DF","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C330B0001F9895607944484"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:40.516Z","type":"Gateway","mac":"AC233FC1DCD2","nums":18},{"timestamp":"2026-02-09T00:36:40.667Z","mac":"D920A4A6D237","rssi":-70,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:40.703Z","mac":"C3000057B9F5","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DB07BA77F8"},{"timestamp":"2026-02-09T00:36:40.732Z","mac":"F045AEE31DB4","rssi":-46,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:40.989Z","mac":"C300003947C4","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33001152F84A0"},{"timestamp":"2026-02-09T00:36:41.016Z","mac":"D54E908B7972","rssi":-73,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:41.022Z","mac":"C3000057B9D4","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C540F0002000BA606BB32F2"},{"timestamp":"2026-02-09T00:36:41.070Z","mac":"C3000057B9DC","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC2A0776BB8A"},{"timestamp":"2026-02-09T00:36:41.122Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:41.131Z","mac":"C3000057B9DB","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2710000204664C07B0D45A"},{"timestamp":"2026-02-09T00:36:41.192Z","mac":"C3000057B9F1","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0206E55A5A"},{"timestamp":"2026-02-09T00:36:41.217Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:41.342Z","mac":"C3000057B9DF","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C330B0001F9895607944484"},{"timestamp":"2026-02-09T00:36:41.368Z","mac":"E017085443A7","rssi":-50,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:41.389Z","mac":"C3000057B9E7","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C40F0710B4A2"},{"timestamp":"2026-02-09T00:36:41.396Z","mac":"C3000057B9E8","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F806F29E4A"},{"timestamp":"2026-02-09T00:36:41.431Z","mac":"C7AE561E38B7","rssi":-78,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:41.432Z","mac":"C3000057B9DD","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82207922140"},{"timestamp":"2026-02-09T00:36:41.522Z","mac":"A0D05BD2E2E5","rssi":-80,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:40.739Z","type":"Gateway","mac":"AC233FC1DD3C","nums":6},{"timestamp":"2026-02-09T00:36:40.988Z","mac":"C300003947C4","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33001152F84A0"},{"timestamp":"2026-02-09T00:36:40.990Z","mac":"504C97555B00","rssi":-85,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:41.022Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C540F0002000BA606BB32F2"},{"timestamp":"2026-02-09T00:36:41.368Z","mac":"E017085443A7","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:41.382Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:41.397Z","mac":"C3000057B9E8","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F806F29E4A"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:40.741Z","type":"Gateway","mac":"AC233FC1DD50","nums":2},{"timestamp":"2026-02-09T00:36:41.271Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:41.579Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:40.881Z","type":"Gateway","mac":"AC233FC1DD55","nums":8},{"timestamp":"2026-02-09T00:36:40.878Z","mac":"C300003946B1","rssi":-76,"rawData":"0201060303E1FF1116E1FFA10826B146390000C34D57423031"},{"timestamp":"2026-02-09T00:36:40.989Z","mac":"C300003947C4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33001152F84A0"},{"timestamp":"2026-02-09T00:36:40.990Z","mac":"504C97555B00","rssi":-83,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:41.368Z","mac":"E017085443A7","rssi":-82,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:41.382Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:41.398Z","mac":"C3000057B9E8","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F806F29E4A"},{"timestamp":"2026-02-09T00:36:41.574Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:41.852Z","mac":"C3000057B9E6","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AA06F50004"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:40.901Z","type":"Gateway","mac":"AC233FC1DD4B","nums":1},{"timestamp":"2026-02-09T00:36:41.883Z","mac":"C3000057B9F4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA807BE43A6"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:40.903Z","type":"Gateway","mac":"AC233FC1DD48","nums":6},{"timestamp":"2026-02-09T00:36:41.122Z","mac":"C3000057B9DB","rssi":-85,"rawData":"0201060303AAFE1116AAFE20000C2710000204664C07B0D45A"},{"timestamp":"2026-02-09T00:36:41.424Z","mac":"C3000057B9DD","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82207922140"},{"timestamp":"2026-02-09T00:36:41.513Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:41.611Z","mac":"C3000057B9D9","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF0075D66B2"},{"timestamp":"2026-02-09T00:36:41.673Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:41.825Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:41.079Z","type":"Gateway","mac":"AC233FC1DD4E","nums":10},{"timestamp":"2026-02-09T00:36:41.256Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:41.563Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:41.618Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:41.619Z","mac":"C3000057B9D9","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF0075D66B2"},{"timestamp":"2026-02-09T00:36:41.873Z","mac":"E6E749BA2D00","rssi":-76,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:41.881Z","mac":"C3000057B9F4","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA807BE43A6"},{"timestamp":"2026-02-09T00:36:41.887Z","mac":"C300003946AC","rssi":-79,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:41.923Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:41.978Z","mac":"E6E749BA2D00","rssi":-83,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:42.046Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1303095336"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:41.059Z","type":"Gateway","mac":"AC233FC1DCCD","nums":9},{"timestamp":"2026-02-09T00:36:41.128Z","mac":"C3000057B9DB","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2710000204664C07B0D45A"},{"timestamp":"2026-02-09T00:36:41.393Z","mac":"C3000057B9E8","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F806F29E4A"},{"timestamp":"2026-02-09T00:36:41.429Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:41.430Z","mac":"C3000057B9DD","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82207922140"},{"timestamp":"2026-02-09T00:36:41.708Z","mac":"C3000057B9F5","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DC07BA7802"},{"timestamp":"2026-02-09T00:36:41.734Z","mac":"F045AEE31DB4","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:41.736Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:41.993Z","mac":"C300003947C4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33002152F84AA"},{"timestamp":"2026-02-09T00:36:42.022Z","mac":"C3000057B9D4","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C540E0002000BA706BB32FC"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:41.253Z","type":"Gateway","mac":"AC233FC1DCD3","nums":1},{"timestamp":"2026-02-09T00:36:42.069Z","mac":"C3000057B9DC","rssi":-85,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC2B0776BB94"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:41.197Z","type":"Gateway","mac":"AC233FC1DCD1","nums":6},{"timestamp":"2026-02-09T00:36:41.615Z","mac":"C3000057B9D9","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF0075D66B2"},{"timestamp":"2026-02-09T00:36:41.849Z","mac":"C3000057B9E6","rssi":-53,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AA06F50004"},{"timestamp":"2026-02-09T00:36:41.879Z","mac":"C3000057B9F4","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA807BE43A6"},{"timestamp":"2026-02-09T00:36:41.884Z","mac":"C300003946AC","rssi":-58,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:42.129Z","mac":"C3000057B9DB","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2710000204664D07B0D464"},{"timestamp":"2026-02-09T00:36:42.201Z","mac":"C3000057B9F1","rssi":-48,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0306E55A64"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:41.315Z","type":"Gateway","mac":"AC233FC1DD31","nums":3},{"timestamp":"2026-02-09T00:36:41.621Z","mac":"C3000057B9D9","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF0075D66B2"},{"timestamp":"2026-02-09T00:36:41.883Z","mac":"C3000057B9F4","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA807BE43A6"},{"timestamp":"2026-02-09T00:36:42.132Z","mac":"C3000057B9DB","rssi":-55,"rawData":"0201060303AAFE1116AAFE20000C2710000204664D07B0D464"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:41.322Z","type":"Gateway","mac":"AC233FC1DCEE","nums":1},{"timestamp":"2026-02-09T00:36:41.848Z","mac":"C3000057B9E6","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AA06F50004"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:41.573Z","type":"Gateway","mac":"AC233FC1DD49","nums":1},{"timestamp":"2026-02-09T00:36:41.852Z","mac":"C3000057B9E6","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AA06F50004"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:41.530Z","type":"Gateway","mac":"AC233FC1DCD2","nums":4},{"timestamp":"2026-02-09T00:36:41.620Z","mac":"C3000057B9D9","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF0075D66B2"},{"timestamp":"2026-02-09T00:36:41.852Z","mac":"C3000057B9E6","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AA06F50004"},{"timestamp":"2026-02-09T00:36:41.881Z","mac":"C3000057B9F4","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA807BE43A6"},{"timestamp":"2026-02-09T00:36:42.205Z","mac":"C3000057B9F1","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0306E55A64"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:41.545Z","type":"Gateway","mac":"AC233FC1DCCB","nums":5},{"timestamp":"2026-02-09T00:36:41.620Z","mac":"C3000057B9D9","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF0075D66B2"},{"timestamp":"2026-02-09T00:36:41.852Z","mac":"C3000057B9E6","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AA06F50004"},{"timestamp":"2026-02-09T00:36:41.882Z","mac":"C3000057B9F4","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA807BE43A6"},{"timestamp":"2026-02-09T00:36:41.887Z","mac":"C300003946AC","rssi":-73,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:42.204Z","mac":"C3000057B9F1","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0306E55A64"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:41.580Z","type":"Gateway","mac":"AC233FC1DD40","nums":2},{"timestamp":"2026-02-09T00:36:41.874Z","mac":"C3000057B9F4","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA807BE43A6"},{"timestamp":"2026-02-09T00:36:42.124Z","mac":"C3000057B9DB","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2710000204664D07B0D464"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:41.632Z","type":"Gateway","mac":"AC233FC1DD51","nums":5},{"timestamp":"2026-02-09T00:36:41.735Z","mac":"F045AEE31DB4","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:41.737Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:42.044Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1303095336"},{"timestamp":"2026-02-09T00:36:42.352Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1303095336"},{"timestamp":"2026-02-09T00:36:42.353Z","mac":"C3000057B9DF","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C330B0001F989570794448E"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:41.696Z","type":"Gateway","mac":"AC233FC1DD3C","nums":4},{"timestamp":"2026-02-09T00:36:41.852Z","mac":"C3000057B9E6","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AA06F50004"},{"timestamp":"2026-02-09T00:36:41.965Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:42.552Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:42.732Z","mac":"F045AEE31DB4","rssi":-82,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:41.780Z","type":"Gateway","mac":"AC233FC1DD50","nums":1},{"timestamp":"2026-02-09T00:36:42.068Z","mac":"C3000057B9DC","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC2B0776BB94"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:41.858Z","type":"Gateway","mac":"AC233FC1DD55","nums":5},{"timestamp":"2026-02-09T00:36:41.882Z","mac":"C3000057B9F4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA807BE43A6"},{"timestamp":"2026-02-09T00:36:42.159Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:42.203Z","mac":"C3000057B9F1","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0306E55A64"},{"timestamp":"2026-02-09T00:36:42.552Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:42.749Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:41.890Z","type":"Gateway","mac":"AC233FC1DD4B","nums":4},{"timestamp":"2026-02-09T00:36:41.888Z","mac":"C300003946AC","rssi":-79,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:42.133Z","mac":"C3000057B9DB","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2710000204664D07B0D464"},{"timestamp":"2026-02-09T00:36:42.447Z","mac":"C3000057B9DD","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C8230792214A"},{"timestamp":"2026-02-09T00:36:42.861Z","mac":"C3000057B9E6","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AB06F5000E"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:42.028Z","type":"Gateway","mac":"AC233FC1DCCD","nums":7},{"timestamp":"2026-02-09T00:36:42.068Z","mac":"C3000057B9DC","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC2B0776BB94"},{"timestamp":"2026-02-09T00:36:42.363Z","mac":"E017085443A7","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:42.393Z","mac":"C3000057B9E8","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6F906F29E54"},{"timestamp":"2026-02-09T00:36:42.397Z","mac":"C3000057B9E7","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4100710B4AC"},{"timestamp":"2026-02-09T00:36:42.628Z","mac":"C3000057B9D9","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF1075D66BC"},{"timestamp":"2026-02-09T00:36:42.657Z","mac":"C7AE561E38B7","rssi":-84,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1303095336"},{"timestamp":"2026-02-09T00:36:43.015Z","mac":"D54E908B7972","rssi":-83,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:41.931Z","type":"Gateway","mac":"AC233FC1DD48","nums":3},{"timestamp":"2026-02-09T00:36:42.346Z","mac":"C3000057B9DF","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C330B0001F989570794448E"},{"timestamp":"2026-02-09T00:36:42.714Z","mac":"C3000057B9F5","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DD07BA780C"},{"timestamp":"2026-02-09T00:36:42.909Z","mac":"A0D05BD2E2E5","rssi":-80,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:42.174Z","type":"Gateway","mac":"AC233FC1DCD3","nums":1},{"timestamp":"2026-02-09T00:36:43.068Z","mac":"C3000057B9DC","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC2C0776BB9E"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:42.053Z","type":"Gateway","mac":"AC233FC1DD4E","nums":11},{"timestamp":"2026-02-09T00:36:42.132Z","mac":"C3000057B9DB","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2710000204664D07B0D464"},{"timestamp":"2026-02-09T00:36:42.181Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:42.203Z","mac":"C3000057B9F1","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0306E55A64"},{"timestamp":"2026-02-09T00:36:42.441Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:42.446Z","mac":"C3000057B9DD","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C8230792214A"},{"timestamp":"2026-02-09T00:36:42.491Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:42.632Z","mac":"C3000057B9D9","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF1075D66BC"},{"timestamp":"2026-02-09T00:36:42.660Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1303095336"},{"timestamp":"2026-02-09T00:36:42.723Z","mac":"C3000057B9F5","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DD07BA780C"},{"timestamp":"2026-02-09T00:36:42.801Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:43.070Z","mac":"C3000057B9DC","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC2C0776BB9E"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:42.207Z","type":"Gateway","mac":"AC233FC1DCD1","nums":3},{"timestamp":"2026-02-09T00:36:42.858Z","mac":"C3000057B9E6","rssi":-50,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AB06F5000E"},{"timestamp":"2026-02-09T00:36:43.139Z","mac":"C3000057B9DB","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C2710000204664E07B0D46E"},{"timestamp":"2026-02-09T00:36:43.209Z","mac":"C3000057B9F1","rssi":-44,"rawData":"0201060303AAFE1116AAFE20000C33120001E7CC0406E55A6E"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:42.335Z","type":"Gateway","mac":"AC233FC1DD31","nums":4},{"timestamp":"2026-02-09T00:36:42.447Z","mac":"C3000057B9DD","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C8230792214A"},{"timestamp":"2026-02-09T00:36:42.861Z","mac":"C3000057B9E6","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AB06F5000E"},{"timestamp":"2026-02-09T00:36:43.071Z","mac":"C3000057B9DC","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC2C0776BB9E"},{"timestamp":"2026-02-09T00:36:43.145Z","mac":"C3000057B9DB","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2710000204664E07B0D46E"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:42.353Z","type":"Gateway","mac":"AC233FC1DCEE","nums":0}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:42.500Z","type":"Gateway","mac":"AC233FC1DCD2","nums":7},{"timestamp":"2026-02-09T00:36:42.863Z","mac":"C3000057B9E6","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AB06F5000E"},{"timestamp":"2026-02-09T00:36:42.877Z","mac":"C3000057B9F4","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA907BE43B0"},{"timestamp":"2026-02-09T00:36:43.145Z","mac":"C3000057B9DB","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2710000204664E07B0D46E"},{"timestamp":"2026-02-09T00:36:43.396Z","mac":"C3000057B9E8","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FA06F29E5E"},{"timestamp":"2026-02-09T00:36:43.397Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:43.408Z","mac":"C3000057B9E7","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4110710B4B6"},{"timestamp":"2026-02-09T00:36:43.447Z","mac":"C3000057B9DD","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82407922154"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:42.622Z","type":"Gateway","mac":"AC233FC1DD40","nums":2},{"timestamp":"2026-02-09T00:36:43.062Z","mac":"C3000057B9DC","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC2C0776BB9E"},{"timestamp":"2026-02-09T00:36:43.363Z","mac":"E017085443A7","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:42.553Z","type":"Gateway","mac":"AC233FC1DD49","nums":1},{"timestamp":"2026-02-09T00:36:43.396Z","mac":"C3000057B9E8","rssi":-85,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FA06F29E5E"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:42.505Z","type":"Gateway","mac":"AC233FC1DCCB","nums":3},{"timestamp":"2026-02-09T00:36:42.877Z","mac":"C3000057B9F4","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C24100002089BA907BE43B0"},{"timestamp":"2026-02-09T00:36:43.144Z","mac":"C3000057B9DB","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2710000204664E07B0D46E"},{"timestamp":"2026-02-09T00:36:43.396Z","mac":"C3000057B9E8","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FA06F29E5E"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:42.651Z","type":"Gateway","mac":"AC233FC1DD51","nums":5},{"timestamp":"2026-02-09T00:36:42.658Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1303095336"},{"timestamp":"2026-02-09T00:36:42.968Z","mac":"C7AE561E38B7","rssi":-81,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:43.274Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:43.578Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:43.638Z","mac":"C3000057B9D9","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF2075D66C6"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:42.771Z","type":"Gateway","mac":"AC233FC1DD50","nums":0}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:42.739Z","type":"Gateway","mac":"AC233FC1DD3C","nums":5},{"timestamp":"2026-02-09T00:36:43.147Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:43.396Z","mac":"C3000057B9E8","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FA06F29E5E"},{"timestamp":"2026-02-09T00:36:43.408Z","mac":"C3000057B9E7","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4110710B4B6"},{"timestamp":"2026-02-09T00:36:43.530Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:43.685Z","mac":"D920A4A6D237","rssi":-80,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:42.847Z","type":"Gateway","mac":"AC233FC1DD55","nums":5},{"timestamp":"2026-02-09T00:36:42.863Z","mac":"C3000057B9E6","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AB06F5000E"},{"timestamp":"2026-02-09T00:36:43.370Z","mac":"E017085443A7","rssi":-72,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:43.396Z","mac":"C3000057B9E8","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FA06F29E5E"},{"timestamp":"2026-02-09T00:36:43.734Z","mac":"F045AEE31DB4","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:43.856Z","mac":"C3000057B9E6","rssi":-87,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AC06F50018"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:42.961Z","type":"Gateway","mac":"AC233FC1DD4B","nums":5},{"timestamp":"2026-02-09T00:36:43.071Z","mac":"C3000057B9DC","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C27100001F0BC2C0776BB9E"},{"timestamp":"2026-02-09T00:36:43.370Z","mac":"C3000057B9DF","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895807944498"},{"timestamp":"2026-02-09T00:36:43.448Z","mac":"C3000057B9DD","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82407922154"},{"timestamp":"2026-02-09T00:36:43.686Z","mac":"D920A4A6D237","rssi":-78,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:43.734Z","mac":"F045AEE31DB4","rssi":-73,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:42.915Z","type":"Gateway","mac":"AC233FC1DD48","nums":2},{"timestamp":"2026-02-09T00:36:43.529Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:43.872Z","mac":"C3000057B9F4","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAA07BE43BA"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:43.022Z","type":"Gateway","mac":"AC233FC1DCCD","nums":6},{"timestamp":"2026-02-09T00:36:43.032Z","mac":"C3000057B9D4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C540F0002000BA806BB3306"},{"timestamp":"2026-02-09T00:36:43.274Z","mac":"C7AE561E38B7","rssi":-84,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:43.854Z","mac":"C3000057B9E6","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AC06F50018"},{"timestamp":"2026-02-09T00:36:43.878Z","mac":"C3000057B9F4","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAA07BE43BA"},{"timestamp":"2026-02-09T00:36:43.884Z","mac":"C300003946AC","rssi":-74,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:43.886Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:43.077Z","type":"Gateway","mac":"AC233FC1DD4E","nums":14},{"timestamp":"2026-02-09T00:36:43.081Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:43.113Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:43.143Z","mac":"C3000057B9DB","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2710000204664E07B0D46E"},{"timestamp":"2026-02-09T00:36:43.368Z","mac":"C3000057B9DF","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895807944498"},{"timestamp":"2026-02-09T00:36:43.392Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:43.436Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:43.446Z","mac":"C3000057B9DD","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82407922154"},{"timestamp":"2026-02-09T00:36:43.704Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:43.733Z","mac":"C3000057B9F5","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DE07BA7816"},{"timestamp":"2026-02-09T00:36:43.881Z","mac":"C3000057B9F4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAA07BE43BA"},{"timestamp":"2026-02-09T00:36:43.886Z","mac":"C300003946AC","rssi":-83,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:43.889Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:43.967Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:44.016Z","mac":"C300003947C4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33004152F84BE"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:43.215Z","type":"Gateway","mac":"AC233FC1DCD1","nums":15},{"timestamp":"2026-02-09T00:36:43.368Z","mac":"E017085443A7","rssi":-37,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:43.393Z","mac":"C3000057B9E8","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FA06F29E5E"},{"timestamp":"2026-02-09T00:36:43.405Z","mac":"C3000057B9E7","rssi":-57,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4110710B4B6"},{"timestamp":"2026-02-09T00:36:43.683Z","mac":"D920A4A6D237","rssi":-55,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:43.729Z","mac":"F045AEE31DB4","rssi":-36,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:43.854Z","mac":"C3000057B9E6","rssi":-51,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AC06F50018"},{"timestamp":"2026-02-09T00:36:43.879Z","mac":"C3000057B9F4","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAA07BE43BA"},{"timestamp":"2026-02-09T00:36:43.884Z","mac":"C300003946AC","rssi":-62,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:43.887Z","mac":"C7AE561E38B7","rssi":-71,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:44.014Z","mac":"C300003947C4","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33004152F84BE"},{"timestamp":"2026-02-09T00:36:44.021Z","mac":"D54E908B7972","rssi":-59,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:44.033Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BA906BB3310"},{"timestamp":"2026-02-09T00:36:44.071Z","mac":"C3000057B9DC","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2D0776BBA8"},{"timestamp":"2026-02-09T00:36:44.152Z","mac":"C3000057B9DB","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2710000204664F07B0D478"},{"timestamp":"2026-02-09T00:36:44.187Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1503095336"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:43.173Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:43.345Z","type":"Gateway","mac":"AC233FC1DD31","nums":11},{"timestamp":"2026-02-09T00:36:43.369Z","mac":"C3000057B9DF","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895807944498"},{"timestamp":"2026-02-09T00:36:43.371Z","mac":"E017085443A7","rssi":-67,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:43.397Z","mac":"C3000057B9E8","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FA06F29E5E"},{"timestamp":"2026-02-09T00:36:43.409Z","mac":"C3000057B9E7","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4110710B4B6"},{"timestamp":"2026-02-09T00:36:43.447Z","mac":"C3000057B9DD","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82407922154"},{"timestamp":"2026-02-09T00:36:43.686Z","mac":"D920A4A6D237","rssi":-79,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:43.734Z","mac":"F045AEE31DB4","rssi":-65,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:44.024Z","mac":"D54E908B7972","rssi":-78,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:44.038Z","mac":"C3000057B9D4","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BA906BB3310"},{"timestamp":"2026-02-09T00:36:44.075Z","mac":"C3000057B9DC","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2D0776BBA8"},{"timestamp":"2026-02-09T00:36:44.369Z","mac":"E017085443A7","rssi":-67,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:43.353Z","type":"Gateway","mac":"AC233FC1DCEE","nums":1},{"timestamp":"2026-02-09T00:36:44.035Z","mac":"C3000057B9D4","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BA906BB3310"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:43.551Z","type":"Gateway","mac":"AC233FC1DCD2","nums":20},{"timestamp":"2026-02-09T00:36:43.692Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:43.698Z","mac":"E43883D93326","rssi":-85,"rawData":"1106B93D2E1D72D12592F94FD44ACDC5392109162A25E43883D93324"},{"timestamp":"2026-02-09T00:36:43.734Z","mac":"F045AEE31DB4","rssi":-46,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:44.007Z","mac":"A0D05BD2E2E5","rssi":-80,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:44.016Z","mac":"C300003947C4","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33004152F84BE"},{"timestamp":"2026-02-09T00:36:44.024Z","mac":"D54E908B7972","rssi":-74,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:44.038Z","mac":"C3000057B9D4","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BA906BB3310"},{"timestamp":"2026-02-09T00:36:44.076Z","mac":"C3000057B9DC","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2D0776BBA8"},{"timestamp":"2026-02-09T00:36:44.155Z","mac":"C3000057B9DB","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2710000204664F07B0D478"},{"timestamp":"2026-02-09T00:36:44.165Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:44.189Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1503095336"},{"timestamp":"2026-02-09T00:36:44.220Z","mac":"C3000057B9F1","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0506E55A78"},{"timestamp":"2026-02-09T00:36:44.316Z","mac":"A0D05BD2E2E5","rssi":-80,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:44.369Z","mac":"E017085443A7","rssi":-50,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:44.381Z","mac":"C3000057B9DF","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98959079444A2"},{"timestamp":"2026-02-09T00:36:44.397Z","mac":"C3000057B9E8","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FB06F29E68"},{"timestamp":"2026-02-09T00:36:44.418Z","mac":"C3000057B9E7","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4120710B4C0"},{"timestamp":"2026-02-09T00:36:44.454Z","mac":"C3000057B9DD","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C8250792215E"},{"timestamp":"2026-02-09T00:36:44.472Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:44.495Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1503095336"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:43.593Z","type":"Gateway","mac":"AC233FC1DD49","nums":1},{"timestamp":"2026-02-09T00:36:44.017Z","mac":"C300003947C4","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33004152F84BE"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:43.561Z","type":"Gateway","mac":"AC233FC1DD40","nums":2},{"timestamp":"2026-02-09T00:36:44.069Z","mac":"C3000057B9DC","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2D0776BBA8"},{"timestamp":"2026-02-09T00:36:44.147Z","mac":"C3000057B9DB","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2710000204664F07B0D478"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:43.596Z","type":"Gateway","mac":"AC233FC1DCCB","nums":5},{"timestamp":"2026-02-09T00:36:44.023Z","mac":"D54E908B7972","rssi":-82,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:44.037Z","mac":"C3000057B9D4","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BA906BB3310"},{"timestamp":"2026-02-09T00:36:44.076Z","mac":"C3000057B9DC","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2D0776BBA8"},{"timestamp":"2026-02-09T00:36:44.368Z","mac":"E017085443A7","rssi":-68,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:44.381Z","mac":"C3000057B9DF","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98959079444A2"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:43.643Z","type":"Gateway","mac":"AC233FC1DD51","nums":5},{"timestamp":"2026-02-09T00:36:43.879Z","mac":"C3000057B9F4","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAA07BE43BA"},{"timestamp":"2026-02-09T00:36:43.887Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:44.153Z","mac":"C3000057B9DB","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C2710000204664F07B0D478"},{"timestamp":"2026-02-09T00:36:44.187Z","mac":"C7AE561E38B7","rssi":-81,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1503095336"},{"timestamp":"2026-02-09T00:36:44.493Z","mac":"C7AE561E38B7","rssi":-81,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1503095336"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:43.691Z","type":"Gateway","mac":"AC233FC1DD3C","nums":8},{"timestamp":"2026-02-09T00:36:43.726Z","mac":"504C97555B00","rssi":-84,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:44.017Z","mac":"C300003947C4","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33004152F84BE"},{"timestamp":"2026-02-09T00:36:44.037Z","mac":"C3000057B9D4","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BA906BB3310"},{"timestamp":"2026-02-09T00:36:44.313Z","mac":"504C97555B00","rssi":-84,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:44.369Z","mac":"E017085443A7","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:44.397Z","mac":"C3000057B9E8","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FB06F29E68"},{"timestamp":"2026-02-09T00:36:44.503Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:44.691Z","mac":"D920A4A6D237","rssi":-82,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:43.863Z","type":"Gateway","mac":"AC233FC1DD55","nums":8},{"timestamp":"2026-02-09T00:36:44.017Z","mac":"C300003947C4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33004152F84BE"},{"timestamp":"2026-02-09T00:36:44.037Z","mac":"C3000057B9D4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BA906BB3310"},{"timestamp":"2026-02-09T00:36:44.313Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:44.369Z","mac":"E017085443A7","rssi":-82,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:44.397Z","mac":"C3000057B9E8","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FB06F29E68"},{"timestamp":"2026-02-09T00:36:44.698Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:44.736Z","mac":"F045AEE31DB4","rssi":-77,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:44.861Z","mac":"C3000057B9E6","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AD06F50022"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:43.770Z","type":"Gateway","mac":"AC233FC1DD50","nums":0}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:43.970Z","type":"Gateway","mac":"AC233FC1DD48","nums":4},{"timestamp":"2026-02-09T00:36:44.616Z","mac":"A0D05BD2E2E5","rssi":-80,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:44.636Z","mac":"C3000057B9D9","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFF3075D66D0"},{"timestamp":"2026-02-09T00:36:44.766Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:44.924Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:43.931Z","type":"Gateway","mac":"AC233FC1DD4B","nums":5},{"timestamp":"2026-02-09T00:36:44.038Z","mac":"C3000057B9D4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BA906BB3310"},{"timestamp":"2026-02-09T00:36:44.074Z","mac":"C3000057B9DC","rssi":-55,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2D0776BBA8"},{"timestamp":"2026-02-09T00:36:44.368Z","mac":"E017085443A7","rssi":-74,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:44.379Z","mac":"C3000057B9DF","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98959079444A2"},{"timestamp":"2026-02-09T00:36:44.646Z","mac":"C3000057B9D9","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFF3075D66D0"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:44.026Z","type":"Gateway","mac":"AC233FC1DD4E","nums":14},{"timestamp":"2026-02-09T00:36:44.022Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:44.076Z","mac":"C3000057B9DC","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2D0776BBA8"},{"timestamp":"2026-02-09T00:36:44.279Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:44.337Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:44.381Z","mac":"C3000057B9DF","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98959079444A2"},{"timestamp":"2026-02-09T00:36:44.593Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:44.645Z","mac":"C3000057B9D9","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFF3075D66D0"},{"timestamp":"2026-02-09T00:36:44.651Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:44.736Z","mac":"F045AEE31DB4","rssi":-74,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:44.742Z","mac":"C3000057B9F5","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DF07BA7820"},{"timestamp":"2026-02-09T00:36:44.800Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1503095336"},{"timestamp":"2026-02-09T00:36:44.880Z","mac":"C3000057B9F4","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAB07BE43C4"},{"timestamp":"2026-02-09T00:36:44.902Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:44.960Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:44.173Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:44.090Z","type":"Gateway","mac":"AC233FC1DCCD","nums":9},{"timestamp":"2026-02-09T00:36:44.152Z","mac":"C3000057B9DB","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2710000204664F07B0D478"},{"timestamp":"2026-02-09T00:36:44.187Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1503095336"},{"timestamp":"2026-02-09T00:36:44.217Z","mac":"C3000057B9F1","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0506E55A78"},{"timestamp":"2026-02-09T00:36:44.452Z","mac":"C3000057B9DD","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C8250792215E"},{"timestamp":"2026-02-09T00:36:44.492Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1503095336"},{"timestamp":"2026-02-09T00:36:44.798Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1503095336"},{"timestamp":"2026-02-09T00:36:44.859Z","mac":"C3000057B9E6","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AD06F50022"},{"timestamp":"2026-02-09T00:36:44.877Z","mac":"C3000057B9F4","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAB07BE43C4"},{"timestamp":"2026-02-09T00:36:45.071Z","mac":"C3000057B9DC","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2E0776BBB2"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:44.196Z","type":"Gateway","mac":"AC233FC1DCD1","nums":16},{"timestamp":"2026-02-09T00:36:44.364Z","mac":"E017085443A7","rssi":-43,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:44.375Z","mac":"C3000057B9DF","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98959079444A2"},{"timestamp":"2026-02-09T00:36:44.391Z","mac":"C3000057B9E8","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FB06F29E68"},{"timestamp":"2026-02-09T00:36:44.686Z","mac":"D920A4A6D237","rssi":-54,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:44.731Z","mac":"F045AEE31DB4","rssi":-36,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:44.737Z","mac":"C3000057B9F5","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1DF07BA7820"},{"timestamp":"2026-02-09T00:36:44.798Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1503095336"},{"timestamp":"2026-02-09T00:36:44.859Z","mac":"C3000057B9E6","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AD06F50022"},{"timestamp":"2026-02-09T00:36:44.877Z","mac":"C3000057B9F4","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAB07BE43C4"},{"timestamp":"2026-02-09T00:36:44.883Z","mac":"C300003946B1","rssi":-46,"rawData":"0201060303E1FF1116E1FFA10826B146390000C34D57423031"},{"timestamp":"2026-02-09T00:36:45.029Z","mac":"D54E908B7972","rssi":-58,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:45.041Z","mac":"C3000057B9D4","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAA06BB331A"},{"timestamp":"2026-02-09T00:36:45.071Z","mac":"C3000057B9DC","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2E0776BBB2"},{"timestamp":"2026-02-09T00:36:45.104Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:45.162Z","mac":"C3000057B9DB","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2710000204665007B0D482"},{"timestamp":"2026-02-09T00:36:45.221Z","mac":"C3000057B9F1","rssi":-48,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0606E55A82"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:44.332Z","type":"Gateway","mac":"AC233FC1DCEE","nums":2},{"timestamp":"2026-02-09T00:36:44.365Z","mac":"E017085443A7","rssi":-77,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:45.016Z","mac":"C300003947C4","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33005152F84C8"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:44.376Z","type":"Gateway","mac":"AC233FC1DD31","nums":4},{"timestamp":"2026-02-09T00:36:44.379Z","mac":"C3000057B9DF","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98959079444A2"},{"timestamp":"2026-02-09T00:36:44.395Z","mac":"C3000057B9E8","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FB06F29E68"},{"timestamp":"2026-02-09T00:36:44.646Z","mac":"C3000057B9D9","rssi":-51,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFF3075D66D0"},{"timestamp":"2026-02-09T00:36:44.689Z","mac":"D920A4A6D237","rssi":-84,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:44.513Z","type":"Gateway","mac":"AC233FC1DD49","nums":0}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:44.552Z","type":"Gateway","mac":"AC233FC1DD40","nums":1},{"timestamp":"2026-02-09T00:36:45.066Z","mac":"C3000057B9DC","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2E0776BBB2"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:44.586Z","type":"Gateway","mac":"AC233FC1DCCB","nums":2},{"timestamp":"2026-02-09T00:36:44.645Z","mac":"C3000057B9D9","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFF3075D66D0"},{"timestamp":"2026-02-09T00:36:45.034Z","mac":"D54E908B7972","rssi":-74,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:44.507Z","type":"Gateway","mac":"AC233FC1DCD2","nums":11},{"timestamp":"2026-02-09T00:36:44.617Z","mac":"E43883D93326","rssi":-84,"rawData":"1106B93D2E1D72D12592F94FD44ACDC5392109162A25E43883D93324"},{"timestamp":"2026-02-09T00:36:44.624Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:44.646Z","mac":"C3000057B9D9","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFF3075D66D0"},{"timestamp":"2026-02-09T00:36:44.691Z","mac":"D920A4A6D237","rssi":-67,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:45.021Z","mac":"C300003947C4","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33005152F84C8"},{"timestamp":"2026-02-09T00:36:45.034Z","mac":"D54E908B7972","rssi":-74,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:45.073Z","mac":"C3000057B9DC","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2E0776BBB2"},{"timestamp":"2026-02-09T00:36:45.084Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:45.106Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:45.164Z","mac":"C3000057B9DB","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C2710000204665007B0D482"},{"timestamp":"2026-02-09T00:36:45.223Z","mac":"C3000057B9F1","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0606E55A82"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:44.699Z","type":"Gateway","mac":"AC233FC1DD3C","nums":3},{"timestamp":"2026-02-09T00:36:44.698Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:45.289Z","mac":"504C97555B00","rssi":-77,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:45.673Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:44.692Z","type":"Gateway","mac":"AC233FC1DD51","nums":6},{"timestamp":"2026-02-09T00:36:44.798Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1503095336"},{"timestamp":"2026-02-09T00:36:45.072Z","mac":"C3000057B9DC","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2E0776BBB2"},{"timestamp":"2026-02-09T00:36:45.104Z","mac":"C7AE561E38B7","rssi":-81,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:45.162Z","mac":"C3000057B9DB","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2710000204665007B0D482"},{"timestamp":"2026-02-09T00:36:45.400Z","mac":"C3000057B9DF","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895A079444AC"},{"timestamp":"2026-02-09T00:36:45.408Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:44.770Z","type":"Gateway","mac":"AC233FC1DD50","nums":0}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:44.868Z","type":"Gateway","mac":"AC233FC1DD55","nums":5},{"timestamp":"2026-02-09T00:36:44.896Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:45.224Z","mac":"C3000057B9F1","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0606E55A82"},{"timestamp":"2026-02-09T00:36:45.289Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:45.732Z","mac":"F045AEE31DB4","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:45.751Z","mac":"C3000057B9F5","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E007BA782A"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:44.950Z","type":"Gateway","mac":"AC233FC1DD4B","nums":1},{"timestamp":"2026-02-09T00:36:45.890Z","mac":"C300003946AC","rssi":-71,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:44.930Z","type":"Gateway","mac":"AC233FC1DD48","nums":6},{"timestamp":"2026-02-09T00:36:45.075Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:45.393Z","mac":"C3000057B9DF","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895A079444AC"},{"timestamp":"2026-02-09T00:36:45.547Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:45.702Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:45.742Z","mac":"C3000057B9F5","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E007BA782A"},{"timestamp":"2026-02-09T00:36:45.860Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:45.067Z","type":"Gateway","mac":"AC233FC1DD4E","nums":9},{"timestamp":"2026-02-09T00:36:45.215Z","mac":"E6E749BA2D00","rssi":-76,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:45.223Z","mac":"C3000057B9F1","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0606E55A82"},{"timestamp":"2026-02-09T00:36:45.269Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:45.530Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:45.583Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:45.845Z","mac":"E6E749BA2D00","rssi":-76,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:45.886Z","mac":"C3000057B9F4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAC07BE43CE"},{"timestamp":"2026-02-09T00:36:45.891Z","mac":"C300003946AC","rssi":-80,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:46.014Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1703095336"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:45.077Z","type":"Gateway","mac":"AC233FC1DCCD","nums":8},{"timestamp":"2026-02-09T00:36:45.161Z","mac":"C3000057B9DB","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2710000204665007B0D482"},{"timestamp":"2026-02-09T00:36:45.396Z","mac":"C3000057B9E8","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FC06F29E72"},{"timestamp":"2026-02-09T00:36:45.408Z","mac":"C7AE561E38B7","rssi":-84,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:45.424Z","mac":"C3000057B9E7","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4130710B4CA"},{"timestamp":"2026-02-09T00:36:45.461Z","mac":"C3000057B9DD","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82607922168"},{"timestamp":"2026-02-09T00:36:45.729Z","mac":"F045AEE31DB4","rssi":-76,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:45.748Z","mac":"C3000057B9F5","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E007BA782A"},{"timestamp":"2026-02-09T00:36:46.027Z","mac":"C300003947C4","rssi":-85,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33006152F84D2"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:45.173Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:45.229Z","type":"Gateway","mac":"AC233FC1DCD1","nums":8},{"timestamp":"2026-02-09T00:36:45.862Z","mac":"C3000057B9E6","rssi":-50,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AE06F5002C"},{"timestamp":"2026-02-09T00:36:45.881Z","mac":"C3000057B9F4","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAC07BE43CE"},{"timestamp":"2026-02-09T00:36:45.886Z","mac":"C300003946AC","rssi":-78,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:46.012Z","mac":"C7AE561E38B7","rssi":-71,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1703095336"},{"timestamp":"2026-02-09T00:36:46.027Z","mac":"C300003947C4","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33006152F84D2"},{"timestamp":"2026-02-09T00:36:46.033Z","mac":"D54E908B7972","rssi":-58,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:46.056Z","mac":"C3000057B9D4","rssi":-54,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAB06BB3324"},{"timestamp":"2026-02-09T00:36:46.232Z","mac":"C3000057B9F1","rssi":-44,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0706E55A8C"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:45.395Z","type":"Gateway","mac":"AC233FC1DD31","nums":3},{"timestamp":"2026-02-09T00:36:45.887Z","mac":"C3000057B9F4","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAC07BE43CE"},{"timestamp":"2026-02-09T00:36:46.169Z","mac":"C3000057B9DB","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2710000204665107B0D48C"},{"timestamp":"2026-02-09T00:36:46.236Z","mac":"C3000057B9F1","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0706E55A8C"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:45.313Z","type":"Gateway","mac":"AC233FC1DCEE","nums":2},{"timestamp":"2026-02-09T00:36:46.027Z","mac":"C300003947C4","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33006152F84D2"},{"timestamp":"2026-02-09T00:36:46.055Z","mac":"C3000057B9D4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAB06BB3324"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:45.571Z","type":"Gateway","mac":"AC233FC1DD40","nums":1},{"timestamp":"2026-02-09T00:36:46.356Z","mac":"E017085443A7","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:45.535Z","type":"Gateway","mac":"AC233FC1DCCB","nums":5},{"timestamp":"2026-02-09T00:36:45.866Z","mac":"C3000057B9E6","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AE06F5002C"},{"timestamp":"2026-02-09T00:36:45.886Z","mac":"C3000057B9F4","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAC07BE43CE"},{"timestamp":"2026-02-09T00:36:45.890Z","mac":"C300003946AC","rssi":-73,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:46.168Z","mac":"C3000057B9DB","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2710000204665107B0D48C"},{"timestamp":"2026-02-09T00:36:46.238Z","mac":"C3000057B9F1","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0706E55A8C"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:45.522Z","type":"Gateway","mac":"AC233FC1DCD2","nums":12},{"timestamp":"2026-02-09T00:36:45.652Z","mac":"C3000057B9D9","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF4075D66DA"},{"timestamp":"2026-02-09T00:36:45.867Z","mac":"C3000057B9E6","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AE06F5002C"},{"timestamp":"2026-02-09T00:36:45.887Z","mac":"C3000057B9F4","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAC07BE43CE"},{"timestamp":"2026-02-09T00:36:45.891Z","mac":"C300003946AC","rssi":-53,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:46.169Z","mac":"C3000057B9DB","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2710000204665107B0D48C"},{"timestamp":"2026-02-09T00:36:46.237Z","mac":"C3000057B9F1","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0706E55A8C"},{"timestamp":"2026-02-09T00:36:46.317Z","mac":"C7AE561E38B7","rssi":-78,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1703095336"},{"timestamp":"2026-02-09T00:36:46.363Z","mac":"E017085443A7","rssi":-51,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:46.402Z","mac":"C3000057B9E8","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FD06F29E7C"},{"timestamp":"2026-02-09T00:36:46.408Z","mac":"C3000057B9DF","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895B079444B6"},{"timestamp":"2026-02-09T00:36:46.440Z","mac":"C3000057B9E7","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4140710B4D4"},{"timestamp":"2026-02-09T00:36:46.473Z","mac":"C3000057B9DD","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82707922172"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:45.512Z","type":"Gateway","mac":"AC233FC1DD49","nums":3},{"timestamp":"2026-02-09T00:36:45.866Z","mac":"C3000057B9E6","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AE06F5002C"},{"timestamp":"2026-02-09T00:36:46.363Z","mac":"E017085443A7","rssi":-78,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:46.402Z","mac":"C3000057B9E8","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FD06F29E7C"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:45.679Z","type":"Gateway","mac":"AC233FC1DD3C","nums":6},{"timestamp":"2026-02-09T00:36:45.866Z","mac":"C3000057B9E6","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AE06F5002C"},{"timestamp":"2026-02-09T00:36:46.249Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:46.402Z","mac":"C3000057B9E8","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FD06F29E7C"},{"timestamp":"2026-02-09T00:36:46.446Z","mac":"504C97555B00","rssi":-85,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:46.636Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:46.703Z","mac":"D920A4A6D237","rssi":-82,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:45.714Z","type":"Gateway","mac":"AC233FC1DD51","nums":5},{"timestamp":"2026-02-09T00:36:45.711Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:46.012Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1703095336"},{"timestamp":"2026-02-09T00:36:46.315Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1703095336"},{"timestamp":"2026-02-09T00:36:46.362Z","mac":"E017085443A7","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:46.623Z","mac":"C7AE561E38B7","rssi":-81,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1703095336"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:45.770Z","type":"Gateway","mac":"AC233FC1DD50","nums":5},{"timestamp":"2026-02-09T00:36:45.774Z","mac":"3868A460B93E","rssi":-80,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:46.076Z","mac":"C3000057B9DC","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC2F0776BBBC"},{"timestamp":"2026-02-09T00:36:46.077Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:46.386Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:46.690Z","mac":"3868A460B93E","rssi":-80,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:45.847Z","type":"Gateway","mac":"AC233FC1DD55","nums":7},{"timestamp":"2026-02-09T00:36:45.865Z","mac":"504C97555B00","rssi":-83,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:45.866Z","mac":"C3000057B9E6","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4AE06F5002C"},{"timestamp":"2026-02-09T00:36:45.891Z","mac":"C300003946AC","rssi":-83,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:46.238Z","mac":"C3000057B9F1","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0706E55A8C"},{"timestamp":"2026-02-09T00:36:46.447Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:46.739Z","mac":"F045AEE31DB4","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:46.837Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:45.895Z","type":"Gateway","mac":"AC233FC1DD4B","nums":4},{"timestamp":"2026-02-09T00:36:46.236Z","mac":"C3000057B9F1","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0706E55A8C"},{"timestamp":"2026-02-09T00:36:46.473Z","mac":"C3000057B9DD","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82707922172"},{"timestamp":"2026-02-09T00:36:46.740Z","mac":"F045AEE31DB4","rssi":-73,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:46.762Z","mac":"C3000057B9F5","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E107BA7834"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:45.960Z","type":"Gateway","mac":"AC233FC1DD48","nums":7},{"timestamp":"2026-02-09T00:36:46.012Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:46.321Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:46.399Z","mac":"C3000057B9DF","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895B079444B6"},{"timestamp":"2026-02-09T00:36:46.472Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:46.626Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:46.752Z","mac":"C3000057B9F5","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E107BA7834"},{"timestamp":"2026-02-09T00:36:46.777Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:46.035Z","type":"Gateway","mac":"AC233FC1DCCD","nums":11},{"timestamp":"2026-02-09T00:36:46.033Z","mac":"D54E908B7972","rssi":-85,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:46.055Z","mac":"C3000057B9D4","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAB06BB3324"},{"timestamp":"2026-02-09T00:36:46.315Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1703095336"},{"timestamp":"2026-02-09T00:36:46.360Z","mac":"E017085443A7","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:46.375Z","mac":"E43883D93326","rssi":-86,"rawData":"1106B93D2E1D72D12592F94FD44ACDC5392109162A25E43883D93324"},{"timestamp":"2026-02-09T00:36:46.400Z","mac":"C3000057B9E8","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FD06F29E7C"},{"timestamp":"2026-02-09T00:36:46.405Z","mac":"C3000057B9DF","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895B079444B6"},{"timestamp":"2026-02-09T00:36:46.623Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1703095336"},{"timestamp":"2026-02-09T00:36:46.661Z","mac":"C3000057B9D9","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFF5075D66E4"},{"timestamp":"2026-02-09T00:36:46.700Z","mac":"D920A4A6D237","rssi":-82,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:46.924Z","mac":"C7AE561E38B7","rssi":-83,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:46.021Z","type":"Gateway","mac":"AC233FC1DD4E","nums":12},{"timestamp":"2026-02-09T00:36:46.165Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:46.168Z","mac":"C3000057B9DB","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2710000204665107B0D48C"},{"timestamp":"2026-02-09T00:36:46.472Z","mac":"C3000057B9DD","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82707922172"},{"timestamp":"2026-02-09T00:36:46.479Z","mac":"E6E749BA2D00","rssi":-78,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:46.625Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1703095336"},{"timestamp":"2026-02-09T00:36:46.664Z","mac":"C3000057B9D9","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFF5075D66E4"},{"timestamp":"2026-02-09T00:36:46.761Z","mac":"C3000057B9F5","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E107BA7834"},{"timestamp":"2026-02-09T00:36:46.791Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:46.885Z","mac":"C3000057B9F4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAD07BE43D8"},{"timestamp":"2026-02-09T00:36:46.926Z","mac":"C7AE561E38B7","rssi":-75,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:47.007Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:47.044Z","mac":"C300003947C4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C33007152F84DC"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:46.173Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:46.239Z","type":"Gateway","mac":"AC233FC1DCD1","nums":9},{"timestamp":"2026-02-09T00:36:46.438Z","mac":"C3000057B9E7","rssi":-57,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4140710B4D4"},{"timestamp":"2026-02-09T00:36:46.736Z","mac":"F045AEE31DB4","rssi":-37,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:46.759Z","mac":"C3000057B9F5","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E107BA7834"},{"timestamp":"2026-02-09T00:36:46.881Z","mac":"C3000057B9F4","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAD07BE43D8"},{"timestamp":"2026-02-09T00:36:46.924Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:47.036Z","mac":"D54E908B7972","rssi":-59,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:47.041Z","mac":"C300003947C4","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C33007152F84DC"},{"timestamp":"2026-02-09T00:36:47.058Z","mac":"C3000057B9D4","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAC06BB332E"},{"timestamp":"2026-02-09T00:36:47.178Z","mac":"C3000057B9DB","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C2710000204665207B0D496"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:46.353Z","type":"Gateway","mac":"AC233FC1DCEE","nums":1},{"timestamp":"2026-02-09T00:36:47.041Z","mac":"C300003947C4","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C33007152F84DC"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:46.335Z","type":"Gateway","mac":"AC233FC1DD31","nums":7},{"timestamp":"2026-02-09T00:36:46.442Z","mac":"C3000057B9E7","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4140710B4D4"},{"timestamp":"2026-02-09T00:36:46.473Z","mac":"C3000057B9DD","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82707922172"},{"timestamp":"2026-02-09T00:36:46.740Z","mac":"F045AEE31DB4","rssi":-66,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:46.762Z","mac":"C3000057B9F5","rssi":-38,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E107BA7834"},{"timestamp":"2026-02-09T00:36:47.062Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAC06BB332E"},{"timestamp":"2026-02-09T00:36:47.082Z","mac":"C3000057B9DC","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC300776BBC6"},{"timestamp":"2026-02-09T00:36:47.365Z","mac":"E017085443A7","rssi":-67,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:46.572Z","type":"Gateway","mac":"AC233FC1DCD2","nums":11},{"timestamp":"2026-02-09T00:36:47.082Z","mac":"C3000057B9DC","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC300776BBC6"},{"timestamp":"2026-02-09T00:36:47.182Z","mac":"C3000057B9DB","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2710000204665207B0D496"},{"timestamp":"2026-02-09T00:36:47.229Z","mac":"C7AE561E38B7","rssi":-78,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:47.239Z","mac":"C3000057B9F1","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0806E55A96"},{"timestamp":"2026-02-09T00:36:47.252Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:47.364Z","mac":"E017085443A7","rssi":-52,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.409Z","mac":"C3000057B9E8","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FE06F29E86"},{"timestamp":"2026-02-09T00:36:47.422Z","mac":"C3000057B9DF","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895C079444C0"},{"timestamp":"2026-02-09T00:36:47.457Z","mac":"C3000057B9E7","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4150710B4DE"},{"timestamp":"2026-02-09T00:36:47.482Z","mac":"C3000057B9DD","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C8280792217C"},{"timestamp":"2026-02-09T00:36:47.529Z","mac":"C7AE561E38B7","rssi":-80,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:46.604Z","type":"Gateway","mac":"AC233FC1DD49","nums":1},{"timestamp":"2026-02-09T00:36:47.044Z","mac":"C300003947C4","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C33007152F84DC"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:46.561Z","type":"Gateway","mac":"AC233FC1DD40","nums":3},{"timestamp":"2026-02-09T00:36:47.075Z","mac":"C3000057B9DC","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC300776BBC6"},{"timestamp":"2026-02-09T00:36:47.174Z","mac":"C3000057B9DB","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C2710000204665207B0D496"},{"timestamp":"2026-02-09T00:36:47.356Z","mac":"E017085443A7","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:46.535Z","type":"Gateway","mac":"AC233FC1DCCB","nums":3},{"timestamp":"2026-02-09T00:36:46.761Z","mac":"C3000057B9F5","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E107BA7834"},{"timestamp":"2026-02-09T00:36:47.082Z","mac":"C3000057B9DC","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC300776BBC6"},{"timestamp":"2026-02-09T00:36:47.184Z","mac":"C3000057B9DB","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2710000204665207B0D496"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:46.629Z","type":"Gateway","mac":"AC233FC1DD51","nums":4},{"timestamp":"2026-02-09T00:36:46.663Z","mac":"C3000057B9D9","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFF5075D66E4"},{"timestamp":"2026-02-09T00:36:46.924Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:47.227Z","mac":"C7AE561E38B7","rssi":-81,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:47.527Z","mac":"C7AE561E38B7","rssi":-82,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:46.709Z","type":"Gateway","mac":"AC233FC1DD3C","nums":5},{"timestamp":"2026-02-09T00:36:46.837Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:47.223Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:47.364Z","mac":"E017085443A7","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.408Z","mac":"C3000057B9E8","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FE06F29E86"},{"timestamp":"2026-02-09T00:36:47.419Z","mac":"504C97555B00","rssi":-77,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:46.843Z","type":"Gateway","mac":"AC233FC1DD55","nums":8},{"timestamp":"2026-02-09T00:36:47.044Z","mac":"C300003947C4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C33007152F84DC"},{"timestamp":"2026-02-09T00:36:47.061Z","mac":"C3000057B9D4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAC06BB332E"},{"timestamp":"2026-02-09T00:36:47.364Z","mac":"E017085443A7","rssi":-72,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.409Z","mac":"C3000057B9E8","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FE06F29E86"},{"timestamp":"2026-02-09T00:36:47.419Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:47.609Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:47.735Z","mac":"F045AEE31DB4","rssi":-77,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.885Z","mac":"C3000057B9F4","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAE07BE43E2"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:46.980Z","type":"Gateway","mac":"AC233FC1DD48","nums":5},{"timestamp":"2026-02-09T00:36:47.244Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:47.549Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:47.701Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:47.855Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:47.876Z","mac":"C3000057B9F4","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAE07BE43E2"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:46.791Z","type":"Gateway","mac":"AC233FC1DD50","nums":2},{"timestamp":"2026-02-09T00:36:47.007Z","mac":"3868A460B93E","rssi":-80,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:47.622Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:46.961Z","type":"Gateway","mac":"AC233FC1DD4B","nums":8},{"timestamp":"2026-02-09T00:36:47.083Z","mac":"C3000057B9DC","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC300776BBC6"},{"timestamp":"2026-02-09T00:36:47.365Z","mac":"E017085443A7","rssi":-83,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.420Z","mac":"C3000057B9DF","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895C079444C0"},{"timestamp":"2026-02-09T00:36:47.455Z","mac":"C3000057B9E7","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4150710B4DE"},{"timestamp":"2026-02-09T00:36:47.678Z","mac":"C3000057B9D9","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF6075D66EE"},{"timestamp":"2026-02-09T00:36:47.708Z","mac":"D920A4A6D237","rssi":-77,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:47.733Z","mac":"F045AEE31DB4","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.765Z","mac":"C3000057B9F5","rssi":-55,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E207BA783E"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:47.050Z","type":"Gateway","mac":"AC233FC1DD4E","nums":14},{"timestamp":"2026-02-09T00:36:47.059Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:47.081Z","mac":"C3000057B9DC","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC300776BBC6"},{"timestamp":"2026-02-09T00:36:47.368Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:47.407Z","mac":"C3000057B9E8","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FE06F29E86"},{"timestamp":"2026-02-09T00:36:47.422Z","mac":"C3000057B9DF","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895C079444C0"},{"timestamp":"2026-02-09T00:36:47.677Z","mac":"C3000057B9D9","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF6075D66EE"},{"timestamp":"2026-02-09T00:36:47.678Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:47.734Z","mac":"F045AEE31DB4","rssi":-72,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.767Z","mac":"C3000057B9F5","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E207BA783E"},{"timestamp":"2026-02-09T00:36:47.837Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:47.885Z","mac":"C3000057B9F4","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAE07BE43E2"},{"timestamp":"2026-02-09T00:36:47.893Z","mac":"C300003946AC","rssi":-83,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:47.962Z","mac":"E6E749BA2D00","rssi":-76,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:47.999Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:47.031Z","type":"Gateway","mac":"AC233FC1DCCD","nums":7},{"timestamp":"2026-02-09T00:36:47.236Z","mac":"C3000057B9F1","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0806E55A96"},{"timestamp":"2026-02-09T00:36:47.527Z","mac":"C7AE561E38B7","rssi":-84,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:47.834Z","mac":"C7AE561E38B7","rssi":-84,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:47.860Z","mac":"C3000057B9E6","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B006F50040"},{"timestamp":"2026-02-09T00:36:47.882Z","mac":"C3000057B9F4","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAE07BE43E2"},{"timestamp":"2026-02-09T00:36:47.891Z","mac":"C300003946AC","rssi":-76,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:47.922Z","mac":"E43883D93326","rssi":-85,"rawData":"1106B93D2E1D72D12592F94FD44ACDC5392109162A25E43883D93324"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:47.186Z","type":"Gateway","mac":"AC233FC1DCD1","nums":15},{"timestamp":"2026-02-09T00:36:47.362Z","mac":"E017085443A7","rssi":-35,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.403Z","mac":"C3000057B9E8","rssi":-57,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FE06F29E86"},{"timestamp":"2026-02-09T00:36:47.417Z","mac":"C3000057B9DF","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895C079444C0"},{"timestamp":"2026-02-09T00:36:47.451Z","mac":"C3000057B9E7","rssi":-50,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4150710B4DE"},{"timestamp":"2026-02-09T00:36:47.704Z","mac":"D920A4A6D237","rssi":-54,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:47.729Z","mac":"F045AEE31DB4","rssi":-35,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.761Z","mac":"C3000057B9F5","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E207BA783E"},{"timestamp":"2026-02-09T00:36:47.834Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:47.860Z","mac":"C3000057B9E6","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B006F50040"},{"timestamp":"2026-02-09T00:36:47.883Z","mac":"C3000057B9F4","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAE07BE43E2"},{"timestamp":"2026-02-09T00:36:48.039Z","mac":"D54E908B7972","rssi":-58,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:48.050Z","mac":"C300003947C4","rssi":-54,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C33008152F84E6"},{"timestamp":"2026-02-09T00:36:48.067Z","mac":"C3000057B9D4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAD06BB3338"},{"timestamp":"2026-02-09T00:36:48.081Z","mac":"C3000057B9DC","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC310776BBD0"},{"timestamp":"2026-02-09T00:36:48.136Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1903095336"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:47.173Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:47.371Z","type":"Gateway","mac":"AC233FC1DD31","nums":9},{"timestamp":"2026-02-09T00:36:47.678Z","mac":"C3000057B9D9","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF6075D66EE"},{"timestamp":"2026-02-09T00:36:47.708Z","mac":"D920A4A6D237","rssi":-79,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:47.733Z","mac":"F045AEE31DB4","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.765Z","mac":"C3000057B9F5","rssi":-30,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E207BA783E"},{"timestamp":"2026-02-09T00:36:48.042Z","mac":"D54E908B7972","rssi":-84,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:48.053Z","mac":"C300003947C4","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C33008152F84E6"},{"timestamp":"2026-02-09T00:36:48.071Z","mac":"C3000057B9D4","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAD06BB3338"},{"timestamp":"2026-02-09T00:36:48.085Z","mac":"C3000057B9DC","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC310776BBD0"},{"timestamp":"2026-02-09T00:36:48.368Z","mac":"E017085443A7","rssi":-65,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:47.343Z","type":"Gateway","mac":"AC233FC1DCEE","nums":4},{"timestamp":"2026-02-09T00:36:47.451Z","mac":"C3000057B9E7","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4150710B4DE"},{"timestamp":"2026-02-09T00:36:47.860Z","mac":"C3000057B9E6","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B006F50040"},{"timestamp":"2026-02-09T00:36:48.067Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAD06BB3338"},{"timestamp":"2026-02-09T00:36:48.364Z","mac":"E017085443A7","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:47.537Z","type":"Gateway","mac":"AC233FC1DCD2","nums":18},{"timestamp":"2026-02-09T00:36:47.709Z","mac":"D920A4A6D237","rssi":-66,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:47.734Z","mac":"F045AEE31DB4","rssi":-46,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.767Z","mac":"C3000057B9F5","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E207BA783E"},{"timestamp":"2026-02-09T00:36:48.044Z","mac":"D54E908B7972","rssi":-73,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:48.055Z","mac":"C300003947C4","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C33008152F84E6"},{"timestamp":"2026-02-09T00:36:48.072Z","mac":"C3000057B9D4","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAD06BB3338"},{"timestamp":"2026-02-09T00:36:48.084Z","mac":"C3000057B9DC","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC310776BBD0"},{"timestamp":"2026-02-09T00:36:48.139Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1903095336"},{"timestamp":"2026-02-09T00:36:48.165Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:48.187Z","mac":"C3000057B9DB","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C2710000204665307B0D4A0"},{"timestamp":"2026-02-09T00:36:48.253Z","mac":"C3000057B9F1","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0906E55AA0"},{"timestamp":"2026-02-09T00:36:48.369Z","mac":"E017085443A7","rssi":-50,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:48.411Z","mac":"C3000057B9E8","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF6FF06F29E90"},{"timestamp":"2026-02-09T00:36:48.440Z","mac":"C3000057B9DF","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895D079444CA"},{"timestamp":"2026-02-09T00:36:48.444Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1903095336"},{"timestamp":"2026-02-09T00:36:48.463Z","mac":"C3000057B9E7","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4160710B4E8"},{"timestamp":"2026-02-09T00:36:48.471Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:48.486Z","mac":"C3000057B9DD","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82907922186"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:47.543Z","type":"Gateway","mac":"AC233FC1DD49","nums":0}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:47.586Z","type":"Gateway","mac":"AC233FC1DCCB","nums":5},{"timestamp":"2026-02-09T00:36:47.708Z","mac":"D920A4A6D237","rssi":-81,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:47.734Z","mac":"F045AEE31DB4","rssi":-67,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:47.767Z","mac":"C3000057B9F5","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E207BA783E"},{"timestamp":"2026-02-09T00:36:48.044Z","mac":"D54E908B7972","rssi":-74,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:48.086Z","mac":"C3000057B9DC","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC310776BBD0"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:47.631Z","type":"Gateway","mac":"AC233FC1DD51","nums":5},{"timestamp":"2026-02-09T00:36:47.835Z","mac":"C7AE561E38B7","rssi":-81,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:47.884Z","mac":"C3000057B9F4","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAE07BE43E2"},{"timestamp":"2026-02-09T00:36:48.137Z","mac":"C7AE561E38B7","rssi":-81,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1903095336"},{"timestamp":"2026-02-09T00:36:48.185Z","mac":"C3000057B9DB","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2710000204665307B0D4A0"},{"timestamp":"2026-02-09T00:36:48.442Z","mac":"C7AE561E38B7","rssi":-81,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1903095336"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:47.562Z","type":"Gateway","mac":"AC233FC1DD40","nums":3},{"timestamp":"2026-02-09T00:36:47.759Z","mac":"C3000057B9F5","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2410000206F1E207BA783E"},{"timestamp":"2026-02-09T00:36:48.077Z","mac":"C3000057B9DC","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC310776BBD0"},{"timestamp":"2026-02-09T00:36:48.179Z","mac":"C3000057B9DB","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2710000204665307B0D4A0"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:47.715Z","type":"Gateway","mac":"AC233FC1DD3C","nums":4},{"timestamp":"2026-02-09T00:36:47.734Z","mac":"F045AEE31DB4","rssi":-77,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:48.073Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAD06BB3338"},{"timestamp":"2026-02-09T00:36:48.369Z","mac":"E017085443A7","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:48.398Z","mac":"504C97555B00","rssi":-77,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:47.892Z","type":"Gateway","mac":"AC233FC1DD55","nums":8},{"timestamp":"2026-02-09T00:36:48.003Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:48.055Z","mac":"C300003947C4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C33008152F84E6"},{"timestamp":"2026-02-09T00:36:48.370Z","mac":"E017085443A7","rssi":-83,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:48.464Z","mac":"C3000057B9E7","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4160710B4E8"},{"timestamp":"2026-02-09T00:36:48.592Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:48.733Z","mac":"F045AEE31DB4","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:48.776Z","mac":"C3000057B9F5","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E307BA7848"},{"timestamp":"2026-02-09T00:36:48.867Z","mac":"C3000057B9E6","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B106F5004A"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:47.820Z","type":"Gateway","mac":"AC233FC1DD50","nums":3},{"timestamp":"2026-02-09T00:36:47.931Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:48.238Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:48.548Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:47.881Z","type":"Gateway","mac":"AC233FC1DD48","nums":5},{"timestamp":"2026-02-09T00:36:48.156Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:48.462Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:48.477Z","mac":"C3000057B9DD","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82907922186"},{"timestamp":"2026-02-09T00:36:48.766Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:48.767Z","mac":"C3000057B9F5","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E307BA7848"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:47.971Z","type":"Gateway","mac":"AC233FC1DD4B","nums":4},{"timestamp":"2026-02-09T00:36:48.085Z","mac":"C3000057B9DC","rssi":-55,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC310776BBD0"},{"timestamp":"2026-02-09T00:36:48.368Z","mac":"E017085443A7","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:48.684Z","mac":"C3000057B9D9","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF7075D66F8"},{"timestamp":"2026-02-09T00:36:48.887Z","mac":"C300003946B1","rssi":-79,"rawData":"0201060303E1FF1116E1FFA10826B146390000C34D57423031"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:48.107Z","type":"Gateway","mac":"AC233FC1DD4E","nums":6},{"timestamp":"2026-02-09T00:36:48.274Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:48.581Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:48.623Z","mac":"0BC8DA14CEAC","rssi":-83,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:48.892Z","mac":"C3000057B9F4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAF07BE43EC"},{"timestamp":"2026-02-09T00:36:48.894Z","mac":"E6E749BA2D00","rssi":-76,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:49.045Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:48.120Z","type":"Gateway","mac":"AC233FC1DCCD","nums":6},{"timestamp":"2026-02-09T00:36:48.136Z","mac":"C7AE561E38B7","rssi":-84,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1903095336"},{"timestamp":"2026-02-09T00:36:48.183Z","mac":"C3000057B9DB","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2710000204665307B0D4A0"},{"timestamp":"2026-02-09T00:36:48.461Z","mac":"C3000057B9E7","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4160710B4E8"},{"timestamp":"2026-02-09T00:36:48.483Z","mac":"C3000057B9DD","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82907922186"},{"timestamp":"2026-02-09T00:36:48.774Z","mac":"C3000057B9F5","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E307BA7848"},{"timestamp":"2026-02-09T00:36:49.072Z","mac":"C3000057B9D4","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C570F0002000BAE06BB3342"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:48.173Z","type":"Gateway","mac":"AC233FC1DCD3","nums":1},{"timestamp":"2026-02-09T00:36:49.090Z","mac":"C3000057B9DC","rssi":-85,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC320776BBDA"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:48.240Z","type":"Gateway","mac":"AC233FC1DCD1","nums":13},{"timestamp":"2026-02-09T00:36:48.364Z","mac":"E017085443A7","rssi":-42,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:48.681Z","mac":"C3000057B9D9","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF7075D66F8"},{"timestamp":"2026-02-09T00:36:48.711Z","mac":"D920A4A6D237","rssi":-53,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:48.730Z","mac":"F045AEE31DB4","rssi":-33,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:48.745Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1903095336"},{"timestamp":"2026-02-09T00:36:48.864Z","mac":"C3000057B9E6","rssi":-53,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B106F5004A"},{"timestamp":"2026-02-09T00:36:48.883Z","mac":"C300003946B1","rssi":-46,"rawData":"0201060303E1FF1116E1FFA10826B146390000C34D57423031"},{"timestamp":"2026-02-09T00:36:48.893Z","mac":"C3000057B9F4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAF07BE43EC"},{"timestamp":"2026-02-09T00:36:49.041Z","mac":"D54E908B7972","rssi":-57,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:49.045Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:49.061Z","mac":"C300003947C4","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33009152F84F0"},{"timestamp":"2026-02-09T00:36:49.072Z","mac":"C3000057B9D4","rssi":-55,"rawData":"0201060303AAFE1116AAFE20000C570F0002000BAE06BB3342"},{"timestamp":"2026-02-09T00:36:49.090Z","mac":"C3000057B9DC","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC320776BBDA"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:48.374Z","type":"Gateway","mac":"AC233FC1DD31","nums":4},{"timestamp":"2026-02-09T00:36:48.684Z","mac":"C3000057B9D9","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF7075D66F8"},{"timestamp":"2026-02-09T00:36:48.897Z","mac":"C3000057B9F4","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAF07BE43EC"},{"timestamp":"2026-02-09T00:36:49.196Z","mac":"C3000057B9DB","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2710000204665407B0D4AA"},{"timestamp":"2026-02-09T00:36:49.255Z","mac":"C3000057B9F1","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0A06E55AAA"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:48.370Z","type":"Gateway","mac":"AC233FC1DCEE","nums":1},{"timestamp":"2026-02-09T00:36:49.072Z","mac":"C3000057B9D4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C570F0002000BAE06BB3342"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:48.495Z","type":"Gateway","mac":"AC233FC1DCD2","nums":16},{"timestamp":"2026-02-09T00:36:48.686Z","mac":"C3000057B9D9","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF7075D66F8"},{"timestamp":"2026-02-09T00:36:48.713Z","mac":"D920A4A6D237","rssi":-79,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:49.043Z","mac":"D54E908B7972","rssi":-71,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:49.048Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:49.063Z","mac":"C300003947C4","rssi":-57,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33009152F84F0"},{"timestamp":"2026-02-09T00:36:49.074Z","mac":"C3000057B9D4","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C570F0002000BAE06BB3342"},{"timestamp":"2026-02-09T00:36:49.092Z","mac":"C3000057B9DC","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC320776BBDA"},{"timestamp":"2026-02-09T00:36:49.195Z","mac":"C3000057B9DB","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C2710000204665407B0D4AA"},{"timestamp":"2026-02-09T00:36:49.257Z","mac":"C3000057B9F1","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0A06E55AAA"},{"timestamp":"2026-02-09T00:36:49.351Z","mac":"C7AE561E38B7","rssi":-78,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:49.369Z","mac":"E017085443A7","rssi":-47,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:49.391Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:49.405Z","mac":"C3000057B9E8","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70006F29E9A"},{"timestamp":"2026-02-09T00:36:49.452Z","mac":"C3000057B9DF","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895E079444D4"},{"timestamp":"2026-02-09T00:36:49.468Z","mac":"C3000057B9E7","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4170710B4F2"},{"timestamp":"2026-02-09T00:36:49.499Z","mac":"C3000057B9DD","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82A07922190"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:48.543Z","type":"Gateway","mac":"AC233FC1DD49","nums":4},{"timestamp":"2026-02-09T00:36:48.886Z","mac":"C300003946B1","rssi":-86,"rawData":"0201060303E1FF1116E1FFA10826B146390000C34D57423031"},{"timestamp":"2026-02-09T00:36:49.064Z","mac":"C300003947C4","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2A100002C33009152F84F0"},{"timestamp":"2026-02-09T00:36:49.370Z","mac":"E017085443A7","rssi":-78,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:49.404Z","mac":"C3000057B9E8","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70006F29E9A"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:48.581Z","type":"Gateway","mac":"AC233FC1DD40","nums":1},{"timestamp":"2026-02-09T00:36:49.188Z","mac":"C3000057B9DB","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2710000204665407B0D4AA"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:48.642Z","type":"Gateway","mac":"AC233FC1DD51","nums":0}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:48.586Z","type":"Gateway","mac":"AC233FC1DCCB","nums":2},{"timestamp":"2026-02-09T00:36:48.686Z","mac":"C3000057B9D9","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF7075D66F8"},{"timestamp":"2026-02-09T00:36:49.257Z","mac":"C3000057B9F1","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0A06E55AAA"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:48.695Z","type":"Gateway","mac":"AC233FC1DD3C","nums":5},{"timestamp":"2026-02-09T00:36:48.989Z","mac":"504C97555B00","rssi":-77,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:49.375Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:49.404Z","mac":"C3000057B9E8","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70006F29E9A"},{"timestamp":"2026-02-09T00:36:49.468Z","mac":"C3000057B9E7","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4170710B4F2"},{"timestamp":"2026-02-09T00:36:49.577Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:48.751Z","type":"Gateway","mac":"AC233FC1DD50","nums":3},{"timestamp":"2026-02-09T00:36:48.858Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:49.089Z","mac":"C3000057B9DC","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC320776BBDA"},{"timestamp":"2026-02-09T00:36:49.478Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:48.873Z","type":"Gateway","mac":"AC233FC1DD55","nums":7},{"timestamp":"2026-02-09T00:36:48.886Z","mac":"C300003946B1","rssi":-77,"rawData":"0201060303E1FF1116E1FFA10826B146390000C34D57423031"},{"timestamp":"2026-02-09T00:36:48.896Z","mac":"C3000057B9F4","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAF07BE43EC"},{"timestamp":"2026-02-09T00:36:48.989Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:49.257Z","mac":"C3000057B9F1","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0A06E55AAA"},{"timestamp":"2026-02-09T00:36:49.577Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:49.736Z","mac":"F045AEE31DB4","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:49.773Z","mac":"504C97555B00","rssi":-83,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:48.892Z","type":"Gateway","mac":"AC233FC1DD4B","nums":6},{"timestamp":"2026-02-09T00:36:48.897Z","mac":"C3000057B9F4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C24100002089BAF07BE43EC"},{"timestamp":"2026-02-09T00:36:49.197Z","mac":"C3000057B9DB","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2710000204665407B0D4AA"},{"timestamp":"2026-02-09T00:36:49.255Z","mac":"C3000057B9F1","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0A06E55AAA"},{"timestamp":"2026-02-09T00:36:49.501Z","mac":"C3000057B9DD","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82A07922190"},{"timestamp":"2026-02-09T00:36:49.871Z","mac":"C3000057B9E6","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B206F50054"},{"timestamp":"2026-02-09T00:36:49.890Z","mac":"C300003946AC","rssi":-72,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:48.970Z","type":"Gateway","mac":"AC233FC1DD48","nums":7},{"timestamp":"2026-02-09T00:36:49.079Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:49.382Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:49.443Z","mac":"C3000057B9DF","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895E079444D4"},{"timestamp":"2026-02-09T00:36:49.560Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:49.692Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:49.784Z","mac":"C3000057B9F5","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E407BA7852"},{"timestamp":"2026-02-09T00:36:49.852Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:49.051Z","type":"Gateway","mac":"AC233FC1DD4E","nums":11},{"timestamp":"2026-02-09T00:36:49.192Z","mac":"C3000057B9DB","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C2710000204665407B0D4AA"},{"timestamp":"2026-02-09T00:36:49.215Z","mac":"E6E749BA2D00","rssi":-76,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:49.496Z","mac":"C3000057B9DD","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82A07922190"},{"timestamp":"2026-02-09T00:36:49.533Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:49.649Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:49.688Z","mac":"C3000057B9D9","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF8075D6702"},{"timestamp":"2026-02-09T00:36:49.731Z","mac":"F045AEE31DB4","rssi":-84,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:49.770Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:49.790Z","mac":"C3000057B9F5","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E407BA7852"},{"timestamp":"2026-02-09T00:36:49.839Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:49.889Z","mac":"C3000057B9F4","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB007BE43F6"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:49.078Z","type":"Gateway","mac":"AC233FC1DCCD","nums":10},{"timestamp":"2026-02-09T00:36:49.089Z","mac":"C3000057B9DC","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC320776BBDA"},{"timestamp":"2026-02-09T00:36:49.367Z","mac":"E017085443A7","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:49.401Z","mac":"C3000057B9E8","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70006F29E9A"},{"timestamp":"2026-02-09T00:36:49.450Z","mac":"C3000057B9DF","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895E079444D4"},{"timestamp":"2026-02-09T00:36:49.465Z","mac":"C3000057B9E7","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4170710B4F2"},{"timestamp":"2026-02-09T00:36:49.689Z","mac":"C3000057B9D9","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF8075D6702"},{"timestamp":"2026-02-09T00:36:49.721Z","mac":"D920A4A6D237","rssi":-81,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:49.733Z","mac":"F045AEE31DB4","rssi":-74,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:49.791Z","mac":"C3000057B9F5","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E407BA7852"},{"timestamp":"2026-02-09T00:36:50.048Z","mac":"D54E908B7972","rssi":-84,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:49.194Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:49.189Z","type":"Gateway","mac":"AC233FC1DCD1","nums":6},{"timestamp":"2026-02-09T00:36:49.193Z","mac":"C3000057B9DB","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2710000204665407B0D4AA"},{"timestamp":"2026-02-09T00:36:49.251Z","mac":"C3000057B9F1","rssi":-44,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0A06E55AAA"},{"timestamp":"2026-02-09T00:36:49.596Z","mac":"C300003946B1","rssi":-64,"rawData":"0201061AFF4C000215E2C56DB5DFFB48D2B060D0F5A71096E000000000EC"},{"timestamp":"2026-02-09T00:36:49.867Z","mac":"C3000057B9E6","rssi":-50,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B206F50054"},{"timestamp":"2026-02-09T00:36:49.887Z","mac":"C300003946AC","rssi":-77,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:49.888Z","mac":"C3000057B9F4","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB007BE43F6"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:49.373Z","type":"Gateway","mac":"AC233FC1DCEE","nums":0}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:49.355Z","type":"Gateway","mac":"AC233FC1DD31","nums":5},{"timestamp":"2026-02-09T00:36:49.501Z","mac":"C3000057B9DD","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82A07922190"},{"timestamp":"2026-02-09T00:36:49.871Z","mac":"C3000057B9E6","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B206F50054"},{"timestamp":"2026-02-09T00:36:49.890Z","mac":"C300003946AC","rssi":-75,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:49.891Z","mac":"C3000057B9F4","rssi":-46,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB007BE43F6"},{"timestamp":"2026-02-09T00:36:50.204Z","mac":"C3000057B9DB","rssi":-46,"rawData":"0201060303AAFE1116AAFE20000C2710000204665507B0D4B4"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:49.555Z","type":"Gateway","mac":"AC233FC1DCCB","nums":3},{"timestamp":"2026-02-09T00:36:49.892Z","mac":"C300003946AC","rssi":-76,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:49.893Z","mac":"C3000057B9F4","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB007BE43F6"},{"timestamp":"2026-02-09T00:36:50.206Z","mac":"C3000057B9DB","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2710000204665507B0D4B4"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:49.509Z","type":"Gateway","mac":"AC233FC1DCD2","nums":12},{"timestamp":"2026-02-09T00:36:49.601Z","mac":"C300003946B1","rssi":-81,"rawData":"0201061AFF4C000215E2C56DB5DFFB48D2B060D0F5A71096E000000000EC"},{"timestamp":"2026-02-09T00:36:49.873Z","mac":"C3000057B9E6","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B206F50054"},{"timestamp":"2026-02-09T00:36:49.891Z","mac":"C300003946AC","rssi":-52,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:49.892Z","mac":"C3000057B9F4","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB007BE43F6"},{"timestamp":"2026-02-09T00:36:49.953Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1C03095336"},{"timestamp":"2026-02-09T00:36:50.206Z","mac":"C3000057B9DB","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2710000204665507B0D4B4"},{"timestamp":"2026-02-09T00:36:50.258Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1C03095336"},{"timestamp":"2026-02-09T00:36:50.371Z","mac":"E017085443A7","rssi":-51,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:50.415Z","mac":"C3000057B9E8","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70106F29EA4"},{"timestamp":"2026-02-09T00:36:50.468Z","mac":"C3000057B9DF","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895F079444DE"},{"timestamp":"2026-02-09T00:36:50.479Z","mac":"C3000057B9E7","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4180710B4FC"},{"timestamp":"2026-02-09T00:36:50.503Z","mac":"C3000057B9DD","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82B0792219A"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:49.591Z","type":"Gateway","mac":"AC233FC1DD40","nums":0}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:49.603Z","type":"Gateway","mac":"AC233FC1DD49","nums":0}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:49.641Z","type":"Gateway","mac":"AC233FC1DD51","nums":3},{"timestamp":"2026-02-09T00:36:49.691Z","mac":"C3000057B9D9","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF8075D6702"},{"timestamp":"2026-02-09T00:36:49.789Z","mac":"C3000057B9F5","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E407BA7852"},{"timestamp":"2026-02-09T00:36:50.369Z","mac":"E017085443A7","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:49.776Z","type":"Gateway","mac":"AC233FC1DD3C","nums":4},{"timestamp":"2026-02-09T00:36:50.158Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:50.371Z","mac":"E017085443A7","rssi":-76,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:50.415Z","mac":"C3000057B9E8","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70106F29EA4"},{"timestamp":"2026-02-09T00:36:50.542Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:49.780Z","type":"Gateway","mac":"AC233FC1DD50","nums":4},{"timestamp":"2026-02-09T00:36:49.791Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:50.093Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:50.401Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:50.707Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:49.878Z","type":"Gateway","mac":"AC233FC1DD55","nums":3},{"timestamp":"2026-02-09T00:36:50.158Z","mac":"504C97555B00","rssi":-79,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:50.542Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:50.742Z","mac":"F045AEE31DB4","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:49.896Z","type":"Gateway","mac":"AC233FC1DD4B","nums":8},{"timestamp":"2026-02-09T00:36:49.891Z","mac":"C3000057B9F4","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB007BE43F6"},{"timestamp":"2026-02-09T00:36:50.204Z","mac":"C3000057B9DB","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C2710000204665507B0D4B4"},{"timestamp":"2026-02-09T00:36:50.466Z","mac":"C3000057B9DF","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895F079444DE"},{"timestamp":"2026-02-09T00:36:50.477Z","mac":"C3000057B9E7","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4180710B4FC"},{"timestamp":"2026-02-09T00:36:50.501Z","mac":"C3000057B9DD","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82B0792219A"},{"timestamp":"2026-02-09T00:36:50.735Z","mac":"D920A4A6D237","rssi":-78,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:50.742Z","mac":"F045AEE31DB4","rssi":-74,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:50.794Z","mac":"C3000057B9F5","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E507BA785C"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:49.951Z","type":"Gateway","mac":"AC233FC1DD48","nums":5},{"timestamp":"2026-02-09T00:36:50.017Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:50.080Z","mac":"C3000057B9DC","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC330776BBE4"},{"timestamp":"2026-02-09T00:36:50.476Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:50.610Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:50.689Z","mac":"C3000057B9D9","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF9075D670C"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:50.054Z","type":"Gateway","mac":"AC233FC1DCCD","nums":4},{"timestamp":"2026-02-09T00:36:50.074Z","mac":"C300003947C4","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C2A100002C3300A152F84FA"},{"timestamp":"2026-02-09T00:36:50.080Z","mac":"C3000057B9D4","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BAF06BB334C"},{"timestamp":"2026-02-09T00:36:50.369Z","mac":"E017085443A7","rssi":-70,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:50.695Z","mac":"C3000057B9D9","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF9075D670C"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:50.092Z","type":"Gateway","mac":"AC233FC1DD4E","nums":4},{"timestamp":"2026-02-09T00:36:50.203Z","mac":"C3000057B9DB","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2710000204665507B0D4B4"},{"timestamp":"2026-02-09T00:36:50.464Z","mac":"C3000057B9DF","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895F079444DE"},{"timestamp":"2026-02-09T00:36:50.499Z","mac":"C3000057B9DD","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82B0792219A"},{"timestamp":"2026-02-09T00:36:51.096Z","mac":"C3000057B9DC","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC340776BBEE"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:50.193Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:50.187Z","type":"Gateway","mac":"AC233FC1DCD1","nums":10},{"timestamp":"2026-02-09T00:36:50.201Z","mac":"C3000057B9DB","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C2710000204665507B0D4B4"},{"timestamp":"2026-02-09T00:36:50.463Z","mac":"C3000057B9DF","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9895F079444DE"},{"timestamp":"2026-02-09T00:36:50.473Z","mac":"C3000057B9E7","rssi":-49,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4180710B4FC"},{"timestamp":"2026-02-09T00:36:50.732Z","mac":"D920A4A6D237","rssi":-55,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:50.737Z","mac":"F045AEE31DB4","rssi":-36,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:50.791Z","mac":"C3000057B9F5","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E507BA785C"},{"timestamp":"2026-02-09T00:36:51.049Z","mac":"D54E908B7972","rssi":-58,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:51.084Z","mac":"C300003947C4","rssi":-53,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C3300B152F8504"},{"timestamp":"2026-02-09T00:36:51.090Z","mac":"C3000057B9D4","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB006BB3356"},{"timestamp":"2026-02-09T00:36:51.094Z","mac":"C3000057B9DC","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC340776BBEE"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:50.405Z","type":"Gateway","mac":"AC233FC1DD31","nums":9},{"timestamp":"2026-02-09T00:36:50.501Z","mac":"C3000057B9DD","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82B0792219A"},{"timestamp":"2026-02-09T00:36:50.735Z","mac":"D920A4A6D237","rssi":-78,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:50.742Z","mac":"F045AEE31DB4","rssi":-66,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:50.794Z","mac":"C3000057B9F5","rssi":-30,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E507BA785C"},{"timestamp":"2026-02-09T00:36:51.054Z","mac":"D54E908B7972","rssi":-78,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:51.087Z","mac":"C300003947C4","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C3300B152F8504"},{"timestamp":"2026-02-09T00:36:51.093Z","mac":"C3000057B9D4","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB006BB3356"},{"timestamp":"2026-02-09T00:36:51.097Z","mac":"C3000057B9DC","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC340776BBEE"},{"timestamp":"2026-02-09T00:36:51.366Z","mac":"E017085443A7","rssi":-67,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:50.373Z","type":"Gateway","mac":"AC233FC1DCEE","nums":1},{"timestamp":"2026-02-09T00:36:51.086Z","mac":"C300003947C4","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C3300B152F8504"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:50.509Z","type":"Gateway","mac":"AC233FC1DCD2","nums":12},{"timestamp":"2026-02-09T00:36:50.565Z","mac":"C7AE561E38B7","rssi":-78,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1C03095336"},{"timestamp":"2026-02-09T00:36:50.796Z","mac":"C3000057B9F5","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E507BA785C"},{"timestamp":"2026-02-09T00:36:50.870Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1C03095336"},{"timestamp":"2026-02-09T00:36:50.877Z","mac":"C3000057B9E6","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B306F5005E"},{"timestamp":"2026-02-09T00:36:51.089Z","mac":"C300003947C4","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C3300B152F8504"},{"timestamp":"2026-02-09T00:36:51.095Z","mac":"C3000057B9D4","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB006BB3356"},{"timestamp":"2026-02-09T00:36:51.099Z","mac":"C3000057B9DC","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC340776BBEE"},{"timestamp":"2026-02-09T00:36:51.171Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:51.413Z","mac":"C3000057B9E8","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70206F29EAE"},{"timestamp":"2026-02-09T00:36:51.476Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:51.482Z","mac":"C3000057B9DF","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98960079444E8"},{"timestamp":"2026-02-09T00:36:51.487Z","mac":"C3000057B9E7","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4190710B506"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:50.505Z","type":"Gateway","mac":"AC233FC1DCCB","nums":2},{"timestamp":"2026-02-09T00:36:50.797Z","mac":"C3000057B9F5","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E507BA785C"},{"timestamp":"2026-02-09T00:36:51.100Z","mac":"C3000057B9DC","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC340776BBEE"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:50.591Z","type":"Gateway","mac":"AC233FC1DD40","nums":2},{"timestamp":"2026-02-09T00:36:50.789Z","mac":"C3000057B9F5","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E507BA785C"},{"timestamp":"2026-02-09T00:36:51.092Z","mac":"C3000057B9DC","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC340776BBEE"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:50.603Z","type":"Gateway","mac":"AC233FC1DD49","nums":0}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:50.671Z","type":"Gateway","mac":"AC233FC1DD51","nums":2},{"timestamp":"2026-02-09T00:36:50.695Z","mac":"C3000057B9D9","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFF9075D670C"},{"timestamp":"2026-02-09T00:36:51.215Z","mac":"C3000057B9DB","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2710000204665607B0D4BE"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:50.811Z","type":"Gateway","mac":"AC233FC1DD50","nums":2},{"timestamp":"2026-02-09T00:36:51.337Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:51.651Z","mac":"3868A460B93E","rssi":-80,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:50.746Z","type":"Gateway","mac":"AC233FC1DD3C","nums":6},{"timestamp":"2026-02-09T00:36:50.877Z","mac":"C3000057B9E6","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B306F5005E"},{"timestamp":"2026-02-09T00:36:51.095Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB006BB3356"},{"timestamp":"2026-02-09T00:36:51.124Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:51.413Z","mac":"C3000057B9E8","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70206F29EAE"},{"timestamp":"2026-02-09T00:36:51.511Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:51.708Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:50.847Z","type":"Gateway","mac":"AC233FC1DD55","nums":9},{"timestamp":"2026-02-09T00:36:51.053Z","mac":"D54E908B7972","rssi":-83,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:51.089Z","mac":"C300003947C4","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C2A0F0002C3300B152F8504"},{"timestamp":"2026-02-09T00:36:51.124Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:51.366Z","mac":"E017085443A7","rssi":-82,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:51.413Z","mac":"C3000057B9E8","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70206F29EAE"},{"timestamp":"2026-02-09T00:36:51.708Z","mac":"504C97555B00","rssi":-79,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:51.739Z","mac":"F045AEE31DB4","rssi":-77,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:51.810Z","mac":"C3000057B9F5","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E607BA7866"},{"timestamp":"2026-02-09T00:36:51.875Z","mac":"C3000057B9E6","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B406F50068"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:50.891Z","type":"Gateway","mac":"AC233FC1DD4B","nums":3},{"timestamp":"2026-02-09T00:36:51.098Z","mac":"C3000057B9DC","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC340776BBEE"},{"timestamp":"2026-02-09T00:36:51.411Z","mac":"C3000057B9E8","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70206F29EAE"},{"timestamp":"2026-02-09T00:36:51.704Z","mac":"C3000057B9D9","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFFA075D6716"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:50.891Z","type":"Gateway","mac":"AC233FC1DD48","nums":3},{"timestamp":"2026-02-09T00:36:51.237Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:51.705Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:51.801Z","mac":"C3000057B9F5","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E607BA7866"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:51.102Z","type":"Gateway","mac":"AC233FC1DD4E","nums":6},{"timestamp":"2026-02-09T00:36:51.735Z","mac":"F045AEE31DB4","rssi":-74,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:51.806Z","mac":"C3000057B9F5","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E607BA7866"},{"timestamp":"2026-02-09T00:36:51.837Z","mac":"E6E749BA2D00","rssi":-86,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:51.886Z","mac":"C300003946AC","rssi":-80,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:51.896Z","mac":"C3000057B9F4","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB207BE440A"},{"timestamp":"2026-02-09T00:36:51.939Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:51.100Z","type":"Gateway","mac":"AC233FC1DCCD","nums":5},{"timestamp":"2026-02-09T00:36:51.213Z","mac":"C3000057B9DB","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2710000204665607B0D4BE"},{"timestamp":"2026-02-09T00:36:51.268Z","mac":"C3000057B9F1","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0C06E55ABE"},{"timestamp":"2026-02-09T00:36:51.873Z","mac":"C3000057B9E6","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B406F50068"},{"timestamp":"2026-02-09T00:36:51.887Z","mac":"C300003946AC","rssi":-77,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:51.897Z","mac":"C3000057B9F4","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB207BE440A"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:51.199Z","type":"Gateway","mac":"AC233FC1DCD1","nums":13},{"timestamp":"2026-02-09T00:36:51.360Z","mac":"E017085443A7","rssi":-42,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:51.407Z","mac":"C3000057B9E8","rssi":-57,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70206F29EAE"},{"timestamp":"2026-02-09T00:36:51.700Z","mac":"C3000057B9D9","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFFA075D6716"},{"timestamp":"2026-02-09T00:36:51.734Z","mac":"F045AEE31DB4","rssi":-36,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:51.735Z","mac":"D920A4A6D237","rssi":-54,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:51.777Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:51.873Z","mac":"C3000057B9E6","rssi":-53,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B406F50068"},{"timestamp":"2026-02-09T00:36:51.887Z","mac":"C300003946AC","rssi":-58,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:51.897Z","mac":"C3000057B9F4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB207BE440A"},{"timestamp":"2026-02-09T00:36:52.085Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1D03095336"},{"timestamp":"2026-02-09T00:36:52.095Z","mac":"C300003947C4","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2A100002C3300C152F850E"},{"timestamp":"2026-02-09T00:36:52.097Z","mac":"C3000057B9D4","rssi":-55,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB106BB3360"},{"timestamp":"2026-02-09T00:36:52.100Z","mac":"C3000057B9DC","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC350776BBF8"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:51.193Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:51.372Z","type":"Gateway","mac":"AC233FC1DD31","nums":4},{"timestamp":"2026-02-09T00:36:51.411Z","mac":"C3000057B9E8","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70206F29EAE"},{"timestamp":"2026-02-09T00:36:51.704Z","mac":"C3000057B9D9","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFFA075D6716"},{"timestamp":"2026-02-09T00:36:51.737Z","mac":"F045AEE31DB4","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:52.058Z","mac":"D54E908B7972","rssi":-84,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:51.382Z","type":"Gateway","mac":"AC233FC1DCEE","nums":4},{"timestamp":"2026-02-09T00:36:51.484Z","mac":"C3000057B9E7","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C4190710B506"},{"timestamp":"2026-02-09T00:36:52.094Z","mac":"C300003947C4","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C2A100002C3300C152F850E"},{"timestamp":"2026-02-09T00:36:52.096Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB106BB3360"},{"timestamp":"2026-02-09T00:36:52.368Z","mac":"E017085443A7","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:51.495Z","type":"Gateway","mac":"AC233FC1DCD2","nums":13},{"timestamp":"2026-02-09T00:36:51.706Z","mac":"C3000057B9D9","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFFA075D6716"},{"timestamp":"2026-02-09T00:36:51.779Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:52.058Z","mac":"D54E908B7972","rssi":-71,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:52.087Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1D03095336"},{"timestamp":"2026-02-09T00:36:52.097Z","mac":"C300003947C4","rssi":-57,"rawData":"0201060303AAFE1116AAFE20000C2A100002C3300C152F850E"},{"timestamp":"2026-02-09T00:36:52.100Z","mac":"C3000057B9D4","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB106BB3360"},{"timestamp":"2026-02-09T00:36:52.102Z","mac":"C3000057B9DC","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC350776BBF8"},{"timestamp":"2026-02-09T00:36:52.178Z","mac":"A0D05BD2E2E5","rssi":-80,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:52.222Z","mac":"C3000057B9DB","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C2710000204665707B0D4C8"},{"timestamp":"2026-02-09T00:36:52.283Z","mac":"C3000057B9F1","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0D06E55AC8"},{"timestamp":"2026-02-09T00:36:52.372Z","mac":"E017085443A7","rssi":-46,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:52.397Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1D03095336"},{"timestamp":"2026-02-09T00:36:52.491Z","mac":"A0D05BD2E2E5","rssi":-79,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:51.505Z","type":"Gateway","mac":"AC233FC1DCCB","nums":4},{"timestamp":"2026-02-09T00:36:51.706Z","mac":"C3000057B9D9","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFFA075D6716"},{"timestamp":"2026-02-09T00:36:51.739Z","mac":"F045AEE31DB4","rssi":-67,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:52.060Z","mac":"D54E908B7972","rssi":-74,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:52.102Z","mac":"C3000057B9DC","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC350776BBF8"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:51.603Z","type":"Gateway","mac":"AC233FC1DD49","nums":1},{"timestamp":"2026-02-09T00:36:52.419Z","mac":"C3000057B9E8","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70306F29EB8"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:51.711Z","type":"Gateway","mac":"AC233FC1DD51","nums":2},{"timestamp":"2026-02-09T00:36:51.898Z","mac":"C3000057B9F4","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB207BE440A"},{"timestamp":"2026-02-09T00:36:52.220Z","mac":"C3000057B9DB","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2710000204665707B0D4C8"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:51.591Z","type":"Gateway","mac":"AC233FC1DD40","nums":2},{"timestamp":"2026-02-09T00:36:52.095Z","mac":"C3000057B9DC","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC350776BBF8"},{"timestamp":"2026-02-09T00:36:52.214Z","mac":"C3000057B9DB","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2710000204665707B0D4C8"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:51.714Z","type":"Gateway","mac":"AC233FC1DD3C","nums":6},{"timestamp":"2026-02-09T00:36:51.739Z","mac":"F045AEE31DB4","rssi":-76,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:51.740Z","mac":"D920A4A6D237","rssi":-83,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:52.099Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:52.298Z","mac":"504C97555B00","rssi":-77,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:52.492Z","mac":"504C97555B00","rssi":-85,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:52.497Z","mac":"C3000057B9E7","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41A0710B510"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:51.751Z","type":"Gateway","mac":"AC233FC1DD50","nums":0}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:51.899Z","type":"Gateway","mac":"AC233FC1DD48","nums":7},{"timestamp":"2026-02-09T00:36:52.169Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:52.213Z","mac":"C3000057B9DB","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2710000204665707B0D4C8"},{"timestamp":"2026-02-09T00:36:52.482Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:52.487Z","mac":"C3000057B9DF","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98961079444F2"},{"timestamp":"2026-02-09T00:36:52.636Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:52.796Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:52.809Z","mac":"C3000057B9F5","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E707BA7870"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:51.901Z","type":"Gateway","mac":"AC233FC1DD4B","nums":2},{"timestamp":"2026-02-09T00:36:52.372Z","mac":"E017085443A7","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:52.900Z","mac":"C3000057B9F4","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB307BE4414"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:51.882Z","type":"Gateway","mac":"AC233FC1DD55","nums":6},{"timestamp":"2026-02-09T00:36:52.283Z","mac":"C3000057B9F1","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0D06E55AC8"},{"timestamp":"2026-02-09T00:36:52.298Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:52.419Z","mac":"C3000057B9E8","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70306F29EB8"},{"timestamp":"2026-02-09T00:36:52.492Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:52.733Z","mac":"F045AEE31DB4","rssi":-76,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:52.902Z","mac":"C3000057B9F4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB307BE4414"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:52.040Z","type":"Gateway","mac":"AC233FC1DD4E","nums":8},{"timestamp":"2026-02-09T00:36:52.570Z","mac":"E6E749BA2D00","rssi":-76,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:52.703Z","mac":"C3000057B9D9","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFFB075D6720"},{"timestamp":"2026-02-09T00:36:52.729Z","mac":"F045AEE31DB4","rssi":-83,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:52.783Z","mac":"E6E749BA2D00","rssi":-84,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:52.795Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:52.814Z","mac":"C3000057B9F5","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E707BA7870"},{"timestamp":"2026-02-09T00:36:52.885Z","mac":"E6E749BA2D00","rssi":-78,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:52.898Z","mac":"C3000057B9F4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB307BE4414"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:52.100Z","type":"Gateway","mac":"AC233FC1DCCD","nums":7},{"timestamp":"2026-02-09T00:36:52.201Z","mac":"E43883D93326","rssi":-86,"rawData":"1106B93D2E1D72D12592F94FD44ACDC5392109162A25E43883D93324"},{"timestamp":"2026-02-09T00:36:52.219Z","mac":"C3000057B9DB","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2710000204665707B0D4C8"},{"timestamp":"2026-02-09T00:36:52.493Z","mac":"C3000057B9DF","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98961079444F2"},{"timestamp":"2026-02-09T00:36:52.494Z","mac":"C3000057B9E7","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41A0710B510"},{"timestamp":"2026-02-09T00:36:52.523Z","mac":"C3000057B9DD","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C300E0001F9C82D079221AE"},{"timestamp":"2026-02-09T00:36:52.816Z","mac":"C3000057B9F5","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E707BA7870"},{"timestamp":"2026-02-09T00:36:53.100Z","mac":"C300003947C4","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C2D0F0002C3300D152F8518"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:52.193Z","type":"Gateway","mac":"AC233FC1DCD3","nums":1},{"timestamp":"2026-02-09T00:36:53.101Z","mac":"C3000057B9DC","rssi":-85,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC360776BC02"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:52.354Z","type":"Gateway","mac":"AC233FC1DD31","nums":5},{"timestamp":"2026-02-09T00:36:52.372Z","mac":"E017085443A7","rssi":-65,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:52.902Z","mac":"C3000057B9F4","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB307BE4414"},{"timestamp":"2026-02-09T00:36:53.235Z","mac":"C3000057B9DB","rssi":-46,"rawData":"0201060303AAFE1116AAFE20000C2710000204665807B0D4D2"},{"timestamp":"2026-02-09T00:36:53.291Z","mac":"C3000057B9F1","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0E06E55AD2"},{"timestamp":"2026-02-09T00:36:53.307Z","mac":"C7AE561E38B7","rssi":-59,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:52.199Z","type":"Gateway","mac":"AC233FC1DCD1","nums":13},{"timestamp":"2026-02-09T00:36:52.278Z","mac":"C3000057B9F1","rssi":-44,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0D06E55AC8"},{"timestamp":"2026-02-09T00:36:52.369Z","mac":"E017085443A7","rssi":-44,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:52.609Z","mac":"C300003946B1","rssi":-64,"rawData":"0201060303F1FF1716E2C56DB5DFFB48D2B060D0F5A71096E000000000EC26"},{"timestamp":"2026-02-09T00:36:52.704Z","mac":"C3000057B9D9","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFFB075D6720"},{"timestamp":"2026-02-09T00:36:52.730Z","mac":"F045AEE31DB4","rssi":-34,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:52.737Z","mac":"D920A4A6D237","rssi":-54,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:52.816Z","mac":"C3000057B9F5","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E707BA7870"},{"timestamp":"2026-02-09T00:36:52.878Z","mac":"C3000057B9E6","rssi":-51,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B506F50072"},{"timestamp":"2026-02-09T00:36:52.891Z","mac":"C300003946B1","rssi":-47,"rawData":"0201060303E1FF1116E1FFA10826B146390000C34D57423031"},{"timestamp":"2026-02-09T00:36:52.896Z","mac":"C3000057B9F4","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB307BE4414"},{"timestamp":"2026-02-09T00:36:53.062Z","mac":"D54E908B7972","rssi":-58,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:53.100Z","mac":"C300003947C4","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2D0F0002C3300D152F8518"},{"timestamp":"2026-02-09T00:36:53.109Z","mac":"C3000057B9D4","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB206BB336A"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:52.374Z","type":"Gateway","mac":"AC233FC1DCEE","nums":2},{"timestamp":"2026-02-09T00:36:53.099Z","mac":"C300003947C4","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C2D0F0002C3300D152F8518"},{"timestamp":"2026-02-09T00:36:53.107Z","mac":"C3000057B9D4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB206BB336A"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:52.523Z","type":"Gateway","mac":"AC233FC1DD49","nums":3},{"timestamp":"2026-02-09T00:36:52.896Z","mac":"C300003946B1","rssi":-84,"rawData":"0201060303E1FF1116E1FFA10826B146390000C34D57423031"},{"timestamp":"2026-02-09T00:36:53.102Z","mac":"C300003947C4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2D0F0002C3300D152F8518"},{"timestamp":"2026-02-09T00:36:53.364Z","mac":"E017085443A7","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:52.611Z","type":"Gateway","mac":"AC233FC1DD40","nums":1},{"timestamp":"2026-02-09T00:36:53.357Z","mac":"E017085443A7","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:52.506Z","type":"Gateway","mac":"AC233FC1DCCB","nums":3},{"timestamp":"2026-02-09T00:36:53.236Z","mac":"C3000057B9DB","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2710000204665807B0D4D2"},{"timestamp":"2026-02-09T00:36:53.293Z","mac":"C3000057B9F1","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0E06E55AD2"},{"timestamp":"2026-02-09T00:36:53.531Z","mac":"C3000057B9DD","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C270E0001F9C82E079221B8"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:52.501Z","type":"Gateway","mac":"AC233FC1DCD2","nums":18},{"timestamp":"2026-02-09T00:36:52.496Z","mac":"C3000057B9DF","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98961079444F2"},{"timestamp":"2026-02-09T00:36:52.497Z","mac":"C3000057B9E7","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41A0710B510"},{"timestamp":"2026-02-09T00:36:52.699Z","mac":"C7AE561E38B7","rssi":-78,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1D03095336"},{"timestamp":"2026-02-09T00:36:52.706Z","mac":"C3000057B9D9","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFFB075D6720"},{"timestamp":"2026-02-09T00:36:53.005Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:53.065Z","mac":"D54E908B7972","rssi":-76,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:53.102Z","mac":"C300003947C4","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2D0F0002C3300D152F8518"},{"timestamp":"2026-02-09T00:36:53.103Z","mac":"C3000057B9DC","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC360776BC02"},{"timestamp":"2026-02-09T00:36:53.107Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:53.111Z","mac":"C3000057B9D4","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB206BB336A"},{"timestamp":"2026-02-09T00:36:53.236Z","mac":"C3000057B9DB","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2710000204665807B0D4D2"},{"timestamp":"2026-02-09T00:36:53.264Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:53.291Z","mac":"C3000057B9F1","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0E06E55AD2"},{"timestamp":"2026-02-09T00:36:53.306Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:53.365Z","mac":"E017085443A7","rssi":-51,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:53.415Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:53.421Z","mac":"C3000057B9E8","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70406F29EC2"},{"timestamp":"2026-02-09T00:36:53.506Z","mac":"C3000057B9DF","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98962079444FC"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:52.695Z","type":"Gateway","mac":"AC233FC1DD3C","nums":5},{"timestamp":"2026-02-09T00:36:53.276Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:53.421Z","mac":"C3000057B9E8","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70406F29EC2"},{"timestamp":"2026-02-09T00:36:53.473Z","mac":"504C97555B00","rssi":-85,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:53.666Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:53.738Z","mac":"F045AEE31DB4","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:52.621Z","type":"Gateway","mac":"AC233FC1DD51","nums":1},{"timestamp":"2026-02-09T00:36:53.363Z","mac":"E017085443A7","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:52.750Z","type":"Gateway","mac":"AC233FC1DD50","nums":1},{"timestamp":"2026-02-09T00:36:53.101Z","mac":"C3000057B9DC","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC360776BC02"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:52.908Z","type":"Gateway","mac":"AC233FC1DD55","nums":3},{"timestamp":"2026-02-09T00:36:53.276Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:53.739Z","mac":"F045AEE31DB4","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:53.859Z","mac":"504C97555B00","rssi":-81,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:52.905Z","type":"Gateway","mac":"AC233FC1DD4B","nums":7},{"timestamp":"2026-02-09T00:36:53.235Z","mac":"C3000057B9DB","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C2710000204665807B0D4D2"},{"timestamp":"2026-02-09T00:36:53.307Z","mac":"C7AE561E38B7","rssi":-69,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:53.505Z","mac":"C3000057B9E7","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41B0710B51A"},{"timestamp":"2026-02-09T00:36:53.529Z","mac":"C3000057B9DD","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C270E0001F9C82E079221B8"},{"timestamp":"2026-02-09T00:36:53.823Z","mac":"C3000057B9F5","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E807BA787A"},{"timestamp":"2026-02-09T00:36:53.874Z","mac":"C3000057B9E6","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B606F5007C"},{"timestamp":"2026-02-09T00:36:53.891Z","mac":"C300003946AC","rssi":-71,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:53.104Z","type":"Gateway","mac":"AC233FC1DD4E","nums":13},{"timestamp":"2026-02-09T00:36:53.099Z","mac":"C300003947C4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2D0F0002C3300D152F8518"},{"timestamp":"2026-02-09T00:36:53.100Z","mac":"C3000057B9DC","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC360776BC02"},{"timestamp":"2026-02-09T00:36:53.233Z","mac":"C3000057B9DB","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2710000204665807B0D4D2"},{"timestamp":"2026-02-09T00:36:53.303Z","mac":"C7AE561E38B7","rssi":-75,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:53.528Z","mac":"C3000057B9DD","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C270E0001F9C82E079221B8"},{"timestamp":"2026-02-09T00:36:53.714Z","mac":"C3000057B9D9","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFFC075D672A"},{"timestamp":"2026-02-09T00:36:53.727Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:53.743Z","mac":"0BC8DA14CEAC","rssi":-81,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:53.822Z","mac":"C3000057B9F5","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E807BA787A"},{"timestamp":"2026-02-09T00:36:53.830Z","mac":"E6E749BA2D00","rssi":-83,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:53.889Z","mac":"C300003946AC","rssi":-82,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:53.902Z","mac":"C3000057B9F4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB407BE441E"},{"timestamp":"2026-02-09T00:36:53.917Z","mac":"C7AE561E38B7","rssi":-75,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:53.106Z","type":"Gateway","mac":"AC233FC1DCCD","nums":6},{"timestamp":"2026-02-09T00:36:53.108Z","mac":"C3000057B9D4","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB206BB336A"},{"timestamp":"2026-02-09T00:36:53.362Z","mac":"E017085443A7","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:53.418Z","mac":"C3000057B9E8","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70406F29EC2"},{"timestamp":"2026-02-09T00:36:53.715Z","mac":"C3000057B9D9","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFFC075D672A"},{"timestamp":"2026-02-09T00:36:53.736Z","mac":"F045AEE31DB4","rssi":-74,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:53.740Z","mac":"D920A4A6D237","rssi":-82,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:52.911Z","type":"Gateway","mac":"AC233FC1DD48","nums":4},{"timestamp":"2026-02-09T00:36:53.098Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:53.407Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:53.708Z","mac":"C3000057B9D9","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFFC075D672A"},{"timestamp":"2026-02-09T00:36:53.866Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:53.204Z","type":"Gateway","mac":"AC233FC1DCD3","nums":1},{"timestamp":"2026-02-09T00:36:54.107Z","mac":"C3000057B9DC","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC370776BC0C"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:53.209Z","type":"Gateway","mac":"AC233FC1DCD1","nums":14},{"timestamp":"2026-02-09T00:36:53.231Z","mac":"C3000057B9DB","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C2710000204665807B0D4D2"},{"timestamp":"2026-02-09T00:36:53.288Z","mac":"C3000057B9F1","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0E06E55AD2"},{"timestamp":"2026-02-09T00:36:53.304Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:53.501Z","mac":"C3000057B9DF","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98962079444FC"},{"timestamp":"2026-02-09T00:36:53.503Z","mac":"C3000057B9E7","rssi":-50,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41B0710B51A"},{"timestamp":"2026-02-09T00:36:53.820Z","mac":"C3000057B9F5","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E807BA787A"},{"timestamp":"2026-02-09T00:36:53.870Z","mac":"C3000057B9E6","rssi":-51,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B606F5007C"},{"timestamp":"2026-02-09T00:36:53.889Z","mac":"C300003946AC","rssi":-64,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:53.901Z","mac":"C3000057B9F4","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB407BE441E"},{"timestamp":"2026-02-09T00:36:53.918Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.063Z","mac":"D54E908B7972","rssi":-59,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:54.104Z","mac":"C3000057B9DC","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC370776BC0C"},{"timestamp":"2026-02-09T00:36:54.113Z","mac":"C300003947C4","rssi":-53,"rawData":"0201060303AAFE1116AAFE20000C2D0F0002C3300E152F8522"},{"timestamp":"2026-02-09T00:36:54.115Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB306BB3374"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:53.302Z","type":"Gateway","mac":"AC233FC1DCEE","nums":1},{"timestamp":"2026-02-09T00:36:54.116Z","mac":"C300003947C4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2D0F0002C3300E152F8522"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:53.313Z","type":"Gateway","mac":"AC233FC1DD31","nums":10},{"timestamp":"2026-02-09T00:36:53.507Z","mac":"C3000057B9DF","rssi":-67,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F98962079444FC"},{"timestamp":"2026-02-09T00:36:53.508Z","mac":"C3000057B9E7","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41B0710B51A"},{"timestamp":"2026-02-09T00:36:53.529Z","mac":"C3000057B9DD","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C270E0001F9C82E079221B8"},{"timestamp":"2026-02-09T00:36:53.823Z","mac":"C3000057B9F5","rssi":-30,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E807BA787A"},{"timestamp":"2026-02-09T00:36:53.874Z","mac":"C3000057B9E6","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B606F5007C"},{"timestamp":"2026-02-09T00:36:53.891Z","mac":"C300003946AC","rssi":-75,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:53.904Z","mac":"C3000057B9F4","rssi":-46,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB407BE441E"},{"timestamp":"2026-02-09T00:36:54.110Z","mac":"C3000057B9DC","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC370776BC0C"},{"timestamp":"2026-02-09T00:36:54.120Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB306BB3374"},{"timestamp":"2026-02-09T00:36:54.228Z","mac":"C7AE561E38B7","rssi":-64,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:53.563Z","type":"Gateway","mac":"AC233FC1DD49","nums":1},{"timestamp":"2026-02-09T00:36:54.118Z","mac":"C300003947C4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C2D0F0002C3300E152F8522"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:53.537Z","type":"Gateway","mac":"AC233FC1DCCB","nums":4},{"timestamp":"2026-02-09T00:36:53.893Z","mac":"C300003946AC","rssi":-76,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:53.906Z","mac":"C3000057B9F4","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB407BE441E"},{"timestamp":"2026-02-09T00:36:54.243Z","mac":"C3000057B9DB","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2710000204665907B0D4DC"},{"timestamp":"2026-02-09T00:36:54.525Z","mac":"C3000057B9DF","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9896307944510"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:53.561Z","type":"Gateway","mac":"AC233FC1DD40","nums":4},{"timestamp":"2026-02-09T00:36:53.817Z","mac":"C3000057B9F5","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E807BA787A"},{"timestamp":"2026-02-09T00:36:53.896Z","mac":"C3000057B9F4","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB407BE441E"},{"timestamp":"2026-02-09T00:36:54.102Z","mac":"C3000057B9DC","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC370776BC0C"},{"timestamp":"2026-02-09T00:36:54.361Z","mac":"E017085443A7","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:53.515Z","type":"Gateway","mac":"AC233FC1DCD2","nums":14},{"timestamp":"2026-02-09T00:36:53.507Z","mac":"C3000057B9E7","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41B0710B51A"},{"timestamp":"2026-02-09T00:36:53.531Z","mac":"C3000057B9DD","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C270E0001F9C82E079221B8"},{"timestamp":"2026-02-09T00:36:53.570Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:53.616Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:53.891Z","mac":"C300003946AC","rssi":-55,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:53.904Z","mac":"C3000057B9F4","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB407BE441E"},{"timestamp":"2026-02-09T00:36:53.920Z","mac":"C7AE561E38B7","rssi":-78,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.185Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:54.226Z","mac":"C7AE561E38B7","rssi":-80,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.243Z","mac":"C3000057B9DB","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2710000204665907B0D4DC"},{"timestamp":"2026-02-09T00:36:54.301Z","mac":"C3000057B9F1","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0F06E55ADC"},{"timestamp":"2026-02-09T00:36:54.335Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:54.369Z","mac":"E017085443A7","rssi":-51,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:54.415Z","mac":"C3000057B9E8","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70506F29ECC"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:53.661Z","type":"Gateway","mac":"AC233FC1DD51","nums":2},{"timestamp":"2026-02-09T00:36:53.715Z","mac":"C3000057B9D9","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFFC075D672A"},{"timestamp":"2026-02-09T00:36:54.365Z","mac":"E017085443A7","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:53.801Z","type":"Gateway","mac":"AC233FC1DD50","nums":0}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:53.746Z","type":"Gateway","mac":"AC233FC1DD3C","nums":7},{"timestamp":"2026-02-09T00:36:53.743Z","mac":"D920A4A6D237","rssi":-80,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:53.859Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:54.244Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:54.369Z","mac":"E017085443A7","rssi":-76,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:54.415Z","mac":"C3000057B9E8","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70506F29ECC"},{"timestamp":"2026-02-09T00:36:54.443Z","mac":"504C97555B00","rssi":-75,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:54.738Z","mac":"F045AEE31DB4","rssi":-76,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:53.865Z","type":"Gateway","mac":"AC233FC1DD55","nums":10},{"timestamp":"2026-02-09T00:36:53.876Z","mac":"C3000057B9E6","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B606F5007C"},{"timestamp":"2026-02-09T00:36:53.904Z","mac":"C3000057B9F4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB407BE441E"},{"timestamp":"2026-02-09T00:36:54.119Z","mac":"C300003947C4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C2D0F0002C3300E152F8522"},{"timestamp":"2026-02-09T00:36:54.120Z","mac":"C3000057B9D4","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB306BB3374"},{"timestamp":"2026-02-09T00:36:54.416Z","mac":"C3000057B9E8","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70506F29ECC"},{"timestamp":"2026-02-09T00:36:54.443Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:54.525Z","mac":"C3000057B9E7","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41C0710B524"},{"timestamp":"2026-02-09T00:36:54.638Z","mac":"504C97555B00","rssi":-83,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:54.738Z","mac":"F045AEE31DB4","rssi":-78,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:54.904Z","mac":"C3000057B9F4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB507BE4428"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:53.897Z","type":"Gateway","mac":"AC233FC1DD4B","nums":11},{"timestamp":"2026-02-09T00:36:53.904Z","mac":"C3000057B9F4","rssi":-64,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB407BE441E"},{"timestamp":"2026-02-09T00:36:53.921Z","mac":"C7AE561E38B7","rssi":-71,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.110Z","mac":"C3000057B9DC","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC370776BC0C"},{"timestamp":"2026-02-09T00:36:54.228Z","mac":"C7AE561E38B7","rssi":-69,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.524Z","mac":"C3000057B9DF","rssi":-55,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9896307944510"},{"timestamp":"2026-02-09T00:36:54.532Z","mac":"C7AE561E38B7","rssi":-69,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.533Z","mac":"C3000057B9DD","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C270E0001F9C82F079221C2"},{"timestamp":"2026-02-09T00:36:54.730Z","mac":"C3000057B9D9","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFFD075D6734"},{"timestamp":"2026-02-09T00:36:54.737Z","mac":"F045AEE31DB4","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:54.838Z","mac":"C7AE561E38B7","rssi":-69,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.838Z","mac":"C3000057B9F5","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E907BA7884"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:53.970Z","type":"Gateway","mac":"AC233FC1DD48","nums":5},{"timestamp":"2026-02-09T00:36:54.022Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:54.327Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:54.787Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:54.828Z","mac":"C3000057B9F5","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E907BA7884"},{"timestamp":"2026-02-09T00:36:54.895Z","mac":"C3000057B9F4","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB507BE4428"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:54.039Z","type":"Gateway","mac":"AC233FC1DCCD","nums":4},{"timestamp":"2026-02-09T00:36:54.063Z","mac":"D54E908B7972","rssi":-85,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:54.298Z","mac":"C3000057B9F1","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC0F06E55ADC"},{"timestamp":"2026-02-09T00:36:54.366Z","mac":"E017085443A7","rssi":-70,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:54.902Z","mac":"C3000057B9F4","rssi":-60,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB507BE4428"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:54.022Z","type":"Gateway","mac":"AC233FC1DD4E","nums":13},{"timestamp":"2026-02-09T00:36:54.105Z","mac":"C3000057B9DC","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC370776BC0C"},{"timestamp":"2026-02-09T00:36:54.223Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.520Z","mac":"C3000057B9DF","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9896307944510"},{"timestamp":"2026-02-09T00:36:54.521Z","mac":"C3000057B9E7","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41C0710B524"},{"timestamp":"2026-02-09T00:36:54.528Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.529Z","mac":"C3000057B9DD","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C270E0001F9C82F079221C2"},{"timestamp":"2026-02-09T00:36:54.658Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:54.735Z","mac":"F045AEE31DB4","rssi":-74,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:54.833Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.834Z","mac":"C3000057B9F5","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E907BA7884"},{"timestamp":"2026-02-09T00:36:54.901Z","mac":"C3000057B9F4","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB507BE4428"},{"timestamp":"2026-02-09T00:36:54.970Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:55.001Z","mac":"0BC8DA14CEAC","rssi":-82,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:54.219Z","type":"Gateway","mac":"AC233FC1DCD1","nums":13},{"timestamp":"2026-02-09T00:36:54.224Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.522Z","mac":"C3000057B9E7","rssi":-46,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41C0710B524"},{"timestamp":"2026-02-09T00:36:54.529Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.727Z","mac":"C3000057B9D9","rssi":-69,"rawData":"0201060303AAFE1116AAFE20000C2D100001E7FFFD075D6734"},{"timestamp":"2026-02-09T00:36:54.733Z","mac":"F045AEE31DB4","rssi":-36,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:54.743Z","mac":"D920A4A6D237","rssi":-54,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:54.834Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.880Z","mac":"C3000057B9E6","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B706F50086"},{"timestamp":"2026-02-09T00:36:55.062Z","mac":"D54E908B7972","rssi":-58,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:55.103Z","mac":"C3000057B9DC","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC380776BC16"},{"timestamp":"2026-02-09T00:36:55.119Z","mac":"C300003947C4","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2D100002C3300F152F852C"},{"timestamp":"2026-02-09T00:36:55.119Z","mac":"C3000057B9D4","rssi":-55,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB406BB337E"},{"timestamp":"2026-02-09T00:36:55.136Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:54.204Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:54.313Z","type":"Gateway","mac":"AC233FC1DCEE","nums":4},{"timestamp":"2026-02-09T00:36:54.521Z","mac":"C3000057B9E7","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41C0710B524"},{"timestamp":"2026-02-09T00:36:54.880Z","mac":"C3000057B9E6","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B706F50086"},{"timestamp":"2026-02-09T00:36:55.118Z","mac":"C300003947C4","rssi":-85,"rawData":"0201060303AAFE1116AAFE20000C2D100002C3300F152F852C"},{"timestamp":"2026-02-09T00:36:55.119Z","mac":"C3000057B9D4","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB406BB337E"}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:54.326Z","type":"Gateway","mac":"AC233FC1DD31","nums":11},{"timestamp":"2026-02-09T00:36:54.523Z","mac":"C3000057B9DF","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9896307944510"},{"timestamp":"2026-02-09T00:36:54.532Z","mac":"C7AE561E38B7","rssi":-64,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.533Z","mac":"C3000057B9DD","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C270E0001F9C82F079221C2"},{"timestamp":"2026-02-09T00:36:54.737Z","mac":"F045AEE31DB4","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:54.747Z","mac":"D920A4A6D237","rssi":-84,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:54.838Z","mac":"C7AE561E38B7","rssi":-64,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.838Z","mac":"C3000057B9F5","rssi":-32,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E907BA7884"},{"timestamp":"2026-02-09T00:36:55.066Z","mac":"D54E908B7972","rssi":-84,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:55.106Z","mac":"C3000057B9DC","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC380776BC16"},{"timestamp":"2026-02-09T00:36:55.121Z","mac":"C300003947C4","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2D100002C3300F152F852C"},{"timestamp":"2026-02-09T00:36:55.122Z","mac":"C3000057B9D4","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB406BB337E"}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:54.531Z","type":"Gateway","mac":"AC233FC1DCCB","nums":2},{"timestamp":"2026-02-09T00:36:55.067Z","mac":"D54E908B7972","rssi":-74,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:55.108Z","mac":"C3000057B9DC","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC380776BC16"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:54.523Z","type":"Gateway","mac":"AC233FC1DD49","nums":0}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:54.526Z","type":"Gateway","mac":"AC233FC1DCD2","nums":21},{"timestamp":"2026-02-09T00:36:54.523Z","mac":"C3000057B9DF","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F9896307944510"},{"timestamp":"2026-02-09T00:36:54.524Z","mac":"C3000057B9E7","rssi":-61,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41C0710B524"},{"timestamp":"2026-02-09T00:36:54.531Z","mac":"C7AE561E38B7","rssi":-78,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.532Z","mac":"C3000057B9DD","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C270E0001F9C82F079221C2"},{"timestamp":"2026-02-09T00:36:54.749Z","mac":"D920A4A6D237","rssi":-66,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:54.836Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A1F03095336"},{"timestamp":"2026-02-09T00:36:54.837Z","mac":"C3000057B9F5","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1E907BA7884"},{"timestamp":"2026-02-09T00:36:55.067Z","mac":"D54E908B7972","rssi":-73,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:55.105Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:55.106Z","mac":"C3000057B9DC","rssi":-73,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC380776BC16"},{"timestamp":"2026-02-09T00:36:55.121Z","mac":"C300003947C4","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2D100002C3300F152F852C"},{"timestamp":"2026-02-09T00:36:55.122Z","mac":"C3000057B9D4","rssi":-66,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB406BB337E"},{"timestamp":"2026-02-09T00:36:55.139Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:55.254Z","mac":"C3000057B9DB","rssi":-52,"rawData":"0201060303AAFE1116AAFE20000C2710000204665A07B0D4E6"},{"timestamp":"2026-02-09T00:36:55.279Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:55.305Z","mac":"C3000057B9F1","rssi":-68,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC1006E55AE6"},{"timestamp":"2026-02-09T00:36:55.366Z","mac":"E017085443A7","rssi":-50,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.417Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:55.423Z","mac":"C3000057B9E8","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70606F29ED6"},{"timestamp":"2026-02-09T00:36:55.446Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:55.531Z","mac":"C3000057B9E7","rssi":-75,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41D0710B52E"}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:54.562Z","type":"Gateway","mac":"AC233FC1DD40","nums":2},{"timestamp":"2026-02-09T00:36:55.098Z","mac":"C3000057B9DC","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC380776BC16"},{"timestamp":"2026-02-09T00:36:55.246Z","mac":"C3000057B9DB","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2710000204665A07B0D4E6"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:54.661Z","type":"Gateway","mac":"AC233FC1DD51","nums":2},{"timestamp":"2026-02-09T00:36:54.903Z","mac":"C3000057B9F4","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB507BE4428"},{"timestamp":"2026-02-09T00:36:55.252Z","mac":"C3000057B9DB","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C2710000204665A07B0D4E6"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:54.745Z","type":"Gateway","mac":"AC233FC1DD3C","nums":5},{"timestamp":"2026-02-09T00:36:54.748Z","mac":"D920A4A6D237","rssi":-83,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:55.366Z","mac":"E017085443A7","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.415Z","mac":"504C97555B00","rssi":-76,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:55.423Z","mac":"C3000057B9E8","rssi":-83,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70606F29ED6"},{"timestamp":"2026-02-09T00:36:55.531Z","mac":"C3000057B9E7","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41D0710B52E"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:54.911Z","type":"Gateway","mac":"AC233FC1DD55","nums":8},{"timestamp":"2026-02-09T00:36:55.032Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:55.121Z","mac":"C300003947C4","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C2D100002C3300F152F852C"},{"timestamp":"2026-02-09T00:36:55.122Z","mac":"C3000057B9D4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C570E0002000BB406BB337E"},{"timestamp":"2026-02-09T00:36:55.366Z","mac":"E017085443A7","rssi":-82,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.416Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:55.423Z","mac":"C3000057B9E8","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70606F29ED6"},{"timestamp":"2026-02-09T00:36:55.608Z","mac":"504C97555B00","rssi":-83,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:55.736Z","mac":"F045AEE31DB4","rssi":-75,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:54.800Z","type":"Gateway","mac":"AC233FC1DD50","nums":1},{"timestamp":"2026-02-09T00:36:55.520Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:54.900Z","type":"Gateway","mac":"AC233FC1DD48","nums":5},{"timestamp":"2026-02-09T00:36:54.944Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:55.270Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:55.533Z","mac":"C3000057B9DF","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F989640794451A"},{"timestamp":"2026-02-09T00:36:55.561Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:55.844Z","mac":"C3000057B9F5","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1EA07BA788E"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:54.942Z","type":"Gateway","mac":"AC233FC1DD4B","nums":7},{"timestamp":"2026-02-09T00:36:55.106Z","mac":"C3000057B9DC","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC380776BC16"},{"timestamp":"2026-02-09T00:36:55.140Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:55.365Z","mac":"E017085443A7","rssi":-74,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.447Z","mac":"C7AE561E38B7","rssi":-69,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:55.730Z","mac":"C3000057B9D9","rssi":-63,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFFE075D673E"},{"timestamp":"2026-02-09T00:36:55.736Z","mac":"F045AEE31DB4","rssi":-79,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.752Z","mac":"C7AE561E38B7","rssi":-69,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:55.102Z","type":"Gateway","mac":"AC233FC1DD4E","nums":7},{"timestamp":"2026-02-09T00:36:55.104Z","mac":"C3000057B9DC","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC380776BC16"},{"timestamp":"2026-02-09T00:36:55.135Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:55.394Z","mac":"E6E749BA2D00","rssi":-83,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:55.443Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:55.709Z","mac":"E6E749BA2D00","rssi":-83,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:55.734Z","mac":"F045AEE31DB4","rssi":-72,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.748Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]
publish_out/ac233fc1dccd [{"timestamp":"2026-02-09T00:36:55.100Z","type":"Gateway","mac":"AC233FC1DCCD","nums":8},{"timestamp":"2026-02-09T00:36:55.252Z","mac":"C3000057B9DB","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C2710000204665A07B0D4E6"},{"timestamp":"2026-02-09T00:36:55.528Z","mac":"C3000057B9E7","rssi":-80,"rawData":"0201060303AAFE1116AAFE20000C39120001F7C41D0710B52E"},{"timestamp":"2026-02-09T00:36:55.539Z","mac":"C3000057B9DF","rssi":-71,"rawData":"0201060303AAFE1116AAFE20000C2D0B0001F989640794451A"},{"timestamp":"2026-02-09T00:36:55.541Z","mac":"C3000057B9DD","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C270E0001F9C830079221CC"},{"timestamp":"2026-02-09T00:36:55.851Z","mac":"C3000057B9F5","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1EA07BA788E"},{"timestamp":"2026-02-09T00:36:55.883Z","mac":"C3000057B9E6","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B806F50090"},{"timestamp":"2026-02-09T00:36:55.891Z","mac":"C300003946AC","rssi":-76,"rawData":"0201060303E1FF1116E1FFA10864AC46390000C34D57423031"},{"timestamp":"2026-02-09T00:36:55.907Z","mac":"C3000057B9F4","rssi":-70,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB607BE4432"}]
publish_out/ac233fc1dcd1 [{"timestamp":"2026-02-09T00:36:55.239Z","type":"Gateway","mac":"AC233FC1DCD1","nums":11},{"timestamp":"2026-02-09T00:36:55.361Z","mac":"E017085443A7","rssi":-42,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.421Z","mac":"C3000057B9E8","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70606F29ED6"},{"timestamp":"2026-02-09T00:36:55.444Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:55.727Z","mac":"C3000057B9D9","rssi":-74,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFFE075D673E"},{"timestamp":"2026-02-09T00:36:55.733Z","mac":"F045AEE31DB4","rssi":-33,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.749Z","mac":"C7AE561E38B7","rssi":-71,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:55.754Z","mac":"D920A4A6D237","rssi":-53,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:56.054Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A2103095336"},{"timestamp":"2026-02-09T00:36:56.064Z","mac":"D54E908B7972","rssi":-58,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:56.110Z","mac":"C3000057B9DC","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C2D100001F0BC390776BC20"},{"timestamp":"2026-02-09T00:36:56.128Z","mac":"C300003947C4","rssi":-56,"rawData":"0201060303AAFE1116AAFE20000C2D100002C33010152F8536"}]
publish_out/ac233fc1dcd3 [{"timestamp":"2026-02-09T00:36:55.203Z","type":"Gateway","mac":"AC233FC1DCD3","nums":0}]
publish_out/ac233fc1dd31 [{"timestamp":"2026-02-09T00:36:55.326Z","type":"Gateway","mac":"AC233FC1DD31","nums":9},{"timestamp":"2026-02-09T00:36:55.364Z","mac":"E017085443A7","rssi":-65,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.423Z","mac":"C3000057B9E8","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70606F29ED6"},{"timestamp":"2026-02-09T00:36:55.447Z","mac":"C7AE561E38B7","rssi":-64,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:55.730Z","mac":"C3000057B9D9","rssi":-65,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFFE075D673E"},{"timestamp":"2026-02-09T00:36:55.736Z","mac":"F045AEE31DB4","rssi":-80,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.752Z","mac":"C7AE561E38B7","rssi":-63,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:56.057Z","mac":"C7AE561E38B7","rssi":-64,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A2103095336"},{"timestamp":"2026-02-09T00:36:56.067Z","mac":"D54E908B7972","rssi":-79,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:56.310Z","mac":"C3000057B9F1","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC1106E55AF0"}]
publish_out/ac233fc1dcee [{"timestamp":"2026-02-09T00:36:55.323Z","type":"Gateway","mac":"AC233FC1DCEE","nums":1},{"timestamp":"2026-02-09T00:36:55.733Z","mac":"F045AEE31DB4","rssi":-84,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dcd2 [{"timestamp":"2026-02-09T00:36:55.543Z","type":"Gateway","mac":"AC233FC1DCD2","nums":12},{"timestamp":"2026-02-09T00:36:55.730Z","mac":"C3000057B9D9","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFFE075D673E"},{"timestamp":"2026-02-09T00:36:55.736Z","mac":"F045AEE31DB4","rssi":-52,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.751Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"},{"timestamp":"2026-02-09T00:36:55.756Z","mac":"D920A4A6D237","rssi":-80,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:56.038Z","mac":"A0D05BD2E2E5","rssi":-82,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:56.056Z","mac":"C7AE561E38B7","rssi":-79,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A2103095336"},{"timestamp":"2026-02-09T00:36:56.066Z","mac":"D54E908B7972","rssi":-71,"rawData":"020106020A001216ABFE40000A0BA10001D54E908B7972300B"},{"timestamp":"2026-02-09T00:36:56.310Z","mac":"C3000057B9F1","rssi":-59,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC1106E55AF0"},{"timestamp":"2026-02-09T00:36:56.360Z","mac":"C7AE561E38B7","rssi":-78,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A2103095336"},{"timestamp":"2026-02-09T00:36:56.366Z","mac":"E017085443A7","rssi":-46,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:56.427Z","mac":"C3000057B9E8","rssi":-62,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70706F29EE0"},{"timestamp":"2026-02-09T00:36:56.500Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dd49 [{"timestamp":"2026-02-09T00:36:55.523Z","type":"Gateway","mac":"AC233FC1DD49","nums":0}]
publish_out/ac233fc1dccb [{"timestamp":"2026-02-09T00:36:55.505Z","type":"Gateway","mac":"AC233FC1DCCB","nums":5},{"timestamp":"2026-02-09T00:36:55.732Z","mac":"C3000057B9D9","rssi":-79,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFFE075D673E"},{"timestamp":"2026-02-09T00:36:55.738Z","mac":"F045AEE31DB4","rssi":-67,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.756Z","mac":"D920A4A6D237","rssi":-77,"rawData":"020106020A001216ABFE40000A0B6D0001D920A4A6D237300B"},{"timestamp":"2026-02-09T00:36:56.312Z","mac":"C3000057B9F1","rssi":-77,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC1106E55AF0"},{"timestamp":"2026-02-09T00:36:56.366Z","mac":"E017085443A7","rssi":-68,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd51 [{"timestamp":"2026-02-09T00:36:55.651Z","type":"Gateway","mac":"AC233FC1DD51","nums":0}]
publish_out/ac233fc1dd40 [{"timestamp":"2026-02-09T00:36:55.551Z","type":"Gateway","mac":"AC233FC1DD40","nums":1},{"timestamp":"2026-02-09T00:36:55.722Z","mac":"C3000057B9D9","rssi":-84,"rawData":"0201060303AAFE1116AAFE20000C2D0F0001E7FFFE075D673E"}]
publish_out/ac233fc1dd3c [{"timestamp":"2026-02-09T00:36:55.737Z","type":"Gateway","mac":"AC233FC1DD3C","nums":6},{"timestamp":"2026-02-09T00:36:55.736Z","mac":"F045AEE31DB4","rssi":-74,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:55.998Z","mac":"504C97555B00","rssi":-75,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:56.380Z","mac":"504C97555B00","rssi":-82,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:56.426Z","mac":"C3000057B9E8","rssi":-82,"rawData":"0201060303AAFE1116AAFE20000C30110001ECF70706F29EE0"},{"timestamp":"2026-02-09T00:36:56.579Z","mac":"504C97555B00","rssi":-75,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:56.734Z","mac":"F045AEE31DB4","rssi":-73,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"}]
publish_out/ac233fc1dd50 [{"timestamp":"2026-02-09T00:36:55.820Z","type":"Gateway","mac":"AC233FC1DD50","nums":3},{"timestamp":"2026-02-09T00:36:55.829Z","mac":"3868A460B93E","rssi":-82,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:56.142Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"},{"timestamp":"2026-02-09T00:36:56.457Z","mac":"3868A460B93E","rssi":-81,"rawData":"1BFF750042040180603868A460B93E3A68A460B93D01020000000000"}]
publish_out/ac233fc1dd48 [{"timestamp":"2026-02-09T00:36:55.951Z","type":"Gateway","mac":"AC233FC1DD48","nums":4},{"timestamp":"2026-02-09T00:36:56.185Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:56.492Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:56.649Z","mac":"A0D05BD2E2E5","rssi":-83,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"},{"timestamp":"2026-02-09T00:36:56.803Z","mac":"A0D05BD2E2E5","rssi":-81,"rawData":"1BFF75004204018066A0D05BD2E2E5A2D05BD2E2E401050000000000"}]
publish_out/ac233fc1dd4b [{"timestamp":"2026-02-09T00:36:55.951Z","type":"Gateway","mac":"AC233FC1DD4B","nums":6},{"timestamp":"2026-02-09T00:36:56.057Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A2103095336"},{"timestamp":"2026-02-09T00:36:56.310Z","mac":"C3000057B9F1","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC1106E55AF0"},{"timestamp":"2026-02-09T00:36:56.361Z","mac":"C7AE561E38B7","rssi":-70,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A2103095336"},{"timestamp":"2026-02-09T00:36:56.367Z","mac":"E017085443A7","rssi":-77,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:56.664Z","mac":"C7AE561E38B7","rssi":-69,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A2103095336"},{"timestamp":"2026-02-09T00:36:56.889Z","mac":"C3000057B9E6","rssi":-78,"rawData":"0201060303AAFE1116AAFE20000C33100001EDC4B906F5009A"}]
publish_out/ac233fc1dd55 [{"timestamp":"2026-02-09T00:36:55.939Z","type":"Gateway","mac":"AC233FC1DD55","nums":6},{"timestamp":"2026-02-09T00:36:55.998Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:56.312Z","mac":"C3000057B9F1","rssi":-81,"rawData":"0201060303AAFE1116AAFE20000C3C120001E7CC1106E55AF0"},{"timestamp":"2026-02-09T00:36:56.366Z","mac":"E017085443A7","rssi":-71,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:56.580Z","mac":"504C97555B00","rssi":-80,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"},{"timestamp":"2026-02-09T00:36:56.735Z","mac":"F045AEE31DB4","rssi":-76,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:56.768Z","mac":"504C97555B00","rssi":-83,"rawData":"020106020A09110712A24D2EFE14488E93D2173CFFE00000051206001000"}]
publish_out/ac233fc1dd4e [{"timestamp":"2026-02-09T00:36:56.051Z","type":"Gateway","mac":"AC233FC1DD4E","nums":13},{"timestamp":"2026-02-09T00:36:56.053Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A2103095336"},{"timestamp":"2026-02-09T00:36:56.256Z","mac":"C3000057B9DB","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C2710000204665B07B0D4F0"},{"timestamp":"2026-02-09T00:36:56.356Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A2103095336"},{"timestamp":"2026-02-09T00:36:56.362Z","mac":"E017085443A7","rssi":-81,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:56.660Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF00020000FF0000FF0000FF0000000000000000052A2103095336"},{"timestamp":"2026-02-09T00:36:56.731Z","mac":"F045AEE31DB4","rssi":-84,"rawData":"0201060C16E0FE2001000000000100000A094D4B20427574746F6E"},{"timestamp":"2026-02-09T00:36:56.739Z","mac":"C3000057B9D9","rssi":-72,"rawData":"0201060303AAFE1116AAFE20000C1E0F0001E7FFFF075D6748"},{"timestamp":"2026-02-09T00:36:56.757Z","mac":"E6E749BA2D00","rssi":-77,"rawData":"0201061916F7FD01DEEC3BA71D8B5AF92343DEEBE8C2E39B0000000003"},{"timestamp":"2026-02-09T00:36:56.763Z","mac":"0BC8DA14CEAC","rssi":-83,"rawData":"0201041AFF004C02152686F39CBADA4658854AA62E7E5E8B8D00010000C9"},{"timestamp":"2026-02-09T00:36:56.852Z","mac":"C3000057B9F5","rssi":-58,"rawData":"0201060303AAFE1116AAFE20000C2710000206F1EB07BA7898"},{"timestamp":"2026-02-09T00:36:56.891Z","mac":"C300003946B1","rssi":-81,"rawData":"0201060303E1FF1116E1FFA10826B146390000C34D57423031"},{"timestamp":"2026-02-09T00:36:56.900Z","mac":"C3000057B9F4","rssi":-76,"rawData":"0201060303AAFE1116AAFE20000C24100002089BB707BE443C"},{"timestamp":"2026-02-09T00:36:56.961Z","mac":"C7AE561E38B7","rssi":-74,"rawData":"02010617FF000100000000000000000000C30600006F4C0000460003095336"}]

+ 0
- 2
data/train/jobs/done/0_1450_500.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
P_1450_500;0;Area_Rilevazione;1450;500;0;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/0_1550_850.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
P_1550_850;0;Area_Rilevazione;1550;850;0;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/1_1050_1450.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
P_1050_1450;1;Area_Mappatura;1050;1450;1;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/1_1250_600.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
P_1250_600;1;Area_Rilevazione;1250;600;0;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/1_1600_450.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
P_1600_450;1;Area_Rilevazione;1600;450;0;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/BC-21_-1_1050_250.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-21_-1_1050_250;-1;BC-21;1050;250;-1;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/BC-21_0_195_1425.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-21_0_195_1425;0;BC-21;195;1425;0;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/BC-21_0_2114_796.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-21_0_2114_796;0;BC-21;2114;796;0;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/BC-21_0_2115_697.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
P_2115_697;0;BC-21;2115;697;0;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/BC-21_0_2568_946.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-21_0_2568_946;0;BC-21;2568;946;0;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/BC-21_0_400_100.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-21_0_400_100;0;BC-21;400;100;0;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/BC-21_0_619_122.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-21_0_619_122;0;BC-21;619;122;0;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/BC-21_1_1050_500.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-21_1_1050_500;1;BC-21;1050;500;1;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/BC-21_1_950_750.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-21_1_950_750;1;BC-21;950;750;1;BC-21;C3:00:00:57:B9:E6

+ 0
- 2
data/train/jobs/done/BC-22_-1_1650_1100.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-22_-1_1650_1100;-1;BC-22;1650;1100;-1;BC-22;C3:00:00:57:B9:D4

+ 0
- 2
data/train/jobs/done/BC-22_-1_170_1418.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-22_-1_170_1418;-1;BC-22;170;1418;-1;BC-22;C3:00:00:57:B9:D4

+ 0
- 2
data/train/jobs/done/BC-22_0_534_999.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-22_0_534_999;0;BC-22;534;999;0;BC-22;C3:00:00:57:B9:D4

+ 0
- 2
data/train/jobs/done/BC-23_0_1580_180.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-23_0_1580_180;0;BC-23;1580;180;0;BC-23;C3:00:00:57:B9:E8

+ 0
- 2
data/train/jobs/done/BC-23_1_130_1386.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-23_1_130_1386;1;BC-23;130;1386;1;BC-23;C3:00:00:57:B9:E8

+ 0
- 2
data/train/jobs/done/BC-23_1_1800_600.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-23_1_1800_600;1;BC-23;1800;600;1;BC-23;C3:00:00:57:B9:E8

+ 0
- 2
data/train/jobs/done/BC-24_1_1900_1400.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-24_1_1900_1400;1;BC-24;1900;1400;1;BC-24;C3:00:00:57:B9:F1

+ 0
- 2
data/train/jobs/done/BC-24_1_2200_1000.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-24_1_2200_1000;1;BC-24;2200;1000;1;BC-24;C3:00:00:57:B9:F1

+ 0
- 2
data/train/jobs/done/BC-25_0_562_239.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-25_0_562_239;0;BC-25;562;239;0;BC-25;C3:00:00:57:B9:E7

+ 0
- 2
data/train/jobs/done/BC-25_1_1450_600.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-25_1_1450_600;1;BC-25;1450;600;1;BC-25;C3:00:00:57:B9:E7

+ 0
- 2
data/train/jobs/done/BC-25_1_2400_300.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-25_1_2400_300;1;BC-25;2400;300;1;BC-25;C3:00:00:57:B9:E7

+ 0
- 2
data/train/jobs/done/BC-25_1_2500_1300.csv Zobrazit soubor

@@ -1,2 +0,0 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-25_1_2500_1300;1;BC-25;2500;1300;1;BC-25;C3:00:00:57:B9:E7

+ 5
- 0
data/train/jobs/done/GBC-00_-1_1291_655.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_-1_1291_655;-1;BC-00-21;1291;655;-1;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_-1_1291_655;-1;BC-04-22;1291;655;-1;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_-1_1291_655;-1;BC-08-23;1291;655;-1;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_-1_1291_655;-1;BC-12-24;1291;655;-1;BC-12-24;C3:00:00:57:B9:F1

+ 5
- 0
data/train/jobs/done/GBC-00_-1_1417_1081.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_-1_1417_1081;-1;BC-00-21;1417;1081;-1;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_-1_1417_1081;-1;BC-04-22;1417;1081;-1;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_-1_1417_1081;-1;BC-08-23;1417;1081;-1;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_-1_1417_1081;-1;BC-12-24;1417;1081;-1;BC-12-24;C3:00:00:57:B9:F1

+ 5
- 0
data/train/jobs/done/GBC-00_-1_152_1379.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_-1_152_1379;-1;BC-00-21;152;1379;-1;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_-1_152_1379;-1;BC-04-22;152;1379;-1;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_-1_152_1379;-1;BC-08-23;152;1379;-1;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_-1_152_1379;-1;BC-12-24;152;1379;-1;BC-12-24;C3:00:00:57:B9:F1

+ 5
- 0
data/train/jobs/done/GBC-00_-1_1687_221.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_-1_1687_221;-1;BC-00-21;1687;221;-1;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_-1_1687_221;-1;BC-04-22;1687;221;-1;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_-1_1687_221;-1;BC-08-23;1687;221;-1;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_-1_1687_221;-1;BC-12-24;1687;221;-1;BC-12-24;C3:00:00:57:B9:F1

+ 3
- 0
data/train/jobs/done/GBC-00_-1_2122_693.csv Zobrazit soubor

@@ -0,0 +1,3 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-04-22_-1_2122_693;-1;BC-04-22;2122;693;-1;BC-04-22;C3:00:00:57:B9:D4
BC-12-24_-1_2122_693;-1;BC-12-24;2122;693;-1;BC-12-24;C3:00:00:57:B9:F1

+ 5
- 0
data/train/jobs/done/GBC-00_-1_2547_235.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_-1_2547_235;-1;BC-00-21;2547;235;-1;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_-1_2547_235;-1;BC-04-22;2547;235;-1;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_-1_2547_235;-1;BC-08-23;2547;235;-1;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_-1_2547_235;-1;BC-12-24;2547;235;-1;BC-12-24;C3:00:00:57:B9:F1

+ 5
- 0
data/train/jobs/done/GBC-00_-1_2642_1057.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_-1_2642_1057;-1;BC-00-21;2642;1057;-1;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_-1_2642_1057;-1;BC-04-22;2642;1057;-1;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_-1_2642_1057;-1;BC-08-23;2642;1057;-1;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_-1_2642_1057;-1;BC-12-24;2642;1057;-1;BC-12-24;C3:00:00:57:B9:F1

+ 5
- 0
data/train/jobs/done/GBC-00_0_1105_707.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_0_1105_707;0;BC-00-21;1105;707;0;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_0_1105_707;0;BC-04-22;1105;707;0;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_0_1105_707;0;BC-08-23;1105;707;0;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_0_1105_707;0;BC-12-24;1105;707;0;BC-12-24;C3:00:00:57:B9:F1

+ 5
- 0
data/train/jobs/done/GBC-00_0_2026_707.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_0_2026_707;0;BC-00-21;2026;707;0;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_0_2026_707;0;BC-04-22;2026;707;0;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_0_2026_707;0;BC-08-23;2026;707;0;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_0_2026_707;0;BC-12-24;2026;707;0;BC-12-24;C3:00:00:57:B9:F1

+ 5
- 0
data/train/jobs/done/GBC-00_0_2897_72.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_0_2897_72;0;BC-00-21;2897;72;0;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_0_2897_72;0;BC-04-22;2897;72;0;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_0_2897_72;0;BC-08-23;2897;72;0;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_0_2897_72;0;BC-12-24;2897;72;0;BC-12-24;C3:00:00:57:B9:F1

+ 5
- 0
data/train/jobs/done/GBC-00_0_2925_1485.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_0_2925_1485;0;BC-00-21;2925;1485;0;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_0_2925_1485;0;BC-04-22;2925;1485;0;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_0_2925_1485;0;BC-08-23;2925;1485;0;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_0_2925_1485;0;BC-12-24;2925;1485;0;BC-12-24;C3:00:00:57:B9:F1

+ 5
- 0
data/train/jobs/done/GBC-00_0_70_1485.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_0_70_1485;0;BC-00-21;70;1485;0;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_0_70_1485;0;BC-04-22;70;1485;0;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_0_70_1485;0;BC-08-23;70;1485;0;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_0_70_1485;0;BC-12-24;70;1485;0;BC-12-24;C3:00:00:57:B9:F1

+ 5
- 0
data/train/jobs/done/GBC-00_0_98_58.csv Zobrazit soubor

@@ -0,0 +1,5 @@
Position;Floor;RoomName;X;Y;Z;BeaconName;MAC
BC-00-21_0_98_58;0;BC-00-21;98;58;0;BC-00-21;C3:00:00:57:B9:E6
BC-04-22_0_98_58;0;BC-04-22;98;58;0;BC-04-22;C3:00:00:57:B9:D4
BC-08-23_0_98_58;0;BC-08-23;98;58;0;BC-08-23;C3:00:00:57:B9:E8
BC-12-24_0_98_58;0;BC-12-24;98;58;0;BC-12-24;C3:00:00:57:B9:F1

Některé soubory nejsou zobrazny, neboť je v této revizi změněno mnoho souborů

Načítá se…
Zrušit
Uložit