Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Einsteigerfragen
  4. Einbindung von Geräten
  5. Gelöst: Gerät per Rest-Call steuern

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.8k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    887

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

Gelöst: Gerät per Rest-Call steuern

Geplant Angeheftet Gesperrt Verschoben Einbindung von Geräten
11 Beiträge 3 Kommentatoren 108 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • H hrobnik

    Hallo zusammen,

    ich habe ein eigenes Gerät (Raspberry Pi, 2 Relais-Schalter) mit einer Rest-Schnittstelle gebaut und möchte dieses in IO-Broker einbinden.

    Dafür habe ich

    1. in 0_userdata... je ein State-Objekt erstellt mit der Rolle "switch"
    2. in iQontrol daraus je ein Gerät erzeugt / damit verknüpft
    3. Ein JS-Skript erstellt, das auf dieses State-Objekt reagiert und den HTTP-Call abschickt: on('0_userdata...', (data) => { ... })

    Das funktioniert soweit, aber anscheinend mache ich etwas falsch / habe ich etwas übersehen, denn der Zustand der State-Objekte bleibt "unconfirmed" (rot). Das wäre mir egal, aber das Verhalten der iQontrol-Schalter spiegelt das wider: ein Klick führt sofort (korrekterweise) zum Schalten, aber ca. 1 Sekunde lang läuft eine Art Eieruhr, bis der State auf "unconfirmed" geht.

    Wie kann ich (im Skript?) dem State mitteilen, daß die Zustandsänderung korrekt verarbeitet wurde? (Oder mache ich grundlegend etwas falsch?)

    CodierknechtC Offline
    CodierknechtC Offline
    Codierknecht
    Developer Most Active
    schrieb am zuletzt editiert von Codierknecht
    #2

    @hrobnik sagte in Gerät per Rest-Call steuern:

    Wie kann ich (im Skript?) dem State mitteilen, daß die Zustandsänderung korrekt verarbeitet wurde? (Oder mache ich grundlegend etwas falsch?)

    Zeig doch mal Dein Script.
    Um einen State mit ACK-Flag zu setzen, muss der dritte (optionale) Parameter auf true gesetzt sein.

    setState(id, value, true);
    

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

    Proxmox 9.1.1 LXC|8 GB|Core i7-6700
    HmIP|ZigBee|Tasmota|Unifi
    Zabbix Certified Specialist
    Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

    H 1 Antwort Letzte Antwort
    0
    • CodierknechtC Codierknecht

      @hrobnik sagte in Gerät per Rest-Call steuern:

      Wie kann ich (im Skript?) dem State mitteilen, daß die Zustandsänderung korrekt verarbeitet wurde? (Oder mache ich grundlegend etwas falsch?)

      Zeig doch mal Dein Script.
      Um einen State mit ACK-Flag zu setzen, muss der dritte (optionale) Parameter auf true gesetzt sein.

      setState(id, value, true);
      
      H Offline
      H Offline
      hrobnik
      schrieb am zuletzt editiert von
      #3

      @Codierknecht sagte in Gerät per Rest-Call steuern:

      Zeig doch mal Dein Script.
      Um einen State mit ACK-Flag zu setzen, muss der dritte (optionale) Parameter auf true gesetzt sein.

      setState(id, value, true);
      

      Danke für die schnelle Antwort! Den State setze ich per iQontrol, nicht per setState(). (Andere States von z. B. shelly, die ich per iQontrol setze, zeigen das Verhalten nicht.)

      const ids = {
          id: [ prefix + 'x', prefix + 'y' ]
      }
      
      on(ids, (data) => {
          let id = data.id.split('.')
          let name = id[id.length - 1]
          console.log(name);
          console.log(data.state.val)
          switchState(name, data.state.val)
      })
      

      switchState() setzt den HTTP-Request per httpGet() ab.

      CodierknechtC paul53P 2 Antworten Letzte Antwort
      0
      • H Offline
        H Offline
        hrobnik
        schrieb am zuletzt editiert von hrobnik
        #4

        Verstehe ich Dich dahingehend richtig, daß das Skript den Wert (redundant) mit setState(., ., true) setzen sollte, damit der Wert "confirmed" ist?

        Edit: sollte es definitiv nicht, das führt zu eine Endlosschleife...

        1 Antwort Letzte Antwort
        0
        • H hrobnik

          @Codierknecht sagte in Gerät per Rest-Call steuern:

          Zeig doch mal Dein Script.
          Um einen State mit ACK-Flag zu setzen, muss der dritte (optionale) Parameter auf true gesetzt sein.

          setState(id, value, true);
          

          Danke für die schnelle Antwort! Den State setze ich per iQontrol, nicht per setState(). (Andere States von z. B. shelly, die ich per iQontrol setze, zeigen das Verhalten nicht.)

          const ids = {
              id: [ prefix + 'x', prefix + 'y' ]
          }
          
          on(ids, (data) => {
              let id = data.id.split('.')
              let name = id[id.length - 1]
              console.log(name);
              console.log(data.state.val)
              switchState(name, data.state.val)
          })
          

          switchState() setzt den HTTP-Request per httpGet() ab.

          CodierknechtC Offline
          CodierknechtC Offline
          Codierknecht
          Developer Most Active
          schrieb am zuletzt editiert von
          #5

          @hrobnik sagte in Gerät per Rest-Call steuern:

          Andere States von z. B. shelly, die ich per iQontrol setze, zeigen das Verhalten nicht.

          Was sind das denn für "andere States"?
          Welche von Adaptern? Bei denen wäre das das übliche Verhalten. States von Adaptern dürfen nicht mit ACK gesetzt werden, weil das für den Adapter der Anlass ist, überhaupt etwas zu tun. Hat er das erledigt, setzt der Adapter das ACK Flag.
          Bei eigenen States ist das aber auch völlig normal. Eine Vis (wie z.B. iQontrol) weiß ja nicht, ob es ein selbst definierter State ist, bei dem sie das ACK Flag gleich setzen könnte.

          Verstehe ich Dich dahingehend richtig, daß das Skript den Wert (redundant) mit setState(., ., true) setzen sollte, damit der Wert "confirmed" ist?

          Das könntest Du machen. Nachdem Du mit switchState() den Request verarbeitet hast, könntest Du den gleichen Wert manuell erneut setzen.

          Edit: sollte es definitiv nicht, das führt zu eine Endlosschleife...

          Das kommt dadurch, dass Du auf jede Aktualisierung triggerst.
          Wenn Du das änderst und nur auf Änderungen triggerst, sollte das funktionieren.

          on({ id: ids, change: 'ne' }, function() {
          });
          

          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

          Proxmox 9.1.1 LXC|8 GB|Core i7-6700
          HmIP|ZigBee|Tasmota|Unifi
          Zabbix Certified Specialist
          Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

          1 Antwort Letzte Antwort
          2
          • H hrobnik

            @Codierknecht sagte in Gerät per Rest-Call steuern:

            Zeig doch mal Dein Script.
            Um einen State mit ACK-Flag zu setzen, muss der dritte (optionale) Parameter auf true gesetzt sein.

            setState(id, value, true);
            

            Danke für die schnelle Antwort! Den State setze ich per iQontrol, nicht per setState(). (Andere States von z. B. shelly, die ich per iQontrol setze, zeigen das Verhalten nicht.)

            const ids = {
                id: [ prefix + 'x', prefix + 'y' ]
            }
            
            on(ids, (data) => {
                let id = data.id.split('.')
                let name = id[id.length - 1]
                console.log(name);
                console.log(data.state.val)
                switchState(name, data.state.val)
            })
            

            switchState() setzt den HTTP-Request per httpGet() ab.

            paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von
            #6

            @hrobnik sagte: switchState() setzt den HTTP-Request per httpGet() ab.

            Funktion zeigen! Ist sie Teil des Skripts?

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            H 1 Antwort Letzte Antwort
            0
            • H Offline
              H Offline
              hrobnik
              schrieb am zuletzt editiert von hrobnik
              #7

              Kaum macht man es richtig, schon geht es.

              @codierknecht Nach Deinen Erläuterungen habe ich mich für den Filter ack: false entschieden (analog zu den Adaptern) und setze das im Skript mit true. Jetzt verhält sich auch iQontrol wie erwartet.

              Vielen Dank für Deine schnelle Unterstützung.

              1 Antwort Letzte Antwort
              0
              • paul53P paul53

                @hrobnik sagte: switchState() setzt den HTTP-Request per httpGet() ab.

                Funktion zeigen! Ist sie Teil des Skripts?

                H Offline
                H Offline
                hrobnik
                schrieb am zuletzt editiert von
                #8

                @paul53 Ja, sie ist Teil des Skripts, aber nicht Teil des Problems.

                1 Antwort Letzte Antwort
                0
                • CodierknechtC Offline
                  CodierknechtC Offline
                  Codierknecht
                  Developer Most Active
                  schrieb am zuletzt editiert von Codierknecht
                  #9

                  @paul53
                  Das Verhalten in iQontrol lässt sich auch ohne jegliches Script leicht nachstellen.
                  Jeder User-State verhält sich wie oben beschrieben. States der Adapter zeigen das Verhalten nicht. Da setzt der Adapter ja nach erfolgter Änderung das ACK Flag.

                  @hrobnik
                  Vielleicht kann man das in iQontrol auch so einstellen, dass iQontrol das ACK Flag setzt. Aber im Detail habe ich mich mit iQontrol nicht beschäftigt.

                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                  Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                  HmIP|ZigBee|Tasmota|Unifi
                  Zabbix Certified Specialist
                  Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                  paul53P H 2 Antworten Letzte Antwort
                  0
                  • CodierknechtC Codierknecht

                    @paul53
                    Das Verhalten in iQontrol lässt sich auch ohne jegliches Script leicht nachstellen.
                    Jeder User-State verhält sich wie oben beschrieben. States der Adapter zeigen das Verhalten nicht. Da setzt der Adapter ja nach erfolgter Änderung das ACK Flag.

                    @hrobnik
                    Vielleicht kann man das in iQontrol auch so einstellen, dass iQontrol das ACK Flag setzt. Aber im Detail habe ich mich mit iQontrol nicht beschäftigt.

                    paul53P Offline
                    paul53P Offline
                    paul53
                    schrieb am zuletzt editiert von paul53
                    #10

                    @Codierknecht sagte: Da setzt der Adapter ja nach erfolgter Änderung das ACK Flag.

                    Ich würde Ack aus der Callback-Funktion von httpGet() setzen, wenn kein Fehler zurück gemeldet wird.

                            if (!err) setState(dp.id, dp.state.val, true); // Bestätigung
                    

                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                    1 Antwort Letzte Antwort
                    2
                    • CodierknechtC Codierknecht

                      @paul53
                      Das Verhalten in iQontrol lässt sich auch ohne jegliches Script leicht nachstellen.
                      Jeder User-State verhält sich wie oben beschrieben. States der Adapter zeigen das Verhalten nicht. Da setzt der Adapter ja nach erfolgter Änderung das ACK Flag.

                      @hrobnik
                      Vielleicht kann man das in iQontrol auch so einstellen, dass iQontrol das ACK Flag setzt. Aber im Detail habe ich mich mit iQontrol nicht beschäftigt.

                      H Offline
                      H Offline
                      hrobnik
                      schrieb am zuletzt editiert von
                      #11

                      @Codierknecht sagte in Gelöst: Gerät per Rest-Call steuern:

                      Vielleicht kann man das in iQontrol auch so einstellen, dass iQontrol das ACK Flag setzt.

                      Dein ursprünglicher Vorschlag gefällt mir besser, insbesondere mit @paul53 s Vorschlag. Dann verhält sich das Skript wie ein "richtiger" Adapter.

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      343

                      Online

                      32.6k

                      Benutzer

                      82.1k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe