Tasmota mit Websend Response - Problem mit Response Empfang

  • Ich wollte soeben den neuen Parser mal ausprobieren - leider komme ich nach Austausch der Datei nicht weiter (Clean All, Cache gelöscht etc. - half nicht).

    Code
    Linking .pio/build/tasmota-scriptweb/firmware.elf
    /home/marcus/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld: .pio/build/tasmota-scriptweb/src/tasmota.ino.cpp.o:(.text._Z5isvarPcPhP7T_INDEXPfS_P5GVARS+0x194): undefined reference to `JsonParsePath(JsonParserObject*, char const*, char, float*, char*, unsigned int)'
    /home/marcus/.platformio/packages/toolchain-xtensa/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld: .pio/build/tasmota-scriptweb/src/tasmota.ino.cpp.o:(.text._Z5isvarPcPhP7T_INDEXPfS_P5GVARS+0x59b): undefined reference to `JsonParsePath(JsonParserObject*, char const*, char, float*, char*, unsigned int)'
    collect2: error: ld returned 1 exit status
    *** [.pio/build/tasmota-scriptweb/firmware.elf] Error 1

    Versteh ich gerade nicht, warum der Linker die Funktion nicht findet. Ohne #define USE_SCRIPT_FULL_JSON_PARSER klappt alles.

    EDIT:

    Ok - er findet die Funktion nicht, weil ich z.B. #define SUPPORT_MQTT_EVENT nicht konfiguriert hatte. Erst damit wird JsonParsePath übersetzt. Müsste man ggf. in support.ino noch ergänzen, aber dass ist ja erstmal ein Test hier.

    Ich berichte wie es funktioniert.

    2 Mal editiert, zuletzt von dad401 (10. Juni 2022 um 00:24)

  • Auf die Schnelle - es klappt auch hier. Super - ich will das wirklich ohne globale Variablen lösen. Es soll einfach nur eine Anzeige auf einem Display sein, welche mir die Werte eines anderen Devices (welches ohne globale Variablen geflasht ist) gelegentlich ausgibt.

    Ergebnis:

    Code
    00:29:43.428 Script: performs "WebSend [192.168.10.70] Status 10"
    00:29:43.556 RSL: RESULT = {"WebQuery":{"StatusSNS":{"Time":"2022-06-10T00:29:43","MT175":{"Total":166.191,"Power":300,"Server_ID":"xxxxxxxxxxxxx"},"ENERGY":{"Today":0.15,"Yesterday":5.26,"Month":47.20,"Year":1241.19}}}}
    00:29:43.569 EVENT: 166.19
    00:29:43.574 RSL: RESULT = {"WebSend":"Done"}
    00:29:43.578 EVENT: 166.19

    Und das Script:

  • Exakt das was ich auch gerade versuche, an den globalen Variablen aber scheitere. Es klappt einfach nicht.

    Auf welchem Gerät läuft Dein Script? Auf dem welches den Wert auch anzeigen soll?

    Wo liegt mein Denkfehler?

    Das Script macht Websend an das Device an der PV-Anlage, dort wird Status 10 ausgeführt.

    Wie kommt der Wert zurück zum anfragenden Gerät an dem das Display angeschlossen ist?

    Es klappt einfach nicht...

    Einmal editiert, zuletzt von dcx (10. Juni 2022 um 07:02)

  • der neue JSON Parser ist inzwischen auch in der letzen Tasmota dev.

    Man muss ihn nur einschalten damit man mehr als 3 Stufen JSON messages hat

    #define USE_SCRIPT_FULL_JSON_PARSER 


    das sollte man auch einschalten

    #define SUPPORT_MQTT_EVENT 

    #define USE_WEBSEND_RESPONSE

    Websend hat den Vorteil dass man damit auch Tasmota Geräte auslesen kann die kein Scripting enthalten.

    Da es sich um TCP handelt werden die Werte auch sicher gelesen. Allerdings nur wenn der Empfänger gut zu erreichen ist.

    Wenn nicht kann es sein dass der Sender bei Zugriff auf das WebUI feststeckt.

    Bei Globalvariablen geht die Übertragung über UDP. Dabei ist die Übertragung nicht garantiert bei schwachen Signalen. Es kann also manchmal ein Wert verloren gehen. Dafür kann der Sender aber niemals stecken bleiben.

    Ausserdem muss hier keine IP Adresse des Empfängers bekannt sein.


  • dcx

    hab Deinen anderen Thread auch mal eben kurz überflogen.

    Da stand glaub aber nichts von einem Websend?

    Will mich da gar nicht groß einmischen, da ich mich mit scripting nicht weiter befasst hab.

    Aber Du bist sicher das im abzufragenden Tasmota Gerät auch

    #define USE_WEBSEND_RESPONSE

    mit einkompiliert ist? ( siehe Thread Titel )

    EDIT:

    o.k. gemu2015 war schneller

    benzino77 Tasmocompiler

    Gitpod Master Release

    Gitpod Development Release

    Sonoff-Basic / Sonoff-RF / Sonoff-Touch / Sonoff S20 / PowStro Basic / MagicHome / Sonoff-RF-Bridge mit diversen 433MHz RF Sender/Empfänger / Shelly_1 / ESP-WiFi-Dimmer / Gosund SP111 / ESP12E / WEMOS D1 Mini / ESP32Cam

    Sensoren: BME280/BMP280/HC-SR501/HC-SR04/ACS712/INA219/MHZ19B/DS3231

    Alexa Sprachsteuerung

    mosquitto/bash/html/cgi auf Wyse5070

  • Nun funktioniert es, sowohl WebSend/WebQuery als auch die GlobVars. Dickes Dankeschön an die Experten hier und danke für Eure Geduld mit mir, das Thema ist doch etwas kompliziert und es hat ein paar Tage gedauert bis ich dahinter gestiegen bin ;)

    Falls noch jemand das umsetzen möchte, hier zusammenfassend nochmal wie ich es gelöst habe:

    - Aktuelle Development-Firmware v11.1.0.4 mit TasmoCompiler erstellt, Haken bei "Script" gesetzt und folgende zusätzliche Parameter ausgewählt:

    Code
    #define USE_SCRIPT_GLOBVARS
    #define USE_SCRIPT_FULL_JSON_PARSER
    #define USE_WEBSEND_RESPONSE
    #define USE_SCRIPT_WEB_DISPLAY
    #define SUPPORT_MQTT_EVENT

    Damit kann ich nun die Temperaturwerte von 2 Geräten auf dem jeweils anderen mit anzeigen lassen,

    hier über die globalen Variablen:

        

    Das Skript dazu (so5 wie so3 nur andersrum mit den Werten)

    Mein Sonoff DUAL R3 v2 welche die Leistungswerte der PV-Anlage erfasst ist ein ESP32 und läuft mit unmodifizierter Tasmota32.bin

    Diesen Frage ich über Websend/WebQuery alle 30 Sekunden ab und lasse den Wert auf einem ESP8266 mit integriertem OLED-Display darstellen, außerdem die beiden Temperaturwerte der globalen Variablen gleich mit.


    Alles in allem eröffnet das natürlich viele neue Möglichkeiten, daher freue ich mich das es nun läuft! Danke nochmal!

  • Sehr schön, wenn das jetzt bereits offiziell in der Dev-Version dabei ist. Da wurde auch umstrukturiert. Alle Treiber/Sensoren etc. sind nun in eigenen Ordnern...

    dcx

    Lass Dein OLED-Display aber nicht dauerhaft durchlaufen - die gehen mit der Zeit kaputt. Mein eigentlicher Anwendungsfall ist ja ein Temperatursensor an einem Tasmota-Gerät, welchen ich auf einen anderen Tasmotagerät anzeigen lassen will. Dort baue ich mir einen Taster an, der das Display weckt.

    Mein letztes Anzeigegerät (dauerhaft, OLED) hielt ca. 1,5 Jahre bis Pixel ausgefallen sind.

  • Habe schon mehrere OLEDS verheizt. Am schlechtesten war ein Farb OLED das hat nur ein paar Wochen gehalten.

    Bei Dauerbetrieb werden die immer dunkler bis man gar nichts mehr erkennen kann.

    Habe mehrere Epaper Displays das älteste is jetzt 4 Jahre und Immer noch perfekt.

    Bei einem LCD habe ich einen Abstandssensor davor der das Display einschaltet sobald man sich nähert und dann nach einer Minute wieder aus.

    Das hat sich bewährt.

  • Ja, Dank Tasmota und einem Script möchte ich das auch demnächst (Gehäuse muss ich noch drucken) mit einem APDS9960 verbauen. Klappt im Versuchsaufbau sehr gut.

    Die OLEDs (0,96er, nehme jetzt aber ein 1,3") waren halt immer sehr günstig - eine kurze Suche nach ePaper mit I2C zeigt da etwas höhere Preise.

    Aber nochmal zurück zu USE_SCRIPT_FULL_JSON_PARSER - ich verwende kein MQTT und habe SUPPORT_MQTT_EVENT auskommentiert.

    Müsste in support.ino nicht noch folgende Änderung rein?

    Code
    streiche:
    #if ( defined(USE_SCRIPT) && defined(SUPPORT_MQTT_EVENT) ) || defined (USE_DT_VARS)
    
    setze:
    #if ( defined(USE_SCRIPT) && defined(SUPPORT_MQTT_EVENT) ) || defined (USE_DT_VARS) || defined (USE_SCRIPT_FULL_JSON_PARSER)

    Ansonsten kann ich die Funktionalität nur nutzen wenn ich MQTT_EVENT oder DT_VARS konfiguriere...

  • Hallo zusammen.

    Ich hänge an einem Problem mit dem

    WebQuery#.... im Tasmota Scripting.

    Grundsätzlich läuft es mit vielen Quellen,

    aber nicht mit dem Shelly 1PM.

    Der Shelly antwortet auf das WebSend,

    jedoch kann ich nicht alle Werte mit

    ermitteln.

    p=WebQuery#meters#power

    funktioniert nicht, da in der Json Antwort

    eckige Klammern vorkommen.

    "meters":[{"power":477.49,"overp...}]

    Ich bin im Netz nicht fündig geworden.

    Kann mir mit der WebQuery Auswertung

    jemand weiter helfen?

    Danke schon mal - Mario

    Raspberry mit iobroker und Yahm, HM-Heizkörperthermostate, diverse Sonoff's und eigene Kreationen mit dem ESP8266.

  • Ja, der ist an.

    Grundsätzlich funktioniert es ja.

    Ich rufe schon 2 Gerät so ab.

    Der Shelly hat in seiner Antwort aber eckige Klammern.

    Damit komme ich nicht klar.

    Shelly fasst in den [{...}] die Kanäle zusammen. Der Shelly 2.5 hat 2 Blöcke mit [].

    Raspberry mit iobroker und Yahm, HM-Heizkörperthermostate, diverse Sonoff's und eigene Kreationen mit dem ESP8266.

  • Ja, das ist richtig, wenn du zwischen

    Tasmota-Geräten Daten austauschen

    willst. Ich benötige aber auf einem

    Tasmota die Daten von einem originalen

    Shelly 1PM. Den iobroker muss ich umgehen, da am späteren Einsatzort nur die beiden Geräte, der Tasmota und der Shelly 1PM, im WLAN existieren.

    Raspberry mit iobroker und Yahm, HM-Heizkörperthermostate, diverse Sonoff's und eigene Kreationen mit dem ESP8266.


  • die richtige Abfrage Syntax wäre aber ohnehin so:

    p=WebQuery#meters[0]#power

    eventuell geht das ja

    oder versuch ob du den Wert in Klammer in einen String einlesen kannst

    str=WebQuery#meters[0]

    und analysiere dann den String weiter


  • Hallo zusammen,

    hierzu habe ich auch ein Problem.

    Meine Rademacher-Rollo-Aktuatoren kann ich mit WebQuery und WebSend ansprechen. Wie oben beschrieben kommt bei mir auch die Rückmeldung mit den eckigen Klammern. Das hoch und runterfahren des Rollos über den PUT Befehl geht.

    Antwort bei WebQuery

    10:07:40.529 Script: nv=4, tv=1, vns=25, vmem=144, smem=16384

    10:07:40.951 Script: performs "WebQuery http://172.16.55.209/devices/1010000 GET"

    10:07:41.472 RSL: RESULT = {"WebQuery":{"error_description":"OK","error_code":0,"payload":{"device":{"capabilities":[{"name":"WIND_STOP_CMD","r... 6015 truncated

    10:07:41.480 test

    10:07:41.482 99.00

    10:07:41.489 RSL: RESULT = {"WebQuery":"Done"}

    10:07:41.491 Done

    10:07:41.494 0.00

    Antwort bei WebSend

    10:13:56.980 Script: nv=4, tv=1, vns=25, vmem=144, smem=16384

    10:14:00.956 Script: performs "WebSend [172.16.55.209] /devices/1010000"

    10:14:01.393 RSL: RESULT = {"WebQuery":{"error_description":"OK","error_code":0,"payload":{"device":{"capabilities":[{"name":"WIND_STOP_CMD","r... 6015 truncated

    10:14:01.400 test

    10:14:01.402 99.00

    10:14:01.407 RSL: RESULT = {"WebSend":"Done"}

    10:14:01.410 test

    10:14:01.412 99.00

    Hier noch der Response vom Rademacher-Aktuator

    {"error_description":"OK","error_code":0,"payload":

    {"device":

    {"capabilities":

    [

    {"name":"WIND_STOP_CMD","read_only":false,"timestamp":-1},

    {"name":"SET_SLAT_POS_CMD","min_value":"0","max_value":"100","step_size":"1","read_only":false,"timestamp":-1},

    {"name":"INC_CMD","read_only":false,"timestamp":-1},

    {"name":"PROD_CODE_DEVICE_LOC","value":"35000662","read_only":false,"timestamp":-1},

    {"name":"GOTO_VENTIL_POS_CMD","read_only":false,"timestamp":-1},

    {"name":"REACHABILITY_EVT","value":"true","read_only":true,"timestamp":1684472895},

    {"name":"CONTACT_OPEN_CMD","read_only":false,"timestamp":-1},

    {"name":"NAME_DEVICE_LOC","value":"Büro","read_only":false,"timestamp":-1},

    {"name":"REVERS_ON_POS_CFG","value":"false","read_only":false,"timestamp":1684472895},

    und viele weitere

    ],

    "scenes":

    [

    {"id":5033,"name":"x Büro halb zu","description":"Weihnachten"},

    {"id":5034,"name":"x Büro halb auf","description":"Weihnachten"},

    {"id":5035,"name":"x Büro und Treppenhaus ganz zu","description":"Weihnachten"},

    {"id":5037,"name":"x Büro ganz auf","description":"Weihnachten"}

    ]

    }

    }

    }

    Einmal editiert, zuletzt von Andispunkt (20. Mai 2023 um 11:38)

  • Hallo,

    ich bin gerade wieder am basteln und stehe auch vor dem Problem, eine JSON-Abfrage auszuwerten, welche quasi keine benannten Felder hat, z.B. diese hier von AHOY DTU:

    22:48:01.964 RSL: RESULT = {"WebQuery":{"id":0,"enabled":true,"name":"HM-400","serial":"xxxxxxxxx","version":"10010","power_limit_read":100,"ts_last_success":1686857187,"ch":[[235.1,0,0,50.02,0,16.2,590.892,1549,1.3,0,0],[27.7,0.05,1.3,1549,590.892,0.286]],"ch_name":["AC",""],"ch_max_pwr":[null,455]}}

    Ein Zugriff auf die 235.1 geht leider nicht so - das scheint der Parser nicht zu verstehen:

    res=WebQuery#ch[0][2]

    Als "Wurgaround" geht folgendes:

    Gibt es ggf. doch einen Trick oder eine bessere Lösung wie man "fremde" JSON-APIs (besser) auswerten kann?

    Ergänzend noch eine Frage:

    Wie kann man eigentlich mehrere WebQuerys/http-Anfragen durchführen/unterscheiden?

  • Hier mal meine Lösung mit gwr und WebQuery (Abfrage eines Tasmota Devices und einer JSON REST API eines anderen Devices).

    Manchmal hilft es ja dem anderen als Beispiel.