You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

89 lines
3.6 KiB

  1. import streamlit as st
  2. import pandas as pd
  3. import os
  4. def load_beacons(file_path, delimiter):
  5. """Carica i beacon dal file CSV utilizzando il delimitatore configurato."""
  6. if not os.path.exists(file_path):
  7. return pd.DataFrame(columns=["BeaconName", "MAC"])
  8. try:
  9. return pd.read_csv(file_path, sep=delimiter)
  10. except Exception:
  11. return pd.DataFrame(columns=["BeaconName", "MAC"])
  12. def save_beacons(file_path, df, delimiter):
  13. """Salva i beacon su CSV con il separatore corretto e crea le cartelle se necessario."""
  14. folder = os.path.dirname(file_path)
  15. if folder and not os.path.exists(folder):
  16. os.makedirs(folder, exist_ok=True)
  17. df.to_csv(file_path, index=False, sep=delimiter)
  18. def show_beacon_manager(config):
  19. st.subheader("🏷️ Gestione Anagrafica Beacon")
  20. # Recupero parametri dalla gerarchia paths del config.yaml
  21. paths_cfg = config.get("paths", {})
  22. beacons_file = paths_cfg.get("beacons_csv", "/data/config/beacons.csv")
  23. delimiter = paths_cfg.get("csv_delimiter", ";")
  24. # Caricamento dati
  25. df = load_beacons(beacons_file, delimiter)
  26. # --- SEZIONE AGGIUNTA ---
  27. with st.expander("➕ Aggiungi Nuovo Beacon", expanded=len(df) == 0):
  28. col1, col2 = st.columns(2)
  29. with col1:
  30. name = st.text_input("Nome Beacon (es. BC-21)")
  31. with col2:
  32. mac = st.text_input("Indirizzo MAC (es. C3:00:00:57:B9:E6)")
  33. if st.button("REGISTRA BEACON"):
  34. if name and mac:
  35. mac = mac.strip().upper()
  36. if mac in df['MAC'].values:
  37. st.error("Errore: Questo MAC è già presente in lista.")
  38. else:
  39. new_line = pd.DataFrame([{"BeaconName": name, "MAC": mac}])
  40. df = pd.concat([df, new_line], ignore_index=True)
  41. save_beacons(beacons_file, df, delimiter)
  42. st.success(f"Beacon {name} registrato correttamente!")
  43. st.rerun()
  44. else:
  45. st.warning("Inserisci sia il Nome che il MAC address.")
  46. # --- SEZIONE VISUALIZZAZIONE E MODIFICA ---
  47. if not df.empty:
  48. st.markdown("---")
  49. st.write("### Lista Beacon")
  50. st.info("💡 Puoi modificare i nomi o i MAC direttamente cliccando nelle celle della tabella e poi cliccare su SALVA.")
  51. # Editor interattivo per modifiche "al volo"
  52. edited_df = st.data_editor(
  53. df,
  54. use_container_width=True,
  55. hide_index=True,
  56. column_config={
  57. "BeaconName": st.column_config.TextColumn("Nome Beacon", help="Nome identificativo", required=True),
  58. "MAC": st.column_config.TextColumn("Indirizzo MAC", help="Formato AA:BB:CC...", required=True)
  59. }
  60. )
  61. # Controllo se ci sono state modifiche
  62. if not edited_df.equals(df):
  63. if st.button("💾 SALVA MODIFICHE TABELLA"):
  64. save_beacons(beacons_file, edited_df, delimiter)
  65. st.success("Anagrafica aggiornata!")
  66. st.rerun()
  67. # --- SEZIONE ELIMINAZIONE ---
  68. st.markdown("---")
  69. st.subheader("Elimina Beacon")
  70. to_del = st.selectbox("Seleziona il beacon da rimuovere:", df['BeaconName'].tolist())
  71. if st.button("🗑️ ELIMINA SELEZIONATO"):
  72. df = df[df['BeaconName'] != to_del]
  73. save_beacons(beacons_file, df, delimiter)
  74. st.success(f"Beacon {to_del} rimosso.")
  75. st.rerun()
  76. else:
  77. st.info("Nessun beacon configurato. Inserisci il primo beacon per creare il file.")