Difference between revisions of "Code Snippets"

From piMyHome Project
Jump to navigation Jump to search
Line 12: Line 12:
 
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 =
Python is a very powerful scripting language and available for all major operation systems like Linux, Windows and Apple OSX. In MAc and Linux enviroments, Python is usaully pre-installed. If not already installed on your system, please follow these steps:  
+
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"
 
{| class="wikitable"
Line 22: Line 24:
 
! style="text-align:left;"| How to install python
 
! style="text-align:left;"| How to install python
 
|-  
 
|-  
|RaspberryPi, Debian, Ubuntu
+
|Raspberry Pi, Debian, Ubuntu
 
|<tt>sudo apt-get install python</tt>  
 
|<tt>sudo apt-get install python</tt>  
 
|-
 
|-
Line 34: Line 36:
  
  
 +
== 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:
 +
<source lang="bash">./btsend.py <OWN-message> <OWN-message> <OWN-message></source>
 +
For example, turn off light 15 and turn on light 17:
 +
<source lang="bash">./btsend.py *1*0*15## *1*1*17##</source>
  
 
== Sending messages to a Bticino Gateway with Python ==
 
 
=== The Python Script btsend.py ===
 
=== The Python Script btsend.py ===
Copy the content of this script to btsend.py
 
 
<source lang="python">
 
<source lang="python">
 
#!/usr/bin/python
 
#!/usr/bin/python
Line 67: Line 72:
  
 
=== The Python Script monitor.py ===
 
=== The Python Script monitor.py ===
Copy the content of this script to monitor.py
 
 
<source lang="python">
 
<source lang="python">
 
#!/usr/bin/python
 
#!/usr/bin/python

Revision as of 13:35, 22 November 2014

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