Tasmota mit Websend Response - Problem mit Response Empfang

  • Hallo in die Runde,

    folgende Konfiguration: Habe eine Shelly1 und eine Sonoff 4CH mit Tasmota geflasht. Dazu jeweils ein Skript geschrieben, welches mit Websend eine php Seite aufruft. Dort kommt ein JSON String zurück, welches das Skript dann im >E Bereich abfängt.

    Funktioniert meistens, jedoch übernimmt er manchmal trotz richtigen Response der Webseite den Wert nicht in die Variable. Ich habe an einer Stelle schonmal einen Delay eingebaut, jedoch tritt der Fehler immer noch auf.

    Da sich dieser Fehler dann auch 2-3 Mal hintereinander ereignet, sollte das nicht an einer späteren Response der Webseite liegen, sonst würde er den Wert ja spätestens bei der zweiten Abfrage richtig übernehmen in die Variable. Aus gleichem Grund glaube ich nicht, dass ein Delay im >E Bereich helfen würde, oder gibt es da andere Meinungen?

    Hier ein Auszug aus der Konsole:


    Hier wird der Befehl richtig übernommen:

    09:50:00 RSL: stat/tasmota_FA565B/RESULT = {"Time":"2020-10-18T10:50:01","WERT":{"Action":0.000}}

    09:50:00 RSL: stat/tasmota_FA565B/RESULT = {"WebSend":"Done"}

    09:50:00 Befehl ist 0.00

    Hier wird der Wert 1.000 nicht in die Variable "Befehl" eingelesen:

    09:55:00 RSL: stat/tasmota_FA565B/RESULT = {"Time":"2020-10-18T10:55:01","WERT":{"Action":1.000}}

    09:55:00 RSL: stat/tasmota_FA565B/RESULT = {"WebSend":"Done"}

    09:55:00 Befehl ist 0.00

    Fehler wiederholt sich noch 2 Mal und dann klappt es doch:

    10:10:00 RSL: stat/tasmota_FA565B/RESULT = {"Time":"2020-10-18T11:10:01","WERT":{"Action":1.000}}

    10:10:00 RSL: stat/tasmota_FA565B/RESULT = {"WebSend":"Done"}

    10:10:00 Befehl ist 1.00

    10:10:00 laststate ist 0.00 VOR der Ausfuehrung

    10:10:01 Befehl nach Delay ist 1.00

    10:10:01 Script: performs "Power1 1 "

    10:10:01 RSL: stat/tasmota_FA565B/RESULT = {"POWER":"ON"}

    10:10:01 RSL: stat/tasmota_FA565B/POWER = ON

    10:10:01 laststate ist 1.00 NACH der Ausfuehrung

    Hier noch das Skript:

    Vielen Dank schonmal für eure Meinungen/Hilfe. Ich komme leider nicht mehr weiter. Fehler tritt bei DC als auch AC Betrieb auf, bei 3 Geräten.

    Viele Grüße

    Juri

  • das müsstest du debuggen um herauszufinden was passiert

    dann siehst du was für ein response in Tasmota wirklich ankommt.


    in "xdrv_01_webserver.ino" such diesen Quelltext und setzte die Debug Zeile ein


    #ifdef USE_WEBSEND_RESPONSE

    // Return received data to the user - Adds 900+ bytes to the code

    const char* read = http.getString().c_str(); // File found at server - may need lot of ram or trigger out of memory!

    uint32_t j = 0;

    char text = '.';

    while (text != '\0') {

    text = *read++;

    if (text > 31) { // Remove control characters like linefeed

    mqtt_data[j++] = text;

    if (j == sizeof(mqtt_data) -2) { break; }

    }

    }

    mqtt_data[j] = '\0';

    MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_CMND_WEBSEND));

    #ifdef USE_SCRIPT

    >>> hier einsetzen:

    AddLog_P2(LOG_LEVEL_INFO, PSTR(">>> Antwort vom Server: %s"),mqtt_data);

    extern uint8_t tasm_cmd_activ;

    // recursive call must be possible in this case

    tasm_cmd_activ=0;

    XdrvRulesProcess();

    #endif // USE_SCRIPT

    #endif // USE_WEBSEND_RESPONSE

  • Vielen Dank! Habe das mal so reingemacht, jedoch kommt hier die gleiche Antwort wie oben:

    10:10:00 RSL: stat/tasmota_FA565B/RESULT = {"Time":"2020-10-18T11:10:01","WERT":{"Action":1.000}}

    Wie gesagt, die Webseitenantwort war korrekt - die Variable hat aber komischerweise den falschen Wert bekommen.

    Einmal editiert, zuletzt von juriii (18. Oktober 2020 um 15:58)

  • ok, schreib mal direkt in >E einen print rein.

    >E

    result=99

    result=WERT#Action

    print EVENT: %result%

    eine delay nach Websend macht gar keinen Sinn. Websend ruft direkt >E auf mit dem Ergebnis von Websend

    Habe keine Erklärung warum der JSON falsch gelesen werden sollte.

    durch die Vorbesetzung mit 99 siehst du ob die Variable falsch gelesen wird oder überhaupt nicht gesetzt wird.

  • Danke nochmal für deine Antwort. Der JSON bleibt immer gleich seitens der php Seite, hier kann ich mir keine Fehlerquelle vorstellen.

    Habe zuerst in >D die Variable result statt 0 auf 2 gesetzt. Als der Fehler aufgetaucht ist:

    08:13:09 RSL: stat/tasmota_FA565B/RESULT = {"Time":"2020-10-19T09:13:09","WERT":{"Action":1}}

    08:13:09 RSL: stat/tasmota_FA565B/RESULT = {"WebSend":"Done"}

    08:13:09 Befehl ist 2.00

    Anscheinend wurde hier der Wert in Sektion >E nicht übernommen. Dann habe ich wie oben geschrieben in >E den Vorschlag eingetragen:

    08:25:00 RSL: stat/tasmota_FA565B/RESULT = {"Time":"2020-10-19T09:25:00","WERT":{"Action":1}}

    08:25:00 EVENT: 1.00

    08:25:00 RSL: stat/tasmota_FA565B/RESULT = {"WebSend":"Done"}

    08:25:00 EVENT: 99.00

    08:25:00 Befehl ist 99.00

    aber auch schon das hier bekommen:

    08:24:28 RSL: stat/tasmota_FA565B/RESULT = {"Time":"2020-10-19T09:24:28","WERT":{"Action":1}}

    08:24:28 EVENT: 99.00

    08:24:28 RSL: stat/tasmota_FA565B/RESULT = {"WebSend":"Done"}

    08:24:28 EVENT: 99.00

    08:24:28 Befehl ist 99.00

    Irgendwie werde ich aus all dem nicht schlau - vielleicht hat es mit der Firmware selbst zu tun, könnte ja sein dass dort ein Bug ist.

    Bei Github habe ich gerade etwas gelesen, vielleicht liegt es ja damit zusammen:

    scripting json parsing problems - first key/value pair unavailable #9475

    Einmal editiert, zuletzt von juriii (19. Oktober 2020 um 10:13)

  • also die Sektion >E wird ja auch bei Websend Done aufgerufen, da ist ja klar das result nicht gesetzt wird weil Action nicht im JSON drin ist.

    Um den Fehler jetzt genau zu zuordnen wäre es wichtig dass du mal den von mit vorgeschlagenen Debug mit ausgibst und den Konsolen Output hier postest.

    Dann können wir schliessen ob es am JSMN Decoder liegt der erst seit kurzen in Tasmota eingebaut wurde. Darauf bezieht sich der oben beschriebene bug der aber inzwischen behoben ist. (du benutzt hoffentlich die aktuelle developer Version)

  • Benutze Tasmota 8.5.1, hier noch die Core Version: 2_7_4_1/2.2.2-dev(38a443e)

    - oder hätte ich die Geräte mit Development 9 nochmals flashen sollen?

    Habe den Debug bereits drin gehabt, aber er gibt immer das Gleiche aus wie die Result Message. Habe es aber nochmals reingemacht und versuche den Fehler zu reproduzieren, dann stelle ich es hier rein.

    Danke!

    3 Mal editiert, zuletzt von juriii (19. Oktober 2020 um 11:42)

  • Ich muss diesen alten Thread mal aufwärmen, da ich dasselbe Problem habe. Allerdings ist die Tasmota-Version aktuell (11.1.0).

    Hier mein Test-Script:

    Die Rückgabe wird definitiv als JSON erkannt (Debugausgabe eingebaut). "res" wird aber nicht gesetzt:

    Code
    23:15:17.388 Script: performs "WebSend [192.168.10.70] Status 10"
    23:15:17.713 RSL: RESULT = {"WebQuery":{"StatusSNS":{"Time":"2022-06-03T23:15:17","MT175":{"Total":133.289,"Power":301,"Server_ID":"xxxxxxxxxxxxxxx"},"ENERGY":{"Today":3.79,"Yesterday":4.28,"Month":14.30,"Year":1208.29}}}}
    23:15:17.718 EVENT: 99.00
    23:15:17.721 RSL: RESULT = {"WebSend":"Done"}
    23:15:17.724 EVENT: 99.00

    Wenn ich jedoch res als String verwende und res=WebSend setze, dann klappt es. Eigentlich das von gemu2015 bereits erkannte Problem:

    also die Sektion >E wird ja auch bei Websend Done aufgerufen, da ist ja klar das result nicht gesetzt wird weil Action nicht im JSON drin ist.

    Code
    23:20:17.920 RSL: RESULT = {"WebQuery":{"StatusSNS":{"Time":"2022-06-03T23:20:17","MT175":{"Total":133.314,"Power":306,"Server_ID":"xxxxxxxxxxxx"},"ENERGY":{"Today":3.81,"Yesterday":4.28,"Month":14.32,"Year":1208.31}}}}
    23:20:17.923 EVENT: foo
    23:20:17.926 RSL: RESULT = {"WebSend":"Done"}
    23:20:17.928 EVENT: Done

    Ist dies ein Bug oder mache ich etwas falsch?

    Wie bekomme ich "MT175#Total" von einem anderen Tasmota-Device eingelesen (ohne globale Variablen oder MQTT)?

  • @dad401: Stehe vorm selben Problem.

    Denke due musst WebQuery an Stelle von WebStatus abfragen, das klappt zumindest mit dem POWER Befehl um den Relaiszustand abzufragen.

    Allerdings wieder nicht bei ENERGY...... Hab Section >T , >J , >U auch schon durch - ohne Erfolg. Vielleicht kann jemand weiterhelfen

    Hier noch die Konsolenausgabe der WebQuery Rückmeldung im Problemfall

    Code
    RSL: RESULT = {"WebQuery":{"StatusSNS":{"Time":"2022-06-05T10:44:46","ENERGY":{"TotalStartTime":"2022-05-30T16:28:04","Total":0.012,"Yesterday":0.011,"Today":0.001,"Power": 6,"ApparentPower":16,"ReactivePower":15,"Factor":0.40,"Voltage":236,"Current":0.068}}}}

    Einmal editiert, zuletzt von TestOsTeron (5. Juni 2022 um 14:15)

  • dad401, TestOsTeron


    hab mir euer Problem mal angesehen bez Status 10.

    Der Webquery ist 4 fach indiziert, der Decoder unterstützt bisher nur 3 Stufen.

    res=WebQuery#StatusSNS#MT175#Total

    wäre der richtige Zugriff, sind aber 4 Stufen.

    Habe einen universellen Decoder für beliebige Stufen schon drin aber noch nicht aktiviert. weil das einige Nebeneffekte haben könnte.

    Muss mir das mal in Ruhe ansehen. Kann ein paar Tage dauern.

  • d.h. die vorhandene Datei überschreiben , den parser einbinden, bulild auf Tasmota Device aufspielen und testen... mach mich mal dran. Berichte dann...

    ... getestet und funktioniert ;) . Herzlichen Dank für den mehr wie prompten Support. Melde es falls sich irgendwelche Sideffects auftun sollten.

    Aber das ist jetzt wirklich einfandfrei so. Endlich kann ich die Statusinfos anderer Tasmota Geräte einholen per Script. Bin echt schon am verzweifeln gewesen was ich falsch machen könnte, dabei lags nur an der Limitierung der Ebenen...

    DANKE!

    5 Mal editiert, zuletzt von TestOsTeron (5. Juni 2022 um 14:18)

  • Modifizierte Files / Definitionen von gemu2015 :

    xdrv_10_scripter.ino.zip

    #define USE_SCRIPT_FULL_JSON_PARSER in config_override

    Hier noch ein einfacher Beispielcode der dank der Modifikation von gemu2015 somit jetzt funktioniert:

    Bezüglich der GLOBALEN VARIABLEN:

    Da habe ich auch schon drangedacht aber noch nicht ausprobiert.

    Das musst du mir mal genauer erklären bzw. ich les mir das nochmal durch. Heisst das ich kann Deviceübergreifend eine globale Variable erstellen auf die alle Devices Zugriff haben?

    ==> Gemäss https://tasmota.github.io/docs/Scripting…riables-example muss ich die ja nur definieren und kann diese dann von überall aus lesen/schreiben? Ist das wirklich so simpel? Das heisst ich müsste im Script auf dem Device welches ich auslesen möchte den Wert in die Variable speichern und dann kann ich das von einem anderen Tasmota Device aus lesen...

    6 Mal editiert, zuletzt von TestOsTeron (5. Juni 2022 um 21:15)

  • TestOsTeron

    Ja du definierst eine Variable mit g: auf mehreren Geräten und wenn du sie auf einem Gerät beschreibst wird sie auf allen anderen Geräten upgedated.

    Allerdings sollte nur immer ein Gerät diese Variable beschreiben und die anderen nur lesen sonst gäbe es PingPong Effekte.

    so stelle ich z.B. Sensoren dem ganzen Haus zu Verfügung.

  • ja das würde in meinem Fall passen. Danke für den Tipp! Wird auch mal ausprobiert.. Dann spart man sich tatsächlich den Websend und Auslesekruscht :)

    EDIT: So habs mit den globalen Variablen ausprobiert. Funktioniert ebenfalls einwandfrei... Mann und da hab ich mir tagelang den Kopf zermartert und dabei war es soo einfach... selbst ohne WebSend....

    Einmal editiert, zuletzt von TestOsTeron (5. Juni 2022 um 20:08)

  • TestOsTeron

    kurze Anmerkung zu Globalvariablen:

    Bei ESP32 Geräten (nicht bei ESP8266) gibt es wegen multitasking gelegentlich Probleme mit globalen Variablen. (UDP stürzt ab)

    der Workaround geht so:

    >D

    ; udp timeout timer

    t:udpt=30

    >S

    ; upd timeout

    if udpt==0 {

    ; reset global variable handler

    gvr

    udpt=30

    }

    >G

    ; reset udp timer

    udpt=30

    Einmal editiert, zuletzt von gemu2015 (28. März 2023 um 08:09)