diff --git a/modules/dresdenwetter/backend.py b/modules/dresdenwetter/backend.py index 4cb01054..3cf0167c 100644 --- a/modules/dresdenwetter/backend.py +++ b/modules/dresdenwetter/backend.py @@ -43,7 +43,9 @@ class DresdenWetterBackend(BaseBackend, ICapGauge): gauge.name = u"Private Wetterstation Dresden" gauge.city = u"Dresden" gauge.object = u"Weather" - gauge.sensors = self.browser.get_sensors_list() + gauge.sensors = [] + for sensor in self.browser.get_sensors_list(): + gauge.sensors.append(sensor) yield gauge def _get_gauge_by_id(self, id): diff --git a/modules/dresdenwetter/browser.py b/modules/dresdenwetter/browser.py index 87bd27e7..c653045f 100644 --- a/modules/dresdenwetter/browser.py +++ b/modules/dresdenwetter/browser.py @@ -18,27 +18,18 @@ # along with weboob. If not, see . -from weboob.tools.browser import BaseBrowser +from weboob.tools.browser2 import PagesBrowser, URL from .pages import StartPage __all__ = ['DresdenWetterBrowser'] -class DresdenWetterBrowser(BaseBrowser): - DOMAIN = u'www.dresden-wetter.de' - ENCODING = None - PAGES = {'.*': StartPage} +class DresdenWetterBrowser(PagesBrowser): + BASEURL = 'http://www.dresden-wetter.de' - homepage = '/Current_Vantage_Pro.htm' + home = URL('/Current_Vantage_Pro.htm', StartPage) - def __init__(self, *args, **kwargs): - BaseBrowser.__init__(self, *args, **kwargs) - - def home(self): - self.location(self.homepage) def get_sensors_list(self): - if not self.is_on_page(StartPage): - self.home() - return self.page.get_sensors_list() + return self.home.stay_or_go().get_sensors_list() diff --git a/modules/dresdenwetter/pages.py b/modules/dresdenwetter/pages.py index 99b5ada2..c61102cb 100644 --- a/modules/dresdenwetter/pages.py +++ b/modules/dresdenwetter/pages.py @@ -17,7 +17,8 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . -from weboob.tools.browser import BasePage +from weboob.tools.browser2.page import HTMLPage, method, ListElement, ItemElement +from weboob.tools.browser2.filters import CleanText, Env from weboob.capabilities.gauge import GaugeMeasure, GaugeSensor from weboob.capabilities.base import NotAvailable @@ -25,43 +26,50 @@ from weboob.capabilities.base import NotAvailable __all__ = ['StartPage'] -class StartPage(BasePage): - name = [u"Temperatur", u"Wind", u"Luftdruck", u"Luftfeuchtigkeit", - u"Niederschlag", u"Globalstrahlung"] - unit = [u"°C", u"km/h", u"hPa", u"%", u"mm", u"W/m²"] +class StartPage(HTMLPage): - def get_sensors_list(self): - paraphs = self.document.xpath('//p[@align="center"]') - sensors = [] - for i in range(len(paraphs)): - sensor = GaugeSensor("dd-%s" % self.name[i].lower()) - sensor.name = self.name[i] - sensor.unit = self.unit[i] - sensor.forecast = NotAvailable - sensor.history = NotAvailable - sensor.gaugeid = u"wetter" - paraph = paraphs[i] - lastvalue = GaugeMeasure() - lastvalue.alarm = NotAvailable - if i == 0: - text = paraph.xpath('b/span/font[@size="4"]')[1].text - lastvalue.level = float(text.split('\n')[1].split(u'°')[0]) - if i == 1: - text = paraph.xpath('b/span/font')[2].text - lastvalue.level = float(text.split('\n')[1]) - if i == 2: - text = paraph.xpath('span/font/b')[0].text - lastvalue.level = float(text.split('\n')[2].split('hPa')[0]) - if i == 3: - text = paraph.xpath('span/font[@size="4"]/b')[0].text - lastvalue.level = float(text.split('\n')[2].split(u'%')[0] - .split(':')[1]) - if i == 4: - text = paraph.xpath('b/font[@size="4"]/span')[0].text - lastvalue.level = float(text.split('\n')[0]) - if i == 5: - text = paraph.xpath('b/font/span')[0].text - lastvalue.level = float(text.split('\n')[1]) - sensor.lastvalue = lastvalue - sensors.append(sensor) - return sensors + @method + class get_sensors_list(ListElement): + item_xpath = '//p[@align="center"]' + + class item(ItemElement): + klass = GaugeSensor + + obj_name = Env('name') + obj_id = Env('id') + obj_unit = Env('unit') + obj_lastvalue = Env('lastvalue') + obj_gaugeid = u"wetter" + obj_forecast = Env('forecast') + + + def get_name(self, text): + if u"Niederschlag" not in text: + return text.split(':')[0].strip() + else: + return text.split()[0] + + def split_unit(self, text): + if u"Temperatur" in text: + value = text.split(': ')[1].split(u'°')[0] + unit = u'°C' + else: + value = text.split(':')[-1].split()[0] + unit = text.split(':')[-1].split()[1] + return value, unit + + def parse(self, el): + text = CleanText(el)(self) + + name = self.get_name(text) + _id = u"dd-%s" % name + + self.env['name'] = name + self.env['id'] = _id + + level, self.env['unit'] = self.split_unit(text) + lastvalue = GaugeMeasure() + lastvalue.level = float(level) + lastvalue.alarm = NotAvailable + self.env['lastvalue'] = lastvalue + self.env['forecast'] = NotAvailable