abkfenris/gage-web

View on GitHub
app/remote/cawateroffice.py

Summary

Maintainability
A
0 mins
Test Coverage
"""
Get flows from the Canadian Water Office

Sample.remote_id should be in the form of 2 Letter Province code, underscore,
then site number. e.g.:
The Cheticamp River (http://wateroffice.ec.gc.ca/report/report_e.html?type=realTime&stn=01FC002)
would be NS_01FC002
If discharge is prefered set the remote_parameter to discharge
"""
import csv

import arrow
import requests

from .base import RemoteGage, add_new_sample


class WaterOffice(RemoteGage):
    """
    BC_07EA004
    """
    @staticmethod
    def get_from_wateroffice(remote_id):
        province = remote_id.split('_')[0]
        url = 'http://dd.weather.gc.ca/hydrometric/csv/{}/hourly/{}_hourly_hydrometric.csv'.format(province, remote_id)
        response = requests.get(url)
        riter = response.iter_lines(decode_unicode=True)
        next(riter)
        reader = csv.reader(riter)
        lines = []
        for row in reader:
            lines.append(row)
        last = lines[-1]
        level = float(last[2])
        try:
            discharge = float(last[6])
        except ValueError:
            discharge = None
        dt = arrow.get(last[1]).datetime

        return dt, level, discharge

    def get_sample(self, sensor_id):
        sensor = self.sensor(sensor_id)
        dt, level, discharge = self.get_from_wateroffice(sensor.remote_id)
        if sensor.remote_parameter == 'discharge':
            add_new_sample(sensor.id, dt, discharge)
        else:
            add_new_sample(sensor.id, dt, level)