Convert sachsen module to browser2

This commit is contained in:
Florent 2014-03-19 11:22:14 +01:00
commit 89584ee168
4 changed files with 139 additions and 134 deletions

View file

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright(C) 2010-2012 Romain Bignon, Florent Fourcot
# Copyright(C) 2010-2014 Florent Fourcot
#
# This file is part of weboob.
#

View file

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright(C) 2010-2012 Romain Bignon, Florent Fourcot
# Copyright(C) 2010-2014 Florent Fourcot
#
# This file is part of weboob.
#
@ -65,6 +65,8 @@ class SachsenLevelBackend(BaseBackend, ICapGauge):
def iter_sensors(self, gauge, pattern=None):
if not isinstance(gauge, Gauge):
gauge = self._get_gauge_by_id(gauge)
if gauge is None:
raise SensorNotFound()
if pattern is None:
for sensor in gauge.sensors:
yield sensor

View file

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright(C) 2010-2012 Romain Bignon, Florent Fourcot
# Copyright(C) 2010-2014 Florent Fourcot
#
# This file is part of weboob.
#
@ -18,36 +18,23 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
from weboob.tools.browser import BaseBrowser
from weboob.tools.browser2 import PagesBrowser, URL
from .pages import ListPage, HistoryPage
__all__ = ['SachsenBrowser']
class SachsenBrowser(BaseBrowser):
DOMAIN = u'www.umwelt.sachsen.de'
ENCODING = None
PAGES = {'.*inhalt_re.html.*': ListPage,
'.*hwz/MP/.*': HistoryPage
}
class SachsenBrowser(PagesBrowser):
BASEURL = 'http://www.umwelt.sachsen.de'
homepage = '/de/wu/umwelt/lfug/lfug-internet/hwz/inhalt_re.html'
def __init__(self, *args, **kwargs):
BaseBrowser.__init__(self, *args, **kwargs)
def home(self):
self.location(self.homepage)
homepage = URL('/de/wu/umwelt/lfug/lfug-internet/hwz/inhalt_re.html.*', ListPage)
history = URL('/de/wu/umwelt/lfug/lfug-internet/hwz/MP/(?P<params>.*)/index.html', HistoryPage)
def get_rivers_list(self):
if not self.is_on_page(ListPage):
self.location(self.homepage)
return self.page.get_rivers_list()
return self.homepage.stay_or_go().get_rivers_list()
def iter_history(self, sensor):
self.location('/de/wu/umwelt/lfug/lfug-internet/hwz/MP/%d/index.html'
% int(sensor.gaugeid))
return self.page.iter_history(sensor)
def iter_history(self, sensor, **kwargs):
self.history.go(params=int(sensor.gaugeid))
kwargs['sensor'] = sensor
return self.page.iter_history(**kwargs)

