Пример #1
0
def merge_fake_data():
    db_session.merge(Meter(id=0, label='Meter A'))
    db_session.merge(Meter(id=1, label='Meter B'))
    db_session.merge(Meter(id=2, label='Meter C'))
    db_session.merge(
        MeterData(id=0,
                  meter_id=0,
                  timestamp=datetime.fromordinal(10000),
                  value=10))
    db_session.merge(
        MeterData(id=1,
                  meter_id=0,
                  timestamp=datetime.fromordinal(40000),
                  value=20))
    db_session.merge(
        MeterData(id=2,
                  meter_id=0,
                  timestamp=datetime.fromordinal(20000),
                  value=30))
    db_session.merge(
        MeterData(id=3,
                  meter_id=0,
                  timestamp=datetime.fromordinal(30000),
                  value=10))
    db_session.merge(
        MeterData(id=4,
                  meter_id=1,
                  timestamp=datetime.fromordinal(60000),
                  value=100))
    db_session.merge(
        MeterData(id=5,
                  meter_id=1,
                  timestamp=datetime.fromordinal(50000),
                  value=10))
    db_session.commit()
Пример #2
0
 def get(self):
     meter_key = self.get_str("meter_key")
     meter = Meter.get_meter(meter_key)
     reader = self.require_current_reader()
     if reader.key() != meter.reader.key():
         self.return_forbidden()
     self.return_ok(self.page_fields(meter, reader))
Пример #3
0
 def meter_update(redis_pool, conn_pool, delay):
     while True:
         time.sleep(delay)
         try:
             client = redis.Redis(connection_pool=redis_pool)
             result = client.blpop("meter_update", 60)
             if not result:
                 continue
             res_id = result[1].decode('utf-8')
             conn = conn_pool.connection()
             Meter.save_to_db(res_id, client, conn)
         except redis.exceptions.ConnectionError as err:
             print("redis connection error.", err)
         except pymssql.Error as err:
             print("mssql error.", err)
         except:
             print("other except.")
Пример #4
0
 def get_meter_by_id(self, device_id):
     """
     request device by id
     """
     response = requests.get(self._base_url + 'do=/meters/' + str(device_id), timeout=SHORT_TIMEOUT)
     data = json.loads(response.content)
     device = data['meter']
     data = data['data']
     return Meter(device, data)
Пример #5
0
 def get(self):
     meter_key = self.get_str("meter_key")
     meter = Meter.get_meter(meter_key)
     if meter.is_public:
         current_reader = self.find_current_reader()
     else:
         current_reader = self.require_current_reader()
         if current_reader.key() != meter.reader.key():
             self.return_forbidden()
     self.return_ok(self.page_fields(meter, current_reader))
Пример #6
0
    def get(self):
        reader_key = self.get_str('reader_key')
        reader = Reader.get_reader(reader_key)
        current_reader = self.require_current_reader()
        if current_reader.key() != reader.key():
            self.return_forbidden()

        self.return_ok(
            {
                'reader': reader,
                'meters': Meter.gql(
                    "where reader = :1", current_reader).fetch(10)})
Пример #7
0
    def post(self):
        try:
            current_reader = self.require_current_reader()
            is_public = 'is_public' in self.request.POST
            reminder_frequency = self.post_str('reminder_frequency')
            name = self.post_str('name')
            time_zone = self.post_str('time_zone')
            reminder_start = self.post_datetime(
                "reminder_start", pytz.timezone(time_zone))
            utility_units = self.post_str('utility_units')
            if reminder_frequency == 'never':
                email_address = None
            else:
                email_address = self.post_str('email_address')
                confirm_email_address = self.post_str('confirm_email_address')
                email_address = email_address.strip()
                if email_address != confirm_email_address.strip():
                    raise HTTPBadRequest("The email addresses don't match.")
            customer_read_frequency = self.post_str('customer_read_frequency')

            meter = Meter(
                reader=current_reader, email_address=email_address,
                reminder_start=reminder_start,
                reminder_frequency=reminder_frequency,
                is_public=is_public, name=name, time_zone=time_zone,
                customer_read_frequency=customer_read_frequency)
            meter.put()
            utility_id, units = utility_units.split('-')
            meter.update(
                utility_id, units, name, time_zone, is_public, email_address,
                reminder_start, reminder_frequency, customer_read_frequency)
            self.return_see_other('/view_meter?meter_key=' + str(meter.key()))
        except HTTPBadRequest as e:
            self.return_bad_request(self.page_fields(current_reader, e))
