Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Schnelle Änderungen am Triggerobjekt auswerten?

    NEWS

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

    Schnelle Änderungen am Triggerobjekt auswerten?

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

      Da sich die Logic beim Shelly Gen.2 gegenüber der Gen.1 etwas geändert hat, bin ich auf der Suche nach eine Lösung für folgendes Problem:

      Bei Gen.2 wurden ein paar Datenpunkte zusammengeschmissen, was eben dazu führt, dass z.B. ein Longpush nicht mehr mit true, oder false hinterlegt wird, sondern in einen Event zusammen mit dem Button-Status zusammengeschmissen wird.
      So z.B. sieht ein short_push aus:

        {
          "ts": 1736716265.022,
          "level": 2,
          "data": "shelly_notification:208 Event from input:0: {\"component\":\"input:0\",\"id\":0,\"event\":\"btn_down\",\"ts\":1736716264.99}",
          "fd": 1
        },
        {
          "ts": 1736716265.188,
          "level": 2,
          "data": "shelly_notification:208 Event from input:0: {\"component\":\"input:0\",\"id\":0,\"event\":\"btn_up\",\"ts\":1736716265.17}",
          "fd": 1
        },
        {
          "ts": 1736716265.51,
          "level": 2,
          "data": "shelly_notification:208 Event from input:0: {\"component\":\"input:0\",\"id\":0,\"event\":\"single_push\",\"ts\":1736716265.49}",
          "fd": 1
        },
      

      und so ein long_push:

       {
          "ts": 1736716271.118,
          "level": 2,
          "data": "shelly_notification:208 Event from input:0: {\"component\":\"input:0\",\"id\":0,\"event\":\"btn_down\",\"ts\":1736716271.10}",
          "fd": 1
        },
        {
          "ts": 1736716272.116,
          "level": 2,
          "data": "shelly_notification:208 Event from input:0: {\"component\":\"input:0\",\"id\":0,\"event\":\"long_push\",\"ts\":1736716272.10}",
          "fd": 1
        },
        {
          "ts": 1736716273.469,
          "level": 2,
          "data": "shelly_notification:208 Event from input:0: {\"component\":\"input:0\",\"id\":0,\"event\":\"btn_up\",\"ts\":1736716273.45}",
          "fd": 1
        },
      

      Hat jemand eine Idee, wie ich diese sich innerhalb von Millisekunden ändernde Events auswerten kann um short- und long-push zu triggern?

      MartinP OliverIO paul53 3 Replies Last reply Reply Quote 0
      • MartinP
        MartinP @Dark Angel last edited by MartinP

        @dark-angel wenn es reicht, den short Push beim Loslassen der Taste zu erkennen, würde ich die Button down ignorieren

        Wenn das letzte Event vor dem Button - Up ein Button Down war, ist es ein Short, ansonsten Long

        Dark Angel 1 Reply Last reply Reply Quote 0
        • OliverIO
          OliverIO @Dark Angel last edited by

          @dark-angel

          das event steh doch direkt in den daten drin
          single_push
          long_push

          eigentlich nur auf die eventdaten testen

          Dark Angel 1 Reply Last reply Reply Quote 1
          • Dark Angel
            Dark Angel @OliverIO last edited by

            @oliverio
            Genau das ist ja die Frage...
            Wie filtere ich in eine "IF...THEN..." Schleife den richtigen Event?
            Die Schaltzustände werden in wirklich kürzeste Zeit hintereinander im Event angezeigt.

            OliverIO 1 Reply Last reply Reply Quote 0
            • Dark Angel
              Dark Angel @MartinP last edited by

              @martinp
              wie werte ich das letzte Event aus?
              Die "IF...THEN.." Schleife wird bei Änderung im Event aktiviert, also praktisch bei der ersten Änderung und nicht bei der letzten.
              Ich könnte zwar das Script erst dann "aktivieren", wenn ein "short_push", oder "long_push" Event ausgelöst wird, ist aber für eine Schleife unbrauchbar und ich müsste 2 Scripte erstellen um die jeweiligen Events entsprechend abzufangen und damit dann mein Schindluder betreiben.

              1 Reply Last reply Reply Quote 0
              • OliverIO
                OliverIO @Dark Angel last edited by

                @dark-angel

                ah, du machst dir sorgen über die geschwindigkeit?
                das ist eigentlich kein Problem (natürlich systemabhängigkeit und in welcher geschwindigkeit du reagieren möchtest)

                ich weiß jetzt nicht auf welcher Basis die Ausgabe oben entstanden ist.
                Ich gehe jetzt mal davon aus, das jedes Event einzeln vom Gerät gesendet wird und du nur sowas wie hier empfängst

                 {
                    "ts": 1736716271.118,
                    "level": 2,
                    "data": "shelly_notification:208 Event from input:0: {\"component\":\"input:0\",\"id\":0,\"event\":\"btn_down\",\"ts\":1736716271.10}",
                    "fd": 1
                  }
                

                dann ist das erst einmal ein ganz normales JSON Objekt.
                ts ist der zeitstempel. level und fd weiß ich nicht.
                interessant ist data, das ist ein String der Text und ebenfalls nochmals ein JSON Objekt enthält, der muss zunächst mit regex interpretiert werden

                let obj = {
                    "ts": 1736716272.116,
                    "level": 2,
                    "data": "shelly_notification:208 Event from input:0: {\"component\":\"input:0\",\"id\":0,\"event\":\"long_push\",\"ts\":1736716272.10}",
                    "fd": 1
                  }
                let regex=new RegExp("{.*}");
                let list = obj.data.match(regex);
                let data = JSON.parse(list[0]);
                switch(data.event)
                   case "short_push":
                      console.log("aktionen short_push")
                   case "long_push":
                      console.log("aktionen long_push")
                   default:
                      console.log("nix machen bei anderen eventtypen")
                
                Dark Angel 1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 @Dark Angel last edited by

                  @dark-angel sagte: in einen Event

                  Gibt es einen Event-Datenpunkt?

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

                    @paul53
                    Der Datenpunkt in ioBroker (über den Shelly Adapter) heist direkt Event:

                    shelly.0.shellyplus2pm#9015068820c0#1.Input0.Event
                    

                    Da werden direkt hintereinander die 3 Meldungen aus dem Eröffnungspost quitiert.

                    OliverIO paul53 2 Replies Last reply Reply Quote 0
                    • OliverIO
                      OliverIO @Dark Angel last edited by

                      @dark-angel

                      aber jeweils einzeln? oder steht da die liste von oben drin?

                      Dark Angel 1 Reply Last reply Reply Quote 0
                      • Dark Angel
                        Dark Angel @OliverIO last edited by

                        @oliverio
                        Die Ausgabe ist aus dem Debugfenster auf dem Shelly kopiert.

                        Die Idee mit dem Script geht schon in der Richtung wie ich mir die Lösung des Problems vorstelle.
                        Muss dann heute Abend gleich mal herumexperimentieren...

                        Danke für den Richtungsanstoß.

                        1 Reply Last reply Reply Quote 0
                        • Dark Angel
                          Dark Angel @OliverIO last edited by

                          @oliverio
                          Einzeln. So schnell kann ich gar nicht schauen, wie sich der Wert ändert ... 😵

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

                            @dark-angel sagte: die 3 Meldungen aus dem Eröffnungspost

                            Das komplette JSON? Sicherlich die 3 Events unmittelbar nacheinander?

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

                              @paul53
                              01282801-06fe-4333-91a0-284890aa7987-grafik.png

                              Bzw.:
                              a8966fbc-2822-4186-93cf-e5aeca3c3822-grafik.png

                              OliverIO paul53 2 Replies Last reply Reply Quote 0
                              • OliverIO
                                OliverIO @Dark Angel last edited by OliverIO

                                @dark-angel
                                da ist doch schon ein datenpunkt namens event.
                                dann musst doch nur einen trigger auf diesen datenpunkt setzen und unterscheiden ob da short oder long drin steht und deine aktionen auslösen
                                da muss man nicht mal die verrenkungen mit dem skript machen

                                wie gesagt, die geschwindigkeit ist kein problem. die events werden der reihe nach reinkommen, die datenpunkte aktualisisert werden.
                                auch wenn du uU die Änderungen auf der Oberfläche nicht wahrnimmst

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

                                  @dark-angel
                                  "Event" enthält doch, was man braucht.

                                  Blockly_temp.JPG

                                  "hold" bleibt true bis losgelassen wird.

                                  EDIT: Anstelle des Schreibens in die eigenen Datenpunkte können auch direkt die Aktionen zur jeweiligen Tastenbetätigung ausgeführt werden.

                                  Anmerkung: Wenn es "single_push" gibt, gibt es vielleicht auch "double_push"? Zum Erkennen von "long_push" wird immerhin 1 s benötigt.

                                  Dark Angel 1 Reply Last reply Reply Quote 1
                                  • Dark Angel
                                    Dark Angel @paul53 last edited by

                                    @paul53
                                    Das Problem ist, dass Event immer 3 Meldungen ausgibt (3 Zustände hintereinander)
                                    Wenn ich Event triggere ist der erste Zustand immer "btn_down".
                                    Bei SinglePress kommt erst "btn_up" und dann bleibt Event bei "single_push" stehen.
                                    Anders allerdings bei LongPress: da kommt als nächstes "long_push" und zum Schluss bleibt es bei "btn_up" stehen.
                                    Wenn ich zu 100% sicher wäre, dass die letzte Meldung bei LongPress immer "btn_up" sein wird, dann könnte ich das in mein Script einbauen (Event Auswertung mit kleine Verzögerung um sicher zu stellen, dass alle Eventmeldungen schon durch sind?).
                                    Der Ursprung der "Geschichte" ist HIER nachzulesen. Das Shelly die Logic geändert hat finde ich persönlich nicht sehr prickelnd, aber die werden sich schon was dabei gedacht haben...

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

                                      @dark-angel sagte: Event immer 3 Meldungen ausgibt (3 Zustände hintereinander)
                                      Wenn ich Event triggere ist der erste Zustand immer "btn_down".

                                      Ja und ...? "btn_down" wird nicht ausgewertet, also ignoriert.

                                      @dark-angel sagte in Schnelle Änderungen am Triggerobjekt auswerten?:

                                      "long_push" und zum Schluss bleibt es bei "btn_up" stehen.

                                      Genau dieses Verhalten wird in meinem Blockly-Vorschlag berücksichtigt.

                                      1 Reply Last reply Reply Quote 0
                                      • Dark Angel
                                        Dark Angel last edited by

                                        Erster (mehr, oder weniger) Erfolg, erzielt durch folg. Blockly:

                                        ad4420bb-5d2b-4e15-ae36-42d7b218949c-grafik.png
                                        Shelly Output ist "momentary" mit invertet Input
                                        So wird das Licht auch ohne ioBroker funktionsfähig bleiben, nur eben ohne den Zusatz des Longpushs.
                                        Wenn Output auf "detached" gesetzt würde, geht das Licht wenn Longpush erkannt wurde, oder aber eben beim loslassen an (in etwa wie "momentary_on_release" bei Shelly Gen.1). Nachteil: Wenn keine Kommunikation mit ioBroker, dann bleibt es dunkel.

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

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        511
                                        Online

                                        31.6k
                                        Users

                                        79.4k
                                        Topics

                                        1.3m
                                        Posts

                                        4
                                        18
                                        422
                                        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