您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

111 行
4.5 KiB

  1. import streamlit as st
  2. import pandas as pd
  3. import os
  4. from pathlib import Path
  5. # CORREZIONE: rimosso il punto per evitare ImportError
  6. from normalize import norm_mac
  7. def show_beacon_manager(cfg):
  8. st.subheader("🏷️ Gestione Beacon e Gruppi")
  9. paths = cfg.get("paths", {})
  10. beacon_csv = paths.get("beacons_csv", "/data/config/beacons.csv")
  11. group_csv = "/data/config/beacongroup.csv"
  12. csv_delim = paths.get("csv_delimiter", ";")
  13. # --- CARICAMENTO DATI ---
  14. def load_df(path, cols):
  15. if os.path.exists(path):
  16. try:
  17. df = pd.read_csv(path, sep=csv_delim)
  18. df.columns = [c.strip() for c in df.columns]
  19. return df
  20. except:
  21. return pd.DataFrame(columns=cols)
  22. return pd.DataFrame(columns=cols)
  23. df_beacons = load_df(beacon_csv, ["BeaconName", "MAC"])
  24. df_groups = load_df(group_csv, ["BeaconGroupName", "GroupMAC"])
  25. # --- UI: TABS INTERNI ---
  26. sub_tab1, sub_tab2 = st.tabs(["Individuali", "Gruppi"])
  27. with sub_tab1:
  28. st.markdown("### 📋 Anagrafica Beacon Singoli")
  29. # Editor interattivo per i beacon
  30. edited_beacons = st.data_editor(
  31. df_beacons,
  32. num_rows="dynamic",
  33. use_container_width=True,
  34. key="editor_beacons",
  35. hide_index=True
  36. )
  37. if st.button("💾 Salva Beacon Individuali"):
  38. # Applichiamo la normalizzazione ai MAC inseriti
  39. try:
  40. edited_beacons['MAC'] = edited_beacons['MAC'].apply(norm_mac)
  41. edited_beacons.to_csv(beacon_csv, index=False, sep=csv_delim)
  42. st.success("Anagrafica Beacon salvata correttamente!")
  43. st.rerun()
  44. except Exception as e:
  45. st.error(f"Errore durante il salvataggio: {e}")
  46. with sub_tab2:
  47. st.markdown("### 🏗️ Creazione e Gestione Gruppi")
  48. # Mostra i gruppi esistenti se il file esiste
  49. if not df_groups.empty:
  50. st.write("#### Gruppi Attivi")
  51. st.dataframe(df_groups, use_container_width=True, hide_index=True)
  52. else:
  53. st.info("Nessun gruppo configurato.")
  54. st.divider()
  55. st.write("#### Aggiungi o Modifica un Gruppo")
  56. # Form per la gestione dei gruppi
  57. with st.form("form_gruppo"):
  58. gn = st.text_input("Nome Gruppo", help="Esempio: 4dBm_Power, Gruppo_A, ecc.")
  59. # Recuperiamo i beacon disponibili per popolare la selezione
  60. available_macs = df_beacons["MAC"].tolist()
  61. available_names = df_beacons["BeaconName"].tolist()
  62. options = [f"{name} ({mac})" for name, mac in zip(available_names, available_macs)]
  63. selected_options = st.multiselect("Seleziona i Beacon da includere:", options)
  64. submit = st.form_submit_button("💾 Salva Gruppo")
  65. if submit:
  66. if not gn:
  67. st.error("Inserisci un nome per il gruppo.")
  68. elif not selected_options:
  69. st.error("Seleziona almeno un beacon.")
  70. else:
  71. # Estraiamo i MAC eliminando la parte del nome
  72. selected_macs = [opt.split("(")[-1].replace(")", "") for opt in selected_options]
  73. mac_list_str = ",".join(selected_macs)
  74. # Aggiorna se esiste, altrimenti aggiungi
  75. if gn in df_groups["BeaconGroupName"].values:
  76. df_groups.loc[df_groups["BeaconGroupName"] == gn, "GroupMAC"] = mac_list_str
  77. else:
  78. new_row = pd.DataFrame([{"BeaconGroupName": gn, "GroupMAC": mac_list_str}])
  79. df_groups = pd.concat([df_groups, new_row], ignore_index=True)
  80. # Assicuriamoci che la cartella esista
  81. os.makedirs(os.path.dirname(group_csv), exist_ok=True)
  82. df_groups.to_csv(group_csv, index=False, sep=csv_delim)
  83. st.success(f"Gruppo '{gn}' creato/aggiornato con successo!")
  84. st.rerun()
  85. if not df_groups.empty:
  86. if st.button("🗑️ Elimina tutti i Gruppi"):
  87. if os.path.exists(group_csv):
  88. os.remove(group_csv)
  89. st.warning("Configurazione gruppi rimossa.")
  90. st.rerun()
  91. return df_beacons, df_groups