Пример #8
0
    def post(self):
        try:
            current_reader = self.require_current_reader()
            reader_key = self.post_str("reader_key")
            reader = Reader.get_reader(reader_key)
            if current_reader.key() != reader.key():
                self.return_forbidden()

            if 'remove_email' in self.request.POST:
                email = self.get_str('email')
                if email in reader.emails:
                    reader.emails.remove(email)
                    reader.put()
                    fields = self.page_fields(reader)
                    fields['message'] = "Successfully removed email address."
                    self.return_ok(fields)
                else:
                    raise HTTPBadRequest("""That email isn't associated with
                            the reader.""")

            elif 'proposed_email' in self.request.POST:
                proposed_email = self.post_str('proposed_email')
                reader.proposed_email = proposed_email.strip()
                reader.put()
                if len(proposed_email) == 0:
                    message = """Proposed email address successfully set to
                        blank."""
                else:
                    message = """Proposed email address set successfully. Now
                        sign out and then sign in using the proposed email
                        address"""
                self.return_ok(self.page_fields(reader, message))
            elif 'delete' in self.request.POST:
                for meter in Meter.gql("where reader = :1", reader):
                    meter.delete_meter()
                reader.delete()
                self.send_found('/welcome')
            else:
                name = self.post_str('name')
                reader.name = name
                reader.put()
                self.add_flash('Settings updated successfully.')
                self.return_see_other(
                    '/view_reader?reader_key=' + str(reader.key()))
        except HTTPBadRequest as e:
            self.return_bad_request(self.page_fields(reader, str(e)))
Пример #9
0
    def get(self):
        meter_key = self.get_str("meter_key")
        meter = Meter.get_meter(meter_key)
        if meter.is_public:
            current_reader = self.find_current_reader()
        else:
            current_reader = self.require_current_reader()
            if current_reader.key() != meter.reader.key():
                self.return_forbidden()

        reads = Read.gql(
            "where meter = :1 order by read_date desc", meter).fetch(1000)
        self.return_ok(
            {
                'reads': reads,
                'template_name': 'export_reads.csv',
                'content_disposition': 'attachment; filename=reads.csv;'})
Пример #10
0
    def post(self):
        current_reader = self.require_current_reader()
        meter_key = self.post_str("meter_key")
        meter = Meter.get_meter(meter_key)
        if current_reader.key() != meter.reader.key():
            self.return_forbidden()

        try:
            read_date = self.post_datetime("read", meter.get_tzinfo())
            value = self.post_float("value")
            read = Read(meter=meter, read_date=read_date, value=value)
            read.put()
            fields = self.page_fields(meter, current_reader)
            fields['read'] = read
            self.return_ok(fields)
        except HTTPBadRequest as e:
            self.return_bad_request(self.page_fields(meter, current_reader, e))
Пример #11
0
    def page_fields(self):
        meter_key = self.get_str("meter_key")
        meter = Meter.get_meter(meter_key)
        now = datetime.datetime.now().date()
        now = datetime.datetime(now.year, now.month, 1)
        months = []
        for month in range(-11, 1):
            month_start = now + \
                dateutil.relativedelta.relativedelta(months=month)
            month_finish = month_start + \
                dateutil.relativedelta.relativedelta(months=1)

            months.append(self.kwh(meter, month_start, month_finish))

        labels = ','.join(
            '"' + datetime.datetime.strftime(month['start_date'], '%b %Y') +
            '"' for month in months)
        data = ','.join(str(round(month['kwh'], 2)) for month in months)
        return {'current_reader': self.find_current_reader(),
                'meter': meter, 'data': data, 'labels': labels}
