25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 

111 satır
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