NEWS
Mehrere Aktoren abfragen
-
Hallo, ich bin am Anfang mit der Script Welt und ioBroker. Ich habe mir da ein Script geschrieben, wofür es mit Sicherheit eine bessere Möglichkeit zur Programmierung gibt.
Das Script soll folgendes erledigen:
1. Überwachen ob an einem der Schaltausgänge des Wired Aktors HMW-IO-12-Sw7-DR MEQXXXXXXX eingeschaltet oder ausgeschaltet wird.
2. Je nach Status eines Ausgangs soll 0 oder 1 geschrieben werden.
3. Aus den Schaltzuständen soll der Name einer Grafikdatei zusammengesetzt werden, zur Zeit wird die Grafik über das Widget "static image" angezeigt. Den Dateinamen setze ich dab erst im Widget zusammen und zwar so:
/vis.0/1280x800/img/plan/haus-nacht_st-{javascript.0.HausUntenStrahlerEinfahrt}_ur-{javascript.0.HausUntenWandleuchteEinfahrt}_ef-{javascript.0.HausUntenEinfahrt}_fr-{javascript.0.HausUntenFreisitz}_ei-{javascript.0.HausUntenEingang}.png
Es funktioniert, aber ich bin mir sicher es geht eleganter und besser, evtl. über ein array oder so. Leider habe ich es nur so hinbekommen. Noch besser wäre es wenn man nur einen createState bräuchte und der Dateinamen im Script zusammengesetzt wird.
Folgendes sollte noch möglich sein. Das Script soll nur nach Sonnenuntergang ausgeführt werden.
createState('HausUntenStrahlerEinfahrt', '0'); createState('HausUntenWandleuchteEinfahrt', '0'); createState('HausUntenEinfahrt', '0'); createState('HausUntenFreisitz', '0'); createState('HausUntenEingang', '0'); on("hm-rpc.1.MEQXXXXXXX.13.STATE", function(obj) { /*HausUntenStrahlerEinfahrt*/ if (obj.newState.val === true){ setState('HausUntenStrahlerEinfahrt', '1'); } else { setState('HausUntenStrahlerEinfahrt', '0'); } }); on("hm-rpc.1.MEQXXXXXXX.14.STATE", function(obj) { /*HausUntenWandleuchteEinfahrt*/ if (obj.newState.val === true){ setState('HausUntenWandleuchteEinfahrt', '1'); } else { setState('HausUntenWandleuchteEinfahrt', '0'); } }); on("hm-rpc.1.MEQXXXXXXX.16.STATE", function(obj) { /*HausUntenEinfahrt*/ if (obj.newState.val === true){ setState('HausUntenEinfahrt', '1'); } else { setState('HausUntenEinfahrt', '0'); } }); on("hm-rpc.1.MEQXXXXXXX.17.STATE", function(obj) { /*HausUntenFreisitz*/ if (obj.newState.val === true){ setState('HausUntenFreisitz', '1'); } else { setState('HausUntenFreisitz', '0'); } });
Anzeigen tut das Script dann eine 3D Ansicht vom Haus (verkleinerte Bilder hänge ich in den Anhang, zur besseren Vorstellung, natürlich sind es noch mehr Grafiken), in der die jeweils eingeschalteten Strahler, Laternen, Wandleuchten am Haus und Grundstück dann leuchten wenn diese eingeschaltet sind. Das funktioniert auch schon wunderbar.
Vielleicht kann mir jemand dabei helfen das Ganze besser zum machen.
Alles aus bei Nacht:
Wandleuchte im Freisitz leuchtet bei Nacht:
Alle ein bei Nacht
Vielen Dank schonmal.
-
So?
`var pattern = "/vis.0/1280x800/img/plan/haus-nacht_st-%s_ur-%s_ef-%s_fr-%s_ei-%s.png"; var values = []; var myIndexes = [ "hm-rpc.1.MEQXXXXXXX.13.STATE", "hm-rpc.1.MEQXXXXXXX.14.STATE", "hm-rpc.1.MEQXXXXXXX.16.STATE", "hm-rpc.1.MEQXXXXXXX.17.STATE", "hm-rpc.1.MEQXXXXXXX.YY.STATE" ]; function createPictureName(doNotWrite) { var result = pattern; for (var i = 0; i < myIndexes.length; i++) { result = result.replace('%s', values[i]); } if (!doNotWrite) setState('pictureName', result, true); return result; } // Init states var myStates = $('hm-rpc.1.MEQXXXXXXX.*.STATE'); myStates.each(function(id) { var pos = myIndexes.indexOf(obj.id); if (id != -1) { var val = getState(id).val; values[pos] = (val === true || val === 'true') ? 1 : 0; } }).on(function(obj) { var pos = myIndexes.indexOf(obj.id); if (id != -1) { var val = getState(id).val; values[pos] = (val === true || val === 'true') ? 1 : 0; } createPictureName(); }); createState('pictureName', createPictureName(true));` Und dann "basic - string image src" verwenden[/i]
-
Hallo Bluefox,
vielen Dank für deine schnelle Hilfe.
Ich habe es wie folgt abgeändert:
`var pattern = "/vis.0/1280x800/img/plan/haus-nacht_st-%s_ur-%s_ef-%s_fr-%s_ei-0.png"; var values = []; var myIndexes = [ "hm-rpc.1.MEQ0064913.13.STATE", "hm-rpc.1.MEQ0064913.14.STATE", "hm-rpc.1.MEQ0064913.16.STATE", "hm-rpc.1.MEQ0064913.17.STATE" ]; function createPictureName(doNotWrite) { var result = pattern; for (var i = 0; i < myIndexes.length; i++) { result = result.replace('%s', values[i]); log(result); } if (!doNotWrite) setState('pictureName', result, true); return result; } // Init states var myStates = $('hm-rpc.1.MEQ0064913.*.STATE'); myStates.each(function(id) { var pos = myIndexes.indexOf(obj.id); if (id != -1) { var val = getState(id).val; values[pos] = (val === true || val === 'true') ? 1 : 0; } }).on(function(obj) { var pos = myIndexes.indexOf(obj.id); if (id != -1) { var val = getState(id).val; values[pos] = (val === true || val === 'true') ? 1 : 0; } createPictureName(); }); createState('pictureName', createPictureName(true));` Weil es den letzten Platzhalter im Bildnamen noch nicht gibt. Dann habe ich als Pfad zum Bild das hier eingetragen: `~~[code]~~{javascript.0.pictureName}[/code]` Es wird aber kein Bild angegeben, weil "%s" als undefined im Bildnamen wiedergegeben wird. Im Quelltext steht folgender Bildname mit Pfad: `~~[code]~~... src="/vis.0/1280x800/img/plan/haus-nacht_st-undefined_ur-undefined_ef-undefined_fr-undefined_ei-0.png" ...[/code]` Was habe ich falsch gemacht?[/i]
-
Was wird bei dir angezeigt?
`var pattern = "/vis.0/1280x800/img/plan/haus-nacht_st-%s_ur-%s_ef-%s_fr-%s_ei-0.png"; var values = []; var myIndexes = [ "hm-rpc.1.MEQ0064913.13.STATE", "hm-rpc.1.MEQ0064913.14.STATE", "hm-rpc.1.MEQ0064913.16.STATE", "hm-rpc.1.MEQ0064913.17.STATE" ]; function createPictureName(doNotWrite) { var result = pattern; for (var i = 0; i < myIndexes.length; i++) { result = result.replace('%s', values[i]); log(result); } if (!doNotWrite) setState('pictureName', result, true); return result; } // Init states var myStates = $('hm-rpc.1.MEQ0064913.*.STATE'); myStates.each(function(id) { var pos = myIndexes.indexOf(obj.id); log('Found ' + id + ' position ' + pos); if (pos != -1) { var val = getState(id).val; values[pos] = (val === true || val === 'true') ? 1 : 0; } }); myStates.on(function(obj) { var pos = myIndexes.indexOf(obj.id); if (pos != -1) { var val = getState(id).val; values[pos] = (val === true || val === 'true') ? 1 : 0; } createPictureName(); }); createState('pictureName', createPictureName(true));` Und ich habe noch Fehler gefunden. War: `~~[code]~~if (id != -1) {[/code]` muss: `~~[code]~~if (pos != -1) {[/code]`[/i]
-
Hallo, danke für deine schnelle Antwort.
Ich habe es hinbekommen.
Habe diesen Teil hier:
` > // Init statesvar myStates = $('hm-rpc.1.MEQ0064913.*.STATE');
myStates.each(function(id) {
var pos = myIndexes.indexOf(obj.id);
log('Found ' + id + ' position ' + pos);
if (pos != -1) {
var val = getState(id).val;
values[pos] = (val === true || val === 'true') ? 1 : 0;
}
});
myStates.on(function(obj) {
var pos = myIndexes.indexOf(obj.id);
if (pos != -1) {
var val = getState(id).val;
values[pos] = (val === true || val === 'true') ? 1 : 0;
}
createPictureName();
}); `
so geändert bei obj und id die in Klammern stehen:
// Init states var myStates = $('hm-rpc.1.MEQ0064913.*.STATE'); myStates.each(function(id) { var pos = myIndexes.indexOf(id); if (pos != -1) { var val = getState(id).val; values[pos] = (val === true || val === 'true') ? 1 : 0; } }).on(function(obj) { var pos = myIndexes.indexOf(obj.id); if (pos != -1) { var val = getState(obj.id).val; values[pos] = (val === true || val === 'true') ? 1 : 0; } createPictureName(); });
Jetzt schreibt er die Werte in den Dateinamen.
Vielen Dank nochmal für deine Hilfe.
-
Na ja.. Erste
var pos = myIndexes.indexOf(obj.id);
Habe ich übersehen. Gut, dass es läuft.