Script gestion télé Sony Bravia au cas où …

Vous avez crée un script lua dont vous êtes fier, un .sh génial, un programme python hors du commun, un tuto , c'est ici que vous pouvez les partager.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre [Quote] et {/Quote]
Répondre
lmet
Messages : 187
Enregistré le : 30 juin 2017, 18:16
Localisation : Val d'Oise
Contact :

Script gestion télé Sony Bravia au cas où …

Message par lmet » 14 sept. 2019, 02:17

Bonsoir,

Au cas où car les scripts pour les télés Samsung fleurissent mais pas grand-chose pour les télés Sony Bravia.
Comme j'en ai marre de cavaler à la recherche de la télécommande :( J'ai décidé de me fendre d'un script pour, au mieux allumer/éteindre la télé et pourquoi pas mettre ma chaine préférée en fonction du jour et de l'heure.
Pour cela :

° J'ai créé deux "dummy" de type "switch"
img_001.jpg
img_001.jpg (30.27 Kio) Vu 198 fois
° Pour le "dummy" délai dans l'onglet "Modifier" j'ai indiqué un délai d'extinction de 10 secondes :
img_002.jpg
img_002.jpg (56.61 Kio) Vu 198 fois
L'idée étant qu'un délai de 10 secondes soit respecté après l'allumage avant l'envoi d'une commande de changement de chaine.
° J'ai copié le script de type Device ci-dessous dans l'éditeur :

Code : Tout sélectionner

--[[
    Script de type "device" : Allumer ou éteindre un TV Sony Bravia.
                              Mettre la chaine préférée en fonction du jour et de l'heure.

    Sources                 : https://www.domoticz.com/forum/viewtopic.php?t=8301
                              https://www.jeedom.com/forum/viewtopic.php?t=11054&start=40#p522022

    Prérequis               : Un télé Sony Bravia avec Androïd de préférence après 2015
                              Un "Dummy" avec le nom que vous souhaitez de type On/Off (Allumage Tv)
                              Un "Dummy" avec le nom que vous souhaitez de type On/Off (Delai)
    web                     : En cours de rédaction ... 

    lmet [v: 0.1]           : Version initiale.
]]--

---------------------------------------- VARIABLES: VALEURS A EDITER -----------------------------------------------

local intervirt   = "TV_OnOff_Salon"                  -- Nom du dummy "TV_OnOff_Salon" par exemple.
local delaivirt   = "Delai_TV_Salon"                  -- Nom du dummy de délai "Delai_TV_Salon" par exemple.
local ip_sony     = "<IP_TV>"                         -- Adresse IP du télé Sony.
local rep_script  = "/home/pi/domoticz/scripts/"      -- Répertoire contenant le script à exécuter.
local nom_script  = "bravia_chanel.sh"                -- Nom du script à lancer.
local chaine_def  = 5                                 -- Chaine à mettre par défaut.
local chaine1     = "Lu-Ma-Me-Je-Ve-Sa-Di,11-13,2"    -- Chaine préférée en fonction de l'heure et du jour.
local chaine2     = "x"                               -- Chaine préférée en fonction de l'heure et du jour.
local chaine3     = "x"                               -- Chaine préférée en fonction de l'heure et du jour.
local chaine4     = "x"                               -- Chaine préférée en fonction de l'heure et du jour.
local chaine5     = "x"                               -- Chaine préférée en fonction de l'heure et du jour.
local log         = false                             -- Si true --> Affiche quelques infos dans les log

-------------------------------------- FIN VARIABLES: VALEURS A EDITER ---------------------------------------------

local url         = "http://" .. ip_sony .. "/sony/system"
local headername  = "X-Auth-PSK"
local headervalue = "sony"

function joursem(jours)
	local jour    = false
	local jsem    = "Di-Lu-Ma-Me-Je-Ve-Sa"
	local jours   = string.sub(jours,1,string.find(jours,",")-1)
	local jours   = string.gsub(jours, "-", "")
	local nbjours =  tonumber(string.len(jours) /2)
	for i = 0, nbjours - 1 do
		rech = string.sub(jours,i*2+1,i*2+2)
		rech = string.find (jsem,rech)
		rech = (rech -1)/3
		if tonumber(os.date("%w")) == tonumber(rech) then
			jour = true
			break
		end
	end
	return jour
end

function horaire (jours)
	local heure = false
	local debut = string.find(jours,",")+1
	local fin   = string.find(jours,",",debut)-1
	local heures = string.sub(jours,debut,fin)
	h_debut = string.sub(heures,1,string.find(heures,"-")-1)
	h_fin   = string.sub(heures,string.find(heures,"-")+1)
	local now = os.date("*t")
	if now.hour >= tonumber(h_debut) and now.hour <= tonumber(h_fin)-1 then
	    heure = true
	end
	return heure
end

