Hi,
so, ich habe mich gestern noch ein bisschen mit dem Javascript befasst und habe eine Lösung. Für die Nachwelt:
1. Ein Button in VIS anlegen, der mit einem Datenpunkt verknüpft ist, den ihr entweder unter "Objekte" selbst erzeugt oder (besser) im Javascript mit create() erzeugen lasst. Vorteil der letzten Moethode: Ihr müsst nur das JS sichern und hinterher im Falle einer Wiederherstellung nicht auch die Objekte wieder von Hand erzeugen.
2. Im Javascript müsst ihr euch per on() in die "Überwachungsliste" eintragen ("subscription"). Diese überwacht dann den übergebenen Zustand. Aber Achtung! Die offizielle Dokumentation für on() ist an einer Stelle fehlerhaft. Dort steht geschrieben, dass ohne Angabe des Parameters "change" die Überwachung auf jegliche Änderung oder Aktualisierung getriggert wird. Dies ist für den Button wichtig, da dieser immer nur und ausschließlich "true" liefert und bei einem Klick nur der Zeitstempel geändert wird. Aber das stimmt nicht! Ohne den Parameter change wird auf "ne" getestet, und das bedeutet, dass nur getriggert wird, wenn sich der Wert ÄNDERT! Das passiert aber bei dem Button nie (er bleibt ja immer auf true). Man muss für diesen Fall also unbedingt check: "any" eintragen. Mein javascript sieht demnach so aus:
//Datenpunkt für Buttons und Werte aus den Slidern anlegen
createState('javascript.0.VIS.setStatic1', false, {name: 'Treppe_setStatic1_script'});
createState('Treppenbeleuchtung.0.staticRed', 128, {name: 'Treppenlicht_Rotanteil'});
createState('Treppenbeleuchtung.0.staticGreen', 128, {name: 'Treppenlicht_Gruenanteil'});
createState('Treppenbeleuchtung.0.staticBlue', 128, {name: 'Treppenlicht_Blauanteil'});
//URL zum Arduino (nur linker Teil ohne Parameter):
var arduinoUrl = 'http://192.168.2.80/arduino/setStatic1/';
log("Script SetStatic1 initiated"); //Eintrag im log, dass das Script läuft
on({id: "javascript.0.VIS.setStatic1", change: "any" }, function (obj) {
if (!obj.state.ack && obj.state.val) {
//Datenpunkte auslesen
var redValue = getState('Treppenbeleuchtung.0.staticRed').val;
var greenValue = getState('Treppenbeleuchtung.0.staticGreen').val;
var blueValue = getState('Treppenbeleuchtung.0.staticBlue').val;
//Die Farbwerte an die URL anhängen, so wie mein Arduino das erwartet
var steuerbefehl = arduinoUrl + redValue + "/" + greenValue + "/" + blueValue;
request(steuerbefehl); //Die URL aufrufen, die Rückgabe verwerfen (alternativ: Rückantwort des Servers ins log schreiben)
log("Requesting:" + steuerbefehl); //log: Den an den Arduino übergebenen String mitloggen.
}
});
Viele Grüße
Marcel