Difference between revisions of "Code Snippets"

From piMyHome Project
Jump to navigation Jump to search
 
(47 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Sending messages with netcat ==
+
If you wanna get a feeling of how you can interact with a Bticino gateway, you should try our code snippets below.
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 syntax is:
 
<source lang="bash">echo "<message>" | netcat <gateway-IP> <gateway-port></source>
 
  
== A Monitor Session with Python ==
+
= Linux console =
To understand the OWN messages better, you should start a monitor session on your Raspberry Pi and watch the OWN messages flying in from your domotic system. Analyzing these messages gives you an idea how it works. Below is a simple monitor script in Python.  
+
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.  
  
start editor nano and create monitor.py
+
=== Sending messages to a Bticino Gateway with netcat ===
<source lang="bash">nano monitor.py</source>
+
Syntax:
 +
<source lang="bash">echo "<message>" | netcat <gateway-IP> <gateway-port></source >
  
Copy and paste the script below into that file and save it.  
+
For example: turn off light 94 (9.4) on interface 5:  
After you saved the file, you have to make the file executable:
+
<source lang="bash">echo "*1*0*94#4#05##" | netcat 192.168.1.55 20000</source >
<source lang="bash">chmod 755 monitor.py</source>
 
  
Copy the content of this script to monitor.py
+
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).
 +
 
 +
 
 +
 
 +
= 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:
 +
{| class="wikitable"
 +
! style="text-align:left;"| OS
 +
! style="text-align:left;"| How to install python
 +
|-
 +
|Raspberry Pi, Debian, Ubuntu
 +
|<tt>sudo apt-get install python</tt>
 +
|-
 +
|Windows
 +
|Download and install Python from [http://legacy.python.org/download/ python.org]
 +
|-
 +
|Apple MAC OSX
 +
|Download and install Python from [http://legacy.python.org/download/ 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:
 +
<pre>./btsend.py <OWN-message> <OWN-message> <OWN-message></pre>
 +
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 ===
 
<source lang="python">
 
<source lang="python">
 
#!/usr/bin/python
 
#!/usr/bin/python
 
# -*- coding: utf-8 -*-
 
# -*- coding: utf-8 -*-
 
import socket
 
import socket
 +
import sys
  
# IP address and port to connect to the gateway, please
+
gateway_host = "192.168.1.35"       # set here the IP of your gateway
# change these values according to your environment
+
gateway_port = 20000               # set here the port of your gateway
default_gateway_host = "192.168.60.201"
+
default_gateway_port = 20000
+
gateway_addr_port = gateway_host, gateway_port
  
gateway_addr_port = default_gateway_host, default_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
 +
</source>
 +
 +
== 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. [http://www.pimyhome.org/files/monitor.py Download monitor.py]
 +
=== The Python Script btmonitor.py ===
 +
<source lang="python">
 +
#!/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():
 
def monitor():
 
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Line 31: Line 80:
 
         sock.connect(gateway_addr_port)
 
         sock.connect(gateway_addr_port)
 
         data = sock.recv(1024)
 
         data = sock.recv(1024)
        # expect ACK from gateway
+
         if data != "*#*1##":       # expect ACK from gateway
         if data != "*#*1##":
 
 
             raise Exception("Did not receive expected ACK, but: "+data)
 
             raise Exception("Did not receive expected ACK, but: "+data)
        # Switch session to MONITOR mode
+
         sock.send("*99*1##")       # Switch session to MONITOR mode
         sock.send("*99*1##")
 
 
         data = ""
 
         data = ""
 
         while 1:
 
         while 1:
            # Read data from MyHome BUS
+
             next = sock.recv(1024) # now read data from MyHome BUS
             next = sock.recv(1024)
 
 
             if next == "":
 
             if next == "":
 
                 break              # EOF
 
                 break              # EOF
Line 48: Line 94:
 
             if data[0] != "*":
 
             if data[0] != "*":
 
                 raise Exception("Message does not start with '*': "+data)
 
                 raise Exception("Message does not start with '*': "+data)
            print data
+
             msg = data[0:eom+2]     # message is from position 0 until end of ##
             msg = data[1:eom]
+
             data = data[eom+2:]     # next message starts after ##
             data = data[eom+2:]
+
            print (msg)
     finally:
+
     except:
 
         sock.close()
 
         sock.close()
 
+
        print ("\nSocket connection closed.")
monitor()
+
        sys.exit()
 +
 +
monitor()                           # start the monitor
 
</source>
 
</source>
  
Now start the monitor and watch the messages fly by. Exit with CTRL-C.
+
=== The Python Script btmonitor.py for Python 3 ===
<source lang="bash">./monitor.py</source>
+
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.

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