diff --git a/.tf5_mixer_cache/channels_cache.json b/.tf5_mixer_cache/channels_cache.json index 35d9786..a4fdeba 100644 --- a/.tf5_mixer_cache/channels_cache.json +++ b/.tf5_mixer_cache/channels_cache.json @@ -37,10 +37,10 @@ }, "6": { "channel": 6, - "name": "Vox2", - "on": true, - "level_db": -1.1, - "pan": 0 + "name": "ON", + "on": false, + "level_db": 0.01, + "pan": 200 }, "7": { "channel": 7, diff --git a/__pycache__/mixer_controller.cpython-312.pyc b/__pycache__/mixer_controller.cpython-312.pyc index b886b94..3b30012 100644 Binary files a/__pycache__/mixer_controller.cpython-312.pyc and b/__pycache__/mixer_controller.cpython-312.pyc differ diff --git a/mixer_controller.py b/mixer_controller.py index cc3e3df..abd3275 100644 --- a/mixer_controller.py +++ b/mixer_controller.py @@ -819,4 +819,100 @@ class TF5MixerController: "mixes": mixes, "cache_age_seconds": int(cache_age), "message": f"Riepilogo di {len(mixes)} mix (cache: {int(cache_age)}s fa)" + } + + def set_channel_to_mix_level(self, channel: int, mix_number: int, level_db: float) -> dict: + """Imposta il livello di invio di un canale verso un mix/aux. + + Args: + channel: Numero del canale (1-40) + mix_number: Numero del mix (1-20) + level_db: Livello in dB (da -inf a +10.0) + + Returns: + Un dizionario con lo stato dell'operazione + """ + if not 1 <= channel <= TF5_INPUT_CHANNELS: + return {"status": "error", "message": f"Il canale deve essere tra 1 e {TF5_INPUT_CHANNELS}"} + if not 1 <= mix_number <= TF5_MIX_BUSSES: + return {"status": "error", "message": f"Il mix deve essere tra 1 e {TF5_MIX_BUSSES}"} + + if level_db <= -138: + internal_value = -32768 + else: + internal_value = int(level_db * 100) + + command = f"set MIXER:Current/InCh/ToMix/Level {channel-1} {mix_number-1} {internal_value}" + response = self._send_command(command) + + return { + "status": "success" if "OK" in response else "error", + "message": f"Canale {channel} → Mix {mix_number} impostato a {level_db:+.1f} dB", + "response": response + } + + def set_channel_to_mix_on_off(self, channel: int, mix_number: int, state: bool) -> dict: + """Accende o spegne l'invio di un canale verso un mix/aux. + + Args: + channel: Numero del canale (1-40) + mix_number: Numero del mix (1-20) + state: True per accendere, False per spegnere + + Returns: + Un dizionario con lo stato dell'operazione + """ + if not 1 <= channel <= TF5_INPUT_CHANNELS: + return {"status": "error", "message": f"Il canale deve essere tra 1 e {TF5_INPUT_CHANNELS}"} + if not 1 <= mix_number <= TF5_MIX_BUSSES: + return {"status": "error", "message": f"Il mix deve essere tra 1 e {TF5_MIX_BUSSES}"} + + value = 1 if state else 0 + command = f"set MIXER:Current/InCh/ToMix/On {channel-1} {mix_number-1} {value}" + response = self._send_command(command) + + return { + "status": "success" if "OK" in response else "error", + "message": f"Invio canale {channel} → Mix {mix_number} {'acceso' if state else 'spento'}", + "response": response + } + + def get_channel_to_mix_info(self, channel: int, mix_number: int) -> dict: + """Legge le informazioni dell'invio di un canale verso un mix. + + Args: + channel: Numero del canale (1-40) + mix_number: Numero del mix (1-20) + + Returns: + Un dizionario con le informazioni del send + """ + if not 1 <= channel <= TF5_INPUT_CHANNELS: + return {"status": "error", "message": f"Il canale deve essere tra 1 e {TF5_INPUT_CHANNELS}"} + if not 1 <= mix_number <= TF5_MIX_BUSSES: + return {"status": "error", "message": f"Il mix deve essere tra 1 e {TF5_MIX_BUSSES}"} + + ch_idx = channel - 1 + mix_idx = mix_number - 1 + + # Leggi livello + resp_level = self._send_command(f"get MIXER:Current/InCh/ToMix/Level {ch_idx} {mix_idx}") + level_raw = self._parse_value(resp_level) + try: + level_int = int(level_raw) + level_db = level_int / 100.0 if level_int > -32768 else float('-inf') + except: + level_db = None + + # Leggi stato ON/OFF + resp_on = self._send_command(f"get MIXER:Current/InCh/ToMix/On {ch_idx} {mix_idx}") + is_on = self._parse_value(resp_on) == "1" + + return { + "status": "success", + "channel": channel, + "mix": mix_number, + "on": is_on, + "level_db": level_db, + "message": f"Canale {channel} → Mix {mix_number}: {level_db:+.1f} dB ({'ON' if is_on else 'OFF'})" } \ No newline at end of file diff --git a/telegram_bot.py b/telegram_bot.py index d744f78..92a3ddc 100644 --- a/telegram_bot.py +++ b/telegram_bot.py @@ -129,6 +129,9 @@ class TF5TelegramBot: self.controller.get_all_channels_summary, self.controller.get_all_mixes_summary, self.controller.refresh_cache, + self.controller.set_channel_to_mix_level, + self.controller.set_channel_to_mix_on_off, + self.controller.get_channel_to_mix_info, ], temperature=0, ) @@ -185,6 +188,11 @@ IDENTIFICAZIONE CANALI E MIX: - "tutti i mic/tutte le chitarre" → cerca e gestisci multipli - "il monitor" / "l'aux 2" → cerca tra i mix +SEND AI MIX/AUX: +- "alza il gelato nell'aux 2" → usa set_channel_to_mix_level +- "manda più chitarra nel monitor" → aumenta il send +- "togli la voce dal mix 3" → spegni il send o abbassa molto + SCENE: - "carica/richiama/vai alla scena X" → recall_scene - Accetta "A5", "scena A 5", "la cinque del banco A", ecc.