#!/usr/bin/env python3 #import socket import sys import time import serial import threading import re import paho.mqtt.client as mqtt #hote = "192.168.67.101" hote = "127.0.0.1" port = 3020 lux=0 dimstate=False arduino = serial.Serial('/dev/ttyUSB0') #sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #sock.connect((hote, port)) #print("Connection on {}".format(port)) #arduino.write("d 0\n".encode()) def stop_chacon(): print("Switch Off") arduino.write("s0\n".encode()) #os.system('codesend 1381716') client.publish("home-assistant/switch/chacon/state", "OFF") def start_chacon(): print("Switch On") arduino.write("s1\n".encode()) #os.system('codesend 1381717') client.publish("home-assistant/switch/chacon/state", "ON") def stop_alarm(): for i in range(1,8): arduino.write("f650\n".encode()) time.sleep(10) def start_dim(): global lux global dimstate if dimstate==False: dimstate=True luxorig=lux print("Dim On") arduino.write("d1\n".encode()) time.sleep(2) i=0 while i<10 and lux<=luxorig: print("Dim On") arduino.write("d1\n".encode()) time.sleep(2) i=i+1 #os.system('codesend 1394005') def start_dim2(): print("Dim2 On") arduino.write("d1\n".encode()) def stop_dim(): global lux global dimstate if dimstate==True: dimstate=False luxorig=lux print("Dim Off") arduino.write("d0\n".encode()) time.sleep(2) i=0 while i<10 and lux>=luxorig: print("Dim Off") arduino.write("d0\n".encode()) time.sleep(2) i=i+1 #os.system('codesend 1394004') def stop_dim2(): print("Dim2 Off") arduino.write("d0\n".encode()) def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("home-assistant/salon/lumiereold/manual") client.subscribe("home-assistant/salon/lumiereold/set") client.subscribe("home-assistant/switch/chacon/set") client.subscribe("home-assistant/switch/chacon/timer") client.subscribe("home-assistant/switch/chacon/cancel") client.subscribe("home-assistant/alarm/set") client.subscribe("home-assistant/alarm/cancel") client.subscribe("arduino/display/intensity") client.subscribe("arduino/display/settext") client.subscribe("arduino/display/disableptext") client.subscribe("arduino/display/setptext") client.subscribe("arduino/display/set") client.subscribe("arduino/buzzer/melody") client.subscribe("arduino/buzzer/melody2") client.subscribe("arduino/buzzer/frequency") client.subscribe("arduino/buzzer/callring") def on_message(client, userdata, msg): if msg.topic == 'home-assistant/salon/lumiereold/manual' and msg.payload == b'ON': start_dim2() elif msg.topic == 'home-assistant/salon/lumiereold/set' and msg.payload == b'ON': client.publish("home-assistant/salon/lumiereold/state", "ON") client.loop(timeout=1.0) start_dim2() elif msg.topic == 'home-assistant/salon/lumiereold/manual' and msg.payload == b'OFF': client.publish("home-assistant/salon/lumiereold/state", "OFF") client.loop(timeout=1.0) stop_dim2() elif msg.topic == 'home-assistant/salon/lumiereold/set' and msg.payload == b'OFF': client.publish("home-assistant/salon/lumiereold/state", "OFF") client.loop(timeout=1.0) stop_dim2() elif msg.topic == 'home-assistant/switch/chacon/set' and msg.payload == b'ON': start_chacon() client.publish("home-assistant/switch/chacon/state", "ON") elif msg.topic == 'home-assistant/switch/chacon/set' and msg.payload == b'OFF': stop_chacon() elif msg.topic == 'home-assistant/switch/chacon/timer': start_chacon() timerchacon=threading.Timer(int(msg.payload)*60, stop_chacon) timerchacon.start() elif msg.topic == 'home-assistant/switch/chacon/cancel': timerchacon.cancel() stop_chacon() elif msg.topic == 'home-assistant/alarm/set': timeralarm=threading.Timer(int(msg.payload)*60, stop_alarm) timeralarm.start() elif msg.topic == 'home-assistant/alarm/cancel': timeralarm.cancel() elif msg.topic == 'arduino/display/intensity': msgtosend="i"+msg.payload.decode()+"\n" arduino.write(msgtosend.encode()) elif msg.topic == 'arduino/display/set': if msg.payload == b'ON': msgtosend="m1\n" elif msg.payload == b'OFF': msgtosend="m0\n" client.publish("arduino/display/state", msg.payload.decode(), 0, True) arduino.write(msgtosend.encode()) elif msg.topic == 'arduino/display/settext': msgtosend="t"+msg.payload.decode()+"\n" arduino.write(msgtosend.encode()) elif msg.topic == 'arduino/display/setptext': msgtosend="p"+msg.payload.decode()+"\n" arduino.write(msgtosend.encode()) elif msg.topic == 'arduino/display/disableptext': arduino.write("p\n".encode()) elif msg.topic == 'arduino/buzzer/melody': if msg.payload.decode()=="1": arduino.write("f450\n".encode()) time.sleep(0.3) arduino.write("f450\n".encode()) elif msg.payload.decode()=="2": arduino.write("f450\n".encode()) time.sleep(0.3) arduino.write("f550\n".encode()) elif msg.payload.decode()=="3": arduino.write("f450\n".encode()) time.sleep(0.3) # msgtosend="b"+msg.payload.decode()+"\n" # arduino.write(msgtosend.encode()) arduino.write("f350\n".encode()) elif msg.topic == 'arduino/buzzer/melody2': msgtosend="c"+msg.payload.decode()+"\n" arduino.write(msgtosend.encode()) elif msg.topic == 'arduino/buzzer/frequency': msgtosend="f"+msg.payload.decode()+"\n" arduino.write(msgtosend.encode()) elif msg.topic == 'arduino/buzzer/callring' and msg.payload == b'ON': arduino.write("b4\n".encode()) elif msg.topic == 'arduino/buzzer/callring' and msg.payload == b'OFF': arduino.write("b5\n".encode()) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("127.0.0.1", 1883, 60) client.loop_start() def readlines(arduino, recv_buffer=4096, delim='\n'): buffer = '' data = True while data: data = arduino.read(recv_buffer) buffer += data.decode() while buffer.find(delim) != -1: line, buffer = buffer.split('\n', 1) yield line return #for line in readlines(arduino): while True: line=arduino.readline().decode() line2=line.rstrip() #line2=line #print("Received : "+line2) m=re.match(r"^([a-z]) ([0-9.]+)\r?\n?$",line2) if m != None: cmd=m.group(1) val=m.group(2) # cmd, val1=line.split(' ',1) # val=val1.rstrip() curtime=time.time() if cmd=='t': client.publish("home-assistant/salon/temperature", str(round(float(val),1)), 0, True) client.publish("home-assistant/salon/temperature-influx", "dht22 temperature="+str(round(float(val),1))+" "+str(int(curtime))+"000000000", 0, True) elif cmd=='h': client.publish("home-assistant/salon/humidity", val, 0, True) client.publish("home-assistant/salon/humidity-influx", "dht22 humidity="+val+" "+str(int(curtime))+"000000000", 0, True) elif cmd=='x': if int(val)-lux > 1 and int(val)-lux < -1: client.publish("home-assistant/salon/lux", val, 0, True) lux=int(val) elif cmd=='p': if int(val)==0: client.publish("home-assistant/salon/pir", "OFF", 0, True) elif int(val)==1: client.publish("home-assistant/salon/pir", "ON", 0, True) print("Close") #sock.close()