function chaine (jours)
	local debut1   = string.find(jours,",")+1
	local fin1     = string.find(jours,",",debut)-1
	local debut2   = string.find(jours,",",debut1)+1
	local fin2     = string.find(jours,",",fin1)-1
	local v_chaine = string.sub(jours,debut2)
	return v_chaine
end

function power (mode)
    local cmd = 'curl -v -H \"Content-Type:application/json\" -H \"' .. headername .. ':' .. headervalue .. '\" -d \"'
    cmd = cmd .. '{\\"id\\":2,\\"method\\":\\"setPowerStatus\\",\\"version\\":\\"1.0\\",\\"params\\":[{ \\"status\\" : '
    if mode == "On" then
        cmd = cmd .. 'true'
    else
        cmd = cmd .. 'false'
    end
    cmd = cmd .. '}]}'.. '\" ' .. url .. ''
    return cmd
end

commandArray = {}

    if (devicechanged[intervirt]== "On") then
        local cmd = power ("On")
        local ret = os.execute(cmd)   
        commandArray[#commandArray + 1] = {[delaivirt] = "On"}
    end
    if (devicechanged[delaivirt] == "Off") then
        trouve = false
        chaine_en_cours = {chaine1,chaine2,chaine3,chaine4,chaine5}
        for i,v in ipairs(chaine_en_cours) do
		    if string.find(v,"x",1)== nil then
		        jour  = joursem(v)
		        heure = horaire(v)
		        if jour and heure then
		            v_chaine = chaine(v)
		            trouve = true
		            break
		        end
            else
                break
            end
        end
        if trouve == false then
            v_chaine = tostring(chaine_def)
        end
        cmd = 'bash ' .. rep_script .. nom_script .. ' ' .. v_chaine
        ret = os.execute(cmd)
    end
    if (devicechanged[intervirt]== "Off") then
        local cmd = power ("Off")
        local ret = os.execute(cmd)
    end

return commandArray
A ce stade il est possible d'allumer la télé via l'UI. La chaine par défaut sera allumée (Ligne : chaine_def)

L'idée a été ensuite de mettre une chaine en fonction d'un jour et d'une heure pour cela on peut renseigner de chaine1 à chaine5 par exemple chaine1 est renseignée :

Code : Tout sélectionner

local chaine1= "Sa-Di-Lu-Ma-Me-Je-Ve,11-13,2" -- Chaine préférée en fonction de l'heure et du jour.
On indique les jours suivi de l'horaire et de la chaine. Vous l'aurez compris dans l'exemple ma femme et moi aimons "Tout le monde veut prendre sa place" ;)

Pour cela il faut copier le script ci-dessous dans le répertoire : "/home/pi/domoticz/scripts" et choisir un nom "bravia_chanel.sh" dans l'exemple. Il faut penser à modifier l'adresse IP du télé.

Code : Tout sélectionner

#!/bin/bash
AuthHeader="X-Auth-PSK"
PreSharedKey="sony"
IPPATH="<IP_Sony>/sony/IRCC"

Str=$1

if [ $Str -lt 10 ]; then
	Num1=${Str:0:1}
	DeuxiemeDigit=""
else
	Num1=${Str:0:1}
	Num2=${Str:1:1}
	DeuxiemeDigit="vrai"
fi

declare -A commandmap
commandmap[0]="AAAAAQAAAAEAAAAJAw=="
commandmap[1]="AAAAAQAAAAEAAAAAAw=="
commandmap[2]="AAAAAQAAAAEAAAABAw=="
commandmap[3]="AAAAAQAAAAEAAAACAw=="
commandmap[4]="AAAAAQAAAAEAAAADAw=="
commandmap[5]="AAAAAQAAAAEAAAAEAw=="
commandmap[6]="AAAAAQAAAAEAAAAFAw=="
commandmap[7]="AAAAAQAAAAEAAAAGAw=="
commandmap[8]="AAAAAQAAAAEAAAAHAw=="
commandmap[9]="AAAAAQAAAAEAAAAIAw=="

IRCC1=${commandmap[$Num1]}
ret=$(curl -sw "%{HTTP_CODE}" --silent -XPOST http://$IPPATH -H "$AuthHeader: $PreSharedKey" -d "<?xml version=\"1.0\"?><s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:X_SendIRCC xmlns:u=\"urn:schemas-sony-com:service:IRCC:1\"><IRCCCode>"$IRCC1"</IRCCCode></u:X_SendIRCC></s:Body></s:Envelope>" -H 'Content-Type: text/xml; charset=UTF-8' -H 'SOAPACTION: "urn:schemas-sony-com:service:IRCC:1#X_SendIRCC"' -o /dev/null)

if [ $DeuxiemeDigit == "vrai" ] ; then
	IRCC2=${commandmap[$Num2]}
	sleep .2
	ret=$(curl -sw "%{HTTP_CODE}" --silent -XPOST http://$IPPATH -H "$AuthHeader: $PreSharedKey" -d "<?xml version=\"1.0\"?><s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:X_SendIRCC xmlns:u=\"urn:schemas-sony-com:service:IRCC:1\"><IRCCCode>"$IRCC2"</IRCCCode></u:X_SendIRCC></s:Body></s:Envelope>" -H 'Content-Type: text/xml; charset=UTF-8' -H 'SOAPACTION: "urn:schemas-sony-com:service:IRCC:1#X_SendIRCC"' -o /dev/null)
fi
Voilà, en espérant que ces scripts soient d'une aide quelconque. Merci d'avance pour vos retours et/ou propositions d'améliorations.
Domoticz : V4.10717
Zigate : Dz: 4.11230 plugin:4.5.4 firmware:031a
Mon petit blog domotique

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


garycooper
Messages : 154
Enregistré le : 07 août 2017, 23:58

Re: Script gestion télé Sony Bravia au cas où …

Message par garycooper » 16 sept. 2019, 22:37

J'utilise le script suivant : https://github.com/gerard33/sony-bravia

Pas de pb jusqu'à présent

vrolland
Messages : 42
Enregistré le : 25 mars 2015, 16:35
Localisation : RP 78

Re: Script gestion télé Sony Bravia au cas où …

Message par vrolland » 16 sept. 2019, 23:35

J'utilise le plugin python également, ça fonctionne bien.
Pi3 - Raspbian wheezy 4.14.98-v7
Domoticz V4.10619

lmet
Messages : 187
Enregistré le : 30 juin 2017, 18:16
Localisation : Val d'Oise
Contact :

Re: Script gestion télé Sony Bravia au cas où …

Message par lmet » 17 sept. 2019, 01:28

@garycooper, @vrolland
Tant mieux et content que cela fonctionne pour vous, j'avais essayé à l'époque avec quelques soucis.
Le topic est ici beaucoup éprouvaient des dysfonctionnements.
L'auteur a laissé tomber début 2018 : https://github.com/gerard33/sony-bravia ... /README.md
"This plugin is no longer maintained."
J'ai tendance à privilégier le lua car ma compétence en python est proche de zéro :(
Domoticz : V4.10717
Zigate : Dz: 4.11230 plugin:4.5.4 firmware:031a
Mon petit blog domotique

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


FredWst
Messages : 6
Enregistré le : 03 oct. 2017, 21:24

Re: Script gestion télé Sony Bravia au cas où …

Message par FredWst » 19 sept. 2019, 13:57

Salut,

Merci pour ce script.
J'ai adapté pour utiliser openURL qui permet de ne pas bloquer le script en cas de non réponse.
A disposition si dessous et adapter en fonction de votre configuration.

Code : Tout sélectionner



return {
    
	active = true, -- set to false to disable this script
	
	on = {
		devices = {
			'Télévision'
		},
		timer = {'every 1 minutes'},
		httpResponses = {'CallBackGet','CallBackSet'}
	},
	
	execute = function(domoticz, device)

        if (device.isDevice) then
                local data
                if domoticz.devices('Télévision').state == 'On' then
                    data = '{"method": "setPowerStatus","id": 50,"params": [{"status" : true}],"version": "1.0"}'
                else
                    data = '{"method": "setPowerStatus","id": 50,"params": [{"status" : false}],"version": "1.0"}'
                end
    	       domoticz.openURL({
                url = 'http://192.168.1.33/sony/system',
                headers = { ["X-Auth-PSK"] = "sony"},
                method = 'POST',
                callback = 'CallBackSet',
                postData = data
            })
 	    end
 	    
 	    if (device.isTimer) then  
            domoticz.openURL({
                url = 'http://192.168.1.33/sony/system',
                headers = { ["X-Auth-PSK"] = "sony"},
                method = 'POST',
                callback = 'CallBackGet',
                postData =  '{"method": "getPowerStatus","id": 55,"params": [],"version": "1.0"}'
            })
 	    end
 	    
        if (device.isHTTPResponse and device.ok) then
            
            print('trigger: ' .. device.trigger)
        	print('callback: ' .. device.callback)
        	print('statusCode: ' .. device.statusText)

            if (device.isJSON) then
                print('Id objet '.. device.json.id)
            end
    
            if device.callback == 'CallBackGet' then
                print('Fred '..device.data) 
                if string.find(device.data, '{"status":"active"}') and domoticz.variables('Mémoire télévision').value == 'Arrêt' then
                    domoticz.variables('Mémoire télévision').set('Marche') 
                    domoticz.devices('Télévision').switchOn() 
                elseif string.find(device.data, '{"status":"standby"}') and domoticz.variables('Mémoire télévision').value == 'Marche' then
                    domoticz.variables('Mémoire télévision').set('Arrêt') 
                    domoticz.devices('Télévision').switchOff() 
                end
            end
        end 	
	end
}
}

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre