Hallo, ich habe hier ein kleines Skript geschrieben um die Sonoff Bridge komfortabel zu nutzen. Die Einrichtung ist oft beschrieben. Ich habe es mir einfach gemacht und die Bridge mit Tasmota 8.1 und Portisch fertig gekauft (für ca. 12 Euro).
Nachdem die Bridge in euren Netz ist, installiert den sonoff adapter und verbindet die Bridget mit den Adapter. Das sollte dann so aussehen:
Wenn die Punkte RfRaw und RFRaw_Data noch nicht da sind, dann in der Konsole von Tasmota rfraw 177 eingeben und mit einer Fernbedienung eine Taste drücken.
Im Skript müßt ihr mindestens den Pfad zu RfRaw angeben.
Wenn der Datenpunkt bei euch also sonoff.123.myBridge.RfRaw heißt, dann
sonoff.123.myBridge. (mit Punkt)
//Version 0.9 15.11.2020
let bridgename="javascript.0.bridge."; //speicherort der Variablen
let sonoff="sonoff.0.Tasmota_21."; // wo ist RfRaw und RfRaw_Data
createState(bridgename+"learn",false,{type: "boolean", role: "button"});
createState(bridgename+"counter",1000,{type: "number", role: "state"});
createState(bridgename+"learning","off",{type: "string", role: "state"});
createState(bridgename+"lastcode","?",{type: "string", role: "state"});
createState(bridgename+"lastdate","?",{type: "string", role: "state"});
createState(bridgename+"lastname","?",{type: "string", role: "state"});
var counter=getState(bridgename+"counter").val;
setState(bridgename+'learn',false);
setState(bridgename+'learning',"off");
setState(sonoff+'RfRaw',"177");
on(bridgename+'learn',function(obj) {
if (obj.state.val) {
if (getState(bridgename+'learning').val=="off") {
setState(sonoff+'RfRaw',"177");
setState(bridgename+'learning',"on");
} else {
setState(bridgename+'learning',"off");
}
}
setState(bridgename+'learn',false);
})
on(sonoff+'RfReceived_Data',function(obj){
console.log(obj.state.val);
setState(sonoff+'RfRaw',"177");
})
function attachListener() {
setTimeout(function() {
$('state[id='+bridgename+'code.*.send]').on(function (id, i) {
buttonPress(id);
});
$('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
nameChanged(obj);
});
;}, 2000);
setTimeout(function() {
$('state[id='+bridgename+'code.*.send]').on(function (id, i) {
buttonPress(id);
});
$('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
nameChanged(obj);
});
;}, 10000);
}
function nameChanged(obj) {
if (obj.state.val==obj.oldState.val) {
console.log("ALT=NEU");
return;
}
var oldnam=obj.id.substr(0,obj.id.length-4);
var nam=obj.state.val;
var newnam=bridgename+"code."+nam+".";
console.log(newnam);
console.log(oldnam);
console.log(getState(oldnam+"org"));
createStates(newnam,nam,getState(oldnam+"org").val,getState(oldnam+"count").val,getState(oldnam+"transform").val);
setTimeout(function() {
deleteState(oldnam+"send");
deleteState(oldnam+"name");
deleteState(oldnam+"recieved");
deleteState(oldnam+"org");
deleteState(oldnam+"count");
deleteState(oldnam+"transform");
attachListener();
},1000);
}
$('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
nameChanged(obj);
});
function buttonPress(obj) {
if (obj.state.val==true) {
console.log("Pressed: " + obj.id);
setState(obj.id,false);
var nam=obj.id.substr(0,obj.id.length-4);
var code=getState(nam+"transform").val;
// console.log(code);
setState(sonoff+'RfRaw',"177");
setState(sonoff+'RfRaw',code);
setState(sonoff+'RfRaw',"177");
}
}
var SelectorButtons = $('state[id='+bridgename+'code.*.send]');
SelectorButtons.each(function (id, i) {
setState(id,false);
});
var SelectorRecieved = $('state[id='+bridgename+'code.*.org]');
SelectorRecieved.each(function (id, i) {
console.log("Bekannte Codes:" + getState(id).val);
});
function createStates(prefix,name,org,count,newcode) {
// console.log("New:" + prefix + "-" +name);
createState(prefix+"send",false,{type: "boolean", role: "button"});
createState(prefix+"name",name,{type: "string", role: "info"});
createState(prefix+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"),{type: "string", role: "state"});
createState(prefix+"org",org,{type: "string", role: "state"});
createState(prefix+"count",count,{type: "number", role: "state"});
createState(prefix+"transform",newcode,{type: "string", role: "state"});
}
on(sonoff+'RfRaw_Data',function(obj){
var code=obj.state.val;
setState(bridgename+"lastcode",code);
setState(bridgename+"lastdate",formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"))
if (code=="AAA055") return;
if (code.length<12) return;
var elems=code.split(" ");
$('state[id='+bridgename+'code.*.org]').each(function (id, i) {
var akt=getState(id).val
if (akt!=null) {
akt=akt.split(" ");
if (elems[elems.length-2]==akt[akt.length-2]) {
var nam=id.substr(0,id.length-3);
setState(nam+"count",getState(nam+"count").val+1);
setState(nam+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"));
var lastname=nam.substr(0,nam.length-1).split(".");
setState(bridgename+"lastname",lastname[lastname.length-1]);
// return false;
}
}
});
if (getState(bridgename+'learning').val=="on") {
// console.log("Neu : " + code);
$('state[id='+bridgename+'code.*.org]').each(function (id, i) {
var akt=getState(id).val;
if (akt!=null) {
akt=akt.split(" ");
if (elems[elems.length-2]==akt[akt.length-2]) {
console.log("Code bekannt:" + id);
code="";
return false;
}
}
});
if (code=="") return;
console.log("Schreib:" + code);
// return;
counter=counter+1;
setState(bridgename+'counter',counter);
var name=bridgename+"code."+String(counter)+".";
var laenge=2;
var newcode="";
for (let i=3;i<elems.length;i++) {
newcode=newcode+" "+elems[i];
laenge=laenge+elems[i].length;
}
laenge=laenge/2;
var newcode=elems[0]+" B0 "+laenge.toString(16)+" "+elems[2]+" 08"+newcode;
createStates(name,"unbekannt",obj.state.val,1,newcode);
attachListener();
}
})
attachListener();
schedule("*/20 * * * *", function () {
setState(sonoff+'RfRaw',"177");
});
Nach dem Start seht ihr folgende Punkte:
(code ist bei euch noch leer, also nich sichtbar).
Wenn ihr auf learn drückt, dann startet ihr den Lernmodus:
nochmal auf learn, oder Skipt neu starten, geht wieder in den normalen Modus.
Oben seht ihr, dass ich 2 Tasten angelernt habe.
- count=wie oft wurde die Fernbedienung gedrückt.
- name=Name der Taste
- org=Aufgezeichneter Code
- recieved=wann das letzte mal empfangen
- send=Code über sonoff Bridge senden
- transform=für Portisch umgerechnete code (falls das mit euren nicht geht, hier den von der Website umgerechneten eintragen)
Wenn man sich nicht sicher ist, welche Taste welche war, einfach im "Nicht-Lernmodus" Taste drücken. Dann wird count und recieved upgedatet.
Um die Codes einfacher in Skripten etc. verwenden zu können, kann man in name die Bezeichnung des codes eingeben (keine Leerzeichen, Sonderzeichen etc).
Dann benennt er den Zweig entsprechend um:
(habe mich doch für deutsch entschieden FB_1_an)
Solle bei vielen Anlernvorgängen das umbenennen haken, einfach das Skript neu starten.
Viel Spaß damit, wie man sicher sieht ist JS nicht meine erste Programmiersprache, aber es läuft...