Пример #1
0
def index():
    """
        rootページの表示.
    """
    twitter_login = False
    twitter_id = ''
    user_icon = ''
    kiun_names = None
    kiun_values = None

    # Twitter認証済みチェック.
    if twitter_is_auth():
        # 認証済.
        api = twitter_get_api()
        twitter_login = True
        twitter_user = api.me()
        twitter_id = twitter_user.screen_name
        user_icon = twitter_user.profile_image_url_https

        sql = Sql()
        sql.connect()
        param = sql.get_user_parameter(twitter_user.id)
        sql.close()

        kiun_names = param['kiun_names']
        kiun_values = param['kiun_values']

    # templates/index.html を使ってレンダリング.
    return render_template('index.html',
                           twitter_login=twitter_login,
                           twitter_id=twitter_id,
                           user_icon=user_icon,
                           kiun_names=kiun_names,
                           kiun_values=kiun_values)
Пример #2
0
def settings_apply():
    """
        機運設定適用.
    """

    # POSTデータ取得.
    data = request.form.to_dict(flat=False)
    logger.debug(data['kiun_names'])

    # 設定更新.
    api = twitter_get_api()
    user = api.me()

    sql = Sql()
    sql.connect()
    param = sql.get_user_parameter(user.id)

    for i, name in enumerate(data['kiun_names']):
        # 機運名が変更された項目は機運ゲージを0にする.
        if name != param['kiun_names'][i]:
            param['kiun_values'][i] = 0

    sql.update_user_parameter(user.id, data['kiun_names'],
                              param['kiun_values'])
    sql.close()

    # rootページへ戻る.
    return redirect(configuration.ROOT_URL)
Пример #3
0
def initialize_user_parameter(twitter_user_id):
    """
        ユーザーの設定情報を初期化.
    """
    kiun_names = define.KIUN_DEFAULT_NAME
    kiun_values = [0, 0, 0, 0, 0]

    sql = Sql()
    sql.connect()
    sql.register_user_parameter(twitter_user_id, kiun_names, kiun_values)
    sql.close()
Пример #4
0
def kiun_update():
    """
        機運更新.
    """
    print 'kiun_update test!' + request.method

    if request.method == 'POST':

        data = request.form.to_dict(flat=False)
        values = [int(s) for s in data['values']]  # 機運値の文字列リストを数値に変換.

        api = twitter_get_api()
        user = api.me()

        sql = Sql()
        sql.connect()
        param = sql.get_user_parameter(user.id)

        # 機運値をツイート.
        tweet_kiun_gauge(api, param['kiun_names'], values)

        # 機運がMAXになった項目をチェック.
        kiun_max_names = []
        kiun_max_values_index = []
        for i, val in enumerate(values):
            if val == 10:
                kiun_max_names.append(param['kiun_names'][i])
                kiun_max_values_index.append(i)

        # 機運がMAXになった際のツイート.
        if len(kiun_max_names) >= 1:
            tweet_kiun_max(api, kiun_max_names)

        # 0に戻す.
        if len(kiun_max_values_index) >= 1:
            for max_i in kiun_max_values_index:
                values[max_i] = 0

        # 機運値をデータベースに更新.
        sql.update_user_parameter(user.id, param['kiun_names'], values)

        sql.close()

    # templates/kiun_update.html を使ってレンダリング.
    return render_template('kiun_update.html', kiun_max_names=kiun_max_names)
Пример #5
0
def settings():
    """
        機運設定.
    """

    # 機運名一覧取得.
    api = twitter_get_api()
    user = api.me()

    sql = Sql()
    sql.connect()
    param = sql.get_user_parameter(user.id)
    sql.close()

    kiun_names = param['kiun_names']

    # templates/settings.html を使ってレンダリング.
    return render_template('settings.html', kiun_names=kiun_names)
Пример #6
0
class KhaloClient:
    def __init__(self):
        self.log = get_logger()
        self.start()

    def start(self):
        self.log.debug("Starting loop")
        #        count = -1
        #        while count < 3:
        while True:
            #count +=1
            sleep_for = sleep_time()
            self.log.debug(f"Sleeping for {sleep_for} minutes")
            sleep(sleep_for * 60)
            #sleep(60)
            self.log_temps()
            self.check_relays()

        GPIO.cleanup()

    def log_temps(self):
        """
        Method is used to log the temperatures to the database, no other actions happen here.
        """
        try:
            self.log.debug("Attempting to get DB connection")
            self.sql = Sql()
        except Exception as e:
            self.log.error(e, exc_info=True)
            return

        self.log.debug("DB connection acquired")
        # Get all sensors from db
        sensors_list = self.sql.get_sensors()
        for sensor in sensors_list:
            # Get sensor object
            s = TemperatureSensor(*sensor)
            # Read the sensor
            humidity, temperature = ada.read_retry(s.sensor_type, s.gpio)
            s.humidity = humidity
            s.temperature = (temperature * 1.8 + 32)
            if s.humidity:
                s.device_online = True
            # Commit the data
            self.sql.set_reading(s)
        # Close connection to the database
        self.sql.close()

    def check_relays(self):
        try:
            self.log.debug("Attempting to get DB connection for relays")
            self.sql = Sql()
        except Exception as e:
            self.log.error(e, exc_info=True)
            return
        self.log.debug("DB connection acquired")
        try:
            daytime = DaytimeCycle(*self.sql.get_daytime())
        except Exception as e:
            self.log.error(e, exc_info=True)
            return

        # We have to check for temps and then for day and night
        try:
            relays = self.sql.get_relays()
        except Exception as e:
            self.log.error(e, exc_info=True)

        for relay in relays:
            r = Relay(*relay)
            if r.control == 'light':
                self.log.debug(f"Testing {r}")
                r = self.set_state(r, daytime)
                self.set_gpio(r)

    def set_gpio(self, relay):
        """
        Method uses the GPIO module to activate a GPIO
        """
        self.log.debug("Setting GPIO for usage")
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(relay.gpio, GPIO.OUT)
        self.log.debug("Checking if GPIO needs to be changed")

        # Check if the GPIO does not match our state

        if GPIO.input(relay.gpio) == relay.relay_state:
            self.log.info(
                "GPIO does not need to be changed, cleaning then exiting function"
            )
            #GPIO.cleanup()
            return

        # If the GPIO is different, then action it
        self.log.info(f"Changing {relay} state to {relay.relay_state}")
        GPIO.output(relay.gpio, relay.relay_state)
        #GPIO.cleanup()
        return

    def set_state(self, relay, daytime):
        """
        This method is used to set the relay_state. The relay_state will be used to action the 
        relay
        """
        state = relay.relay_state
        if daytime.daytime:
            if relay.daytime:
                relay.relay_state = True
                self.log.info(f'Set {relay} to True')
            else:
                relay.relay_state = False
                self.log.info(f'Set {relay} to False')
        else:
            if relay.daytime:
                relay.relay_state = False
                self.log.info(f'Set {relay} to False')
            else:
                relay.relay_state = True
                self.log.info(f'Set {relay} to True')

        if state != relay.relay_state:
            self.sql.set_relay_state(relay)

        return relay
