I am new to Linuxmce, and the home automation scene, but I have an Smartlinc 2412N. I have learned that is has a raw port open 9761 that allows for PLM much like the USB or serial versions. I am wondering if anyone can point me in the right direction on getting this to work. I noticed that LinuxMCE uses Python, I am not much of a developer, but I am sure I can learn. I found some code that allows for communication at github(dot)com/zonyl/pyinsteon. I have also written some perl code that works with the raw plm as well posted below. Any advise or help is greatly appreciated.
#smartlinc.pl
use IO::Socket;
$socket = new IO::Socket::INET (
PeerAddr => '192.168.0.112', #SetAddress of Smartlinc
PeerPort => 9761, #Defaultport number of smartlinc
Proto => 'tcp',
)
or die "Couldn't connect to Server\n";
while (1)
{
#used to test input to smartlinc User friendly loop
print "Type Command for Smartlinc( Type x to Exit):";
$input_data = <STDIN>;
chop($input_data);
$send_data_hex = pack("H*", $input_data), "\n";
if ($input_data ne 'x' and $input_data ne 'X')
{
$socket->send($send_data_hex);
}
else
{
close $socket;
last;
}
#receives and Prints smart linc return response in ASCII
$socket->recv($recv_data,1024);
print "Smartlinc Replied:", unpack("H*", $recv_data), "\n" ;
Thanks.
-Gregg
I have found some ruby code as well that will communicate with the Smartlinc. I am posting it for reference as well. It is not my code and I do not remember where I found it. Maybe this will help, or maybe someone can tell me how to get it to work.
#!/usr/bin/ruby
require 'socket'
require 'fcntl'
require 'pp'
def hexlify(msg)
msg.split("").collect { |c| c[0].to_s(16) }.join
end
def unhexlify(msg)
msg.scan(/../).collect { |c| c.to_i(16).chr }.join
end
class ChatClient
def initialize
@client = nil
end
def start(hostname=HOST, port=PORT)
puts "client connecting to server #{hostname} @ #{port}"
@client = TCPSocket.new(hostname, port)
reading = Array.new
reading.push(@client)
STDIN.fcntl(Fcntl::F_SETFL,Fcntl::O_NONBLOCK)
reading.push(STDIN)
while true
ready = IO.select(reading)
readable = ready[0]
readable.each do |socket|
if socket == @client
buf = socket.recv_nonblock(1024)
if buf.length == 0
puts "omg, the server is dead, bye!"
exit
else
puts "Received Response: #{hexlify(buf)}"
end
else
buf = socket.read
if buf.length > 1
@client.send(unhexlify(buf), 0)
end
end
end
end
end
end
HOST = '192.168.0.112'
PORT = 9761
client = ChatClient.new
client.start
a couple of things:
* You should read the page on "Developing a DCE device" on the wiki, this is the approach to writing a C++ device.
* you should read any pages in the wiki which have GSD, or Generic Serial Device in them. This is the Ruby interpreter to write a DCE device in Ruby, should you decide to go this route.
Basically, you need to create a new device template as a start in the Web Admin, for your PLM device. You can use the Insteon PLM device as a reference.. (190x something, I forget the exact #), If the device is TCP, you can do the device in GSD, at which point the conn_. object becomes a connection to the device, and you can send and receive data and do the appropriate thing.
-Thom
Thanks. I will take a look at the wiki. I am hoping I can use the existing PLM template. The only difference is my device uses TCP/IP instead of a serial or usb connection. The PLM commands are the same.
-Gregg
The template is 1932 for the Insteon PLM GSD device. As tschak909 suggests, reading up on DCE will help. For examples of IP based GSD devices, run this query in the pluto_main database:
select PK_DeviceTemplate, Description from DeviceTemplate Where IsIPBased=1 and CommandLine = 'Generic_Serial_Device';
If the commands are the same, it shouldn't be hard to get them working.
Ok I did some reading on GSD, created a template, but I have some questions. According to the wiki If I am adding an Ethernet connection I need to add " TCP Port (#69) to the device data." My device requires a port number as well. So my questions are:
1. Does the TCP Port #69 represent a port number, or the IP address?
2.If it is the Port# do I need to add the IP address separately or use the default field from when the device is created?
My current config Shows TCP port #69 as the port number 9761, and IP address is populated in the default IP field that was created with the device. Am I missing something? I have run a wire shark and the data does not hit the network.
Is there a way to look at the commands as they are being sent by LinuxMCE through the command line?
Thanks.
-Gregg
Great work so far, Gregg!
To answer your questions:
* the TCP Port is literally the port # to connect to. the IP address is not specified in the device template, but rather, is provided when the device is created (either manually, or via the plug and play mechanism). It is worth noting that with IP devices, the plug and play system provides a way to match network devices via MAC address ranges. If this isn't possible, there are other options (the system in the end doesn't care, it just wants to receive a device detected event if something is found)
* Each device entry in the device tree has an entry for IP address and MAC address, if wanted. These can be used by your device appropriately.
You can look at various log files. The most useful for you is to watch the interaction between the router and other devices, the DCE router log. You can either view this by selecting the DCERouter device in the device tree of advanced > configure > devices section of the web admin, OR, you can tail -f /var/log/pluto/DCERouter.log on the core.
In addition, each device # created, has its own log file, under /var/log/pluto. If your new device # is 62, then your device is 62_Generic_Serial_Device.log, this is because the Command Line specified in the device template is indeed Generic_Serial_Device for ruby devices.
-Thom
Ok. A bit more progress. I am able to get it to send a command, and I can see it in wireshark. I have some more questions.
Wireshark shows a SYN, but no ACK. Is there a way to change the timeout on the SYN?
Here is a bit of my log...
01 11/09/11 14:42:18.001 Ruby was unable to handle the command in reasonable amount of time <0xb5814b90>
05 11/09/11 14:42:20.206 Socket::ReceiveData 0x9b2f658 failed, bytes left 0 start: 42940000 1: 0 1b: 0 2: 0 2b: 0 m_Socket: 8 Command_Impl1 Dev #52 <0xb5814b90>
05 11/09/11 14:42:20.207 Socket::ReceiveString2 ReceiveData failed m_Socket: -1 Command_Impl1 Dev #52 <0xb5814b90>
01 11/09/11 14:42:20.207 Receive string failed in HandleRequestSocket 18:ReceiveData failed Command_Impl1 Dev #52 <0xb5814b90>
05 11/09/11 14:42:20.207 Dumping 1 locks <0xb5814b90>
05 11/09/11 14:42:20.207 finished check for exceptions <0xb5814b90>
05 11/09/11 14:42:20.207 OL: (0x9b2f7a4) (>75) MessageQueue Command_Impl.cpp l:822 time: 4:00:00p (1320878540 s) thread: 3053542
Thanks.
-Gregg
May I see snippets of the relevant code?
-Thom
I am using the code from template 1932. It was setup originally for a serial device, but I do not see anything in the code that marries it to serial. I was able to get an ACK from the Smartlinc last night, LinuxMCE is issueing keep allives. Now I just have to figure out the problem I fear it may be in the code. I get the following error when I issue a command from the command line.
/usr/pluto/bin/MessageSend localhost -r 0 53 1 193 97 ""
RESP: Delivery failed
Thanks.
-Gregg
Ok I think I have made a bit more headway. I added #163 assign to parents room to my template and now it can automatically see children in the Insteon database and displays them in the log for that device. My problem now is creating children and keeping them. I create a child for the thermostat and give it the appropriate address, but when I reload the router the child disappears.
Am I missing a step.
Thanks.
-gregg
the driver itself currently only supports lighting and a few other small class of devices, that are automatically introspected by querying the device database of each insteon device in the network.
you would need to add support for interfacing with the climate and security features of the system.
The reason the devices are disappearing is because the GSD device in question uses the Report Child Devices DCE command to return a list of devices found, and their equivalent device data for port mappings, device templates to use etc.. If the system already sees that these devices exist, they are left alone. If a device doesn't appear on that list, it is deleted from the children.
-Thom
Quote from: tschak909 on November 14, 2011, 07:28:02 PM
the driver itself currently only supports lighting and a few other small class of devices, that are automatically introspected by querying the device database of each insteon device in the network.
you would need to add support for interfacing with the climate and security features of the system.
The reason the devices are disappearing is because the GSD device in question uses the Report Child Devices DCE command to return a list of devices found, and their equivalent device data for port mappings, device templates to use etc.. If the system already sees that these devices exist, they are left alone. If a device doesn't appear on that list, it is deleted from the children.
-Thom
My log shows it detects the device in question.
(***):InsteonID:14.26.57seems to exist in child databases
(***):CDB:{"0F.63.82"=>["****************"], "14.26.57"=>["****************"], "13.7B.60"=>["000B1801********", "E201142657050391"]}
(***):^[[36m
From Device:13.7B.60
Flags:
Not the last record
Record In Use
I am a Controller of 14.26.57 Group:1^[[37m
Within the code #756 Child Devices there is a device defined for the Venstar Thermostat I have.
when 0x05 # Climate Control
case $childdatabases[insteonID][0][2..3].hex
when 0x00; @work += 'Broan SMSC080 Exhaust Fan'
when 0x01; @work += 'Simplehomenet EZTherm'
when 0x02; @work += 'Broan SMSC110 Exhaust Fan'
when 0x03; @work += 'Venstar RF Thermostat Module'
when 0x04; @work += 'Simplehomenet EZStat Thermostat'
end
Is there another place I need to add the code? Do I need to add a Template specifically named Venstar RF Thermostat Module?
Thanks.
-Gregg
I am not sure, honestly. I did not write the code. ddamron did.
-Thom
Well at least you gave it a shot Thom :)
Do you know of a way I can get a hold of ddamron? In the mean time I will plug away at it and see if I can figure it out. As far as I can tell the template I created for the 2412N should work for other Insteon add ons. How do I submit it for others to test??
-Gregg
You should:
* copy the code from the original template into a temporary notepad.
* revert your changes to the original template using sqlCVS > diff in web admin (be sure both the IR and DCE repositories are checked)
* create a new device template, with your new code in it
* put in plug and play data (MAC address range) so the device can be detected.
* make a new TRAC ticket in svn.linuxmce.org
* use the web admin, sqlcvs diff, to check in your new device template (be sure that both the IR and DCE repositories are checked), in the comments put the TRAC ticket #, so we can cross reference
* let us know you've done so.
-Thom