NEWS
Langer Tastendruck möglich?
-
@derrapf sagte in Langer Tastendruck möglich?:
@mickym Danke für das Angebot
Aber Node Red fange ich jetzt nicht auch noch an. Ich hab alles in Java-Script und das kann ich einfach besser "lesen".
Aber Ok. Ich versuch mal rauszufinden wie es in Java geht.
Wenn ich es weiss, dann poste ich es hier.
Gruss RalfDu verpasst da einiges - aber wie Du willst. Es ist ein tolles Tool, da Du Dich um die Logik kümmern kannst und auch auf JS basiert. Aber die Nodes sind halt schon fertige Funktionen, die Dir das Leben erleichtern.
Na das Triggern ist nicht das Problem:
on(pattern, callbackOrId, value)https://www.iobroker.net/docu/index-81.htm?page_id=5809
Aber dann die Timer etc. zu implementieren wird kompliziert - da ist mir dann doch lieber ich greif auf fertige Programmbausteine zurück.
@mickym
Naja.. wenn ich wieder mal mehr Zeit habe, dann kann ich das mal anschauen. Ich bin aber irgendwie mit Programmiersprachen aufgewachsen; mir ist das irgendwie lieber. Aktuell hab ich tatsächlich keinen Nerv dafür; hab grad zuviel Baustellen. Da brauch ich nicht noch eine weitere ;-) Aber vielleicht wenn es wieder etwas ruhiger zu geht.
Gruss Ralf -
@derrapf Du musst das halt im Zusammenhang mit Deiner Logikmaschine machen. Ich habe es mit Node-Red gemacht.
https://forum.iobroker.net/topic/40948/shelly-dimmer-datenpunkte-über-vis-steuern/3?_=1635800698767
Über das Taster Widget kann man dann über gedrückt=true und nicht gedrückt=false das steuern.
tasterimplementierung-dimmer-vis-nodered.mp4
Ich habe hier mal einen Teil des Flows gepostet:
Wichtig ist, was ich unten geschrieben habe. Wenn der Taster gedrückt ist werden alle 250ms Nachrichten verschickt. Sobald 5 Nachrichten geschickt sind, wird ein langer Tastendruck (also 1,25s) erkannt. Kann man konfigurieren wie man will.
Der Zähler wird zurückgesetzt sobald der Taster losgelassen wird.
@mickym sagte: Über das Taster Widget kann man dann über gedrückt=true und nicht gedrückt=false das steuern.
Dann kann man per Script z.B. alle 250 ms die Lautstärke bis zum Loslassen erhöhen.
var zyklus = null; on(idTaste, function(dp) { if(dp.state.val) { zyklus = setInterval(function() { // Laustärke erhöhen }, 250); } else clearInterval(zyklus); }); -
@mickym
Naja.. wenn ich wieder mal mehr Zeit habe, dann kann ich das mal anschauen. Ich bin aber irgendwie mit Programmiersprachen aufgewachsen; mir ist das irgendwie lieber. Aktuell hab ich tatsächlich keinen Nerv dafür; hab grad zuviel Baustellen. Da brauch ich nicht noch eine weitere ;-) Aber vielleicht wenn es wieder etwas ruhiger zu geht.
Gruss Ralf@derrapf Ich bin auch noch mit C, C++, Cobol und Basic aufgewachsen. Deswegen traue ich mir Programmierung durchaus zu - aber ich bin von NodeRed so begeistert, weil Du damit halt nicht Programmieren für Dummies machst, sondern gleichzeitig die Logike visualisiest, aber @paul53 hat Dir ja den Code schon geschickt.
-
@mickym sagte: Über das Taster Widget kann man dann über gedrückt=true und nicht gedrückt=false das steuern.
Dann kann man per Script z.B. alle 250 ms die Lautstärke bis zum Loslassen erhöhen.
var zyklus = null; on(idTaste, function(dp) { if(dp.state.val) { zyklus = setInterval(function() { // Laustärke erhöhen }, 250); } else clearInterval(zyklus); });@paul53 sagte in Langer Tastendruck möglich?:
@mickym sagte: Über das Taster Widget kann man dann über gedrückt=true und nicht gedrückt=false das steuern.
Dann kann man per Script z.B. alle 250 ms die Lautstärke bis zum Loslassen erhöhen.
var zyklus = null; on(idTaste, function(dp) { if(dp.state.val) { zyklus = setInterval(function() { // Laustärke erhöhen }, 250); } else clearInterval(zyklus); });Nach meinen Flow müsstest Du jetzt halt zum Beispiel zählen wieviel Zyklen vergangen sind - also einen Zähler in die Schleife bauen um einen Longpress zu erkennen.
Also ab 5 zyklen erkennst Du einen Longpress und Du machst bei jedem Zyklus Deinen HTTP Request. Ansonsten wird bei unter 5 wird das als Shortpress interpretiert und machst Deinen Toggle oder sonstige Schaltung.
-
@mickym
Vielen Dank auch an Paul
Aber dann muss ich mal blöd fragen. (Vielleicht hab ich den Befehl bisher falsch verstanden)on(idTaste, function(dp) { }wird doch getriggert wenn ich einen Taster drücke bzw. wenn sich ein Datenpunkt ändert (z.B. von true auf false, oder von 20 auf 21 oder von "dings" auf "bums")
Ein Taster kann auch ein VIS Widget sein.
Bisher dachte ich dass "Taster" bedeutet dass beim Drücken des physischen-, als auch des VIS-Tasters ein Wert in einen Datenpunkt geschrieben, dieser also geändert wird. Das ist im Grunde eine Variablen-Zuweisung.
Der Schalter wird also kurz gedrückt und dann wieder losgelassen.Wenn das oben funktionieren soll, dann müsste es zwei Trigger-Events für den "on-Befehl" geben: Einmal beim Drücken (Wert wird gesetzt, bzw. Timer läuft los) und dann nochmal beim Loslassen (Wert wird wieder geändert, Timer wird angehalten)
Mir wäre jetzt aber nicht bekannt, dass beim Loslassen einer Taste dieses über einen on-Befehl in JS abgefangen werden könnte.
Bin ich jetzt total auf dem Holzweg? Wo ist mein Denkfehler?
Gruss Ralf -
@mickym
Vielen Dank auch an Paul
Aber dann muss ich mal blöd fragen. (Vielleicht hab ich den Befehl bisher falsch verstanden)on(idTaste, function(dp) { }wird doch getriggert wenn ich einen Taster drücke bzw. wenn sich ein Datenpunkt ändert (z.B. von true auf false, oder von 20 auf 21 oder von "dings" auf "bums")
Ein Taster kann auch ein VIS Widget sein.
Bisher dachte ich dass "Taster" bedeutet dass beim Drücken des physischen-, als auch des VIS-Tasters ein Wert in einen Datenpunkt geschrieben, dieser also geändert wird. Das ist im Grunde eine Variablen-Zuweisung.
Der Schalter wird also kurz gedrückt und dann wieder losgelassen.Wenn das oben funktionieren soll, dann müsste es zwei Trigger-Events für den "on-Befehl" geben: Einmal beim Drücken (Wert wird gesetzt, bzw. Timer läuft los) und dann nochmal beim Loslassen (Wert wird wieder geändert, Timer wird angehalten)
Mir wäre jetzt aber nicht bekannt, dass beim Loslassen einer Taste dieses über einen on-Befehl in JS abgefangen werden könnte.
Bin ich jetzt total auf dem Holzweg? Wo ist mein Denkfehler?
Gruss Ralf@derrapf Genau das Skript wird nur beim Wechsel getriggert von true auf false oder umgekehrt.
Nun frägt er ab:
if(dp.state.val)wenn der Datenpunkt true ist, dann wird über
zyklus = setInterval(function() { // Laustärke erhöhen }, 250);übder das Zyklus Objekt alle 250 ms ein Trigger /Timer gestartet und ausgeführt. Also kommen da die HTTP Befehle rein
ist
if(dp.state.val)der Datenpunkt falsch wird der Timer gelöscht, der alle 250 ms einen Trigger erzeugt.
-
@mickym
Vielen Dank auch an Paul
Aber dann muss ich mal blöd fragen. (Vielleicht hab ich den Befehl bisher falsch verstanden)on(idTaste, function(dp) { }wird doch getriggert wenn ich einen Taster drücke bzw. wenn sich ein Datenpunkt ändert (z.B. von true auf false, oder von 20 auf 21 oder von "dings" auf "bums")
Ein Taster kann auch ein VIS Widget sein.
Bisher dachte ich dass "Taster" bedeutet dass beim Drücken des physischen-, als auch des VIS-Tasters ein Wert in einen Datenpunkt geschrieben, dieser also geändert wird. Das ist im Grunde eine Variablen-Zuweisung.
Der Schalter wird also kurz gedrückt und dann wieder losgelassen.Wenn das oben funktionieren soll, dann müsste es zwei Trigger-Events für den "on-Befehl" geben: Einmal beim Drücken (Wert wird gesetzt, bzw. Timer läuft los) und dann nochmal beim Loslassen (Wert wird wieder geändert, Timer wird angehalten)
Mir wäre jetzt aber nicht bekannt, dass beim Loslassen einer Taste dieses über einen on-Befehl in JS abgefangen werden könnte.
Bin ich jetzt total auf dem Holzweg? Wo ist mein Denkfehler?
Gruss Ralf -
@derrapf sagte: Wenn das oben funktionieren soll, dann müsste es zwei Trigger-Events
Es wird bei Änderung in beiden Richtungen (Drücken: false --> true / Loslassen: true --> false) getriggert.
-
@paul53
Ok!?
Das ist mir dann irgendwie nie aufgefallen. D.h. meine ganzen on... Programmierungen laufen immer zweimal?
Muss ich echt mal checken.
Aber OK. Wenn das so ist müsste ich es hinbringen.
Ich fang mal an zu basteln.Gruss Ralf
@derrapf Das ist doch die Besonderheit bei dem Widget - dass Du es als Taster konfigurieren kannst.
Wenn das oben funktionieren soll, dann müsste es zwei Trigger-Events für den "on-Befehl" geben: Einmal beim Drücken (Wert wird gesetzt, bzw. Timer läuft los) und dann nochmal beim Loslassen (Wert wird wieder geändert, Timer wird angehalten)
Als Taster funktioniert es nicht wie ein Schalter oder Switch. Der Schaltet einmal von on auf off etc. Der Taster schalten true (on) solange DU gedrückt hälst und false(off) wenn Du loslässt. Deswegen musst DU ja zwingend dieses Widget nehmen, da nur dieses als Taster konfigurierbar ist.
Es ist also wie bei einem physischen Taster- den Du drückst und der beim Loslassen wieder in die Grundposition springt und nicht wie bei Schalter der in der Position bleibt den Du zuletzt gedrückt hast.
-
@derrapf Das ist doch die Besonderheit bei dem Widget - dass Du es als Taster konfigurieren kannst.
Wenn das oben funktionieren soll, dann müsste es zwei Trigger-Events für den "on-Befehl" geben: Einmal beim Drücken (Wert wird gesetzt, bzw. Timer läuft los) und dann nochmal beim Loslassen (Wert wird wieder geändert, Timer wird angehalten)
Als Taster funktioniert es nicht wie ein Schalter oder Switch. Der Schaltet einmal von on auf off etc. Der Taster schalten true (on) solange DU gedrückt hälst und false(off) wenn Du loslässt. Deswegen musst DU ja zwingend dieses Widget nehmen, da nur dieses als Taster konfigurierbar ist.
Es ist also wie bei einem physischen Taster- den Du drückst und der beim Loslassen wieder in die Grundposition springt und nicht wie bei Schalter der in der Position bleibt den Du zuletzt gedrückt hast.
-
-
@derrapf Und wenn Du zwischen Long und Short Press nicht unterscheiden musst, kannst Du solange der Datenpunkt auf true ist Deine HTTP Requests über den Timer rausballern
-
@paul53
Ok!?
Das ist mir dann irgendwie nie aufgefallen. D.h. meine ganzen on... Programmierungen laufen immer zweimal?
Muss ich echt mal checken.
Aber OK. Wenn das so ist müsste ich es hinbringen.
Ich fang mal an zu basteln.Gruss Ralf
@derrapf
Leute das hat auf Anhieb funktioniert!
Ich bin begeistert!Aber: Die zig http Requests werden scheinbar gepuffert (wahrscheinlich im Mediola Gateway).
D.h. dass der Lautstärkeregler sich noch weitergedreht hat nachdem ich schon längst die Taste losgelassen habe.
Da brauche ich ev. ne andere IR Sequenz, die den Regler nur ein paar Winkelsekunden weiterdreht.. Mal sehen. Aber grundsätzlich gehts.
Gruss Ralf -
@derrapf
Leute das hat auf Anhieb funktioniert!
Ich bin begeistert!Aber: Die zig http Requests werden scheinbar gepuffert (wahrscheinlich im Mediola Gateway).
D.h. dass der Lautstärkeregler sich noch weitergedreht hat nachdem ich schon längst die Taste losgelassen habe.
Da brauche ich ev. ne andere IR Sequenz, die den Regler nur ein paar Winkelsekunden weiterdreht.. Mal sehen. Aber grundsätzlich gehts.
Gruss Ralf@derrapf Das Problem ist, dass das Gateway das nicht so schnell verarbeiten kann. Du musst halt die Zeit dann auf 500ms ggf. erhöhen. Das ist leider so, dass es nie so schnell wie auf einer richtigen Fernbedienung ist. Du musst halt mit den Zeiten rumspielen, was vom Gateway noch verarbeitet werden kann.
-
@derrapf Das Problem ist, dass das Gateway das nicht so schnell verarbeiten kann. Du musst halt die Zeit dann auf 500ms ggf. erhöhen. Das ist leider so, dass es nie so schnell wie auf einer richtigen Fernbedienung ist. Du musst halt mit den Zeiten rumspielen, was vom Gateway noch verarbeitet werden kann.
-
@mickym Stimmt, das ist auch noch eine Option. Da kann ich mal dran schrauben.
Hätte nicht gedacht, dass ich so schnell zum Erfolg komme. Danke nochmal.
Gruss Ralf@derrapf
So jetzt geht's
Habe 1000 ms verwendet. Das reicht locker.Falls sich noch jemand für den Code interessiert:
var pfad = "mediola.alexatrigger" + "."; // PFad unter dem in der Javascript-Instanz die Datenpunkte angelegt werden sollen: // Datenpunktnamen: var idAmp_lauter = pfad + "Amp_lauter"; var idAmp_leiser = pfad + "Amp_leiser"; var amp_Volup_Counter = null; var amp_Voldown_Counter = null; // Datenpunkte anlegen: // ----------------------------------------------------------------------------- createState(idAmp_lauter, 0, force_creation, { name: "Amp_lauter", SmartName: "Verstärker lauter", desc: "Verstärker lauter", type: 'number', unit: '', role: 'state' }); createState(idAmp_leiser, 0, force_creation,{ name: "Amp_leiser", SmartName: "Verstärker leiser", desc: "Verstärker lauter", type: 'number', unit: '', role: 'state' }); //------------- Lauter ----------------------------------------------------- on({id: "javascript.0."+idAmp_lauter ,change:'any'}, function (obj) { if(obj.state.val) { amp_Volup_Counter = setInterval(function() { // Laustärke erhöhen log("Amp lauter"); mediolaRequest(idAlexaVerstaerker, str_langsam_lauter); }, 1000); } else clearInterval(amp_Volup_Counter); }); //------------- Leiser ----------------------------------------------------- on({id: "javascript.0."+idAmp_leiser ,change:'any'}, function (obj) { if(obj.state.val) { amp_Voldown_Counter = setInterval(function() { // Laustärke erhöhen log("Amp leiser"); mediolaRequest(idAlexaVerstaerker, str_langsam_leiser); }, 1000); } else clearInterval(amp_Voldown_Counter); });Die Funktion mediolaRequest sorgt für das Versenden der IR Code. Hier kann jeder natürlich jede beliebige anderes Funktion einbauen die bei ihm irgend was tun soll.
Gruss Ralf
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