Aller au contenu
Krikroff

Fibaro Hc2 Vd Sonos Remote: Télécommande Pour Diffuseur Sonos

Recommended Posts

@did, code épuré pour un bouton VD.

local currentDate = os.date("*t");
local cond = fibaro:getValue(3, "WeatherConditionConverted");
local tempext = figaro:getValue(63, "value"); -- température extérieure
local degre = string.gsub(tempext, '[,]' , ' degré ')
local degre = string.gsub(degre, '[.]' , ' degré ')
local degre = string.gsub(degre, '[-]' , ' moins ')
local jour ="";
if( os.date("*t").wday == 2 ) then jour = "Lundi"; end
if( os.date("*t").wday == 3 ) then jour = "Mardi"; end
if( os.date("*t").wday == 4 ) then jour = "Mercredi"; end
if( os.date("*t").wday == 5 ) then jour = "Jeudi"; end
if( os.date("*t").wday == 6 ) then jour = "Vendredi"; end
if( os.date("*t").wday == 7 ) then jour = "Samedi"; end
if( os.date("*t").wday == 1 ) then jour = "Dimanche"; end
local mois ="";
if( os.date("*t").month == 1 ) then mois = "janvier"; end
if( os.date("*t").month == 2 ) then mois = "fevrier"; end
if( os.date("*t").month == 3 ) then mois = "mars"; end
if( os.date("*t").month == 4 ) then mois = "avril"; end
if( os.date("*t").month == 5 ) then mois = "mai"; end
if( os.date("*t").month == 6 ) then mois = "juin"; end
if( os.date("*t").month == 7 ) then mois = "juillet"; end
if( os.date("*t").month == 8 ) then mois = "aout"; end
if( os.date("*t").month == 9 ) then mois = "septembre"; end
if( os.date("*t").month == 10) then mois = "octobre"; end
if( os.date("*t").month == 11) then mois = "novembre"; end
if( os.date("*t").month == 12) then mois = "décembre"; end
local condfr ="";
if( cond == "clear" ) then condfr = "clair"; end
if( cond == "cloudy" ) then condfr = "nuageux"; end
if( cond == "rain" ) then condfr = "pluvieux"; end
if( cond == "snow" ) then condfr = "neigeux"; end
if( cond == "storm" ) then condfr = "tempete"; end
if( cond == "fog" ) then condfr = "brouillard"; end
-- 534 is the Virtual Device ID
-- 28 is the Process button ID
local sid, bid = 534, 28
-- Create TTS params object
local params = {
  -- TTS Message
  message = "Bonjour a vous. Nous sommes le "..jour .." "..currentDate.day .." "..mois ..". Le thermomètre extérieur est a "..degre ..", et le temps est  "..condfr ..". ",  
  duration = 'auto',    -- Duration: "auto", xx seconds
  language = "fr-FR",    -- Language: fr-FR
  volume = 40            -- Volume
}
local _f = fibaro
local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end}
-- Make a request to the remote to process params object instantly
_x:set(tostring(sid), { tts = params })
_f:call(sid, "pressButton", bid)

Reste a changer le texte du message.

  • Upvote 3

Partager ce message


Lien à poster
Partager sur d’autres sites

 Encore mieux, rien à  modifier.

Merci @13013, ça marche. :13:

Partager ce message


Lien à poster
Partager sur d’autres sites

c'est génial ton truc !.

Je rajouterais bien l'heure du moment de l'annonce

Partager ce message


Lien à poster
Partager sur d’autres sites

@jojo, Comme on a deja déclaré la variable au debut

local currentDate = os.date("*t");

il suffit de rajouter dans le message ceci par exemple:

Il est "..currentDate.hour.." heure "..currentDate.min.." minute.

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci, je vois à  l'instant ton code, et je l'avais trouvé entre temps.

 

Je me suis permis de le modifier un petit peu pour optimiser les if

-- 239 is the Virtual Device ID
-- 28 is the Process button ID
local sid, bid = 239, 28

local cond = fibaro:getValue(3, "WeatherConditionConverted");
local tempext = fibaro:getValue(33, "value"); -- température extérieure
fibaro:debug ("Température extérieure : "..tempext)
local degre = string.gsub(tempext, '[,]' , ' degré ')
local degre = string.gsub(degre, '[.]' , ' degré ')
local degre = string.gsub(degre, '[-]' , ' moins ')

