script editor für Tasmota

  • ok, da haben wir es doch, die mqqt Nachricht ist zu lang: 179 , Begrenzung ist 128


    ändere mal die Zeile 128 z.B nach 256


    if (XdrvMailbox.data_len < 1 || XdrvMailbox.data_len > 128) {

    return false;

    }


    lustig aus OR mach er einen Smiley!

  • Den Smiley hatte ich auch schon!


    Der Smiley passt aber voll! Hätte ich nämlich eigentlich auch sehen können!!


    Klappt wunderbar, das war es. Wird dann in den Rules wohl auch so sein.


    Nun bleibt nur noch, dass nach einem kompletten Neustart das Ganze nicht in Gang kommt, sondern nur nach den starten des Scripts. Hab mal den kompletten LOG vom Neustart drangehängt.


    00:00:00 RSL: Gruppe 0, Index 1, Befehl SUBSCRIBE, Daten LUX,/PoolTemp/tele/SENSOR,BH1750.Illuminance

    00:00:00 RUL: Subscribe command with parameters: LUX, /PoolTemp/tele/SENSOR, BH1750.Illuminance.

    00:00:00 RUL: New topic: /PoolTemp/tele/SENSOR/#.

    00:00:00 MQT: abonniere /PoolTemp/tele/SENSOR/#

    00:00:00 RSL: GT_SchuppenVorne/stat/RESULT = {"Subscribe":"LUX,/PoolTemp/tele/SENSOR/#,BH1750.Illuminance"}

    00:00:00 Script: performs "Subscribe TEMPA,/PoolTemp/tele/SENSOR,DS18B20_1.Temperature"

    00:00:00 SRC: Rule

    00:00:00 RSL: empfangenes topic /Subscribe, Datengröße 49, Daten TEMPA,/PoolTemp/tele/SENSOR,DS18B20_1.Temperature

    00:00:00 >>>>>1

    00:00:00 >>>>>2 Länge=50

    00:00:00 RUL: MQTT Topic /Subscribe, Event TEMPA,/PoolTemp/tele/SENSOR,DS18B20_1.Temperature

    00:00:00 RUL: Match MQTT message Topic /Subscribe with subscription topic /PoolTemp/tele/SENSOR

    00:00:00 RSL: Gruppe 0, Index 1, Befehl SUBSCRIBE, Daten TEMPA,/PoolTemp/tele/SENSOR,DS18B20_1.Temperature

    00:00:00 RUL: Subscribe command with parameters: TEMPA, /PoolTemp/tele/SENSOR, DS18B20_1.Temperature.

    00:00:00 RUL: New topic: /PoolTemp/tele/SENSOR/#.

    00:00:00 MQT: abonniere /PoolTemp/tele/SENSOR/#

    00:00:00 RSL: GT_SchuppenVorne/stat/RESULT = {"Subscribe":"TEMPA,/PoolTemp/tele/SENSOR/#,DS18B20_1.Temperature"}

    00:00:00 Script: performs "Subscribe TEMPB,/PoolTemp/tele/SENSOR,DS18B20_2.Temperature"

    00:00:00 SRC: Rule

    00:00:00 RSL: empfangenes topic /Subscribe, Datengröße 49, Daten TEMPB,/PoolTemp/tele/SENSOR,DS18B20_2.Temperature

    00:00:00 >>>>>1

    00:00:00 >>>>>2 Länge=50

    00:00:00 RUL: MQTT Topic /Subscribe, Event TEMPB,/PoolTemp/tele/SENSOR,DS18B20_2.Temperature

    00:00:00 RUL: Match MQTT message Topic /Subscribe with subscription topic /PoolTemp/tele/SENSOR

    00:00:00 RUL: Match MQTT message Topic /Subscribe with subscription topic /PoolTemp/tele/SENSOR

    00:00:00 RSL: Gruppe 0, Index 1, Befehl SUBSCRIBE, Daten TEMPB,/PoolTemp/tele/SENSOR,DS18B20_2.Temperature

    00:00:00 RUL: Subscribe command with parameters: TEMPB, /PoolTemp/tele/SENSOR, DS18B20_2.Temperature.

    00:00:00 RUL: New topic: /PoolTemp/tele/SENSOR/#.

    00:00:00 MQT: abonniere /PoolTemp/tele/SENSOR/#

    00:00:00 RSL: GT_SchuppenVorne/stat/RESULT = {"Subscribe":"TEMPB,/PoolTemp/tele/SENSOR/#,DS18B20_2.Temperature"}

    00:00:00 >>>>>>>>>>>>>>>> bin durch (ET: ist das Ende der >B Abschnittes)

    00:00:00 WIF: Prüfe Verbindung...

    00:00:00 WIF: Verbindungsversuch...

    00:00:00 WIF: verbinden mit AP1 TulpeForEver in Modus 11N als GT_SchuppenVorne-4539...

    00:00:01 WIF: Prüfe Verbindung...

    00:00:01 WIF: Verbindungsversuch...

    00:00:02 WIF: Prüfe Verbindung...

    00:00:02 WIF: Verbindungsversuch...

    00:00:03 WIF: Prüfe Verbindung...

    00:00:03 WIF: Verbindungsversuch...

    00:00:04 WIF: Prüfe Verbindung...

    00:00:04 WIF: verbunden

    00:00:04 HTP: Web-Server aktiv bei GT_SchuppenVorne-4539 mit IP-Adresse 192.168.30.211

    11:37:35 NTP: Drift 0, (UTC) Sat Jul 20 09:37:35 2019, (DST) Sun Mar 31 02:00:00 2019, (STD) Sun Oct 27 03:00:00 2019

    11:37:36 MQT: Verbindungsversuch...

    11:37:36 MQT: verbunden

    11:37:36 MQT: GT_SchuppenVorne/tele/LWT = Online (beibehalten)

    11:37:36 MQT: GT_SchuppenVorne/cmnd/POWER =

    11:37:36 MQT: abonniere GT_SchuppenVorne/cmnd/#

    11:37:36 MQT: abonniere sonoffs/cmnd/#

    11:37:36 MQT: abonniere cmnd/DVES_9F31BB_fb/#

    11:37:36 MQT: GT_SchuppenVorne/tele/INFO1 = {"Module":"Sonoff Dual","Version":"6.6.0.1(sonoff)","FallbackTopic":"cmnd/DVES_9F31BB_fb/","GroupTopic":"sonoffs"}

    11:37:36 MQT: GT_SchuppenVorne/tele/INFO2 = {"WebServerMode":"Admin","Hostname":"GT_SchuppenVorne-4539","IPAddress":"192.168.30.211"}

    11:37:36 MQT: GT_SchuppenVorne/tele/INFO3 = {"RestartReason":"Software/System restart"}

    11:37:36 MQT: GT_SchuppenVorne/stat/RESULT = {"POWER1":"OFF"}

    11:37:36 MQT: GT_SchuppenVorne/stat/POWER1 = OFF

    11:37:36 MQT: GT_SchuppenVorne/stat/RESULT = {"POWER2":"OFF"}

    11:37:36 MQT: GT_SchuppenVorne/stat/POWER2 = OFF

    11:37:37 HTP: Hauptmenü

    11:37:38 HTP: Konsole

    11:37:40 APP: Anzahl Startvorgänge 36

    11:37:40 CFG: in Flash gespeichert am F9, zählen 108, Bytes 3584

    11:37:44 MQT: GT_SchuppenVorne/tele/STATE = {"Time":"2019-07-20T11:37:44","Uptime":"0T00:00:14","Heap":27,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"POWER1":"OFF","POWER2":"OFF","Wifi":{"AP":1,"SSId":"TulpeForEver","BSSId":"E0:28:6D:7C:42:EE","Channel":11,"RSSI":100,"LinkCount":1,"Downtime":"0T00:00:04"}}

    11:37:55 WIF: Prüfe Verbindung...

    11:37:55 WIF: verbunden

    11:38:15 WIF: Prüfe Verbindung...

    11:38:15 WIF: verbunden

    11:38:35 WIF: Prüfe Verbindung...

    11:38:35 WIF: verbunden

    11:38:55 WIF: Prüfe Verbindung...

    11:38:55 WIF: verbunden

    11:39:15 WIF: Prüfe Verbindung...

    11:39:15 WIF: verbunden

    11:39:35 WIF: Prüfe Verbindung...

    11:39:35 WIF: verbunden


    Sieht irgendwie so aus dass RUL etwas zu "voreilig" subscribed. Habe versucht was im >E zu machen, gibt es da ein Event wenn MQTT connected?

  • So, bei mir funktioniert jetzt alles.

    Das Problem mit dem Reboot und Subscribe ist mir auch aufgefallen. Ich behelf mir damit, dass ich die Subscribes in der Sektion S mache:


    >S

    if upsecs==20

    then

    =>Subscribe ...

    endif


    Damit funktionierts auch nach einem Reboot

    Was mir auch noch auffällt: Nach dem Reboot (nach Flachen oder einfach so) muss ich 1x in den Editor und abspeichern, damit das Subscribe ausgeführt wird.

    Wie weiter? Ich überlege mir mal einen Test in Rules? Dort hatte ich das Subskribent noch nie ausprobiert. Was funktionierte waren die 2 Sensoren mit einem -1 anstelle _1.

  • Supi, klappt auch jetzt. Hatte es mit mqtts in >E probiert.

    luigi : Was Gerhard da geschrieben hat ist effizienter.


    Ich baue das alles jetzt nochmal in die "scharfe" Installation ein und gebe dann Bescheid wenn ich nichts mehr gefunden habe.


    Nochmal: Scripts, jetzt mit Subscribe und den 4k Scriptspeicher ist eine tolle Sache. Ich bin mal gespannt was die Leute so damit alles machen werden.

    Respekt Gerhard!

  • werd ich sofort wieder zurück nehmen!

    Super, vielen Dank :thumbsup:


    gleich eine Frage hinterher:

    Events die z.B. in >T ausgelöst werden,

    werden unter >E bei mir nicht auch getriggert,


    nicht vorgesehen oder ein Denkfehler von mir?


    als Beispiel:


    Wenn ich den Button im UI für AN/AUS drücke wird das WebSend ausgeführt,

    nicht aber wenn die temp Bedingung sich ändert.

  • T triggert bei Tele SENSOR und STATE

    E bei RESULT und POWER change


    aber wenn script ein Tasmota command auslöst ist die Rekursion absichtlich gesperrt. (script würde sich selbst aufrufen das macht keinen Sinn und würde im schlimmsten Fall bis zum Stack overflow gehen)



    zur Info


    für Leute mit Display habe ich auch den silent execute eingebaut.

    -> tasmota command

    erzeugt kein MQTT und kein weblog


    da ich sehr viel ins display schreibe (z.B Sekunden Uhr) gab das viel zuviel unnötigen traffic


    es macht keinen Sinn dem Broker so was zu melden

  • Erstes Ergebnis:

    Geht nur wenn alles Großbuchstabe ist. Es kommt zu einem Neustart:

    /GT_SchuppenVorne/tele/INFO3 = {"RestartReason":"Fatal exception:9 flag:2 (EXCEPTION) epc1:0x40220a50 epc2:0x00000000 epc3:0x00000000 excvaddr:0x3ffe877a depc:0x00000000"}

  • zweites Problem:

    Bei zwei Temp-Sensoren wird auf dem subscribenden Sonoff nur noch der Lux Sensor angezeigt (ist der letzte im JSON String ?). Bei einem Tempsensor wird dieser mit angezeigt.


    >D

    MTA=0

    MTB=0

    ML=0


    >S

    if mqttc>0

    then

    =>Subscribe MTA,/Lucky/Garten/PoolTemp/tele/SENSOR,DS18B20_1.Temperature

    =>Subscribe ML,/Lucky/Garten/PoolTemp/tele/SENSOR,BH1750.Illuminance

    =>Subscribe MTB,/Lucky/Garten/PoolTemp/tele/SENSOR,DS18B20_2.Temperature

    endif


    if upd[ML]>0

    then

    =>print ML=%ML%

    endif


    if upd[MTA]>0

    then

    =>print MTA=%MTA%

    endif


    if upd[MTB]>0

    then

    =>print MTB=%MTB%

    endif

  • Hallo, iIch steh grad auf dem Schlauch,
    wie kann ich über ein MQTT_publish eine Variable setzen?

    über die Console funktionierts mit script >sw=1


    über den Broker mit mosquitto_pub -t /cmnd/heizung/ -m script >sw=1 nicht:

    12:29:20 SRC: MQTT

    12:29:20 RSL: Received Topic cmnd/heizung/, Data Size 12, Data script >sw=1

    12:29:21 RSL: Group 0, Index 1, Command , Data script >sw=1

    12:29:21 MQT: stat/heizung/RESULT = {"Command":"Unknown"}

  • neueste Version unterstützt jetzt auch WS2812 addressierbare LEDs.

    habe damit eine LED Leistungsanzeige programmiert mit der ich den Input/Output meines Zweirichtungszählers anzeige.

    Man kann damit beliebige Anzeige und Farbeffekte erzeugen.


    hier das script


    die variable ledbar wird vom broker gesetzt (-5000 bis 5000 Watt)


    >D

    m:array=0 60 ; array für 60 pixel

    cnt=0

    val=0

    ind=0

    ; Grid Farben für Einspeisung , Verbrauch RGB

    colr1=0x050000

    colr2=0x050100

    colg1=0x000300

    colg2=0x020300

    ledbar=0

    blue=64 ; Zeiger in Blau

    pixels=60 ; Anzahl Leds

    steps=10 ; Anzahl steps der Gradation

    div=0

    tog=0

    max=5000 ; maximaler Verbrauch Watt

    min=-5000 ; maximale Einspeisung Watt

    pos=0


    >B

    div=pixels/steps

    =#prep

    ; setzte LEDs aus array

    ws2812(array)


    >S

    if ledbar<min

    then ledbar=min

    endif


    if ledbar>max

    then ledbar=max

    endif


    pos=(ledbar/max)*(pixels/2)

    if ledbar>0

    then

    pos+=(pixels/2);

    if pos>pixels-1

    then pos=pixels

    endif

    else

    pos+=(pixels/2)+1

    if pos>pixels-1

    then pos=1

    endif

    endif


    ;=>print %ledbar% %pos%


    if pos<1

    or pos>pixels

    then pos=1

    endif


    =#prep

    if ledbar==0

    then

    array[pos]=blue

    array[pos-1]=blue

    else

    array[pos]=blue

    endif


    ; nur anzeigen wenn ausgeschaltet

    ; damit kann man die Leds noch als normale Beleuchtung nutzen

    if pwr[1]==0

    then

    ws2812(array)

    endif


    ; subroutine für grid

    #prep

    for cnt 1 pixels 1

    ind+=1

    if ind>div

    then ind=1

    tog^=1

    endif


    if cnt<=pixels/2

    then

    if tog>0

    then val=colr1

    else val=colr2

    endif

    else

    if tog>0

    then val=colg1

    else val=colg2

    endif

    endif

    ;->print %cnt% %tog%

    array[cnt]=val

    next


    >R

  • Hallo zusammen,


    Ich habe mich mal versucht mit dem Thema Tasmota Scripting zu beschäftigen, aber leider komme ich nicht mal an den start.


    ich verstehe einfach nicht was das mit den Sektionen auf sich hat, ich habe bereits


    Scripting-Language


    und auch das zugehörige "kochbuch"


    Script-Cookbook


    versucht zu verstehen aber irgendwie komme ich nicht drauf klar, aber vieleicht kann jemand von euch mir hier helfen.


    Mein Ziel ist es eine WS2811 mit 106 (318) LED´s nur 13 LED´s einzuschalten wenn der Bewegungsmelder an geht.

    gedacht hatte ich ein neues Scheme zu erstellen aber das hat sich wohl als nicht möglich rausgestellt.

    Dann hat mich @gemu2015 auf das Tasmota Scripting aufmerksam gemacht in diesem Thread


    Tasmota-ws2811-nachtlicht/


    aber ich komme einfach nicht damit zurecht weil ich einfach nicht verstehe wie ich die Sektionen bzw die befehle setzen soll.

    Ich schaffe es nicht mal das eine LED eingeschaltet wird.

    Wenn ich in die Console von Tasmota


    Code
    1. Script1 1


    eingebe kommt lediglich die meldung:


    Code
    1. 09:21:02 CMD: script1 1
    2. 09:21:02 RSL: stat/sonoff/RESULT = {"Script":"ON","Free":1468}

    und der Wemos startet immer wieder neu.



    zu meiner verwendeten Hardware:

    Code
    1. IoBroker
    2. Tasmota 6.6.0 Core 2.4.2
    3. //#define USE_RULES
    4. #define USE_SCRIPT
    5. #define USE_SCRIPT_FATFS 4
    6. Wemod D1 Mini Pro
    7. WS_2811 (GRB)
    8. HC-SR501



    ich habe bereits schon gesucht aber nichts gefunden wo es ein Beispiel gibt oder sonst was, ich lande immer wieder hier in diesem Thread anscheinend scheint es dazu noch nicht viel zu geben. :/


    grüße mexad0n

  • Hi mexad0n,


    ja, es schein noch nicht viele zu geben die Script nutzen, ist auch relativ frisch aber genial.

    Zum WS2811 kann ich nicht viel sagen, ein paar Zeilen weiter oben hat gemu2015 ja ein Beispiel für so was ähnliches gebracht.

    Die Programmierung an sich ich recht einfach. Das machst Du nicht, wie bei RULES, in der Konsolenzeile, sondern unter Einstellungen/Edit Scipt.

    Damit das Script läuft oben den Haken setzen.

    Für Deine Zwecke wirst Du nur >D und >S brauchen. In >D definierte Du die Variablen. >S wird aller Sekunde ausgeführt, hier kommt der Programmcode rein. Ein einfaches Beispiel hänge ich mal an. Da ist noch die Section >T drin: hier werden lokale Sensoren eingelesen. Wirst Du nicht haben, das fängt Script aber ab (probiere es aus..)

    Das kleine Beispiel gibt Dir aller 2 sec. eine Meldung auf die Konsole.



    Einfach mal in das Scriptfenster kopieren und Speichern..


    Der Rest sollte sich dann über das Wiki erschliessen.

    Viel Spass!


    P.S.

    #define USE_SCRIPT_FATFS 4 kannst Du wieder rausnehmen, brauchst Du nur wenn Du Flash-Cards anschliessen willst.

  • so, hier ein Script das jedes x te pixel einschaltet und alle anderen aus.

    musst du noch anpassen, erst mal nur um zu zeigen wie die leds angesteuert werden.


    >D

    ; Anzahl Pixels, hier 106, es werden nur bis 255 leds unterstützt. (bisher)

    m:array=0 106 ; array mit 106 RGB Werten

    cnt=0

    dcol=0xff0000 ; Farbe in RGB HEX, hier hell rot

    pixels=106

    steps=0


    >B

    steps=pixels/13


    >S


    =#prep


    ; nur wenn licht aus ist

    if pwr[1]==0

    then

    ws2812(array)

    endif



    ; alle leds aus ausser steps

    #prep

    for cnt 1 pixels 1

    if cnt%steps==0

    then array[cnt]=dcol

    else array[cnt]=0

    endif

    next


    >R