Difference between revisions of "Code Snippets"
(7 intermediate revisions by the same user not shown) | |||
Line 36: | Line 36: | ||
Below is a very simple Python script to send messages to a Bticino gateway. The script sends each command line argument as a single message to the gateway. | Below is a very simple Python script to send messages to a Bticino gateway. The script sends each command line argument as a single message to the gateway. | ||
Syntax: | Syntax: | ||
− | < | + | <pre>./btsend.py <OWN-message> <OWN-message> <OWN-message></pre> |
For example, turn off light 15 and turn on light 17: | For example, turn off light 15 and turn on light 17: | ||
− | < | + | <pre>./btsend.py *1*0*15## *1*1*17##</pre> |
=== The Python Script btsend.py === | === The Python Script btsend.py === | ||
<source lang="python"> | <source lang="python"> | ||
Line 60: | Line 60: | ||
print "Sending " + arg | print "Sending " + arg | ||
</source> | </source> | ||
− | |||
== A Python Monitor Session with Bticino Gateway == | == 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. | + | 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. [http://www.pimyhome.org/files/monitor.py Download monitor.py] |
− | === The Python Script | + | === The Python Script btmonitor.py === |
<source lang="python"> | <source lang="python"> | ||
#!/usr/bin/python | #!/usr/bin/python | ||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
import socket | import socket | ||
+ | import sys | ||
gateway_host = "192.168.1.35" # set here the IP of your gateway | gateway_host = "192.168.1.35" # set here the IP of your gateway | ||
Line 96: | Line 96: | ||
msg = data[0:eom+2] # message is from position 0 until end of ## | msg = data[0:eom+2] # message is from position 0 until end of ## | ||
data = data[eom+2:] # next message starts after ## | data = data[eom+2:] # next message starts after ## | ||
− | print msg | + | print (msg) |
− | + | except: | |
sock.close() | sock.close() | ||
+ | print ("\nSocket connection closed.") | ||
+ | sys.exit() | ||
monitor() # start the monitor | monitor() # start the monitor | ||
</source> | </source> | ||
+ | |||
+ | === The Python Script btmonitor.py for Python 3 === | ||
+ | In Python 3, socket returns bytes objects and we have to take this into account | ||
+ | <source lang="python"> | ||
+ | #!/usr/bin/env python3 | ||
+ | # -*- 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 | ||
+ | |||
+ | def monitor(): | ||
+ | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | ||
+ | try: | ||
+ | sock.connect((gateway_host, gateway_port)) | ||
+ | data = sock.recv(1024).decode() # decoding byt to string | ||
+ | if data != '*#*1##': # expect ACK from gateway | ||
+ | raise Exception('Did not receive expected ACK, but: '+data) | ||
+ | sock.send(b'*99*1##') # Switch session to MONITOR mode | ||
+ | data = '' | ||
+ | while 1: | ||
+ | next = sock.recv(1024).decode() # 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) | ||
+ | except: | ||
+ | sock.close() | ||
+ | print ('\nSocket connection closed.') | ||
+ | exit() | ||
+ | |||
+ | monitor() # start the monitor</source> |
Latest revision as of 08:48, 15 March 2019
If you wanna get a feeling of how you can interact with a Bticino gateway, you should try our code snippets below.
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 script sends each command line argument 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. Download monitor.py
The Python Script btmonitor.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 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)
except:
sock.close()
print ("\nSocket connection closed.")
sys.exit()
monitor() # start the monitor
The Python Script btmonitor.py for Python 3
In Python 3, socket returns bytes objects and we have to take this into account
#!/usr/bin/env python3
# -*- 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
def monitor():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect((gateway_host, gateway_port))
data = sock.recv(1024).decode() # decoding byt to string
if data != '*#*1##': # expect ACK from gateway
raise Exception('Did not receive expected ACK, but: '+data)
sock.send(b'*99*1##') # Switch session to MONITOR mode
data = ''
while 1:
next = sock.recv(1024).decode() # 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)
except:
sock.close()
print ('\nSocket connection closed.')
exit()
monitor() # start the monitor