du hast "then" vergessen !!!
script editor für Tasmota
-
gemu2015 -
22. April 2019 um 13:50 -
Erledigt
-
-
-
Ich Doofkopp. Danke!
-
Hallo Zusammen,
ich habe mal versucht dem ganzen zu folgen...
So ganz habe ich das noch nicht verstanden.
Kann ich aus dem Script raus einen Datenpunkt im ioBroker beim boot anlegen lassen?
Z.B. um den mit dem Wert einer Variable zu füllen?
ist das mit subscribe?!?!?
Kann ich ebenfalls einen Datenpunkt anlegen der änderbar ist und abgerufen wird und in eine
Variable geschrieben wird?Hintergrund ist der, dass ich gern einen Thermostaten bauen möchte,
der Ist Temperatur hat, Solltemperatur und entsprechende werte ab wann das Relais an und aus geschaltet wird.
Diese Werte möchte ich per ioBroker in der Tasmota einstellen können.Wie müsste das aussehen im script?
Danke
Gruß Jens
-
Hallo Jens,
gib das Kommando z.B. script 1 in der Konsole an. In Iobroker Sonoff zuvor auf Autogenerate stellen.
Dann wird die Variable script in iobroker automatisch erzeugt.
im Tasmota script die Variablen definieren
>D
temp1=0
temp2=0
dann in iobroker javascript die Variablen setzen mit z.B.
setState('sonoff.0.RA8876.Script','>temp1=20.3;temp2=27.2');
-
Danke hat funktioniert.
Ich habe das entsprechend so umgesetzt:setState('sonoff.0.Test_Display.Script','>v2='+value);
allerdings kommt im ioBroker script folgende Warnung die ich nicht deuten kann
javascript.0 at Object.<anonymous> (script.js.Temperaturen:7:5)
zeile 7 ist die setState
eine Idee dazu oder ignorieren, da es funktioniert?
Danke
Gruß Jens
-
Hej, erstmal vielen Dank für den scripter!!
Dadurch konnte ich meine Wifi Dimmer QS-WiFi-D01 zusammen mit Tasmota wieder zum smarten Leben erwecken. Mit der SmartLife App schalteten die Dinger immer wieder die Lichter von alleine aus, wenn sie mit WLAN waren. Außerdem kann ich sie jetzt aufdimmen wenn sie aus sind. Das ging vorher nicht. Echt richtig cool.
Ich hab die Dimmer per Hue emulation in Tasmota (nicht im scripter) in Alexa eingebunden. Leider meldet Alexa da häufiger "xyz scheint nicht richtig zu funktionieren". Daher wollte ich Deine Hue Emulation im Scripter mal ausprobieren.
Sehe ich das richtig, das ich die Hue Emulation in Tasmota selbst dann nicht mehr brauche?
Was mir noch nicht ganz klar ist, ob ich neben einer Zeile
Wohnzimmer, on=pwr1,hue=hue1,sat=sat1,bri=bri1,ct=ct1
noch irgendetwas scripten muss. Also auf changes reagieren, etc...
Mit der Tasmota Hue Emulation wird auch das script verwendet, wobei mir nicht ganz klar ist, wie das zusammenhängt. Ich habe in einer Subroutine eine Änderung eingefügt (Minimaler DimLevel, da bei <10% die Lampen ausgehen) und diese greift auch, wenn ich per Alexa Hue steuere.
Wäre cool, wenn Du mir da etwas helfen könntest.
-
noch irgendetwas scripten muss. Also auf changes reagieren, etc...
Hi, nur wenn andere Aktionen gewünscht sind,
die nicht direkt mit Power1,... zusammenhängen.
mit Beispielen wirds evtl. klarer:
-
Ich habe mich jetzt hier angemeldet um mich für den Scripter und die Unterstützung zur Berechnung des Inhaltes einer Zisterne auf Basis
eines liegenden Zylinders zu bedanken. https://github.com/gemu2015/Sonoff-Tasmota/issues/14
Die Berechnung auf dem WEMOS D1 und die Darstellung auf dem SSD1306 OLED klappt hervorragend!
Damit entfällt die bisherige Berechnung in FHEM!
Mein Code sieht derzeit so aus.
>D
r=100 ;Radius liegende Zisterne in cm
l=207 ;Länge liegende Zisterne in cm
h=0 ;Wasserstand in cm
a=0 ;Berechnungswinkel
v=0 ;Volumen
m=0 ; Analogwert des Levelsensors
DT="DisplayText"
>T
m=ANALOG#A0
if m<601
then
h=ANALOG#A0/3
endif
>S
;update every teleperiod
if upsecs%tper==0
then
a=2*acos((r-h)/r)
v=l/1000*((r*r)/2)*(a-sin(a))
print Wstd :%h%
print Winkel Alpha:%a%
print Volumen :%v% Liter
=>%DT% [s1p21c1l01]Volumen
=>%DT% [s1p21c1l02]%0v%
=>%DT% [s1p21c1l03]Liter
=>publish stat/%topic%/RESULT %0v%
>W
Füllmenge {m} %0v% Liter
------------
Um die Gesamtsteuerung komplett auf den Wemos D1 zu verlagern, fehlt mir noch die Implementierung der Nachspeise-Steuerung (n) im Script.
Wenn der Füllstand unter 5000 Liter fällt, soll die Steuerung aktiviert werden, wenn ein Füllstand > 6000 Liter erreicht ist soll sie wieder deaktiviert werden.
Im Aktivierungs-Fall soll im Stundentakt power2 für 60s auf on geschaltet werden.
Hintergrund: Relais Power2 schaltet die Nachspeisepumpe eines Brunnens. Diese darf nicht zulange (60s) und zu oft (1h) laufen um Schmutzwasser Eintrag in die Zisterne zu vermeiden.
Die Integration ins Tasmota Script soll die bisherige Lösung (Atmega) ersetzen.
Für deine Hilfe wäre ich dankbar.
Wen es interessiert hier noch der Link zum Thema Level Sensor für Zisterne und Öl - Tank
https://forum.fhem.de/index.php/topic,93308.0.html
Billy
-
Ich habe jetzt mal den >S bereich wie folgt erweitert.
;Nachspeisung
if v<5000
then
n=1
endif
if v>6000
then
n=0
endif
print Nachspeisung :%n%
Damit fehlt nur noch der Teil der für n=1 stündlich (am besten zu jeder vollen Stunde) power2 für 60 sec einschaltet.
Da brauche ich noch Hilfe.
Anmerkung: die Nachspeisepumpe fördert in 60 sec ca. 50 Liter in die Zisterne. d.h. ohne Entnahme dauert es also ca. 20h bis die Nachspeisung wieder abgeschaltet wird.
-
Versuchs mal damit.
Tipp nimm wenns geht -> statt =>
das erzeugt sonst zu viel unnötigen MQTT Traffik
>D
r=100 ;Radius liegende Zisterne in cm
l=207 ;Länge liegende Zisterne in cm
h=0 ;Wasserstand in cm
a=0 ;Berechnungswinkel
v=0 ;Volumen
m=0 ; Analogwert des Levelsensors
DT="DisplayText"
hr=0
t:t1
>T
m=ANALOG#A0
if m<601
then
h=ANALOG#A0/3
endif
>S
;update every teleperiod
if upsecs%tper==0
then
a=2*acos((r-h)/r)
v=l/1000*((r*r)/2)*(a-sin(a))
print Wstd :%h%
print Winkel Alpha:%a%
print Volumen :%v% Liter
->%DT% [s1p21c1l01]Volumen
->%DT% [s1p21c1l02]%0v%
->%DT% [s1p21c1l03]Liter
=>publish stat/%topic%/RESULT %0v%
Nachspeisung
if v<5000
then
n=1
endif
if v>6000
then
n=0
endif
print Nachspeisung :%n%
hr=hours
if chg[hr]>0
and n>0
then
t1=60
endif
if t1>0
then
->power2 1
else
->power2 0
endif
>W
Füllmenge {m} %0v% Liter
-
Vielen dank, dein Scripter ist ja abgefahren!
Deinen Vorschlag zur Nachspeisung habe ich soweit verstanden und werde das in den nächsten Tagen testen.
Teleperiod wird endgültig auf 1200 eingestellt sodass der Füllstand alle 20 Minuten an den MQTT-Brooker und somit an FHEM gemeldet werden.
Wie lange wirkt eigentlich ?
;update every teleperiod
if upsecs%tper==0
then
......
und wo ist das endif dazu?
In der jetzigen Konfiguration bekomme ich die erste Volumen Meldung nach dem Booten erst nach 20 Minuten.
Kann ich im Abschnitt >S mit
if boot>0
then --> ???
endif
früher das Volumen berechnen lassen?
Sorry für die vielen Fragen.
Gruß Billy
-
sorry das endif ist beim kopieren verloren gegangen.
In der jetzigen Konfiguration bekomme ich die erste Volumen Meldung nach dem Booten erst nach 20 Minuten.
die Sensordaten werden erst nach ein paar Sekunden in Sektion >T geliefert so dass du direkt nach dem Booten noch warten musst.
eventuell würde ich die Berechnung und auch Displayanzeige z.B alle 10 Sekunden machen lassen und nur den Publish alle 20 Minuten
also
if upsecs%10==0
;calculate and display
endif
if upsecs%tper==0
; publish
endif
-
Dein Script Vorschlag zur Nachspeisung läuft nicht.
Wenn ich in >D t:t1 definiere
>D
t:t1
bringt die Berechnung für Winkel und Volumen nur noch null!
21:13:15 Wstd :191.33
21:13:15 Winkel Alpha:null
21:13:15 Volumen :null Liter
wenn ich t:t1 auskommentiere ;t:t1 stimmt wieder alles.
21:25:15 Wstd :192.00
21:25:15 Winkel Alpha:5.48
21:25:15 Volumen :6415.85 Liter
Mache ich da was falsch?
-
Ich habe das nun zu meiner Zufriedenheit gelöst!
Habe jetzt auf t:t1 verzichtet!
pulsetime2 auf 160 d.h. 60s eingestellt.
Mit
........................................
hr=hours
if chg[hr]>0
and n>0
then
=>power2 1
=>publish stat/%topic%/Stunde 1
endif
..............................................
wird die Nachspeisung wie erforderlich bei n=1 jede Stunde solange ausgeführt bis wieder mehr als 6000 Liter in der Zisterne sind.
Nochmals vielen Dank für den Hinweis auf hr=hours und chg[hr]>0
Billy
-
t:t1=0 hätte es heissen sollen!
-
t:t1=0 hätte es heissen sollen!
Ok danke jetzt haben wir 2 Lösungen.
Ich bin gerade noch an einer letzten Funktion.
Mit Switch 1 überwache ich ob der Hahn für das Gartenwasser auf oder zu ist.
Die Anzeige erfolgt auf einem Mqtt Statusdisplay .
Mein Versuch mit ; check if switch changed state klappt noch nicht. Da rührt sich nichts im Log wenn ich den Switch schalte.
>E
; check if switch changed state
sw=sw[1]
if chg[sw]>0
then
=>publish fhem/status/alarm/Gartenwasser %sw%
endif
-
das darf nicht sw heissen der Name ist für sw[x] reserviert
nimm z.B. s1=sw[1]
-
Dann ist das aber im Script-Cookbook falsch? da steht..
; check if switch changed state
sw=sw[1]
if chg[sw]>0
then =>power1 %sw%
endif -
gemu2015 Hej, ich habe da ein etwas seltsamen Effekt mit dem Scripter und einem Dimmer. Wenn das Licht aus ist und ich auf der Console "Dimmer 30" eingebe, wird der Wert nicht übernommen, sondern der letzte Wert benutzt. Gebe ich den gleichen Befehl ein, wenn das Licht an ist, dann wird der Wert korrekt übernommen. Ich habe mich eigentlich dicht an das Scriptbook gehalten. Hast Du eine Idee, was ich da falsch mache?
So habe ich es gescriptet:
>E
slider=Dimmer
print slider %slider%
if chg[slider]>0
then
if slider>0
then
dimv=slider
else
pwrt=0
endif
endif
if pwr[1]==1
then
pwrt=1
=#sdim(dimv)
else
pwrt=0
=#sdim(0)
endif
und hier ist der Output aus der Console:
(Dimmer ist an)
18:06:55 CMD: Dimmer 50
18:06:55 MQT: stat/Esszimmerwandlampe/RESULT = {"POWER":"ON","Dimmer":50}
18:06:55 slider 50.00
18:06:55 Script: performs "Dimmer 50.00"
18:06:55 MQT: stat/Esszimmerwandlampe/RESULT = {"POWER":"ON","Dimmer":50}
18:07:01 CMD: Dimmer 0
18:07:01 slider 50.00 (???)
18:07:01 Script: performs "Dimmer 0.00"
18:07:01 MQT: stat/Esszimmerwandlampe/RESULT = {"POWER":"OFF","Dimmer":0}
18:07:01 MQT: stat/Esszimmerwandlampe/RESULT = {"POWER":"OFF","Dimmer":0}
18:07:01 slider 0.00
18:07:01 Script: performs "Dimmer 0.00"
18:07:02 MQT: stat/Esszimmerwandlampe/RESULT = {"POWER":"OFF","Dimmer":0}
18:07:07 CMD: Dimmer 20
18:07:07 slider 0.00
18:07:07 Script: performs "Dimmer 50.00"
18:07:07 MQT: stat/Esszimmerwandlampe/RESULT = {"POWER":"ON","Dimmer":50}
18:07:07 MQT: stat/Esszimmerwandlampe/RESULT = {"POWER":"ON","Dimmer":50}
18:07:07 slider 50.00
18:07:07 Script: performs "Dimmer 50.00"
18:07:07 MQT: stat/Esszimmerwandlampe/RESULT = {"POWER":"ON","Dimmer":50}
18:07:12 CMD: Dimmer 20
18:07:12 MQT: stat/Esszimmerwandlampe/RESULT = {"POWER":"ON","Dimmer":20}
18:07:12 slider 20.00
18:07:12 Script: performs "Dimmer 20.00"
18:07:12 MQT: stat/Esszimmerwandlampe/RESULT = {"POWER":"ON","Dimmer":20}
Tritt unter anderem dann auf, wenn ich via console oder mqtt steuere.
Aktuell nutze ich die Tasmota 7.1.1.1 (selbst compiliert)
Wäre klasse, wenn Du da eine Idee hättest.
BG
-
-