コード例 #1
0
 def __init__(self):
     threading.Thread.__init__(self)
     self.setDaemon(True)
     self._logger = logging.getLogger(__name__)
     hdlr = logging.FileHandler('/tmp/sensomatic.log')
     formatter = logging.Formatter(
         '%(asctime)s %(name)s %(lineno)d %(levelname)s %(message)s')
     hdlr.setFormatter(formatter)
     self._logger.addHandler(hdlr)
     self._logger.setLevel(logging.INFO)
     self._info = InformationFetcher()
     self._homeDir = os.path.expanduser("~/.sensomatic")
     self._configFileName = self._homeDir + '/config.ini'
     self._config = ConfigParser.ConfigParser()
     self._readConfig()
     self._redis = redis.StrictRedis(
         host=self._config.get("REDIS", "ServerAddress"),
         port=self._config.get("REDIS", "ServerPort"),
         db=0)
     self._mqclient = mqtt.Client("AlarmClock", clean_session=True)
     self._mqclient.on_connect = self._on_connect
     self._mqclient.on_message = self._on_message
     self._mqclient.on_disconnect = self._on_disconnect
     self._mqclient.connect(self._config.get("MQTT", "ServerAddress"),
                            self._config.get("MQTT", "ServerPort"), 60)
     self._mqclient.loop_start()
コード例 #2
0
 def __init__(self):
     random.seed
     threading.Thread.__init__(self)
     self.setDaemon(True)
     self._homeDir = os.path.expanduser("~/.sensomatic")
     self._configFileName = self._homeDir + '/config.ini'
     self._config = ConfigParser.ConfigParser()
     self._readConfig()
     self._mqclient = mqtt.Client("MqttRulezTester", clean_session=True)
     self._redis = redis.StrictRedis(
         host=self._config.get("REDIS", "ServerAddress"),
         port=self._config.get("REDIS", "ServerPort"),
         db=0)
     self._template = TemplateMatcher()
     self._info = InformationFetcher()
     self._workingQueue = Queue.Queue()
     self._lastwaterlevel = -1
     self._cortex_wan_rx = 0
     self._cortex_wan_tx = 0
     self._cortex_cortex_rx = 0
     self._cortex_cortex_tx = 0
     self._cortex_phawxansi_rx = 0
     self._cortex_phawxansi_tx = 0
     self._bike_laststep = 0
     self._bike_starttime = 0
コード例 #3
0
 def __init__(self):
     random.seed
     threading.Thread.__init__(self)
     self.setDaemon(True)
     self._logger               = logging.getLogger(__name__)
     hdlr                       = logging.FileHandler('/tmp/sensomatic.log')
     formatter                  = logging.Formatter('%(asctime)s %(name)s %(lineno)d %(levelname)s %(message)s')
     hdlr.setFormatter(formatter)
     self._logger.addHandler(hdlr)
     self._logger.setLevel(logging.INFO)
     self._homeDir              = os.path.expanduser("~/.sensomatic")
     self._configFileName       = self._homeDir + '/config.ini'
     self._config               = ConfigParser.ConfigParser()
     self._readConfig()
     self._mqclient             = mqtt.Client("MqttRulez", clean_session=True)
     self._redis                = redis.StrictRedis(host=self._config.get("REDIS", "ServerAddress"), port=self._config.get("REDIS", "ServerPort"), db=0)
     self._template             = TemplateMatcher()
     self._info                 = InformationFetcher()
     self._workingQueue         = Queue.Queue()
     self._lastwaterlevel       = -1
     self._cortex_wan_rx        = 0
     self._cortex_wan_tx        = 0
     self._cortex_cortex_rx     = 0
     self._cortex_cortex_tx     = 0
     self._cortex_phawxansi_rx  = 0
     self._cortex_phawxansi_tx  = 0
     self._bike_laststep        = 0
     self._bike_starttime       = 0
     self._bike_distance        = 0
コード例 #4
0
 def __init__(self):
     self._info = InformationFetcher()
     threading.Thread.__init__(self)
     self.setDaemon(True)
     self._homeDir = os.path.expanduser("~/.sensomatic")
     self._configFileName = self._homeDir + '/config.ini'
     self._config = ConfigParser.ConfigParser()
     self._readConfig()
     self._mqclient = mqtt.Client("RoomController", clean_session=True)
     self._redis = redis.StrictRedis(
         host=self._config.get("REDIS", "ServerAddress"),
         port=self._config.get("REDIS", "ServerPort"),
         db=0)
     self._lastWorkingLight = [0, 0, 0]
     self._lastBedLight = [0, 0, 0]
     self._SoundActive = False
     self._FastCheck = False
コード例 #5
0
ファイル: Tank.py プロジェクト: AnsgarSchmidt/sensomatic
 def __init__(self):
     threading.Thread.__init__(self)
     self.setDaemon(True)
     self._homeDir = os.path.expanduser("~/.sensomatic")
     self._configFileName = self._homeDir + '/config.ini'
     self._configMTime = 0
     self._config = ConfigParser.ConfigParser()
     self._readConfig()
     self._template = TemplateMatcher()
     self._info = InformationFetcher()
     self._mqclient = mqtt.Client("Tank2", clean_session=True)
     self._daystate = Tank.NIGHT
     self._twitterdaystate = Tank.NIGHT
     self._lastfurtilizer = time.time()
     self._lastcharts = time.time()
     self._sunpercentage = 0
     self._moonpercentage = 0
コード例 #6
0
 def __init__(self):
     self._info = InformationFetcher()
     threading.Thread.__init__(self)
     self.setDaemon(True)
     self._homeDir          = os.path.expanduser("~/.sensomatic")
     self._configFileName   = self._homeDir + '/config.ini'
     self._config           = ConfigParser.ConfigParser()
     self._readConfig()
     self._mqclient         = mqtt.Client("RoomController", clean_session=True)
     self._redis            = redis.StrictRedis(host=self._config.get("REDIS", "ServerAddress"),
                                                port=self._config.get("REDIS", "ServerPort"), db=0)
     self._lastWorkingLight = [0, 0, 0]
     self._lastBedLight     = [0, 0, 0]
     self._SoundActive      = False
     self._FastCheck        = False
コード例 #7
0
ファイル: Climate.py プロジェクト: AnsgarSchmidt/sensomatic
 def __init__(self):
     threading.Thread.__init__(self)
     self.setDaemon(True)
     self._homeDir                = os.path.expanduser("~/.sensomatic")
     self._configFileName         = self._homeDir + '/config.ini'
     self._humidityFileName       = self._homeDir + '/humidity.txt'
     self._temperatureFileName    = self._homeDir + '/temperature.txt'
     self._config                 = ConfigParser.ConfigParser()
     self._readConfig()
     self._checkSettings()
     self._info                   = InformationFetcher()
     self._mqclient               = mqtt.Client("Climate", clean_session=True)
     self._mqclient.connect(self._config.get("MQTT", "ServerAddress"), self._config.get("MQTT", "ServerPort"), 60)
     self._mqclient.on_connect    = self._on_connect
     self._mqclient.on_message    = self._on_message
     self._mqclient.on_disconnect = self._on_disconnect
     self._mqclient.loop(max_packets=100)
コード例 #8
0
ファイル: Tank.py プロジェクト: AnsgarSchmidt/sensomatic
 def __init__(self):
     threading.Thread.__init__(self)
     self.setDaemon(True)
     self._homeDir         = os.path.expanduser("~/.sensomatic")
     self._configFileName  = self._homeDir + '/config.ini'
     self._configMTime     = 0
     self._config          = ConfigParser.ConfigParser()
     self._readConfig()
     self._template        = TemplateMatcher()
     self._info            = InformationFetcher()
     self._mqclient        = mqtt.Client("Tank2", clean_session=True)
     self._daystate        = Tank.NIGHT
     self._twitterdaystate = Tank.NIGHT
     self._lastfurtilizer  = time.time()
     self._lastcharts      = time.time()
     self._sunpercentage   = 0
     self._moonpercentage  = 0
コード例 #9
0
ファイル: Exercise.py プロジェクト: AnsgarSchmidt/sensomatic
 def __init__(self):
     random.seed
     threading.Thread.__init__(self)
     self.setDaemon(True)
     self._homeDir = os.path.expanduser("~/.sensomatic")
     self._configFileName = self._homeDir + '/config.ini'
     self._config = ConfigParser.ConfigParser()
     self._readConfig()
     self._mqclient = mqtt.Client("Exercise", clean_session=True)
     self._redis = redis.StrictRedis(
         host=self._config.get("REDIS", "ServerAddress"),
         port=self._config.get("REDIS", "ServerPort"),
         db=0)
     self._template = TemplateMatcher()
     self._info = InformationFetcher()
     self._workingQueue = Queue.Queue()
     self._meterPerMinute = (
         self._config.getfloat("EXERCISE", "kmperweek") /
         (7 * 24 * 60)) * 1000.0
     self._lastAnnounce = time.time()
