NEWS
Fenster Script: Liste der offenen Fenster
-
@Homoran sagte:
das sollte es aber nicht
Warum passiert das bei dir?Wahrscheinlich nutzt er FF, bei dem Leerzeilen beim Copy eingefügt werden. Mit Chrome passiert es nicht.
-
jap, ich benutze Firefox. War bei mir schon immer so. Darum hab ich mir nie was dabei gedacht.
-
Hi,
ich habe das jetzt auch mal alles nachgebaut und funktioniert echt gut, mir würde noch eine "gekippte Fenster" Funktion gut gefallen. Könnte das gffs. noch jemand ergänzen. Danke
0: closed
1: kipp
2: offendas ist das gesamte script mit allen Ändeurungen bisher.
function countOpenWindowsDoors() { var openWindows = 0; var openDoors = 0; var listWindows = []; var listDoors = []; // Fenster var windows = getObject("enum.functions.windowstatus").common.members; for(let i = 0; i < windows.length; i++) { var Status = getState(windows[i]).val; if ( Status ) { openWindows++; let id = windows[i].substring(0, windows[i].lastIndexOf('.')); // Device ID listWindows.push(getObject(id).common.name); // Device Name } } // Türen var doors = getObject("enum.functions.doorstatus").common.members; for(let i = 0; i < doors.length; i++) { var Status = getState(doors[i]).val; if ( Status ) { openDoors++; let id = windows[i].substring(0, windows[i].lastIndexOf('.')); // Device ID listDoors.push(getObject(id).common.name); // Device Name } } var openWindowsText = "Kein Fenster geöffnet"; var openDoorsText = "Keine Tür geöffnet"; if(listWindows.length) openWindowsText = '' + listWindows.join(', '); if(listDoors.length) openDoorsText = 'Offene Türen: ' + listDoors.join(', '); setState('javascript.0._NEU.enum.StatusWindowOpenText', openWindowsText, true); setState('javascript.0._NEU.enum.StatusDoorOpenText', openDoorsText, true); setState('javascript.0._NEU.enum.StatusWindowOpen', openWindows, true ); setState('javascript.0._NEU.enum.StatusDoorOpen', openDoors, true ); } $('state(functions=windowstatus)').on(function(obj) { countOpenWindowsDoors(); }); $('state(functions=doorstatus)').on(function(obj) { countOpenWindowsDoors(); }); countOpenWindowsDoors();
-
ich habe hier weiterprobiert und habe inzwischen auch meine Lichter hier zählen und auflisten können.
function countOpenWindowsDoors() { var openWindows = 0; var openDoors = 0; var lights_on = 0; var listWindows = []; var listDoors = []; var listlights = []; // Lichter var windows = getObject("enum.functions.light").common.members; for(let i = 0; i < windows.length; i++) { var Status = getState(windows[i]).val; if ( Status ) { lights_on++; let id = windows[i].substring(0, windows[i].lastIndexOf('.')); // Device ID listlights.push(getObject(id).common.name); // Device Name } } // Fenster var windows = getObject("enum.functions.windowstatus").common.members; for(let i = 0; i < windows.length; i++) { var Status = getState(windows[i]).val; if ( Status ) { openWindows++; let id = windows[i].substring(0, windows[i].lastIndexOf('.')); // Device ID listWindows.push(getObject(id).common.name); // Device Name } } // Türen var doors = getObject("enum.functions.doorstatus").common.members; for(let i = 0; i < doors.length; i++) { var Status = getState(doors[i]).val; if ( Status ) { openDoors++; let id = windows[i].substring(0, windows[i].lastIndexOf('.')); // Device ID listDoors.push(getObject(id).common.name); // Device Name } } var openWindowsText = "Kein Fenster geöffnet"; var openDoorsText = "Keine Tür geöffnet"; var lights_onText = "Keine Lampe eingeschaltet"; if(listWindows.length) openWindowsText = '' + listWindows.join(', '); if(listDoors.length) openDoorsText = 'Offene Türen: ' + listDoors.join(', '); if(listlights.length) lights_onText = 'Lampen ein: ' + listlights.join(', '); setState('0_userdata.0.Wohnung.Status.Text_Fenster_offen', openWindowsText, true); setState('0_userdata.0.Wohnung.Status.Text_Tür_offen', openDoorsText, true); setState('0_userdata.0.Wohnung.Status.Text_Licht_ein', lights_onText, true); setState('0_userdata.0.Wohnung.Status.Fenster_offen', openWindows, true ); setState('0_userdata.0.Wohnung.Status.Tür_offen', openDoors, true ); setState('0_userdata.0.Wohnung.Status.Licht_ein', lights_on, true ); } $('state(functions=light)').on(function(obj) { countOpenWindowsDoors(); }); $('state(functions=windowstatus)').on(function(obj) { countOpenWindowsDoors(); }); $('state(functions=doorstatus)').on(function(obj) { countOpenWindowsDoors(); }); // countOpenWindowsDoors();
if(listlights.length) lights_onText = 'Lampen ein: ' + listlights.join(', ');
listlights.join(', ');
wie kann ich aus dem Komma getrennten eine Zeilenumbruch machen.
<br>
/n
und alles möglich aus dem Internet klappt nicht. Hat jemand einen Tipp.Danke
-
in meinem Batterie Script wird eine Liste für Telegram mit Zeilenumbruch formatiert, vielleicht hilft Dir das.
setState("0_userdata.0.Telegram.01Batteriealarm.textLOWBAT"/*textLOWBAT*/,textLOWBAT.join(',<br>')); // Schreibt die aktuelle Namen der Geräte mit LOWBAT Meldung
// Telegram Nachricht function telegram() { var telegramtext = getState("0_userdata.0.Telegram.01Batteriealarm.textLOWBAT"/*textLOWBAT*/).val.replace(/<br>/g , "\n"); // telegram Liste formatieren, entfernt den HTML Zeilenumbruch und ersetzt mit Zeilenumbruch Telegram telegramtext = telegramtext.replace(/_DEV:0.LOW_BAT/g, ""); sendTo("telegram", "send", { // Nachricht per Telegram senden text: "👆Achtung, Batterie fast leer!👆 \n\n" + telegramtext, user: 'Heiko' }); }
-
@dos1973 sagte in Fenster Script: Liste der offenen Fenster:
<br>
/nDen Schrägstrich anders rum ?
'\n'
-
nee, klappt leider nicht. Also den Slash in beide Richtungen geht nicht
auch das obigejoin(',<br>'));
klappt nicht.Hmm, verzwickt!
-
Das hier ist richtig(für telegram, pushover, text, plain email)... aber wo über willst du es ausgeben?
if(listlights.length) lights_onText = 'Lampen ein: ' + listlights.join('\n');
Bei mir sieht das für telegram z.B. so aus:
var msg = ''; for (let room in data) msg += room + ': ' + round((data[room].reduce((a, b) => a + b) / data[room].length), 1) + '%\n'; if (msg) msg = 'Luftfeuchtigkeitsübersicht:\n' + msg; else msg = 'Keine Werte gefunden!'; return msg; // round() ist eine eigene Funktion zum runden
-
@ticaki sagte in Fenster Script: Liste der offenen Fenster:
Das hier ist richtig(für telegram, pushover, text, plain email)... aber wo über willst du es ausgeben?
if(listlights.length) lights_onText = 'Lampen ein: ' + listlights.join('\n');
das klappt nicht.
ausgegeben wird es im DP
setState('0_userdata.0.Wohnung.Status.Text_Licht_ein', lights_onText, true);
-
@dos1973
merkwürdig und wie ist es mitif(listlights.length) { lights_onText = 'Lampen ein: \n ' listlights.forEach((a) => { lights_onText += a + '\n';} }
\n ist auf jeden Fall korrekt um Zeilenumbrüche im Datenpunkt zu haben. Ist bei mir zumindest so.
EDIT oder liegt es vielleicht daran das DP's Zeilenumbrüche nicht im Datenfeld darstellen?
-
dein Vorschlag klappt nicht, bzw.das Script funktioniert dann nicht, bzw. bringt Fehler.
2020-03-28 23:35:18.465 info (22746) Stop script script.js.1_Überwachung_Wohnung.Fenster_Licht_Status javascript.0 2020-03-28 23:34:32.025 error (22746) at process._tickCallback (internal/process/next_tick.js:68:7) javascript.0 2020-03-28 23:34:32.025 error (22746) at promise.then (/opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49) javascript.0 2020-03-28 23:34:32.025 error (22746) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23) javascript.0 2020-03-28 23:34:32.025 error (22746) at client.get (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:580:17) javascript.0 2020-03-28 23:34:32.025 error (22746) at adapter.getForeignState (/opt/iobroker/node_modules/iobroker.javascript/main.js:1055:17) javascript.0 2020-03-28 23:34:32.025 error (22746) at createProblemObject (/opt/iobroker/node_modules/iobroker.javascript/main.js:1464:17) javascript.0 2020-03-28 23:34:32.025 error (22746) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1411:37) javascript.0 2020-03-28 23:34:32.024 error (22746) at compile (/opt/iobroker/node_modules/iobroker.javascript/main.js:1188:28) javascript.0 2020-03-28 23:34:32.024 error (22746) at Object.createScript (vm.js:277:10) javascript.0 2020-03-28 23:34:32.024 error (22746) at new Script (vm.js:83:7) javascript.0 2020-03-28 23:34:32.024 error (22746) SyntaxError: missing ) after argument list javascript.0 2020-03-28 23:34:32.024 error (22746) ^ javascript.0 2020-03-28 23:34:32.024 error (22746) listlights.forEach((a) => { lights_onText += a + '\n';} javascript.0 2020-03-28 23:34:32.024 error at script.js.1_Überwachung_Wohnung.Fenster_Licht_Status:50 javascript.0 2020-03-28 23:34:32.024 error (22746) script.js.1_Überwachung_Wohnung.Fenster_Licht_Status compile failed:
der Zeilenumbruch wird nicht angenommen, ich habe schon einen DP im VIS um das zu prüfen.
-
@dos1973
jup in meinem Vorschlag hab ich wieder ); vergessen, passiert mir häufiger.listlights.forEach((a) => { lights_onText += a + '\n';});
Aber VIS ist nicht Datenpunkt: schreib mal von hand
1<br>2<br>3 oder 1<br/>2<br/>3 oder 1\n2\n3 oder 1\r\n2\r\n3
in den Datenpunkt. Eines davon wird gehen.
-
ich bekomme immer mehr das Gefühl dass ich in einem DP gar kein Zeilenumbruch haben kann??
auch wenn ich das manuell Eingebe gehts nicht?
ALSO im VIS wird einfach Fließtext ausgegeben, der in dem DP aufgenommen ist -
ich habs gefunden - mein Fehler "natürlich"
if(listlights.length) lights_onText = 'Lampen ein: ' + listlights.join((',<br>'));
aber in VIS hatte ich einen Basic-String genommen, damit gehts natürlich nicht.
Jetzt mit einem HTML Widget gehts. -
@dos1973 said in Fenster Script: Liste der offenen Fenster:
aber in VIS hatte ich einen Basic-String genommen, damit gehts natürlich nicht.
Jetzt mit einem HTML Widget gehts.Hi Dos1973
wie trägst du den datenpunkt in dem HTML widget ein?
Gruss Juergen -
Guten Abend,
Ich würde die Aufzählung auch gerne Verwenden.
Irgendwie werden mir in dem String nur die Homematic ID ausgegeben.
Im Iobroker selber habe Ich den Namen bereits geändert. Bleibt aber das gleiche.
Kann Ich das Script an Irgendeiner stelle abändern, sodass Ich den Namen und nicht die ID ausgegeben bekomme? -
-
@v522533 said in Fenster Script: Liste der offenen Fenster:
Ich habe das hier genutzt.
Passiert aber bei jeden Script hier im Thema.function countOpenWindowsDoors() { var openWindows = 0; var openDoors = 0; // Fenster var windows = getObject("enum.functions.windowstatus").common.members; for(let i = 0; i < windows.length; i++) { var Status = getState(windows[i]).val; if ( Status ) { openWindows = openWindows + 1; } } // Türen var doors = getObject("enum.functions.doorstatus").common.members; for(let i = 0; i < doors.length; i++) { var Status = getState(doors[i]).val; if ( Status ) { openDoors = openDoors + 1; } } var openWindowsText = "Kein Fenster geöffnet"; var openDoorText = "Keine Tür geöffnet"; if ( openWindows > 0 ) { openWindowsText = openWindows + " Fenster geöffnet"; } if ( openDoors > 0 ) { openDoorText = openDoors + " Türe(n) geöffnet"; } setState('Datenpunkte.0.StatusWindowOpenText', openWindowsText ); setState('Datenpunkte.0.StatusDoorOpenText', openDoorText ); setState('Datenpunkte.0.StatusWindowOpen', openWindows, true ); setState('Datenpunkte.0.StatusDoorOpen', openDoors, true ); } function registerSubscription() { $('state(functions=windowstatus)').on(function(obj) { countOpenWindowsDoors(); }); $('state(functions=doorstatus)').on(function(obj) { countOpenWindowsDoors(); }); } registerSubscription(); countOpenWindowsDoors();
-
-
Sry, Ich habe mal fix zum PC gewechselt!
Vom Handy klappt das nicht so gut.Das Script ist folgendes
function countOpenWindowsDoors() { var openWindows = 0; var openDoors = 0; var listWindows = []; var listDoors = []; // Fenster var windows = getObject("enum.functions.fensterstatus").common.members; for(let i = 0; i < windows.length; i++) { var Status = getState(windows[i]).val; if ( Status ) { openWindows++; let id = windows[i].substring(0, windows[i].lastIndexOf('.')); // Device ID listWindows.push(getObject(id).common.name); // Device Name } } // Türen var doors = getObject("enum.functions.turstatus").common.members; for(let i = 0; i < doors.length; i++) { var Status = getState(doors[i]).val; if ( Status ) { openDoors++; let id = windows[i].substring(0, windows[i].lastIndexOf('.')); // Device ID listDoors.push(getObject(id).common.name); // Device Name } } var openWindowsText = "Kein Fenster geöffnet"; var openDoorsText = "Keine Tür geöffnet"; if(listWindows.length) openWindowsText = '' + listWindows.join(', '); if(listDoors.length) openDoorsText = 'Offene Türen: ' + listDoors.join(', '); setState('0_userdata.0.FensteroffenText', openWindowsText, true); setState('0_userdata.0.turoffenText', openDoorsText, true); setState('0_userdata.0.FensteroffenAnzahl', openWindows, true ); setState('0_userdata.0.turoffenAnzahl', openDoors, true ); } $('state(functions=fensterstatus)').on(function(obj) { countOpenWindowsDoors(); }); $('state(functions=turstatus)').on(function(obj) { countOpenWindowsDoors(); }); countOpenWindowsDoors();
Und das schreibt er mir halt!
Nur hätte Ich halt den Namen (in dem Fall Kellertür) dort stehen.