script editor für Tasmota

  • Hallo Gerhard,


    ich möchte Code dynamisch ausführen (den ich per WebSend von einam anderen ESP bekommen habe)


    Generell möchte ich den Inhalt einer mir noch nicht bekannten Variable, deren Name ich als Text übermittelt bekomme, einer lokalen Variable zuweisen.


    Stattdessen:

    Code
    1. 10:07:24 tt:sendvar=localvar
    2. 10:07:24 sendvar:A:0.00
    3. 10:07:24 sendvar:B:0.00
    4. 10:07:24 sendvar:C:55.00


    Wird mein Ansinnen dadurch etwas klarer?


    Der Schlüssel ist das "%tt%" das m.E. nicht ausgewertet wird.


    LG Kaennchen

  • Danke, probiere ich gleich mal aus.


    Ich möchte auch gerne was zurückgeben, daher habe ich (mit meinen äußerst beschränkten C-Kenntnissen) folgendes gebaut:


    Als Doku:

    Code
    1. sb(svar s n) = substring - retrieve a substring of n characters of svar starting at s. S may be negative.
    2. sl(svar) = string length - retrieve length of svar

    Passt das auch rein?


    LG Kaennchen

  • da es nur extrem wenig platz für strings gibt und die meisten User kaum strings brauchen habe ich mich bisher mit Stringfunktionen zurückgehalten.

    habe deine Funktionen aber eingebaut. wir müssen aber aufpassen dass die Codegrösse nicht zu stark anwächst.

    bitte gut testen und Bescheid sagen ob alles geht dann mache ich eine pr.

  • da es nur extrem wenig platz für strings gibt und die meisten User kaum strings brauchen habe ich mich bisher mit Stringfunktionen zurückgehalten.

    habe deine Funktionen aber eingebaut. wir müssen aber aufpassen dass die Codegrösse nicht zu stark anwächst.

    bitte gut testen und Bescheid sagen ob alles geht dann mache ich eine pr.

    Erste Sahne! Das funktioniert durchweg asterein! Vielen Dank! ;)

  • Eine Frage hätte ich noch... wenn ich Werte instant abfragen möchte, wie komme ich dann an die Daten ran?

    Mein Blitzwolf hat z.B. (bei den Rules) ein on "ENERGY#Power" - bekomme ich das (ausser, wenn ich auf die Teleperiod warten kann) irgendwie in eine Variable rein?


    pwr=ENERGY#Power geht leider nicht.


    Danke & LG Kaennchen

  • wenn das eine TELE message ist kommt sie nur in Sektor T rein. dort muss pwr=ENERY#Power funktionieren (auf Groß klein Schreibung achten im Gegensatz zu rules)

    EVENTS also RESULT etc kommen in Sektor E rein.


    dann mit if upd[pwr] oder chg[pwr] abfragen. das ist dann equivalent zu rule on ... do

  • Hallo kaennchen,


    habe jetzt erst verstanden was du da machen willst.

    du forderst mit websend Werte eines anderen Tasmota an und hast den code zum Websend Response im Webserver aktiviert.


    das ist eine gute Idee!

    es braucht dabei keine scripts auf der anderen Seite!


    habe das jetzt aber etwas einfacher gelöst.


    du kannst jetzt 3 stufige MQTTs abfragen


    die RESULT Meldungen kommen in Sektion >E an


    temp=StatusSNS#BME280#Temperature

    ->print tmp=%temp%


    neue Version auf Github (files scripter und Webserver)


    um das WebSend Ergebnis zu erhalten bitte


    #define USE_WEBSEND_RESPONSE


    in der user_config angeben


    VG Gerhard


    PS. bei print braucht man jetzt kein => mehr davor

  • Hallo Gerhard,


    ist ja toll was alles so entsteht wenn man mal nicht da ist. Das aus Deinem letzten Post habe ich auch getestet.


    Jetzt hätte ich auch noch mal ne Frage:


    Die Timestamp ist ja im Dezember eingebaut worden (https://github.com/arendst/Sonoff-Tasmota/issues/4734). Ich habe aber keine Möglichkeit gefunden sie verarbeiten zu können, also festzustellen welche denn älter ist als die andere.

    Habe mir mal was dazu gebaut:

    Das Ergebnis eines Aufrufes von lt (later than)

    cnt=lt(erster zweiter)


    ist dann

    0 wenn beide gleich

    1 wenn der Erste später

    2 wenn der Zweite später


    Man könnte damit Werte aufgrund ihrer zeitlichen Anordnung validieren.


    Oder gibt es da andere Möglichkeiten?

  • es gibt einige Neuigkeiten.


    Ihr könnt jetzt alles mögliche im WEBUI anzeigen und auch eingeben.Die WEB Inputs (Buttons, Checkboxen, Slider, Text und Number Inputs) setzten direkt die Variablen in Scripter und WEBUIs werden direkt upgedated wenn man die Variable ändert.

    hier ein paar Beispiele:



  • Hallo Frank,


    Das ist etwas umständlich aber möglich.

    Man kann das Tasmota Display der Sensoren nicht so einfach ändern, sondern nur abschalten mit "WebSensor 0"


    dann kann man mit scripter die Anzeige selbst programmieren und dabei dann beliebige Namen nehmen.


    und auch Fonts, Farben etc frei wählen.


    In "D0 Zähler auslesen mit Tasmota" findest du einige Beispiele (besonders von meierchen006 )


    Im Prinzip so:


    ; Variablen definieren

    >D

    temp1=0

    temp2=0

    etc


    ; werte aus telemetry abholen

    >T

    temp1=BME280#Temperature

    etc.


    ; werte im WEBUI anzeigen

    ; da es hier HTML code ist kannst du beliebige HTML Formatierungen einfügen

    ; z.B. <b>text</b> für Bold Text etc

    >W

    ; die 2 vor der Variablen steht für die Nachkommastellen

    Temperatur Badezimmer:{m} %2temp1% C

    etc








  • Okay, danke. Dann werde ich mich mal dransetzen.



    Edit:


    also ich bekomme die Sensorennamen angezeigt. Mit websensor 0 verschwinden die normalen Sensoren aber nicht.

    Und die Werte werden auch nicht richtig angezeigt. Vermute es liegt an den zwei DS18B20 Sensoren.


    Mein Script:

    >D

    temp1=0

    temp2=0

    temp3=3

    humi1=1


    >T

    temp1=DS18B20-1#Temperature

    temp2=DS18B20-2#Temperature

    temp3=AM2301#Temperature

    humi1=AM2301#Humidity


    >W

    Temperatur LED 1:{m} %2temp1%°C

    Temperatur LED 2:{m} %2temp2%°C

    Temperatur Außen:{m} %2temp3%°C

    Luftfeuchtigkeit Außen:{m} %2humi1%%

  • Hallo


    Da ich auch meinen Hauptzähler auf die neue Scriptingversion von tasmota umstellen möchte, würde ich gern diese zwei Rules auf Scripting umstellen:


    1.Aufsplittung des Json Strings in Einzelwerte


    MQT: tele/sonoff-sml/SENSOR = {"Time":"2019-09-29T08:54:14","SML":{"Total_in":8846,"Total_out":1035,"Power_curr":362 }}

    (Hintergrund: Der data_type des mqtt_consumer-Plugins von Telegraf steht auf float)


    Umsetzung bisher als Rule:


    Code
    1. rule1
    2. on tele-SML#Total_in do publish esp/rulesSML/total_in %value% endon
    3. on tele-SML#Total_out do publish esp/rulesSML/total_out %value% endon
    4. on tele-SML#Power_curr do publish esp/rulesSML/power_curr %value% endon

    Rule1 on // Rule1 aktivieren

    Rule1 4 // für "Once":"OFF" bei Rule1



    2.Senden des PowerOn Commands (PV-Überschuss -> S20 Steckdose)


    Code
    1. rule2
    2. on SML#Power_curr<-280 do WebSend [192.168.xxx.x] POWER1 ON endon
    3. on SML#Power_curr>-10 do WebSend [192.168.xxx.x] POWER1 OFF endon

    Rule2 on // Rule2 aktivieren

    Rule2 5 // für "Once":"ON" bei Rule2



    Ist das per Scripting möglich?

  • frankydee


    du darfst niemals ein Minuszeichen in einem Namen haben!

    Dazu in Tasmota mit SetOption64 1 umschalten auf Unterstrich statt Minus.


    opferwurst


    habe noch nichts gefunden was in rules geht und in scripter nicht.


    >D

    pcurr=0


    >T

    ; positv ist einfacher

    pcurr=0-SML#Power_curr


    >S

    ;teste jede Sekunde


    ;aber nur wenn sich der Wert geändert hat

    if chg[pcurr]>0

    then


    if pcurr>280

    then

    ->WebSend [192.168.xxx.x] POWER1 ON

    endif


    if pcurr<10

    then

    ->WebSend [192.168.xxx.x] POWER1 OFF

    endif


    endif

  • habe noch nichts gefunden was in rules geht und in scripter nicht.



    Hallo gemu


    Vielen Dank. Werde ich so einbauen...

    Meine rule1 vom letzten Beitrag würde ich so umsetzen:



    Eine Frage noch betreffend des Timings. Gibt es eine Definition, das Script im Teleperiod Zeitrahmen auszuführen?