Domoticz- client e server in python per abilitare il wifi su Raspberry Prima Parte

Domoticz- client e server in python per abilitare il wifi su Raspberry Prima Parte

Questo articolo illustra uno step di un progetto che ha l’obiettivo di realizzare uno switch su Domoticz, posto su un Raspberry,  in grado di accendere (o spegnere) il Wi fi extender su un secondo Raspberry. In aggiunta alla funzione che accende e spegne il Wifi Extender, il server è anche in grado di comandare un secondo switch su domoticz che accende e spegne una webcam collegata all’extender.

Per fare questo verranno utilizzati un client e un server scritti in python posizionati rispettivamente sul primo e sul secondo Raspberry che saranno oggetto di approfondimento in questo articolo.

Lo schema utilizzato nel progetto sarà il seguente.

im4

Di seguito il codice completo del client che andremo a commentare in dettaglio successivamente.

#!/usr/bin/python
import socket
import sys

# Create client socket.
client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect to server
client_sock.connect(('192.168.1.115', 6543))

if len(sys.argv)>1:
    cmd = str(sys.argv[1])

# Send some data to server.
client_sock.sendall(cmd.encode('utf-8'))
client_sock.shutdown(socket.SHUT_WR)


# Disconnect from server.
client_sock.close()

Dopo aver effettuato la connessione al server (nel nostro caso su IP 192.168.1.115 e porta 6543).

Il codice cmd = str(sys.argv[1])passa a leggere i seguenti argomenti dalla riga di comando:

ONW accende solo il Wifi extender

OFFW spegne solo il Wifi extender

ON  accende il Wifi extender e la webcam

OFF spegne la webcam e il Wifi extender

Il seguente codice client_sock.sendall(cmd.encode('utf-8'))invia questi comandi al server.

Il codice del Server è il seguente:

# python3

import socket
import os
import time
import json
import urllib.request, urllib.error, urllib.parse

domoticzPort = "8080"
domoticzIP = "192.168.1.112"

def domoticzrequest (url):
  request = urllib.request.Request(url,headers={'User-Agent': 'Mozilla/5.0'})
  response = urllib.request.urlopen(request)
  return response.read()

# Create server socket.
serv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, proto=0)

# Bind server socket to loopback network interface.
serv_sock.bind(('192.168.1.115', 6543))

# Turn server socket into listening mode.
serv_sock.listen(10)

while True:
    # Accept new connections in an infinite loop.
    client_sock, client_addr = serv_sock.accept()
    #print('New connection from', client_addr)

    chunks = []
    while True:
        # Keep reading while the client is writing.
        data = client_sock.recv(2048)
        data2=str(data, 'utf-8')
        if data2=="ON":
            #print("ON")
            os.system('sudo ip link set wlan0 up')
            time.sleep(10)
            domoticzurl = "http://" + domoticzIP + ":" + domoticzPort + "/json.htm?type=command&param=switchlight&idx=58&switchcmd=On"
            json_object = json.loads(domoticzrequest(domoticzurl))
            break
        elif data2=="ONW":
            os.system('sudo ip link set wlan0 up')
            break
        elif data2=="OFFW":
            os.system('sudo ip link set wlan0 down')
            break
        else:
            #print("OFF")
            domoticzurl = "http://" + domoticzIP + ":" + domoticzPort + "/json.htm?type=command&param=switchlight&idx=58&switchcmd=Off"
            json_object = json.loads(domoticzrequest(domoticzurl))
            time.sleep(10)
            os.system('sudo ip link set wlan0 down')
            break
        chunks.append(data)

    client_sock.sendall(b''.join(chunks))

Dopo aver creato una socket e averne fatto il bind sull’indirizzo e la porta scelti, il server resta in ascolto di trasmissioni da parte del client.

In base al comando trasmesso il server esegue quanto richiesto.

In particolare il comando: os.system('sudo ip link set wlan0 up')

esegue un  comando bash. Nel caso riportato, si tratta del comando che mette up l’interfaccia wlan0 il che, nel nostro caso, equivale ad accendere o spegnere il wifi extender.

Se richiesto dal client, il nostro server provvederà anche ad accendere la telecamera che andrà a collegarsi all’extender inviando l’opportuna url json a domoticz:

domoticzurl = "http://" + domoticzIP + ":" + domoticzPort + "/json.htm?type=command&param=switchlight&idx=58&switchcmd=On" 
json_object = json.loads(domoticzrequest(domoticzurl))

Nel prossimo articolo vedremo il completamento del progetto con la realizzazione di uno switch che aziona il client su domoticz, passando gli opportuni parametri per comandare il server e un piccolo script che effettua il check sul server e evetnualmente lo riavvia quando necessario.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.