HowTo: Wunderground-API in Programm-Baustein Abfragen

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • AlexAn
    Lebende Foren Legende
    • 25.08.2015
    • 4215

    #46
    Hallo Chrisoph,

    das Vergnügen hatte ich auch mit Template.
    Bei mir hats die SD Karte wieder mal zerschossen - Gott sei Dank hatte ich eine Sicherung die 2Tage alt war.
    Grüße Alex

    Kommentar

    • Christoph_Koch
      Smart Home'r
      • 28.08.2015
      • 83

      #47
      und was hast du dann gemacht?......also hattest du auch das template nicht aufgespielt?

      Kommentar

      • Dott
        Extension Master
        • 25.08.2015
        • 153

        #48
        Ich habe auch standig reboots, wusste nicht das es am Wetter liegt, ich habe den apikey mal rausgeholt, weil ich keine raindrops mehr hatte. Ich hatte 15 Aktualisierungen in einer Minute ohne das ich das manuell gemacht habe. Wahrscheinlich kommt das dadurch das der Miniserver neugestartet ist. Mein Miniserver läuft jetzt seit ca. 14000 Sekunden.

        Kurz nach dem Beitrag hat der Miniserver neugestartet
        Zuletzt geändert von Dott; 30.09.2015, 16:07.

        Kommentar

        • Dott
          Extension Master
          • 25.08.2015
          • 153

          #49
          Ich habe jetzt die wundergroundapi rausgeschmissen, seit dem läuft der Miniserver durch.

          Kommentar

          • swede
            Smart Home'r
            • 26.08.2015
            • 77

            #50
            Gast

            du hast eine PN

            Danke Dir

            Kommentar

            • Gast

              #51
              kann mal einer ,einen Screenshot hochladen wie das ganze fertig in der app aussieht? danke

              Kommentar

              • apbw
                Smart Home'r
                • 11.09.2015
                • 68

                #52
                Sobald ich das einbaue bootet der Miniserver ständig neu

                Kommentar

                • Stefan77
                  Smart Home'r
                  • 15.11.2015
                  • 55

                  #53
                  Hi Leute,

                  auch bei mir war gerade der Miniserver in Dauerschleife. Hatte nur die erste Seite gelesen und wusste deshalb nichts von der Problematik.
                  Die SD-Karte formatiert, die UDP Wunderground API und den Programmcode gelöscht, das dann wieder eingespielt und es ging wieder.

                  Wäre ganz nützlich im ersten Post zu warnen, dass die aktuelle Version den Miniserver zerlegt..

                  Kommentar

                  • The Spirit
                    LoxBus Spammer
                    • 11.09.2015
                    • 391

                    #54
                    schade das das hier gerade nicht klappt.
                    hoffe es gibt ein update.
                    hatte noch ne sicherung von vor wunderground. hab die einfach eingespielt und alles läuft.
                    wie kann ich denn sehen seit wann der miniserver durchläuft? oder ob ich noch probleme habe?
                    Danke

                    Kommentar

                    • MightyLox
                      LoxBus Spammer
                      • 22.10.2015
                      • 208

                      #55
                      Bei mir läuft es wunderbar. Ohne Reboots und im Raummodus.

                      Einziges Problem sind die fehlenden/falschen Icons (Häuser):
                      Klicke auf die Grafik für eine vergrößerte Ansicht

