Tasmota An-/aus-Zustand mit JavaScript abfragen

  • Ich kann zwar kein Java nur ein bisschen Python, bin aber sicher, dass es unter Java ähnlich geht:

    Schicke das Statement http://IP.../cm?cmnd=status an das Gerät. Die Antwort ist ein JSON-String in der Form

    Code
    {"Status":{"Module":1,"DeviceName":"Schalter","FriendlyName":["Schalter"],"Topic":"Schalter","ButtonTopic":"0","Power":0,"PowerOnState":3,"LedState":1,"LedMask":"FFFF","SaveData":1,"SaveState":1,"SwitchTopic":"0","SwitchMode":[0,0,0,0,0,0,0,0],"ButtonRetain":0,"SwitchRetain":0,"SensorRetain":0,"PowerRetain":0}}

    Mit einem entsprechende JSON Parser fischt du dir den Wert von Status['Power'] raus und weist in einer Variablen zu. In der steht entweder 0 (aus) oder 1 (an). Damit kannst du weiter arbeiten.

  • Erst einmal vielen Dank für die Antwort, lieber Jörg.

    Verstanden habe ich, dass ungeklärt ist, wie JavaScript den JSON-String übernimmt. Dass es ein JSON-String ist, scheint mir hingegen sicher zu sein. Wenn ich die URL direkt in den Browser eingebe, bekomme ich die gewünschten Werte zurückgemeldet. Aufgrund meiner Unerfahrenheit schaffe ich es aber nicht den String in eine JavaScript-Variable zu übernehmen. Danach käme ich wahrscheinlich klar.


    Hat jemand weitere Ideen?

  • Also ich mache es wie Jörg und lese das ganze in ein Python JSON Objekt ein und nutze dann einen Standardparser und fische den Wert raus.


    Beispielcode dazu hab ich mir ergoogelt und mich Rrangetastet. Bin auch kein erfahrener Python Programmierer

  • Hi.


    normalerweise macht man das so in Javascript:


    Der Respont steht dann in der Variable "this.responseText" und wird mit JSON.parse auf den gewünschten Parameter geparst.

    Allerdings funktioniert das nach meinen Test mit Tasmota nicht. Der Repsonse bleibt immer leer....

    Kommt zum einen kein status "200" als Antwort und wenn man den raus nimmt kommt auch nix. Komisch.

    benzino77 Tasmocompiler

    Gitpod Master 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 u. mosquitto/bash/html/cgi auf RPI 2B+

  • Ich bin hochgradig beeindruckt. DANKE!!!!


    Mittlerweile habe ich einen Grundkurs JavaSkript im Internet angesehen und auf dieser Basis die wirklich schlechte Anleitung von HTTP-Shortcuts halbwegs verstanden. Der Erfolg ist ein funktionierendes Skript. Ich benötige zur Unterscheidung von an und aus nur den 43. Buchstaben:


    vibrate();

    // Beispielrückmeldung 1: Congratulations! You've fired the meross1_aus event

    // Beispielrückmeldung 2: Congratulations! You've fired the meross1_an event

    const myBody = response.body.charAt(43);

    // bei aus: 'u', bei an: 'n'

    let g1 = 'n';

    if (myBody === g1) {

    renameShortcut('', 'Roter Stern (an)'); speak('Der rote Stern ist an', 'de');

    } else {

    renameShortcut('', 'Roter Stern (aus)'); speak('Der rote Stern ist aus', 'de');

    }


    Das funkioniert: "Roter Stern" wechselt zwischen "an" und "aus", eine Stimme spricht zusätzlich diese Information.


    Vielleicht hilft das jemandem.

  • Ich kann zwar kein Java nur ein bisschen Python, bin aber sicher, dass es unter Java ähnlich geht:

    Schicke das Statement http://IP.../cm?cmnd=status an das Gerät. Die Antwort ist ein JSON-String in der Form

    Code
    {"Status":{"Module":1,"DeviceName":"Schalter","FriendlyName":["Schalter"],"Topic":"Schalter","ButtonTopic":"0","Power":0,"PowerOnState":3,"LedState":1,"LedMask":"FFFF","SaveData":1,"SaveState":1,"SwitchTopic":"0","SwitchMode":[0,0,0,0,0,0,0,0],"ButtonRetain":0,"SwitchRetain":0,"SensorRetain":0,"PowerRetain":0}}

    Mit einem entsprechende JSON Parser fischt du dir den Wert von Status['Power'] raus und weist in einer Variablen zu. In der steht entweder 0 (aus) oder 1 (an). Damit kannst du weiter arbeiten.


    Hier mal ein Auszug aus meinem Code für mein daily backup; etwas gekürzt und die privaten Daten anonymisiert :)

    Ohne try/except, aber das kann man einbauen. So schon lauffähig, wenn Mem1 und Mem2 gesetzt sind.


  • So ... hat mich jetzt doch noch interessiert wie es mit Tasmota schön zu lösen ist. Vielleicht interessiert ja jemanden.


    Mit fetch, das ja XMLHttpRequest ablöst, hier nun ein Beispiel wie man den Response erhält und auswertet.

    Allerdings muss für fetch in Tasmota CORS freigegeben werden.

    In der Konsole, für alle Locations:

    CORS *


    EDIT:

    nachdem CORS aus Sicherheitsgünden standartmäßig nicht mehr in der FW enthalten ist, sollte man für den Respond:

    #define USE_WEBSEND_RESPONSE

    mit einkompilieren.



    HTML:

    - Beispiel IP ist 192.168.1.170

    - der geparste output für Power steht in der Variablen PowerStatus.POWER (.POWER stell den Pararmeter dar der geparst wird)

    - Ausgabe erfolgt im Beispiel als PopupFenster


    benzino77 Tasmocompiler

    Gitpod Master 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 u. mosquitto/bash/html/cgi auf RPI 2B+

    3 Mal editiert, zuletzt von HoerMirAuf ()

  • Vielen herzlichen Dank; Es funktioniert tadellos. Habe es auch für andere responses probiert und super !! :)

  • Hallo miteinander und speziell HoerMirAuf,

    ich hänge da fest wo das schöne JavaScript mit der fetch Funktion in ein Tasmota Script eingebunden werden kann.

    Konkret hätte ich gerne den aktuellen Verbrauch meiner Tasmota Gosund Sp1 abgefragt und in eine Variable auf einem anderen Tasmotagerät geschrieben.

    Tasmota habe ich auf dem "Empfänger" erfolgreich mit CORS kompiliert. Die SP1 läßt sich über Firefox mit dem Aufruf von http://192.168.7.161/cm?cmnd=Status%2010 mit allen relevanten Werten abfragen und liefert dann

    Code
    {"StatusSNS":{"Time":"2023-02-07T15:08:53","ENERGY":{"TotalStartTime":"2022-10-31T18:33:35","Total":78.518,"Yesterday":1.436,"Today":1.872,"Power":236,"ApparentPower":236,"ReactivePower":0,"Factor":1.00,"Voltage":234,"Current":1.007}}}

    Dort bräucht ich den Wert "Power", der im Beispiel 236 Watt beträgt.

    Über die genaue Syntax und Stelle in Tasmota Script (nicht Berry, da ESP 8266) wäre ich sehr erfreut.

  • Hi ...


    Soll das Tasmota Empfänger sich einen Wert vom Tasmöta Sender direkt abholen? Oder wie konkret meinst du das?


    Da wäre dann dieser FRED interessant:

    benzino77 Tasmocompiler

    Gitpod Master 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 u. mosquitto/bash/html/cgi auf RPI 2B+

  • Ja genau, konkret habe ich einen Lesekopf für meinem Stromzähler, der mit Tasmota läuft und über Tasmota Script schon vieles kann und dann die Daten vom Gosund SP1 anfordern soll.

    Ich dachte an eine Zeile in der Art:

    fetch http://192.168.7.161/cm?cmnd=Status%2010 , verarbeite weiter mit json.parse und schreibe den Wert von "Power" in die Variable aktpwr. Mit der Variable würde ich dann gerne weiter rechnen, oder sie zumindest in der WebUI darstellen.

  • Hm, ich habe #define USE_WEBSEND_RESPONSE

    nun eingebunden, die anderen Websend Befehle im Script bekommen eine Super Response, nur zum Gosund SP1:


    17:04:24.418 Script: performs "Websend [http://192.168.7.161]/cm?cmnd=Status 10"

    17:04:29.650 RSL: RESULT = {"WebSend":"Connect failed"}

    So geht es mit allen Tasmota Geräten.


    Über WebQuery bekomme ich Results aber die werden anscheinend anders als Websend Results von der Response Definiton nicht mit abgedeckt:

    20:41:07.402 Script: performs "WebQuery http://192.168.7.161/cm?cmnd=Status+8 GET"

    20:41:07.694 RSL: RESULT = {"WebQuery":{"StatusSNS":{"Time":"2023-02-07T20:41:07","ENERGY":{"TotalStartTime":"2022-10-31T18:33:35","Total":78.830,"Yesterday":1.436,"Today":2.184,"Power":0,"ApparentPower":12,"ReactivePower":12,"Factor":0.02,"Voltage":233,"Current":0.052}}}}

    20:41:07.699 RSL: RESULT = {"WebQuery":"Done"}

  • 17:04:29.650 RSL: RESULT = {"WebSend":"Connect failed"}

    Ich kann leider nichts zu script sagen.


    Aber schaut aus als sein dein websend syntax falsch.


    websend [<IP>:<PORT>.<USER>:<PASSWORD>] status 1


    Beispiel für direkt Konsoleneingabe:

    websend [192.168.178.xxx,admin:joker] status 10

    benzino77 Tasmocompiler

    Gitpod Master 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 u. mosquitto/bash/html/cgi auf RPI 2B+

  • Ok, danke für die Tipps!

    Seltsamerweise habe ich für die Gosund SP1 keinen Benutzer oder Passwort festgelegt und in Firefox nimmt er den String ohne Probleme und liefert den Result.

    Mit =>Webquery funktioniert es im Script aber sehr gut. Mit vordefiniertem #define Use_Websend_Result während des Kompilierens bekomme ich sogar ein Result geliefert, wie es bei =>Websend zu erwarten gewesen wäre (siehe oben).

    Jetzt würde ich nur noch gerne den Result auswerten. gemu2015 hat ja einen Vorschlag gemacht, aber die Variable wird nicht befüllt.

    Die Frage ist, ob die Abteilung >E im Script unterhalb von >S sitzen muss, wo WebQuery abgefragt wird, oder ob die Webquery Abfrage direkt oberhalb in >E, also über pwr=ENERGY#Power eingegeben werden muss.

    Ich probiere heute noch ein Bischen, bin aber natürlich für jeden Tip dankbar.

  • Danke gemu2015, hat aber leider auch nicht geholfen.

    Unten habe ich den Inhalt von pwr ausdrucken lassen: ???

    11:35:00.678 RSL: RESULT = {"WebQuery":{"StatusSNS":{"Time":"2023-02-08T11:35:01","ENERGY":{"TotalStartTime":"2022-10-31T18:33:35","Total":80.373,"Yesterday":2.185,"Today":1.541,"Power":368,"ApparentPower":368,"ReactivePower":0,"Factor":1.00,"Voltage":235,"Current":1.569}}}}

    11:35:00.682 RSL: RESULT = {"WebQuery":"Done"}

    11:35:00.686 pwr ???

  • pwr=StatusSNS#ENERGY#Power

    Ich will mich da nicht einmischen, weil ich keine Ahnung von Script hab.

    Aber müsste dann der JSON Pfad nicht lauten:

    pwr=WebQuery#StatusSNS#Time#TotalStartTime#Power ?

    benzino77 Tasmocompiler

    Gitpod Master 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 u. mosquitto/bash/html/cgi auf RPI 2B+