Пример #12
0
    def post(self):
        current_reader = self.require_current_reader()
        meter_key = self.post_str("meter_key")
        meter = Meter.get_meter(meter_key)
        try:
            if current_reader.key() != meter.reader.key():
                self.return_forbidden()

            if 'delete' in self.request.POST:
                fields = self.page_fields(meter, current_reader)
                meter.delete_meter()
                fields['message'] = 'Meter deleted successfully.'
                self.return_see_other('/')
            else:
                is_public = 'is_public' in self.request.POST
                email_address = self.post_str('email_address')
                confirm_email_address = self.post_str('confirm_email_address')
                reminder_frequency = self.post_str('reminder_frequency')
                utility_units = self.post_str('utility_units')
                name = self.post_str('name')
                time_zone = self.post_str('time_zone')
                reminder_start = self.post_datetime(
                    "reminder_start", pytz.timezone(time_zone))

                utility_id, units = utility_units.split('-')
                email_address = email_address.strip()
                if email_address != confirm_email_address.strip():
                    raise HTTPBadRequest("The email addresses don't match")
                customer_read_frequency = self.post_str(
                    'customer_read_frequency')
                meter.update(
                    utility_id, units, name, time_zone, is_public,
                    email_address, reminder_start, reminder_frequency,
                    customer_read_frequency)
                fields = self.page_fields(meter, current_reader)
                fields['message'] = 'Settings updated successfully.'
                self.return_ok(fields)
        except HTTPBadRequest as e:
            self.return_bad_request(
                self.page_fields(meter, current_reader, str(e)))
Пример #13
0
    def get(self):
        now = datetime.datetime.now()
        for meter in Meter.gql("""where next_reminder != null and
                next_reminder <= :1""", now):
            body = jinja2.Template("""
Hi,

This is a reminder from MtrHub to read your {{ meter.utility_id }} meter \
{{ meter.name }}. To change the settings, log in to:

http://www.mtrhub.com/

Regards,

MtrHub.
""").render(meter=meter)
            mail.send_mail(
                sender="MtrHub <*****@*****.**>",
                to=meter.email_address,
                subject="MtrHub: Remember to take a meter reading.",
                body=body)
            meter.set_next_reminder()
            meter.put()
        self.return_ok({})
Пример #14
0
    def post(self):
        try:
            current_reader = self.require_current_reader()
            meter_key = self.post_str("meter_key")
            meter = Meter.get_meter(meter_key)
            if current_reader.key() != meter.reader.key():
                self.return_forbidden()

            file_item = self.post_file("spreadsheet")
            if file_item.filename.endswith(".csv"):
                rdr = csv.reader(file_item.file)
                for row in rdr:
                    if len(row) < 2:
                        raise HTTPBadRequest("""Expecting 2 fields per row, the
                                date in the format yyyy-MM-dd HH:mm followed by
                                the reading.""")
                    try:
                        read_date = datetime.datetime.strptime(
                            row[0].strip(), '%Y-%m-%d %H:%M')
                    except ValueError as e:
                        raise HTTPBadRequest(
                            "Problem at line number " + str(rdr.line_num) +
                            " of the file. The first field (the read date "
                            "field) isn't formatted correctly, it should be "
                            "of the form 2010-02-23T21:46. " + str(e))
                    value = float(row[1].strip())
                    read = Read(meter=meter, read_date=read_date, value=value)
                    read.put()
                fields = self.page_fields(meter, current_reader)
                fields['message'] = 'File imported successfully.'
                self.return_ok(fields)
            else:
                raise HTTPBadRequest("The file name must end with '.csv.'")
        except HTTPBadRequest as e:
            e.values = self.page_fields(meter, current_reader)
            raise e
Пример #15
0
    def get(self):
        meters = {}
        public_reads = []

        for read in Read.gql("order by read_date desc limit 50"):
            meter = read.meter
            if not meter.is_public or str(meter.key()) in meters:
                continue
            meters[str(meter.key())] = meter
            public_reads.append(read)
            if len(public_reads) > 20:
                break

        fields = {'public_reads': public_reads}
        current_reader = self.find_current_reader()
        if current_reader is not None:
            reader_meters = Meter.gql(
                "where reader = :1", current_reader).fetch(10)
            fields['meters'] = reader_meters
            fields['candidate_customer_reads'] = [
                cand for cand in [
                    mtr.candidate_customer_read() for mtr in reader_meters]
                if cand is not None]
        self.return_ok(fields)
Пример #16
0
"""
从redis中取出数据
"""
import redis
import time
from models import Meter
import pymssql

if __name__ == '__main__':
    pool = redis.ConnectionPool(host='redis', max_connections=5)
    client = redis.Redis(connection_pool=pool)

    meter = Meter.instance("1110099000004", client)
    if meter:
        print(meter.ResKey, meter.FrameId, meter.OrgCode, meter.ServerIP,
              meter.MeterPrice, meter.Price0, meter.CycleStartDate)
        # meter.set_value("CallbackAddress", "")

    meter = None