コード例 #10
0
 def __init__(self):
     threading.Thread.__init__(self)
     self.setDaemon(True)
     self._logger                 = logging.getLogger(__name__)
     hdlr                         = logging.FileHandler('/tmp/sensomatic.log')
     formatter                    = logging.Formatter('%(asctime)s %(name)s %(lineno)d %(levelname)s %(message)s')
     hdlr.setFormatter(formatter)
     self._logger.addHandler(hdlr)
     self._logger.setLevel(logging.INFO)
     self._info                   = InformationFetcher()
     self._homeDir                = os.path.expanduser("~/.sensomatic")
     self._configFileName         = self._homeDir + '/config.ini'
     self._config                 = ConfigParser.ConfigParser()
     self._readConfig()
     self._redis                  = redis.StrictRedis(host=self._config.get("REDIS", "ServerAddress"), port=self._config.get("REDIS", "ServerPort"), db=0)
     self._mqclient               = mqtt.Client("AlarmClock", clean_session=True)
     self._mqclient.on_connect    = self._on_connect
     self._mqclient.on_message    = self._on_message
     self._mqclient.on_disconnect = self._on_disconnect
     self._mqclient.connect(self._config.get("MQTT", "ServerAddress"), self._config.get("MQTT", "ServerPort"), 60)
     self._mqclient.loop_start()
コード例 #11
0
ファイル: Template.py プロジェクト: AnsgarSchmidt/sensomatic
class TemplateMatcher():

    def __init__(self):
        self._env                = Environment(loader=PackageLoader('Template', 'tts-templates'))
        self._informationFetcher = InformationFetcher()

    def getHourlyTime(self):
        template = self._env.get_template('time-hourly.txt')
        hour = datetime.datetime.now().time().hour
        _,_,temp,_,_,_,_ = self._informationFetcher.getOutdoor()
        return template.render(hour=hour, temp=temp)

    def getCurrentTime(self):
        template = self._env.get_template('time-current.txt')
        hour     = datetime.datetime.now().time().hour
        minute   = datetime.datetime.now().time().minute
        return template.render(hour=hour, minute=minute)

    def getAcknowledgeStartWashingMachine(self):
        template = self._env.get_template('acknowledge-start-washing-machine.txt')
        return template.render()

    def getAcknowledgeEndWashingMachine(self):
        template = self._env.get_template('acknowledge-end-washing-machine.txt')
        return template.render()

    def getAcknowledgeEmtyingWashingMachine(self):
        template = self._env.get_template('acknowledge-empty-washing-machine.txt')
        return template.render()

    def getAcknowledgeStartShower(self, name):
        template = self._env.get_template('acknowledge-start-shower.txt')
        return template.render(name=name)

    def getAcknowledgeEndShower(self, name):
        template = self._env.get_template('acknowledge-end-shower.txt')
        return template.render(name=name)

    def getAcknowledgeStartBath(self, name):
        template = self._env.get_template('acknowledge-start-bath.txt')
        return template.render(name=name)

    def getAcknowledgeEndBath(self, name):
        template = self._env.get_template('acknowledge-end-bath.txt')
        return template.render(name=name)

    def getAcknowledgeDeactivateBath(self, name):
        template = self._env.get_template('acknowledge-deactivate-everything.txt')
        return template.render(name=name)

    def getWateringTheFlower(self, level):
        template = self._env.get_template('watering-the-flower.txt')
        return template.render(level=level)

    def getWashingMachineReady(self, endtime):
        template = self._env.get_template('washingmachine-ready.txt')
        diff = time.time() - endtime
        hours = int(diff / (60.0 * 60.0) )
        minutes = int( (diff - (hours * 60.0 * 60.0)) / 60.0 )
        return template.render(hours=hours, minutes=minutes)

    def getBathShowerUpdate(self):
        name=self._informationFetcher.getWhoIsInBathShower()
        showerbath=self._informationFetcher.getBathOrShower()
        minutes=self._informationFetcher.getTimeInBathShower()
        outtemp,_,_,condition,_,_,_ = self._informationFetcher.getOutdoor()
        temp=self._informationFetcher.getRoomTemp(Room.BATH_ROOM)
        humidity=self._informationFetcher.getRoomHumidity(Room.BATH_ROOM)
        timehour=datetime.datetime.now().time().hour
        timemin=datetime.datetime.now().time().minute
        template = self._env.get_template('bath-shower-update.txt')
        return template.render(name=name, showerbath=showerbath,minutes=minutes,outtemp=outtemp,condition=condition,temp=temp,humidity=humidity,timehour=timehour,timemin=timemin )

    def getTimeToGoToBed(self):
        template = self._env.get_template('time-to-go-to-bed.txt')
        hour = datetime.datetime.now().time().hour + 1
        return template.render(hour=hour)

    def getWakeupText(self, name):
        template   = self._env.get_template('wakeup.txt')
        name       = name
        fraction, degrees, minutes, seconds = self._informationFetcher.getEarthRotationTime()
        messages   = self._informationFetcher.getNumEmailMessages()
        bathtemp   = self._informationFetcher.getRoomTemp(Room.BATH_ROOM)
        bathhum    = self._informationFetcher.getRoomHumidity(Room.BATH_ROOM)
        planettemp, planethum, planetfeels, conditions, winddir, windspeed, gust = self._informationFetcher.getOutdoor()
        prediction = self._informationFetcher.getPrediction()
        astronauts = self._informationFetcher.getAstronauts()
        return template.render(name=name, degrees=degrees, minutes=minutes, seconds=seconds, messages=messages, bathtemp=bathtemp, bathhum=bathhum, planettemp=planettemp, planethum=planethum, planetfeels=planetfeels, conditions=conditions, winddir=winddir, windspeed=windspeed, gust=gust, prediction=prediction, astronauts=astronauts )

    def getBathToMoisty(self):
        template = self._env.get_template('bath-still-to-moisty.txt')
        return template.render()

    def getWorfsTemperature(self, current, delta):
        template = self._env.get_template('worf-temperature.txt')
        return template.render(current=current, delta=delta)

    def getCo2ToHigh(self, room):
        template = self._env.get_template('co2-to-high.txt')
        return template.render(co2=self._informationFetcher.getRoomCo2Level(room))

    def getRadiationToHigh(self, value):
        template = self._env.get_template('radiation-to-high.txt')
        return template.render(value=value)

    def getRadiationHigherThenAverage(self, valuehere, valueavr):
        template = self._env.get_template('radiation-higher-then-average.txt')
        return template.render(valuehere=valuehere, valueavr=valueavr)

    def getParticulateMatterHigherThenAverage(self, p1, p2):
        template = self._env.get_template('particulate-matter-to-high.txt')
        return template.render(p1=p1, p2=p2)

    def getNewDynamicIP(self, name):
        template = self._env.get_template('new-dynamic-ip.txt')
        return template.render(name=name)

    def getWaterlevelLow(self):
        template = self._env.get_template('tank-waterlevel-low.txt')
        return template.render()

    def getWaterlevelNormal(self):
        template = self._env.get_template('tank-waterlevel-normal.txt')
        return template.render()

    def getWaterChangeOn(self):
        template = self._env.get_template('tank-waterchange-on.txt')
        return template.render()

    def getWaterChangeOff(self):
        template = self._env.get_template('tank-waterchange-off.txt')
        return template.render()

    def getWaterChangeTemp(self, temp):
        template = self._env.get_template('tank-waterchange-temp.txt')
        return template.render(temp=temp)

    def getBikeBatteryLevelWarn(self, level):
        template = self._env.get_template('bike-low-bat.txt')
        return template.render(level=level)

    def getBikeStart(self, hours):
        template = self._env.get_template('bike-start.txt')
        return template.render(hours=hours)

    def getBikeEnd(self, minutes, distance):
        template = self._env.get_template('bike-end.txt')
        return template.render(minutes=minutes, distance=distance)

    def getBikeStatus(self, current, distance):
        template = self._env.get_template('bike-status.txt')
        return template.render(current=current, distance=distance)
コード例 #12
0
ファイル: Template.py プロジェクト: AnsgarSchmidt/sensomatic
 def __init__(self):
     self._env                = Environment(loader=PackageLoader('Template', 'tts-templates'))
     self._informationFetcher = InformationFetcher()
