Difference between revisions of "Code Snippets"
Line 4: | Line 4: | ||
The Linux command <tt>'''[http://en.wikipedia.org/wiki/Netcat netcat]'''</tt> makes it very easy to send messages from a Raspberry Pi to a Bticino Gateway. | The Linux command <tt>'''[http://en.wikipedia.org/wiki/Netcat netcat]'''</tt> makes it very easy to send messages from a Raspberry Pi to a Bticino Gateway. | ||
− | == Sending messages to a Bticino Gateway with netcat == | + | === Sending messages to a Bticino Gateway with netcat === |
Syntax: | Syntax: | ||
<source lang="bash">echo "<message>" | netcat <gateway-IP> <gateway-port></source > | <source lang="bash">echo "<message>" | netcat <gateway-IP> <gateway-port></source > | ||
Line 13: | Line 13: | ||
If your command gets executed, you should get <tt>'''*#*1##'''</tt> (ACK) as a response. | If your command gets executed, you should get <tt>'''*#*1##'''</tt> (ACK) as a response. | ||
If the command fails for some reason, you will get a <tt>'''*#*0##'''</tt> (NACK). | If the command fails for some reason, you will get a <tt>'''*#*0##'''</tt> (NACK). | ||
− | |||
− | |||
− | |||
= Python = | = Python = |
Revision as of 13:36, 22 November 2014
Contents
Linux console
The Linux command netcat makes it very easy to send messages from a Raspberry Pi to a Bticino Gateway.
Sending messages to a Bticino Gateway with netcat
Syntax:
echo "<message>" | netcat <gateway-IP> <gateway-port>
For example: turn off light 94 (9.4) on interface 5:
echo "*1*0*94#4#05##" | netcat 192.168.1.55 20000
If your command gets executed, you should get *#*1## (ACK) as a response. If the command fails for some reason, you will get a *#*0## (NACK).
Python
Python is a very powerful scripting language and available for all major operation systems like Linux, Windows and Apple OSX. In MAC OSX and Linux environments, Python is usually pre-installed. If not already installed on your system, please follow these steps:
OS | How to install python |
---|---|
Raspberry Pi, Debian, Ubuntu | sudo apt-get install python |
Windows | Download and install Python from python.org |
Apple MAC OSX | Download and install Python from python.org |
Sending messages to a Bticino Gateway with Python
Below is a very simple Python script to send messages to a Bticino gateway. The scripts sends all command line arguments as a single message to the gateway. Syntax:
./btsend.py <OWN-message> <OWN-message> <OWN-message>
For example, turn off light 15 and turn on light 17:
./btsend.py *1*0*15## *1*1*17##
The Python Script btsend.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket
import sys
gateway_host = "192.168.1.35" # set here the IP of your gateway
gateway_port = 20000 # set here the port of your gateway
gateway_addr_port = gateway_host, gateway_port
def send_message(msg):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(gateway_addr_port)
sock.send(msg)
for arg in sys.argv[1:]: # cut off first argument (btsend.py)
send_message(arg) # send all arguments as message
print "Sending " + arg
A Python Monitor Session with Bticino Gateway
To understand the OWN messages better, you should start a monitor session and watch the OWN messages flying in from your home automation system. Analyzing these messages gives you an idea how it works. Below is a simple monitor script in Python.
The Python Script monitor.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket
gateway_host = "192.168.1.35" # set here the IP of your gateway
gateway_port = 20000 # set here the port of your gateway
gateway_addr_port = gateway_host, gateway_port
def monitor():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect(gateway_addr_port)
data = sock.recv(1024)
if data != "*#*1##": # expect ACK from gateway
raise Exception("Did not receive expected ACK, but: "+data)
sock.send("*99*1##") # Switch session to MONITOR mode
data = ""
while 1:
next = sock.recv(1024) # now read data from MyHome BUS
if next == "":
break # EOF
data = data + next
eom = data.find("##")
if eom < 0:
continue; # Not a complete message, need more
if data[0] != "*":
raise Exception("Message does not start with '*': "+data)
msg = data[0:eom+2] # message is from position 0 until end of ##
data = data[eom+2:] # next message starts after ##
print msg
finally:
sock.close()
monitor() # start the monitor