Name: LoxWetter.png
Ansichten: 341
Größe: 24,2 KB
ID: 17612


                      Und ich muss mich wohl mal mit PicoC näher beschäftigen, denn trotz setlogtext bekomme ich keine Ausgaben im Monitor...

                      Grüße
                      Martin
                      Angehängte Dateien
                      Zuletzt geändert von MightyLox; 27.12.2015, 21:26.
                      Haus: Neubau Start 22.11.15, EG/OG, 2 Pers./Kind/Hund, Massivhaus, Heizlast 7,52 KW
                      Loxone: 1x MS, 2x Ext, 1x DMX
                      KNX: 2x 8er & 8x 4er MDT Glastaster (mit Temp), Rollläden MDT AKU-1616.01, MDT AMI-1216.01 True RMS Steckdosen, MDT Wetter, MDT SCN-P360K4.01 Präsenzmelder
                      Licht: DMX LED Beleuchtung (24V/230V)
                      Heizung: LWWP Waterkotte Basic BS 7010.5, Webinterface Modbus TCP
                      Projektseite: https://www.loxforum.com/forum/mein-...neubau-2015-16

                      Kommentar


                      • dc4frt
                        dc4frt kommentierte
                        Kommentar bearbeiten
                        Kleiner Hinweis: Um die Häuschen weg zu bekommen musst du im jew. Statusblock die Symbole aktiv auf "nicht zugeordnet" setzen oder entsprechend andere Symbole auswählen :-)

                      • MightyLox
                        MightyLox kommentierte
                        Kommentar bearbeiten
                        Ja, danke dir. Hatte ich inzwischen auch schon rausbekommen, abre hier nicht vermerkt. ;-)
                    • MightyLox
                      LoxBus Spammer
                      • 22.10.2015
                      • 208

                      #56
                      Sorry, hatte den Thread mit einem kopierten Bild lahmgelegt. Geht jetzt wieder, nachdem ich das Bild (nach Wartezeit) aus der obigen Nachricht gelöscht hatte.
                      Haus: Neubau Start 22.11.15, EG/OG, 2 Pers./Kind/Hund, Massivhaus, Heizlast 7,52 KW
                      Loxone: 1x MS, 2x Ext, 1x DMX
                      KNX: 2x 8er & 8x 4er MDT Glastaster (mit Temp), Rollläden MDT AKU-1616.01, MDT AMI-1216.01 True RMS Steckdosen, MDT Wetter, MDT SCN-P360K4.01 Präsenzmelder
                      Licht: DMX LED Beleuchtung (24V/230V)
                      Heizung: LWWP Waterkotte Basic BS 7010.5, Webinterface Modbus TCP
                      Projektseite: https://www.loxforum.com/forum/mein-...neubau-2015-16

                      Kommentar

                      • MightyLox
                        LoxBus Spammer
                        • 22.10.2015
                        • 208

                        #57
                        Der letzte Code hatte einen Bug, der wohl zu den Ausfällen bei manchen MS geführt hat:

                        Code:
                                    free(cWetterHeute);
                                    free(cWetterMorgen);
                                    free(cWetterUeberm);
                                    if(LOGGING == 1){
                                        printf("Wunderground-API: Wetter Heute: %s",cWetterHeute);
                                        printf("Wunderground-API: Wetter Morgen: %s",cWetterMorgen);
                                        printf("Wunderground-API: Wetter Übermorgen: %s",cWetterUeberm);
                                    }
                        Wenn Logging eingeschaltet war (Defaulteinstellung), dann wurde auf freigegebene Variablen zugegriffen. Das kann gutgehen, muss aber nicht.

                        Ich habe den Code etwas erweitert und den Bug rausgenommen.

                        Code:
                        /*
                        Um einen API Key zu erhalten muss man sich auf http://www.wunderground.com/weather/api/ registrieren.
                        Als Station gibt man am einfachsten den Namen des Wohnortes an,
                        dann wählt Wunderground die passende Wetterstation für einen aus.
                        Man kann aber auch eine bestimmte Station angeben.
                        Eine Karte der Wetterstationen gibt es hier: http://www.wunderground.com/wundermap/
                        Private Wetterstationen haben einen Namen als ID und müssen nach folgende Schema angegeben werden: "pws:NAME123".
                        Die offiziellen Stationen haben eine nummerische ID und werden folgendermaßen angegeben: "zmw:00000.0.00000"
                        */
                        #define API_KEY  ""   // <-- Hier den API-Key eintragen. // Put your API-Key here.
                        #define STATION  ""   // <-- Hier ID der Wetterstation eintragen. // Put your Station ID here.
                        #define LANG     "DL" // <-- Sprache // Language (http://www.wunderground.com/weather/api/d/docs?d=language-support&MR=1)
                        #define SERVER   "api.wunderground.com"
                        #define UDP_ZEIT 75
                        #define ZYKLUS   1000 // Programm-Zyklus in Millisekunden.
                        #define LOGGING  1
                        #define ANZ_WERTE_A 33
                        char *a[ANZ_WERTE_A] = {
                        "observation_time",
                        "magic",
                        "wmo",
                        "latitude",
                        "longitude",
                        "elevation",
                        "weather",
                        "temp_c",
                        "relative_humidity",
                        "wind_degrees",
                        "wind_dir",
                        "wind_mph",
                        "wind_gust_mph",
                        "wind_kph",
                        "wind_gust_kph",
                        "pressure_mb",
                        "pressure_in",
                        "pressure_trend",
                        "dewpoint_f",
                        "dewpoint_c",
                        "heat_index_f",
                        "heat_index_c",
                        "windchill_f",
                        "windchill_c",
                        "feelslike_f",
                        "feelslike_c",
                        "visibility_mi",
                        "visibility_km",
                        "solarradiation",
                        "precip_1hr_in",
                        "precip_1hr_metric",
                        "precip_today_in",
                        "precip_today_metric",
                        };
                        
                        // Globale Variabeln erzeugen.
                        char cAPIa[100];
                        char cAPIv[100];
                        int nEvents;
                        float fEingangEins;
                        float fEingangZwei;
                        
                        // API-Aufrufe erzeugen.
                        strcat(cAPIa,"/api/");
                        strcat(cAPIa,API_KEY);
                        strcat(cAPIa,"/conditions/lang:");
                        strcat(cAPIa,LANG);
                        strcat(cAPIa,"/q/");
                        strcat(cAPIa,STATION);
                        strcat(cAPIa,".xml");
                        
                        strcat(cAPIv,"/api/");
                        strcat(cAPIv,API_KEY);
                        strcat(cAPIv,"/forecast/lang:");
                        strcat(cAPIv,LANG);
                        strcat(cAPIv,"/q/");
                        strcat(cAPIv,STATION);
                        strcat(cAPIv,".xml");
                        
                        while(1){
                            sleep(ZYKLUS);              // Warten bis zum nächsten Interval.
                            setoutput(1,0);             // Ausgang der Uhr auf 0 stellen.
                            nEvents = getinputevent();  //Eingänge auslesen.
                            
                            if (nEvents & 0x18){               // Bitmaske für die Eingang.
                                fEingangEins = getinput(0); // Eingänge auf Veränderung prüfen, und ggf. Variabeln aktualisieren.
                                fEingangZwei = getinput(1);
                            }
                        
                            // Prüfen ob die Daten aktualisiert werden sollen.
                            // Aktuelles Wetter - Anfang.
                            if (fEingangEins != 0){
                                fEingangEins = 0; // 0 setzten, damit der Abruf pro Flanke nur einmal erfolgt.
                                char *cDatenA = httpget(SERVER,cAPIa);    // Daten abrufen.
                                if ((cDatenA != NULL) && (cDatenA != 0)){ //Prüfen ob die Daten Vorhanden sind.    
                                    setoutput(1,1);                       // Impuls an Uhr
                                    // Windrichtung Ausgeben.
                                    char *cWindRichtungXML;
                                    if((cWindRichtungXML =getxmlvalue(cDatenA,0,"wind_degrees")) != NULL){
                                        setoutput(0,batof(cWindRichtungXML));
                                    }
                                    free(cWindRichtungXML);
                                    // Drucktendenz ermitteln.
                                    char* cDruckTendenzXML;                
                                    if((cDruckTendenzXML = getxmlvalue(cDatenA,0,"pressure_trend")) != NULL){
                                        if(strcmp(cDruckTendenzXML,"+") == 0){ setoutput(2,1); }      //steigender Druck.                
                                        else{
                                            if(strcmp(cDruckTendenzXML,"-") == 0){ setoutput(2,-1); } // fallender Druck        
                                            else{ setoutput(2,0); }                                   // gleichbleibender Druck.
                                        }                                             
                                    }
                                    free(cDruckTendenzXML);
                                    
                                    // Edit: MightyLox
                                    char* cXML;    
                                    // --- Druck
                                    if((cXML =getxmlvalue(cDatenA,0,"pressure_mb")) != NULL){
                                        setoutput(3,batof(cXML));
                                    }            
                                    free(cXML);
                                    // --- Regen heute
                                    if((cXML =getxmlvalue(cDatenA,0,"precip_today_metric")) != NULL){
                                        setoutput(4,batof(cXML));
                                    }            
                                    free(cXML);
                                    // --- Windböen
                                    if((cXML =getxmlvalue(cDatenA,0,"wind_gust_kph")) != NULL){
                                        setoutput(5,batof(cXML));
                                    }            
                                    free(cXML);
                                    // --- gefühlte Temperaturen
                                    if((cXML =getxmlvalue(cDatenA,0,"feelslike_c")) != NULL){
                                        setoutput(6,batof(cXML));
                                    }            
                                    free(cXML);
                                    // --- Taupunkt
                                    if((cXML =getxmlvalue(cDatenA,0,"dewpoint_c")) != NULL){
                                        setoutput(7,batof(cXML));
                                    }            
                                    free(cXML);
                                    // --- aktuelles Wetter: hier fehlen noch einige Werte
                                    if((cXML =getxmlvalue(cDatenA,0,"weather")) != NULL){
                                        if(strcmp(cXML,"Heiter") == 0) setoutput(8,1);            
                                        else
                                        if(strcmp(cXML,"Regen") == 0) setoutput(8,2);
                                        else     
                                        if(strcmp(cXML,"Nebel") == 0) setoutput(8,3);
                                        else
                                            setoutput(8,0);
                                    }            
                                    free(cXML);
                                    // --- Wind
                                    if((cXML =getxmlvalue(cDatenA,0,"wind_kph")) != NULL){
                                        setoutput(9,batof(cXML));
                                    }            
                                    free(cXML);
                                    // --- Luftfeuchtigkeit
                                    if((cXML =getxmlvalue(cDatenA,0,"relative_humidity")) != NULL){
                                        setoutput(10,batof(cXML));
                                    }            
                                    free(cXML);
                                    // --- aktuelle Temperatur
                                    if((cXML =getxmlvalue(cDatenA,0,"temp_c")) != NULL){
                                        setoutput(11,batof(cXML));
                                    }            
                                    free(cXML);
                                    // End: MightyLox
                        
                                    // UDP Stream erzeugen.
                                    STREAM* sUDPStreamA = stream_create("/dev/udp/127.0.0.1/2611",0,0);
                                    if (sUDPStreamA != NULL){
                                        char cTmpA[255]; // Tmp. für den Text.
                                        int i = 0;
                                        memset(cTmpA, 0, 2); // Variable leeren.
                                        while(i < ANZ_WERTE_A){
                                            sleep(UDP_ZEIT);
                                            // String erzeugen
                                            char* cXMLString;
                                            if((cXMLString = getxmlvalue(cDatenA,0,a[i])) != NULL){ // Wenn der Wert existiert.
                                                strcat(cTmpA,a[i]);
                                                strcat(cTmpA,":");
                                                strcat(cTmpA,cXMLString);
                                                strcat(cTmpA,"\0"); // Nullterminierung zum Ende des Strings.
                                                stream_write(sUDPStreamA,cTmpA, strlen(cTmpA));    // Vorbereiten
                                                stream_flush(sUDPStreamA);    //Absenden    
                                                if(LOGGING == 1){
                                                    printf("Wunderground-API: %s",cTmpA); // Logausgabe
                                                    //setlogtext(cTmpA);
                                                }
                                            }
                                            free(cXMLString);
                                            memset(cTmpA, 0, 255); // Variable leeren.
                                            i++;
                                        }
                                        memset(cTmpA, 0, 255); // Variable leeren.        
                                    }
                                    stream_close(sUDPStreamA);
                                }
                                char *cObservationtimeXML;
                                if((cObservationtimeXML = getxmlvalue(cDatenA,0,"observation_time")) != NULL){
                                    printf("Wunderground-API: %s", cObservationtimeXML);
                                }
                                free(cObservationtimeXML);
                                free(cDatenA);
                                //Aktuelles Wetter - Ende.
                            }
                            //Vorherhsage - Anfang.
                            if (fEingangZwei != 0){
                                fEingangZwei = 0; // 0 setzten, damit der Abruf pro Flanke nur einmal erfolgt.        
                                char *cDatenV = httpget(SERVER,cAPIv);    // Daten abrufen.
                                if ((cDatenV != NULL) && (cDatenV != 0)){ //Prüfen ob die Daten Vorhanden sind.
                                    char cTmpB[255]; // Tmp. f�r den Text.
                                    memset(cTmpB, 0, 2); // Variable leeren.
                                    // Text erzeugen
                                    char *cWetter1  = strstrskip(getxmlvalue(cDatenV,0,"fcttext_metric"),"[CDATA[");
                                    char *cWetter2 = strstrskip(getxmlvalue(cDatenV,1,"fcttext_metric"),"[CDATA["); // Daten vor dem Text abschneiden
                                    char *cWetter3 = strstrskip(getxmlvalue(cDatenV,2,"fcttext_metric"),"[CDATA[");
                                    char *cWetter1Title = getxmlvalue(cDatenV,0,"title");
                                    char *cWetter2Title = getxmlvalue(cDatenV,1,"title"); // Daten vor dem Text abschneiden
                                    char *cWetter3Title = getxmlvalue(cDatenV,2,"title");
                                    cWetter1[strlen(cWetter1)-3] = '\0'; // Nullterminierung im String setzten damit die nachfolgenden Zeichne ignoriert werden.
                                    cWetter2[strlen(cWetter2)-3] = '\0';            
                                    cWetter3[strlen(cWetter3)-3] = '\0';
                                    strcat(cTmpB, cWetter1Title);
                                    strcat(cTmpB, ": ");
                                    strcat(cTmpB, cWetter1);
                                    setoutputtext(0,cTmpB);
                                    memset(cTmpB, 0, 2); // Variable leeren.
                        
                                    strcat(cTmpB, cWetter2Title);
                                    strcat(cTmpB, ": ");
                                    strcat(cTmpB, cWetter2);
                                    setoutputtext(1,cTmpB);
                                    memset(cTmpB, 0, 2); // Variable leeren.
                        
                                    strcat(cTmpB, cWetter3Title);
                                    strcat(cTmpB, ": ");
                                    strcat(cTmpB, cWetter3);
                                    setoutputtext(2,cTmpB);
                                    memset(cTmpB, 0, 2); // Variable leeren.
                        
                                    if(LOGGING == 1){
                                        printf("Wunderground-API: Wetter %s: %s",cWetter1Title,cWetter1);
                                        printf("Wunderground-API: Wetter %s: %s",cWetter2Title,cWetter2);
                                        printf("Wunderground-API: Wetter %s: %s",cWetter3Title,cWetter3);
                                    }
                                    free(cWetter1);
                                    free(cWetter2);
                                    free(cWetter3);
                                    free(cWetter1Title);
                                    free(cWetter2Title);
                                    free(cWetter3Title);
                                    memset(cTmpB, 0, 255); // Variable leeren.        
                                }
                                free(cDatenV);
                            }
                            //Vorherhsage - Ende.
                            }
                        }
                        Grüße
                        Martin
                        Haus: Neubau Start 22.11.15, EG/OG, 2 Pers./Kind/Hund, Massivhaus, Heizlast 7,52 KW
                        Loxone: 1x MS, 2x Ext, 1x DMX
                        KNX: 2x 8er & 8x 4er MDT Glastaster (mit Temp), Rollläden MDT AKU-1616.01, MDT AMI-1216.01 True RMS Steckdosen, MDT Wetter, MDT SCN-P360K4.01 Präsenzmelder
                        Licht: DMX LED Beleuchtung (24V/230V)
                        Heizung: LWWP Waterkotte Basic BS 7010.5, Webinterface Modbus TCP
                        Projektseite: https://www.loxforum.com/forum/mein-...neubau-2015-16

                        Kommentar

                        • dc4frt
                          Dumb Home'r
                          • 31.08.2015
                          • 17

                          #58
                          Echt super umgesetzt. Ich habe mir bisher mit virtuellen http-Eingängen beholfen, (kleiner Vorteil: die Webseite darf man schneller abfragen) aber z.B. Statustexte gingen irgendwie nicht.
                          Fragen:
                          1. was ist der virtuelle Eingang "magic" ? Sternstunde?
                          2. ist angedacht noch Alarme einzubinden? http://www.wunderground.com/weather/..._within_europe

                          Danke und Grüße Thomas
                          Miniserver, 1-wire, KNX, Pollin AVR-net-io

                          Kommentar


                          • MightyLox
                            MightyLox kommentierte
                            Kommentar bearbeiten
                            Kann ich dir auch nicht sagen. Was ich auch noch nicht gefunden habe ist, welche Wettercodes es alle gibt. also:
                            Regen, Heiter, Leichter Schneefall, ...
                        • anemac
                          Dumb Home'r
                          • 18.09.2015
                          • 28

                          #59
                          @ MightyLox, falls du es nicht schon selber gemerkt hast: Ich glaube bei deinem Edit sollte bei "aktuelles Wetter" nicht "weather" sondern "conds" abgefragt werden. Dann kannst du diese Liste hier verwenden: http://www.wunderground.com/weather/...-glossary&MR=1
                          ... und wenn es nicht ganz so genau sein muss verwendet man vielleicht wildcards (*rain, *fog,...), um das Mapping zu verkürzen?

                          Auf alle Fälle +1 für die super Umsetzung...
                          lg

                          Kommentar

                          • MightyLox
                            LoxBus Spammer
                            • 22.10.2015
                            • 208

                            #60
                            Zitat von anemac
                            @ MightyLox, falls du es nicht schon selber gemerkt hast: Ich glaube bei deinem Edit sollte bei "aktuelles Wetter" nicht "weather" sondern "conds" abgefragt werden. Dann kannst du diese Liste hier verwenden: http://www.wunderground.com/weather/...-glossary&MR=1
                            ... und wenn es nicht ganz so genau sein muss verwendet man vielleicht wildcards (*rain, *fog,...), um das Mapping zu verkürzen?

                            Auf alle Fälle +1 für die super Umsetzung...
                            lg
                            Erstmal danke für deinen Kommentar.
                            Hm, weather passt schon und conds habe ich auf der XML Ebene nicht.

                            Code:
                             
                             		"weather":"Leichter Schneefall",
                            Zu 2., könnte man machen, aber der Unterschied zwischen Heavy und Light kann schon bedeutend sein, daher bisher ohne Wildcards.

                            Grüße
                            Martin
                            Haus: Neubau Start 22.11.15, EG/OG, 2 Pers./Kind/Hund, Massivhaus, Heizlast 7,52 KW
                            Loxone: 1x MS, 2x Ext, 1x DMX
                            KNX: 2x 8er & 8x 4er MDT Glastaster (mit Temp), Rollläden MDT AKU-1616.01, MDT AMI-1216.01 True RMS Steckdosen, MDT Wetter, MDT SCN-P360K4.01 Präsenzmelder
                            Licht: DMX LED Beleuchtung (24V/230V)
                            Heizung: LWWP Waterkotte Basic BS 7010.5, Webinterface Modbus TCP
                            Projektseite: https://www.loxforum.com/forum/mein-...neubau-2015-16

                            Kommentar

                            Lädt...