コード例 #13
0
ファイル: Tank.py プロジェクト: AnsgarSchmidt/sensomatic
class Tank(threading.Thread):

    DAWN   = 0
    DAY    = 1
    SUNSET = 2
    NIGHT  = 3

    def _readConfig(self):

        if self._configMTime != os.stat(self._configFileName).st_mtime:

            print "Reread config file for tank"
            self._configMTime = os.stat(self._configFileName).st_mtime
            update = False
            stop   = False

            if not os.path.isdir(self._homeDir):
                print "Creating homeDir"
                os.makedirs(self._homeDir)

            if os.path.isfile(self._configFileName):
                self._config.read(self._configFileName)
            else:
                print "Config file not found"
                update = True

            if not self._config.has_section('MQTT'):
                print "Adding MQTT part"
                update = True
                self._config.add_section("MQTT")

            if not self._config.has_option("MQTT", "ServerAddress"):
                print "No Server Address"
                update = True
                self._config.set("MQTT", "ServerAddress", "<ServerAddress>")

            if not self._config.has_option("MQTT", "ServerPort"):
                print "No Server Port"
                update = True
                self._config.set("MQTT", "ServerPort", "1883")

            if not self._config.has_section('TANK'):
                print "Adding Tank part"
                update = True
                self._config.add_section("TANK")

            if not self._config.has_option("TANK", "Location"):
                print "No Tank Virtual Location"
                update = True
                self._config.set("TANK", "Location", "Port Of Spain")

            if not self._config.has_option("TANK", "LocationOffset"):
                print "No Tank Virtual Location Offset"
                update = True
                self._config.set("TANK", "LocationOffset", "0")

            if not self._config.has_option("TANK", "NightTemp"):
                print "No Tank Night Temperature"
                update = True
                self._config.set("TANK", "NightTemp", "23")

            if not self._config.has_option("TANK", "DayTemp"):
                print "No Tank Day Temperature"
                update = True
                self._config.set("TANK", "DayTemp", "24")

            if not self._config.has_option("TANK", "FertilizerInterval"):
                print "No Tank FertilizerInterval"
                update = True
                self._config.set("TANK", "FertilizerInterval", "3600")

            if not self._config.has_option("TANK", "GraphInterval"):
                print "No Tank GraphInterval"
                update = True
                self._config.set("TANK", "GraphInterval", "9000")

            if update:
                with open(self._configFileName, 'w') as f:
                    self._config.write(f)

            if stop:
                print "Please check config file"
                sys.exit(0)

    def __init__(self):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self._homeDir         = os.path.expanduser("~/.sensomatic")
        self._configFileName  = self._homeDir + '/config.ini'
        self._configMTime     = 0
        self._config          = ConfigParser.ConfigParser()
        self._readConfig()
        self._template        = TemplateMatcher()
        self._info            = InformationFetcher()
        self._mqclient        = mqtt.Client("Tank2", clean_session=True)
        self._daystate        = Tank.NIGHT
        self._twitterdaystate = Tank.NIGHT
        self._lastfurtilizer  = time.time()
        self._lastcharts      = time.time()
        self._sunpercentage   = 0
        self._moonpercentage  = 0

    def _on_connect(self, client, userdata, rc, msg):
        print "Connected Tank with result code %s" % rc
        self._mqclient.subscribe("livingroom/tank/#")

    def _on_message(self, client, userdata, msg):
        #print "Mq Received on channel %s -> %s" % (msg.topic, msg.payload)
        pass

    def _on_disconnect(self, client, userdata, msg):
        print "Disconnect MQTTRulez"

    def updateSunAndMoon(self):
        now                               = datetime.datetime.now()
        dawn, sunrise, noon, sunset, dusk = self._info.getSunTimes(self._config.get("TANK", "Location"), int(self._config.get("TANK", "LocationOffset")))
        moonPhase                         = self._info.getMoonPhase(self._config.get("TANK", "Location"))
        moonElevation, _                  = self._info.getMoonPosition()

        if (dawn < now < sunrise):
            duration = sunrise - dawn
            done     = now - dawn
            self._daystate = Tank.DAWN
            self._sunpercentage = int((done.total_seconds() / duration.total_seconds()) * 100)

        elif (sunrise < now < sunset):
            self._daystate = Tank.DAY
            self._sunpercentage = 100

        elif (sunset < now < dusk):
            duration = dusk - sunset
            done = now - sunset
            self._daystate      = Tank.SUNSET
            self._sunpercentage = int((1.0 - (done.total_seconds() / duration.total_seconds())) * 100)

        else:
            self._daystate      = Tank.NIGHT
            self._sunpercentage = 0

        # 0 = New moon, 7 = First quarter, 14 = Full moon, 21 = Last quarter
        moonphasepercentage = 0.0

        if (0 <= moonPhase <= 14):
            moonphasepercentage = 1.0 - ( (14.0 - (moonPhase       ) ) / 14.0)
        else:
            moonphasepercentage =       ( (14.0 - (moonPhase - 14.0) ) / 14.0)

        if moonElevation > 0:
            self._moonpercentage = int(moonphasepercentage * (moonElevation / 90.0) * 100)
        else:
            self._moonpercentage = 0

    def publishMQTT(self):
        self._mqclient.publish("livingroom/tank/whitelight", self._sunpercentage )
        self._mqclient.publish("livingroom/tank/bluelight",  self._moonpercentage)

        if self._daystate in (Tank.DAWN, Tank.DAY, Tank.SUNSET):
            self._mqclient.publish("livingroom/tank/settemp",   self._config.get("TANK", "DayTemp"))
        else:
            self._mqclient.publish("livingroom/tank/settemp",   self._config.get("TANK", "NightTemp"))

    def publishTwitter(self):
        if self._twitterdaystate is not self._daystate:
            if self._daystate == Tank.DAWN:
                self._mqclient.publish("twitter/text", "Switching light scene to dawn and rise the light level. #Fishtank Yellow #cheerlights")
            if self._daystate == Tank.DAY:
                self._mqclient.publish("twitter/text", "Switching light scene to day. #Fishtank Warmwhite #cheerlights")
            if self._daystate == Tank.SUNSET:
                self._mqclient.publish("twitter/text", "Switching light scene to sunset and lover the light level. #Fishtank Orange #cheerlights")
            if self._daystate == Tank.NIGHT:
                self._mqclient.publish("twitter/text", "Switching light scene to night. #Fishtank Black #cheerlights")
            self._twitterdaystate = self._daystate

    def publishFertilizer(self):
        now = time.time()
        if self._daystate == Tank.DAY:
            if (now - self._lastfurtilizer) > int(self._config.get("TANK", "FertilizerInterval")):
                self._mqclient.publish("livingroom/tank/fertilizer", 1)
                self._mqclient.publish("twitter/text", "Adding some material of natural or synthetic origin (other than liming materials). #Fishtank #Fertilizer")
                self._lastfurtilizer = now

    def publishCharts(self):
        now = time.time()
        if (now - self._lastcharts) > int(self._config.get("TANK", "GraphInterval")):
            try:
                j = json.loads(requests.get("https://uss-horizon.mybluemix.net/api/twitter/getHeaterID").content)
                self._mqclient.publish("twitter/uploaded/" + j[0]['media_id_string'], "Water temperature, air temperature, heater active, water level and adding water. #IoT #Fishtank #watson #analytics")
                self._mqclient.publish("twitter/uploaded/" + j[1]['media_id_string'], "Heater activity percentage, air temperature and humidity. #IoT #Fishtank #watson #analytics")
                self._mqclient.publish("twitter/uploaded/" + j[2]['media_id_string'], "Sun and moon intensity for the fishtank. #IoT #fishtank #watson #analytics")
            except:
                print "Error in publishing charts"
            self._lastcharts = now

    def run(self):
        self._mqclient.connect(self._config.get("MQTT", "ServerAddress"), self._config.get("MQTT", "ServerPort"), 60)
        self._mqclient.on_connect    = self._on_connect
        self._mqclient.on_message    = self._on_message
        self._mqclient.on_disconnect = self._on_disconnect
        self._mqclient.loop_start()

        while True:
            self._readConfig()
            self.updateSunAndMoon()
            self.publishMQTT()
            self.publishTwitter()
            self.publishFertilizer()
            self.publishCharts()
            time.sleep(15)
コード例 #14
0
ファイル: main.py プロジェクト: AnsgarSchmidt/sensomatic
from RoomController import RoomController
from AlarmClock import AlarmClock
from HS100 import HS100
from Mpd import Mpd
from TwitterPusher import TwitterPusher
from Tank import Tank
from Telegram import Telegram
from SmarterCoffee import SmartCoffee
from Newscatcher import Newscatcher
from Chromecast import Chromecast
from Influx import Influx
from Adafruit import Adafruit
from Exercise import Exercise

temp = TemplateMatcher()
info = InformationFetcher()
logger = logging.getLogger(__name__)
hdlr = logging.FileHandler('/tmp/sensomatic.log')
formatter = logging.Formatter(
    '%(asctime)s %(name)s %(lineno)d %(levelname)s %(message)s')

hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)

homeDir = os.path.expanduser("~/.sensomatic")
configFileName = homeDir + '/config.ini'
config = ConfigParser.ConfigParser()


