Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Logik zum Abfragen/Schreiben von Werten per REST-API

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Logik zum Abfragen/Schreiben von Werten per REST-API

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

      Hallo zusammen,

      ich weiß aktuell nicht genau wie ich meine Logik umsetzen soll...
      Ich habe einen UniPi am laufen welcher mir per REST-API Temperaturen zurückgeben kann. Weiterhin kann ich über die API auch 8 Relays schalten.

      Da ich die Temperaturen und auch Relays in meinen Skripten verwenden möchte, weiß ich aktuell noch nicht genau wie ich das am Besten machen soll...

      Ich hatte vorher Pimatic im Einsatz, das gab es als IoBroker-Adapter und ich konnte in meinen Regeln einfach den Adapter verwenden. Da ich Pimatic grundsätzlich allerdings nicht so toll fande, habe ich mich doch wieder dagegen entschieden und würde das gerne selber per REST anbinden.

      Zum Schluss würde ich gerne auch noch die Relays in meiner Visualisierung (vis) anzeigen (Relay an Ja/Nein?) und schalten können...

      Ich stehe aktuell etwas auf dem Schlauch und würde mich freuen, wenn mir jemand ein paar Denkanstöße geben könnte.

      Beste Grüße und Vielen Dank im Voraus,
      Luk

      paul53 3 Replies Last reply Reply Quote 0
      • paul53
        paul53 @th3g3ntl3man last edited by

        @th3g3ntl3man sagte: UniPi am laufen welcher mir per REST-API

        Gibt es eine Beschreibung zur API?

        T 1 Reply Last reply Reply Quote 0
        • T
          th3g3ntl3man @paul53 last edited by

          @paul53
          Hier ist die Dokumentation der API: https://evok-14.api-docs.io/1.11/

          Also ich hatte mir sowas vorgestellt, dass ich vielleicht ein Skript schreibe, welches mir bspw. alle 30 Sekunden die Werte per API holt und in selbstdefinierte Variablen schreibt, sodass ich diese in weiteren Skripten abfragen kann...

          Wie ich allerdings bspw. die Relays vernünftig in den IOBroker bekomme, sodass ich sie bspw. auch in der Visualisierung anzeigen könnte, weiß ich noch nicht genau, da ich da eigentlich keine zeitliche Versetzung darin haben möchte...

          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @th3g3ntl3man last edited by paul53

            @th3g3ntl3man sagte: Da ich die Temperaturen und auch Relays in meinen Skripten verwenden möchte

            Laut Doku mittels "request":

            var options = { method: 'GET',
              url: 'http://your-ip-goes-here:8080/json/ai/%7Bcircuit%7D',
              body: '{}' 
            };
            
            request(options, function (error, response, body) {
              if (error) throw new Error(error);
            
              console.log(body);
            });
            

            Damit erst mal für die Temperaturen testen? Oder sind die Temperaturen über 1wire abzufragen?

            Bild_2022-03-22_201744.png

            T 1 Reply Last reply Reply Quote 0
            • T
              th3g3ntl3man @paul53 last edited by

              @paul53
              Vielen Dank schon mal für die schnelle Hilfe!!

              Ich glaube, dass ich kein Problem haben werde, die Skripte an sich zu schreiben, mir geht es eher um den "Best-Practice"-Ansatz.
              Also um das Konzept die Daten zwischen dem IOBroker und dem UniPi sauber zu synchronisieren.

              Ein Beispiel, welches ich aktuell im Kopf habe:

              Skript1: Holt alle Temperaturen des UniPis in einem Intervall von bspw. 30 Sekunden ab.
              Skript2: Holt die Werte der Relays in einem Intervall von ca. 1-2 Sekunden ab, sodass ich diese in meiner Visualisierung direkt anzeigen kann, wenn diese geschaltet werden.
              Skript3-X: Verwendet die Werte von Skript1 und reagiert mit entsprechenden Schaltungen im Homematic etc.

              Ich finde diesen Ansatz allerdings etwas "umständlich"(?) und weiß nicht ob man das vielleicht auch sauberer aufsetzen könnte...
              Zumal weiß ich nicht wie performant das ist alle paar Sekunden die REST-Abfragen durchzuführen...

              Asgothian 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @th3g3ntl3man last edited by paul53

                @th3g3ntl3man sagte: Ich hatte vorher Pimatic im Einsatz

                Wie wurde es damit gemacht (Intervalle)?

                1 Reply Last reply Reply Quote 0
                • Asgothian
                  Asgothian Developer @th3g3ntl3man last edited by Asgothian

                  @th3g3ntl3man sagte in Logik zum Abfragen/Schreiben von Werten per REST-API:

                  @paul53
                  Vielen Dank schon mal für die schnelle Hilfe!!

                  Ich glaube, dass ich kein Problem haben werde, die Skripte an sich zu schreiben, mir geht es eher um den "Best-Practice"-Ansatz.
                  Also um das Konzept die Daten zwischen dem IOBroker und dem UniPi sauber zu synchronisieren.

                  Ein Beispiel, welches ich aktuell im Kopf habe:

                  Skript1: Holt alle Temperaturen des UniPis in einem Intervall von bspw. 30 Sekunden ab.
                  Skript2: Holt die Werte der Relays in einem Intervall von ca. 1-2 Sekunden ab, sodass ich diese in meiner Visualisierung direkt anzeigen kann, wenn diese geschaltet werden.
                  Skript3-X: Verwendet die Werte von Skript1 und reagiert mit entsprechenden Schaltungen im Homematic etc.

                  Ich finde diesen Ansatz allerdings etwas "umständlich"(?) und weiß nicht ob man das vielleicht auch sauberer aufsetzen könnte...
                  Zumal weiß ich nicht wie performant das ist alle paar Sekunden die REST-Abfragen durchzuführen...

                  • Sofern das System keine Push Benachrichtigung erlaubt wirst du um eine regelmässige abfrage nicht herum kommen.
                  • Ich würde an Stelle von "request" die JS Bibliothek "Axios" (https://www.npmjs.com/package/axios) einsetzen - da kannst du (wie in diesem Beispiel beschrieben) mit async / await arbeiten.
                  • um Überlappende Anfragen zu verhindern würde ich die regelmässigen Abfragen nicht über ein Intervall sondern eine sich selber verlängernde Kette von Timeouts lösen:
                  var DataTimeout;
                  async function getData() {
                        try {
                          const resp = await axios.get('yourlink');
                          // handle your response
                      } catch (err) {
                          // Handle Error Here
                          console.error(err);
                      }
                     DataTimeout = setTimeout(getData, 5000)
                  }
                  
                  getData()
                  

                  Kritisch sind bei schnellen Abfragen meiner Ansicht nach genau die überlappenden Anfragen, die entstehen können wenn das Netzwerk langsam ist oder der Server zeit benötigt die Anfrage zu beantworten. Ab welchem Intervall das kritisch ist hängt dabei von vielen Faktoren ab so das du das letztendlich wirst ausprobieren müssen.

                  Wichtig zu beachten ist in diesem Fall auch das es Sinnvoll sein kann Dir innerhalb des Skriptes eine Schattenkopie der Werte der Datenpunkte zu halten deren Quellen du in so schneller Folge abfragst. Dadurch kannst du das aktualisieren der Datenpunkte im ioBroker auf die Fälle begrenzen wo sich der Status geändert hat. Dieses gibt die Möglichkeit ohne den Haken "alle States bei Start abonnieren" zu arbeiten ohne das beim Eintragen der Werte zeitverzögerungen wegen der Notwendigkeit entstehen auf das Ergebnis von "getState" zu warten.

                  Der Ansatz die Aufgaben sauber zu trennen ist meiner Meinung nach sehr sinnvoll:

                  • Eine Ebene um die Werte bereitzustellen. (2 in Deinem Fall wegen der unterschiedlichen Intervalle)
                  • Eine Ebene um auf die Werte (deren Änderung, Aktualisierung) zu reagieren.

                  Das erlaubt es Dir auch für die beiden Ebenen unterschiedliche Logikmaschinen zu benutzen (JS, Blockly, Rules, NodeRed) - Jeweils immer die für die Aufgabe und Dein wissen bestgeeignete.

                  A.

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  811
                  Online

                  31.8k
                  Users

                  80.0k
                  Topics

                  1.3m
                  Posts

                  3
                  7
                  567
                  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