local currentDate = os.date("*t")
local jourL = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"}
local jour = jourL[currentDate.wday]
fibaro:debug ("Jour : "..jour)

local moisL = {"janvier", "février", "mars", "avril", "mai", "juin",
               "juillet", "aout", "septembre", "octobre", "novembre", "décembre"}
local mois = moisL[currentDate.month]
fibaro:debug ("Mois : "..mois)

local condfr ="";
if( cond == "clear" ) then condfr = "clair"; end
if( cond == "cloudy" ) then condfr = "nuageux"; end
if( cond == "rain" ) then condfr = "pluvieux"; end
if( cond == "snow" ) then condfr = "neigeux"; end
if( cond == "storm" ) then condfr = "tempete"; end
if( cond == "fog" ) then condfr = "brouillard"; end
fibaro:debug ("Conditions météorologiques : "..condfr)

fibaro:debug ("Création du TTS")
-- Create TTS params object
local params = {
  -- TTS Message
  message = "Bonjour a vous. Nous sommes le "..jour .." "..currentDate.day .." "..mois ..
            ". Il est ".. currentDate.hour .." heure et ".. currentDate.min .." minutes. "..
            "Le thermomètre extérieur est a "..degre ..
            ", et le temps est  "..condfr ..". ",  
  duration = 'auto',    -- Duration: "auto", xx seconds
  language = "fr-FR",    -- Language: fr-FR
  volume = 40            -- Volume
}
local _f = fibaro
local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end}
-- Make a request to the remote to process params object instantly
_x:set(tostring(sid), { tts = params })
_f:call(sid, "pressButton", bid)

Maintenant, je vais essayé de voir si une scène ne pourrait pas capté que le sono a ddémarré suite à  une alarme définie par Sonos, pour qu'il fasse cette annonce. Ce serait top ...

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Surtout pour les fêtes, on y passe du temps   :98:

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci 13013 pour le code et àjojo pour l'optimisation. Par contre lorsque je lance le TTS, l'annonce se déroule sans problème mais àla fin, elle recommence par un 'Bonjour àv" puis se coupe sans terminer le "vous". On dirait qu'elle répète le TTS mais ça coupe à"Vous". Vous avez le même soucis ?

Partager ce message


Lien à poster
Partager sur d’autres sites

@yohan, j'avais le même soucis répétition deux ou trois fois avec la V0.08 mais avec la V0.01 peut être que la durée auto y fait quelque chose.A la création d'autre tts j'ai une répétition du premier mot mais c'est aléatoire.

Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Les présélections correspondent à  "Mes stations de radio" dans  "Radio via TuneIn"

 

idem chez moi, j'ai présélectionné des radios, mais ça joue rien ..

 

si je sélectionne la radio par l'app sonos elle joue

si je change par le VD, j'ai bien le retour

Play radio 2 command was sent

mais  ça fait rien, je reste sur la radio en cours

 

une idée ?

 

 

le TTS fonctionne bien par contre, et la source repart après la lecture du TTS

Partager ce message


Lien à poster
Partager sur d’autres sites

Voir ICI et ICI à  propos de "la liste de ses radios préférées sous SONOS" d'une part, mais aussi pour le problème des radios qui ne "démarrent pas après sélection depuis le module virtuel" (elles sont bien sélectionnées mais le play ne s'effectue pas)

Partager ce message


Lien à poster
Partager sur d’autres sites

oups désolé pas vu.

merci

 

mais pour le PLAY qui ne se fait pas ; faut patienter ou il ne va jamais passer ?

que j'attends un peu ça passe pas, et si je fais play ça démarre de suite.

Partager ce message


Lien à poster
Partager sur d’autres sites

Pas de problème.... @Krikroff pourrait peut-être indiquer cette précision dans son 1er post  ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

mais pour le PLAY qui ne se fait pas ; faut patienter ou il ne va jamais passer ?

que j'attends un peu ça passe pas, et si je fais play ça démarre de suite.

Pour l'instant et pour certaines radios le "play" ne s'effectue pas...

Je change la sélection de radio de ma PLAY:1 de sdb depuis une télécommande Octan Remote et je constate le problème sur certaines radios

Ce qui m'oblige à  appuyer sur la touche Play du Sonos... il faudrait que j'essaye d'ajouter dans mon script un call du bouton 7 (PLAY) du VD de @Krikroff après 4 secondes environ

..... En attendant une nouvelle version de @Krikroff ? 

Partager ce message


