Aller au contenu
J3R3M

[Scène] FadeOut intelligent pour VD Sonos

Recommended Posts

Bonjour tout le monde !

 

J'utilise l'excellent VD SONOS Remote V1.0.1 RC pour Fibaro HC2 de Krikroff et je viens d'adapter une de mes scènes pour qu'elle puisse éventuellement servir à certains d'entre vous.

J'utilise cette scène pour simplement éteindre mes enceintes en fondu, soit parce qu'il n'y a plus personne chez moi ou car une extinction est programmée par pièce dès que le mode DODO est activé.

En espérant qu'elle vous soit utile. Enjoy ;-)

 

NB : Je précise que cette scène n'est utile que pour les utilisateurs du VD Sonos Remote de Krikroff !

 

Exemples d'utilisation

  • Avoir plusieurs versions de cette scène avec différents IDs de VD Sonos (par pièce) : Eteindre en fondu cette pièce (si une des enceintes a la main sur le groupe)
  • "Mode Sleep" : Programmer une extinction douce des enceintes, sans vous réveiller :D
  • Eteindre simplement les enceintes, sans se soucier de quelle enceinte a la main

 

Enceinte qui "a la main" ?

C'est effectivement spécifique à l'utilisation du VD. Ce n'est pas perceptible en utilisant les applications Sonos.

Lorsque vous créez un groupement d'enceintes, vous sélectionnez une des enceintes et regroupez celles que vous voulez sur cette enceinte afin qu'elles diffusent le même programme. Cette enceinte a la main sur le groupe.

C'est transparent depuis l'application, puisque vous pouvez ainsi contrôler toutes les enceintes du groupe (Programme - Start - Pause) via n'importe quelle enceinte.

Depuis les VD, le contrôle d'un groupe n'est possible que via le VD de l'enceinte sur laquelle vous avez regroupé les autres. Une action comme un changement de programme, Play ou Pause ne fonctionnera pas sur une enceinte qui n'a pas la main.

Ce VD recherche donc l'enceinte qui a la main parmi les IDs renseignés.

 

Que fait cette scène ?

  • Parcourt les IDs renseignés et récupère le volume de celui-ci et la pièce dans lequel il est affecté
  • Recherche quel(s) VD est (sont) "Maître(s)" (Celui/ceux qui contrôle(nt) les autres VDs)
  • Fait un fade out par pas de volume afin que toutes les enceintes s'atténuent au même niveau (Voir exemple de DEBUG)
  • Une fois à 0%, le bouton Pause est appuyé sur chaque enceinte "maître" pour que le groupe entier soit éteint
  • Remet le volume sur un niveau audible (pour les prochaines lectures)

 

Réglages de la scène

-- Liste IDs VD Sonos
local VD = {242,243,245};
-- Durée entre deux pas de fondu (en secondes)
local DureePas = 3
-- Volumes auxquels seront remises les enceintes après avoir été éteintes
local Volume = 15
  • VD = Tableau contenant les IDs de tous vos VDs Sonos
  • DureePas = Temps entre deux atténuations de volume
  • Volume = Volume qui sera réglé sur chaque enceinte après les avoir éteintes

 

En théorie, vous ne devriez pas avoir à modifier les valeurs de ces variables si vous utilisez le VD tel quel. J'ai simplement créé les variables suivantes pour mon usage personnel puisque j'ai modifié le VD original.

-- ID du Slider Volume des VD
local SliderVol = "15"
-- ID du Bouton Pause des VD
local BtnPause = "8"

 

Exemple de DEBUG

 

Dans cet exemple, on voit que l'enceinte de la cuisine était la plus forte.

La scène la baisse donc pourcentage par pourcentage jusqu'à ce qu'une autre enceinte soit au même volume (ici, la Chambre à 11%).

Ainsi de suite, on voit par la suite que l'enceinte de l'entrée était à 5%, le volume des trois enceintes est donc ensuite baissé simultanément, jusqu'à 0%

385530451_Capturedecran2019-04-07a20_44_50.png.c26858fa60b7c4b621e4aafcee151f99.png

 

Scène

--
-- FadeOut intelligent pour VD Sonos v1 (J3R3M)
-- Date : 7 Avril 2019
-- VD Sonos par Krikroff : https://www.domotique-fibaro.fr/topic/616-fibaro-hc2-vd-sonos-remote-t%C3%A3%C2%A9l%C3%A3%C2%A9commande-pour-diffuseur-sonos/
--

-- Liste IDs VD Sonos
local VD = {242,243,245};
-- Durée entre deux pas de fondu (en secondes)
local DureePas = 3
-- Volumes auxquels seront remises les enceintes après avoir été éteintes
local Volume = 15

