Seite 1 von 1
Über mehrere Sonoff RF Bridge eine Sonoff Basic schalten
Verfasst: 18. Jan 2019 05:58
von fkempter
Hallo
Istzustand:
2 Stk Sonoff RF Bridge mit Tasmota
1Stk Sonoff Basic mit Tasmota
1Stk 433Mhz Taster
und die Rule
Code: Alles auswählen
val String rfTK01 = "3199816" //Tastschalter 1Pol Kanal A
rule "RF433 Empfang"
when
Item SonoffRF01_RfData received update or
Item SonoffRF02_RfData received update or
then
val sRF433 = triggeringItem.state.toString
if (sRF433 == rfTK01) {
if (Sonoff05_Switch.state == ON) Sonoff05_Switch.sendCommand(OFF) else Sonoff05_Switch.sendCommand(ON)
// Reset Last Received Code
val String RFData="0"
SonoffRF01_RfData.postUpdate(RFData)
SonoffRF02_RfData.postUpdate(RFData)
}
end
Mein Problem:
Sobald ich den Taster drücke bekommen alle RF Bridge den Code und die Rule wird dann 2mal (für jede Bridge) durchgelaufen
Das heißt die Sonoff Basic schaltet sich gleich wieder aus.
Hab versucht über den Codeteil
// Reset Last Received Code den Chache zu löschen aber das hat nichts gebracht.
Hat jemand eine Idee wie man das machen könnte?
SG Franz
Re: Über mehrere Sonoff RF Bridge eine Sonoff Basic schalten
Verfasst: 18. Jan 2019 06:23
von matze_bln
Hmmm, ich würde mal schauen, ob Tasmota dir eine Art Timer zur Verfügung stellt. Du könntest damit den Behfel nach dem ersten Empfang für z.B. 1 Sekunde sperren.
Re: Über mehrere Sonoff RF Bridge eine Sonoff Basic schalten
Verfasst: 18. Jan 2019 07:03
von fkempter
matze_bln hat geschrieben: ↑18. Jan 2019 06:23
Hmmm, ich würde mal schauen, ob Tasmota dir eine Art Timer zur Verfügung stellt. Du könntest damit den Behfel nach dem ersten Empfang für z.B. 1 Sekunde sperren.
Danke hae nachgeschaut und auf Tasmota einen "SwitchDebounce" gefunde.
Leider behebt es nicht das Problem obwohl ich SwitchDebounce 1000 gesetzt habe.
Re: Über mehrere Sonoff RF Bridge eine Sonoff Basic schalten
Verfasst: 18. Jan 2019 08:46
von matze_bln
Ich habe mal kurz bei den Befehlen und so nachgesehen.
Ich denke mit RULES, Timer und Variablen kann man was machen.
Es gibt etwas wie irf-empfangen. Da würde ich eine Variable gesperrt prüfen und darauf basierend schalten oder verwerfen. Dann natürlich die Variable auf true setzen, wenn die false war und einen Timer starten. Nach Ablauf des Timers soll gesperrt wieder false werden. Geschaltet wird nur, wenn gesperrt false ist.
Von der Theorie her sollte das klappen
Ach und Switchdebounce scheint eher zum entprellen eines Schalters zu sein, also nicht ganz was du brauchst.
Re: Über mehrere Sonoff RF Bridge eine Sonoff Basic schalten
Verfasst: 18. Jan 2019 11:34
von udo1toni
Die einfachste Variante:
Code: Alles auswählen
var Boolean bReceive = false
val String rfTK01 = "3199816" //Tastschalter 1Pol Kanal A
rule "RF433 Empfang"
when
Item SonoffRF01_RfData received update or
Item SonoffRF02_RfData received update or
then
if(!bReceive) {
bReceive = true
val sRF433 = triggeringItem.state.toString
// Reset Last Received Code
val String RFData="0"
SonoffRF01_RfData.postUpdate(RFData)
SonoffRF0"_RfData.postUpdate(RFData)
if (sRF433 == rfTK01)
Sonoff05_Switch.sendCommand(if (Sonoff05_Switch.state == ON) OFF else ON)
bReceive = false
}
end
Ich gehe davon aus, dass die beiden Trigger zeitlich sehr nah beieinander sind.
Im Einzelnen: sobald die Rule triggert, prüft sie als erstes, ob die Rule bereits ausgeführt wird (bReceive = true)
Ist das nicht der Fall, setzt sie selbst die Variable auf true. Es gibt auch einen Lock-Mechanismus, das ist aber mehr Code.

Anschließend läuft Dein Code, mit dem Unterschied, dass ich den empfangenen Code direkt lösche (ist ja bereits ausgelesen) und die If-Abfrage über den Zustand optimiert habe. Der ternäre Operator macht nichts anderes, ist aber etwas eleganter.
Zum Schluss wird noch die Variable bReceive auf false gesetzt; die Rule ist wieder scharf.
Falls die beiden Bridges zu stark unterschiedlichen Zeiten empfangen, könne man vor dem letzten Befehl noch ein Thread::sleep(250) einsetzen, was dann eine viertel Sekunde Pause einlegt. Das sollte aber eigentlich nicht notwendig sein.
Re: Über mehrere Sonoff RF Bridge eine Sonoff Basic schalten
Verfasst: 18. Jan 2019 19:32
von fkempter
Hallo Udu
Super das hat geklapt musst aber doch noch den Befehl Thread::sleep(250) einsetzen aber nicht am Ende sondern vor
"// Reset Last Received Code" und auf 400ms erhöhen.
Aber jetzt bekommen alle Kommandos nur einmal den Befehl.
Vielen lieben Dank für die schnell Hilfe!