On en a peu parlé ces dernières semaines, mais le développement du Raspberry Pi domotique se poursuit, un peu plus lentement car les journées ne durent que 24h sur notre bonne vielle Terre 😉

Le script de gestion a été totalement revu :

  • utilisation de fonctions, appelées uniquement en cas de besoin (détection trame radio / rfid / TCP)
  • script de réception des trames tcp désormais en tâche de fond, avec lecture du code dans un simple tcp.txt
  • optimisation du code Python3
  • ajout des développements futurs, basés sur les ESP8266 essentiellement

Voyons ici l’évolution de la partie TCP, celle qui reçoit des trames avec un script enregistré dans tcpserv.py :

import socket, os, sys
# Activation serveur TCP
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.close()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# On affecte IP de reception et port d ecoute
server_address = ('192.168.1.124', 5665)
sock.bind(server_address)
# Ecoute des trames entrantes
sock.listen(1)
while True:
    # Attente connexion
    connection, client_address = sock.accept()
    try:
        while True:
            #
            # on ecrit la trame recue dans tcp.txt
            #
            data = connection.recv(16)
            tcp = open('/home/pi/tcp.txt', 'w')
            tcp.write(str(data, encoding='utf8'))
            tcp.close()
            if data:

               break
    finally:
        # Fermeture connexion
        connection.close()

 

Lancez ce script en tâche de fond avec python3 tcpserv.py & et si vous voulez l’avoir dès le démarrage du Raspberry Pi, allez l’ajouter dans /etc/rc.local :

sudo python3 /home/pi/tcpserv.py &

Désormais, CHAQUE trame reçue sur le port 5665, à destination de l’adresse IP 192.168.1.124 (à modifier par celle de votre Pi), sera écrite dans le fichier tcp.txt. Il ne vous reste alors plus qu’à venir lire ce fichier dans votre script python3, et à en tirer des actions.

Dans notre cas, nous testons simplement le contenu de tcp.txt :

  if len(tcp) > 2:
    print(tcp)
    print("appel lecture TCP")
    tcpframe(tcp)
    continue

En plus clair, si, après l’avoir ouvert et lu, tcp.txt contient plus de 2 caractères, alors on appelle la fonction tcpframe(tcp) pour que le contenu soit analysé, une fonction dont voici un exemple :

def tcpframe(code):
  if "porte1" in code:
    print("porte 1 ouverte")
  if "porte2" in code:
    print("porte 2 ouverte")
  if "porte3" in code:
    print("porte 3 ouverte")

  os.system("echo 0 > /home/pi/tcp.txt")

A la fin de l’interprétation de la trame TCP reçue, on efface tout dans tcp.txt, en lui mettant un simple “0” (zéro).

Vous suivez à peu près jusqu’à présent ? 🙂

—————————————————

Voyons maintenant comment envoyer simplement des trames TCP, via une application Android (désolé, je ne suis pas utilisateur d’iOS fermé lol), UDP TCP SERVER. Une fois installée, vous allez pouvoir configurer des tas de boutons :

udptcp_raspberry

Dans cet exemple, si je presse SALON ON, une trame salonon est envoyée sur le port 5665, vers mon Raspberry Pi 192.168.1.124, qui va alors allumer le salon en lançant la bonne commande. Idem pour l’Alarme, que j’active et désactive à volonté.

Ma prochaine étape sera alors de venir programmer des ESP8266 pour, là encore, utiliser l’envoi de trames TCP : ouverture de porte, température, etc. A suivre donc…