Ankündigung

Einklappen
Keine Ankündigung bisher.

Wetter.com Plugin

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

    Wetter.com Plugin

    Hallo zusammen!

    Mit meinem ersten Beitrag möchte ich gleich behilflich sein

    Ich habe mir eigens Plugin für wetter.com geschrieben.
    Als Beispiel/Vorlage habe ich Plugin von yr.no genommen (vielen dank dafür an Martin Gleiß!)

    Voraussetzung:
    Account bei wetter.com
    Projekt anlegen (API :: Für Ihre Homepage :: Apps & mehr bei wetter.com)
    Vorhersage auf Tage umstellen und Vorhersageantwort anpassen: w,pc,tn,tx,wd,ws

    Dieser Plugin liefert:
    1. aktuelles Wetter
    2. Übersicht für heute
    3. Vorhersage für 3 Tage


    für die Punkte 1 und 3 muss man nur neues Plugin einbinden und language-Datei ergänzen.
    für Punkt 2, muss man an mehreren Stellen zusätzliche Anpassungen durchführen.

    in der wetter.com.php muss man noch Projektname und ApiKey ergänzen.


    Plugin: wetter.com.php (lib/weather/service/)
    PHP-Code:
    <?php

    require_once '../../../lib/includes.php';
    require_once 
    const_path_system.'weather/weather.php';
    require_once 
    const_path_system.'class_cache.php';


    /**
     * This class generates a weather
     */
    class weather_wetter extends weather
    {

        
    /**
         * retrieve the content
         */
        
    public function run()
        {
            
    $sForecastUrl 'http://api.wetter.com/forecast/weather'
            
    $sProjectName 'projektname_wetter.com'//ÄNDERN!!!
            
    $sApiKey 'key_von_der_wetter.com_seite'//ÄNDERN!!!
            
    $sCityCode $this->location
            
    // Generieren der Checksumme, muss für jeden City Code neu berechnet werden 
            
    $sChecksum md5($sProjectName $sApiKey $sCityCode); 
            
    $sForecastUrl .= '/city/' $sCityCode;
            
    $sForecastUrl .= '/project/' $sProjectName
            
    $sForecastUrl .= '/cs/' $sChecksum

            
    // api call 
            
    $cache = new class_cache('wetter.com_'.substr(strrchr($this->location'/'), 1).'.xml');
            if (
    $cache->hit())
                
    $content $cache->read();
            else
            {    
                
    $content file_get_contents($sForecastUrl);
            }
            if (
    substr($content05) == '<?xml')
            {
                
    // write cache
                
    $cache->write($content);
                
    $xml simplexml_load_string($content);
                
    $this->debug($xml);

                
    // today 
                
    $this->data['city'] = (string)$xml->name;

                
    // forecast
                
    $i 0;
                
    $t 0;

                foreach (
    $xml->forecast->date as $day)
                {
                    if (
    $i == 0)
                    {    
                        
    $this->data['current']['date'] = (string)$day->attributes()->value;
                        
    $this->data['current']['conditions'] = (string)$day->w_txt;
                        
    $this->data['current']['wind'] = translate((string)$day->wd_txt'wetter.com').' '.$day->ws.' km/h';
                        
    $this->data['current']['icon'] = $this->icon((string)substr($day->w01), $this->icon_sm);
                        
    $this->data['current']['temp'] = (float)$day->tx.'&deg; / '.(float)$day->tn.'&deg;';
                        
    $this->data['current']['more'] = 'Risiko: '.(string)$day->pc.'%'
                        
                        foreach (
    $xml->forecast->date->time as $time)
                        {
                        if (
    $t )
                        {
                        
    $this->data['forecastday'][$t]['time'] = (string)$time->attributes()->value;
                        
    $this->data['forecastday'][$t]['conditions'] = (string)$time->w_txt;
                        
    $this->data['forecastday'][$t]['wind'] = translate((string)$day->wd_txt'wetter.com').' '.$day->ws.' km/h';
                        
    $this->data['forecastday'][$t]['icon'] = $this->icon((string)substr($time->w01));
                        
    $this->data['forecastday'][$t]['temp'] = (float)$time->tx.'&deg; / '.(float)$time->tn.'&deg;';
                        
    $this->data['forecastday'][$t]['more'] = 'Risiko: '.(string)$time->pc.'%';
                        
    $t++;
                        }
                        }
                    }
                    if (
    $i )
                    {

                        
    $this->data['forecast'][$i]['date'] = (string)$day->attributes()->value;
                        
    $this->data['forecast'][$i]['conditions'] = (string)$day->w_txt;
                        
    $this->data['forecast'][$i]['wind'] = translate((string)$day->wd_txt'wetter.com').' '.$day->ws.' km/h';
                        
    $this->data['forecast'][$i]['icon'] = $this->icon((string)substr($day->w01));
                        
    $this->data['forecast'][$i]['temp'] = (float)$day->tx.'&deg; / '.(float)$day->tn.'&deg;';
                        
    $this->data['forecast'][$i]['more'] = 'Risiko: '.(string)$day->pc.'%';
                        
    $i++;
                    }
                }
            }
            else
                
    $this->error('Weather: wetter.com''Read request failed!');
            
        }

        
    /*
            * Icon-Mapper
            */
        
    function icon($name$sm 'sun_')
        {
            
    $ret '';
            
    $icon[0] = $sm.'1'//sonnig
            
    $icon[1] = $sm.'2'//leicht bewölkt
            
    $icon[2] = $sm.'5'//wolkig
            
    $icon[3] = $sm.'5'//bedeckt
            
    $icon[4] = 'cloud_6'//Nebel
            
    $icon[5] = 'cloud_8'//Sprühregen
            
    $icon[6] = 'cloud_8'//Regen
            
    $icon[7] = 'cloud_13'//Schnee
            
    $icon[8] = 'cloud_10'//Schauer
            
    $icon[9] = 'cloud_10'//Gewitter
            

            
    $ret $icon[$name];

            return 
    $ret;
        }

    }


    // -----------------------------------------------------------------------------
    // call the service
    // -----------------------------------------------------------------------------

    $service = new weather_wetter(array_merge($_GET$_POST));
    echo 
    $service->json();

    ?>
    Ergänzungen im lang_de.txt (lang/)
    Code:
    // ----- wetter.com -----------------------------------------------------------------
    $lang['wetter.com']['N']					= 'Nordwind';
    $lang['wetter.com']['NO']				= 'Nordostwind';
    $lang['wetter.com']['O']					= 'Ostwind';
    $lang['wetter.com']['SO']				= 'Südostwind';
    $lang['wetter.com']['S']					= 'Südwind';
    $lang['wetter.com']['SW']				= 'Südwestwind';
    $lang['wetter.com']['W']					= 'Westwind';
    $lang['wetter.com']['NW']				= 'Nordwestwind';

    für Punkt 2:
    Ergänzungen in weather.html (widgets/)

    HTML-Code:
    {% macro forecastday(id, location) %}
    	{% set uid = uid(page, id) %}
    
    	{% if once('digiweather') %}
    		<link rel="stylesheet" type="text/css" href="lib/weather/jdigiweather.css" />
    	{% endif %}
    
    	<div id="{{ uid }}-forecastday" class="forecastday">
    	</div>
    
    	<script type="text/javascript">
    		$('#{{ page }}').on('pagebeforeshow', function (event, ui) {
    			$.getJSON('lib/weather/service/{{ config_weather_service }}.php?location={{ location|default(config_weather_location) }}', function (data) {
    				var forecastday = '';
    				for (var i in data.forecastday) {
    					forecastday += '<div class=\'time\'>'
    					forecastday += '<div>' + data.forecastday[i].time + '</div>';
    					forecastday += '<img src="lib/weather/pics/' + data.forecastday[i].icon + '.png" alt="' + data.forecastday[i].conditions + '" title="' + data.forecastday[i].conditions + '" />';
    					forecastday += '<div>' + data.forecastday[i].temp + '</div>';
    					forecastday += '<div>' + data.forecastday[i].more + '</div>';
    					forecastday += '</div>';
    				}
    				$('#{{ uid }}-forecastday').html(forecastday);
    			})
    				.error(notify.json);
    		});
    	</script>
    
    {% endmacro %}
    Ergänzungen in jdigiweather.css (lib/weather/)
    Code:
    .forecastday {
        height: 115px;
    }
    
    .forecastday .time {
        width: 25%;
        text-align: center;
        float: left;
    }
    
    .forecastday img {
        width: 80px;
        height: 51px;
    }
    Optional, damit die 3-Tages-Vorhersage mittig platziert wird (wie auf dem Bild)
    in jdigiweather.css noch von 25% auf 33% ändern:
    Code:
    .forecastweek .day {
        width: 33%;
    die Höhe der Zeilen habe ich auch geändert, damit es besser aussieht:
    Code:
    .forecastweek {
        height: 115px;
    }
    In den smartVISU Einstellungen Location so eingeben: DE0001020
    Diese id findet man in URL: Wetter aktuell in Berlin, Berlin, Deutschland auf wetter.com.
    Angehängte Dateien

    #2
    Hey Eugen,

    super gemacht!
    Gefällt mir sehr gut. Habs gleich eingebaut.

    Ich musste in der lang_de.txt "East" gegen "Ost" tauschen und im widget noch bei forcastweek folgende Zeile für das Regenrisiko ergänzen:

    Code:
     forecast += '<div>' + data.forecast[i].more + '</div>';
    Dann passt es bei mir perfekt.

    Weiter so!

    Gruß,

    Mark

    Kommentar


      #3
      Zitat von mhoeftx Beitrag anzeigen
      Ich musste in der lang_de.txt "East" gegen "Ost" tauschen und im widget noch bei forcastweek folgende Zeile für das Regenrisiko ergänzen:

      Code:
       forecast += '<div>' + data.forecast[i].more + '</div>';
      Danke! Habe ich total vergessen
      NE, E und SE habe ich auch oben gleich geändert.

      Kommentar


        #4
        Habe gerade mal die Startseite auf nem iPad aufgerufen, da siehts nicht so prickelnd aus. Am PC perfekt.

        Wo kann man das Aussehen für die unterschiedlichen Devices festlegen?
        Angehängte Dateien

        Kommentar


          #5
          Zitat von mhoeftx Beitrag anzeigen
          Habe gerade mal die Startseite auf nem iPad aufgerufen, da siehts nicht so prickelnd aus. Am PC perfekt.

          Wo kann man das Aussehen für die unterschiedlichen Devices festlegen?
          Gleiches Problem hatte ich auch.
          Das liegt daran, dass Browser jdigiweather.css gecachet hat.
          Einfach Browsercache leeren und schon soll es wieder ok sein.

          Mann kann das auch im "Privat/Incoginto Modus" nachvollziehen.

          Kommentar


            #6
            Tatsächlich.
            So einfach ist das manchmal.

            Vielen Dank, hätte jetzt wahrscheinlich wieder rumgebastelt. ;-)

            Kommentar


              #7
              Ich habe selbst schon stundenlang gesucht

              Google spuckt noch eine Lösung: Strg+Shift+R, dann wird die Seite wirklich komplett geladen (habe gerade im FireFox getestet).
              Das gilt leider nicht für mobile Browser, da muss man Cache leeren.

              Kommentar


                #8
                Probleme mit der Darstellung der Forecastdaten

                Hallo,

                ich habe die Anpassungen so durchgeführt wie beschrieben. Bei mir wird dann allerdings nur das aktuelle Wetter angezeigt der Rest fehlt. Ich suche mir hier schon eine ganze Weile den Wolf und finde den Fehler nicht. Kann mir jemand einen Tipp geben, wo ich ansetzen kann? Der zurückgelieferte json-String sieht mMn in Ordnung aus. Siehe Screenshots. Was ich überhaupt noch nicht begriffen habe ist die Tracemöglichkeit in smartVISU. Ich bekomme es nicht hin, irgendetwas in die weather.html einzubauen, womit ich prüfen kann ob bestimmte Codeteile durchlaufen wird. Wie macht ihr das?

                Gruß Norbert
                Angehängte Dateien

                Kommentar


                  #9
                  Darstellungsproblem gelöst!

                  Wie Blöd
                  Man muss die Forecasts natürlich auch noch in der Seite definieren!

                  Kaum gibt man auf...

                  Kommentar


                    #10
                    Hallo,

                    die Daten aus Wetter.com landen jetzt bei mir. Im Debug sind diese erkennbar.

                    Leider gibt es noch eine Fehlermeldung:

                    Code:
                    2015-04-08 15:08:04,223 DEBUG    wettercom    Item wetter.vorhersage.heute.nacht.temperatur.min = 3 via Logic None None -- item.py:__update:363
                    2015-04-08 15:08:04,227 DEBUG    wettercom    Item wetter.vorhersage.heute.nacht.temperatur.max = 6 via Logic None None -- item.py:__update:363
                    2015-04-08 15:08:04,229 DEBUG    Scheduler    env_loc next time: 2015-04-08 15:38:04+02:00 -- scheduler.py:_next_time:289
                    2015-04-08 15:08:04,233 DEBUG    wettercom    Item wetter.vorhersage.heute.nacht.text = leicht bew\xf6lkt via Logic None None -- item.py:__update:363
                    --- Logging error ---
                    Traceback (most recent call last):
                      File "/usr/lib/python3.4/logging/__init__.py", line 980, in emit
                        stream.write(msg)
                    UnicodeEncodeError: 'ascii' codec can't encode character '\xf6' in position 98: ordinal not in range(128)
                    Call stack:
                      File "/usr/lib/python3.4/threading.py", line 888, in _bootstrap
                        self._bootstrap_inner()
                      File "/usr/lib/python3.4/threading.py", line 920, in _bootstrap_inner
                        self.run()
                      File "/usr/lib/python3.4/threading.py", line 868, in run
                        self._target(*self._args, **self._kwargs)
                      File "/usr/local/smarthome/lib/scheduler.py", line 317, in _worker
                        self._task(name, obj, by, source, dest, value)
                      File "/usr/local/smarthome/lib/scheduler.py", line 327, in _task
                        exec(obj.bytecode)
                      File "/usr/local/smarthome/logics/wettercom.py", line 25, in <module>
                        frame.text(forecast[date][2])
                      File "/usr/local/smarthome/lib/item.py", line 280, in __call__
                        self.__update(value, caller, source, dest)
                      File "/usr/local/smarthome/lib/item.py", line 363, in __update
                        self._change_logger("Item {} = {} via {} {} {}".format(self._path, value, caller, source, dest))
                    Message: 'Item wetter.vorhersage.heute.nacht.text = leicht bew\xf6lkt via Logic None None'
                    Hier brauche ich die Hilfe eines Kenners!


                    Ob die Ursache nur im "bew\xf6lkt" liegt? Ich glaube es nicht.
                    Ist die phyton3.4 falsch?

                    Danke für jede Hilfe!

                    Wolfgang
                    Zuletzt geändert von schloessl; 08.04.2015, 14:38.

                    Kommentar


                      #11
                      Hallo,

                      anscheinend kein Pi-Image verwendet. Das sieht nach dem Problem aus, wenn die Umgebungsvariable für die Sprache nicht gesetzt wird.

                      https://knx-user-forum.de/forum/supp...m-smarthome-py

                      Bis bald

                      Marcus

                      Kommentar


                        #12
                        Danke Markus,

                        Ihr Hinweis hat schon einmal geholfen.

                        export PYTHONIOENCODING=utf-8
                        export LANG=de_DE.utf8
                        export LC_ALL=de_DE.utf8

                        Vorerst habe ich die 3 Zeilen manuell eingegeben und die Ascii-Problematik ist verschwunden.
                        Verwunderlich ist nur, die 3 Angaben waren bei der Erstinstallation laut Anleitung schon einmal vorhanden. Wer ändert die Angaben?

                        Danke für die prompte Hilfe!

                        Leider habe ich immer noch ein Problem:

                        Code:
                        2015-04-10 12:05:28,776 ERROR    System       Logic: System, File: /usr/local/smarthome/logics/system.py, Line: 33, Method: <module>, Exception: unorderable types: type() < type() -- scheduler.py:_task:334
                        Traceback (most recent call last):
                          File "/usr/local/smarthome/lib/scheduler.py", line 327, in _task
                            exec(obj.bytecode)
                          File "/usr/local/smarthome/logics/system.py", line 33, in <module>
                            pairs = sorted([(x[1],x[0]) for x in list(d.items())])
                        TypeError: unorderable types: type() < type()
                        Jede weitere Information gebe ich gerne! Ich hoffe jemand ist schon über dieses Problem gestolpert und kann helfen.

                        Die Zeilen der System.py
                        Code:
                        # sort by refcount
                        pairs = sorted([(x[1],x[0]) for x in list(d.items())])         Zeile 33
                        pairs.reverse()
                        obj = ''
                        for n, c in pairs[:10]:
                            obj += "{0}: {1}, ".format(c.__name__, n)
                        obj = obj.strip(', ')
                        logger.info("Objects (Top 10): {0}".format(obj))
                        Ein schönes Wocheneinde

                        Wolfgang
                        Zuletzt geändert von schloessl; 10.04.2015, 11:41.

                        Kommentar


                          #13
                          Hallo Wolfgang,

                          die Logik ist von mir, oder? Die ist alt und funktioniert nicht mit Python 3.X. Bitte löschen, oder warten, oder selber fixen.

                          Bis bald

                          Marcus
                          P.S. Ich lese hier "eigentlich" nicht mehr mit. Support für SH.py gibt es im dedizierten Subforum.

                          Kommentar


                            #14
                            @Norbert


                            Ich habe das gleich Problem. Was meist Du mit:
                            Zitat von redlav Beitrag anzeigen
                            Darstellungsproblem gelöst!

                            Wie Blöd
                            Man muss die Forecasts natürlich auch noch in der Seite definieren!

                            Kaum gibt man auf...
                            Kannst Du das genauer beschreiben?
                            Danke.

                            Kommentar


                              #15
                              in der index.html muss man noch folgendes hinzufügen:

                              PHP-Code:
                              <hr>
                                  
                                  {{ 
                              weather.forecastday('weather_forecastday') }} 

                              Kommentar

                              Lädt...
                              X