Langer Tastendruck mit KNX Binäreingang

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Norick
Beiträge: 251
Registriert: 31. Jan 2022 06:35
Answers: 0

Re: Langer Tastendruck mit KNX Binäreingang

Beitrag von Norick »

udo1toni hat geschrieben: 22. Jan 2023 15:02 Wenn Du die Rule über die UI verwenden willst, geht das gewöhnlich auch (hier aber nicht), dann musst Du den gesamten Rahmen der Rule entfernen, weil die UI den Rahmen bereitstellt. Der Rahmen ist dies hier:
das heisst ich kann die UI für diesen Fall der Tastenauswertung NICHT benutzen, auch nicht wenn ich den bereitgestellten Rahmen so wie du es gezeigt hast entfernt wird? Wenn ja, kannst du mir bitte noch sagen wieso dies nicht geht?


Ich habe nun wie du geschrieben hast die Rule im Ordner

Code: Alles auswählen

C:\openhab\conf\rules
abgelegt mit der Endung .rules. Diese sind nun so aus:

Code: Alles auswählen

var Timer tTaste = null rule "Taste auswerten"

rule "TasterWohnenSchlafenEingang_TasterSchlafenEingang"
when
	Item TasterWohnenSchlafenEingang_TasterSchlafenEingang changed
then
	tTaste?.cancel
	if(newState == ON) {
		tTaste = createTimer(now.plusNanos(2000000000),[| // 2000 Millisekunden
		// Befehl: langer Tastendruck erkannt
		logInfo("Taster WohnenSchlafen", "langer Tastendruck erkannt")
		KNXDeviceAktorA3_WohnenLichtEsstisch.sendCommand(ON)
	      ])
	} else {
	if(!(tTaste.hasTerminated)) {
		// Befehl: kurzer Tastendruck erkannt
		logInfo("Taster WohnenSchlafen", "kurzer Tastendruck erkannt")
		KNXDeviceAktorA3_KucheLichtKochinsel.sendCommand(ON)
	}
	}
end

Wenn ich nun die Taste drücke (> 2s) bekomme ich folgendes in the logs angezeigt:

Code: Alles auswählen

[INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'Wohnen Schlafen Taster - Tastendruck auswerten.rules'
[WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'Wohnen Schlafen Taster - Tastendruck auswerten.rules' has errors, therefore ignoring it: [3,1]: mismatched input 'rule' expecting 'when'
und im events.log

Code: Alles auswählen

[INFO ] [openhab.event.ItemCommandEvent      ] - Item 'TasterWohnenSchlafenEingang_TasterWohnenSchlafenEingang' received command ON
[INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'KNXDeviceAktorA3_WohnenLichtDurchgang' changed from OFF to ON
[INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'TasterWohnenSchlafenEingang_TasterWohnenSchlafenEingang' predicted to become ON
[INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TasterWohnenSchlafenEingang_TasterWohnenSchlafenEingang' changed from OFF to ON
Obwohl oben "nur" eine Warnung angezeigt wird scheint mir die Rule noch einen Fehler zu haben aber kann diesen nicht finden. Hast du einen guten Rat?

Vielen Dank

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Langer Tastendruck mit KNX Binäreingang

Beitrag von udo1toni »

Norick hat geschrieben: 25. Feb 2023 09:07 das heisst ich kann die UI für diesen Fall der Tastenauswertung NICHT benutzen, auch nicht wenn ich den bereitgestellten Rahmen so wie du es gezeigt hast entfernt wird? Wenn ja, kannst du mir bitte noch sagen wieso dies nicht geht?
Die Rule benötigt für ihre Funktion einen Timer, der kontrolliert werden muss. (tTaste.hasTerminated).
Dafür benötigt die Rule eine globale Variable. Die globale Variable wird außerhalb der Rule definiert, was bei UI Rules nicht möglich ist.
Norick hat geschrieben: 25. Feb 2023 09:07

Code: Alles auswählen

[WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'Wohnen Schlafen Taster - Tastendruck auswerten.rules' has errors, therefore ignoring it: [3,1]: mismatched input 'rule' expecting 'when'
Steht im Klartext da. :) Der Fehler ist entstanden, weil Du eine Anweisung doppelt im Code stehen hast:
Norick hat geschrieben: 25. Feb 2023 09:07

Code: Alles auswählen

var Timer tTaste = null rule "Taste auswerten"

rule "TasterWohnenSchlafenEingang_TasterSchlafenEingang"
when
Oder mal etwas umgebrochen, um es deutlicher zu machen:

Code: Alles auswählen

var Timer tTaste = null 

rule "Taste auswerten"

rule "TasterWohnenSchlafenEingang_TasterSchlafenEingang"
when
Das geht natürlich nicht.

Nur so zur Info:
Das hier:

Code: Alles auswählen

var Timer tTaste = null rule "Taste auswerten" when Item TasterWohnenSchlafenEingang_TasterSchlafenEingang changed then tTaste?.cancel if(newState == ON) { tTaste = createTimer(now.plusNanos(2000000000),[| logInfo("Taster WohnenSchlafen", "langer Tastendruck erkannt") KNXDeviceAktorA3_WohnenLichtEsstisch.sendCommand(ON) ]) } else { if(!(tTaste.hasTerminated)) { logInfo("Taster WohnenSchlafen", "kurzer Tastendruck erkannt") KNXDeviceAktorA3_KucheLichtKochinsel.sendCommand(ON) } } end
und das hier:

Code: Alles auswählen

var Timer tTaste = null 

rule "Taste auswerten" 
when 
    Item TasterWohnenSchlafenEingang_TasterSchlafenEingang changed 
then
    tTaste?.cancel
    if(newState == ON) {
        tTaste = createTimer(now.plusNanos(2000000000),[|
            logInfo("Taster WohnenSchlafen", "langer Tastendruck erkannt")
            KNXDeviceAktorA3_WohnenLichtEsstisch.sendCommand(ON)
        ])
    } else {
        if(!(tTaste.hasTerminated)) {
            logInfo("Taster WohnenSchlafen", "kurzer Tastendruck erkannt")
            KNXDeviceAktorA3_KucheLichtKochinsel.sendCommand(ON)
        }
    }
end
ist für openHAB der selbe Code. Die Variante mit Umbrüchen und Einrückungen ist aber für Menschen besser lesbar :)

Der Precompiler durchläuft den Code in mehreren Schritten.
Schritt 1: Alles, was zwischen /* und */ eingeschlossen ist, wird gelöscht. (incl. /**/)
Schritt 2: Alles, was nach // innnerhalb einer Zeile steht wird gelöscht (incl. //)
Schritt 3: alle Zeilenumbrüche werden durch ein Leerzeichen ersetzt, ebenso werden alle Tabs durch ein Leerzeichen ersetzt.
Schritt 4: alle Leerflächen werden durch ein einzelnes Leerzeichen ersetzt.
Danach wird ausführbarer Code erzeugt.

Hatte ich schon erwähnt, dass Deine Itemnamen grausig sind?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Norick
Beiträge: 251
Registriert: 31. Jan 2022 06:35
Answers: 0

Re: Langer Tastendruck mit KNX Binäreingang

Beitrag von Norick »

udo1toni hat geschrieben: 25. Feb 2023 12:37
Nochmals zu diesem Thema eine Frage:
Ich wollte nun diesen Code für einen Tastendruck auszuwerten für einen "Switch" verwenden. Geht das so eins zu eins? Ich verwende diese Rule:

Code: Alles auswählen

var Timer tTaste = null

rule "TasterRule_WohnenSchlafen"

when 
    Item Taster_Wohnen_Schlafen_Eingang_Taster_Wohnen_Schlafen_Eingang changed 
then
    tTaste?.cancel
	
	logInfo("Taster WohnenSchlafen", "Tastendruck erkannt")
	
    if(newState == ON) 
	{
        tTaste = createTimer(now.plusNanos(2000000000),[|
            logInfo("Taster WohnenSchlafen", "langer Tastendruck erkannt")
            KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel.sendCommand(ON)
        ])
    } 
	else 
	{
        if(!(tTaste.hasTerminated)) {
            logInfo("Taster WohnenSchlafen", "kurzer Tastendruck erkannt")
            KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel.sendCommand(OFF)
        }
    }
end

Ich kann jedoch nur den langen Tastendruck auswerten auch wenn ich natürlich auch nur kurz drücke. Im Log bekomme ich:

Code: Alles auswählen

 [INFO ] [e.model.script.Taster WohnenSchlafen] - Tastendruck erkannt
 [INFO ] [e.model.script.Taster WohnenSchlafen] - langer Tastendruck erkannt
 [INFO ] [e.model.script.Taster WohnenSchlafen] - Tastendruck erkannt
 [INFO ] [e.model.script.Taster WohnenSchlafen] - Tastendruck erkannt
 [INFO ] [e.model.script.Taster WohnenSchlafen] - langer Tastendruck erkannt

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Langer Tastendruck mit KNX Binäreingang

Beitrag von udo1toni »

Was steht denn drum herum im Log (insbesondere alle(!) Logzeilen im Zusammenhang mit Taster_Wohnen_Schlafen_Eingang_Taster_Wohnen_Schlafen_Eingang (die Itemnamen sind immer noch fürchterlich - erst recht wenn sie in sich doppelt sind)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Norick
Beiträge: 251
Registriert: 31. Jan 2022 06:35
Answers: 0

Re: Langer Tastendruck mit KNX Binäreingang

Beitrag von Norick »

Ja ok der Namen ist doppelt und sieht nicht gerade elegant aus. Ist mir nicht aufgefallen aber kann ich noch ändern.

Nun der lange Tastendruck am Switch wird erkannt aber der kurze nicht der das Licht wieder abschalten sollte. Hier der Log wenn ich zweimal kurz und zweimal lang gedrückt habe:

Code: Alles auswählen

 [INFO ] [e.model.script.Taster WohnenSchlafen] - Tastendruck erkannt
 [INFO ] [e.model.script.Taster WohnenSchlafen] - Tastendruck erkannt
 [INFO ] [e.model.script.Taster WohnenSchlafen] - Tastendruck erkannt
 [INFO ] [e.model.script.Taster WohnenSchlafen] - langer Tastendruck erkannt
 [INFO ] [e.model.script.Taster WohnenSchlafen] - Tastendruck erkannt
Das ist der ganze Log d.h. es gibt sonst keine Einträge (auch nicht in dem Eventlog).

Zur Vollständigkeit nochmals die Rule:

Code: Alles auswählen

var Timer tTaste = null

rule "TasterRule_WohnenSchlafen"

when 
    Item Taster_Wohnen_Schlafen_Eingang_Taster_Wohnen_Schlafen_Eingang changed 
then
    tTaste?.cancel
	
	logInfo("Taster WohnenSchlafen", "Tastendruck erkannt")
	
    if(newState == ON) 
	{
        tTaste = createTimer(now.plusNanos(2000000000),[|
            logInfo("Taster WohnenSchlafen", "langer Tastendruck erkannt")
            KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel.sendCommand(ON)
        ])
    } 
	else 
	{
        if(!(tTaste.hasTerminated)) {
            logInfo("Taster WohnenSchlafen", "kurzer Tastendruck erkannt")
            KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel.sendCommand(OFF)
        }
    }
end
Kann diese Rule den auch einen Switch erkennen oder gilt die Rule nur für Taster?

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Langer Tastendruck mit KNX Binäreingang

Beitrag von udo1toni »

Dann stimmt da was nicht. Kann es sein, dass Du Logging abgeschaltet hast? Standard Verhalten ist, dass jedes changed Ereignis in events.log einen Eintrag erzeugt, das ist zur Fehlersuche auch unerlässlich.
Welche exakte Version von openHAB setzt Du ein? (wäre gut, das in die Signatur zu schreiben...)

Ergänzung:
Ersetze bitte mal

Code: Alles auswählen

if(!(tTaste.hasTerminated)) {
durch

Code: Alles auswählen

if(tTaste.isCancelled) {
das scheint irgendwann geändert worden zu sein...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Norick
Beiträge: 251
Registriert: 31. Jan 2022 06:35
Answers: 0

Re: Langer Tastendruck mit KNX Binäreingang

Beitrag von Norick »

Danke, habe ich angepasst und Eventlogs ist (jetzt) eingeschaltet. Wenn ich zuerst einen langen Tastendruck mache, dann schaltet das Licht ein. Danach habe ich zwei Mal kurz gedrückt - ohne Wirkung. Der Log sieht jetzt so aus:

Code: Alles auswählen

	Zeile 76724: 2024-02-02 19:10:43.470 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel' received command ON
2024-02-02 19:10:43.471 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel' predicted to become ON
2024-02-02 19:10:43.471 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel' updated to ON
2024-02-02 19:10:43.471 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel' changed from OFF to ON
2024-02-02 19:10:43.585 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel' updated to ON
2024-02-02 19:10:51.896 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel' received command ON
2024-02-02 19:10:51.896 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel' predicted to become ON
2024-02-02 19:10:51.897 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'KNX_Device_Aktor_A3_Kuche_Licht_Kochinsel' updated to ON
und die Events:

Code: Alles auswählen

2024-02-02 19:10:41.469 [INFO ] [e.model.script.Taster WohnenSchlafen] - Tastendruck erkannt
2024-02-02 19:10:43.470 [INFO ] [e.model.script.Taster WohnenSchlafen] - langer Tastendruck erkannt
2024-02-02 19:10:45.240 [INFO ] [e.model.script.Taster WohnenSchlafen] - Tastendruck erkannt
2024-02-02 19:10:49.896 [INFO ] [e.model.script.Taster WohnenSchlafen] - Tastendruck erkannt
2024-02-02 19:10:51.896 [INFO ] [e.model.script.Taster WohnenSchlafen] - langer Tastendruck erkannt
2024-02-02 19:10:53.003 [INFO ] [e.model.script.Taster WohnenSchlafen] - Tastendruck erkannt

Kann es sein, dass ich für die kurzen Tastendrücke keinen Event bekomme (received command ON)? Mir scheint diese werden nicht ausgeführt bzw. es erfolgt auch kein Trigger der die Lampe ausschaltet.
:?:

Ich benutze aktuell OH4.1.1 (windows)

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Langer Tastendruck mit KNX Binäreingang

Beitrag von udo1toni »

Das Problem ist eher, dass da kein OFF kommt.
Du musst den Schalter so parametrieren, dass er sowohl beim Drücken als auch beim Loslassen einmal sendet, am besten beim Drücken ein ON und beim Loslassen ein OFF.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Norick
Beiträge: 251
Registriert: 31. Jan 2022 06:35
Answers: 0

Re: Langer Tastendruck mit KNX Binäreingang

Beitrag von Norick »

Da hattest du einmal mehr Recht. Habe in der ETS den Schalter so angepasst und jetzt funktioniert alles!!!

Super, danke!

Antworten