def _readConfig():
コード例 #15
0
class AlarmClock(threading.Thread):

    def _readConfig(self):
        update = False

        if not os.path.isdir(self._homeDir):
            print "Creating homeDir"
            os.makedirs(self._homeDir)

        if os.path.isfile(self._configFileName):
            self._config.read(self._configFileName)
        else:
            print "Config file not found"
            update = True

        if not self._config.has_section('REDIS'):
            print "Adding Redis part"
            update = True
            self._config.add_section("REDIS")

        if not self._config.has_option("REDIS", "ServerAddress"):
            print "No Server Address"
            update = True
            self._config.set("REDIS", "ServerAddress", "<ServerAddress>")

        if not self._config.has_option("REDIS", "ServerPort"):
            print "No Server Port"
            update = True
            self._config.set("REDIS", "ServerPort", "6379")

        if not self._config.has_section('MQTT'):
            print "Adding MQTT part"
            update = True
            self._config.add_section("MQTT")

        if not self._config.has_option("MQTT", "ServerAddress"):
            print "No Server Address"
            update = True
            self._config.set("MQTT", "ServerAddress", "<ServerAddress>")

        if not self._config.has_option("MQTT", "ServerPort"):
            print "No Server Port"
            update = True
            self._config.set("MQTT", "ServerPort", "1883")

        if update:
            with open(self._configFileName, 'w') as f:
                self._config.write(f)
                sys.exit(1)

    def __init__(self):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self._logger                 = logging.getLogger(__name__)
        hdlr                         = logging.FileHandler('/tmp/sensomatic.log')
        formatter                    = logging.Formatter('%(asctime)s %(name)s %(lineno)d %(levelname)s %(message)s')
        hdlr.setFormatter(formatter)
        self._logger.addHandler(hdlr)
        self._logger.setLevel(logging.INFO)
        self._info                   = InformationFetcher()
        self._homeDir                = os.path.expanduser("~/.sensomatic")
        self._configFileName         = self._homeDir + '/config.ini'
        self._config                 = ConfigParser.ConfigParser()
        self._readConfig()
        self._redis                  = redis.StrictRedis(host=self._config.get("REDIS", "ServerAddress"), port=self._config.get("REDIS", "ServerPort"), db=0)
        self._mqclient               = mqtt.Client("AlarmClock", clean_session=True)
        self._mqclient.on_connect    = self._on_connect
        self._mqclient.on_message    = self._on_message
        self._mqclient.on_disconnect = self._on_disconnect
        self._mqclient.connect(self._config.get("MQTT", "ServerAddress"), self._config.get("MQTT", "ServerPort"), 60)
        self._mqclient.loop_start()

    def _on_connect(self, client, userdata, rc, msg):
        self._logger.info("Connected Alarmclock with result code %s" % rc)

    def _on_message(self, client, userdata, msg):
        self._logger.info("Mq Received on channel %s -> %s" % (msg.topic, msg.payload))

    def _on_disconnect(self, client, userdata, msg):
        self._logger.warn("Disconnect Alarmclock")

    def run(self):
        starttime, endtime = self._info.getNextWackeuptime()
        updated            = time.time()
        waking             = False
        music              = False

        while True:
            diff = (starttime - datetime.datetime.now(timezone('Europe/Berlin'))).total_seconds()

            #Switch on the light 15 min before event
            if 0 < diff < (60 * 15):
                lightlevel = int((1.0 - (diff / (60 * 15))) * 100)
                self._logger.info("switching or engreasing lightlevel to %d " % lightlevel)
                self._mqclient.publish("ansiroom/bedlight/sleep/sunrise", lightlevel)
                waking = True

            #5 Min before slowly turn on the music
            if 0 < diff < (60 * 5):
                if not music:
                    try:
                        self._logger.info("Switching on the music")
                        self._mqclient.publish("chromecast/Chromeansi/volume", 0.0)
                        self._mqclient.publish("chromecast/Chromeansi/playMusicURL", "http://inforadio.de/livemp3")
                        music = True
                    except Exception as e:
                        self._logger.error("Error in starting the music")
                        self._logger.error(e)
                        music = False
                volume = (1.0 - (diff / (60 * 5))) * 0.6
                try:
                    self._logger.info("Setting the volume to %d" % volume)
                    self._mqclient.publish("chromecast/Chromeansi/volume", volume)
                except Exception as e:
                    self._logger.error("Error in setting the volume")
                    self._logger.error(e)

            if diff < 0 and waking:
                self._logger.info("Switching light to max")
                self._mqclient.publish("ansiroom/bedlight/sleep/sunrise", 100)
                try:
                    self._logger.info("Switching volume to max");
                    self._mqclient.publish("chromecast/Chromeansi/volume", 0.7)
                except Exception as e:
                    self._logger.error("Error in setting max volume")
                    self._logger.error(e)
                waking = False
                music  = False
                self._logger.info("Wakeup done")
                self._redis.setex("ansiwakeup", 60 * 60 * 6, time.time())

            if (time.time() - updated) > (60 * 15):
                starttime, endtime = self._info.getNextWackeuptime()
                updated = time.time()
                self._logger.info("Updating the calendar")

            time.sleep(5)
コード例 #16
0
ファイル: Climate.py プロジェクト: AnsgarSchmidt/sensomatic
class Climate(threading.Thread):

    WEEKDAYS = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]

    def _readConfig(self):

        update = False

        if not os.path.isdir(self._homeDir):
            print "Creating homeDir"
            os.makedirs(self._homeDir)

        if os.path.isfile(self._configFileName):
            self._config.read(self._configFileName)
        else:
            print "Config file not found"
            update = True

        if not self._config.has_section('MQTT'):
            print "Adding MQTT part"
            update = True
            self._config.add_section("MQTT")

        if not self._config.has_option("MQTT", "ServerAddress"):
            print "No Server Address"
            update = True
            self._config.set("MQTT", "ServerAddress", "<ServerAddress>")

        if not self._config.has_option("MQTT", "ServerPort"):
            print "No Server Port"
            update = True
            self._config.set("MQTT", "ServerPort", "1883")

        if not self._config.has_section('REDIS'):
            print "Adding Redis part"
            update = True
            self._config.add_section("REDIS")

        if not self._config.has_option("REDIS", "ServerAddress"):
            print "No Server Address"
            update = True
            self._config.set("REDIS", "ServerAddress", "<ServerAddress>")

        if not self._config.has_option("REDIS", "ServerPort"):
            print "No Server Port"
            update = True
            self._config.set("REDIS", "ServerPort", "6379")

        if not self._config.has_section('CLIMA'):
            print "Adding Clima part"
            update = True
            self._config.add_section("CLIMA")

        if update:
            with open(self._configFileName, 'w') as f:
                self._config.write(f)

    def _checkSettings(self):
        if not os.path.isfile(self._humidityFileName):
            print "Copy new humidity file"
            copyfile("humidity.txt", self._humidityFileName)

        if not os.path.isfile(self._temperatureFileName):
            print "Copy new temperature file"
            copyfile("temperature.txt", self._temperatureFileName)

    def __init__(self):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self._homeDir                = os.path.expanduser("~/.sensomatic")
        self._configFileName         = self._homeDir + '/config.ini'
        self._humidityFileName       = self._homeDir + '/humidity.txt'
        self._temperatureFileName    = self._homeDir + '/temperature.txt'
        self._config                 = ConfigParser.ConfigParser()
        self._readConfig()
        self._checkSettings()
        self._info                   = InformationFetcher()
        self._mqclient               = mqtt.Client("Climate", clean_session=True)
        self._mqclient.connect(self._config.get("MQTT", "ServerAddress"), self._config.get("MQTT", "ServerPort"), 60)
        self._mqclient.on_connect    = self._on_connect
        self._mqclient.on_message    = self._on_message
        self._mqclient.on_disconnect = self._on_disconnect
        self._mqclient.loop(max_packets=100)

    def _on_connect(self, client, userdata, rc, msg):
        print "Connected Climate with result code %s" % rc

    def _on_message(self, client, userdata, msg):
        print "Mq Received on channel %s -> %s" % (msg.topic, msg.payload)

    def _on_disconnect(self, client, userdata, msg):
        print "Disconnect Climate"

    def getConfigHumidity(self, room):
        now = datetime.datetime.now()
        data = json.loads(open(self._humidityFileName).read())
        return int(data[room][Climate.WEEKDAYS[now.weekday()]][now.hour])

    def getShouldHumidity(self, room):
        if self._info.getRoomDefinedHumidity(room) is not None:
            return self._info.getRoomDefinedHumidity(room)
        else:
            return self.getConfigHumidity(room)

    def checkHumidity(self):
        for room in Room.ROOMS:
            hum = self._info.getRoomHumidity(room)
            if hum is not None:
                should = self.getShouldHumidity(room)
                print "Humiditycheck %s. Should be %d and is %2.2f" % (room, should, hum)
                if should > hum:
                    print "Humidify now"
                    self._mqclient.publish(room+"/humidifier", 10)

    def getConfigTemperature(self, room):
        now = datetime.datetime.now()
        data = json.loads(open(self._temperatureFileName).read())
        return int(data[room][Climate.WEEKDAYS[now.weekday()]][now.hour])

    def getShouldTemperature(self, room):
        if self._info.getRoomDefinedTemp(room) is not None:
            return self._info.getRoomDefinedTemp(room)
        else:
            return self.getConfigTemperature(room)

    def checkTemperature(self):
        for room in Room.ROOMS:
            temp = self._info.getRoomTemp(room)
            if temp is not None:
                should = self.getShouldTemperature(room)
                print "Temperaturecheck %s. Should be %d and is %2.2f" % (room, should, temp)

    def run(self):
        humwait     = 60
        tempwait    = 100
        humcounter  = humwait
        tempcounter = tempwait

        while True:

            humcounter  -= 1
            tempcounter -= 1

            if humcounter == 0:
                self.checkHumidity()
                humcounter = humwait

            if tempcounter == 0:
                self.checkTemperature()
                tempcounter = tempwait

            self._mqclient.loop()
            time.sleep(1)
