Hallo kaennchen,
ja du hast recht ist etwas komplex. werde mal schauen ob ich das integrieren kann.
Gruß Gerhard
Hallo kaennchen,
ja du hast recht ist etwas komplex. werde mal schauen ob ich das integrieren kann.
Gruß Gerhard
Hallo kaennchen,
versuch mal die neueste version von scripter aus meinem fork, sollte jetzt gehen
Hallo Gerhard,
Perfekt! Die SUBs kann ich jetzt auch von der Konsole aus aufrufen.
Kannst du vielleicht mit der dynamischen Code-Ausführung auch was zaubern? (mein vorheriger Post)
LG Kaennchen
Hallo Kaennchen
weis nicht genau was du vorhast aber so geht das nicht
tt="print test1:%gtst%"
aber so tt="test1:"+s(gtst)+ ...
->print tt
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.
(Pseudocode zur Verdeutlichung)
>D
localvar=55
sendvar=0
tt=""
vonextern=""
>B
vonextern="localvar"
tt="sendvar="+vonextern
=>print tt:%tt%
%tt%
;(sendvar sollte jetzt den Wert 55 haben)
=> print sendvar:A:%sendvar%
tt="sendvar=7"
%tt%
;(sendvar sollte jetzt den Wert 7 haben)
=> print sendvar:B:%sendvar%
sendvar=localvar
=> print sendvar:C:%sendvar%
=#sendtoextern(sendvar)
Alles anzeigen
Stattdessen:
10:07:24 tt:sendvar=localvar
10:07:24 sendvar:A:0.00
10:07:24 sendvar:B:0.00
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
Hallo Kaennchen,
ist ne exotische Sache, habe dir folgendes eingebaut.
strvar="->print hallo"
=(strvar)
führt die Variable strvar als script aus.
LG Gerhard
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:
if (!strncmp(vname,"sl(",3)) {
lp+=3;
char str[SCRIPT_MAXSSIZE];
lp=GetStringResult(lp,OPER_EQU,str,0);
lp++;
len=0;
fvar=strlen(str);
goto exit;
}
if (!strncmp(vname,"sb(",3)) {
lp+=3;
char str[SCRIPT_MAXSSIZE];
lp=GetStringResult(lp,OPER_EQU,str,0);
SCRIPT_SKIP_SPACES
float fvar1;
lp=GetNumericResult(lp,OPER_EQU,&fvar1,0);
SCRIPT_SKIP_SPACES
float fvar2;
lp=GetNumericResult(lp,OPER_EQU,&fvar2,0);
lp++;
len=0;
if (fvar1<0) {
fvar1=strlen(str)+fvar1;
}
memcpy(sp,&str[(uint8_t)fvar1],(uint8_t)fvar2);
sp[(uint8_t)fvar2] = '\0';
goto strexit;
}
Alles anzeigen
Als Doku:
sb(svar s n) = substring - retrieve a substring of n characters of svar starting at s. S may be negative.
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:
if (!strncmp(vname,"lt(",3)) {
char str1[20];
lp=GetStringResult(lp+3,OPER_EQU,str1,0);
SCRIPT_SKIP_SPACES
char str2[20];
lp=GetStringResult(lp,OPER_EQU,str2,0);
lp++;
len=0;
fvar=-1;
// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("Script: lt argues 1:%s, 2:%s"), str1, str2);
uint16_t count;
for (count=0;*(str1+count)!='\0';count++){
if (*(str1+count)>*(str2+count)) {
fvar=1;
break;
}
else {
if (*(str1+count)<*(str2+count)){
fvar=2;
break;
} else {
fvar=0;
}
}
}
Alles anzeigen
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?
Halo Gerhard,
wie muß das Script aussehen, wenn ich nur die Namen auf der WebUi ändern möchte? Ich habe 3 DS18B20 und ein BME280 Sensor an einen Basic und möchte diese genau benennen.
Vg Frank
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
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:
rule1
on tele-SML#Total_in do publish esp/rulesSML/total_in %value% endon
on tele-SML#Total_out do publish esp/rulesSML/total_out %value% endon
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)
rule2
on SML#Power_curr<-280 do WebSend [192.168.xxx.x] POWER1 ON endon
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?
du darfst niemals ein Minuszeichen in einem Namen haben!
Dazu in Tasmota mit SetOption64 1 umschalten auf Unterstrich statt Minus.
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:
>D
power1=0
power2=0
power3=0
>T
power1=SML#Total_in
power2=SML#Total_out
power3=SML#Power_curr
>S
if upsecs%30==0
then
=>publish q3b/Total_in %power1%
=>publish q3b/Total_out %power2%
=>publish q3b/Power_curr %power3%
endif
Alles anzeigen
Eine Frage noch betreffend des Timings. Gibt es eine Definition, das Script im Teleperiod Zeitrahmen auszuführen?