View file

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright(C) 2010-2012 Romain Bignon, Florent Fourcot
# Copyright(C) 2010-2014 Florent Fourcot
#
# This file is part of weboob.
#
@ -18,38 +18,72 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
from datetime import datetime, date, time
from weboob.tools.browser import BasePage
from weboob.tools.browser2.page import HTMLPage, method, ListElement, ItemElement
from weboob.tools.browser2.filters import Env
from weboob.capabilities.gauge import Gauge, GaugeMeasure, GaugeSensor
from weboob.capabilities.base import NotAvailable, NotLoaded
import re
__all__ = ['ListPage', 'HistoryPage']
class ListPage(BasePage):
class ListPage(HTMLPage):
@method
class get_rivers_list(ListElement):
item_xpath = ".//a[@onmouseout='pegelaus()']"
class item(ItemElement):
klass = Gauge
alarmlevel = {"as1.gif": u"Alarmstufe 1", "as2.gif": u"Alarmstufe 2",
"as3.gif": u"Alarmstufe 3", "as4.gig": u"Alarmstufe 4",
"qua_grau.gif": u"No alarm function", "p_gruen.gif": u"",
"qua_weiss.gif": u"no data", "as0.gif": u"",
"MNW.gif": u""}
def get_rivers_list(self):
for pegel in self.document.getroot().xpath(".//a[@onmouseout='pegelaus()']"):
div = pegel.getparent()
obj_id = Env('id')
obj_name = Env('name')
obj_city = Env('city')
obj_object = Env('object')
obj_sensors = Env('sensors')
def init_sensor(self, _id, name, unit, value, forecast, alarm, date):
sensor = GaugeSensor("%s-%s" % (_id, name.lower()))
sensor.name = name
sensor.unit = unit
sensor.forecast = forecast
lastvalue = GaugeMeasure()
lastvalue.alarm = alarm
try:
lastvalue.level = float(value)
except:
lastvalue.level = NotAvailable
lastvalue.date = date
sensor.lastvalue = lastvalue
sensor.history = NotLoaded
sensor.gaugeid = unicode(_id)
return sensor
def parse(self, el):
div = el.getparent()
img = div.find('.//img').attrib['src'].split('/')[1]
data = pegel.attrib['onmouseover'] \
data = el.attrib['onmouseover'] \
.strip('pegelein(').strip(')').replace(",'", ",").split("',")
gauge = Gauge(int(data[7]))
gauge.name = unicode(data[0].strip("'"))
gauge.city = gauge.name.split(' ')[0]
gauge.object = unicode(data[1])
self.env['id'] = data[7].strip()
self.env['name'] = unicode(data[0].strip("'"))
self.env['city'] = self.env['name'].split(' ')[0]
self.env['object'] = unicode(data[1])
sensors = []
try:
lastdate = date(*reversed([int(x)
for x in data[2].split(' ')[0].split(".")]))
lasttime = time(*[int(x)
for x in data[2].split(' ')[1].split(":")])
datenumbers = data[2].split(' ')[0].split(".")
timenumbers = data[2].split(' ')[1].split(":")
lastdate = date(*reversed([int(x) for x in datenumbers]))
lasttime = time(*[int(x) for x in timenumbers])
lastdate = datetime.combine(lastdate, lasttime)
except:
lastdate = NotAvailable
@ -65,74 +99,56 @@ class ListPage(BasePage):
forecast = NotAvailable
try:
level = float(data[3])
except:
level = NotAvailable
levelsensor = GaugeSensor(gauge.id + "-level")
levelsensor.name = u"Level"
levelsensor.unit = u"cm"
levelsensor.forecast = forecast
lastvalue = GaugeMeasure()
lastvalue.level = level
lastvalue.date = lastdate
try:
lastvalue.alarm = self.alarmlevel[img]
alarm = self.alarmlevel[img]
except KeyError:
lastvalue.alarm = u""
levelsensor.lastvalue = lastvalue
levelsensor.history = NotLoaded
levelsensor.gaugeid = gauge.id
alarm = u""
levelsensor = self.init_sensor(self.env['id'], u"Level",
u"cm", data[3], forecast,
alarm, lastdate)
sensors.append(levelsensor)
try:
flow = float(data[4])
except:
flow = NotAvailable
flowsensor = GaugeSensor(gauge.id + "-flow")
flowsensor.name = u"Flow"
flowsensor.unit = u"m3/s"
flowsensor.forecast = forecast
lastvalue = GaugeMeasure()
lastvalue.level = flow
lastvalue.date = lastdate
try:
lastvalue.alarm = self.alarmlevel[img]
except KeyError:
lastvalue.alarm = u""
flowsensor.lastvalue = lastvalue
flowsensor.history = NotLoaded
flowsensor.gaugeid = gauge.id
flowsensor = self.init_sensor(self.env['id'], u"Flow",
u"m3/s", data[4], forecast,
alarm, lastdate)
sensors.append(flowsensor)
gauge.sensors = sensors
yield gauge
self.env['sensors'] = sensors
class HistoryPage(BasePage):
def iter_history(self, sensor):
table = self.document.getroot().cssselect('table[width="215"]')
lines = table[0].cssselect("tr")
lines.pop(0) # remove header
lines.pop(0) # remove first value (already in lastvalue)
for line in lines:
history = GaugeMeasure()
class HistoryPage(HTMLPage):
@method
class iter_history(ListElement):
item_xpath = '//table[@width="215"]/tr'
class item(ItemElement):
klass = GaugeMeasure
verif = re.compile("\d\d.\d\d.\d+ \d\d:\d\d")
obj_date = Env('date')
obj_level = Env('level')
obj_id = None
def condition(self):
if self.verif.match(self.el[0].text_content()):
return True
return False
def parse(self, line):
leveldate = date(*reversed([int(x)
for x in line[0].text_content().split(' ')[0].split(".")]))
leveltime = time(*[int(x)
for x in line[0].text_content().split(' ')[1].split(":")])
history.date = datetime.combine(leveldate, leveltime)
self.env['date'] = datetime.combine(leveldate, leveltime)
if sensor.name == u"Level":
if self.env['sensor'].name == u"Level":
try:
history.level = float(line[1].text_content())
self.env['level'] = float(line[1].text_content())
except:
history.level = NotAvailable
elif sensor.name == u"Flow":
self.env['level'] = NotAvailable
elif self.env['sensor'].name == u"Flow":
try:
history.level = float(line[2].text_content())
self.env['level'] = float(line[2].text_content())
except:
history.level = NotAvailable
self.env['level'] = NotAvailable
# TODO: history.alarm
yield history