Script python per accensione luce di emergenza

Script python per accensione luce di emergenza

Questo programma python interagisce con domoticz per rivelare se c’è stato un’interruzione di corrente elettrica.

La lampada OSRAM collegata via Switch a Domoticz con protocollo Zigbee si trova, insieme al Raspberry che fa girare Domoticz, su un gruppo di continuità. Questo consente, pingando un dispositivo che invece non ha gruppo di continuità, di capire se c’è stata un’interruzione di corrente.

Il ping viene fatto ogni 20 secondi e se è negativo viene accesa la lampadina qualora l’orario in cui l’interruzione accade lo renda necessario.

Ecco il programma completo.

Di seguito andiamo a commentarlo.

#!/usr/bin/python3
import subprocess
import time
import json
import datetime
import socket
import urllib.request, urllib.error, urllib.parse

domoticzPort = "DomoticzPort"
domoticzIP = "DomoticzIP"

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

#Calcolo in che punto della giornata sono per decidere se accendere o no luce (tutto da correggere)
def itstherighttime():
	domoticzurl = "http://" + domoticzIP + ":" + domoticzPort + "/json.htm?type=command&param=getSunRiseSet"
	data = json.loads(domoticzrequest(domoticzurl))
	data2=(data['Sunset'])
	sunsethour = data2[0:2]
	#print(sunsethour)
	data2=(data['Sunrise'])
	sunserisehour = data2[0:2]
	#print(sunserisehour)
	now = datetime.datetime.now()

	#print(now.hour)
	if (((now.hour>= int(sunsethour)-1)and now.hour<24) or ((now.hour<= int(sunserisehour)+1))and now.hour>=0):
		return 1
	else:
		return 0

while(itstherighttime()):

	#check su tasmota2
	tasmota2 = subprocess.call(["ping", "192.168.1.53", "-c1", "-W2", "-q"])

	if (tasmota2!=0):
		#prelevo lo stato della lampada
		domoticzurl = "http://" + domoticzIP + ":" + domoticzPort + "/json.htm?type=devices&rid=64"
		data = json.loads(domoticzrequest(domoticzurl))
		data2=(data['result'][0])
		stat=data2['Status']
		
		
		#Accendo la lampada se era spenta
		if (stat=="Off"):		
			domoticzurl = "http://" + domoticzIP + ":" + domoticzPort + "/json.htm?type=command&param=switchlight&idx=64&switchcmd=Set%20Level&level=100"
			json_object = json.loads(domoticzrequest(domoticzurl))
	time.sleep(15)
           

Viene anzitutto definita la funzione def domoticzrequest (url):

Tale funzione è necessaria per inviare le richieste riguardanti la lampada verso domoticz.

Infine viene calcolato se è l’ora giusta per accendere la lampadina mediante la funzione def itstherighttime():

In particolare vengono considerate ore notturne tutte quelle comprese tra un’ora prima del tramonto e un’ora dopo l’alba

if (((now.hour>= int(sunsethour)-1)and now.hour<24) or ((now.hour<= int(sunserisehour)+1))and now.hour>=0): return 1 else: return 0

Si entra nel ciclo while solo in questo orario per evitare di pingare il dispositivo in un orario in cui non è necessario.

Di seguito viene effettuato un solo ping sul dispositivo da controllare #check su tasmota2 tasmota2 = subprocess.call(["ping", "192.168.1.53", "-c1", "-W2", "-q"])

Se il ping fallisce (if (tasmota2!=0)) allora viene controllato lo stato della lampada che viene accesa solo se precedentemente il suo stato era “OFF”

if (stat=="Off"): domoticzurl = "http://" + domoticzIP + ":" + domoticzPort + "/json.htm?type=command&param=switchlight&idx=64&switchcmd=Set%20Level&level=100" json_object = json.loads(domoticzrequest(domoticzurl))

Questo script può essere reso un servizio e reso avviabile allo start del raspberry.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.