コード例 #17
0
class TemplateMatcher():
    def __init__(self):
        self._env = Environment(
            loader=PackageLoader('Template', 'tts-templates'))
        self._informationFetcher = InformationFetcher()

    def getHourlyTime(self):
        template = self._env.get_template('time-hourly.txt')
        hour = datetime.datetime.now().time().hour
        _, _, temp, _, _, _, _ = self._informationFetcher.getOutdoor()
        return template.render(hour=hour, temp=temp)

    def getCurrentTime(self):
        template = self._env.get_template('time-current.txt')
        hour = datetime.datetime.now().time().hour
        minute = datetime.datetime.now().time().minute
        return template.render(hour=hour, minute=minute)

    def getAcknowledgeStartWashingMachine(self):
        template = self._env.get_template(
            'acknowledge-start-washing-machine.txt')
        return template.render()

    def getAcknowledgeEndWashingMachine(self):
        template = self._env.get_template(
            'acknowledge-end-washing-machine.txt')
        return template.render()

    def getAcknowledgeEmtyingWashingMachine(self):
        template = self._env.get_template(
            'acknowledge-empty-washing-machine.txt')
        return template.render()

    def getAcknowledgeStartShower(self, name):
        template = self._env.get_template('acknowledge-start-shower.txt')
        return template.render(name=name)

    def getAcknowledgeEndShower(self, name):
        template = self._env.get_template('acknowledge-end-shower.txt')
        return template.render(name=name)

    def getAcknowledgeStartBath(self, name):
        template = self._env.get_template('acknowledge-start-bath.txt')
        return template.render(name=name)

    def getAcknowledgeEndBath(self, name):
        template = self._env.get_template('acknowledge-end-bath.txt')
        return template.render(name=name)

    def getAcknowledgeDeactivateBath(self, name):
        template = self._env.get_template(
            'acknowledge-deactivate-everything.txt')
        return template.render(name=name)

    def getWateringTheFlower(self, level):
        template = self._env.get_template('watering-the-flower.txt')
        return template.render(level=level)

    def getWashingMachineReady(self, endtime):
        template = self._env.get_template('washingmachine-ready.txt')
        diff = time.time() - endtime
        hours = int(diff / (60.0 * 60.0))
        minutes = int((diff - (hours * 60.0 * 60.0)) / 60.0)
        return template.render(hours=hours, minutes=minutes)

    def getBathShowerUpdate(self):
        name = self._informationFetcher.getWhoIsInBathShower()
        showerbath = self._informationFetcher.getBathOrShower()
        minutes = self._informationFetcher.getTimeInBathShower()
        outtemp, _, _, condition, _, _, _ = self._informationFetcher.getOutdoor(
        )
        temp = self._informationFetcher.getRoomTemp(Room.BATH_ROOM)
        humidity = self._informationFetcher.getRoomHumidity(Room.BATH_ROOM)
        timehour = datetime.datetime.now().time().hour
        timemin = datetime.datetime.now().time().minute
        template = self._env.get_template('bath-shower-update.txt')
        return template.render(name=name,
                               showerbath=showerbath,
                               minutes=minutes,
                               outtemp=outtemp,
                               condition=condition,
                               temp=temp,
                               humidity=humidity,
                               timehour=timehour,
                               timemin=timemin)

    def getTimeToGoToBed(self):
        template = self._env.get_template('time-to-go-to-bed.txt')
        hour = datetime.datetime.now().time().hour + 1
        return template.render(hour=hour)

    def getWakeupText(self, name):
        template = self._env.get_template('wakeup.txt')
        name = name
        fraction, degrees, minutes, seconds = self._informationFetcher.getEarthRotationTime(
        )
        messages = self._informationFetcher.getNumEmailMessages()
        bathtemp = self._informationFetcher.getRoomTemp(Room.BATH_ROOM)
        bathhum = self._informationFetcher.getRoomHumidity(Room.BATH_ROOM)
        planettemp, planethum, planetfeels, conditions, winddir, windspeed, gust = self._informationFetcher.getOutdoor(
        )
        prediction = self._informationFetcher.getPrediction()
        astronauts = self._informationFetcher.getAstronauts()
        return template.render(name=name,
                               degrees=degrees,
                               minutes=minutes,
                               seconds=seconds,
                               messages=messages,
                               bathtemp=bathtemp,
                               bathhum=bathhum,
                               planettemp=planettemp,
                               planethum=planethum,
                               planetfeels=planetfeels,
                               conditions=conditions,
                               winddir=winddir,
                               windspeed=windspeed,
                               gust=gust,
                               prediction=prediction,
                               astronauts=astronauts)

    def getBathToMoisty(self):
        template = self._env.get_template('bath-still-to-moisty.txt')
        return template.render()

    def getWorfsTemperature(self, current, delta):
        template = self._env.get_template('worf-temperature.txt')
        return template.render(current=current, delta=delta)

    def getCo2ToHigh(self, room):
        template = self._env.get_template('co2-to-high.txt')
        return template.render(
            co2=self._informationFetcher.getRoomCo2Level(room))

    def getRadiationToHigh(self, value):
        template = self._env.get_template('radiation-to-high.txt')
        return template.render(value=value)

    def getRadiationHigherThenAverage(self, valuehere, valueavr):
        template = self._env.get_template('radiation-higher-then-average.txt')
        return template.render(valuehere=valuehere, valueavr=valueavr)

    def getParticulateMatterHigherThenAverage(self, p1, p2):
        template = self._env.get_template('particulate-matter-to-high.txt')
        return template.render(p1=p1, p2=p2)

    def getNewDynamicIP(self, name):
        template = self._env.get_template('new-dynamic-ip.txt')
        return template.render(name=name)

    def getWaterlevelLow(self):
        template = self._env.get_template('tank-waterlevel-low.txt')
        return template.render()

    def getWaterlevelNormal(self):
        template = self._env.get_template('tank-waterlevel-normal.txt')
        return template.render()

    def getWaterChangeOn(self):
        template = self._env.get_template('tank-waterchange-on.txt')
        return template.render()

    def getWaterChangeOff(self):
        template = self._env.get_template('tank-waterchange-off.txt')
        return template.render()

    def getWaterChangeTemp(self, temp):
        template = self._env.get_template('tank-waterchange-temp.txt')
        return template.render(temp=temp)

    def getBikeBatteryLevelWarn(self, level):
        template = self._env.get_template('bike-low-bat.txt')
        return template.render(level=level)

    def getBikeStart(self, hours):
        template = self._env.get_template('bike-start.txt')
        return template.render(hours=hours)

    def getBikeEnd(self, minutes, distance):
        template = self._env.get_template('bike-end.txt')
        return template.render(minutes=minutes, distance=distance)

    def getBikeStatus(self, current, distance):
        template = self._env.get_template('bike-status.txt')
        return template.render(current=current, distance=distance)
