Control KODI - Superchango - 18.04.2017
Good afternoon,
Has anyone tried to control KODI through homelynk?
I would like to know if it is possible and how it can be done in such a case.
Thank you so much,
RE: Control KODI - gjniewenhuijse - 19.04.2017
(18.04.2017, 15:32)Superchango Wrote: Good afternoon,
Has anyone tried to control KODI through homelynk?
I would like to know if it is possible and how it can be done in such a case.
Thank you so much,
Hello, yes i use it but my code is very basic and needs some beautification
the library
Code: function kodiHandler(iServer,iPort,sendPort)
-- first call
if not ready then
require('socket')
lastdatareceived = nil
ready = true
end
-- client connected
if connected then
while true do
char, err = client:receive(1)
-- error while receiving, closed socket
if err == 'closed' then
connected = false
sleep(1)
break
end
if char ~= nil then
lastdatareceived = os.time()
warningclosed = true
warningfailed = true
warningerrors = true
warningtimeou = true
table.insert(buffer, char)
tmpbuf = table.concat(buffer)
if ( json.pdecode(tmpbuf) ) then
data = tmpbuf
parse(data)
buffer = {}
end
else
now = os.time()
deltatime = now - lastdatareceived
end
-- receive incoming send requests
msg, ip, port = sendServer:receivefrom()
if msg then
-- send command
--log("send: "..msg)
client:send(msg)
end
--[[ clear not complete buffer
if deltatime > 10 and #buffer > 0 then
log( #buffer )
buffer = {}
lastdatareceived = os.time()
end
-]]
end
-- first call or previously disconnected
else
-- close previous connection when disconnected
if client then
client:close()
client = nil
end
if sendServer then
sendServer:close()
sendServer = nil
end
-- create tcp client
client = socket.tcp()
client:settimeout(5)
connected, err = client:connect(iServer, iPort)
-- connect ok, reset buffer
if connected then
lastdatareceived = os.time()
warningclosed = true
warningfailed = true
warningerrors = true
warningtimeou = true
--log('[KODI-client] connection ok: '..iServer)
buffer = {}
-- create udp server to receive incoming send requests
if not sendServer then
sendServer = socket.udp()
sendServer:setsockname('*', sendPort)
sendServer:settimeout(0.1)
end
sleep(5)
-- send initial command
--client:send( '{"jsonrpc": "2.0", "method": "Player.PlayPause", "params": { "playerid": 0 }, "id": 1}' )
-- error while connecting,
else
--log(err)
if warningfailed then log('[KODI-client] connection failed (conn): '.. err) end
warningfailed = false
sleep(5)
end
end
-- incoming command parser
function parse(data)
-- log other info, not mapped, if useful
--log("data received: "..data)
--log(json.pdecode(data))
end
end
the resident script
Code: require('user.nit_kodi')
require('json')
kodiHandler("192.168.x.x","9090","18007")
-- callback from handler
-- tv recording play
function tvrecPlay()
log("test1")
end
-- tv recording - pause or stop
function tvrecStop()
log("test2")
end
in another script u can use for example:
Code: udpsend( '{ "jsonrpc": "2.0", "id": 1, "method": "Application.SetVolume", "params": { "volume": 50 } }', "18007" )
RE: Control KODI - Superchango - 19.04.2017
Thanks I will put with it to see if I am able to perform a control of my HTPC with KODI
RE: Control KODI - baggins - 19.04.2017
Hi,
My "solution" is even more basic.
I installed an USB IR Flirc receiver on my Kodi box and programmed it with a Samsung remote control. I then use a Global Caché IR transmitter that is controlled through simple TCP commands.
In my visualisation I have programmed a "universal" remote control with which I can control my cable decoder, AVR, Kodi and TV.
RE: Control KODI - leonidas - 19.04.2017
One more simple KODI control solution:
Code: require('socket.http')
socket.http.TIMEOUT = 5
-- play ---------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={ "jsonrpc": "2.0", "method": "Input.ExecuteAction", "params": { "action": "play" }, "id": 1 }')
-- pause --------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={ "jsonrpc": "2.0", "method": "Input.ExecuteAction", "params": { "action": "pause" }, "id": 1 }, "id": 1 }')
-- down ---------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Down", "id": 1}')
-- up -----------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Up", "id": 1}')
-- right --------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Right", "id": 1}')
-- left ---------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Left", "id": 1}')
-- home ---------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Home", "id": 1}')
-- select -------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Select", "id": 1}')
RE: Control KODI - gjniewenhuijse - 19.04.2017
(19.04.2017, 14:23)leonidas Wrote: One more simple KODI control solution:
Code: require('socket.http')
socket.http.TIMEOUT = 5
-- play ---------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={ "jsonrpc": "2.0", "method": "Input.ExecuteAction", "params": { "action": "play" }, "id": 1 }')
-- pause --------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={ "jsonrpc": "2.0", "method": "Input.ExecuteAction", "params": { "action": "pause" }, "id": 1 }, "id": 1 }')
-- down ---------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Down", "id": 1}')
-- up -----------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Up", "id": 1}')
-- right --------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Right", "id": 1}')
-- left ---------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Left", "id": 1}')
-- home ---------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Home", "id": 1}')
-- select -------------------------------------------------------------------------------------------
data1 = socket.http.request('http://192.168.1.79:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Input.Select", "id": 1}')
With this solution you have no incoming data, so you can't turn off your lights when a movie starts for example.
RE: Control KODI - leonidas - 20.04.2017
(19.04.2017, 14:28)gjniewenhuijse Wrote: With this solution you have no incoming data, so you can't turn off your lights when a movie starts for example.
Yes, but it's better than using Global Cache.
RE: Control KODI - gjniewenhuijse - 20.04.2017
(20.04.2017, 07:25)leonidas Wrote: Yes, but it's better than using Global Cache.
yes, you're right.
RE: Control KODI - Bart - 11.09.2017
(19.04.2017, 12:04)baggins Wrote: Hi,
My "solution" is even more basic.
I installed an USB IR Flirc receiver on my Kodi box and programmed it with a Samsung remote control. I then use a Global Caché IR transmitter that is controlled through simple TCP commands.
In my visualisation I have programmed a "universal" remote control with which I can control my cable decoder, AVR, Kodi and TV.
Hi Baggins,
Since I see the "Telenet" symbol on your visualisation I assume we live in the same country.
To avoid re-inventing hot water, here Could you share some tcp commands you use to control your cable decoder + give some insight on how you built the visualisation shown in the screenshot of your post?
kr,
B.
RE: Control KODI - baggins - 13.09.2017
(11.09.2017, 21:02)Bart Wrote: (19.04.2017, 12:04)baggins Wrote: Hi,
My "solution" is even more basic.
I installed an USB IR Flirc receiver on my Kodi box and programmed it with a Samsung remote control. I then use a Global Caché IR transmitter that is controlled through simple TCP commands.
In my visualisation I have programmed a "universal" remote control with which I can control my cable decoder, AVR, Kodi and TV.
Hi Baggins,
Since I see the "Telenet" symbol on your visualisation I assume we live in the same country.
To avoid re-inventing hot water, here Could you share some tcp commands you use to control your cable decoder + give some insight on how you built the visualisation shown in the screenshot of your post?
kr,
B.
Hi,
As I've stated, I use a Global Caché (it actually is the Basalte version) transmitter attached to the Telenet Digicorder.
Here is the script I use to control the Digicorder:
Code: --[[
Command: Command for execution by controller of Global Cache. To transmit IR command Command=sendir. See full list in GLobal Cache manual.
Modul: The module containing the appropriate IR port (e.g. for iTach=1
NumDev: Number of port in the module starting with 1.
Id: Id number of the command in range 0 – 65535
Freq: IR channel frequency in Hz, from 20000 – 500000
Repeat: on 0 – repeat the command up to 65535 times or while the command transmit is terminated
Offset: Time period to repeat the telegram in the next transmissions (Repeat<>1), 1 – 255
P0,…,Pn: String sequence defining impulse sequence in IR telegram
^: Symbol defining the end of command string, OD (Hex)
--]]
local socket = require("socket")
function send_Digicorder(command)
log('send_Digicorder called; command ' .. command)
tcp = assert(socket.tcp())
tcp:settimeout(0.5)
Device = '192.168.0.26'
Header = "sendir,1:2,1,38000,1,1,"
connected, err = tcp:connect(Device, '4998')
--print (connected)
--print (err)
Digicorder = {}
Digicorder["BACK"] = "11,12,12,24,12,12,23,24,12,12,23,24,23,25,11,12,23,12,12,12,11,13,11,24,23,3362\r"
Digicorder["CHANNEL DOWN"] = "11,12,11,25,11,13,23,25,11,13,23,25,22,25,11,13,23,25,23,12,11,25,23,3359\r"
Digicorder["CHANNEL UP"] = "11,12,11,25,11,13,22,25,11,13,23,25,23,25,11,13,22,25,23,25,23,25,11,3348\r"
Digicorder["CLEAR"] = "11,13,11,25,11,13,23,25,11,13,23,25,23,25,11,13,23,13,11,13,11,25,11,13,23,3364\r"
Digicorder["COMMUNICATION"] = "12,12,11,25,11,13,22,25,11,12,23,25,23,24,12,13,11,12,23,13,11,12,12,24,23,3362\r"
Digicorder["CURSOR DOWN"] = "11,13,11,25,11,12,23,25,12,12,23,25,23,25,11,13,23,13,11,24,23,25,23,3360\r"
Digicorder["CURSOR ENTER"] = "11,12,11,25,11,13,22,25,11,13,23,25,23,25,11,13,22,13,11,25,23,13,11,25,11,3348\r"
Digicorder["CURSOR LEFT"] = "11,13,11,25,11,12,23,25,11,12,23,25,23,25,11,13,23,13,11,25,11,12,11,13,23,3360\r"
Digicorder["CURSOR RIGHT"] = "11,13,11,25,11,12,23,25,11,12,23,25,23,25,11,13,23,13,11,25,11,12,23,25,11,3351\r"
Digicorder["CURSOR UP"] = "11,13,11,25,11,13,23,25,11,13,23,24,23,25,11,12,23,25,22,13,11,13,11,25,11,3349\r"
Digicorder["DIGIT 0"] = "11,13,11,25,11,12,23,25,11,12,23,25,23,25,11,13,11,12,23,25,23,25,23,3365\r"
Digicorder["DIGIT 1"] = "11,13,11,25,11,13,23,25,11,13,23,25,22,25,11,13,11,12,12,13,11,13,11,12,23,25,11,3347\r"
Digicorder["DIGIT 2"] = "11,13,11,25,11,13,23,25,11,13,23,25,22,25,11,13,11,12,11,13,11,13,23,25,23,3360\r"
Digicorder["DIGIT 3"] = "11,13,11,25,11,13,23,25,11,13,22,25,23,25,11,13,11,13,11,13,11,13,22,13,11,25,11,3348\r"
Digicorder["DIGIT 4"] = "11,13,11,25,11,13,23,25,11,13,22,25,23,25,11,13,11,13,11,12,23,25,11,12,23,3360\r"
Digicorder["DIGIT 5"] = "11,12,11,25,11,13,22,25,11,12,23,25,23,24,11,13,11,13,11,12,23,24,23,25,11,3327\r"
Digicorder["DIGIT 6"] = "11,13,11,25,11,13,23,25,11,13,23,25,22,25,11,13,11,13,11,12,23,12,11,25,23,3362\r"
Digicorder["DIGIT 7"] = "11,13,11,25,11,13,23,25,11,13,23,25,22,25,11,13,11,13,11,12,23,12,11,13,11,25,11,3353\r"
Digicorder["DIGIT 8"] = "11,13,11,25,11,13,23,25,11,13,23,25,22,25,11,13,11,13,23,25,11,13,11,12,23,3359\r"
Digicorder["DIGIT 9"] = "11,12,11,25,11,13,23,25,11,13,23,25,23,24,11,13,11,13,23,25,11,13,23,25,11,3345\r"
Digicorder["ENTER"] = "11,25,11,13,23,25,11,13,11,13,22,25,22,25,11,13,23,25,11,13,22,25,23,3363\r"
Digicorder["EXIT"] = "11,12,11,25,11,13,23,25,11,13,23,25,23,25,11,13,23,12,11,13,11,25,23,25,11,3350\r"
Digicorder["EXTRA"] = "12,13,11,25,11,12,23,25,11,12,23,25,22,25,11,13,11,12,23,12,12,12,11,13,11,24,12,3351\r"
Digicorder["FORWARD"] = "11,13,11,25,11,13,23,25,11,13,23,25,23,25,23,25,11,13,11,13,11,13,11,13,23,3360\r"
Digicorder["FUNCTION BLUE"] = "11,12,12,24,12,12,23,24,12,13,23,24,23,24,23,25,23,24,11,13,23,24,11,3351\r"
Digicorder["FUNCTION GREEN"] = "12,12,11,25,11,12,23,25,11,12,23,25,23,25,23,24,12,12,23,12,11,13,11,25,11,3350\r"
Digicorder["FUNCTION RED"] = "11,13,11,24,12,12,23,24,12,12,23,24,23,25,23,24,12,13,23,12,11,25,23,3358\r"
Digicorder["FUNCTION YELLOW"] = "12,12,12,25,11,13,22,25,11,13,22,25,23,24,23,25,22,25,11,12,12,12,23,3364\r"
Digicorder["GUIDE"] = "11,13,11,25,11,12,23,25,11,12,23,25,23,25,11,13,11,13,23,12,11,25,23,24,12,3356\r"
Digicorder["HELP"] = "11,13,11,24,12,12,23,24,12,12,23,24,23,25,11,12,23,25,11,12,23,25,23,3359\r"
Digicorder["MENU MAIN"] = "11,12,12,25,11,13,22,25,11,13,23,25,23,25,11,12,23,25,12,12,11,13,11,13,23,3362\r"
Digicorder["MUTE TOGGLE"] = "11,13,11,25,11,12,23,25,11,12,23,25,22,25,11,13,23,25,11,13,11,13,23,25,11,3347\r"
Digicorder["PAUSE"] = "11,13,11,25,11,12,23,25,11,12,23,25,23,25,23,25,11,13,11,13,11,13,23,24,12,3345\r"
Digicorder["PLAY"] = "11,13,11,25,11,12,23,25,11,12,23,25,23,25,23,25,11,13,23,25,11,13,23,3363\r"
Digicorder["POWER TOGGLE"] = "11,12,12,24,12,12,23,24,12,12,23,24,23,24,12,12,12,12,23,24,23,12,12,24,12,3349\r"
Digicorder["PREVIOUS CHANNEL"] = "11,13,11,25,11,12,23,25,11,12,23,25,23,25,11,13,23,13,11,12,11,13,11,25,22,3361\r"
Digicorder["RECORD"] = "11,13,11,24,12,13,23,24,11,13,23,24,23,25,23,25,11,13,11,12,23,25,23,3363\r"
Digicorder["REVERSE"] = "11,13,11,25,11,13,23,25,11,13,23,25,22,25,11,13,23,13,11,13,12,12,11,13,11,25,11,3352\r"
Digicorder["STOP"] = "11,12,11,24,11,12,23,24,11,12,23,24,22,25,22,24,11,12,11,12,22,12,11,24,12,3297\r"
Digicorder["TELETEXT"] = "11,12,12,24,12,12,23,24,12,12,23,24,23,24,23,25,11,12,23,25,23,24,11,3346\r"
Digicorder["VOLUME DOWN"] = "11,13,11,24,12,13,23,24,11,13,23,24,23,25,11,12,23,25,23,25,11,13,22,3362\r"
Digicorder["VOLUME UP"] = "11,13,12,24,11,13,23,24,11,13,23,25,23,25,11,12,23,25,11,12,23,12,11,25,11,3345\r"
if command == 'OK' then
command = 'CURSOR ENTER'
end
result = tcp:send(Header .. Digicorder[command])
--log('Result: ' .. result)
rec = tcp:receive()
--log(rec)
tcp:close()
end
As far as the visualisation is concerned: Inkscape and GIMP are your friends...
RE: Control KODI - Kellystewart - 02.10.2018
You can go one step further with Kodi web interface and stream content to your computer from your Kodi system.
|