NEWS
Datenpunkt prüfen vor schalten
-
Ich habe ein Datepunkt mit true, oder false. Ich möchte ihn aber nur schalten, wenn der Inhalt nicht schon dort gesetzt ist.
Sprich true darf nur geschrieben werden, wenn es auf false steht.
Habt jemand eine Idee, wie das am einfachsten geht? Muss glaube ich etwas mit if und getState und SetState sein.
-
@mitch
Zeig doch bitte mal, was Du bisher schon hast.
Davon hängt nämlich ab, wie man das am besten und einfachsten umsetzt. -
if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') { setState('0_userdata.0.tv.dp_sonoff', id) setState(id + '.POWER', false); setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber); setState('0_userdata.0.tv.dp_room', roomid); setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde ausgeschaltet'); var today = new Date(); var bh_day = ("00" + today.getDate()).slice(-2); var bh_mon = today.getMonth() + 1; var bh_mon2 = ("00" + bh_mon).slice(-2); var bh_year = ("0000" + today.getFullYear()).slice(-4); var bh_hour = ("00" + today.getHours()).slice(-2); var bh_min = ("00" + today.getMinutes()).slice(-2); var bh_sec = ("00" + today.getSeconds()).slice(-2); InfoMessage = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde ausgeschaltet"; sendTo("telegram", "send", { text: InfoMessage }); }
Die Zeile 3 schaltet immer, auch wenn false schon gesetzt ist. Ich würde natürlich ein else anhängen und gleich per Alexa sagen, dass der Fernseher bereits an ist.
-
@mitch sagte: Zeile 3 schaltet immer, auch wenn false schon gesetzt ist.
Erweitere die Prüfung:
if(id != getState('0_userdata.0.tv.dp_sonoff').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
Das erspart die Ausführung des ganzen Rests, wenn die gemerkte ID gleich der aktuellen ID ist.
-
@paul53 sagte in Datenpunkt prüfen vor schalten:
@mitch sagte: Zeile 3 schaltet immer, auch wenn false schon gesetzt ist.
Erweitere die Prüfung:
if(id != getState('0_userdata.0.tv.dp_sonoff').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
Das erspart die Ausführung des ganzen Rests, wenn die gemerkte ID gleich der aktuellen ID ist.
for(let id of members) { if(id.startsWith('sonoff.')) { if(id != getState(id + '.POWER').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') { setState('0_userdata.0.tv.dp_sonoff', id) setState(id + '.POWER', true); setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber); setState('0_userdata.0.tv.dp_room', roomid); setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde angeschaltet'); var today = new Date(); var bh_day = ("00" + today.getDate()).slice(-2); var bh_mon = today.getMonth() + 1; var bh_mon2 = ("00" + bh_mon).slice(-2); var bh_year = ("0000" + today.getFullYear()).slice(-4); var bh_hour = ("00" + today.getHours()).slice(-2); var bh_min = ("00" + today.getMinutes()).slice(-2); var bh_sec = ("00" + today.getSeconds()).slice(-2); InfoMessage = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde angeschaltet"; sendTo("telegram", "send", { text: InfoMessage }); } else { setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber); setState('0_userdata.0.tv.dp_room', roomid); setState('0_userdata.0.tv.dp_sonoff', "") } } }
Ich habe die Zeile nochmal angepasst, da ja setState(id + '.POWER', true); die ausschlagebene Zeile ist. Habe natürlich das im True-Abschnitt und im alse-Abschnitt eingebaut.
Leider quatscht Alexa und Telegram nicht. Muss ich also noch eine Unlogik drin haben.
-
@mitch sagte: Zeile nochmal angepasst, da ja setState(id + '.POWER', true);
Die Anpassung ist falsch! Unter "0_userdata.0.tv.dp_sonoff" wird die übergebene ID gemerkt (Zeile 4), nicht in "0_userdata.0.tv.dp_sonoff.POWER", der einen booleschen Wert enthält.
EDIT: Die ID ändert sich durch eine Schleife. Wozu dient dann Zeile 4, in der zuletzt nur die ID des letzten Datenpunktes der Schleife gemerkt wird?
Dann ändere die Prüfung beim Einschalten:if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv' && !getState(id + '.POWER').val) {
und beim Ausschalten:
if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv' && getState(id + '.POWER').val) {
Zeige besser mal das komplette Skript. Es scheint viele Ressourcen zu verbrauchen.
-
@mitch
Weshalb werden Ein- und Ausschalten getrennt behandelt. Sie unterscheiden sich nur im Wert für ".POWER" (false/true) und in einem kleinen Textbestandteil am Textende ("ausgeschaltet"/"angeschaltet").
Die Datums-/Uhrzeit-Bildung macht man auch nicht innerhalb einer Schleife, denn sie ändert sich während eines Trigger-Ereignisses nicht.Vorschlag (Variable
serialNumber
überprüfen!):on("0_userdata.0.tv.turn_on_off", function (dp) { let aus_an = dp.state.val ? 'angeschaltet' : 'ausgeschaltet'; let serialNumber = getState("alexa2.0.History.serialNumber").val; setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber); let roomid = getObject('alexa2.0.Echo-Devices.' + serialNumber, 'rooms').enumIds[0]; setState('0_userdata.0.tv.dp_room', roomid); let roomname = getObject('alexa2.0.Echo-Devices.' + serialNumber, 'rooms').enumNames[0]; if(typeof roomname == 'object') roomname = roomname.de; var today = new Date(); var bh_day = ("00" + today.getDate()).slice(-2); var bh_mon = today.getMonth() + 1; var bh_mon2 = ("00" + bh_mon).slice(-2); var bh_year = ("0000" + today.getFullYear()).slice(-4); var bh_hour = ("00" + today.getHours()).slice(-2); var bh_min = ("00" + today.getMinutes()).slice(-2); var bh_sec = ("00" + today.getSeconds()).slice(-2); let time = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde "; let members = getObject(roomid).common.members; for(let id of members) { if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv' && dp.state.val != getState(id + '.POWER').val) { setState(id + '.POWER', dp.state.val); setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde ' + aus_an); sendTo("telegram", "send", {text: time + aus_an}); } } });