コード例 #18
0
ファイル: Tank.py プロジェクト: AnsgarSchmidt/sensomatic
class Tank(threading.Thread):

    DAWN = 0
    DAY = 1
    SUNSET = 2
    NIGHT = 3

    def _readConfig(self):

        if self._configMTime != os.stat(self._configFileName).st_mtime:

            print "Reread config file for tank"
            self._configMTime = os.stat(self._configFileName).st_mtime
            update = False
            stop = False

            if not os.path.isdir(self._homeDir):
                print "Creating homeDir"
                os.makedirs(self._homeDir)

            if os.path.isfile(self._configFileName):
                self._config.read(self._configFileName)
            else:
                print "Config file not found"
                update = True

            if not self._config.has_section('MQTT'):
                print "Adding MQTT part"
                update = True
                self._config.add_section("MQTT")

            if not self._config.has_option("MQTT", "ServerAddress"):
                print "No Server Address"
                update = True
                self._config.set("MQTT", "ServerAddress", "<ServerAddress>")

            if not self._config.has_option("MQTT", "ServerPort"):
                print "No Server Port"
                update = True
                self._config.set("MQTT", "ServerPort", "1883")

            if not self._config.has_section('TANK'):
                print "Adding Tank part"
                update = True
                self._config.add_section("TANK")

            if not self._config.has_option("TANK", "Location"):
                print "No Tank Virtual Location"
                update = True
                self._config.set("TANK", "Location", "Port Of Spain")

            if not self._config.has_option("TANK", "LocationOffset"):
                print "No Tank Virtual Location Offset"
                update = True
                self._config.set("TANK", "LocationOffset", "0")

            if not self._config.has_option("TANK", "NightTemp"):
                print "No Tank Night Temperature"
                update = True
                self._config.set("TANK", "NightTemp", "23")

            if not self._config.has_option("TANK", "DayTemp"):
                print "No Tank Day Temperature"
                update = True
                self._config.set("TANK", "DayTemp", "24")

            if not self._config.has_option("TANK", "FertilizerInterval"):
                print "No Tank FertilizerInterval"
                update = True
                self._config.set("TANK", "FertilizerInterval", "3600")

            if not self._config.has_option("TANK", "GraphInterval"):
                print "No Tank GraphInterval"
                update = True
                self._config.set("TANK", "GraphInterval", "9000")

            if update:
                with open(self._configFileName, 'w') as f:
                    self._config.write(f)

            if stop:
                print "Please check config file"
                sys.exit(0)

    def __init__(self):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self._homeDir = os.path.expanduser("~/.sensomatic")
        self._configFileName = self._homeDir + '/config.ini'
        self._configMTime = 0
        self._config = ConfigParser.ConfigParser()
        self._readConfig()
        self._template = TemplateMatcher()
        self._info = InformationFetcher()
        self._mqclient = mqtt.Client("Tank2", clean_session=True)
        self._daystate = Tank.NIGHT
        self._twitterdaystate = Tank.NIGHT
        self._lastfurtilizer = time.time()
        self._lastcharts = time.time()
        self._sunpercentage = 0
        self._moonpercentage = 0

    def _on_connect(self, client, userdata, rc, msg):
        print "Connected Tank with result code %s" % rc
        self._mqclient.subscribe("livingroom/tank/#")

    def _on_message(self, client, userdata, msg):
        #print "Mq Received on channel %s -> %s" % (msg.topic, msg.payload)
        pass

    def _on_disconnect(self, client, userdata, msg):
        print "Disconnect MQTTRulez"

    def updateSunAndMoon(self):
        now = datetime.datetime.now()
        dawn, sunrise, noon, sunset, dusk = self._info.getSunTimes(
            self._config.get("TANK", "Location"),
            int(self._config.get("TANK", "LocationOffset")))
        moonPhase = self._info.getMoonPhase(
            self._config.get("TANK", "Location"))
        moonElevation, _ = self._info.getMoonPosition()

        if (dawn < now < sunrise):
            duration = sunrise - dawn
            done = now - dawn
            self._daystate = Tank.DAWN
            self._sunpercentage = int(
                (done.total_seconds() / duration.total_seconds()) * 100)

        elif (sunrise < now < sunset):
            self._daystate = Tank.DAY
            self._sunpercentage = 100

        elif (sunset < now < dusk):
            duration = dusk - sunset
            done = now - sunset
            self._daystate = Tank.SUNSET
            self._sunpercentage = int(
                (1.0 -
                 (done.total_seconds() / duration.total_seconds())) * 100)

        else:
            self._daystate = Tank.NIGHT
            self._sunpercentage = 0

        # 0 = New moon, 7 = First quarter, 14 = Full moon, 21 = Last quarter
        moonphasepercentage = 0.0

        if (0 <= moonPhase <= 14):
            moonphasepercentage = 1.0 - ((14.0 - (moonPhase)) / 14.0)
        else:
            moonphasepercentage = ((14.0 - (moonPhase - 14.0)) / 14.0)

        if moonElevation > 0:
            self._moonpercentage = int(moonphasepercentage *
                                       (moonElevation / 90.0) * 100)
        else:
            self._moonpercentage = 0

    def publishMQTT(self):
        self._mqclient.publish("livingroom/tank/whitelight",
                               self._sunpercentage)
        self._mqclient.publish("livingroom/tank/bluelight",
                               self._moonpercentage)

        if self._daystate in (Tank.DAWN, Tank.DAY, Tank.SUNSET):
            self._mqclient.publish("livingroom/tank/settemp",
                                   self._config.get("TANK", "DayTemp"))
        else:
            self._mqclient.publish("livingroom/tank/settemp",
                                   self._config.get("TANK", "NightTemp"))

    def publishTwitter(self):
        if self._twitterdaystate is not self._daystate:
            if self._daystate == Tank.DAWN:
                self._mqclient.publish(
                    "twitter/text",
                    "Switching light scene to dawn and rise the light level. #Fishtank Yellow #cheerlights"
                )
            if self._daystate == Tank.DAY:
                self._mqclient.publish(
                    "twitter/text",
                    "Switching light scene to day. #Fishtank Warmwhite #cheerlights"
                )
            if self._daystate == Tank.SUNSET:
                self._mqclient.publish(
                    "twitter/text",
                    "Switching light scene to sunset and lover the light level. #Fishtank Orange #cheerlights"
                )
            if self._daystate == Tank.NIGHT:
                self._mqclient.publish(
                    "twitter/text",
                    "Switching light scene to night. #Fishtank Black #cheerlights"
                )
            self._twitterdaystate = self._daystate

    def publishFertilizer(self):
        now = time.time()
        if self._daystate == Tank.DAY:
            if (now - self._lastfurtilizer) > int(
                    self._config.get("TANK", "FertilizerInterval")):
                self._mqclient.publish("livingroom/tank/fertilizer", 1)
                self._mqclient.publish(
                    "twitter/text",
                    "Adding some material of natural or synthetic origin (other than liming materials). #Fishtank #Fertilizer"
                )
                self._lastfurtilizer = now

    def publishCharts(self):
        now = time.time()
        if (now - self._lastcharts) > int(
                self._config.get("TANK", "GraphInterval")):
            try:
                j = json.loads(
                    requests.get(
                        "https://uss-horizon.mybluemix.net/api/twitter/getHeaterID"
                    ).content)
                self._mqclient.publish(
                    "twitter/uploaded/" + j[0]['media_id_string'],
                    "Water temperature, air temperature, heater active, water level and adding water. #IoT #Fishtank #watson #analytics"
                )
                self._mqclient.publish(
                    "twitter/uploaded/" + j[1]['media_id_string'],
                    "Heater activity percentage, air temperature and humidity. #IoT #Fishtank #watson #analytics"
                )
                self._mqclient.publish(
                    "twitter/uploaded/" + j[2]['media_id_string'],
                    "Sun and moon intensity for the fishtank. #IoT #fishtank #watson #analytics"
                )
            except:
                print "Error in publishing charts"
            self._lastcharts = now

    def run(self):
        self._mqclient.connect(self._config.get("MQTT", "ServerAddress"),
                               self._config.get("MQTT", "ServerPort"), 60)
        self._mqclient.on_connect = self._on_connect
        self._mqclient.on_message = self._on_message
        self._mqclient.on_disconnect = self._on_disconnect
        self._mqclient.loop_start()

        while True:
            self._readConfig()
            self.updateSunAndMoon()
            self.publishMQTT()
            self.publishTwitter()
            self.publishFertilizer()
            self.publishCharts()
            time.sleep(15)
コード例 #19
0
class RoomController(threading.Thread):
    def __init__(self):
        self._info = InformationFetcher()
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self._homeDir = os.path.expanduser("~/.sensomatic")
        self._configFileName = self._homeDir + '/config.ini'
        self._config = ConfigParser.ConfigParser()
        self._readConfig()
        self._mqclient = mqtt.Client("RoomController", clean_session=True)
        self._redis = redis.StrictRedis(
            host=self._config.get("REDIS", "ServerAddress"),
            port=self._config.get("REDIS", "ServerPort"),
            db=0)
        self._lastWorkingLight = [0, 0, 0]
        self._lastBedLight = [0, 0, 0]
        self._SoundActive = False
        self._FastCheck = False

    def _on_connect(self, client, userdata, rc, msg):
        print "Connected Room Controller with result code %s" % rc
        #self._mqclient.subscribe("#")

    def _on_message(self, client, userdata, msg):
        print "Mq Received on channel %s -> %s" % (msg.topic, msg.payload)

    def _on_disconnect(self, client, userdata, msg):
        print "Disconnect Room Controller"

    def run(self):
        self._mqclient.connect(self._config.get("MQTT", "ServerAddress"),
                               self._config.get("MQTT", "ServerPort"), 60)
        self._mqclient.on_connect = self._on_connect
        self._mqclient.on_message = self._on_message
        self._mqclient.on_disconnect = self._on_disconnect
        self._mqclient.loop_start()
        time.sleep(1)

        while True:
            self._FastCheck = True
            self.ansiRoom()

            if self._FastCheck:
                time.sleep(1)
            else:
                time.sleep(30)

    def _readConfig(self):
        update = False

        if not os.path.isdir(self._homeDir):
            print "Creating homeDir"
            os.makedirs(self._homeDir)

        if os.path.isfile(self._configFileName):
            self._config.read(self._configFileName)
        else:
            print "Config file not found"
            update = True

        if not self._config.has_section('MQTT'):
            print "Adding MQTT part"
            update = True
            self._config.add_section("MQTT")

        if not self._config.has_option("MQTT", "ServerAddress"):
            print "No Server Address"
            update = True
            self._config.set("MQTT", "ServerAddress", "<ServerAddress>")

        if not self._config.has_option("MQTT", "ServerPort"):
            print "No Server Port"
            update = True
            self._config.set("MQTT", "ServerPort", "1883")

        if not self._config.has_section('REDIS'):
            print "Adding Redis part"
            update = True
            self._config.add_section("REDIS")

        if not self._config.has_option("REDIS", "ServerAddress"):
            print "No Server Address"
            update = True
            self._config.set("REDIS", "ServerAddress", "<ServerAddress>")

        if not self._config.has_option("REDIS", "ServerPort"):
            print "No Server Port"
            update = True
            self._config.set("REDIS", "ServerPort", "6379")

        if not self._config.has_section('SLEEP'):
            print "Adding SLEEP part"
            update = True
            self._config.add_section("SLEEP")

        if not self._config.has_option("SLEEP", "YoutubeID"):
            print "No YoutubeID Address"
            update = True
            self._config.set("SLEEP", "YoutubeID", "0fYL_qiDYf0")

        if not self._config.has_option("SLEEP", "DurationInMinutes"):
            print "No DurationInMinutes"
            update = True
            self._config.set("SLEEP", "DurationInMinutes", 60)

        if not self._config.has_option("SLEEP", "Volume"):
            print "No Volume"
            update = True
            self._config.set("SLEEP", "Volume", 1.0)

        if update:
            with open(self._configFileName, 'w') as f:
                self._config.write(f)

    def fill(self, size, val):
        values = ""
        for i in range(size):
            values += ",%d,%d,%d" % (val[0], val[1], val[2])
        return values[1:]

    def fillgradient(self, len):
        values = ""
        for i in range(len):
            values += ",%d,%d,%d" % (0, 0, 0)
        return values[1:]

    def setWorkingLight(self, val):
        if self._lastWorkingLight[0] != val[0] or self._lastWorkingLight[
                1] != val[1] or self._lastWorkingLight[2] != val[2]:
            print "Update Workinglight"
            self._mqclient.publish("ansiroom/bedlight/overhead/colour",
                                   self.fill(20, [val[0], val[1], val[2]]))
            self._mqclient.publish("ansiroom/bedlight/center/colour",
                                   self.fill(20, [val[0], val[1], val[2]]))
            self._mqclient.publish("ansiroom/bedlight/left/colour",
                                   self.fill(7, [val[0], val[1], val[2]]))
            self._mqclient.publish("ansiroom/bedlight/right/colour",
                                   self.fill(14, [val[0], val[1], val[2]]))
            self._lastWorkingLight = val

    def setBedLight(self, val):
        if self._lastBedLight[0] != val[0] or self._lastBedLight[1] != val[
                1] or self._lastBedLight[2] != val[2]:
            self._mqclient.publish("ansiroom/bedlight/sleep/colour",
                                   self.fill(1, [val[0], val[1], val[2]]))
            self._lastBedLight = val

    def ansiRoom(self):

        if self._redis.exists("AnsiRoomFallingAsleep"):

            self._FastCheck = False

            diff = (time.time() -
                    float(self._redis.get("AnsiRoomFallingAsleep")))
            max = 60.0 * int(self._config.get("SLEEP", "DurationInMinutes"))

            # Take care of sound
            if not self._SoundActive:
                self._mqclient.publish("chromecast/Chromeansi/playYoutube",
                                       self._config.get("SLEEP", "YoutubeID"))
                self._mqclient.publish("chromecast/Chromeansi/volume",
                                       self._config.get("SLEEP", "Volume"))
                self._SoundActive = True

            if diff <= max:
                percentage = 1.0 - (diff / max)
                light = int(percentage * 255.0)

                if self._lastBedLight[0] != light:
                    self._mqclient.publish("ansiroom/bedlight/sleep/fire",
                                           light)
                    self._lastBedLight[0] = light

                val = [light, 0, 0]

                if self._lastWorkingLight[0] != val[
                        0] or self._lastWorkingLight[1] != val[
                            1] or self._lastWorkingLight[2] != val[2]:
                    self._mqclient.publish(
                        "ansiroom/bedlight/overhead/colour",
                        self.fill(20, [val[0], val[1], val[2]]))
                    self._mqclient.publish(
                        "ansiroom/bedlight/center/colour",
                        self.fill(20, [val[0], val[1], val[2]]))
                    self._mqclient.publish(
                        "ansiroom/bedlight/left/colour",
                        self.fill(18, [val[0], val[1], val[2]]))
                    self._mqclient.publish(
                        "ansiroom/bedlight/right/colour",
                        self.fill(18, [val[0], val[1], val[2]]))
                    self._lastWorkingLight = val

                self._mqclient.publish(
                    "chromecast/Chromeansi/volume",
                    percentage * float(self._config.get("SLEEP", "Volume")))

            # end sequence
            if diff > max:
                print "END Falling Asleep Function"
                self._redis.delete("AnsiRoomFallingAsleep")
                self._mqclient.publish("ansiroom/bedlight/sleep/fire", 0)
                self._mqclient.publish("chromecast/Chromeansi/stop", 0)
                self._SoundActive = False

        elif self._redis.exists("AnsiRoomReading"):

            self._FastCheck = False
            self.setBedLight([150, 150, 10])
            val = [255, 0, 0]

            if self._lastWorkingLight[0] != val[0] or self._lastWorkingLight[
                    1] != val[1] or self._lastWorkingLight[2] != val[2]:
                self._mqclient.publish("ansiroom/bedlight/overhead/colour",
                                       self.fill(20, [val[0], val[1], val[2]]))
                self._mqclient.publish("ansiroom/bedlight/center/colour",
                                       self.fill(20, [val[0], val[1], val[2]]))
                self._mqclient.publish("ansiroom/bedlight/left/colour",
                                       self.fill(18, [val[0], val[1], val[2]]))
                self._mqclient.publish("ansiroom/bedlight/right/colour",
                                       self.fill(18, [val[0], val[1], val[2]]))
                self._lastWorkingLight = val

        elif self._info.isSomeoneInTheRoom(Room.ANSI_ROOM):

            self._FastCheck = False
            self.setBedLight([0, 0, 0])
            lightlevel = self._info.getOutsideLightLevel()

            if lightlevel < 29.999:
                now = datetime.datetime.now()
                blue = 1.0
                r = 255
                g = 255
                b = 255

                if now.hour in (21, 22, 23):
                    m = now.hour - 21
                    m *= 60
                    m += now.minute
                    max = 3.0 * 60.0
                    blue = float(m) / max
                    blue = 1.0 - blue

                if now.hour in (0, 1, 2, 3, 4, 5):
                    blue = 0.0

                if lightlevel > 0:
                    d = (30.0 - lightlevel) / 30.0
                    r *= d
                    g *= d
                    b *= d

                b *= blue
                self.setWorkingLight([int(r), int(g), int(b)])
            else:
                self.setWorkingLight([0, 0, 0])
        else:
            self.setWorkingLight([0, 0, 0])
            self.setBedLight([0, 0, 0])