Пример #7
0
class pushMes(object):
    """docstring for pushMes"""
    def __init__(self, dbName, dbPassword, tableName, coinbasePassword,
                 contractAddress, contractAbi):
        super(pushMes, self).__init__()
        self.sql = Sql("localhost", 3306, 'root', dbPassword, dbName)
        self.tableNeedRead = tableName
        self.databaseName = dbName
        self.geth = Ethereum(coinbasePassword, contractAddress, contractAbi)
        # self.dataLength=
    def getData(self):
        self.sql.connect()
        command = 'select * from %s' % self.tableNeedRead
        result = self.sql.extractSql(command)
        self.sql.close()
        datas = []
        keys = []
        keyJson = json.loads(self.getKeys())
        # 获取字段
        for item in keyJson:
            keys.append(keyJson.get(item))
        #处理数据
        for i, item in enumerate(result):
            data = {}
            for i, perValue in enumerate(item):
                data[keys[i]] = perValue
            # data[i]=
            datas.append(json.dumps(data, ensure_ascii=False))

        return datas

    def getKeys(self):
        self.sql.connect()
        command = "select COLUMN_NAME from information_schema.COLUMNS where table_name = '%s' and table_schema = '%s'" % (
            self.tableNeedRead, self.databaseName)
        result = self.sql.extractSql(command)
        self.sql.close()
        keys = {}
        for i, item in enumerate(result):
            keys[i] = item[0]
        # print(keys)
        return json.dumps(keys, ensure_ascii=False)

    def waitMined(self, index):
        print("第 " + str(index + 1) + " 条数据上传完成")
        self.uploadedLength = self.uploadedLength + 1
        if self.uploadedLength == self.needUploadLength:
            print("全部上传完成\n从区块链获取数据库" + self.databaseName + "获取表" +
                  self.tableNeedRead + "...")
            for data in self.getFromBlockChain(self.databaseName,
                                               self.tableNeedRead):
                print(data)

    def pushToBlockChain(self, needUploadDB, needUploadTable):
        print("获取本地数据库数据 ...")
        keys = self.getKeys()
        values = self.getData()
        self.needUploadLength = len(values)
        self.uploadedLength = 0

        print("本地数据库获取完毕")
        if not self.geth.existSuchDatabase(needUploadDB):
            print("在区块链创建数据库  " + needUploadDB + " ...")
            #创建数据库
            self.geth.createDatabase(needUploadDB)
            print("在区块链创建数据库  " + needUploadDB + " 完毕")
        else:
            print("数据库  " + needUploadDB + "在区块链已存在")

        if not self.geth.exsitSuchTable(needUploadDB, needUploadTable):

            print("在区块链中创建表 " + needUploadTable + " ...")
            self.geth.createTable(needUploadDB, needUploadTable, keys)
            print("在区块链创建表 " + needUploadTable + " 成功")

        else:
            print("区块链数据库 " + needUploadDB + " 中已存在表 " + needUploadTable +
                  "  将删除旧表")
            self.geth.dropTable(needUploadDB, needUploadTable)
        print("准备上传数据 ...")
        self.geth.pushData(needUploadDB, needUploadTable, values,
                           self.waitMined)

    def getFromBlockChain(self, needGetDB, needGetTable):
        if not geth.exsitSuchTable(needGetDB, needGetTable):
            print("区块中不存在这样的表")
            return
        else:
            length = geth.getTableLength(needGetDB, needGetTable)
            result = []
            print(length)
            for index in range(length):
                result.append(geth.getTable(needGetDB, needGetTable, index))
            return result
Пример #8
0
    api = twitter_get_api()
    user = api.me()

    sql = Sql()
    sql.connect()

    # データベースのユーザー情報更新
    sql.register_user(user.id, user.screen_name)

    # 新規の場合はユーザーパラメーター初期化.
    param = sql.get_user_parameter(user.id)
    if param is None:
        initialize_user_parameter(user.id)

    sql.close()

    # rootページへ戻る.
    return redirect(configuration.ROOT_URL)


def twitter_get_api():
    """
        Twitter API取得.
    """
    auth = tweepy.OAuthHandler(configuration.CONSUMER_KEY,
                               configuration.CONSUMER_SECRET)
    auth.set_access_token(session['oauth_token'],
                          session['oauth_token_secret'])

    try: