Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Cloud Dienste
    4. [gelöst] Javascript-Gerät (Webrequest) für Alexa anlegen?

    NEWS

    • [erledigt] 15. 05. Wartungsarbeiten am ioBroker Forum

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] Javascript-Gerät (Webrequest) für Alexa anlegen?

    This topic has been deleted. Only users with topic management privileges can see it.
    • Vardaaran
      Vardaaran last edited by

      Hallo,

      ich brauche mal eure Hilfe.

      Grundlagen: Leider muss ich gestehen, dass ich von der ganzen Materie nicht wirklich Ahnung habe.

      Ich kann grundlegende Javascript-Kenntnisse vorweisen, ansonsten müsste ich euch bitten, alles möglichst für „Dummys“ zu erklären.

      Voraussetzungen: Ich steuere meine Geräte mit Hilfe des Light-Manager Airs von JBmedia.

      http://cms.jbmedia.de/index.php?option= … =8&lang=de

      Diesen kann ich ganz einfach über eine Webrequest ansprechen.

      http://cms.jbmedia.de/index.php?option= … 57&lang=de

      Nun würde ich gerne mein Licht, Rollladen etc. über Sprachbefehle steuern. Zu diesem Zweck habe ich mir die gute Alexa bzw. den Amazon Echo ins Haus geholt. Außerdem habe ich einen Raspberry Pi mit ioBroker und Cloud-Adapter zum Laufen bekommen (hoffe ich :oops: ).

      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?

      Schon mal vielen lieben Dank im Voraus!

      1 Reply Last reply Reply Quote 0
      • ruhr70
        ruhr70 last edited by

        @Vardaaran:

        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).

        1 Reply Last reply Reply Quote 0
        • Vardaaran
          Vardaaran last edited by

          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

          1 Reply Last reply Reply Quote 0
          • ruhr70
            ruhr70 last edited by

            @Vardaaran:

            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:

            https://nodejs.org/api/http.html#http_h … s_callback

            1 Reply Last reply Reply Quote 0
            • Vardaaran
              Vardaaran last edited by

              @ruhr70:

              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:

              https://nodejs.org/api/http.html#http_h … s_callback `

              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 Reply Last reply Reply Quote 0
              • ruhr70
                ruhr70 last edited by

                @Vardaaran:

                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

                @Vardaaran:

                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 🙂

                @Vardaaran:

                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.

                @Vardaaran:

                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).

                @Vardaaran:

                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.~~

                1 Reply Last reply Reply Quote 0
                • Vardaaran
                  Vardaaran last edited by

                  Und wieder vielen Dank!

                  @ruhr70:

                  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.) 😄

                  @ruhr70:

                  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 Reply Last reply Reply Quote 0
                  • ruhr70
                    ruhr70 last edited by

                    @Vardaaran:

                    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.

                    @Vardaaran:

                    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.

                    @Vardaaran:

                    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 `

                    1 Reply Last reply Reply Quote 0
                    • Vardaaran
                      Vardaaran last edited by

                      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:

                      1 Reply Last reply Reply Quote 0
                      • ruhr70
                        ruhr70 last edited by

                        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 🙂

                        1 Reply Last reply Reply Quote 0
                        • Vardaaran
                          Vardaaran last edited by

                          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.
                          1 Reply Last reply Reply Quote 0
                          • ruhr70
                            ruhr70 last edited by

                            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!

                            1 Reply Last reply Reply Quote 0
                            • Vardaaran
                              Vardaaran last edited by

                              @ruhr70:

                              (…)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?

                              1 Reply Last reply Reply Quote 0
                              • ruhr70
                                ruhr70 last edited by

                                klar 🙂

                                1 Reply Last reply Reply Quote 0
                                • Vardaaran
                                  Vardaaran last edited by

                                  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!

                                  1 Reply Last reply Reply Quote 0
                                  • ruhr70
                                    ruhr70 last edited by

                                    @Vardaaran:

                                    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 🙂

                                    1 Reply Last reply Reply Quote 0
                                    • Vardaaran
                                      Vardaaran last edited by

                                      @ruhr70:

                                      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

                                      1 Reply Last reply Reply Quote 0
                                      • ruhr70
                                        ruhr70 last edited by

                                        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?

                                        327_simple_api.jpg

                                        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 🙂

                                        1 Reply Last reply Reply Quote 0
                                        • Vardaaran
                                          Vardaaran last edited by

                                          hust man sollte den API-Adapter natürlich auch aktivieren :oops:

                                          Vielen Dank und verzeih meine Inkompetenz!

                                          Klappt jetzt super!

                                          1 Reply Last reply Reply Quote 0
                                          • T
                                            thowans last edited by

                                            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.

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            741
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            5
                                            23
                                            6602
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo