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!
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?
mach es doch im S Segment und zwar so
if mqttc>0
then
=>subscribe
endif
wird nur einmal bei erfolgreichen connect aufgerufen
ok wenn das noch eine Weile getestet wurde (luigi?) mache ich einen pr
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!
ok, mqttc>0 ist noch besser
werd ich sofort wieder zurück nehmen!
Super, vielen Dank
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:
>D
temp=0
>T
temp=BME280#Temperature
if temp>25
then
=>Power1 0
else
=>Power1 1
endif
>E
if pwr[1]==1
then
=>print EIN
=>WebSend [192.168.178.20] Power1 1
else
=>print AUS
=>WebSend [192.168.178.20] Power1 0
endif
Alles anzeigen
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
habe die Änderungen jetzt in meiner repo.
was ich auch geändert habe ist der Zwang zu Großbuchstaben für die subscribe Variable.
kann jetzt beliebig sein.
bitte testen.
Habs bei mir drin, morgen kommt es in die Live-Installation.
Bis jetzt alles i.O.
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"}
Hi,
mosquitto_pub -t /cmnd/heizung/script -m >sw=1
Danke, funktioniert zumindest unter Linux so:
mosquitto_pub -t cmnd/heizung/script -m ">sw=1"
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
Schöne Pooltemperaturanzeige!
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
und auch das zugehörige "kochbuch"
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
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
eingebe kommt lediglich die meldung:
und der Wemos startet immer wieder neu.
zu meiner verwendeten Hardware:
IoBroker
Tasmota 6.6.0 Core 2.4.2
//#define USE_RULES
#define USE_SCRIPT
#define USE_SCRIPT_FATFS 4
Wemod D1 Mini Pro
WS_2811 (GRB)
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.
>D
Temp=0
Tmp=0
>T
Temp=DS18B20#Temperature
>S
if upsecs%2==0
then
Tmp=Tmp+1
=>print Hello World! Temperatur:%Temp%°C, zum %Tmp%-ten mal!
endif
Alles anzeigen
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