Fensterkontakt Eltako FFG7B Status gekippt

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
dasc4711
Beiträge: 5
Registriert: 21. Nov 2022 23:14
Answers: 0

Fensterkontakt Eltako FFG7B Status gekippt

Beitrag von dasc4711 »

Hallo Zusammen,
ich bin schon seit einiger Zeit treuer "Mitleser", konnte nun aber keine Antowort zu meinem Problem finden.

Ich habe zushause ein KNX-Netzwerk und möchte nun Fensterkontakte so einbetten, dass ich darauf meine Heizung in den Räumen verändern kann.
Leider scheiter ich schon an der Erkennung "gekippt", "offen" "geschlossen"

Ich habe ein EnOcean KNX 626 Gateway - Daran habe ich meine Fenstserkontakte von Eltako (FFG7B) dran. Diese sind auf 4BS - Gerätetyp A5-14-09 offen/geschlossen/gekippt.

Nun senden die Fensterkontakte mit dem Datentyp 1.002 Boolesch auf 2 Kanälen jeweils true/false

Ich bekomme folgende Werte
bei geöffnetem Fenster Kanal 1 = 1 Kanal 2 = 1
bei gekipptem Fenster Kanal 1 = 1 Kanal 2 = 0
bei geschlossenem Fenster Kanal 1 = 0 Kanal 2 = 0

Somit muss ich quasi 2 Gruppenadressen auswerten und und daraus erkennen, wann ein Fenster welchen Zusatand hat. Grundsätzlich könnte ich das auch machen, aber ich habe dann ja 2 Objekte (Fenster Offen/geschlossen, egal ob gekippt oder ganz offen - und Fenster gekippt, Ja/Nein)

Aktuell habe ich für beide Zustände je ein Channel als Contact und je einem Item angelegt - das ist nicht sonderlich cool :-)

Bevor ich den Zustand nicht habe, kann ich ja auch nicht meinen Sollwert der Heizung zielsicher beinflussen - Besten Dank schon mal und ich hoffe, ich habe es einigermaßen verständlich formuliert :-)

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

Re: Fensterkontakt Eltako FFG7B Status gekippt

Beitrag von udo1toni »

Nun ja, für die Heizung ist nur interessant, ob Kanal 1 1 oder 0 ist (das dürfte auch der Grund sein, warum die Kanäle so definiert sind... Kanal 1 gibt Auskunft ob offen oder geschlossen, Kanal 2 gibt an, ob gekippt oder vollständig offen., für die Heizungsfrage musst Du aber nur Kanal 1 auswerten.

Solange Du nicht mehrere Fenster in einem Raum auswerten musst, müsste das also komplett in knx gehen, denn normale RTR werten eine 1 am Fenster-Kommunikationsobjekt als offen und schalten sofort auf Frostschutz.

Ansonsten kannst Du das natürlich auch getrennt in openHAB einsammeln, auswerten und ein extra Item für die Steuerung übertragen, aber ja, das scheint nicht sehr elegant. Nur steht die Information ja nur über die zwei GA zur Verfügung, es sei denn, Du nutzt zusätzlich noch ein weiteres EnOcean Gateway, wo Du die Daten direkt und ohne Umweg über knx einsammeln kannst...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

dasc4711
Beiträge: 5
Registriert: 21. Nov 2022 23:14
Answers: 0

Re: Fensterkontakt Eltako FFG7B Status gekippt

Beitrag von dasc4711 »

OK - das stimmt!
dann konkretisiere ich meine Frage etwas - Ich möchte im OpenHab natürlich den Status des Fensters sehen.
Aktuell versuche ich mich an ein paar Regeln, die den Status auswerten und in einen String schreiben. Dieser soll dann 3 Status haben und wiederrum in der Sitemap alles anzeigen - Schon eine Lösung, aber ich dachte, dass ich direkt 2 Werte miteinander auswerten kann...

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

Re: Fensterkontakt Eltako FFG7B Status gekippt

Beitrag von udo1toni »

Ja, in openHAB musst Du leider damit leben, dass die Daten über zwei Channel im System landen. Zum verarbeiten der beiden Channel zu einem Item brauchst Du leider zwei weitere Items. Einziger Trost: Wenn Du mehrere solche Kontaktpaare hast, kannst Du die Umsetzung recht einfach über eine einzige Rule umsetzen, dafür müssen die Items halt einer Namenskonvention entsprechen.
Nehmen wir an, die Kontakt-Items heißen FensterX_y. Alle Items, die zu einem Fenster gehören, haben den identischen Namensteil FensterX_ Y wiederum ist identisch für alle Kanäle 1, für alle Kanäle 2 und für die Items, in denen der gesamte Fensterstatus ausgegeben wird.

Nehmen wir als Schlüsselworte open (Kanal1), ajar (Kanal2) und display (String Item, welches in openHAB angezeigt wird)

Wir benötigen noch ein Group Item gFensterkontakte, in der alle Items enthalten sind. Nun noch eine Regel:

Code: Alles auswählen

rule "Fensterkontakte auswerten"
when
    Member of gFensterkontakte changed
then
    if(triggeringItem.name.split("_").get(1) == "display")                           // rule wurde durch sich selbst getriggert, Abbruch
        return;
    val strFenster = triggeringItem.name.split("_").get(0)                           // Welches Fenster war es?
    val itemGroup = gFensterkontakte.members.filter[i|i.name.startsWith(strFenster)] // filtere alle zugehörigen Items aus der Liste
    val itemOpen = itemGroup.filter[i|i.name.endsWith("open")].head                  // Das Item von Kanal 1
    val itemAjar = itemGroup.filter[i|i.name.endsWith("ajar")].head                  // Das Item von Kanal 2
    val itemDisp = itemGroup.filter[i|i.name.endsWith("display")].head               // Das Item welches die Zustände kombiniert
    var strText = "CLOSED"                                                           // Default ist der Zustand zu
    if(itemOpen.state == OPEN) {                                                     // Falls geöffnet
        if(itemAjar.state == OPEN)                                                   // Fenster komplett offen?
            strText = "OPEN"                                                         // Ändere Zustand auf offen
        else                                                                         // ansonsten
            strText = "AJAR"                                                         // Ändere Zustand auf gekippt
    }
    itemDisp.postUpdate(strText)                                                     // schreibe neuen Zustand ins Item
end
String Item, weil Du dann als Icon "window" setzen kannst und das Aussehen automatisch die drei Zustände anzeigen sollte.
Es ist egal, wie viele Fensterkontakte es sind, Du brauchst nur eine Gruppe und eine Rule für alle, solange die Namenskonvention eingehalten wird. (Die ist im übrigen willkürlich, die Rule muss nur entsprechend programmiert sein).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

dasc4711
Beiträge: 5
Registriert: 21. Nov 2022 23:14
Answers: 0

Re: Fensterkontakt Eltako FFG7B Status gekippt

Beitrag von dasc4711 »

Sorry für die späte Antwort - Mit Kids und Job ist es für mich aktuell nicht einfach, täglich an dem "Projekt" zu arbeiten :-)

