-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserialConnector.py
108 lines (93 loc) · 6.07 KB
/
serialConnector.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# @Author : Mohamed Snoussi
# @Email : sooniic@live.com
#################################################################################
# Python program
#################################################################################
# The program load a json file from the internet and compere it with another locally
# stored json file (computer local storage)
#
# if the last entry(value) in the locally stored json file doesn't match the the first entry
# of the internet loaded json file then it send a uart signal through a USB port
# (usb to serial converter needed) and append the new value on a new line in the the locally stored json file.
# then repeat on an infinite loop every randomly period (from 3 to 6 second)
#################################################################################
# install pyserial library before proceeding
# importing needed libraries ####################################################
from time import gmtime, strftime
import random, os ,serial, json
try:
# For Python 3.0 and later
from urllib.request import urlopen
except ImportError:
# Fall back to Python 2's urllib2
from urllib2 import urlopen
# functions ####################################################
# @FunctionName : consoleInfo
# @Role : print the received instraction on the console
# @Param : mode (the mode in the json file hosted in the internet)
# repeat (how many time the instraction will be exuted) essential to succeed with the radio frequencies rf433Mhz )
def consoleInfo(mode ,repeat):
repeat=str(int(repeat)*10) # multiplying by 10 as the sent signal
return {
'a': 'Sending '+ repeat +' signals to dime light slowly from full to no brightness ',
'0': 'Sending '+ repeat +' signals to switch light off',
'1': 'Sending '+ repeat +' signals to open only 10 %\ of light brightness',
'2': 'Sending '+ repeat +' signals to open only 21 %\ of light brightness',
'3': 'Sending '+ repeat +' signals to open 35 %\ of light brightness',
'4': 'Sending '+ repeat +' signals to open 47 %\ of light brightness',
'5': 'Sending '+ repeat +' signals to open 58 %\ of light brightness',
'6': 'Sending '+ repeat +' signals to open 63%\ of light brightness',
'7': 'Sending '+ repeat +' signals to open 75%\ of light brightness',
'8': 'Sending '+ repeat +' signals to open 87 %\ of light brightness',
'9': 'Sending '+ repeat +' signals to open all 100 %\ of light brightness',
'x': 'error, not right instraction',
}.get(mode, 'x') # return a log that corresbonds to the mode and a fallback default as second parameter 'x' to the error
# @FunctionName : getJsonFromTheNet
# @Role : read and decode a json from the net
# @Param : url (the url of the json file)
# @Param : json file
def getJsonFromTheNet(url):
response = urlopen(url) # load the file
data = response.read().decode("utf-8") # read and decode the loaded json file
return json.loads(data) # return the decoded file
# Important variables ####################################################
url = ("http://hospitality-entertainment.com/org/Jaz_Tour_Khalef/inte.json") # url of the json file
usbPort = 'COM3' # usb port
baudRate = 1200 # baud rate
serialPort = serial.Serial(usbPort,baudRate) # open the serial port
LocalJson = 'modeHistory.json' # local json path
keyByte = '½' # key byte 0xBD (hexadecimal) == ½ (ASCII)
waitingPeriodLoop = 3 #
# Program starts !!! ####################################################
print ("ONLY ONLINE CONTROLE") # print on terminal
# infinite loop ####################################################
while(1):
try:
randomPeriod=random.uniform(0, 3) # Random waiting period
internetLoadedJson=(getJsonFromTheNet(url)) # get and encode the internet loaded json
instractionRepeat= int(internetLoadedJson["My_home"]["Times"]) # get the signal repeat from the internet loaded json
internetLoadedMode=(internetLoadedJson["My_home"]["Mode"]) # get the mode from the internet loaded json
with open(LocalJson) as json_data: # get the locally stored Json
locallyLoadedJson = json.load(json_data)
locallyLoadedModeLastEntry=locallyLoadedJson['My_home'][-1]['Mode'] # read the last entry
if internetLoadedMode != locallyLoadedMode: # if true the internet loaded file is changed !!
timeStamp = strftime("%Y-%m-%d %H:%M:%S", gmtime()) + " GM Time" # get the time stamp
terminalMessage = consoleInfo(internetLoadedMode,instractionRepeat) # prepare the terminal message
print('\n- Instruction received on ' + timeStamp + '\n- ' + terminalMessage) # print the terminal message
newEntry = {"Date":timeStamp ,"Mode":str(internetLoadedMode),'Times':str(instractionRepeat)} # prepare a new json entry
locallyLoadedJson['My_home'].append(newEntry) # write and append the internet new json entry to the program memory (buffer)
with open('inte.json', 'w') as f:
json.dump(internetLoadedJson, f, indent=4, sort_keys=True) # write from the buffer to the hard driver as a new json file
serialPort.close() # make sure that previously opened serial connection is closed
newSingalToSend = keyByte + str(internetLoadedMode) # the signal the will be send through the usb-serial
serialPort.open() # open the serial port
for i in (1,10): # the instraction will be repeated in order one of the signals success reach the other end of the radio frequency receiver
for j in (0, instractionRepeat*10):
serialPort.write(newSingalToSend.encode())
time.sleep(0.03) # wait until proceeding the next write
time.sleep(0.3) # wait until proceeding the next iteration
serialPort.close() # make sure that previously opened serial connection is closed
print('Waiting for instruction', end='\r') # Print on the terminal
time.sleep(3+randomPeriod) # wait until repeat the forever loop
except KeyboardInterrupt: # if a keyboard key is pressed
exit() # exit the program if a keyboard key is pressed