--
---- Ne rien modifier sous ces lignes
--

-- ID du Slider Volume des VD
local SliderVol = "15"
-- ID du Bouton Pause des VD
local BtnPause = "8"

-- Debug
local debug = 1;
local function Debug(color,message)
  if debug == 1 and color ~= nil and message ~= nil then
    fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"));
  end
end

-- Tableau qui contiendra les infos
local ListeVDSonos = {};

-- Quelles enceintes ont la main ?
local function LookForMaster()
  local j,t = 1,{};
  for i=1,#VD do
    local GetVol = tonumber(fibaro:getValue(VD[i], "ui.slVolume.value"));
    local GetRoomName = fibaro:getRoomNameByDeviceID(VD[i]);
    table.insert(ListeVDSonos,{piece=GetRoomName, id=VD[i], vol=GetVol});
    Debug("grey", "["..GetRoomName.."] [VD "..VD[i].."] ajouté à la table 'ListeVDSonos' (Volume = "..GetVol..")");
    if fibaro:getValue(VD[i], "ui.lblPosition.value") ~= "NOT_IMPLEMENTED" then
      Debug("white", "["..GetRoomName.."] [VD "..VD[i].."] Enceinte Maître.");
      t[j] = VD[i];
      j = j+1;
    end -- Condition Enceinte a la main ou non
  end -- IDs Sonos un par un
  return t;
end

-- Transfert du résultat dans une variable classique
local Maitre = LookForMaster();

-- Enceintes ne sont pas en lecture ?
local function CheckLecture()
  local t = {};
  for i=1,#Maitre do
    if fibaro:getValue(Maitre[i], "ui.lblState.value") ~= "Stopped" and fibaro:getValue(Maitre[i], "ui.lblState.value") ~= "Paused" then
      Debug("grey", "L'enceinte Maître "..Maitre[i].." "..i.."/"..#Maitre.." est actuellement en lecture.");
      table.insert(t, Maitre[i]);
    end
  end
  if #t == 0 then
    Debug("yellow", "Les enceintes ne sont pas en lecture. Scène arrêtée.");
    fibaro:abort();
  end
  return t;
end

CheckLecture();

-- Recherche du volume maxi actuel
local function VolMax()
  table.sort(ListeVDSonos, function(a, b) return a.vol > b.vol end);
  Debug("green", "[VolMax] Le volume SONOS le plus fort est "..ListeVDSonos[1].vol.."% ("..ListeVDSonos[1].piece..")");
  return ListeVDSonos[1].vol;
end

-- On remet sur un niveau audible
local function Niveau(Vol)
  Debug("grey","[Niveau] Début - Fonction Niveau audible");
  Vol = Vol or 15;
  for i=1,#ListeVDSonos do
    fibaro:call(ListeVDSonos[i].id, "setSlider", SliderVol, Vol);
    Debug("darkblue", "[Niveau] ["..ListeVDSonos[i].piece.."] [VD "..ListeVDSonos[i].id.."] Enceinte à "..Vol.."%.");
    fibaro:sleep(1000);
  end -- for globals
  Debug("grey","[Niveau] Fin - Fonction Niveau audible");
end

local function Pause()
  for i=1,#Maitre do
    fibaro:call(Maitre[i], "pressButton", BtnPause);
  end
  setTimeout(Niveau,2000);
end

-- Fade out global
local function FadeOut(VMax,delai)
  Debug("grey","[FadeOut] Début - Fonction FadeOut. Durée prévue : "..VMax*delai.."s");
  for i=VMax, 0, -1 do
    for j=1,#ListeVDSonos do
      local valeur_init = tonumber(ListeVDSonos[j].vol);
      if i <= valeur_init then
        fibaro:call(ListeVDSonos[j].id, "setSlider", SliderVol, i);
        Debug("lightblue","[FadeOut] ["..ListeVDSonos[j].piece.."] [VD "..ListeVDSonos[j].id.."] Enceinte à "..i.."%.");
      end
    end -- Boucle Enceintes
    fibaro:sleep(delai*1000);
  end -- Boucle -1
  Debug("grey","[FadeOut] Fin - Fonction FadeOut. Durée prévue : "..VMax*delai.."s");
  setTimeout(Pause,2000);
end

FadeOut(VolMax(),DureePas);

 

Modifié par J3R3M
  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Excellent, sympa le fade out avant extinction.
Merci encore pour le partage.
J aime beaucoup l'idée

Envoyé de mon BND-L21 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci @pepite :)

Je viens de modifier un peu le premier post en essayant d'être un peu plus clair :)

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×