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.
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¶m=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¶m=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¶m=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.