Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • 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. Visualisierung
  4. Bestes Widget ?

NEWS

  • wichtiges UPDATE fĂŒr controller 7.2.2 im stable
    HomoranH
    Homoran
    10
    1
    2.4k

  • Neues YouTube-Video: Visualisierung im Devices-Adapter
    BluefoxB
    Bluefox
    16
    1
    4.4k

  • Neuer ioBroker-Blog online: MonatsrĂŒckblick MĂ€rz/April 2026
    BluefoxB
    Bluefox
    8
    1
    3.8k

Bestes Widget ?

Geplant Angeheftet Gesperrt Verschoben Visualisierung
20 BeitrÀge 4 Kommentatoren 2.9k Aufrufe 4 Beobachtet
  • Ä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.
  • S Offline
    S Offline
    seek1338
    schrieb am zuletzt editiert von seek1338
    #1

    Hallo,

    sorry vorweg ich verwende VIS erst seit kurzem und kenn mich nicht so gut aus.

    Ich hab via Sweet Home 3d mein Haus virtualisiert und arbeite mit image overlays um in rÀumen wo das Licht an ist, dieses auch anzuzeigen z.b.:
    img.JPG

    Jetzt gehts um die Steuerung und ich finde leider nichts was wĂŒrklich so passt đŸ˜”

    Aktuell verwende ich die Gestensteuerung um beim wisch nach Rechts das Licht einzuschalten und Wisch nach Links ausschalten. Ich wĂŒrde gerne beim "Klick" auf das jeweilige Zimmer mit dem Setzten eines Objekt ein view einblenden um die Zimmerdetails zu sehen (Rollo, Steckdosen usw..).

    Das Problem ist egal ob ich via Klick das Licht ein und ausschalte oder via Geste, sobald ich eins der beiden Methoden fĂŒr die View-Darstellung verwende kommen sich diese imme in die quere - sprich beim wischen klickt er auch immer oder halt umgekehrt

    Weiß wer wie ich dieses Problem ggf. ĂŒber eine Einstellung im VIS oder ein Spezielles Widget lösen kann? WĂ€re ĂŒber jeden Tipp sehr dankbar.

    mfg,
    Se ek

    OliverIOO 1 Antwort Letzte Antwort
    0
    • E Offline
      E Offline
      eMd
      schrieb am zuletzt editiert von
      #2

      Du hast einen Holzfussboden im Bad? 😉

      Master: Intel NUC 16GB/500GB
      Slave: Raspberry Pi 3 + Homematicmodul
      Shelly, Google Home, Zigbee Aqara, Sonoff

      Meine VIS: https://youtu.be/JMYr2KYlpME

      S 1 Antwort Letzte Antwort
      1
      • E eMd

        Du hast einen Holzfussboden im Bad? 😉

        S Offline
        S Offline
        seek1338
        schrieb am zuletzt editiert von
        #3

        @emd
        nciht ganz die Antwort die ich erhofft hatte ;-) , aber ja im gesamten EG sind es fliesen in Holztoptik.

        E 1 Antwort Letzte Antwort
        0
        • S seek1338

          @emd
          nciht ganz die Antwort die ich erhofft hatte ;-) , aber ja im gesamten EG sind es fliesen in Holztoptik.

          E Offline
          E Offline
          eMd
          schrieb am zuletzt editiert von
          #4

          @seek1338
          Habe damals auch so angefangen mit sweet home, bin dann aber auch auf Minimalismus umgestiegen, daher kann ich dir leider keinen Tipp geben fĂŒr das widget...

          Aber coole Fliesen 😄

          Master: Intel NUC 16GB/500GB
          Slave: Raspberry Pi 3 + Homematicmodul
          Shelly, Google Home, Zigbee Aqara, Sonoff

          Meine VIS: https://youtu.be/JMYr2KYlpME

          1 Antwort Letzte Antwort
          0
          • S seek1338

            Hallo,

            sorry vorweg ich verwende VIS erst seit kurzem und kenn mich nicht so gut aus.

            Ich hab via Sweet Home 3d mein Haus virtualisiert und arbeite mit image overlays um in rÀumen wo das Licht an ist, dieses auch anzuzeigen z.b.:
            img.JPG

            Jetzt gehts um die Steuerung und ich finde leider nichts was wĂŒrklich so passt đŸ˜”

            Aktuell verwende ich die Gestensteuerung um beim wisch nach Rechts das Licht einzuschalten und Wisch nach Links ausschalten. Ich wĂŒrde gerne beim "Klick" auf das jeweilige Zimmer mit dem Setzten eines Objekt ein view einblenden um die Zimmerdetails zu sehen (Rollo, Steckdosen usw..).

            Das Problem ist egal ob ich via Klick das Licht ein und ausschalte oder via Geste, sobald ich eins der beiden Methoden fĂŒr die View-Darstellung verwende kommen sich diese imme in die quere - sprich beim wischen klickt er auch immer oder halt umgekehrt

            Weiß wer wie ich dieses Problem ggf. ĂŒber eine Einstellung im VIS oder ein Spezielles Widget lösen kann? WĂ€re ĂŒber jeden Tipp sehr dankbar.

            mfg,
            Se ek

            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von
            #5

            @seek1338

            ich kenne die wischgesten zwar nicht, kenn mich aber ein wenig mit dem ereignismodell zu html aus.

            Hauptproblem ist, das ein Ereignis immer in einem gewissen Element entsteht und dann von da aus den Hierarchiebaum der Elemente nach oben lÀuft (Fachbegriff der hier verwendet wird event bubbling)

            Wenn ein Ereignishandler (also programmcode der sich mit diesem Ereignis beschÀftigt) schreibt, kann man entscheiden ob man das bubbling nach oben verhindert oder nicht.

            Wenn bei dir jetzt beide Ereignisse gleichzeitig auftreten, dann ist das wohl nicht der Fall. Ich weiß allerdings nicht was es da fĂŒr Konfiugrationsmöglichkeiten in vis gibt, aber evtl hilft dir das weiter oder jemand anders kann noch einen Hinweis geben.

            ich habe verstanden, das wenn du wischst, das das Licht ausgeschalltet wird, aber fĂŒr welchen Raum? oder hast du bereits Zonen eingerichtet, wo du fĂŒr einen Raum wischen kannst?
            Das einfachste wĂ€re, wenn du fĂŒr jeden Raum einen Punkt markierst und den auch optisch visualisierst, ĂŒber den man ĂŒber ein long-klick das Kontext menĂŒ aufruft und die Zonen wo man wischen kann, davon separierst.
            das wĂŒrde auch mit der Anwendungslogik fĂŒr andere GerĂ€te (Windows, etc.) ĂŒbereinstimmen und du mĂŒsstest dich nicht mit solchen technischen Detail beschĂ€ftigen

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            S 1 Antwort Letzte Antwort
            0
            • OliverIOO OliverIO

              @seek1338

              ich kenne die wischgesten zwar nicht, kenn mich aber ein wenig mit dem ereignismodell zu html aus.

              Hauptproblem ist, das ein Ereignis immer in einem gewissen Element entsteht und dann von da aus den Hierarchiebaum der Elemente nach oben lÀuft (Fachbegriff der hier verwendet wird event bubbling)

              Wenn ein Ereignishandler (also programmcode der sich mit diesem Ereignis beschÀftigt) schreibt, kann man entscheiden ob man das bubbling nach oben verhindert oder nicht.

              Wenn bei dir jetzt beide Ereignisse gleichzeitig auftreten, dann ist das wohl nicht der Fall. Ich weiß allerdings nicht was es da fĂŒr Konfiugrationsmöglichkeiten in vis gibt, aber evtl hilft dir das weiter oder jemand anders kann noch einen Hinweis geben.

              ich habe verstanden, das wenn du wischst, das das Licht ausgeschalltet wird, aber fĂŒr welchen Raum? oder hast du bereits Zonen eingerichtet, wo du fĂŒr einen Raum wischen kannst?
              Das einfachste wĂ€re, wenn du fĂŒr jeden Raum einen Punkt markierst und den auch optisch visualisierst, ĂŒber den man ĂŒber ein long-klick das Kontext menĂŒ aufruft und die Zonen wo man wischen kann, davon separierst.
              das wĂŒrde auch mit der Anwendungslogik fĂŒr andere GerĂ€te (Windows, etc.) ĂŒbereinstimmen und du mĂŒsstest dich nicht mit solchen technischen Detail beschĂ€ftigen

              S Offline
              S Offline
              seek1338
              schrieb am zuletzt editiert von
              #6

              @oliverio danke fĂŒr die Infos zu HTML... jeder raum hat ein Button Overlay der nicht sichtbar ist, ich wĂŒrde gerne komplett ohne Buttons und Icons in der Hauptansicht Arbeiten und zusĂ€tzliche Informationen nur in einem Extra View darstellen.

              Hab nun beim googeln von verscheidenen Konstelationen im Forum ein Skript gefunden womit es ĂŒber umwege funktionieren wĂŒrde und leicht angepasst:
              skript.JPG

              Im Grunde verwendet man das HQWidget im Tastermodus und jenachdem ob man kurz oder lang drauf drĂŒckt setzt man verschiedene Werte z.b. in meinem Fall:
              Min: false#hm-rpc.0.OEQ0236727.3.STATE
              Max: true#hm-rpc.0.OEQ0236727.3.STATE

              Die True / False verwende ich zum steuern des Skripts und den zweiten Part um eine Obj-ID des jeweiligen Raums mitzugeben um so dann im Kurz-Press Bereich das Licht zu steuern.

              Im Long-Press werde ich dann einzelne Objekt-IDs im IoBroker anlegen fĂŒr jede Raum View, die dann je nach wert eingeblendet wird.

              Es wĂ€re jedoch viel besser wenns nativ im VIS gehen wĂŒrde ohne diese umwege die eventuell fehleranfĂ€lliger sind (skript rennt langsamer erkennt long obwohl short usw...)

              mfg,
              Seek

              1 Antwort Letzte Antwort
              0
              • OliverIOO Offline
                OliverIOO Offline
                OliverIO
                schrieb am zuletzt editiert von
                #7

                @seek1338
                Meiner meinung sollte man gui relevante Detektion auch auf der gui machen, da das eine zeitkritische Angelegenheit ist.
                Dir Heide Verlagerung nach blockly oder JavaScript wird die Erkennung auf den Server verlagert. Dadurch hast du das Netzwerk dazwischen und da gibt es keine Garantie wann die Signale gesendet werden.
                Da können 100ms und 1500ms schon ein großer Unterschied sein.
                Gibt es kein Widget welches selbst zwischen kurz ind lang unterscheiden kann? Das wÀre das was man finden sollte

                Meine Adapter und Widgets
                TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                Links im Profil

                S 1 Antwort Letzte Antwort
                0
                • OliverIOO OliverIO

                  @seek1338
                  Meiner meinung sollte man gui relevante Detektion auch auf der gui machen, da das eine zeitkritische Angelegenheit ist.
                  Dir Heide Verlagerung nach blockly oder JavaScript wird die Erkennung auf den Server verlagert. Dadurch hast du das Netzwerk dazwischen und da gibt es keine Garantie wann die Signale gesendet werden.
                  Da können 100ms und 1500ms schon ein großer Unterschied sein.
                  Gibt es kein Widget welches selbst zwischen kurz ind lang unterscheiden kann? Das wÀre das was man finden sollte

                  S Offline
                  S Offline
                  seek1338
                  schrieb am zuletzt editiert von
                  #8

                  @oliverio

                  Ja das wÀre perfekt... aber nachdem ich erst seit ein paar Tagen mit VIS zu tun habe, kenn ich noch nicht alle... dadurch die Frage ins Forum :)

                  S 1 Antwort Letzte Antwort
                  0
                  • S seek1338

                    @oliverio

                    Ja das wÀre perfekt... aber nachdem ich erst seit ein paar Tagen mit VIS zu tun habe, kenn ich noch nicht alle... dadurch die Frage ins Forum :)

                    S Offline
                    S Offline
                    seek1338
                    schrieb am zuletzt editiert von
                    #9

                    Hab nun ein Weg gefunden das Problem via VIS zu lösen und woltle das hier Teilen falls andere auch das Problem hatten/haben:

                    1.) Basic HTML Widget ĂŒber das Zimmer legen und Opacity im CSS Allgemein auf 0 setzten (nicht sichtbar), z-Index sollte entsprechend oben sein z.b. 5 (grĂ¶ĂŸer wie Background und overlays der Licht An Bilder).

                    2.) Basic HTML mit folgenden Code befĂŒllen:

                    <input style="height: 100%;width: 100%" type="button" onmousedown="func('hm-rpc.0.OEQ0236727.3.STATE','0_userdata.0.VIS.buero')" onmouseup="revert('hm-rpc.0.OEQ0236727.3.STATE','0_userdata.0.VIS.buero')" value="foo"/>
                    

                    Wobei
                    'hm-rpc.0.OEQ0236727.3.STATE' = ID Des GerĂ€tes zum ein und Ausschalten in meinem Falls das BĂŒro Licht.
                    '0_userdata.0.VIS.buero' = Eine ID fĂŒr die Widget Steuerung des Zimmers (true/false) muss zuvor im iobroker angelegt werden

                    Unter Skripte folgendes eintragen (Danke hier ans Forum und auch anderen JS Seiten, bin absolut schlecht in JS :-) :

                    // Short-Click/Longpress Handler
                    var timer;
                    var istrue = false;
                    var delay = 500; // how much long u have to hold click in MS
                    
                    //objID    = Objekt ID from Device z.b. hm-rpc.0.OEQ0236727.3.STATE
                    //visObjID = Objekt ID from VIS Room (Control Widgets over Visibility)
                    function func(objID,visObjID)
                    {
                       istrue = true;
                       timer = setTimeout(function(){ makeChange(objID,visObjID);},delay);
                    }
                    
                    function makeChange(objID,visObjID)
                    {
                        if(timer)
                        clearTimeout(timer);
                        
                        if(istrue)
                        {
                            //Longpress Event
                            istrue =false;
                            console.log(visObjID);
                            servConn._socket.emit('getStates', visObjID, (error, states) => {
                                //console.log(states);
                                this.servConn._socket.emit('setState', visObjID, !states[visObjID].val);
                            });
                        }
                    }
                    
                    function revert(objID,visObjID)
                    {
                        if(timer && istrue) 
                        {
                            //Click Event
                            istrue =false;
                    
                            servConn._socket.emit('getStates', objID, (error, states) => {
                                //console.log("Short Click objID: " + states);
                                servConn._socket.emit('setState', objID, !states[objID].val);
                            });
                    
                        }
                    }
                    // Short-Click/Longpress Handler
                    

                    Was passiert nun:

                    1.) bei einem kurzen Klick (unter 500ms - delay Option im Skript) wird der "//Click Event" abgearbeitet und es wird bei einem True/False Objekt je nach klick True/False gesetzt. In meinem Fall BĂŒro Licht An/Aus.

                    2.) bei einem langen klick(>500ms) bzw. Presslong wird der //Longpress Event ausgefĂŒhrt. Hier wird die Widget Steuerungs ID des jeweiligen Zimmers auf True/False geschaltet. Die Widgets welche man anlegt und die Sichtbarkeit auf diese ID legt, werden dann automatisch angezeigt oder ausgeblendet.

                    Nachdem Short und Long Klick getrennt sind, kommen sich diese auch nicht in die Quere. Vielleicht könnte man das auch anders Lösen, aber ich habe nach meiner Langen suche nichts besseres gefunden.

                    Frage:

                    Falls noch wer weiß wie man den Filter Dropdown Widget als Skript ausfĂŒhren könnte wĂ€re ich sehr Dankbar, dann brĂ€uchte man die zweite ID auch nicht mehr bzw. könnte man mit die Filterfunktion der VIS arbeiten.

                    Gibt es irgendwo im Internet eine genaue beschreibung der VIS Skript möglichkeiten, Funktionen usw?? Hab hierzu auch nicht sonderlich viel gefunden.

                    mfg,
                    Se ek

                    1 Antwort Letzte Antwort
                    0
                    • OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von OliverIO
                      #10

                      @seek1338

                      deine Frage habe ich nicht ganz so verstanden.
                      aber ich vermute mal, du willst wissen, wie das javascript herausfinden kann von welchem welchem vis-widget es heraus aufgerufen wurde.
                      dazu muss man ein wenig in die dom und javascript-trickkiste greifen.

                      wenn man das ereignis im html tag notiert, so wie du das gemacht hast, dann wird an diese funktion ein Ereignisobjekt ĂŒbergeben und in this steht der Zeiger auf das aktuelle Element.
                      also in der einfachsten Form wĂŒrde dann im Parameter der Funktion func, das DIV-Element ĂŒbergeben werden.
                      Danach mĂŒsste man den HTML-Baum stĂŒck fĂŒr StĂŒck nach oben gehen, bis man ein Element trifft, welches die CSS-Klasse "vis-widget" besitzt. Dann den ID-auslesen.

                      <input style="height: 100%;width: 100%" type="button" onmousedown="func(this)"/>
                      

                      Interessanter ist es aber, noch das eigentliche Eventobjekt an eine Funktion zu ĂŒbergeben, da dort je nach Ereignis noch viele weitere interessante Dinge drin stehen, sowie auch das aktuelle Element.
                      fĂŒr detaillierte Informationen was bei welchem Event da drin steht:
                      https://developer.mozilla.org/en-US/docs/Web/API/Event

                      das wĂŒrde dann von der Tag-Notation wie folgt aussehen.
                      (fĂŒr diejenigen, die das bereits gelesen haben, hier habe ich nachtrĂ€glich noch etwas korrigiert, da das event doch als eigener parameter ĂŒbergeben wird. SchlĂŒsselwort ist hier event

                      <input style="height: 100%;width: 100%" type="button" onmousedown="func(event)"/>
                      

                      und die Javascript Funktion mĂŒsste dann so aussehen. An das aktuelle Element kommt man dann mit e.currentTaget

                      function func(e) {
                        var element = e.currentTarget;
                      }
                      

                      An den Funktionsaufruf kann man dennoch noch weitere Parameter anhÀngen, so das man das individuell auch mehrfach einsetzen kann.

                      Hier noch Anmerkungen zu deinem Skript.

                      Funktioniert das Skript den auch mehrfach hintereinander?
                      ich sehe nirgends, das du die Variable timer wieder auf null setzt. Da steht doch dann immer noch die alte timer-id drin und if (timer) reagiert falsch.

                      Auch hast du nur eine timer-Variable. Wenn du mehr wie ein Tag einsetzt, dann wird bei Aufruf der vorherige Timer immer wieder ĂŒberschrieben und diese sind dann fĂŒr clearTimeout verloren.
                      Besser wĂ€re es die Daten direkt im Element zu speichern. DafĂŒr gibt es das Objekt
                      https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset

                      da könntest du deinen timer direkt da abspeichern.dann kommt sich da nix mehr in die quere.
                      Ich hab hier noch eine Sicherheitsabfrage eingebaut, damit bei mehrfachem Aufruf von mousedown ein evtl existierender timer auch gelöscht wird um Speicherlecks zu vermeiden.

                      function func(e,objID,visObjID) {
                        var element = e.currentTarget;
                        if (element.dataSet.timer) clearTimeout(element.dataSet.timer);
                        element.dataSet.timer = setTimeout(function(){ makeChange(objID,visObjID);},delay);
                      }
                      

                      Dann noch eine kleine Verbesserung zum Setzen eines Status.
                      Vis hat eine eigene Funktion zum setzen eines Datenpunkts.
                      Da musst du zuvor nicht erst den Datenpunkt abfragen.
                      Sinnigerweise heißt die

                      vis.setValue(datenpunkt, wert);
                      

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      OliverIOO S 2 Antworten Letzte Antwort
                      1
                      • OliverIOO OliverIO

                        @seek1338

                        deine Frage habe ich nicht ganz so verstanden.
                        aber ich vermute mal, du willst wissen, wie das javascript herausfinden kann von welchem welchem vis-widget es heraus aufgerufen wurde.
                        dazu muss man ein wenig in die dom und javascript-trickkiste greifen.

                        wenn man das ereignis im html tag notiert, so wie du das gemacht hast, dann wird an diese funktion ein Ereignisobjekt ĂŒbergeben und in this steht der Zeiger auf das aktuelle Element.
                        also in der einfachsten Form wĂŒrde dann im Parameter der Funktion func, das DIV-Element ĂŒbergeben werden.
                        Danach mĂŒsste man den HTML-Baum stĂŒck fĂŒr StĂŒck nach oben gehen, bis man ein Element trifft, welches die CSS-Klasse "vis-widget" besitzt. Dann den ID-auslesen.

                        <input style="height: 100%;width: 100%" type="button" onmousedown="func(this)"/>
                        

                        Interessanter ist es aber, noch das eigentliche Eventobjekt an eine Funktion zu ĂŒbergeben, da dort je nach Ereignis noch viele weitere interessante Dinge drin stehen, sowie auch das aktuelle Element.
                        fĂŒr detaillierte Informationen was bei welchem Event da drin steht:
                        https://developer.mozilla.org/en-US/docs/Web/API/Event

                        das wĂŒrde dann von der Tag-Notation wie folgt aussehen.
                        (fĂŒr diejenigen, die das bereits gelesen haben, hier habe ich nachtrĂ€glich noch etwas korrigiert, da das event doch als eigener parameter ĂŒbergeben wird. SchlĂŒsselwort ist hier event

                        <input style="height: 100%;width: 100%" type="button" onmousedown="func(event)"/>
                        

                        und die Javascript Funktion mĂŒsste dann so aussehen. An das aktuelle Element kommt man dann mit e.currentTaget

                        function func(e) {
                          var element = e.currentTarget;
                        }
                        

                        An den Funktionsaufruf kann man dennoch noch weitere Parameter anhÀngen, so das man das individuell auch mehrfach einsetzen kann.

                        Hier noch Anmerkungen zu deinem Skript.

                        Funktioniert das Skript den auch mehrfach hintereinander?
                        ich sehe nirgends, das du die Variable timer wieder auf null setzt. Da steht doch dann immer noch die alte timer-id drin und if (timer) reagiert falsch.

                        Auch hast du nur eine timer-Variable. Wenn du mehr wie ein Tag einsetzt, dann wird bei Aufruf der vorherige Timer immer wieder ĂŒberschrieben und diese sind dann fĂŒr clearTimeout verloren.
                        Besser wĂ€re es die Daten direkt im Element zu speichern. DafĂŒr gibt es das Objekt
                        https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset

                        da könntest du deinen timer direkt da abspeichern.dann kommt sich da nix mehr in die quere.
                        Ich hab hier noch eine Sicherheitsabfrage eingebaut, damit bei mehrfachem Aufruf von mousedown ein evtl existierender timer auch gelöscht wird um Speicherlecks zu vermeiden.

                        function func(e,objID,visObjID) {
                          var element = e.currentTarget;
                          if (element.dataSet.timer) clearTimeout(element.dataSet.timer);
                          element.dataSet.timer = setTimeout(function(){ makeChange(objID,visObjID);},delay);
                        }
                        

                        Dann noch eine kleine Verbesserung zum Setzen eines Status.
                        Vis hat eine eigene Funktion zum setzen eines Datenpunkts.
                        Da musst du zuvor nicht erst den Datenpunkt abfragen.
                        Sinnigerweise heißt die

                        vis.setValue(datenpunkt, wert);
                        
                        OliverIOO Offline
                        OliverIOO Offline
                        OliverIO
                        schrieb am zuletzt editiert von OliverIO
                        #11

                        @oliverio

                        so nach dem letzten Post habe ich mich auchmal noch versucht.
                        Der folgenden Code kann die folgenden Ereignisse abdecken und dann in einen Datenpunkt schreiben

                        Click
                        DoubleClick
                        Longpress

                        Bei Longpress kann man die minimale Zeit und maximale Zeit noch angeben.
                        Der Code fĂŒr das Tag kann noch optimiert werden, so das man eigentlich nur ein ereignis (mousedown) definieren mĂŒsste, aber jetzt erstmal mit diesem code probieren.

                        das kommt in ein html widget

                        <div style="width:100%;height:50%"
                          onClick="func(event,'0_userdata.0.test2');" 
                          onMousedown="func(event,'0_userdata.0.test2');"
                          onmouseup="func(event,'0_userdata.0.test2');"
                          ondblclick="func(event,'0_userdata.0.test2');" 
                        >xxx</div>
                        <div style="width:100%;height:50%"
                          onClick="func(event,'0_userdata.0.test3');" 
                          onMousedown="func(event,'0_userdata.0.test3');"
                          onmouseup="func(event,'0_userdata.0.test3');"
                          ondblclick="func(event,'0_userdata.0.test3');" 
                        >xxx</div>
                        

                        Das kommt in den Reiter "Skripte" der view

                        var minPressDelay=1000;
                        var maxPressDelay=5000;
                        var eventDebounceDelay = 200;
                        
                        function func(e,dp) {
                            var element = e.currentTarget;
                            var diff=0;
                            var etype="";
                        
                            if ($(element).data("time")) diff = e.timeStamp - $(element).data("time");
                            if (e.type=="mousedown") $(element).data("time", e.timeStamp);
                            if (e.type=="mouseup") $(element).data("time", 0);
                            if (diff>minPressDelay && diff<maxPressDelay) etype="longpress";
                            if (e.type=="click") etype="click";
                            if (e.type=="dblclick") etype="dblclick";
                            if (etype) {
                                if (etype=="click" && $(element).data("lastevent")=="longpress") return;
                                $(element).data("lastevent",etype);
                                var oldTimer = $(element).data("timer");
                                clearTimeout(oldTimer);
                                var newTimer = setTimeout(function(){
                                    console.log("Event: " + etype + " for datapoint " + dp);
                                    vis.setValue(dp,etype);
                                    $(element).removeData("lastevent");
                                    $(element).removeData("timer");
                                 
                                         },200);
                                $(element).data("timer",newTimer);
                            }
                        }
                        

                        Es gibt hier 3 konfigurierbare Werte, wie schon erwÀhnt
                        minPressDelay und maxPressDelay
                        longpress wird nur erkannt, wenn es zwischen diesen beiden Werten in Millisekunden liegt
                        eventDebounceDelay muss je nach Hardware eingestellt werden, wie schnell die reagiert und lĂ€uft. Einfach mal probieren. Da wĂ€hrend dem ganzen Klicken und drĂŒcken diverse Ereignisse erzeugt werden, mĂŒssen diese weggepuffert werden.
                        Beispiel fĂŒr ein einfaches Click werden die folgenden Ereignisse der Reihe nach erzeugt

                        mousedown mouseup click
                        

                        oder fĂŒr doubleclick

                        mousedown mouseup click mousedown mouseup click dblclick
                        

                        damit nicht ganz wild der datenpunkt befeuert wird, wird eine gewisse zeit gewartet wird (bspw um das letzte click vom eigentlichen dblclick zu unterscheiden.

                        bitte beachtet die width und height angaben des divs anzupassen, so das das element auch den ganzen Raum ausfĂŒllt.

                        Meine Adapter und Widgets
                        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                        Links im Profil

                        OliverIOO 1 Antwort Letzte Antwort
                        1
                        • OliverIOO OliverIO

                          @seek1338

                          deine Frage habe ich nicht ganz so verstanden.
                          aber ich vermute mal, du willst wissen, wie das javascript herausfinden kann von welchem welchem vis-widget es heraus aufgerufen wurde.
                          dazu muss man ein wenig in die dom und javascript-trickkiste greifen.

                          wenn man das ereignis im html tag notiert, so wie du das gemacht hast, dann wird an diese funktion ein Ereignisobjekt ĂŒbergeben und in this steht der Zeiger auf das aktuelle Element.
                          also in der einfachsten Form wĂŒrde dann im Parameter der Funktion func, das DIV-Element ĂŒbergeben werden.
                          Danach mĂŒsste man den HTML-Baum stĂŒck fĂŒr StĂŒck nach oben gehen, bis man ein Element trifft, welches die CSS-Klasse "vis-widget" besitzt. Dann den ID-auslesen.

                          <input style="height: 100%;width: 100%" type="button" onmousedown="func(this)"/>
                          

                          Interessanter ist es aber, noch das eigentliche Eventobjekt an eine Funktion zu ĂŒbergeben, da dort je nach Ereignis noch viele weitere interessante Dinge drin stehen, sowie auch das aktuelle Element.
                          fĂŒr detaillierte Informationen was bei welchem Event da drin steht:
                          https://developer.mozilla.org/en-US/docs/Web/API/Event

                          das wĂŒrde dann von der Tag-Notation wie folgt aussehen.
                          (fĂŒr diejenigen, die das bereits gelesen haben, hier habe ich nachtrĂ€glich noch etwas korrigiert, da das event doch als eigener parameter ĂŒbergeben wird. SchlĂŒsselwort ist hier event

                          <input style="height: 100%;width: 100%" type="button" onmousedown="func(event)"/>
                          

                          und die Javascript Funktion mĂŒsste dann so aussehen. An das aktuelle Element kommt man dann mit e.currentTaget

                          function func(e) {
                            var element = e.currentTarget;
                          }
                          

                          An den Funktionsaufruf kann man dennoch noch weitere Parameter anhÀngen, so das man das individuell auch mehrfach einsetzen kann.

                          Hier noch Anmerkungen zu deinem Skript.

                          Funktioniert das Skript den auch mehrfach hintereinander?
                          ich sehe nirgends, das du die Variable timer wieder auf null setzt. Da steht doch dann immer noch die alte timer-id drin und if (timer) reagiert falsch.

                          Auch hast du nur eine timer-Variable. Wenn du mehr wie ein Tag einsetzt, dann wird bei Aufruf der vorherige Timer immer wieder ĂŒberschrieben und diese sind dann fĂŒr clearTimeout verloren.
                          Besser wĂ€re es die Daten direkt im Element zu speichern. DafĂŒr gibt es das Objekt
                          https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset

                          da könntest du deinen timer direkt da abspeichern.dann kommt sich da nix mehr in die quere.
                          Ich hab hier noch eine Sicherheitsabfrage eingebaut, damit bei mehrfachem Aufruf von mousedown ein evtl existierender timer auch gelöscht wird um Speicherlecks zu vermeiden.

                          function func(e,objID,visObjID) {
                            var element = e.currentTarget;
                            if (element.dataSet.timer) clearTimeout(element.dataSet.timer);
                            element.dataSet.timer = setTimeout(function(){ makeChange(objID,visObjID);},delay);
                          }
                          

                          Dann noch eine kleine Verbesserung zum Setzen eines Status.
                          Vis hat eine eigene Funktion zum setzen eines Datenpunkts.
                          Da musst du zuvor nicht erst den Datenpunkt abfragen.
                          Sinnigerweise heißt die

                          vis.setValue(datenpunkt, wert);
                          
                          S Offline
                          S Offline
                          seek1338
                          schrieb am zuletzt editiert von
                          #12

                          @oliverio

                          Wow erstmal vielen Dank fĂŒr die Antworten und den Tipp mit dem vergessenen "clearTimeout(timer);", ich hab den nun in der Funktion "function revert(objID,visObjID)" ergĂ€nzt.

                          Aber es hat auch davor funktioniert, nacheinander, abwechselt long und short?? Das Mit dem Doubleklick hatte ich auch drin aber ich hab wegen einer möglichen falschen Klick/Doubleklick unterscheidung am Touch die finger davon gelassen.

                          Ich hab mir auch ein bisschen deine Links und Skripte angeschaut und muss sagen es ĂŒbersteigt "etwas" meine JS-FĂ€higkeiten đŸ€• .... bin erstmal froh das es so funktioniert, verbesserungen werden aber bestimmt mit der Zeit folgen - Danke!

                          Zu deiner Frage wieso ich zuerst den Status auslese:
                          Wenn das Licht aktuell an ist, wird es beim Click ausgeschaltet und wenn es aus ist, wird es beim Click eingeschaltet. So eine Art schnelle On/Off Funktion fĂŒrs licht beim Single Click. Soweit ich das kenne muss man dafĂŒr vorab den Status abrufen.

                          Zu meiner unverstandenen Frage:
                          Es gibt im VIS ein Widget das Nennt sich "Filter - dropdown", in diesem kann man "Tags" definieren, die man anzeigen lassen möchte und alle Widgets die nicht dieses Tag haben werden deaktiviert. Das Widget ist im Standard Projekt drin wenn man ein neues anlegt, von daher kenn ich es auch.

                          Ich wĂŒrde gerne die Funktion im Skript beim Longpress abbilden und die Widgets die Angezeigt oder Ausgeblendet werden pro Zimmer via "Tags" dann ĂŒber die VIS steuern und nicht wie jetzt, ĂŒber ein Datenpunkt im Iobroker und der Sichtbarkeits Objekt ID im VIS z.b. wie ich mir das vorstelle im code:

                          function makeChange(objID,tag)
                          {
                              if(timer)
                              clearTimeout(timer);
                              
                              if(istrue)
                              {
                                  //Longpress Event
                                  istrue =false;
                                  vis.showTag(tag);
                              }
                          }
                          

                          aber ich habe keine Funktion gefunden die diese Tags aktiviert oder deaktiviert. ich weiß auch nicht in wie fern die Sichtbarkeit eines Widget, welche ĂŒber eine Objekt ID gesteuert wird in JS verwendung findet (JS getElement by ID und Ocupacy = 0?) oder dergleichen....

                          ich hoffe ich habe mich nun verstĂ€ndlicher ausgedrĂŒckt 😊

                          mfg,
                          Seek

                          OliverIOO 1 Antwort Letzte Antwort
                          0
                          • S seek1338

                            @oliverio

                            Wow erstmal vielen Dank fĂŒr die Antworten und den Tipp mit dem vergessenen "clearTimeout(timer);", ich hab den nun in der Funktion "function revert(objID,visObjID)" ergĂ€nzt.

                            Aber es hat auch davor funktioniert, nacheinander, abwechselt long und short?? Das Mit dem Doubleklick hatte ich auch drin aber ich hab wegen einer möglichen falschen Klick/Doubleklick unterscheidung am Touch die finger davon gelassen.

                            Ich hab mir auch ein bisschen deine Links und Skripte angeschaut und muss sagen es ĂŒbersteigt "etwas" meine JS-FĂ€higkeiten đŸ€• .... bin erstmal froh das es so funktioniert, verbesserungen werden aber bestimmt mit der Zeit folgen - Danke!

                            Zu deiner Frage wieso ich zuerst den Status auslese:
                            Wenn das Licht aktuell an ist, wird es beim Click ausgeschaltet und wenn es aus ist, wird es beim Click eingeschaltet. So eine Art schnelle On/Off Funktion fĂŒrs licht beim Single Click. Soweit ich das kenne muss man dafĂŒr vorab den Status abrufen.

                            Zu meiner unverstandenen Frage:
                            Es gibt im VIS ein Widget das Nennt sich "Filter - dropdown", in diesem kann man "Tags" definieren, die man anzeigen lassen möchte und alle Widgets die nicht dieses Tag haben werden deaktiviert. Das Widget ist im Standard Projekt drin wenn man ein neues anlegt, von daher kenn ich es auch.

                            Ich wĂŒrde gerne die Funktion im Skript beim Longpress abbilden und die Widgets die Angezeigt oder Ausgeblendet werden pro Zimmer via "Tags" dann ĂŒber die VIS steuern und nicht wie jetzt, ĂŒber ein Datenpunkt im Iobroker und der Sichtbarkeits Objekt ID im VIS z.b. wie ich mir das vorstelle im code:

                            function makeChange(objID,tag)
                            {
                                if(timer)
                                clearTimeout(timer);
                                
                                if(istrue)
                                {
                                    //Longpress Event
                                    istrue =false;
                                    vis.showTag(tag);
                                }
                            }
                            

                            aber ich habe keine Funktion gefunden die diese Tags aktiviert oder deaktiviert. ich weiß auch nicht in wie fern die Sichtbarkeit eines Widget, welche ĂŒber eine Objekt ID gesteuert wird in JS verwendung findet (JS getElement by ID und Ocupacy = 0?) oder dergleichen....

                            ich hoffe ich habe mich nun verstĂ€ndlicher ausgedrĂŒckt 😊

                            mfg,
                            Seek

                            OliverIOO Offline
                            OliverIOO Offline
                            OliverIO
                            schrieb am zuletzt editiert von
                            #13

                            @seek1338

                            das kannst du erreichen, indem du per programm in der selectbox einen wert auswÀhlst.
                            Mit jquery ist es relativ einfach

                            $('#w00000 select').val("Name deiner View bzw. Filterworts")
                            

                            Mit jQuery sucht man ĂŒber sogenannte css selectoren ein oder mehrere Elemente und kann dann funktionen daran ausfĂŒhren. In meinem Skript verwende ich diverse dieser Befehle.
                            jquery wird in vis automatisch schon mitgeladen.

                            Der angegebene Selektor '#w00000 select' bedeutet
                            suche nach ID w00000 und innerhalb dieses Elements nach dem Select-Tag
                            https://kulturbanause.de/blog/css-selektoren/

                            Es ist der selbe Mechanismus, mit dem man mit CSS Elemente formatieren kann.

                            Mit dem Unterbefehl .val("Wert") kannst du die Auswahl bestimmen.
                            https://api.jquery.com/val/
                            Ich habe das jetzt selbst nicht in diesem Kontext ausprobiert.

                            Meine Adapter und Widgets
                            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                            Links im Profil

                            1 Antwort Letzte Antwort
                            1
                            • OliverIOO OliverIO

                              @oliverio

                              so nach dem letzten Post habe ich mich auchmal noch versucht.
                              Der folgenden Code kann die folgenden Ereignisse abdecken und dann in einen Datenpunkt schreiben

                              Click
                              DoubleClick
                              Longpress

                              Bei Longpress kann man die minimale Zeit und maximale Zeit noch angeben.
                              Der Code fĂŒr das Tag kann noch optimiert werden, so das man eigentlich nur ein ereignis (mousedown) definieren mĂŒsste, aber jetzt erstmal mit diesem code probieren.

                              das kommt in ein html widget

                              <div style="width:100%;height:50%"
                                onClick="func(event,'0_userdata.0.test2');" 
                                onMousedown="func(event,'0_userdata.0.test2');"
                                onmouseup="func(event,'0_userdata.0.test2');"
                                ondblclick="func(event,'0_userdata.0.test2');" 
                              >xxx</div>
                              <div style="width:100%;height:50%"
                                onClick="func(event,'0_userdata.0.test3');" 
                                onMousedown="func(event,'0_userdata.0.test3');"
                                onmouseup="func(event,'0_userdata.0.test3');"
                                ondblclick="func(event,'0_userdata.0.test3');" 
                              >xxx</div>
                              

                              Das kommt in den Reiter "Skripte" der view

                              var minPressDelay=1000;
                              var maxPressDelay=5000;
                              var eventDebounceDelay = 200;
                              
                              function func(e,dp) {
                                  var element = e.currentTarget;
                                  var diff=0;
                                  var etype="";
                              
                                  if ($(element).data("time")) diff = e.timeStamp - $(element).data("time");
                                  if (e.type=="mousedown") $(element).data("time", e.timeStamp);
                                  if (e.type=="mouseup") $(element).data("time", 0);
                                  if (diff>minPressDelay && diff<maxPressDelay) etype="longpress";
                                  if (e.type=="click") etype="click";
                                  if (e.type=="dblclick") etype="dblclick";
                                  if (etype) {
                                      if (etype=="click" && $(element).data("lastevent")=="longpress") return;
                                      $(element).data("lastevent",etype);
                                      var oldTimer = $(element).data("timer");
                                      clearTimeout(oldTimer);
                                      var newTimer = setTimeout(function(){
                                          console.log("Event: " + etype + " for datapoint " + dp);
                                          vis.setValue(dp,etype);
                                          $(element).removeData("lastevent");
                                          $(element).removeData("timer");
                                       
                                               },200);
                                      $(element).data("timer",newTimer);
                                  }
                              }
                              

                              Es gibt hier 3 konfigurierbare Werte, wie schon erwÀhnt
                              minPressDelay und maxPressDelay
                              longpress wird nur erkannt, wenn es zwischen diesen beiden Werten in Millisekunden liegt
                              eventDebounceDelay muss je nach Hardware eingestellt werden, wie schnell die reagiert und lĂ€uft. Einfach mal probieren. Da wĂ€hrend dem ganzen Klicken und drĂŒcken diverse Ereignisse erzeugt werden, mĂŒssen diese weggepuffert werden.
                              Beispiel fĂŒr ein einfaches Click werden die folgenden Ereignisse der Reihe nach erzeugt

                              mousedown mouseup click
                              

                              oder fĂŒr doubleclick

                              mousedown mouseup click mousedown mouseup click dblclick
                              

                              damit nicht ganz wild der datenpunkt befeuert wird, wird eine gewisse zeit gewartet wird (bspw um das letzte click vom eigentlichen dblclick zu unterscheiden.

                              bitte beachtet die width und height angaben des divs anzupassen, so das das element auch den ganzen Raum ausfĂŒllt.

                              OliverIOO Offline
                              OliverIOO Offline
                              OliverIO
                              schrieb am zuletzt editiert von
                              #14

                              @oliverio

                              Hier noch zur VollstĂ€ndigkeit und fĂŒr die Nachwelt
                              Ich habe das obige Skript von der Anwendung nochmals vereinfacht, so das man nur noch einmal die Funktion im Tag angeben muss

                              Hier der Inhalt fĂŒr das html widget

                              <div style="width:100%;height:50%"
                                onMousedown="func(event,'0_userdata.0.test2');"
                              >xxx</div>
                              <div style="width:100%;height:50%"
                                onMousedown="func(event,'0_userdata.0.test3');"
                              >xxx</div>
                              
                              

                              Hier das Skript, welches in den Skripte-Reiter der jeweiligen view muss

                              var minPressDelay=1000;
                              var maxPressDelay=5000;
                              var eventDebounceDelay = 200;
                               
                              function func(e,dp) {
                                  var element = e.currentTarget;
                                  var diff=0;
                                  var etype="";
                                  $(element).off(".longpress");
                                  $(element).on("mouseup.longpress",function(dp,event){func(event,dp)}.bind(this,dp));
                                  $(element).on("click.longpress",function(dp,event){func(event,dp)}.bind(this,dp));
                                  $(element).on("dblclick.longpress",function(dp,event){func(event,dp)}.bind(this,dp));
                                  if ($(element).data("time")) diff = e.timeStamp - $(element).data("time");
                                  if (e.type=="mousedown") $(element).data("time", e.timeStamp);
                                  if (e.type=="mouseup") $(element).data("time", 0);
                                  if (diff>minPressDelay && diff<maxPressDelay) etype="longpress";
                                  if (e.type=="click") etype="click";
                                  if (e.type=="dblclick") etype="dblclick";
                                  if (etype) {
                                      if (etype=="click" && $(element).data("lastevent")=="longpress") return;
                                      $(element).data("lastevent",etype);
                                      var oldTimer = $(element).data("timer");
                                      clearTimeout(oldTimer);
                                      var newTimer = setTimeout(function(){
                                          console.log("Event: " + etype + " for datapoint " + dp);
                                          vis.setValue(dp,etype);
                                          $(element).removeData("lastevent");
                                          $(element).removeData("timer");
                                      },200);
                                      $(element).data("timer",newTimer);
                                  }
                              }
                              
                              

                              Dieses Skript erzeugt nun seine noch fehlenden Ereignishandler selber,
                              so dass nur noch onmousedown angegeben werden muss.
                              Die ErklÀrung der restlichen parameter steht im VorgÀngerpost

                              Meine Adapter und Widgets
                              TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                              Links im Profil

                              S 1 Antwort Letzte Antwort
                              0
                              • OliverIOO OliverIO

                                @oliverio

                                Hier noch zur VollstĂ€ndigkeit und fĂŒr die Nachwelt
                                Ich habe das obige Skript von der Anwendung nochmals vereinfacht, so das man nur noch einmal die Funktion im Tag angeben muss

                                Hier der Inhalt fĂŒr das html widget

                                <div style="width:100%;height:50%"
                                  onMousedown="func(event,'0_userdata.0.test2');"
                                >xxx</div>
                                <div style="width:100%;height:50%"
                                  onMousedown="func(event,'0_userdata.0.test3');"
                                >xxx</div>
                                
                                

                                Hier das Skript, welches in den Skripte-Reiter der jeweiligen view muss

                                var minPressDelay=1000;
                                var maxPressDelay=5000;
                                var eventDebounceDelay = 200;
                                 
                                function func(e,dp) {
                                    var element = e.currentTarget;
                                    var diff=0;
                                    var etype="";
                                    $(element).off(".longpress");
                                    $(element).on("mouseup.longpress",function(dp,event){func(event,dp)}.bind(this,dp));
                                    $(element).on("click.longpress",function(dp,event){func(event,dp)}.bind(this,dp));
                                    $(element).on("dblclick.longpress",function(dp,event){func(event,dp)}.bind(this,dp));
                                    if ($(element).data("time")) diff = e.timeStamp - $(element).data("time");
                                    if (e.type=="mousedown") $(element).data("time", e.timeStamp);
                                    if (e.type=="mouseup") $(element).data("time", 0);
                                    if (diff>minPressDelay && diff<maxPressDelay) etype="longpress";
                                    if (e.type=="click") etype="click";
                                    if (e.type=="dblclick") etype="dblclick";
                                    if (etype) {
                                        if (etype=="click" && $(element).data("lastevent")=="longpress") return;
                                        $(element).data("lastevent",etype);
                                        var oldTimer = $(element).data("timer");
                                        clearTimeout(oldTimer);
                                        var newTimer = setTimeout(function(){
                                            console.log("Event: " + etype + " for datapoint " + dp);
                                            vis.setValue(dp,etype);
                                            $(element).removeData("lastevent");
                                            $(element).removeData("timer");
                                        },200);
                                        $(element).data("timer",newTimer);
                                    }
                                }
                                
                                

                                Dieses Skript erzeugt nun seine noch fehlenden Ereignishandler selber,
                                so dass nur noch onmousedown angegeben werden muss.
                                Die ErklÀrung der restlichen parameter steht im VorgÀngerpost

                                S Offline
                                S Offline
                                seek1338
                                schrieb am zuletzt editiert von
                                #15

                                @oliverio danke fĂŒr den jquery tipp ich muss mich da einlessen ich habe das noch nie verwendet bzw. wie man dann daten setzten kann.

                                ich hab mein input auch umbauen mĂŒssen auf onpointerdown/onpointerup weils am touch nicht funktioniert hat nur mit der maus am pc :-)

                                <input style="height: 100%;width: 100%" type="button" onpointerdown="func('hm-rpc.0.OEQ0236727.3.STATE','0_userdata.0.VIS.buero')" onpointerup="revert('hm-rpc.0.OEQ0236727.3.STATE','0_userdata.0.VIS.buero')" value="foo"/>
                                

                                ich hab auch dein Skript getestet - wenn auch nicht verstanden, aber ich blick nicht so ganz durch und wenn man so periodisch alle 0,5 Sek drauf drĂŒckt erkennt er mal short und longpress (laut console) ? Wollt dich nur drauf aufmerksam machen.

                                mfg,
                                Seek

                                OliverIOO 1 Antwort Letzte Antwort
                                0
                                • S seek1338

                                  @oliverio danke fĂŒr den jquery tipp ich muss mich da einlessen ich habe das noch nie verwendet bzw. wie man dann daten setzten kann.

                                  ich hab mein input auch umbauen mĂŒssen auf onpointerdown/onpointerup weils am touch nicht funktioniert hat nur mit der maus am pc :-)

                                  <input style="height: 100%;width: 100%" type="button" onpointerdown="func('hm-rpc.0.OEQ0236727.3.STATE','0_userdata.0.VIS.buero')" onpointerup="revert('hm-rpc.0.OEQ0236727.3.STATE','0_userdata.0.VIS.buero')" value="foo"/>
                                  

                                  ich hab auch dein Skript getestet - wenn auch nicht verstanden, aber ich blick nicht so ganz durch und wenn man so periodisch alle 0,5 Sek drauf drĂŒckt erkennt er mal short und longpress (laut console) ? Wollt dich nur drauf aufmerksam machen.

                                  mfg,
                                  Seek

                                  OliverIOO Offline
                                  OliverIOO Offline
                                  OliverIO
                                  schrieb am zuletzt editiert von OliverIO
                                  #16

                                  @seek1338

                                  dann musst du mit der eventDebounceDelay wahrscheinlich verlÀngern.
                                  Eigentlich mĂŒsste die exakt auf der Zeit liegen, die das Betriebssystem als Zeit fĂŒr ein doubleclick vorgesehen hat. Die kenn ich aber nicht.

                                  Short? welches short?

                                  Welche Zeile/Zeilen verstehst du nicht.
                                  Wenn du sehr allgemein fragst kann man nicht antworten.

                                  Ok,Eventhandling im browser ist schon etwas fortgeschritteneres.
                                  Es hilft da auch mal mit dem debugger reinzugehen. Allerdings bitte nicht in die tiefen von jquery absteigen. das ist megaoptimiert, das verstehe ich auch manchmal nicht mehr.

                                  Die Befehle mit off und on löschen oder definieren die ereignisbehandlung fĂŒr das betroffene element
                                  Die komplette Logik fĂŒr alle ereignisse wurden in dieser einen Funktion untergebracht

                                  Die if-Abfragen fragen ab, fĂŒr welches Event die Funktion gerade aufgerufen wurde und ĂŒbernehmen fĂŒr die relevanten ereignisse click, dblclick die werte.

                                  Bei mousedown merkt er sich die Zeit und bei mouseup setzt er den zeitzĂ€hler wieder zurĂŒck

                                  wenn die Zeit lang genug war bei mouseup, erkennt er den etype longpress

                                  Alles was innerhalb des Abschnitts mit if (etype) {
                                  statt findet ist das entprellen der vielen Ereignisse, so das nur die relevanten Ereignisse das schreiben eines States auslösen..

                                  Hier ist noch eine Sonderbehandlung fĂŒr click und longpress drin, da das click ereignis nicht abgebrochen werden kann. daher muss er sich das jeweils letzte ereignis merken. nur wenn click auf longpress folgt, dann wird click unterdrĂŒckt.
                                  Wenn der State dann geschrieben wurde, wird timer und lastevent wieder aufgerÀumt

                                  Meine Adapter und Widgets
                                  TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                  Links im Profil

                                  S 1 Antwort Letzte Antwort
                                  0
                                  • OliverIOO OliverIO

                                    @seek1338

                                    dann musst du mit der eventDebounceDelay wahrscheinlich verlÀngern.
                                    Eigentlich mĂŒsste die exakt auf der Zeit liegen, die das Betriebssystem als Zeit fĂŒr ein doubleclick vorgesehen hat. Die kenn ich aber nicht.

                                    Short? welches short?

                                    Welche Zeile/Zeilen verstehst du nicht.
                                    Wenn du sehr allgemein fragst kann man nicht antworten.

                                    Ok,Eventhandling im browser ist schon etwas fortgeschritteneres.
                                    Es hilft da auch mal mit dem debugger reinzugehen. Allerdings bitte nicht in die tiefen von jquery absteigen. das ist megaoptimiert, das verstehe ich auch manchmal nicht mehr.

                                    Die Befehle mit off und on löschen oder definieren die ereignisbehandlung fĂŒr das betroffene element
                                    Die komplette Logik fĂŒr alle ereignisse wurden in dieser einen Funktion untergebracht

                                    Die if-Abfragen fragen ab, fĂŒr welches Event die Funktion gerade aufgerufen wurde und ĂŒbernehmen fĂŒr die relevanten ereignisse click, dblclick die werte.

                                    Bei mousedown merkt er sich die Zeit und bei mouseup setzt er den zeitzĂ€hler wieder zurĂŒck

                                    wenn die Zeit lang genug war bei mouseup, erkennt er den etype longpress

                                    Alles was innerhalb des Abschnitts mit if (etype) {
                                    statt findet ist das entprellen der vielen Ereignisse, so das nur die relevanten Ereignisse das schreiben eines States auslösen..

                                    Hier ist noch eine Sonderbehandlung fĂŒr click und longpress drin, da das click ereignis nicht abgebrochen werden kann. daher muss er sich das jeweils letzte ereignis merken. nur wenn click auf longpress folgt, dann wird click unterdrĂŒckt.
                                    Wenn der State dann geschrieben wurde, wird timer und lastevent wieder aufgerÀumt

                                    S Offline
                                    S Offline
                                    seek1338
                                    schrieb am zuletzt editiert von seek1338
                                    #17

                                    @oliverio

                                    ok ich glaub ich verstehe was du meins, du setzt mit var element = e.currentTarget; ein pointer auf das element und fragst bzw generierst via "$(element).on(" die events direkt im skript ab und brauchst dann nicht mehr im div/input feld mehrfach eintrÀge.

                                    Im gesamten verstehe ich dein skript jedoch nicht zu 100%, weil ich diese schreibweise mit element und data nicht kenne und die checks sowie die abhĂ€ngigkeiten im vergleich zu meinem Skript komplizierter (fĂŒr mich) geschrieben sind (js noob).

                                    Nachdem ich kurz mit jQuery herumexperimetiert habe (wer das auch immer erfunden hat war auf drogen), hab ich einen anderen weg gesucht und im quelltext der VIS gefunden:
                                    https://github.com/ioBroker/ioBroker.vis/blob/master/www/widgets/basic.html

                                    //ab Zeile 488
                                    $this.find('select').change(function () {
                                              vis.changeFilter(null, $this.find('select option:selected').val(), hideEffect, hideDuration, showEffect, showDuration);
                                    });
                                    

                                    dann im eigentlichen vis file nachgeschaut:
                                    https://github.com/ioBroker/ioBroker.vis/blob/master/www/js/vis.js

                                    ab Zeile 1092 fa lÀuft die funktion... auch nciht viel verstanden aber jquery unter andem gefudnen und auch folgenden hinweis:

                                    if (widgets[widget] && widgets[widget].data && widgets[widget].data.filterkey) {
                                           $('#' + widget).show(showEffect, null, parseInt(showDuration));
                                    }
                                    

                                    sieht fĂŒr mich so aus als wĂŒrde jquery alleine nicht helfen sondern die Tags ein bestands element vom Widget.data sind.

                                    also ein bisschen gespielt und nach ein paar fehlern folgendes zum funktionieren gebracht:

                                    vis.changeFilter(null, "buero_detail", null, null, null, 3000); //zeigt widgets mit dem TAG buero_detail an
                                    vis.changeFilter(null, "all", null, null, null, 3000); //widgets mit anderen tags verschwinden wieder
                                    

                                    die widgets mit tags, die man einblenden und ausblenen lassen möchte, mĂŒssen sichtbarkeit haben und das PrĂŒfelement muss gegen ein false Objekt immer beim starten auf unsichtbar sein (so hab ichs gelöst, vielleicht geht es auch eleganter).

                                    muss jetzt nur noch ein weg finden wie ich die tags an die jeweiligen input felder binde (eventuell value vom inputfeld) und dann mit einem true/false jeweils eins der befehle zum anzeigen oder ausblenden bewege.

                                    wenn ich ein weg gefunden habe poste ich das gesammelte nochmal rein

                                    mfg,
                                    Seek

                                    BananaJoeB 1 Antwort Letzte Antwort
                                    0
                                    • S seek1338

                                      @oliverio

                                      ok ich glaub ich verstehe was du meins, du setzt mit var element = e.currentTarget; ein pointer auf das element und fragst bzw generierst via "$(element).on(" die events direkt im skript ab und brauchst dann nicht mehr im div/input feld mehrfach eintrÀge.

                                      Im gesamten verstehe ich dein skript jedoch nicht zu 100%, weil ich diese schreibweise mit element und data nicht kenne und die checks sowie die abhĂ€ngigkeiten im vergleich zu meinem Skript komplizierter (fĂŒr mich) geschrieben sind (js noob).

                                      Nachdem ich kurz mit jQuery herumexperimetiert habe (wer das auch immer erfunden hat war auf drogen), hab ich einen anderen weg gesucht und im quelltext der VIS gefunden:
                                      https://github.com/ioBroker/ioBroker.vis/blob/master/www/widgets/basic.html

                                      //ab Zeile 488
                                      $this.find('select').change(function () {
                                                vis.changeFilter(null, $this.find('select option:selected').val(), hideEffect, hideDuration, showEffect, showDuration);
                                      });
                                      

                                      dann im eigentlichen vis file nachgeschaut:
                                      https://github.com/ioBroker/ioBroker.vis/blob/master/www/js/vis.js

                                      ab Zeile 1092 fa lÀuft die funktion... auch nciht viel verstanden aber jquery unter andem gefudnen und auch folgenden hinweis:

                                      if (widgets[widget] && widgets[widget].data && widgets[widget].data.filterkey) {
                                             $('#' + widget).show(showEffect, null, parseInt(showDuration));
                                      }
                                      

                                      sieht fĂŒr mich so aus als wĂŒrde jquery alleine nicht helfen sondern die Tags ein bestands element vom Widget.data sind.

                                      also ein bisschen gespielt und nach ein paar fehlern folgendes zum funktionieren gebracht:

                                      vis.changeFilter(null, "buero_detail", null, null, null, 3000); //zeigt widgets mit dem TAG buero_detail an
                                      vis.changeFilter(null, "all", null, null, null, 3000); //widgets mit anderen tags verschwinden wieder
                                      

                                      die widgets mit tags, die man einblenden und ausblenen lassen möchte, mĂŒssen sichtbarkeit haben und das PrĂŒfelement muss gegen ein false Objekt immer beim starten auf unsichtbar sein (so hab ichs gelöst, vielleicht geht es auch eleganter).

                                      muss jetzt nur noch ein weg finden wie ich die tags an die jeweiligen input felder binde (eventuell value vom inputfeld) und dann mit einem true/false jeweils eins der befehle zum anzeigen oder ausblenden bewege.

                                      wenn ich ein weg gefunden habe poste ich das gesammelte nochmal rein

                                      mfg,
                                      Seek

                                      BananaJoeB Online
                                      BananaJoeB Online
                                      BananaJoe
                                      Most Active
                                      schrieb am zuletzt editiert von BananaJoe
                                      #18

                                      @seek1338 ich habe das einfach mit dem "Basic - Bulb (on/off)" gemacht,
                                      Als Overlay arbeite ich wie folgt:

                                      • Hintergrund mit Licht aus
                                      • Off einfach ein Transparentes .png
                                      • On dann ein .png mit Licht an

                                      So kann ich einfach einmal auf den Raum drauftippen.
                                      cde38f1f-9dea-4846-8967-cf11e3b3b175-image.png
                                      b494fef5-a9c4-4bd2-96e9-3426c7ffab10-image.png

                                      Aber am Thema vorbei, du wolltest ja AlternativmenĂŒs - die habe ich bei mir mit den sichtbaren extra-Buttons gelöst.
                                      Alternativ ĂŒber dasObjekt einen weiteren Bulb legen und im Z-Index weiter nach oben setzen.
                                      Und dann z.B. ein Popup-MenĂŒ aufrufen lassen

                                      ioBroker@Ubuntu 24.04 LTS (Proxmox VM) fĂŒr: >260 GerĂ€te, 6 Switche, 7 AP, 10 IP-Cam, 1 NAS 42TB, 1 Proxmox 128GB 15TB, 2 Proxmox 32GB 1TB, 1 Hyper-V 52GB 42TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV APC 750W kaskadiert

                                      S 1 Antwort Letzte Antwort
                                      0
                                      • BananaJoeB BananaJoe

                                        @seek1338 ich habe das einfach mit dem "Basic - Bulb (on/off)" gemacht,
                                        Als Overlay arbeite ich wie folgt:

                                        • Hintergrund mit Licht aus
                                        • Off einfach ein Transparentes .png
                                        • On dann ein .png mit Licht an

                                        So kann ich einfach einmal auf den Raum drauftippen.
                                        cde38f1f-9dea-4846-8967-cf11e3b3b175-image.png
                                        b494fef5-a9c4-4bd2-96e9-3426c7ffab10-image.png

                                        Aber am Thema vorbei, du wolltest ja AlternativmenĂŒs - die habe ich bei mir mit den sichtbaren extra-Buttons gelöst.
                                        Alternativ ĂŒber dasObjekt einen weiteren Bulb legen und im Z-Index weiter nach oben setzen.
                                        Und dann z.B. ein Popup-MenĂŒ aufrufen lassen

                                        S Offline
                                        S Offline
                                        seek1338
                                        schrieb am zuletzt editiert von
                                        #19

                                        @bananajoe danke... das mit dem Overlay funktioniert schon lange, war auc ham einfachsten... mir gehts drum dieses Extrabutton zu vermeiden.
                                        Click = Licht An/Aus
                                        Longpress (0,5Sek) = ExtramenĂŒ (mit den weiteren Raum Optionen oder vll eine Raumansicht im neuen View, bin noch unentschlossen)

                                        Aber ich habs fast đŸ˜” 😬

                                        1 Antwort Letzte Antwort
                                        0
                                        • S Offline
                                          S Offline
                                          seek1338
                                          schrieb am zuletzt editiert von
                                          #20

                                          so nachdem nun endlich das Skript so ist wie ich es mir gewĂŒnscht habe, danke an alle die mir geholfen haben und/oder mich am richtigen weg gebraucht haben 😊

                                          Was das Ziel war:
                                          Unsichtbares HTML Overlay ĂŒber ein Zimmer

                                          • bei Click geht das Licht An oder Aus, je nach aktuellem Status
                                          • bei long Press am Zimmer tauchen Widgets auf welche zu vor mit einem entsprechenden Filterwort versehen wurden (werden nach x Sekunden wieder ausgeblendet)

                                          Vorraussetzung:
                                          .) Dieses Skript funktioniert nur sofern aktuell keine anderen Widgets oder Navigationen mit Filterwörter verwendet werden!
                                          .) Alle Widgets welche mit Filterwort genutzt werden sollen, mĂŒssen beim Starten unsichtbar sein. HierfĂŒr im Sichtbarkeits Objekt Verlinkung einen manuell erstelten Datenpunkt auswĂ€hlen welcher imer auf fals steht (z.b. 0_userdata.0.VIS.false_state = false) eventuell kann man das schöner lösen ich weiß es nicht

                                          HTML Overlay - HTML Code:

                                          <input id="buero" style="height: 100%;width: 100%" type="button" onpointerdown="func('hm-rpc.0.OEQ0236727.3.STATE','buero_detail')" onpointerup="revert('hm-rpc.0.OEQ0236727.3.STATE','buero_detail')"/>
                                          

                                          Wobei:
                                          "hm-rpc.0.OEQ0236727.3.STATE" - muss mit deinem IoBroker Objekt Pfad zu deinem licht getauscht werden
                                          "buero_detail" - ist das Filterwort das die fĂŒr das Zimmer Relevanten Widgets haben mĂŒssen

                                          Vis JS-Skript:

                                          var timer;
                                          var hidetimer;
                                          var istrue = true;
                                          var filterVisible = [];
                                          var delay = 500; // after delay Click = Longpress
                                          var showTime = 5; // sek after hide shown Tag-Widgets
                                          
                                           //objID    = Objekt ID from Device z.b. hm-rpc.0.OEQ0236727.3.STATE
                                          //visObjID = Widget Tag
                                          function func(objID,visObjID)
                                          {
                                              istrue = true;
                                              timer = setTimeout(function(){ makeChange(objID,visObjID);},delay);
                                          }
                                          
                                          function makeChange(objID,visObjID)
                                          {
                                              if(timer) clearTimeout(timer);
                                              if(hidetimer) clearTimeout(hidetimer);
                                              
                                              if(istrue) 
                                              { //Longpress Event Start
                                                  istrue = false;
                                                  
                                                  //IF visObjID is not set!
                                                  if(typeof filterVisible[visObjID] === 'undefined') 
                                                  {   
                                                      //Show Widget with Tags = visObjID
                                                      vis.changeFilter(null, visObjID, null, null, null, null);
                                                      
                                                      clearArray(filterVisible);      //Clear other visObjID entrys
                                                      filterVisible = [];             //Set back to Array
                                                      filterVisible[visObjID] = true; //set status for this visObjID
                                                      
                                                      //Hide after (showTime) Sek the Tags-Widgets
                                                      hidetimer = setTimeout(function(){ 
                                                          //Hide Back Widgets with Tags = visObjID
                                                          vis.changeFilter(null, "TagNotExists", null, null, null, null);
                                                          
                                                          clearArray(filterVisible);  //clear 
                                                          filterVisible = [];         //Set back to Array
                                                      }, showTime*1000)
                                                  } 
                                                  //if the same visObjID and visObjID = true
                                                  else
                                                  {
                                                      //Hide Back Widgets with Tags = visObjID
                                                      vis.changeFilter(null, "TagNotExists", null, null, null, null);
                                                      
                                                      clearArray(filterVisible);  //clear 
                                                      filterVisible = [];         //Set back to Array
                                                  }    
                                              }
                                          }
                                          
                                          function revert(objID,visObjID)
                                          {
                                              if(timer && istrue) 
                                              { //Click Event
                                                  clearTimeout(timer);
                                                  istrue = false;
                                          
                                                  //Get ObjektID Status (Bool) and set oposide (Light On/Off)
                                                  servConn._socket.emit('getStates', objID, (error, states) => {
                                                      servConn._socket.emit('setState', objID, !states[objID].val);
                                                  });
                                              }
                                          }
                                          
                                          function clearArray(array) {
                                              while (array.length) {
                                                  array.pop();
                                              }
                                          }
                                          

                                          Wobei:
                                          var delay = zeit in ms, welche mindestens fĂŒr ein Longpress vergehen muss (bitte testet das auf euer system)
                                          var showTime = zeit in sekunden, nach welcher die eingeblendeten widgets wieder ausgeblendet werden

                                          Wichtig:
                                          Solltet Ihr Lichter haben welche andere Werte als false oder true vorraussetzen funktioniert dieses Skript ohne umbau nicht!! Bitte hierfĂŒr den Bereich in der revert Funktion bearbeiten z.b.: (ungetestet):

                                          servConn._socket.emit('getStates', objID, (error, states) => {
                                          	if(states[objID].val == 0) 
                                          		servConn._socket.emit('setState', objID, 1);
                                          	else 
                                          		servConn._socket.emit('setState', objID, 0);
                                          });
                                          

                                          Hat mich echt was an Zeit gekostet und ich denke das JS-Skript geht auch besser, aber es funktioniert und macht was es soll ;-)

                                          danke nochmals besonder @oliverio fĂŒr den tiefen einblick 👍

                                          mfg,
                                          Seek

                                          1 Antwort Letzte Antwort
                                          1

                                          Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                                          Hast du es satt, bei jedem Besuch durch die gleichen BeitrĂ€ge zu scrollen? Wenn du dich fĂŒr ein Konto anmeldest, kommst du immer genau dorthin zurĂŒck, wo du zuvor warst, und kannst dich ĂŒber neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und BeitrĂ€ge positiv bewerten, um anderen Community-Mitgliedern deine WertschĂ€tzung zu zeigen.

                                          Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                                          Registrieren Anmelden
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          455

                                          Online

                                          33.0k

                                          Benutzer

                                          83.4k

                                          Themen

                                          1.3m

                                          BeitrÀge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2026
                                          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