コード例 #20
0
class AlarmClock(threading.Thread):
    def _readConfig(self):
        update = False

        if not os.path.isdir(self._homeDir):
            print "Creating homeDir"
            os.makedirs(self._homeDir)

        if os.path.isfile(self._configFileName):
            self._config.read(self._configFileName)
        else:
            print "Config file not found"
            update = True

        if not self._config.has_section('REDIS'):
            print "Adding Redis part"
            update = True
            self._config.add_section("REDIS")

        if not self._config.has_option("REDIS", "ServerAddress"):
            print "No Server Address"
            update = True
            self._config.set("REDIS", "ServerAddress", "<ServerAddress>")

        if not self._config.has_option("REDIS", "ServerPort"):
            print "No Server Port"
            update = True
            self._config.set("REDIS", "ServerPort", "6379")

        if not self._config.has_section('MQTT'):
            print "Adding MQTT part"
            update = True
            self._config.add_section("MQTT")

        if not self._config.has_option("MQTT", "ServerAddress"):
            print "No Server Address"
            update = True
            self._config.set("MQTT", "ServerAddress", "<ServerAddress>")

        if not self._config.has_option("MQTT", "ServerPort"):
            print "No Server Port"
            update = True
            self._config.set("MQTT", "ServerPort", "1883")

        if update:
            with open(self._configFileName, 'w') as f:
                self._config.write(f)
                sys.exit(1)

    def __init__(self):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self._logger = logging.getLogger(__name__)
        hdlr = logging.FileHandler('/tmp/sensomatic.log')
        formatter = logging.Formatter(
            '%(asctime)s %(name)s %(lineno)d %(levelname)s %(message)s')
        hdlr.setFormatter(formatter)
        self._logger.addHandler(hdlr)
        self._logger.setLevel(logging.INFO)
        self._info = InformationFetcher()
        self._homeDir = os.path.expanduser("~/.sensomatic")
        self._configFileName = self._homeDir + '/config.ini'
        self._config = ConfigParser.ConfigParser()
        self._readConfig()
        self._redis = redis.StrictRedis(
            host=self._config.get("REDIS", "ServerAddress"),
            port=self._config.get("REDIS", "ServerPort"),
            db=0)
        self._mqclient = mqtt.Client("AlarmClock", clean_session=True)
        self._mqclient.on_connect = self._on_connect
        self._mqclient.on_message = self._on_message
        self._mqclient.on_disconnect = self._on_disconnect
        self._mqclient.connect(self._config.get("MQTT", "ServerAddress"),
                               self._config.get("MQTT", "ServerPort"), 60)
        self._mqclient.loop_start()

    def _on_connect(self, client, userdata, rc, msg):
        self._logger.info("Connected Alarmclock with result code %s" % rc)

    def _on_message(self, client, userdata, msg):
        self._logger.info("Mq Received on channel %s -> %s" %
                          (msg.topic, msg.payload))

    def _on_disconnect(self, client, userdata, msg):
        self._logger.warn("Disconnect Alarmclock")

    def run(self):
        starttime, endtime = self._info.getNextWackeuptime()
        updated = time.time()
        waking = False
        music = False

        while True:
            diff = (starttime - datetime.datetime.now(
                timezone('Europe/Berlin'))).total_seconds()

            #Switch on the light 15 min before event
            if 0 < diff < (60 * 15):
                lightlevel = int((1.0 - (diff / (60 * 15))) * 100)
                self._logger.info("switching or engreasing lightlevel to %d " %
                                  lightlevel)
                self._mqclient.publish("ansiroom/bedlight/sleep/sunrise",
                                       lightlevel)
                waking = True

            #5 Min before slowly turn on the music
            if 0 < diff < (60 * 5):
                if not music:
                    try:
                        self._logger.info("Switching on the music")
                        self._mqclient.publish("chromecast/Chromeansi/volume",
                                               0.0)
                        self._mqclient.publish(
                            "chromecast/Chromeansi/playMusicURL",
                            "http://inforadio.de/livemp3")
                        music = True
                    except Exception as e:
                        self._logger.error("Error in starting the music")
                        self._logger.error(e)
                        music = False
                volume = (1.0 - (diff / (60 * 5))) * 0.6
                try:
                    self._logger.info("Setting the volume to %d" % volume)
                    self._mqclient.publish("chromecast/Chromeansi/volume",
                                           volume)
                except Exception as e:
                    self._logger.error("Error in setting the volume")
                    self._logger.error(e)

            if diff < 0 and waking:
                self._logger.info("Switching light to max")
                self._mqclient.publish("ansiroom/bedlight/sleep/sunrise", 100)
                try:
                    self._logger.info("Switching volume to max")
                    self._mqclient.publish("chromecast/Chromeansi/volume", 0.7)
                except Exception as e:
                    self._logger.error("Error in setting max volume")
                    self._logger.error(e)
                waking = False
                music = False
                self._logger.info("Wakeup done")
                self._redis.setex("ansiwakeup", 60 * 60 * 6, time.time())

            if (time.time() - updated) > (60 * 15):
                starttime, endtime = self._info.getNextWackeuptime()
                updated = time.time()
                self._logger.info("Updating the calendar")

            time.sleep(5)