Lien à poster
Partager sur d’autres sites

ok compris, comme je voulais lancer la radio au reveil, je ferai cet appuie avec GEA et je fixerai aussi le volume sonore ... pour garder le WAF

merci

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci @Sakkhho 

Je devais modifier mon script depuis 15 jours et puis.... bref, je viens de le faire et le problème est contourné  :)

Partager ce message


Lien à poster
Partager sur d’autres sites

j'utilise l'appli Sono (sur MAC, Android, ...) pour configurer mon Sonos comme réveil; c'est c'est facile.

Comme je voudrais qu'au réveil il me donne le message avec la météo, ... (du TTS) et ensuite la radio, je ne peut pas utiliser l'appli standard Sonos.

Je pensais alors àcréer une entrée dans Google Calendar pour cela, qui lancerait un VD, qui lui même lancerait le TTS puis la radio.

Ca devrait fonctionner, mais cela me semble fort lourd. Avez-vous d'autres idées de mise en oeuvre ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu dois pouvoir faire ça avec un VD GEA Alarm (comme ça tu peux régler l'heure de réveil directement depuis l'appli Fibaro en choisissant l'heure sur le VD)

Ensuite, GEA s'occupe de l'annonce TTS puis de la lecture.

C'est juste une idée..... j'ai pas encore mis en oeuvre

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

TRES bonne idée, je n'ai encore jamais essayé GEA alame, ce sera l'occasion

Partager ce message


Lien à poster
Partager sur d’autres sites

bonjour, y a t il un moyen de récupérer l'état de la sonos (Stopped  par exemple) pour repasser le son à  une certaine valeur et éviter ensuite au redémarrage d'avoir un son super fort si on s'est un peu lâcher avant de partir :-)

je pense à  garder mon WAF à  100% moi :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Une scene que j'ai mis dans ma salle d'eau qui lorsque j'allume la lumière (fgd212) met en route ma Play1 sur une radio deja présélectionné.

Mais surtout règle le son a un volume raisonnable (desfois que l'on se soit "lâché").

--[[
%% properties
153 value
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
local Maintenant = os.date( "*t" )

--de 7h a 21h59  lumière a 100% et musique sinon lumière 30% sans musique 
if (
( Maintenant['hour'] >=7 and Maintenant['hour'] <=21 )
 )
then 
if (
 ( tonumber(fibaro:getValue(153, "value")) > 0 )
or
startSource["type"] == "other"
)
then
    fibaro:call (153, 'setValue' , '100');-- plafonnier
    fibaro:call(172, "setSlider", "15", "12");--volume preregler a 12 sonos
	setTimeout(function()
		fibaro:call(172, "pressButton", "7");--sonos play
	end, 1000)
end
else if 
  ( tonumber(fibaro:getValue(153, "value")) > 0 )
 
then
    fibaro:call (153, 'setValue' , '30')
end
end
if (
 ( tonumber(fibaro:getValue(153, "value")) == 0 and fibaro:getValue(172, "ui.lblDebug.value") == "Play")) 
then
    fibaro:call(172, "pressButton", "9") --sonos stop
end


Ce sont des scene que j'ai fait a la va vite, toute optimisation est la bien venue.

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai remarqué que l'on ne peut pas passer trop rapidement des commandes au Sonos. tu as aussi ce comportement ? (le timeout 1000 est là  pour cela ?)

 

perso ce que j'ai fait, je rajoute une VG qui reprends l'état de 'STATE'

_f:setGlobal("EtatPlaybar",a) 

et avec GEA, si STATE est à  Stopped, pendant 15 minutes, alors je fixe le son à  10

 GEA.add ({"Global", "EtatPlaybar", "Stopped"}, 15*60, "",{{"Slider", id["SONOS_REMOTE"], 15, 10}})

Partager ce message


Lien à poster
Partager sur d’autres sites

oui le timeout permet de passer les commandes lentement, sinon comme tu l'a remarqué c'est trop rapide. J'ai le meme problème avec du stream + TTS.

Je pense que je vais m'intéresser au GEA. mais avant, @ i-magin,  je vais me remettre a  table. :)

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

bizarre ce matin j'ai un bug 

 

main loop :

[DEBUG] 10:16:28: Unable to process data, check variable
[ERROR] 10:16:28: line 106: attempt to index local 'e' (a nil value)

kesako ?

Partager ce message


Lien à poster
Partager sur d’autres sites

×