Ankündigung

Einklappen
Keine Ankündigung bisher.

DWD Plugin

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • psilo
    antwortet
    ja da war in der alten implementierung ein lustiger bug... ist seit heute im DEV gefixt, das plugin braucht nun aber schon den DEV Strang von smarthomeNG, weil es das SmartPlugin als Oberklasse verwendet. Wenn Du es bei Dir lokal tauschen magst, anbei der geänderte Codeblock aus der forecast Funktion. In der ausgelesen Datei stand ein 31/01.06.2016 und die alte hat sich nur die 31 für den Tag und die 06 für den Monat geschnappt via Regex.. logisch dass er dann kein Datum bauen kann. Habs gleich für den Jahreswechsel mit gefixt - wenn auch nicht testbar.

    Ab Release der aktuellen DEV-Version werde ich aber auch nur noch die Plugins wie sie dort sind supporten und keine direkten Codepassagen mehr zitieren ;-)

    Code:
    elif line.count(location):
                        if frame == 'nacht':
                            #header = re.sub(r"/\d\d?", '', header)
                            day, month, year = re.findall(r"\d\d\D\d\d\.\d\d\.\d\d\d\d", header)[0].split('.')  #31/01.06.2016
                            day1, day2 = day.split("/")
                            if day2 == "01":
                                if 1 < int(month) < 10:
                                    month = "0%s"%str(int(month)-1)
                                elif int(month) == 1: #next day of night in new year, reset to last year
                                    month = "12"
                                    year = str(int(year)-1)
                                else:
                                    month = str(int(month)-1)
                            day = day1
                        else:
                            header = re.sub(r"/\d\d?", '', header)
                            day, month, year = re.findall(r"\d\d\.\d\d\.\d\d\d\d", header)[0].split('.')
                        #self.logger.debug(day+" "+month+" "+year)
                        date = datetime.datetime(int(year), int(month), int(day), hour, tzinfo=self.tz)
                        if re.search("\d\d\/\d\d", header):
                            date = date + datetime.timedelta(days=-1)
                        space = re.compile(r'  +')
                        fc = space.split(line)
                        forecast[date] = fc[1:]
            return forecast
    Zuletzt geändert von psilo; 31.05.2016, 14:34.

    Einen Kommentar schreiben:


  • schloessl
    antwortet
    Seit Mitternacht mag DWD nicht mehr.
    Gestern lief noch alles rund.
    Ohne Neustart oder Änderungen trat heute am 31.5. der Fehler auf.

    Passiert das nur bei mir?

    2016-05-31 14:19:26 ERROR dwd Logic: dwd, File: /usr/local/smarthome/plugins/dwd/__init__.py, Line: 206, Method: forecast, Exception: day is out of range for month
    Traceback (most recent call last):
    File "/usr/local/smarthome/lib/scheduler.py", line 341, in _task
    exec(obj.bytecode)
    File "/usr/local/smarthome/logics/wetter.py", line 50, in <module>
    forecast = sh.dwd.forecast('Suedost','Straubing')
    File "/usr/local/smarthome/plugins/dwd/__init__.py", line 206, in forecast
    date = datetime.datetime(int(year), int(month), int(day), hour, tzinfo=self.tz)
    ValueError: day is out of range for month
    2016-05-31 14:19:34 INFO Main KNX[default]: 1.1.46 set 2/1/80 to 21.26

    Einen Kommentar schreiben:


  • psilo
    antwortet
    sorry das steht in der default logik.. schaus mir mal an, kommt aber nicht von mir, gab es schon immer

    hast du die items wie unter https://github.com/smarthomeNG/smarthome/wiki/DWD übernommen? ich denke das nacht kommt bspw daher:

    Code:
                [[[[nacht]]]]
                    [[[[[temperatur]]]]]
                        type = str
                    [[[[[wolken]]]]]
                        type = str
                    [[[[[wind]]]]]
                        type = str
    und schau halt dass der itempfad stimmt:
    items = { d0: sh.wetter.vorhersage.d0, d1: sh.wetter.vorhersage.d1, d2: sh.wetter.vorhersage.d2, d3: sh.wetter.vorhersage.d3}

    Ich dachte das Plugin ging bei Dir schon mal... da habe ich in persona nichts umgebaut
    Zuletzt geändert von psilo; 14.05.2016, 13:40.

    Einen Kommentar schreiben:


  • BlackCrow
    antwortet
    Hey,

    schön, dass wir drüber gesprochen haben. :-)

    Ich habe jetzt auch mal ein Update auf 1.1 gemacht und die von Dir aktualisierte Logik genommen.

    Neuer Fehler:

    Code:
    2016-05-14 00:29:48 ERROR    dwd          Logic: dwd, File: /usr/local/smarthome/logics/wetter.py, Line: 109, Method: <module>, Exception: 'Item' object has no attribute 'nacht'
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 327, in _task
        exec(obj.bytecode)
      File "/usr/local/smarthome/logics/wetter.py", line 109, in <module>
        frame = base.nacht
    AttributeError: 'Item' object has no attribute 'nacht'
    Liebe Grüße

    Einen Kommentar schreiben:


  • psilo
    antwortet
    mist in der Logik ist noch mein pers. root (dwd_weather) anstatt dem was wohl alle anderen haben drin (wetter).

    Ersetze das mal bzw checke Dein Root-Item

    PS: Logikbeispiel ist angepasst!

    Einen Kommentar schreiben:


  • BlackCrow
    antwortet
    Hi,

    ich hab jetzt noch etwas "gefummelt" bekomme es leider trotzdem nicht hin. Aber zumindest schreibt er jetzt etwas in die Logs:

    Code:
    2016-05-13 06:26:46 ERROR    dwd          Logic: dwd, File: /usr/local/smarthome/logics/wetter.py, Line: 67, Method: <module>, Exception: 'SmartHome' object has no attribute 'dwd_weather'
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 327, in _task
        exec(obj.bytecode)
      File "/usr/local/smarthome/logics/wetter.py", line 67, in <module>
        sh.dwd_weather.temperatur(current["TEMP."])
    AttributeError: 'SmartHome' object has no attribute 'dwd_weather'
    Ich habe Deine Dateien aus diesem Link verwendet: https://github.com/smarthomeNG/smart...op/plugins/dwd

    Zudem habe ich die Logik aus folgendem Link verwendet:

    https://github.com/smarthomeNG/smarthome/wiki/DWD

    Mehr habe ich eigentlich nicht gemacht. Also die sh.py oder andere Dinge habe ich nicht angefasst - hätte ich das müssen?

    Ich bin mir sicher, dass der Fehler an mir liegt und nicht an Deiner Arbeit. Ich komme nur gerade nicht drauf. :-/

    Einen Kommentar schreiben:


  • psilo
    antwortet
    logik angepasst? nur der datenbezug ist anders - die ausgaben der funktionen identisch bzw erweitert aber nicht geändert. alles im wiki dokumentiert.
    frage ist aber ob du nur das plugin oder den sh developer stand genommen hast. das plugin ist schon auf das neue logging angepasst. zudem ist im dev stand von sh.py ja noch mehr geändert.

    'nicht funktioniert mehr' ist zudem wenig hilfreich. welche fehler wirft er denn im log

    achso genau: in den logs steht mglw nichts, weil das logging auf den dev stand angepasst wurde
    Zuletzt geändert von psilo; 13.05.2016, 08:03.

    Einen Kommentar schreiben:


  • BlackCrow
    antwortet
    Hi,

    ich habe die Änderungen jetzt übernommen. Leider funktioniert nicht mehr, ausser die Windgeschwidigkeit.

    In den Logs steht nichts, daher scheint zumindest kein Fehler zu bestehen. Kann es sein, dass er vielleicht die Daten nicht "sauber" erhält?

    Einen Kommentar schreiben:


  • psilo
    antwortet
    Ich muss in der Tat sagen, dass ich die /gds/gds/specials/warnings/legend_warnings.pdf auch sonst nirgends mehr finde. mit meinem codes geht es über den neuen alerts folder, aber für die Anleitung muss ich passen. Der Rest vom README sollte aber ok sein.

    Ich habs: /gds/gds/help

    Passe README an und pushe.. Wenn noch was fehlt melden!

    Einen Kommentar schreiben:


  • psilo
    antwortet
    ich hab doch schon alles umgebaut? schau im dev
    anleitung im neuen wiki sollte passen. sonst gerne changes einsteuern:

    https://github.com/smarthomeNG/smart...op/plugins/dwd

    An das README habe ich mich nicht gemacht, ansich ist das ja nicht "mein" Plugin. Wenn wo konrket Fragen sind passe ich das auf Wunsch aber gerne an. Grundlegend bleibt das meiste aber gleich, wenn man die IDs usw halt schon hat. Ich habe nur die Ablagen im Plugin selber getauscht und bei CURRENT viel rumimplementiert.

    Die Files sind aber sehr sehr dreckig, ich baue immer noch Workarounds für schlechte DWD Files. Heute erst wieder was ins DEV committed.
    Zuletzt geändert von psilo; 22.04.2016, 18:27.

    Einen Kommentar schreiben:


  • schloessl
    antwortet
    Leider stimmt die Anleitung im Wicki und dem Readme nicht mehr.

    "Warnings" gibt es nicht mehr, Dafür liegt wohl jetzt alles in ftp://ftp-outgoing2.dwd.de/gds/speci...tables/germany 'Hier gibt es Einträge für UV und Pollen.

    Kann ich davon ausgehen, das Problem wird durch obige Anpassung erschlagen?

    Ich she nicht, wo das Gebiet (Süd,o.ä.) fbzw. die Station ausgewählt wird.

    Danke und schönes Wochenende!

    Wolfgang



    Einen Kommentar schreiben:


  • psilo
    antwortet
    Und wohl noch eine Änderung. Die Current-Methode geht nun erstmal gar nicht mehr, da im /gds/gds/specials/observations/tables/germany nun nur noch html-Files abliegen.

    Anbei nun die schönere Lösung, ähnlich wie das Original implementiert. Ich hoffe es ist stabil genug für die unschönen DWD Daten..

    Code:
        def current(self, location):
            directory = 'gds/specials/observations/tables/germany'
            cleanr =re.compile('<.*?>') #clean html tags
            files = self._retr_list(directory)
            if files == []:
                return {}
            last = sorted(files)[-1]
            fb = self._retr_file(last)
    
            matchObj = re.findall(r'<tr>(.*?)</tr>', fb, re.M|re.I|re.S)  
            legend = re.sub(cleanr,'', matchObj[0])
            legend = list(filter(None, [s.strip() for s in legend.splitlines()]))  #filter empty lines
     
            fb = fb.splitlines()
            if len(fb) < 8:
                logger.info("problem fetching {0}".format(last))
                return {}
            header = fb[3] # index angepasst
            date = re.findall(r"\d\d\.\d\d\.\d\d\d\d", header)[0].split('.')
            date = "{}-{}-{}".format(date[2], date[1], date[0])      
            
            for element in matchObj:                  
                if element.count(location):                
                    data_string = re.sub(cleanr,'', element)              
                    data = list(filter(None, [s.strip() for s in data_string.splitlines()]))   #filter empty lines
                    if len(data) == len(legend):                  
                        return dict(zip(legend, data))
                    else:
                        logger.error('Number of elements in legend does not match data {} : {}'.format(str(len(legend)), str(len(data))))
                    
            return {}
    In der Logik habe ich die Identifier denen aus dem HTML angepasst (TT gibt es bspw. nicht mehr, das Ding heißt jetzt wohl "Temp."). Zudem habe ich soeben (25.03.) festgestellt, dass noch Files mit mehr Infos (und wieder teils anderen Benennungen - "TEMP." anstatt "Temp.") abliegen. Daraufhin habe ich weitere Anpassungen gemacht, die je nachdem wie die Standardbenennung ist. Weiterhin habe ich rel. Luftfeuchte und Windspitzen hinzugenommen. Theoretisch gibt es noch mehr Items, wie bspw. Schneehöhen, usw., die aber auch nicht immer dabei sind. Die fand ich aktuell aber weniger interessant.

    Code:
    if "TEMP." in current:
        sh.dwd_weather.temperatur(current["TEMP."])
    elif "Temp." in current:
        sh.dwd_weather.temperatur(current["Temp."])
    if "RR1" in current:
        sh.dwd_weather.niederschlag(current["RR1"])
    if "LUFTD." in current:
        sh.dwd_weather.luftdruck(current["LUFTD."])
    elif "Luftd." in current:
        sh.dwd_weather.luftdruck(current["Luftd."])
    if "U%" in current:
        sh.dwd_weather.relluftfeuchte(current["U%"])
    if "FF" in current:
        sh.dwd_weather.windgeschwindigkeit(current["FF"])
    if "FX" in current:
        if current["FX"] != '---':
            sh.dwd_weather.windspitzen(current["FX"])
    if "DD" in current:
        sh.dwd_weather.windrichtung(current["DD"])
    if "Wetter+Wolken" in current:
        sh.dwd_weather.wetter(current["Wetter+Wolken"])
    if "B&ouml;en" in current:
        if current["B&ouml;en"] == '---':
            sh.dwd_weather.boen('')
        else:
            sh.dwd_weather.boen(current["B&ouml;en"])
    Die items.conf für oberes logischerweise um folgende Items erweitern:

    Code:
        [[relluftfeuchte]]
            name = Relative Luftfeuchte
            sqlite = init
            type = num
        [[windspitzen]]
            name = Windspitzen
            sqlite = yes
            type = num
            unit = km/h
    Zuletzt geändert von psilo; 25.03.2016, 19:31.

    Einen Kommentar schreiben:


  • psilo
    antwortet
    Falls das noch wer braucht: ich habe die Warnings, den UV Index und die Pollen auf die "alerts" Folder angepasst, wie sie laut Info Mail von Mitte März an nur noch supported werden. Alles noch ohne Gewähr, da ich aktuell auch noch teste. Die Files an den Orten sollten identisch mit vorher sein:

    Code:
        def warnings(self, region, location):
            directory = 'gds/specials/alerts/txt'
    [...]
        def uvi(self, location):
            directory = 'gds/specials/alerts/health'
    [...]
        def pollen(self, region):
            filename = 'gds/specials/alerts/health/s_b31fg.xml'

    Einen Kommentar schreiben:


  • psilo
    antwortet
    wenn jemand weiss, wie ich bei "_retr_list" nur Files mit bestimmten Dateiendungen bzw. ohne bestimmte Endungen auswählen kann, wäre natürlich die bessere Lösung ;-)

    Einen Kommentar schreiben:


  • BlackCrow
    antwortet
    Das hat funktioniert.

    Super, vielen Dank!!

    Einen Kommentar schreiben:

Lädt...
X