NEWS
URL selbst zusammensetzen bei Klick auf Button
-
Ich würde so versuchen, einen veränderbaren Link zu schicken:
Objekte (Zahl) erstellen, für deine Slider. Diese Objekte oben beim Trigger eintragen, ich habe erstmal nur zwei erstellt. Beim Vergleich auch wieder diese Ojekte auswählen.
Was ich jetzt nicht genau weiß, was passiert beim ersten Aufruf und wie genau, bzw. ob es mit diesen skriptinternen Variablen passiert. Also am besten noch ein paar logs einbauen, damit du genau siehst, was passiert.
Enrico
-
Hallo,
vielen Dank für die Unterstützung, aber irgendwie bin ich wohl zu blöde, um das System zu raffen. Was muss man denn da für komplexe Verrenkungen machen um meinen frommen Wunsch umzusetzen. Kann ich das nicht simpel programmieren? Zur Not rufe ich ein wget mit meiner URL auf. Aber wie und wo kann ich das machen?
Also:
1. habe ich einen festen String. Von mir aus kann ich den in einen Datenpunkt von Typ String mit Namen "arduinoURL" schreiben. Der heißt zB : "http://192.168.1.80/arduino/setR1/"
2. habe ich nun einen Datenpunkt "Treppenlicht.StaticRed" vom Typ Zahl
3. Nun möchte ich daraus eine URL zusammenbauen. Also url = myURL + Integer.toString(Treppenlicht.StaticRed);
4. Diese URL aufrufen. Es darf kein Fenster aufgehen. Sowas wie wget reicht.
Ist das wirklich so ein spezielles Problem? Viele Aufrufe von Smarthome-Geräten funktionieren so (Homematic zB auch!). Nur da gibt es schon fertige Adapter, was es dann einfacher macht.
Viele Grüße
Marcel
-
Vielleicht ist es auch ganz einfach und wir nehmen den falschen Ansatz weil wir deinen Ansatz nicht verstehen.
Viele Aufrufe von Smarthome-Geräten funktionieren so (Homematic zB auch!) `
und die bauen auch automatisch URLs zusammen aus verschiedenen Variablen?Nur da gibt es schon fertige Adapter, was es dann einfacher macht `
und diese Adapter enthalten die Logik (im Hintergrund)Du musst dir deine Logik selber bauen. Dafür sind die Widgets aber nicht zuständig, sondern z.B. der js-Adapter.
Vielleicht verstehe ich es wirklich nicht.
Gruß
Rainer
-
Was muss man denn da für komplexe Verrenkungen machen um meinen frommen Wunsch umzusetzen. `
Du hast dich doch auch für eine komlizierte Variante der Steuerung für deine Stufenbeleuchtung entschieden!
Wer "A" sagt, muss auch "B" sagen!
Die Blockly-Bausteine sind zu sehen, ein bisschen Beschreibung ist auch dabei, also warum probierst du nicht?
Enrico
-
Hi!
Danke für die bisherige Unterstützung. Ich dachte die REST-API Steuerung ist nichts ungewöhnliches. Deshalb habe ich die für den Arduino gewählt. Und ja: Über die REST-API der Homematic kann man die auch steuern. Man muss nur die passende URL zusammenbauen und kann dadurch Aktionen in der Homematic-Zentrale auslösen oder auch Zustände lesen usw. Das "puffert" aber der Homematic-Adapter alles ab. Er stellt uns ein Abbild der Zustände in der CCU zur Verfügung und legt uns freundlicherweise dazu passende Datenpunkte in ioBroker an.
Nun zu meinem Problem: Ich kann es wohl mit dem javascript-Adapter lösen. Ich kann auf das Drücken eines Buttons reagieren (per on() glaube ich) und mir meine eigenen Datenpunkte auslesen. Dann kann ich die Strings aneinanderhängen und mit request() die URL aufrufen.
Das werde ich morgen mal ausprobieren. Mal sehen ob das klappt!
Viele Grüße
Marcel
-
Ich dachte die REST-API Steuerung ist nichts ungewöhnliches. `
OK - Dies ist eine bisher nicht bekannte Zusatzinfo.Damit habe ich noch nie gearbeitet.
Ich kann es wohl mit dem javascript-Adapter lösen. Ich kann auf das Drücken eines Buttons reagieren (per on() glaube ich) und mir meine eigenen Datenpunkte auslesen. Dann kann ich die Strings aneinanderhängen und mit request() die URL aufrufen. `
Genau!Das war unser Ansatz und ist IMHO auch nicht so etwas wie
@Marcel74:komplexe Verrenkungen ` zu machen
Das Skript läuft, wenn es erst einmal geschrieben ist, im Hintergrund und reagiert auf deine Einstellungen.
So müsstest du auch einen Slider mit deinem Datenpunkt (number) verbinden können und dort auf Änderungen reagieren und gut ist.
Gruß
Rainer
-
Ich dachte die REST-API Steuerung ist nichts ungewöhnliches. `
OK - Dies ist eine bisher nicht bekannte Zusatzinfo.Damit habe ich noch nie gearbeitet. `
Noch nie gehört, geschweige denn, mit gearbeitet.
Deine Datenpunkte, die du schon mit Werten von 0-255 hast, sind genau die, die du im Trigger eintragen müsstest. Ich kann leider nur ein bisschen Blockly, bei "normalem" Javaskript bin ich draußen!
Enrico
-
Noch nie gehört, `
Sieh mal hier:https://github.com/ioBroker/ioBroker.simple-api
Ist aber nichts für dich und mich. Nur für echte Programmierer.
Deine Datenpunkte, die du schon mit Werten von 0-255 hast, `
Ich kann auch nur ein wenig blockly, Da gibt es einen Befehl auf Änderung eines Datenpunktes zu reagieren. Damit ist es egal welcher Wert da vorher oder hinterher szeht.Gruß
rainer
-
Noch nie gehört, `
Sieh mal hier:Simple-Api von ioBroker habe ich schon mal gehört und weiß, dass man damit von außerhalb steuern kann. Dass sowas ähnliches mit der CCU auch geht, weiß ich auch, das mache ich z.B. mit Tasker um Werte vom Android-Gerät in die CCU zu bekommen.
Ich kann auch nur ein wenig blockly, Da gibt es einen Befehl auf Änderung eines Datenpunktes zu reagieren. Damit ist es egal welcher Wert da vorher oder hinterher szeht. `
Auf diese Werte soll ja der Trigger in meinem Beispiel reagieren. Diesen Vergleich habe ich nur drin, damit nicht immer alle Zweige abgearbeitet werden. Man kann natürlich auch für jede Farbe ein kürzeres Blockly schreiben, sollte aber grundsätzlich so machbar sein.
offtopic an: sag mal, Rainer, hast du eigentlich fünf oder mehr Bildschirme vor dir um auf alle Forumsfragen zu antworten? offtopic aus! :lol:
Enrico
-
sag mal, Rainer, hast du eigentlich fünf oder mehr Bildschirme vor dir um auf alle Forumsfragen zu antworten? `
Jein!
2 Bildschirme ja, aber nur auf einem alle Foren
der andere für putty, Irfan, notepad….
Gruß
Rainer
-
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