script editor für Tasmota

  • weis jetzt warum subscribe bei mir nicht geht. benutze den sonoff adapter in iobroker und nicht den mqtt adapter und der unterstützt das nicht.

    habe aber keine Lust mein System umzustellen, muss also jemand anderes mal testen.


    also wie in rules mit subscribe abonnieren

    der event name ist jetzt allerdings der Variablenname. (und der muss nur Großbuchstaben haben) der in der >D Sektion definiert sein muss.

    also z.B.


    >D

    TEMP=0


    >B

    =>Subscribe TEMP, stat/%topic%/SENSOR,DS18B20.Temperature


    >S

    if upd[TEMP]>0

    then

    =>print temp=%TEMP%

    endif



    dieses Define muss vor dem Kompilieren gesetzt werden

    #define SUPPORT_MQTT_EVENT

  • Guten Morgen Ekkehard


    das ist iobroker ein javascript script

    kenne mich in FHEM gar nicht aus, geht aber ganz sicher auch.


    du musst dir einen String zusammenstellen (eigentlich ein Tasmota script, kann alles möglich drin stehen)

    das script muss mit > beginnen und die Zeilen müssen mit Semikolon getrennt sein.

    und damit die MQTT Text Variable script setzten.


    also z.B. >pooltemp=22.7;lufttemp=25.5 etc


    Gruß Gerhard

  • Verstehe. Würde ich ja glatt mal probieren, macht aber keinen Sinn. Deine Lösung klappt nämlich!

    Ich muss mir hier erstmal was zusammenbauen um es nochmal mehr zu testen, aber ich kann meine Kaffeemaschine schon mal mit der Temperatur in den Poolsolarpaneelen meines Schwiegervaters 50km entfernt verkoppeln. Das wollte ich schon immer ;-)

    Das ist der Knaller..

  • So, habe es mal folgendermassen getestet:

    - einen Sonoff Basic, daran einen BH1750 über I2C und zwei DS18B20.

    - einen Dual R1 als "Empfänger", er subscribed die 3 Werte vom Basic

    - beide per MQTT ohne TLS an einem Mosquitto.


    Grundsätzlich läuft es super, aber nur, wenn nur ein DS18B20 angeschlossen ist. Dann kann ich auch 3x subscriben, und bekomme 3 Werte (2x die Gleichen, klar).

    Kann es sein dass es ein Problemchen gibt, wenn dem (DS18B20) Sensortyp noch ein -1 oder -2 angehängt wird? Ist mir nämlich schon mal aufgefallen, da hatte ich aber keine Zeit mich drum zu kümmern.

    Habe jetzt auf dem Basic (wo zwei Sensoren angeschlossen sind) versucht diese einfach mal auszugeben:


    >D

    TEMPA=0

    TEMPB=0

    LUX=0

    >T

    TEMPA=DS18B20-1#Temperature

    TEMPB=DS18B20-2#Temperature

    LUX=BH1750#Illuminance

    >S

    =>print %TEMPA% %TEMPB% %LUX%


    In TEMPA und TEMPB kommt nichts an. Mit einem Sensor geht das.


    Beide Werte werde aber sauber gebroked, dass sehe ich im MQTT-Exporer und in der Konsole vom Basic:


    14:42:12 MQT: /PoolTemp/tele/SENSOR = {"Time":"2019-07-19T14:42:12","DS18B20-1":{"Id":"01131BAC3330","Temperature":26.9},"DS18B20-2":{"Id":"0210917760CE","Temperature":26.6},"BH1750":{"Illuminance":45},"TempUnit":"C"}


    Der DUAL kann mit den beiden Werten (nur wenn sie ein -1 oder -2 dran haben) dann auch nichts anfangen.


    Also nochmal kurz zusammengefasst: wenn der DS nur DS18B20 heisst klappt es, wenn er DS18B20-1 und/oder DS18B20-2 heisst geht leider nix. Auch der TH1750 kommt dann nicht an mit der Meldung:

    14:47:32 MQT: GT_SchuppenVorne/stat/RESULT = {"Command":"Error"}

    in der Konsole.


    Unter den Rules hatte ich 2 DS dran und damit auch keine Probleme.


    Ist sicher nur was Kleines ;-)


    Viele Grüße!

  • Hierzu auch gleich noch die Frage:

    Wenn ich das define nutze, muss dann der externe Flash dran sein oder geht das auch ohne?

  • 1. also es darf kein - Zeichen drin sein (wird als - interpretiert) deshalb hat Theo Arends auch SetOption64 1 eingebaut ist dann underscore

    2. ja du kannst das EEPROM mit define einschalten, erst wenn es auch gefunden wird wird es benutzt

  • Okay,

    jetzt kommt der Basic klar (an dem die Sensoren hängen) und Broker auch entsprechend (s.u.)

    Nur der Dual bringt den gleichen Fehler. Und den auch, obwohl ich den DS gar nicht abfrage:

    =>Subscribe LUX,/PoolTemp/tele/SENSOR,BH1750.Illuminance



    mit einem DS:

    15:43:38 MQT: /PoolTemp/tele/SENSOR = {"Time":"2019-07-19T15:43:38","DS18B20":{"Temperature":26.8},"BH1750":{"Illuminance":24},"TempUnit":"C"}

    klappt es


    mit 2 DS:

    15:45:38 MQT: /PoolTemp/tele/SENSOR = {"Time":"2019-07-19T15:45:38","DS18B20_1":{"Id":"01131BAC3330","Temperature":26.9},"DS18B20_2":{"Id":"0210917760CE","Temperature":26.7},"BH1750":{"Illuminance":25},"TempUnit":"C"}

    klappt es nicht.


    Die JSON-Strings werden im MQTT-Explorer sauber aufgelöst.


    Das Ganze mit und ohne Setoption 64 auf der Seite des Dual.

  • Hab einfach nur den Code aus rules kopiert, bist du sicher das es dort funktioniert?

    der einzige Unterschied ist, dass ich am Ende des rules codes kein Event erzeuge sondern ein "mini" script


    such mal diese Stelle in scripter


    char sbuffer[128];

    snprintf_P(sbuffer, sizeof(sbuffer), PSTR(">%s=%s\n"), event_item.Event.c_str(), value.c_str());

    execute_script(sbuffer);


    und füge vor execute_script die Zeile

    toLog(sbuffer);

    ein


    dann siehts du in der Konsole das "mini" script

    vielleicht hilft das ja weiter

  • Habe das an besagter Stelle eingefügt, im Logging für das WebLog Level 4 eingestellt.

    Das kommt dabei heraus:


    17:30:42 WIF: Prüfe Verbindung...

    17:30:42 WIF: verbunden

    17:30:47 RSL: empfangenes topic /PoolTemp/tele/SENSOR, Datengröße 179, Daten {"Time":"2019-07-19T17:30:47","DS18B20_1":{"Id":"01131BAC3330","Temperature":26.6},"DS18B20_2":{"Id":"0210917760CE","Temperature":26.4},"BH1750":{"Illuminance":28},"TempUnit":"C"}

    17:30:47 RSL: Gruppe 0, Index 1, Befehl SENSOR, Daten {"Time":"2019-07-19T17:30:47","DS18B20_1":{"Id":"01131BAC3330","Temperature":26.6},"DS18B20_2":{"Id":"0210917760CE","Temperature":26.4},"BH1750":{"Illuminance":28},"TempUnit":"C"}

    17:30:47 MQT: GT_SchuppenVorne/stat/RESULT = {"Command":"Error"}


    Sieht aber genauso aus wie das ohne die eingefügte Zeile (habs nochmal kompiliert, weil ich kein Miniscript darin finde..)


    17:35:43 WIF: Prüfe Verbindung...

    17:35:43 WIF: verbunden

    17:35:47 RSL: empfangenes topic /PoolTemp/tele/SENSOR, Datengröße 179, Daten {"Time":"2019-07-19T17:35:47","DS18B20_1":{"Id":"01131BAC3330","Temperature":26.6},"DS18B20_2":{"Id":"0210917760CE","Temperature":26.4},"BH1750":{"Illuminance":25},"TempUnit":"C"}

    17:35:47 RSL: Gruppe 0, Index 1, Befehl SENSOR, Daten {"Time":"2019-07-19T17:35:47","DS18B20_1":{"Id":"01131BAC3330","Temperature":26.6},"DS18B20_2":{"Id":"0210917760CE","Temperature":26.4},"BH1750":{"Illuminance":25},"TempUnit":"C"}

    17:35:47 MQT: GT_SchuppenVorne/stat/RESULT = {"Command":"Error"}

  • Das hier:

    18:29:59 WIF: Prüfe Verbindung...

    18:29:59 WIF: verbunden

    18:30:06 HTP: Logging konfigurieren

    18:30:12 HTP: Einstellungen

    18:30:13 RSL: empfangenes topic /Lucky/PoolTemp/tele/SENSOR, Datengröße 179, Daten {"Time":"2019-07-19T18:30:12","DS18B20_1":{"Id":"01131BAC3330","Temperature":26.8},"DS18B20_2":{"Id":"0210917760CE","Temperature":26.6},"BH1750":{"Illuminance":59},"TempUnit":"C"}

    18:30:13 RSL: Gruppe 0, Index 1, Befehl SENSOR, Daten {"Time":"2019-07-19T18:30:12","DS18B20_1":{"Id":"01131BAC3330","Temperature":26.8},"DS18B20_2":{"Id":"0210917760CE","Temperature":26.6},"BH1750":{"Illuminance":59},"TempUnit":"C"}

    18:30:13 MQT: GT_SchuppenVorne/stat/RESULT = {"Command":"Error"}

    18:30:13 HTP: Edit script


    Ich muss für heute mal Schluss machen, der Nachbar hat den Grill gebootet.

    Danke erstmal für Deine Mühen!

  • Genial was da alles möglich wird :thumbsup:


    Hab da auch eine Frage, was ich da falsch mache,

    seit dem Update (ab v6.6.0) werden die Events unter >E bei mir nicht mehr gemeldet (nur ganz sporadisch)


    ob es an der Änderung liegen könnte?

    von

    if (bitRead(Settings.rule_enabled, 0)) Run_Scripter(">E",2,mqtt_data);

    auf

    if (bitRead(Settings.rule_enabled, 0) && mqtt_data[0]) Run_Scripter(">E",2,mqtt_data);

    https://github.com/gemu2015/So…139eb428ae5caf5121fbe69ef

  • ok mist du hast recht das ist ein bug!

    danke werd ich sofort wieder zurück nehmen!

    diese Abfrage für leeres MQTT darf nur in der T Sektion stehen


    eine pr für Tasmota mache ich aber erst wenn auch das subscribe Problem gelöst ist

  • So, habe mal folgendes getestet

    Am Anfang von ScriptMqttData(void) folgendes geändert:

    ...

    //ETH

    toLog(">>>>>1");

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

    return false;

    }

    //ETH

    char ethbuff[128];

    sprintf(ethbuff,"Länge=%d",XdrvMailbox.data_len);

    toLogEOL(">>>>>2 ",ethbuff);

    String sTopic = XdrvMailbox.topic;

    String sData = XdrvMailbox.data;

    //eth

    AddLog_P2(LOG_LEVEL_DEBUG, PSTR("RUL: MQTT Topic %s, Event %s"), XdrvMailbox.topic, XdrvMailbox.data);

    ...


    Test mit 2 und einem Sensor:


    2 Temp-Sensoren:


    09:15:48 RSL: empfangenes topic /Subscribe, Datengröße 44, Daten LUX,/PoolTemp/tele/SENSOR,BH1750.Illuminance

    09:15:48 >>>>>1

    09:15:48 >>>>>2 Länge=45

    09:15:48 RUL: MQTT Topic /Subscribe, Event LUX,/PoolTemp/tele/SENSOR,BH1750.Illuminance

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

    09:15:48 MQT: löse abo. von /Lucky/PoolTemp/tele/SENSOR/#

    09:15:48 MQT: abonniere /PoolTemp/tele/SENSOR/#

    09:15:48 MQT: GT_SchuppenVorne/stat/RESULT = {"Subscribe":"LUX,/PoolTemp/tele/SENSOR/#,BH1750.Illuminance"}

    09:15:48 HTP: Einstellungen

    09:15:48 CFG: in Flash gespeichert am F9, zählen 91, Bytes 3584



    Temp Sensor (und alles geht..)


    09:33:46 RSL: empfangenes topic /PoolTemp/tele/SENSOR, Datengröße 104, Daten {"Time":"2019-07-20T09:33:45","DS18B20":{"Temperature":23.3},"BH1750":{"Illuminance":15},"TempUnit":"C"}

    09:33:46 >>>>>1

    09:33:46 >>>>>2 Länge=105

    09:33:46 RUL: MQTT Topic /PoolTemp/tele/SENSOR, Event {"Time":"2019-07-20T09:33:45","DS18B20":{"Temperature":23.3},"BH1750":{"Illuminance":15},"TempUnit":"C"}

    09:33:46 >LUX=15



    Das Problem scheint also vorher schon aufzutauchen?

  • ein Sensor:

    10:42:26 RSL: empfangenes topic /PoolTemp/tele/SENSOR, Datengröße 104, Daten {"Time":"2019-07-20T10:42:25","DS18B20":{"Temperature":24.3},"BH1750":{"Illuminance":22},"TempUnit":"C"}

    10:42:26 >>>>>1

    10:42:26 >>>>>2 Länge=105

    10:42:26 RUL: MQTT Topic /PoolTemp/tele/SENSOR, Event {"Time":"2019-07-20T10:42:25","DS18B20":{"Temperature":24.3},"BH1750":{"Illuminance":22},"TempUnit":"C"}

    10:42:26 RUL: Match MQTT message Topic /PoolTemp/tele/SENSOR with subscription topic /PoolTemp/tele/SENSOR

    10:42:26 LUX=22.00


    zwei Sensoren:

    10:45:55 RSL: empfangenes topic /Subscribe, Datengröße 44, Daten LUX,/PoolTemp/tele/SENSOR,BH1750.Illuminance

    10:45:55 >>>>>1

    10:45:55 >>>>>2 Länge=45

    10:45:55 RUL: MQTT Topic /Subscribe, Event LUX,/PoolTemp/tele/SENSOR,BH1750.Illuminance

    10:45:55 RUL: Match MQTT message Topic /Subscribe with subscription topic /PoolTemp/tele/SENSOR

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

    10:45:55 RUL: Subscribe command with parameters: LUX, /PoolTemp/tele/SENSOR, BH1750.Illuminance.


    Letzteres kommt auch nur 1x nach dem ersten Start des Scripts. Alle anderen sehen so aus:


    10:47:59 RSL: empfangenes topic /PoolTemp/tele/SENSOR, Datengröße 179, Daten {"Time":"2019-07-20T10:48:00","DS18B20_1":{"Id":"01131BAC3330","Temperature":24.6},"DS18B20_2":{"Id":"0210917760CE","Temperature":24.4},"BH1750":{"Illuminance":20},"TempUnit":"C"}

    10:47:59 >>>>>1

    10:47:59 RSL: Gruppe 0, Index 1, Befehl SENSOR, Daten {"Time":"2019-07-20T10:48:00","DS18B20_1":{"Id":"01131BAC3330","Temperature":24.6},"DS18B20_2":{"Id":"0210917760CE","Temperature":24.4},"BH1750":{"Illuminance":20},"TempUnit":"C"}

    10:47:59 MQT: GT_SchuppenVorne/stat/RESULT = {"Command":"Error"}


    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.