Script Programming: Informations-URL erhalten

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Davejje
    Extension Master
    • 24.11.2017
    • 173

    #1

    Script Programming: Informations-URL erhalten

    Hallo Alle,

    Ich mache seit einiger Zeit Dinge in Pico C. Ich habe zum Beispiel verschiedene Dinge gemacht oder modifiziert, die mir im Internet begegnet sind.
    Ich arbeite gerade an einem Bausteinprogramm für die Bewässerungsinstallation im Garten. anhand der anlagenspezifikationen wurde festgelegt, wie viel und wie lange wasser zugeführt werden muss.

    Nun möchte ich dies mit Wetterinformationen der letzten 3 Tage und der nächsten 3 Tage erweitern.
    Ich habe eine API von Darksky angefordert. es zeigt alle Informationen an, die ich denke, ich brauche. Diese Api-Verarbeitung innerhalb des Blockblockprogramms war erfolgreich. Ich möchte jedoch jetzt bestimmte Daten aus dieser API auslesen. Wer kann mich in die Richtung bewegen, um dies anzufordern?

    UPDATE: 2019-04-05 H10:00
    Inzwischen bin ich ein bisschen weitergezogen. Ich habe gestern ziemlich viel über die Funktionen gelesen. Ich habe die Daten in Openweather-Daten konvertiert, da sie XML-Daten liefern können. und ein Standard-XML-Parser ist verfügbar.


    es funktioniert über eine virtuelle Eingabe. Ich weiß also genau, dass die URL einschließlich der API funktioniert und der Befehl im vi ebenfalls korrekt ist.


    Aktueller Code zum Abrufen von WindSpeed3hXML aus der XML-Datei. Wenn alles gut gelaufen wäre, würde das XML in "DataOne" gespeichert werden, dann suche ich nach "windSpeed ​​mps" und diesen Wert würde ich in "Precipitation3hXML" schreiben.


    UPDATE: 2019-04-05 H15:00
    In diesem Moment bekomme ich Daten aus dem Programmblock, die ich in das Loxone-Log schreibe, aber im Loxone-Log sehe ich nur unlesbare Zeichen.


    Code:
    if(true) {
        char *DataOne = httpget(Url, buffer);
            if ((DataOne != NULL) && (DataOne != 0)) {
                setoutput(6,1);
                char WindSpeed3hXML[128];
                WindSpeed3hXML =getxmlvalue(DataOne,0,"\"<time\"\"<time\"\"<time\"\"<time\"\"<precipitation\"value=\"");
       setoutput(7,batof(WindSpeed3hXML));
                setlogtext(WindSpeed3hXML);
             //}
                free(WindSpeed3hXML);
            }
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <weatherdata>
        <location>
            <name></name>
            <type></type>
            <country>NL</country>
            <timezone></timezone>
            <location altitude="0" latitude="55.5833" longitude="6.7208" geobase="geonames" geobaseid="6544855"></location>
        </location>
        <credit></credit>
        <meta>
            <lastupdate></lastupdate>
            <calctime>0.0066</calctime>
            <nextupdate></nextupdate>
        </meta>
        <sun rise="2019-04-05T05:02:51" set="2019-04-05T18:14:13"></sun>
        <forecast>
            <time from="2019-04-05T06:00:00" to="2019-04-05T09:00:00">
                <symbol number="800" name="onbewolkt" var="01d"></symbol>
                <precipitation></precipitation>
                <windDirection deg="98.5032" code="E" name="East"></windDirection>
                <windSpeed mps="2.56" name="Light breeze"></windSpeed>
                <temperature unit="celsius" value="12.89" min="8.72" max="12.89"></temperature>
                <pressure unit="hPa" value="1007.43"></pressure>
                <humidity value="84" unit="%"></humidity>
                <clouds value="onbewolkt" all="0" unit="%"></clouds>
            </time>
            <time from="2019-04-05T09:00:00" to="2019-04-05T12:00:00">
                <symbol number="800" name="onbewolkt" var="02d"></symbol>
                <precipitation></precipitation>
                <windDirection deg="56" code="NE" name="NorthEast"></windDirection>
                <windSpeed mps="3.12" name="Light breeze"></windSpeed>
                <temperature unit="celsius" value="14.51" min="11.38" max="14.51"></temperature>
                <pressure unit="hPa" value="1006.59"></pressure>
                <humidity value="81" unit="%"></humidity>
                <clouds value="onbewolkt" all="8" unit="%"></clouds>
            </time>
            <time from="2019-04-05T12:00:00" to="2019-04-05T15:00:00">
                <symbol number="803" name="zwaar bewolkt" var="04d"></symbol>
                <precipitation></precipitation>
                <windDirection deg="59.0008" code="ENE" name="East-northeast"></windDirection>
                <windSpeed mps="3.76" name="Gentle Breeze"></windSpeed>
                <temperature unit="celsius" value="13.65" min="11.57" max="13.65"></temperature>
                <pressure unit="hPa" value="1005.67"></pressure>
                <humidity value="70" unit="%"></humidity>
                <clouds value="zwaar bewolkt" all="80" unit="%"></clouds>
            </time>
    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 2019-04-05 10_20_05-Loxone Config.png Ansichten: 1 Größe: 15,5 KB ID: 196676

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 2019-04-05 10_20_29-Loxone Config.png Ansichten: 1 Größe: 5,3 KB ID: 196677


    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 2019-04-05 14_30_21-Loxone Config.png Ansichten: 0 Größe: 1,1 KB ID: 196709
    Zuletzt geändert von Davejje; 05.04.2019, 15:11.
  • Davejje
    Extension Master
    • 24.11.2017
    • 173

    #2

    Ich habe das Startthema angepasst und es klarer beschrieben.

    Kommentar

    • Jan W.
      Lox Guru
      • 30.08.2015
      • 1398

      #3
      Ohne es getestet zu haben, würde ich folgenden Code mal probieren. Ich bin mir aber nicht sicher, ob das Parsen mit "getxmlvalue" funktioniert, denn in der XML Datei stehen ja keine Werte für precipitation. Außerdem müsste man eigentlich zuerst den richtigen Time-Block suchen (06-09, 09-12 oder 12-15 Uhr) und nicht das X. Vorkommen von "precipitation". Der dafür nötige Code ist aber etwas aufwändiger.

      Nur so am Rande: "precipitation" ist ja eigentlich Niederschlag und nicht WindSpeed, aber das ist vielleicht nur ein Beispiel.

      Code:
      if(true) {
          char *DataOne = httpget(Url, buffer);  // memory muss wieder freigegeben werden, wenn Pointer ungleich NULL
          if (DataOne != NULL) {
              setoutput(6,1);
              char * WindSpeed3hXML;
              WindSpeed3hXML = getxmlvalue(DataOne,0,"precipitation");  // memory muss wieder freigegeben werden, wenn Pointer ungleich NULL
              if (WindSpeed3hXML != NULL) {
                  setoutput(7,batof(WindSpeed3hXML));
                  setlogtext(WindSpeed3hXML);
                  free(WindSpeed3hXML);
              }
              free(DataOne);
          }
      }
      Gruß Jan
      Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
      Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
      Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
      Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
      Node-RED: IKEA Tradfri

      Kommentar

      • Davejje
        Extension Master
        • 24.11.2017
        • 173

        #4

        Ich habe den Code oben ausprobiert. Aber leider funktioniert es nicht, Output 6 wird schön hoch. Dies würde bedeuten, dass Daten von der XML-API abgerufen werden. Ausgang 7 bleibt jedoch niedrig. Es erscheint auch keine Meldung im Loxone-Protokoll. In Bezug auf die Windgeschwindigkeit und den Niederschlag weiß ich, dass sie verdreht sind. Das ist jetzt nicht wichtig. aber ich habe schon so viel versucht, dass es pervers ist. Die Windgeschwindigkeit ist der erste Wert in der Regel. Der Niederschlag ist der 2. Wert in der Regel. Ich nahm die Windgeschwindigkeit, um auszuschließen dass hier etwas schief gehen würde.

        Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 2019-04-06 08_31_46-Verbinding selecteren.png Ansichten: 0 Größe: 24,2 KB ID: 196772

        Kommentar

        • Jan W.
          Lox Guru
          • 30.08.2015
          • 1398

          #5
          Wenn Du die o.a. XML-Datei verwendet hast (wovon ich ausgehe), dann ist das Ergebnis wahrscheinlich richtig. Loxone hat folgende Kurzbeschreibung der Funktion:

          Returns the value of name in str, or a null pointer if name is not part of str.

          Das erste Vorkommen von "precipitation" hat a keinen Wert, sondern nur

          <precipitation></precipitation>

          Die Doku ist für diesen Fall sehr dürftig. Es gibt zwar das Attribut "precipitation", aber kein "=" und auch kein Wert dazu. Es ist daher naheliegend, dass die Funktion den Wert NULL zurückliefert.
          Ich würde mal einen anderen Wert abfragen, z.B. "windSpeed mps". Dann müsste 2.56 herauskommen.
          Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
          Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
          Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
          Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
          Node-RED: IKEA Tradfri

          Kommentar

          • Davejje
            Extension Master
            • 24.11.2017
            • 173

            #6
            Ich habe auch die "windSpeed mps" ausprobiert, die Sie mir gegeben haben, aber der Wert kam immer von 0.
            In dem Momen ich es mit Niederschlag versuchte, hatte ich das XML über ein anderes Programm (Postbote) gelesen und es enthielt einen Wert.
            Auch zu dieser Zeit gibt den Wert 0 zurück.

            Kommentar

            • Davejje
              Extension Master
              • 24.11.2017
              • 173

              #7

              Im Moment habe ich die Idee, dass er Daten bekommt.
              Wenn ich eine Änderung in den nicht lesbaren Zeichen sehe, sehe ich, dass sich auch die Daten in der API geändert haben.
              Dies würde bedeuten, dass die API und der "getxmlvalue" -Teil funktionieren. dass er die Informationen jedoch als unlesbare Zeichen erhält oder dass sie ein anderes Format haben, das nicht in die "char" -Prinzipien passt

              Code:
                  if(true) {
                  char* DataOne = httpget(Url, buffer);
                  if (DataOne != NULL) {
                      setoutput(6,true);
                      char* WindSpeed3hXML;
                      WindSpeed3hXML = getxmlvalue(DataOne,0,"windSpeed mps");
                      if (WindSpeed3hXML != NULL) {
                          setoutput(7,batof(WindSpeed3hXML));
                          setlogtext(WindSpeed3hXML);
                          setoutputtext(2,WindSpeed3hXML);
                          free(WindSpeed3hXML);
                          }
                      free(DataOne);
                      }
                  }
              In diesem Moment zeigt die Protokolldatei von loxone auch an, dass sie einen Wert empfängt, der von ihr nicht gelesen / verwendet werden kann.


              Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 2019-04-08 13_30_34-Loxone Config.png Ansichten: 0 Größe: 10,0 KB ID: 196969
              Zuletzt geändert von Davejje; 08.04.2019, 12:37.

              Kommentar

              • Davejje
                Extension Master
                • 24.11.2017
                • 173

                #8
                ES FUNKTIONIERT!!!

                Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 2019-04-11 10_13_27-Loxone Config.png Ansichten: 0 Größe: 21,7 KB ID: 197300

                Ich habe erwartet, dass das Folgende funktioniert hätte
                Code:
                char* WindsC = getxmlvalue(xmlfileC,zero,"\"time\"\"time\"\"windSpeed\"mps");
                Ich bekomme hier keinen Fehlercode, aber auch kein Ergebnis. Wenn ich nur "mps" verwende, bekomme ich die Daten aus den ersten 3 Stunden von der API.
                aber wenn ich die daten aus dem 2-block in der api (zwischen 3 und 6 uhr) haben möchte, muss ich den ersten block überspringen und dieser funktioniert noch nicht.
                In einer virtuellen Eingabe in der loxone config funktioniert es wie folgt
                Code:
                \i<time \i\i<time \i\i<windSpeed mps=\i\s1\v
                aber es funktioniert jetzt nicht, ich habe \ i bereits für \ "ersetzt, wie sie in der Erklärung von pico c erscheinen, aber das funktioniert nicht.
                was mache ich immer noch falsch
                Zuletzt geändert von Davejje; 11.04.2019, 16:51.

                Kommentar

                • Davejje
                  Extension Master
                  • 24.11.2017
                  • 173

                  #9
                  Niemand kennt eine Lösung?

                  Kommentar

                  • Jan W.
                    Lox Guru
                    • 30.08.2015
                    • 1398

                    #10
                    Wenn ich nur "mps" verwende, bekomme ich die Daten aus den ersten 3 Stunden von der API.
                    aber wenn ich die daten aus dem 2-block in der api (zwischen 3 und 6 uhr) haben möchte, muss ich den ersten block überspringen und dieser funktioniert noch nicht.
                    Um das X. Vorkommen in der XML Datei zu finden, kannst Du den Parameter "index" erhöhen, also z.B. WindSpeed3hXML = getxmlvalue(DataOne,1,"mps");

                    Aber wie schon in #3 geschrieben, halte ich das parsen mit "getxmlvalue" für ziemlich schlecht, denn es sucht nur das X. Vorkommen von z.B. "mps" und NICHT einen bestimmten Block in der XML Datei. Sollten die Blöcke mit den Uhrzeiten vertauscht sein, ein Block fehlen oder einer hinzugefügt worden sein, dann liefert die Suche mit "getxmlvalue" einen falschen oder keinen Wert.


                    Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
                    Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
                    Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
                    Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
                    Node-RED: IKEA Tradfri

                    Kommentar

                    • Davejje
                      Extension Master
                      • 24.11.2017
                      • 173

                      #11
                      @jJan W., ich habe das vielleicht übersehen. dann muss ich ein wenig genauer untersuchen, wie ich damit umgehe oder dass ich zu einem Json-Parser wechseln werde, was meine Absicht war. danke für deine nachricht

                      UPDATE:
                      Im Moment kann ich die Werte aus einer Json-Datei lesen. mit dem Befehl GetIntValue. Aber auch damit kann ich nicht zu einem anderen Zeitblock springen.

                      Code:
                      int temp = GetIntValue("\"temp\":", -99);
                      Zuletzt geändert von Davejje; 16.04.2019, 13:16.

                      Kommentar

                      • Jan W.
                        Lox Guru
                        • 30.08.2015
                        • 1398

                        #12
                        Json, GetIntValue ?? Irgendwie komme ich jetzt nicht mehr mit.
                        Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
                        Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
                        Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
                        Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
                        Node-RED: IKEA Tradfri

                        Kommentar

                        • Davejje
                          Extension Master
                          • 24.11.2017
                          • 173

                          #13
                          Zitat von Jan W.
                          Json, GetIntValue ?? Irgendwie komme ich jetzt nicht mehr mit.
                          Ja, ich habe dies auf Github aus einem anderen Beispiel gefunden. das funktioniert ohne mühe

                          Kommentar

                          Lädt...