Ankündigung

Einklappen
Keine Ankündigung bisher.

wunderground Logik

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

    wunderground Logik

    [WICHTIG]Die Logik ist nun hier zu finden
    [/WICHTIG]



    Hallo,

    ich möchte hier kurz eine Alpha-Version meiner Wunderground Logik vorstellen:
    (eigentlich ist es eine flexible xml-lese-Logik):

    Momentan werden nur User-Wetterstationen unterstützt, da das Plugin nicht unterscheidet zwischen aktuellem Wetter und der Vorhersage (das baue ich aber noch ein)

    Funktionsweise:
    items:
    Code:
    cat /usr/local/smarthome/items/wetter.conf
    [aktuelles_wetter]
      [[windrichtung]]
        type=num
        xmlstring=wind_degrees
        knx_send=7/7/15
        knx_dpt=9
      [[windgeschw]]
        type=num
        xmlstring=wind_mph
        knx_send=7/7/23
        knx_dpt=9
      [[temperatur]]
        type=num
        xmlstring=temp_c
        knx_send=7/7/16
        knx_dpt=9
      [[Niederschlag_Heute]]
        type=num
        xmlstring=precip_today_metric
        knx_send=7/7/17
        knx_dpt=9
      [[Niederschlag_letzte_stunde]]
        type=num
        xmlstring=precip_1hr_metric
      [[relative_luftfeuchte]]
        type=num
        xmlstring=relative_humidity
    Der XML-String entspricht einfach dem String, nach dem in der xml-Datei von Wunderground gesucht werden soll.

    Ein Beispiel für die XML:
    Weather Underground

    Ich werde hier demnächst auch (m)eine vollständige-Item-Liste posten. Sie sollte eigentlich für jeden einfach zu übernehmen sein.

    Hier die Logik:
    Code:
    #!/usr/bin/python
    
    from xml.dom import minidom
    import urllib2
    import re
    non_decimal = re.compile(r'[^\d.]+')
    
    
    def get_current_weather_data(xml, name):
       for node in xml.getElementsByTagName(name):
          v=node.childNodes[0].nodeValue
          for i in xrange(1000000):
             w=non_decimal.sub('', v)
          return w
    
    
    response= urllib2.urlopen('http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=INIEDERS60')
    
    xml=response.read()
    xml=minidom.parseString(xml)
    
    
    for item in sh.aktuelles_wetter:
       item(get_current_weather_data(xml,item.conf['xmlstring']))
    Vorsichtig müsst ihr noch bei Prozent-Werten sein. Ich denke, da sollte statt 34 eine 0.34 übertragen werden.

    Gruß und viel Spaß,
    Hendrik

    #2
    Hallo Hendrik,

    nett.

    Du solltest noch:
    Code:
    response= urllib2.urlopen('http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=INIEDERS60')
    
    xml=response.read()
    mit
    Code:
    xml = sh.tools.fetch_url('http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=INIEDERS60')
    ersetzen. Urllib2 hat ein Memory Leak.

    Bis bald

    Marcus

    Kommentar


      #3
      Danke, ist erledigt!

      Kommentar


        #4
        Hallo,

        kannst Du die gesamte itemliste + code nochmal posten?

        Ach und wie rufst Du die Logik auf? Zeitgesteuert über contrab?

        Gruß

        Sebastian

        Kommentar


          #5
          Bin gerade unterwegs. Erinner mich ggf Montag nochmal, wenn ich nicht dran denke.

          von Unterwegs getippert

          Kommentar


            #6
            Ich habe schon mal ein bisschen rumgespielt,

            bekomme aber immer die Meldung

            Code:
            2013-09-10 10:45:13 weather      WARNING  Logic: weather, File: wetter.py, Line: 13, Method: get_current_weather_data, Exception: global name 'non_decimal' is not defined
            Was mache ich falsch?

            Habe Deine Logik wie gepostet übernommen.

            Kommentar


              #7
              Da muss ich daheim gucken

              von Unterwegs getippert

              Kommentar


                #8
                Hier die Logik:
                Code:
                #!/usr/bin/python
                #!/usr/bin/python
                
                from xml.dom import minidom
                #import urllib2
                
                
                
                
                def get_current_weather_data(xml, name):
                   import re
                   non_decimal = re.compile(r'[^\d.]+')
                   for node in xml.getElementsByTagName(name):  
                      v=node.childNodes[0].nodeValue	     
                      for i in xrange(1000000):
                         w=non_decimal.sub('', v)
                      if v.find('%')>0:
                         w=w/100
                   return w
                 
                
                #response= urllib2.urlopen('http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=INIEDERS60')
                #response= urllib2.urlopen('http://api.wunderground.com/api/13f6a0e88a00bfa5/conditions/forecast/astronomy/lang:DL/q/Germany/Bremen.xml')
                #xml=response.read()
                
                xml = sh.tools.fetch_url('http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=INIEDERS85')
                xml=minidom.parseString(xml)
                
                #xml=minidom.parse("wetter.xml")
                
                for item in sh.aktuelles_wetter:
                 if item.conf['xmlstring']:
                   logger.debug(item.conf['xmlstring'])
                   item(get_current_weather_data(xml,item.conf['xmlstring']))
                   logger.debug(get_current_weather_data(xml,item.conf['xmlstring']))
                 else:
                   logger.debug('xmlstring is empty')
                   logger.debug(item.conf['xmlstring'])   
                
                #relative_humidity=get_current_weather_data(xml,'relative_humidity')
                #print(relative_humidity)
                Und die Items:
                Code:
                [aktuelles_wetter]
                 sv_page= Wetter
                  [[windrichtung]]
                    type=num
                    xmlstring=wind_degrees
                    knx_send=7/7/15
                    knx_dpt=9
                #  [[windgeschw]]
                #    type=num
                #    xmlstring=wind_mph
                #    knx_send=7/7/23
                #    knx_dpt=9
                  [[temperatur]]
                    type=num
                    xmlstring=temp_c
                    knx_send=7/7/16
                    knx_dpt=9
                  [[Niederschlag_Heute]]
                    type=num
                    xmlstring=precip_today_metric
                    knx_send=7/7/17  
                    knx_dpt=9
                  [[Niederschlag_letzte_stunde]]
                    type=num
                    xmlstring=precip_1hr_metric
                #  [[relative_luftfeuchte_perc]]
                #    type=num
                #    xmlstring=relative_humidity
                  [[relative_luftfeuchte]]
                    type=num
                    xmlstring=relative_humidity
                    rrd=1
                    visu=yes
                #	eval=sh.aktuelles_wetter.relative_luftfeuchte_perc() * 0.01
                #	eval_trigger=aktuelles_wetter.relative_luftfeuchte_perc
                    sv_widget="{{ plot.period('item', 'item', 'avg', 24h) }}"
                    knx_send=7/7/251 
                    knx_listen=7/7/251
                    knx_dpt=5
                Gruß,
                Hendrik

                Kommentar


                  #9
                  Hallo,

                  funktioniert dieser Aufruf in der aktuellen Version von sh.py nicht mehr?
                  Code:
                  item.conf['xmlstring']
                  ?

                  Da meckert sh.py zumindest:
                  Code:
                  2013-12-27 14:27:43 ERROR    wunderground Logic: wunderground, File: /usr/local/smarthome/logics/wunderground.py, Line: 33, Method: <module>, Exception: 'xmlstring'
                  Traceback (most recent call last):
                    File "/usr/local/smarthome/lib/scheduler.py", line 339, in _task
                      exec(obj.bytecode)
                    File "/usr/local/smarthome/logics/wunderground.py", line 33, in <module>
                      if item.conf['xmlstring']:
                  KeyError: 'xmlstring'
                  Den Inhalt von den xmlstring(s) habe ich geprüft. Wenn vorhanden, ist er Sinnvoll und hat keine Leerzeichen etc.

                  Oder funktioniert der Aufruf nicht, wenn es xmlstring nicht gibt?
                  Das hatte ich ja versucht abzufangen (s.o.: else...)

                  Gruß,
                  Hendrik

                  Kommentar


                    #10
                    Hat keiner eine Idee?

                    Kommentar


                      #11
                      ja, KeyError = key nicht existend.

                      würd noch nen try herum machen, zb


                      Code:
                      try:
                          value = item.conf['xmlstring']
                          ....
                          ....
                      except KeyError:
                          # no Key
                          pass

                      Kommentar


                        #12
                        Danke, das läuft jetzt so:
                        Code:
                        #!/usr/bin/python3.2
                        
                        from xml.dom import minidom
                        #import urllib2
                        weatheritems=sh.Wetter
                        url=weatheritems.wunderground_url()
                        
                        
                        
                        def get_current_weather_data(xml, name):
                          import re
                          try:
                           non_decimal = re.compile(r'[^\d.]+')
                           for node in xml.getElementsByTagName(name):  
                              v=node.childNodes[0].nodeValue	     
                              for i in range(1000000):
                                 w=non_decimal.sub('', v)
                              if v.find('%')>0:
                                 w=w/100
                           return w
                          except:
                           w=-99999
                        
                        #response= urllib2.urlopen('http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=INIEDERS60')
                        #response= urllib2.urlopen('http://api.wunderground.com/api/13f6a0e88a00bfa5/conditions/forecast/astronomy/lang:DL/q/Germany/Bremen.xml')
                        #xml=response.read()
                        
                        xml = sh.tools.fetch_url(url)
                        xml=minidom.parseString(xml)
                        
                        #xml=minidom.parse("wetter.xml")
                        
                        for item in weatheritems:
                         logger.debug('Behandle')
                         logger.debug(item)
                         try:
                           str=item.conf['xmlstring']
                           logger.debug(str)
                           val=get_current_weather_data(xml,str)
                           if val!=-99999:
                            item(val)
                            logger.debug(val)
                           else
                            logger.warning('Wunderground returned empty value for' + str')    
                         except KeyError:
                           logger.debug('xmlstring is empty or not existent')
                           pass
                        #relative_humidity=get_current_weather_data(xml,'relative_humidity')
                        #print(relative_humidity)
                        Code:
                        [Wetter]
                            [[wunderground_url]]
                                type = str
                                value = http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=INIEDERS60
                            [[Windrichtung]]
                                type = num
                                xmlstring = wind_degrees
                                knx_send = 7/7/15
                                knx_dpt = 9
                            [[Luftdruck]]
                                type = num
                                xmlstring = pressure_mb
                            [[Taupunkt]]
                                type = num
                                xmlstring = dewpoint_c
                            [[Windchill]]
                                type = num
                                xmlstring = windchill_c
                            [[Solarstrahlung]]
                                type = num
                                xmlstring = solar_radiation
                            [[Windgeschwindigkeit]]
                                [[[wind_mph]]]
                                    type = num
                                    xmlstring = wind_mph
                                [[[Web]]]
                                    type = num
                                    knx_dpt = 9
                                    sqlite = cache
                                    eval = sh.Wetter.Windgeschwindigkeit.wind_mph()/0.44704
                                    eval_trigger = sh.Wetter.Windgeschwindigkeit.wind_mph
                                [[[Wetterstation]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/11
                                    sqlite = cache
                            [[Temperatur]]
                                [[[Web]]]
                                    type = num
                                    xmlstring = temp_c
                                    knx_send = 7/7/16
                                    knx_dpt = 9
                                    sqlite = cache
                                [[[Wetterstation]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/15
                                    sqlite = cache
                                [[[Nordwest]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/0
                                    sqlite = cache
                                [[[Nordost]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/1
                                    sqlite = cache
                                [[[Suedost]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/2
                                    sqlite = cache
                                [[[Nordwest]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/3
                                    sqlite = cache
                            [[Niederschlag_Heute]]
                                type = num
                                xmlstring = precip_today_metric
                                knx_send = 7/7/17
                                knx_dpt = 9
                                sqlite = cache
                            [[Niederschlag_letzte_stunde]]
                                type = num
                                xmlstring = precip_1hr_metric
                                sqlite = cache
                            [[relative_luftfeuchte_perc]]
                                type = num
                                xmlstring = relative_humidity
                                sqlite = cache
                            [[relative_luftfeuchte]]
                                type = num
                                knx_dpt = 5
                                sqlite = cache
                                eval = sh.Wetter.relative_luftfeuchte_perc() * 0.01
                                eval_trigger = wetter.relative_luftfeuchte_perc
                            [[Helligkeit]]
                                [[[Sued]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/8
                                    sqlite = cache
                                [[[West]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/10
                                    sqlite = cache
                                [[[Ost]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/9
                                    sqlite = cache
                                [[[Daemmerung]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/12
                                    sqlite = cache
                                [[[Nordwest]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/4
                                    sqlite = cache
                                [[[Nordost]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/5
                                    sqlite = cache
                                [[[Suedost]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/6
                                    sqlite = cache
                                [[[Nordwest]]]
                                    type = num
                                    knx_dpt = 9
                                    knx_cache = 6/5/7
                                    sqlite = cache
                                [[[Nacht]]]
                                    type=bool
                                    knx_dpt=1
                                    knx_cache=6/5/13
                        Gruß,
                        Hendrik

                        Kommentar


                          #13
                          Hallo,

                          hier ein Update der Logik:
                          Code:
                          #!/usr/bin/python3.2
                          
                          import xml.etree.ElementTree as ET
                          from urllib.request import urlopen
                          
                          weatheritems=sh.Wetter
                          url=weatheritems.wunderground_url()
                          
                          
                          
                          def clean(v):
                            import re
                            try: 
                             non_decimal = re.compile(r'[^\d.]+')
                             w=non_decimal.sub('', v)
                             if v.find('%')>0:
                                   w=w/100
                             return w
                            except:
                             w=-99999
                          
                          #response= urllib2.urlopen('http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=INIEDERS60')
                          #response= urlopen('http://api.wunderground.com/api/13f6a0e88a00bfa5/conditions/forecast/astronomy/lang:DL/q/Germany/Bremen.xml')
                          #xml=response.read()
                          
                          #url='http://api.wunderground.com/api/13f6a0e88a00bfa5/conditions/forecast/astronomy/lang:DL/q/Germany/Bremen.xml'
                          
                          xml = sh.tools.fetch_url(url)
                          #xml=minidom.parseString(xml)
                          tree=ET.fromstring(xml)
                          
                          
                          
                          for item in weatheritems:
                           try:
                            s=item.conf['xmlstring']
                            if len(s)>0:
                             logger.debug('[Wunderground] Behandle jetzt Item ' +str(item)+' mit xmlstring '+s)
                             val=tree.findall('*/'+s)
                             if len(val)==0:
                               val=tree.findall(s)
                             if len(val)>0:
                               val=val[0].text
                               logger.debug('[Wunderground] Wert '+val+ ' in xml gefunden')
                               val=clean(val)
                               if val!=-99999:
                                 item(val)
                                 logger.debug(val)
                             else:
                              logger.warning('Wunderground returned empty value for' + s)    
                           except KeyError:
                             logger.debug('[Wunderground] xmlstring is empty or not existent')
                             pass
                          Die Items sind gleich geblieben, s.o.

                          Gruß,
                          Hendrik

                          Kommentar


                            #14
                            Hi!

                            Vielen Dank für die Logik. Funktioniert wirklich prima! Etwas unklar ist mir deine Unterscheidung zwischen "Web" und "Wetterstation". Zumal bei mir Unter-Unteritems irgendwie ignoriert werden.. Musste also zB für die Windgeschwindigkeit das xlmstring in das eigentl. Windgesch-Item transferieren. Weißt du, woran das liegen könnte?

                            Bei manch anderem Item gibt es eine Meldung, dass der xmlstring nicht gefunden wurde, aber ich vermute, das liegt an den unterschiedlichen Wetterstationen?

                            Hat sich bezüglich Vorschau schon was getan ? Kann da sonst auch mal kurz rein schauen, wäre nämlich gar nicht so schlecht.

                            Danke!
                            Andy

                            Kommentar


                              #15
                              Danke!
                              Zitat von Onkelandy Beitrag anzeigen
                              Etwas unklar ist mir deine Unterscheidung zwischen "Web" und "Wetterstation".
                              Na, das eine kommt aus dem Web, das andere von der Wetterstation.
                              Deshalb hat das eine einen xmlstring, das andere eine knx-GA.
                              Keiner sagt, dass in einer Item.conf nur Werte aus der Logik enthalten sein dürfen.

                              Zumal bei mir Unter-Unteritems irgendwie ignoriert werden.. Musste also zB für die Windgeschwindigkeit das xlmstring in das eigentl. Windgesch-Item transferieren. Weißt du, woran das liegen könnte?
                              An:
                              >for item in weatheritems

                              Das geht scheinbar nicht in tiefere Ebenen. Ist eigentlich logisch, aber ich habe da jetzt spontan keine clevere Idee.
                              Edit:
                              Versuch mal
                              for item in find_children(weatheritems, 'xmlstr')


                              Bei manch anderem Item gibt es eine Meldung, dass der xmlstring nicht gefunden wurde, aber ich vermute, das liegt an den unterschiedlichen Wetterstationen?
                              Ich verstehe nicht, was du meinst...
                              Du meinst die unterschiedlichen Standorte und die Verfügbarkeit an Daten?
                              Schau doch mal in die xml der von dir gewählten Wetterstation und prüfe, ob die Items vorhanden sind.

                              Hat sich bezüglich Vorschau schon was getan ? Kann da sonst auch mal kurz rein schauen, wäre nämlich gar nicht so schlecht.
                              Vorschau?

                              Gruß,
                              Hendrik

                              Kommentar

                              Lädt...
                              X