| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- from datetime import datetime
- from abc import ABC, abstractmethod
- class _airStats(object):
- oxigenLevel = 0
- nitrogenLevel = 0
- methaneLevel = 0
- sulfurDioxidLevel = 0
- carbonMonoxidLevel = 0
- carbonDioxidLevel = 0
- particles_pm1 = 0
- particles_pm5 = 0
- particles_pm10 = 0
- def getJSON(self):
- return {
- "Oxigen": self.oxigenLevel,
- "Nitrogen": self.nitrogenLevel,
- "Methane": self.methaneLevel,
- "Sulfurdioxid": self.sulfurDioxidLevel,
- "Carbonmonoxid": self.carbonMonoxidLevel,
- "Carbondioxid": self.carbonDioxidLevel,
- "Particles_PM1": self.particles_pm1,
- "Particles_PM5": self.particles_pm5,
- "Particles_PM10":self.particles_pm10
- }
- class _temperatureProperty:
- _temperature = dict()
- __temperature_count = 0
- __temperature_coldest = 22
- __temperature_hottest = 22
- __temperature_avg = 22
- @property
- def count(self) -> int:
- return self.__temperature_count
- @property
- def coldest(self) -> float:
- return self.__temperature_coldest
- @property
- def hottest(self) -> float:
- return self.__temperature_hottest
- @property
- def avg(self) -> float:
- if self.__temperature_count==0:
- return 20.0
- else:
- return self.__temperature_avg
- def set(self, id:str, value:float):
- if id in self._temperature:
- if self._temperature[id] == value:
- # Value exists and didn't change
- return
- # Key doesn't exists or value has changed
- self._temperature[id] = value
- count = 0
- tempMin = 99.9
- tempMax = 0.0
- tempTotal = 0.0
- for k,v in self._temperature.items():
- count+=1
- tempTotal+=v
- if tempMin > v:
- tempMin = v
- if tempMax < v:
- tempMax = v
- self.__temperature_count = int(count)
- self.__temperature_coldest = float(tempMin)
- self.__temperature_hottest = float(tempMax)
- if count==0:
- return 20.0
- else:
- self.__temperature_avg = float(tempTotal / count)
- def getJSON(self):
- return {
- "count": self.count,
- "avg": self.avg,
- "coldest": self.coldest,
- "hottest": self.hottest
- }
- class _toggleProperty(ABC):
- _objects = dict()
- _count = 0
- _active = 0
- _inactive = 0
- _time_active = datetime.now()
- _time_inactive = datetime.now()
- _time_all_active = datetime.now()
- _time_all_inactive = datetime.now()
- @property
- def count(self) -> int:
- return self._count
- def set(self, id:str, state:bool):
- if id in self._objects:
- if self._objects[id] == state:
- # Value exists and didn't change
- return
- # Key doesn't exists or value has changed
- if self._count == self._off:
- self._time_all_inactive = datetime.now()
- if self._off>0:
- self._time_inactive = datetime.now()
- if self._count == self._open:
- self._time_all_active = datetime.now()
- if self._on>0:
- self._time_active = datetime.now()
- self._objects[id] = state
- count = 0
- countOn = 0
- countOff = 0
- for k,v in self._objects.items():
- count+=1
- if v==True:
- countOn+=1
- else:
- countOff+=1
- self._count = count
- self._active = countOn
- self._inactive = countOff
- @abstractmethod
- def getJSON(self):
- pass
- def _readableTime(self, time:datetime):
- return time
- class _onOffProperty(_toggleProperty):
- @property
- def bAllOn(self) -> bool:
- return self._count <= self._active
- @property
- def bAllOff(self) -> bool:
- return self._count <= self._inactive
- @property
- def on(self) -> int:
- return self._active
- @property
- def off(self) -> int:
- return self._inactive
- @property
- def lastTimeOn(self) -> datetime:
- if self._active>0:
- return datetime.now()
- else:
- self._time_active
- @property
- def lastTimeAllOn(self) -> datetime:
- if self._count == self._active:
- return datetime.now()
- else:
- self._time_all_active
- @property
- def laseTimeOff(self) -> datetime:
- if self._inactive>0:
- return datetime.now()
- else:
- return self._time_inactive
- @property
- def lastTimeAllOff(self) -> datetime:
- if self._count == self._inactive:
- return datetime.now()
- else:
- return self._time_all_inactive
- def getJSON(self):
- return {
- "All_Off": self.bAllOn,
- "All_On": self.bAllOff,
- "LastTimeOpen": self._readableTime(self.lastTimeOn),
- "LaseTimeClose": self._readableTime(self.laseTimeOff),
- "LastTimeAllOpen": self._readableTime(self.lastTimeAllOn),
- "LastTimeAllClosed": self._readableTime(self.lastTimeAllOff),
- "Count": self.count,
- "OnCount": self.on,
- "OffCount": self.off
- }
- class _openCloseProperty(_toggleProperty):
- @property
- def bAllOpen(self) -> bool:
- return self._count <= self._active
- @property
- def bAllClose(self) -> bool:
- return self._count <= self._inactive
- @property
- def open(self) -> int:
- return self._active
- @property
- def close(self) -> int:
- return self._inactive
- @property
- def lastTimeOpen(self) -> datetime:
- if self._active>0:
- return datetime.now()
- else:
- self._time_active
- @property
- def lastTimeAllOpen(self) -> datetime:
- if self._count == self._active:
- return datetime.now()
- else:
- self._time_all_active
- @property
- def laseTimeClose(self) -> datetime:
- if self._inactive>0:
- return datetime.now()
- else:
- return self._time_inactive
- @property
- def lastTimeAllClose(self) -> datetime:
- if self._count == self._inactive:
- return datetime.now()
- else:
- return self._time_all_inactive
- def getJSON(self):
- return {
- "All_Closed": self.bAllOpen,
- "All_Opened": self.bAllClose,
- "LastTimeOpen": self._readableTime(self.lastTimeOpen),
- "LaseTimeClose": self._readableTime(self.laseTimeClose),
- "LastTimeAllOpen": self._readableTime(self.lastTimeAllOpen),
- "LastTimeAllClosed": self._readableTime(self.lastTimeAllClose),
- "Count": self.count,
- "OpenCount": self.open,
- "CloseCount": self.close
- }
- class HouseStats(object):
-
- def __init__(self):
- self._movements = dict()
- self._rooms = dict()
- self._air = _airStats()
- self.__lightsProp = _onOffProperty()
- self.__switchesProp = _onOffProperty()
- self.__windowsProp = _openCloseProperty()
- self.__doorsProp = _openCloseProperty()
- self.__temperature = _temperatureProperty()
- @property
- def Lights(self) -> _onOffProperty:
- return self.__lightsProp
- @property
- def Switches(self) -> _onOffProperty:
- return self.__switchesProp
- @property
- def Windows(self) -> _onOffProperty:
- return self.__windowsProp
- @property
- def Doors(self) -> _onOffProperty:
- return self.__doorsProp
-
- @property
- def Temperature(self) -> _temperatureProperty:
- return self.__temperature
-
- @property
- def Air(self) -> _airStats:
- return self._air
-
- #TODO Rooms
- #TODO Movement Stats
- def getJson(self):
- return {
- "Temperature": self.Temperature.getJSON(),
- "Windows": self.Windows.getJSON(),
- "Doors": self.Doors.getJSON(),
- "Lights": self.Lights.getJSON(),
- "Switches": self.Lights.getJSON(),
- "Air": self.Air.getJSON(),
- "Rooms": {
- # TODO
- },
- "Movements": {
- # TODO
- }
- }
|