NEWS
[gelöst] Javascript-Gerät (Webrequest) für Alexa anlegen?
-
Frage 1: Wie erstelle ich jetzt genau ein Gerät, welches von Alexa erkannt wird und meine Requests sendet (über den JS-Adapter)?
Frage 2: Damit auch das Dimmen funktioniert, muss ich von Alexa natürlich den entsprechenden (%)-Wert erhalten. Ich habe gelesen, dass dies möglich ist bzw. Alexa den Wert übergeben kann. Wie speichere / erhalte ich aber diesen Wert in einer Variable, welchen ich dann in einer Switch-Case-Abfrage weiterverarbeiten kann? `
tasten wir uns mal ran:
zu 1.):
Probier mal:
! ````
// Webseiten/URLs abfragen mit Fehlerbehandlung, siehe:
// http://forum.iobroker.net/viewtopic.php?f=21&t=4259&p=40890&hilit=request#p40880
! var logOn = true; // Skript Logausgabe ein- (true) / ausschalten (false). Fehler werden immer ausgegeben.
var forecreation = false; // Default: false. true: Datenpunkte werden überschrieben (wenn z.B. Bezeichnungen geändert wurden)
var http = require('http'); // Node Module http verwenden
! // URL, die abgefragt, bzw. gesendet werden soll:
var options = {
host: '192.168.1.100',
path: '/config.xml',
method: 'POST' // in der Regel: "GET"
};
! // OPTIONAL: regelmässige Wiederholungen der Abfrage
var cronStr = "* */6 * * *";
! // Datenpunkte anlegen:
// -----------------------------------------------------------------------------
! var pfad = "test.alexatrigger" + "."; // PFad unter dem in der Javascript-Instanz die Datenpunkte angelegt werden sollen:
! // Datenpunktnamen:
var idAlexaTrigger = pfad + 'alexa_trigger';
! createState(idAlexaTrigger, 0, forecreation, {
name: 'Trigger für Alexa',
desc: 'Trigger mit Level für Alexa um einen hhtp request zu erzeugen',
type: 'number',
unit: '',
role: 'value'
});
! // Funktionen:
! function webseiteAbfragen() {
var req = http.get(options, function(res) {
if(logOn) log('STATUS: ' + res.statusCode); // Statuscode
if(logOn) log('HEADERS: ' + JSON.stringify(res.headers)); // Header (Rückmeldung vom Webserver)
! // Buffer the body entirely for processing as a whole.
var bodyChunks = [];
var chunkLine = 0;
res.on('data', function(chunk) {
chunkLine = chunkLine + 1;
if(logOn) log("Zeilennummer: " + chunkLine+ " ,Inhalt: " + chunk);// Hier können die einzelnen Zeilen verarbeitet werden... bodyChunks.push(chunk); }).on('end', function() { if(logOn) log("ARRAY mit den einzelnen Zeilen: " + bodyChunks); if(logOn) log("ARRAY Länge: " + bodyChunks.length);
! var body = Buffer.concat(bodyChunks);
! if(logOn) log('BODY: ' + body);
// ...und/oder das Gesamtergebnis.
! });
});
! req.on('error', function(e) { // Fehler abfangen
log('ERROR: ' + e.message,"warn");
});
}
! // SUBSCRIPTIONS
// -----------------------------------------------------------------------------
! on({id: "javascript."+instance+"."+idAlexaTrigger ,change:'any'}, function (obj) {
if(logOn) log("Alexa Trigger wurde geschrieben: " + obj.state.val);
main();
});
! // OPTIONAL: regelmässige Wiederholungen
// -----------------------------------------------------------------------------
// Kommentar entfernen, wenn regelmässige Wiederholungen gewünscht sind:
// schedule(cronStr, main);
! // main
// -----------------------------------------------------------------------------
function main() {
webseiteAbfragen();
}
! // Start Skript:
// -----------------------------------------------------------------------------
! // Kommentar entfernen, wenn die Abfrage zum Skriptstart ausgeführt werden soll:
setTimeout(main, 500);
! ````Unter options musst Du die gewünschte ip und den Pfad mit der gewünschten Aktion anpassen.
Es wird in Deiner Javascript-Instanz ein Datenpunkt angelegt, den Du dann im Cloud Adapter hinzufügen und mit einem Smartnamen versehen kannst (Admin/Instanzen/Cloud/Geräte das Plus). In der Alexa-App musst Du danach einmal neu synchronisieren.
In diesem ersten Step sollte dann bei jedem "Alexa, schalte smartname an/aus" oder "Alexa, stelle smartname auf 30%" die selbe Funktion ausgeführt werden.
Wenn das grundsätzlich funktioniert machen wir weiter
Ich brauche dann die richtige url und die Werte, die dort eingesetzt werden sollen (LEVEL).
-
erst mal vielen Dank für Deine Hilfe und Deine Mühen!
Ich kapiere das Ganze immer noch nicht und werde die wieder behaupten, etwas von JS zu verstehen. :oops:
Leider funktioniert das Ganze auch noch nicht.
Das Script habe ich wie beschrieben angepasst und damit ein Objekt erzeugt, dass dann im Cloud-Adapter für Alexa angegeben wurde.
Auch Alexa hat das "Smart Gerät" erkannt und führt brav den Befehl "Licht an/aus" aus.
Allerdings wird das Request offenbar nicht gesendet bzw. die Funktion ausgeführt und im Log ist ein Fehler zu sehen.
(siehe Anhänge)
Ich habe wie gesagt, keine Ahnung was da passiert, möchte aber dennoch Vermutungen zur möglichen Fehlerursache loswerden:
1. Da mein "Sendegerät" auch von außen zugänglich ist, hat es einen Schutz mit Benutzer und Passwort. Dieser muss daher bei jeder Anfrage an die IP gehängt werden (BENUTZER:PW@IP) und enthält Sonderzeichen.
2. Der Sender arbeitet nicht wie üblich auf Port 80, sondern wie zusehen auf 31! Habe dies auch bei der IP so angegeben (IP:31)
Würde mich über weitere Hilfe sehr freuen und nochmals vielen Dank!
2335_a01.jpg
2335_a02.jpg
2335_a03.jpg -
be wie gesagt, keine Ahnung was da passiert, möchte aber dennoch Vermutungen zur möglichen Fehlerursache loswerden:
1. Da mein "Sendegerät" auch von außen zugänglich ist, hat es einen Schutz mit Benutzer und Passwort. Dieser muss daher bei jeder Anfrage an die IP gehängt werden (BENUTZER:PW@IP) und enthält Sonderzeichen.
2. Der Sender arbeitet nicht wie üblich auf Port 80, sondern wie zusehen auf 31! Habe dies auch bei der IP so angegeben (IP:31) `
Pass mal bitte die Optionen wie folgt an:
// URL, die abgefragt, bzw. gesendet werden soll: var options = { host: '192.168.1.100', path: '/config.xml', port: 31, auth: 'user:password', method: 'POST' // in der Regel: "GET" };
Als Methode hatte ich POST eingetragen, da das in dem Link, den Du oben gepostet hattest als vorteilhaft beschrieben wurde. Würde aber auch beides probieren.
Die Beschreibung für das node Module "http" findest Du hier:
-
Als Methode hatte ich POST eingetragen, da das in dem Link, den Du oben gepostet hattest als vorteilhaft beschrieben wurde. Würde aber auch beides probieren.
Die Beschreibung für das node Module "http" findest Du hier:
Habe schon beim ersten testen das POST in GET geändert. Wollte nicht gleich mit Kanonen auf Spazen schießen…
Habe die Änderungen so vorgenommen und: LÄUFT PERFEKT! Vielen, vielen Dank!
Wärst Du bereit mir hier ein paar (dumme) Fragen zu beantworten? Würde sehr gerne etwas lernen…
1. Der Code-Teil:
! ````
// Datenpunkte anlegen:
// -----------------------------------------------------------------------------
! var pfad = "test.alexatrigger" + "."; // Pfad unter dem in der Javascript-Instanz die Datenpunkte angelegt werden sollen:
! // Datenpunktnamen:
var idAlexaTrigger = pfad + 'alexa_trigger';
! createState(idAlexaTrigger, 0, forecreation, {
name: 'Trigger für Alexa',
desc: 'Trigger mit Level für Alexa um einen http request zu erzeugen',
type: 'number',
unit: '',
role: 'value'
});Ist für die Funktion nicht relevant und könnte auch weggelassen werden, sofern der Datenpunkt manuell unter Objekte angelegt wird, oder? 2\. >! ```` // main // ----------------------------------------------------------------------------- function main() { webseiteAbfragen(); } >! // Start Skript: // ----------------------------------------------------------------------------- >! // Kommentar entfernen, wenn die Abfrage zum Skriptstart ausgeführt werden soll: setTimeout(main, 500);
Das ist doppelt, oder?
Möglich wäre auch:
! ````
// main
// -----------------------------------------------------------------------------
function main() {
webseiteAbfragen();
}
! // Start Skript:
// -----------------------------------------------------------------------------
! // Kommentar entfernen, wenn die Abfrage zum Skriptstart ausgeführt werden soll:
setTimeout(webseiteAbfragen, 500);Oder? 3\. Das Script muss immer "laufen" (siehe Screenshot), ![](http://forum.iobroker.net/download/file.php?mode=view&id=10323&sid=08ee779a3734e38bf76c6bb37379f86b)~~![](</s><URL url=)<link_text text="http://forum.iobroker.net/download/file ... b37379f86b">http://forum.iobroker.net/download/file.php?mode=view&id=10323&sid=08ee779a3734e38bf76c6bb37379f86b</link_text>" /> da es den Datenpunkt "Alexa_trigger" ständig überwacht und damit die Verbindung von Datenpunkt (also quasi Alexa's Arm ;) ) und dem JS herstellt?! 4\. Das ist der Teil, welcher auf Alexa bzw. den Datenpunkt reagiert und dann die Funktion "main" bzw. "webseiteAbfragen" ausführt, richtig? >! ` > // SUBSCRIPTIONS > > // –--------------------------------------------------------------------------- > > on({id: "javascript."+instance+"."+idAlexaTrigger ,change:'any'}, function (obj) { > > if(logOn) log("Alexa Trigger wurde geschrieben: " + obj.state.val); > > main(); > > }); ` Hier reagiert er jetzt auf ****jeden**** Befehl mit der Funktion "Main" bzw. "webseiteAbfragen", da hier: >> id: "javascript."+instance+"."+idAlexaTrigger ,change:'****any****' << steht, richtig? 5\. Theoretisch müsste ich also in diesem (bei 4\. genannten) Bereich reagieren und die Variablen von "options" (eigentlich nur "path") entsprechend ändern und dann die Funktion "webseiteAbfragen" ausführen. Richtig? ****<size size="150">Nochmals vielen, vielen, VIELEN DANK für die Hilfe!!</size>****~~ ~~[2335_b01.jpg](/assets/uploads/files/2335_b01.jpg)~~
-
1. Der Code-Teil:
! ````
// Datenpunkte anlegen:
// -----------------------------------------------------------------------------
! var pfad = "test.alexatrigger" + "."; // Pfad unter dem in der Javascript-Instanz die Datenpunkte angelegt werden sollen:
! // Datenpunktnamen:
var idAlexaTrigger = pfad + 'alexa_trigger';
! createState(idAlexaTrigger, 0, forecreation, {
name: 'Trigger für Alexa',
desc: 'Trigger mit Level für Alexa um einen http request zu erzeugen',
type: 'number',
unit: '',
role: 'value'
});Ist für die Funktion nicht relevant und könnte auch weggelassen werden, sofern der Datenpunkt manuell unter Objekte angelegt wird, oder? `
Korrekt.
Ich lege die Datenpunkte immer im dazugehörigen Skript mit an, damit ich nur das Skript sichern muss.
Du kannst einen Datenpunkt auch manuell anlegen oder einen bereits angelegten Datenpunkt manuell erweitern.
Du kannst auch kürzere Formen zum Anlegen von Datenpunkten wählen oder auch noch mehr Attribute mit angeben (min/max macht in Deinem Fall ggf. Sinn).
siehe createState(): https://github.com/iobroker/ioBroker.ja … reatestate
Zweit kürzeste Variante zum Anlegendes Datenpunkts ist z.B.:
createState(idAlexaTrigger, 0);
Eine Übersicht der sonst möglichen Attribute bei einem Datenpunkt/Objekt findest Du hier:
https://github.com/ioBroker/ioBroker/bl … ject-types
2.
! ````
// main
// -----------------------------------------------------------------------------
function main() {
webseiteAbfragen();
}
! // Start Skript:
// -----------------------------------------------------------------------------
! // Kommentar entfernen, wenn die Abfrage zum Skriptstart ausgeführt werden soll:
setTimeout(main, 500);Das ist doppelt, oder? Möglich wäre auch: >! ```` // main // ----------------------------------------------------------------------------- function main() { webseiteAbfragen(); } >! // Start Skript: // ----------------------------------------------------------------------------- >! // Kommentar entfernen, wenn die Abfrage zum Skriptstart ausgeführt werden soll: setTimeout(webseiteAbfragen, 500);
Oder? `
Auch korrekt.
In Deiner Variante könntest Du main() dann noch komplett weglassen, wenn Du die Abfrage auch in der Subscription (on()) änderst. Die Funktion main() kommt dann nirgendwo mehr vor.
Das Skript verwendet derzeit nur eine Funktion (webseiteAbfragen()). Ich verwende es in der Form als Grundgerüst. Wenn nun in der "Hauptfunktion" mehrere andere Funktionen aufgerufen werden, muss ich das nur an einer Stelle anpassen. Wir haben mit dem http-Request nun den ersten Schritt. Dein erster Post ging in die Richtung, dass wir danach noch was zu tun haben
3. Das Script muss immer "laufen" (siehe Screenshot),
~~![](</s><URL url=)<link_text text="http://forum.iobroker.net/download/file ... b37379f86b">http://forum.iobroker.net/download/file.php?mode=view&id=10323&sid=08ee779a3734e38bf76c6bb37379f86b</link_text>" />
da es den Datenpunkt "Alexa_trigger" ständig überwacht und damit die Verbindung von Datenpunkt (also quasi Alexa's Arm
) und dem JS herstellt?!~~ ` ~~Auch korrekt.
Wenn Du das Skript beendest, wird auch die Subscription (on()) beendet und der Datenpunkt wird nicht mehr für Alexa getriggert.
4. Das ist der Teil, welcher auf Alexa bzw. den Datenpunkt reagiert und dann die Funktion "main" bzw. "webseiteAbfragen" ausführt, richtig?
! ` > // SUBSCRIPTIONS
// –---------------------------------------------------------------------------
on({id: "javascript."+instance+"."+idAlexaTrigger ,change:'any'}, function (obj) {
if(logOn) log("Alexa Trigger wurde geschrieben: " + obj.state.val);
main();
}); `
Hier reagiert er jetzt auf jeden Befehl mit der Funktion "Main" bzw. "webseiteAbfragen", da hier:id: "javascript."+instance+"."+idAlexaTrigger ,change:'any' <<
steht, richtig? `
Auch wieder korrekt.
Die Beschreibung dazu findest Du hier:
https://github.com/iobroker/ioBroker.ja … some-state
Ich habe any verwendet, da es vorkommen könnte, dass Du z.B. über Alexa zweimal ein "schalte ein" (also true) benötigst, da eventuell zwischendurch per Schalter ausgeschaltet wurde.
Schau Dir mal die Beschreibung an. Du hast an der Stelle schon zig Varianten im Vorfeld zu filtern, z.B. nur zu reagieren, wenn der Datenpunkt geändert wurde (change:'ne' -> not equal) oder wenn der neue Wert true ist. Mit "any" kommt erst einmal alles innerhalb der Funktion an und Du musst es dort weiter verarbeiten. Bei Alexa ist es ja eher gewünscht, dass "an" (true), "aus" (false) uns "stelle auf 40%" funktioniert. Un da man die gewünschten Geräte in der Regel manuell bedienen kann, auch mehrmals hintereinander.
Ich habe übrigens extra den type:'number' für den Datenpunkt gewählt, damit Du nicht nur an und aus nutzen kannst, sondern auch noch prozentuale Angaben (Level).
5. Theoretisch müsste ich also in diesem (bei 4. genannten) Bereich reagieren und die Variablen von "options" (eigentlich nur "path") entsprechend ändern und dann die Funktion "webseiteAbfragen" ausführen. Richtig? `
Und wieder korrekt.
Bei true setzte Du z.B. den Pfad mit den Kommando fürs einschalten, bei false umgekehrt. Und wenn Du einen Level benötigst, möglichst einen entsprechenden Pfad, in dem der Level eingesetzt wird. Der Cloud Adapter rechnet die Werte für min/max übrigens direkt richtig um. D.h., wenn Dein max. z.B. 80 ist und Du dies im Datenpunkt mit definiert hast, dann wird an Alexa mit dem Kommando "Level auf 100%" eine 80 geschickt.~~
-
Und wieder vielen Dank!
Ich lege die Datenpunkte immer im dazugehörigen Skript mit an, damit ich nur das Skript sichern muss. `
Das ist natürlich sehr sinnvoll und ich werde das Zukünftig wohl auch so machen.Meine Fragen auch bitte nicht als Kritik verstehen, sondern als Versuch, das Ganze wirklich zu verstehen und später selbstständig abändern zu können (habe noch 2 weitere Lampen und Rolläden etc.)
Der Cloud Adapter rechnet die Werte für min/max übrigens direkt richtig um. D.h., wenn Dein max. z.B. 80 ist und Du dies im Datenpunkt mit definiert hast, dann wird an Alexa mit dem Kommando "Level auf 100%" eine 80 geschickt. `
Das ist natürlich sehr praktisch!
Ich habe einen Dimmer mit 16 Stuffen. Also gebe ich dem Datenpunkt ein min von 0 und max von 16. Wenn ich Alexa jetzt also sage, sie soll auf 50% dimmen, bekommt der Datenpunkt einen Wert von 8, richtig? Wie genau wird dann hier gerundet? Also erhalte ich bei Anweisungen unter 6% 0, oder wird immer aufgerundet?
Zum Schluss wieder ein paar zusätzliche (dumme) Anfänger-Fragen:
1. Du greifst auf den Wert des Datenpunktes über
> obj.state.val
zu, richtig? Dazu muss der Datenpunkt aber in der Variable "obj" gespeichert sein, oder?Geschieht dies hier in Zeile 87?
on({id: "javascript."+instance+"."+idAlexaTrigger ,change:'any'}, function (obj)...
Also wird hier automatisch die durch ON überprüfte ID an die folgende Funktion als Variable übergeben?
2. Könnte ich alternativ zu 1. auch einfach
var NAME = getState("ID").val
schreiben?
3. Wenn man bei
on({id: "javascript."+instance+"."+idAlexaTrigger ,change:'any'}, function (obj)...
Den Tag "id:" und "change:'any'" weglässt, wird die Funktion dann nicht auch bei jeder Änderung (auch setzen auf den gleichen Wert) ausgelöst?
Also:
on("javascript."+instance+"."+idAlexaTrigger, function (obj)...
Nochmals und wieder, vielen Dank!
-
1. Du greifst auf den Wert des Datenpunktes über
> obj.state.val
zu, richtig? Dazu muss der Datenpunkt aber in der Variable "obj" gespeichert sein, oder?Geschieht dies hier in Zeile 87?
on({id: "javascript."+instance+"."+idAlexaTrigger ,change:'any'}, function (obj)...
Also wird hier automatisch die durch ON überprüfte ID an die folgende Funktion als Variable übergeben? `
Richtig… als Objekt.
Du erhält das Objekt zu dem Datenpunkt zurück, mit den statischen Werten und den dynamischen Teil (state).
Wie das Objekt aufgebaut ist und was es enthält, siehe:
https://github.com/iobroker/ioBroker.ja … some-state
obj ist nur der Variablenname, denn Du in function(obj) angibst. Du kannst da auch jeden anderen beliebigen Namen verwenden.
Im Forum finest Du z.B. auch oft "dp" für Datenpunkt in den Beispielen.
Dann heisst Dein Objekt im weiteren Verlauf innerhalb von on() halt dp und der Wert darin dp.state.val und nicht mehr obj.state.val.
2. Könnte ich alternativ zu 1. auch einfach
var NAME = getState("ID").val
schreiben? `
Richtig. So bekommst Du auch den Wert (.val) im Objekt, wenn Du ihn gezielt im Skript abfragen musst.
3. Wenn man bei
on({id: "javascript."+instance+"."+idAlexaTrigger ,change:'any'}, function (obj)...
Den Tag "id:" und "change:'any'" weglässt, wird die Funktion dann nicht auch bei jeder Änderung (auch setzen auf den gleichen Wert) ausgelöst?
Also:
on("javascript."+instance+"."+idAlexaTrigger, function (obj)... ```` `
Na endlich :twisted:
Die Voreinstellung sollte 'ne' sein. D.h., wenn Du change:'any' weglässt, dann reagiert Deine Subscription nur auf Änderungen, wenn sich der Wert in obj.state.val) vom vorherigen unterscheidet (ne - not equal).
So steht es zumindestens in der Doku:
` > "ne" (not equal) New value must be not equal to the old one (state.val != oldState.val)
If pattern is id-string this value is used by default `
-
und wie immer: Vielen Dank!
Bitte noch kurz eine Erklärung zu:
@Vardaaran:Ich habe einen Dimmer mit 16 Stuffen. Also gebe ich dem Datenpunkt ein min von 0 und max von 16. Wenn ich Alexa jetzt also sage, sie soll auf 50% dimmen, bekommt der Datenpunkt einen Wert von 8, richtig? Wie genau wird dann hier gerundet? Also erhalte ich bei Anweisungen unter 6% 0, oder wird immer aufgerundet? `
Meine Versuche hierzu waren ziemlich Irreführend. So hat Alexa den Wert des (aktuellen, ohne min/max) Datenpunkts auf 80 gesetzt, obwohl ich 8% gesagt habe. Ich habe über die Alexa-App kontrolliert was sie verstanden hat, und es waren 8%.Auch bei rauf und runterdimmen kamen seltsame Werte raus; Meist 25er Schritte, aber selten in die richtige Richtung. Einmal kam sogar eine Bruchzahl raus. :shock:
-
An der Stelle bin ich leider raus
Ich habe nur Geräte, die auch wirklich Werte von 0…100 haben, z.B. Philips hue Lampen.
Die Info mit den min und max hatte ich aus folgenden Thread:
http://forum.iobroker.net/viewtopic.php?f=37&t=5580
Lies Dir das mal bis zum Ende durch (ist nur eine Seite).
Wenn es eine Erkenntnis daraus gibt, wäre ich um eine Info dankbar
-
Habe es geschafft!
Meine Alexa schaltet und dimmt mein Licht jetzt exzellent.
Nochmals vielen, vielen Dank für die Hilfe!
Mein Script sieht jetzt so aus:
! ````
var logOn = false; // Skript Logausgabe ein- (true) / ausschalten (false). Fehler werden immer ausgegeben.
var forecreation = false; // Default: false. true: Datenpunkte werden überschrieben (wenn z.B. Bezeichnungen geändert wurden)
var http = require('http'); // Node Module http verwenden
! // Datenpunkte anlegen:
// -----------------------------------------------------------------------------
var idDatenpunkt = "alexa.arbeitszimmer.raumlicht"; // Pfad und Name, unter dem in der Javascript-Instanz der Datenpunkte angelegt wird
createState(idDatenpunkt, 0, forecreation, { // Datenpunkt wird angelegt
name: 'Arbeitszimmer Raumlicht',
desc: 'Hauptbeleuchtung des Arbeitszimmers',
type: 'number',
unit: '%',
def: 0,
min: 0,
max: 100,
role: 'value'
});
! // Funktionen:
// -----------------------------------------------------------------------------
function requestSenden(options) {
var req = http.get(options, function(res) {
if(logOn) log('STATUS: ' + res.statusCode); // Statuscode
if(logOn) log('HEADERS: ' + JSON.stringify(res.headers)); // Header (Rückmeldung vom Webserver)
! // Buffer the body entirely for processing as a whole.
var bodyChunks = [];
var chunkLine = 0;
res.on('data', function(chunk) {
chunkLine = chunkLine + 1;
if(logOn) log("Zeilennummer: " + chunkLine+ " ,Inhalt: " + chunk);// Hier können die einzelnen Zeilen verarbeitet werden... bodyChunks.push(chunk); }).on('end', function() { if(logOn) log("ARRAY mit den einzelnen Zeilen: " + bodyChunks); if(logOn) log("ARRAY Länge: " + bodyChunks.length);
! var body = Buffer.concat(bodyChunks);
! if(logOn) log('BODY: ' + body); // ...und/oder das Gesamtergebnis.
! });
});
! req.on('error', function(e) { // Fehler abfangen
log('ERROR: ' + e.message,"warn");
});
}
! // Level Einstellen
// -----------------------------------------------------------------------------
function leveldef(dp) {
dpWert = dp.state.val;if (dpWert === 0) { rqPath = '/control?cmd=off,typ,it,did,974500,aid,2,acmd,0,seq,5&id=2'; } else { lichtlvl = Math.ceil(dpWert / 100 * 16); rqPath = '/control?cmd=dim,typ,it,did,974500,aid,2,acmd,5,lvl,' + lichtlvl + ',seq,5&id=2'; } var options = { // URL, die abgefragt, bzw. gesendet werden soll host: '192.168.0.131', path: rqPath, port: 31, auth: 'BENUTZER:PASSWORT', method: 'GET' }; requestSenden(options);
}
! // Abfrage des Datenpunkts
// -----------------------------------------------------------------------------
on({id: "javascript.0." + idDatenpunkt, change:'any'}, function (dp) {
leveldef(dp);
});Bezüglich Werte hatte ich auch eine Eingebung auf dem Klo - ja, da kommen oft die besten Ideen: ;) :D Man muss den Wert des Datenpunktes mit "unit: '%'" als %-Wert definieren. Macht man dies nicht, rechnet der Cloud-Adapter die Prozente von Alexa mit dem aktuellen Wert des Datenpunkts. Steht der DP z.B. auf 50 und sagt Alexa: "setze auf 50%" dann bekommt man: 50% von 50 = 25… Deswegen, und weil ich zwischen 1% und 6% immer die erste Stufe meiner Lampe möchte, habe ich mich für die " Rechnungs-Variante" entschieden.
-
Super! Und danke für die Rückmeldung
Kannst Du bitte im ersten Post vor dem Betreff noch ein [gelöst] setzen.
Viel Spaß mit ioBroker und Alexa!
-
(…)Kannst Du bitte im ersten Post vor dem Betreff noch ein [gelöst] setzen.(…) `
Sehr gerne!Darf ich zukünftige Fragen zu diesem Thema dennoch weiterhin hier posten?
-
klar
-
Habe mal noch eine doofe Anfänger-Frage, die ich trotz Suche nicht beantwortet bekomme: :oops:
Kann ich den Zustand eines Datenpunkts auch über einen HTML-Link in einem Browser ändern? Wenn ja, wie? Wenn möglich ohne ioBroker.vis…
Vielen Dank im Voraus!
-
Kann ich den Zustand eines Datenpunkts auch über einen HTML-Link in einem Browser ändern? Wenn ja, wie? Wenn möglich ohne ioBroker.vis… `
Schau mal unter: https://github.com/ioBroker/ioBroker.si … DME.md#set
mhhh… neue Fragen in einem [gelöst] Thread ist doch nicht so glücklich
Am Besten machst Du für eine neue Frage zu einem neuen Thema ein Thread auf.
Ich denke, dann wird Dir schneller geholfen, da man dann auch eher reinschaut
-
Schau mal unter: https://github.com/ioBroker/ioBroker.si … DME.md#set
mhhh… neue Fragen in einem [gelöst] Thread ist doch nicht so glücklich
Am Besten machst Du für eine neue Frage zu einem neuen Thema ein Thread auf.
Ich denke, dann wird Dir schneller geholfen, da man dann auch eher reinschaut
`
Vielen Dank!
Werde in Zukunft einen neuen Thread aufmachen. Danke für den Hinweis.
Soll ich mit der oberen Frage einen neuen Thread erstellen und gleich als gelöst markieren?
Nicht ernst gemeint…
EDIT: Etwas zu früh gefreut!
Was mache ich falsch?
> [<link_text text="http://192.168.0.132:8087/set/javascrip … int">Licht">http://192.168.0.132:8087/set/javascript.0.alexa.arbeitszimmer.raumlicht?value=100&prettyPrint">Licht</link_text> an](<URL url=)
Kommt immer:!
![](</s><URL url=)<link_text text="http://forum.iobroker.net/download/file ... 30abd09bb2">http://forum.iobroker.net/download/file.php?mode=view&id=10857&sid=d1760c5c1ca4747d16e29b30abd09bb2</link_text>" />2335_link01.jpg -
Firewall?
Falsche IP von ioBroker? Deine andere Abfrage war im Netz 192.168.1.x und diese im Netz 192.168.0.x?
Im Admin vom Adapter nicht das Netz (oder alle Netze 0.0.0.0? zugelassen?
Adapter nicht eingeschaltet?
Ich habe das gerade nachgestellt. Bei mir funktioniert es genau so, wie Du die URL aufgebaut hast:
http://172.16.130.210:8087/set/javascript.2.test.b?value=100&prettyPrint
Antwort:
{ "id": "javascript.2.test.b", "value": 100, "val": 100 }
Und im Objekt steht der Wert auch
-
hust man sollte den API-Adapter natürlich auch aktivieren :oops:
Vielen Dank und verzeih meine Inkompetenz!
Klappt jetzt super!
-
Vielen Dank für dieses Thema und für die Antworten. Kann mir jemand sagen, ob ich das auf eine Website basierend auf benutzerdefinierten Design-Vorlage von hier https://www.templatemonster.com/de/ aus anwenden kann? Ich habe ein kleines Projekt, aber ich weiß nicht alle Momente, um es zu beenden.
-
Was hat das mit ioBroker zu tun?
Ist das Werbung?
Bitte um Klarstellung
Gruß
Rainer