Ich verstehe zwar die Regel und muss sagen, echt gute Idee - Aber wie bekomme ich die in eine Regel verpackt? Wenn ich über die GUI eine Regel anlegen möchte, und dann auf "code" gehe, sieht das ganz anders aus - Wenn ich deinen Code dort hinterlege und speichere, tut sich garnichts ...
Binde ich die Condition, erscheint diese im Code ebenfalls ganz anders formatiert - Sorry für die blöde Frage - OpenHab bin ich noch nicht richtig drin, grob scripte lesen und verstehen bzw. If / Else bzw. allgemein Schleifen usw. verstehe ich schon :-)

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

Re: Fensterkontakt Eltako FFG7B Status gekippt

Beitrag von udo1toni »

Wenn Du das über die GUI machen willst, ist das kein Problem.

Name der Rule wie es beliebt, ich habe sie Fensterkontakte auswerten genannt, das wäre das Label in der GUI. Als UID solltest Du auch etwas sinnvolleres als eine wilde Zahlen-Buchstabenkombination setzen, falls es mal zu Fehlermeldungen kommt, dient die UID als Anhaltspunkt.

Der when- Teil beschreibt exakt das, was auch in der GUI als when Teil angegeben wird. Es handelt sich um ein Item Event. Du wählst das passende Item aus (ein Group Item) und klickst auf Pick. Anschließend wählst Du "had a member change" (Member of ... changed)
Der Teil zwischen then und end (das heißt: ohne diese beiden Schlüsselworte) ist der auszuführende Code.
Es handelt sich dabei um DSL Code. Das heißt, Du musst als Action Run Script -> Rule DSL auswählen. Im Anschluss öffnet sich ein Code-Fenster, in das Du den Code einfügst.
Da der Gruppenname in der Rule selbst verwendet wird, muss das passen. Sollte Deine Gruppe also anders heißen als gFensterkontakte, so musst Du innerhalb des Rule Codes exakt diesen Namen mit dem "richtigen" Group Item Namen ersetzen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

dasc4711
Beiträge: 5
Registriert: 21. Nov 2022 23:14
Answers: 0

Re: Fensterkontakt Eltako FFG7B Status gekippt

Beitrag von dasc4711 »