コード例 #21
0
class RoomController(threading.Thread):

    def __init__(self):
        self._info = InformationFetcher()
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self._homeDir          = os.path.expanduser("~/.sensomatic")
        self._configFileName   = self._homeDir + '/config.ini'
        self._config           = ConfigParser.ConfigParser()
        self._readConfig()
        self._mqclient         = mqtt.Client("RoomController", clean_session=True)
        self._redis            = redis.StrictRedis(host=self._config.get("REDIS", "ServerAddress"),
                                                   port=self._config.get("REDIS", "ServerPort"), db=0)
        self._lastWorkingLight = [0, 0, 0]
        self._lastBedLight     = [0, 0, 0]
        self._SoundActive      = False
        self._FastCheck        = False

    def _on_connect(self, client, userdata, rc, msg):
        print "Connected Room Controller with result code %s" % rc
        #self._mqclient.subscribe("#")

    def _on_message(self, client, userdata, msg):
        print "Mq Received on channel %s -> %s" % (msg.topic, msg.payload)

    def _on_disconnect(self, client, userdata, msg):
        print "Disconnect Room Controller"

    def run(self):
        self._mqclient.connect(self._config.get("MQTT", "ServerAddress"), self._config.get("MQTT", "ServerPort"), 60)
        self._mqclient.on_connect    = self._on_connect
        self._mqclient.on_message    = self._on_message
        self._mqclient.on_disconnect = self._on_disconnect
        self._mqclient.loop_start()
        time.sleep(1)

        while True:
            self._FastCheck = True
            self.ansiRoom()

            if self._FastCheck:
                time.sleep(1)
            else:
                time.sleep(30)

    def _readConfig(self):
        update = False

        if not os.path.isdir(self._homeDir):
            print "Creating homeDir"
            os.makedirs(self._homeDir)

        if os.path.isfile(self._configFileName):
            self._config.read(self._configFileName)
        else:
            print "Config file not found"
            update = True

        if not self._config.has_section('MQTT'):
            print "Adding MQTT part"
            update = True
            self._config.add_section("MQTT")

        if not self._config.has_option("MQTT", "ServerAddress"):
            print "No Server Address"
            update = True
            self._config.set("MQTT", "ServerAddress", "<ServerAddress>")

        if not self._config.has_option("MQTT", "ServerPort"):
            print "No Server Port"
            update = True
            self._config.set("MQTT", "ServerPort", "1883")

        if not self._config.has_section('REDIS'):
            print "Adding Redis part"
            update = True
            self._config.add_section("REDIS")

        if not self._config.has_option("REDIS", "ServerAddress"):
            print "No Server Address"
            update = True
            self._config.set("REDIS", "ServerAddress", "<ServerAddress>")

        if not self._config.has_option("REDIS", "ServerPort"):
            print "No Server Port"
            update = True
            self._config.set("REDIS", "ServerPort", "6379")

        if not self._config.has_section('SLEEP'):
            print "Adding SLEEP part"
            update = True
            self._config.add_section("SLEEP")

        if not self._config.has_option("SLEEP", "YoutubeID"):
            print "No YoutubeID Address"
            update = True
            self._config.set("SLEEP", "YoutubeID", "0fYL_qiDYf0")

        if not self._config.has_option("SLEEP", "DurationInMinutes"):
            print "No DurationInMinutes"
            update = True
            self._config.set("SLEEP", "DurationInMinutes", 60)

        if not self._config.has_option("SLEEP", "Volume"):
            print "No Volume"
            update = True
            self._config.set("SLEEP", "Volume", 1.0)

        if update:
            with open(self._configFileName, 'w') as f:
                self._config.write(f)

    def fill(self, size, val):
        values = ""
        for i in range(size):
            values += ",%d,%d,%d" % (val[0],val[1],val[2])
        return values[1:]

    def fillgradient(self, len):
        values = ""
        for i in range(len):
            values += ",%d,%d,%d" % (0,0,0)
        return values[1:]

    def setWorkingLight(self, val):
        if self._lastWorkingLight[0] != val[0] or self._lastWorkingLight[1] != val[1] or self._lastWorkingLight[2] != val[2]:
            print "Update Workinglight"
            self._mqclient.publish("ansiroom/bedlight/overhead/colour", self.fill(20, [val[0], val[1], val[2]]))
            self._mqclient.publish("ansiroom/bedlight/center/colour",   self.fill(20, [val[0], val[1], val[2]]))
            self._mqclient.publish("ansiroom/bedlight/left/colour",     self.fill(7,  [val[0], val[1], val[2]]))
            self._mqclient.publish("ansiroom/bedlight/right/colour",    self.fill(14, [val[0], val[1], val[2]]))
            self._lastWorkingLight = val

    def setBedLight(self, val):
        if self._lastBedLight[0] != val[0] or self._lastBedLight[1] != val[1] or self._lastBedLight[2] != val[2]:
            self._mqclient.publish("ansiroom/bedlight/sleep/colour",    self.fill(1,  [val[0], val[1], val[2]]))
            self._lastBedLight = val

    def ansiRoom(self):

        if self._redis.exists("AnsiRoomFallingAsleep"):

            self._FastCheck = False

            diff = (time.time() - float(self._redis.get("AnsiRoomFallingAsleep")))
            max  = 60.0 * int(self._config.get("SLEEP", "DurationInMinutes"))

            # Take care of sound
            if not self._SoundActive:
                self._mqclient.publish("chromecast/Chromeansi/playYoutube", self._config.get("SLEEP", "YoutubeID"))
                self._mqclient.publish("chromecast/Chromeansi/volume", self._config.get("SLEEP", "Volume"))
                self._SoundActive = True

            if diff <= max:
                percentage = 1.0 - (diff / max)
                light = int(percentage * 255.0)

                if self._lastBedLight[0] != light:
                    self._mqclient.publish("ansiroom/bedlight/sleep/fire", light)
                    self._lastBedLight[0] = light

                val = [light, 0, 0]

                if self._lastWorkingLight[0] != val[0] or self._lastWorkingLight[1] != val[1] or self._lastWorkingLight[2] != val[2]:
                    self._mqclient.publish("ansiroom/bedlight/overhead/colour", self.fill(20, [val[0], val[1], val[2]]))
                    self._mqclient.publish("ansiroom/bedlight/center/colour",   self.fill(20, [val[0], val[1], val[2]]))
                    self._mqclient.publish("ansiroom/bedlight/left/colour",     self.fill(18, [val[0], val[1], val[2]]))
                    self._mqclient.publish("ansiroom/bedlight/right/colour",    self.fill(18, [val[0], val[1], val[2]]))
                    self._lastWorkingLight = val

                self._mqclient.publish("chromecast/Chromeansi/volume", percentage * float(self._config.get("SLEEP", "Volume")))

            # end sequence
            if diff > max:
                print "END Falling Asleep Function"
                self._redis.delete("AnsiRoomFallingAsleep")
                self._mqclient.publish("ansiroom/bedlight/sleep/fire", 0)
                self._mqclient.publish("chromecast/Chromeansi/stop", 0)
                self._SoundActive = False

        elif self._redis.exists("AnsiRoomReading"):

            self._FastCheck = False
            self.setBedLight([150, 150, 10])
            val = [255, 0, 0]

            if self._lastWorkingLight[0] != val[0] or self._lastWorkingLight[1] != val[1] or self._lastWorkingLight[2] != val[2]:
                self._mqclient.publish("ansiroom/bedlight/overhead/colour", self.fill(20, [val[0], val[1], val[2]]))
                self._mqclient.publish("ansiroom/bedlight/center/colour",   self.fill(20, [val[0], val[1], val[2]]))
                self._mqclient.publish("ansiroom/bedlight/left/colour",     self.fill(18, [val[0], val[1], val[2]]))
                self._mqclient.publish("ansiroom/bedlight/right/colour",    self.fill(18, [val[0], val[1], val[2]]))
                self._lastWorkingLight = val

        elif self._info.isSomeoneInTheRoom(Room.ANSI_ROOM):

            self._FastCheck = False
            self.setBedLight([0, 0, 0])
            lightlevel = self._info.getOutsideLightLevel()

            if lightlevel < 29.999:
                now  = datetime.datetime.now()
                blue = 1.0
                r    = 255
                g    = 255
                b    = 255

                if now.hour in (21, 22, 23):
                    m  = now.hour - 21
                    m *= 60
                    m += now.minute
                    max = 3.0 * 60.0
                    blue = float(m) / max
                    blue = 1.0 - blue

                if now.hour in (0, 1, 2, 3, 4, 5):
                    blue = 0.0

                if lightlevel > 0:
                    d = (30.0 - lightlevel) / 30.0
                    r *= d
                    g *= d
                    b *= d

                b *= blue
                self.setWorkingLight([int(r), int(g), int(b)])
            else:
                self.setWorkingLight([0, 0, 0])
        else:
            self.setWorkingLight([0, 0, 0])
            self.setBedLight([0, 0, 0])
コード例 #22
0
 def __init__(self):
     self._env = Environment(
         loader=PackageLoader('Template', 'tts-templates'))
     self._informationFetcher = InformationFetcher()