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
    893

  • 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 110 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 Offline
    H Offline
    hrobnik
    schrieb am zuletzt editiert von hrobnik
    #1

    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 1 Antwort Letzte Antwort
    0
    • 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

                        527

                        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