-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEngine.py
More file actions
241 lines (195 loc) · 7.54 KB
/
Copy pathEngine.py
File metadata and controls
241 lines (195 loc) · 7.54 KB
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
import logging
import time
import platform, sys
import threading
from Settings import Settings
from Schema import Schemas
from Device import Devices, Device
from DataSource import DataSources, DataSource
from Telldus import Telldus
from Web import Web
from Sun import Sun
from datetime import datetime
class Engine:
VERSION = '0.0.5'
running = True
def __init__(self, logLevel, overwriteTelldus):
self.schemas = []
self.devices = []
self.executedDates = {}
self.executedDates['start'] = []
self.executedDates['end'] = []
self.sunDates = []
self.logLevel = logLevel
self.overwriteTelldus = overwriteTelldus
self.telldus = Telldus(logLevel)
self.deviceParser = Devices(logLevel)
self.schemaParser = Schemas(logLevel)
self.dataSourceParser = DataSources(logLevel)
self.sun = Sun()
self.webServer = None
self.webThread = None
# logging
logging.basicConfig(level=logLevel)
fileLog = logging.FileHandler(Settings.loggingPath)
self.logger = logging.getLogger('engine')
self.logger.addHandler(fileLog)
def load(self):
# load schemas
self.logger.info('loading schemas')
self.schemas = self.schemaParser.load()
# load devices
self.logger.info('loading devices')
self.devices = self.deviceParser.load(self.telldus)
# load datasources
self.logger.info('loading datasources')
self.datasources = self.dataSourceParser.load()
# starting web service
self.logger.info('starting web service on port 8080')
self.webThread = threading.Thread(target = self.startWebService)
self.webThread.start()
if len(self.devices) != self.telldus.getNumberOfDevices():
if not overwriteTelldus:
self.logger.info('number of devices in lightswitch differs from telldus. run with -o to overwrite telldus.')
#self.telldus.close()
#exit(1)
else:
self.logger.info('replacing devices in telldus with devices from lightswitch.')
self.updateTelldusWithDevices()
if Settings.enableExperimenal:
self.logger.info(' ')
self.logger.info(' ')
self.logger.info(' RUNNING EXPERIMENTAL FEATURES')
self.logger.info(' ')
self.logger.info(' ')
self.startUp()
def run(self):
self.logger.info('running on %s platform', platform.system())
self.logger.info('running application version ' + self.VERSION)
# lightswitch main loop
try:
while self.running:
now = datetime.today().replace(second=0, microsecond=0)
weekday = datetime.today().weekday()
if Settings.enableExperimenal:
for device in self.devices:
if device.getSunrise() == 'on' and now not in self.sunDates and now == self.sun.sunrise():
self.logger.info('turning off device %s because of sunrise', device.getName())
self.telldus.turnOff(device.getTelldusId())
device.setStatus('Off')
self.sunDates.append(now)
elif device.getSunset() == 'on' and now not in self.sunDates and now == self.sun.sunset():
self.logger.info('turning on device %s because of sunset', device.getName())
self.telldus.turnOn(device.getTelldusId())
device.setStatus('On')
self.sunDates.append(now)
for schema in self.schemas:
startDate = self.schemaParser.getStartDate(schema)
# check if its a start of a schedule
if (startDate is not None and\
now == startDate and\
weekday in schema.getDays() and\
now not in self.executedDates['start'] and\
self.schemaParser.tryCondition(self.dataSourceParser, schema)\
) or (\
startDate is None and self.schemaParser.tryCondition(self.dataSourceParser, schema) and\
now not in self.executedDates['start']):
self.logger.info('executing schema %s', schema.getName())
self.execute(schema)
if 'start' in self.executedDates.keys():
self.executedDates['start'].append(now)
else:
self.executedDates['start'] = [now]
if len(self.executedDates) > 100:
self.executedDates = {}
if len(self.sunDates) > 100:
self.sunDates = []
time.sleep(1)
except KeyboardInterrupt:
pass
#self.webThread.join()
self.webThread._Thread__stop()
self.telldus.close()
sys.exit(3)
def startWebService(self):
self.webServer = Web(self, self.deviceParser, self.schemaParser)
def startUp(self):
power = {}
self.logger.debug('synchronizing devices')
for schema in self.schemas:
startDate = self.schemaParser.getStartDate(schema)
now = datetime.today().replace(second=0, microsecond=0)
weekday = datetime.today().weekday()
if startDate is not None and\
startDate < now and\
weekday in schema.getDays() and\
self.schemaParser.tryCondition(self.dataSourceParser, schema):
self.logger.info('adding schema %s to execution', schema.getName())
for device in schema.getDevices().split(','):
if schema.getPower() == 'dim':
power[int(device)] = schema.getPower() + ":" + str(schema.getLevel())
else:
power[int(device)] = schema.getPower()
for device in power.keys():
dev = self.deviceParser.findDevice(device)
if dev is None:
self.logger.info('no device with id %d was found', device)
continue
if power[device] == 'on':
self.logger.info('turning on device')
self.telldus.turnOn(dev.getTelldusId())
self.telldus.turnOn(dev.getTelldusId())
dev.setStatus('On')
elif power[device] == 'off':
self.logger.info('turning off device')
self.telldus.turnOff(dev.getTelldusId())
dev.setStatus('Off')
elif power[device][0:3] == 'dim':
self.logger.info('dimming device to level %d', int(power[device][4:]))
self.telldus.dim(dev.getTelldusId(), int(power[device][4:]))
dev.setStatus('Dimmed')
#dev.setStatus('On')
#self.telldus.dim(dev.getTelldusId(), int((float(power[device][4:]) / float(100)) * float(254)))
def execute(self, schema):
for id in schema.getDevices().split(','):
self.logger.debug('looking for device with id %d', int(id))
device = self.deviceParser.findDevice(int(id))
if device is None:
return
self.logger.debug('device found')
if schema.getPower() == 'on':
self.logger.info('turning on device')
self.telldus.turnOn(device.getTelldusId())
time.sleep(1)
self.telldus.turnOn(device.getTelldusId())
device.setStatus('On')
elif schema.getPower() == 'dim':
self.logger.info('dimming device to level %d', schema.getProcentualLevel())
self.telldus.dim(device.getTelldusId(), schema.getLevel())
device.setStatus('Dimmed ' + schema.getProcentualLevel() + '%')
else:
self.logger.info('turning off device')
self.telldus.turnOff(device.getTelldusId())
self.telldus.turnOff(device.getTelldusId())
device.setStatus('Off')
#time.sleep(1)
def updateTelldusWithDevices(self):
self.logger.debug('removing devices from telldus')
for i in range(self.telldus.getNumberOfDevices()):
self.telldus.removeDevice(self.telldus.getDeviceId(i))
for device in self.devices:
self.logger.debug('adding device %s to telldus', device.getName())
tdevice = self.telldus.addDevice(len(self.devices))
tdevice.setName(device.getName())
tdevice.setProtocol(device.getProtocol())
tdevice.setModel(device.getModel())
tdevice.setParameter('house', device.getHouse())
tdevice.setParameter('unit', device.getUnit())
logLevel = logging.DEBUG
overwriteTelldus = False
for arg in sys.argv:
if arg == '-o':
overwriteTelldus = True
engine = Engine(logLevel, overwriteTelldus)
engine.load()
engine.run()