OK - Funktioniert irgendwie nicht ...
Ich habe 1 Thing - Das heißt "Fensterstatus"
Dann habe ich mehrere Channels FensterBad_open; FensterBad_ajar
Dazu habe ich jeweils 1 Item mit den selben Namen (jeweils Typ Contract)
Ein weiteres Item mit dem Namen FensterBad_display als Sting

Die Item sind alle in der Gruppe alle_Fensterkontakte

Mein Scipt habe ich entpstrechend angepasst

if(triggeringItem.name.split("_").get(1) == "display") // rule wurde durch sich selbst getriggert, Abbruch
return;
val strFenster = triggeringItem.name.split("_").get(0) // Welches Fenster war es?
val itemGroup = alle_Fensterkontakte.members.filter[i|i.name.startsWith(strFenster)] // filtere alle zugehörigen Items aus der Liste
val itemOpen = itemGroup.filter[i|i.name.endsWith("open")].head // Das Item von Kanal 1
val itemAjar = itemGroup.filter[i|i.name.endsWith("ajar")].head // Das Item von Kanal 2
val itemDisp = itemGroup.filter[i|i.name.endsWith("display")].head // Das Item welches die Zustände kombiniert
var strText = "CLOSED" // Default ist der Zustand zu
if(itemOpen.state == OPEN) { // Falls geöffnet
if(itemAjar.state == OPEN) // Fenster komplett offen?
strText = "OPEN" // Ändere Zustand auf offen
else // ansonsten
strText = "AJAR" // Ändere Zustand auf gekippt
}
itemDisp.postUpdate(strText) // schreibe neuen Zustand ins Item


Der Status wird in das Display-Objekt leider nicht geschrieben

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

Re: Fensterkontakt Eltako FFG7B Status gekippt

Beitrag von udo1toni »

Also, ich habe das gerade hier mal im Testsystem nachvollzogen... funktioniert einwandfrei...

Hier mal die Code-Ansicht:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      groupName: gFensterkontakte
    type: core.GroupStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-
        if(triggeringItem.name.split("_").get(1) ==
        "display")                           // rule wurde durch sich selbst
        getriggert, Abbruch
            return;
        val strFenster = triggeringItem.name.split("_").get(0)                           // Welches Fenster war es?
        val itemGroup = gFensterkontakte.members.filter[i|i.name.startsWith(strFenster)] // filtere alle zugehörigen Items aus der Liste
        val itemOpen = itemGroup.filter[i|i.name.endsWith("open")].head                  // Das Item von Kanal 1
        val itemAjar = itemGroup.filter[i|i.name.endsWith("ajar")].head                  // Das Item von Kanal 2
        val itemDisp = itemGroup.filter[i|i.name.endsWith("display")].head               // Das Item welches die Zustände kombiniert
        var strText = "CLOSED"                                                           // Default ist der Zustand zu
        if(itemOpen.state == OPEN) {                                                     // Falls geöffnet
            if(itemAjar.state == OPEN)                                                   // Fenster komplett offen?
                strText = "AJAR"                                                         // Ändere Zustand auf offen
            else                                                                         // ansonsten
                strText = "OPEN"                                                         // Ändere Zustand auf gekippt
        }
        itemDisp.postUpdate(strText)                                                     // schreibe neuen Zustand ins Item
    type: script.ScriptAction
Ich habe lediglich die Strings ausgetauscht, in der Annahme, dass bei Ajar beide Kontakte OPEN melden, aber das ist ja nur eine Frage der Definition...)

EDIT:
Ach so... was tatsächlich NICHT funktioniert, ist das Fenstersymbol auf gekippt. Da scheint es einen Bug zu geben, denn das hat definitiv mal exakt so funktioniert und es gibt auch diverse Anleitungen im englischen Forum, die es genau so beschreiben.

EDIT2: Aber auf einer Label Card funktioniert auch das Icon korrekt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

dasc4711
Beiträge: 5
Registriert: 21. Nov 2022 23:14
Answers: 0

Re: Fensterkontakt Eltako FFG7B Status gekippt

Beitrag von dasc4711 »

Funktioniert bei mir leider immer noch nicht

2022-11-29 21:10:53.094 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'fensterkontakte_auswerten' failed: cannot invoke method public abstract java.lang.String org.openhab.core.items.Item.getName() on null

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

Re: Fensterkontakt Eltako FFG7B Status gekippt

Beitrag von udo1toni »

Der Fehler bedeutet, dass an einer Stelle, an der der Name eines Items ermittelt werden soll, kein Item vorhanden ist.
Die Rule wird auch durch den korrekten Trigger ausgelöst? Siehe Codeblock, das ist die komplette Rule, wenn man sie über die UI erstellt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten