Script: weitere Frage zu json-Response bzw. korrekten URL Aufruf

  • Hallo!
    Ich habe Fragen zum Abholen von Daten aus dem Internet mit Tasmota Script (nicht Rules).

    1)

    wo sind die Unterschiede von

    - websend
    - webquery (nutze ich für Daten nach google Sheets zu senden)
    - http ( "URL" "Parameter") (nutze ich für Daten zu holen)
    ? bzw bekommt man von allen den Response?

    2)
    Geht das auch mit https Adressen? Oder braucht man dafür SCRIPT_GET_HTTPS_JP ?

    3) ich möchte das mit http://api.openweathermap.org/data/2.5/weath…2bdab445703646c
    hinbekommen. Obwohl ich andere Seiten schon schaffe, klappt es hier nicht.

    4)
    Kann ich solche Adressen vorher unter >D oder >D aus mehreren Bestandteilen zusammensetzen? Um API-Key und Ort rauszutrennen?

    Oft sind diese Themen schon behandelt worden, aber meist für Rules oder andere Sachverhalte.

    Danke wie immer für Eure Tipps!

  • Zur hilfreichsten Antwort springen
  • Danke euch für die Antworten!

    Leider fehlt mir das Verständnis aus Rules etwas für Script zu ziehen.

    karoCB :

    Zu 1)

    bezogen auf https? Weil http ja gut mit http (URL Parameter)

    Hast du ein Beispiel wie ich mit webquery eine Antwort erhalte und verarbeite?


    Zu 3) habe http Response die deutlich länger sind und klappen.

    Wenn er für den json dekoder zu lang ist müsste er aber trotzdem eine Antwort geben die ich ggf anders auseinander nehmen kann . Ich schaffe es aber nichtmal eine Antwort zu erhalten. Irgendwas mache ich falsch.

    Ein Beispiel wäre daher nett


    4) ich glaube unter >D geht es nicht direkt. Aber ich probiere es jetzt erstmal unter s, sollte reichen.



    Danke nochmals!

  • Ich komme mit aktuellen Release 13.1. auf einem ESP32C3 nur mit einem gwr(":" 13) Daten nach deiner Vorstellung raus, da nur noch ein einstelliger Delimiter funzt.

    =>> Wetterdaten selektiv auslesen !

    >D 40
    SB=8192
    xx=0
    sres=""
    var2=0

    >S
    if upd[var2]>0
    then
    print Datenanforderung
    =>webquery http://api.openweathermap.org/data/2.5/weath…etric&appid=d2a........... GET
    endif

    >E
    ; lese JSON aus
    sres=gwr(":" 13 ,)
    print Daten: %sres%
    print Temp: %sres%

    >W
    bu(var2 "fertig" "Daten laden" )

  • Nach einem Fehler von mir hab ich das nun nachvollziehen können. DANKE DANKE DANKE!

    Es klappt sehr gut, ist performant und hilft mir extrem!

    Damit habe ich nun ein super Tor/Weg für viele schöne weitere Daten!

  • 2000ede 6. Januar 2024 um 18:07

    Hat einen Beitrag als hilfreichste Antwort ausgewählt.
  • karoCB  

    kann ich
    =>webquery http://api.openweathermap.org/data/2.5/weath…etric&appid=d2a........... GET
    auch an der Stelle es in eine variable packen? (vieleicht wie gemu2015 es hier für Rules geschrieben hat (verstehe aber nicht wie man das in skript portiert):

    "on Button4#State do Backlog VAR1 -100 websend [api.openweathermap.org] /data/2.5/weather?q=Cottbus,de&units=metric&appid=ada01f72c79beccce endon"

    Dann könnte ich an der Stelle auch direkt gwr einsetzen, was ohne dem wohl erst unter >E geht.

    Dies ist aber für mich nicht möglich, da ich unter S: mehrere json-Adressen aufrufe (die ich häufiger abrufe und die relevante durch eine Scheife jede Stunde nur aufrufe).
    Ich hoffe, mein Vorgehen und mein Problem ist verständlich beschrieben.


    NUR(!) P.S.:
    vielleicht meintest du das auch, aber das verstehe ich erst jetzt:

    ups, ich hatte mich gefragt, wieso funktioniert meine abfrage mit dem längeren json und weiter rumprobiert....

    1) jetzt geht es auch mit dieser URL die Felder sauber zu parsen (was vorher anders war weiss ich nicht mehr so genau).

    2) aber mit diesem Weg klappt es, Arrays-Felder aus json herauszubekommen (was mit dem saubern parsen nicht geht)

  • Nur zur Info bez openweathermap etc.

    Habe jetzt eine Lösung eingebaut auch sehr grosse Webseiten auszulesen z.B. weatherforecast (16 kb)

    Das geht über den Umweg das die Seite in eine lokale Datei eingelesen wird und dann mit einem neuen Datei Suchbefehl die Datei ähnlich gwr() durchsucht werden kann.

    Das benötigt kaum RAM Speicher und geht auch auf ESP8266 mit Dateisystem


    einlesen der Datei

    Code
    fres =fo("/web.txt" w)
    res=frw(fres "api.openweathermap.org/data/2.5/forecast?lat=44.34&lon=10.99&appid=f6c....")
    print erbenis: %res%
    fc(fres)


    einige werte auslesen

    Code
    fres=fo("/web.txt" r)
    for cnt 1 24 1
    dtime =fcs(fres "dt_txt\":" cnt ,)
    sres=fcs(fres "temp\":" cnt ,)
    print >>> %dtime% - %sres%
    next
    fc(fres)
  • sehr interessant und wie immer danke für dein großes Engagement sogar etwas nachzustellen!

    Mich interessiert aber auch noch die "kleine" Lösung - sprich die Fragen aus meinem vorherigen Beitrag direkt hier drüber. Wenn das nicht geht, ist auch ok!

  • Variable in dem Fall !

    >D 40
    SB=8192
    xx=0
    sres=""
    var2=0
    ort="Cottbus"

    >S
    if upd[var2]>0
    then
    print Datenanforderung
    =>webquery http://api.openweathermap.org/data/2.5/weather?=q%ort%de&units=metric&appid=d2a5..... GET

    endif

    >E
    ; lese JSON aus
    sres=gwr(":" 13 ,)
    print %ort%: %sres%
    print Temp: %sres%

    >W
    bu(var2 "fertig" "Daten laden" )

    3 Mal editiert, zuletzt von karoCB (7. Januar 2024 um 15:27) aus folgendem Grund: auf der Console das Ergebnis beobachten nach dem die eigene appid= eingesetzt wurde !

  • Hallo karoCB ,
    vielleicht musst du mit mir noch etwas mehr Geduld haben :)

    Ich will ja jede Stunde einmal diese Daten abholen (und nicht auf Abruf) - im Pulk mit anderen Daten und auch Daten die ich alle 3 Sekunden hole (Stromdaten).
    Den Teil unter S packe ich in jeweils entsprechenden if Schleifen - das kann ich unter > E ja nicht und nicht gleichzeitig machen.
    Er würde sich also etwas unter E unterstündlich von einem anderen webabruf holen (sres=gwr(":" 13 ,)).
    Ich würde gerne den gwr Abruf, wie es bei http Seiten und nicht json funktioniert unter >S haben - da ist es dann in der Schleife mit drin.
    Dies geht aber wohl nur, wenn webquery direkt in eine variable geht. So klappt es wenigstens wie gesagt mit den http Abrufen.

    Sorry, wenn ich das nicht richtig ausdrücken kann.

    • Hilfreichste Antwort

    dann hier die Kopie der Idee umgesetzt mit rflg>0

    >D 40

    sres=""
    rflg=0

    >S
    ; alle 5 sekunden
    if upsecs%5==0
    then
    print Datenanforderung
    =>webquery http://api.openweathermap.org/data/2.5/weath…6c325955e63a1c5 GET
    rflg=1
    endif


    >E
    ; lese JSON aus
    print event
    if rflg>0
    then
    sres=gwr("temp\":" 2)
    sres=st(sres , 1)
    print Temp: %sres%
       
    sres=gwr("temp_min\":" 2)
    sres=st(sres , 1)
    print Min Temp: %sres%
       
    sres=gwr("temp_max\":" 2)
    sres=st(sres , 1)
    print Max Temp: %sres%
       
    rflg=0
    endif

  • 2000ede 8. Januar 2024 um 15:08

    Hat einen Beitrag als hilfreichste Antwort ausgewählt.
  • Hallo zusammen,
    hallo karoCB ,

    Ich habe noch einmal Grundsatz Fragen:

    Ich möchte die beiden Abfragen

    A) webquery

    B) http

    verstehen und vergleichen. Setze sie schon verschieden erfolgreich ein, habe sie aber noch nicht voll verstanden.

    bei A (wenn aktiviert und B deaktiviert)
    - funktioniert dieses Beispiel leider nicht

    bei B
    - funktioniert die Variable V_1
    - funktioniert nicht die Variable V_2

    Wie bekomme ich bei A und B beide Variablen gefüllt.
    Der Gegenrechner ist ein Tasmota und die Abfrage ist der Standardexport.

    Danke für die Rückmeldungen!