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.

  • 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

  • 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!