Ankündigung

Einklappen
Keine Ankündigung bisher.

KNX Status aus Variablen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    KNX Status aus Variablen

    Hallo Zusammen,
    ich habe folgendes Problem bezogen auf openHAB2:

    Ich habe meine KNX Schalter und 2 GA für einen Switch und den Status dafür.

    Beide kriege ich eingebunden in Openhab und kann den Switch auch ohne Probleme per Schalter und per openHAB2 sitemap bedienen.
    Jedoch sehe ich den Status nicht sauber in der SItemap davon.

    Nun ist es so, dass ich mit dem Switch einen Urlaubsmodus in openHAB aktivieren will und dort auch den Status in eine zweite GA per Rule schreibe.
    Das Problem ist nun, dass ich den Status nicht in der App angezeigt bekomme, weil ich bei dem KNX item für den Status diese Variable nicht nutzen kann.
    Hinter dem Status steht halt kein Aktor aus dem dies ausgelesen werden kann.

    Habt ihr eine Idee, oder stelle ich mich einfach nur doof an?

    Meine Rule:
    Code:
    [COLOR=#c586c0]rule[/COLOR][COLOR=#ce9178]"Urlaubsmodus ON"[/COLOR]
    [COLOR=#c586c0] when[/COLOR]
    [COLOR=#569cd6]   Item [/COLOR][COLOR=#4ec9b0]Urlaubsmodus[/COLOR][COLOR=#d4d4d4] received command [/COLOR][COLOR=#b5cea8]ON[/COLOR]
    [COLOR=#c586c0] then[/COLOR]
    [COLOR=#4ec9b0]   Urlaubsmodus_stat[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]postUpdate([/COLOR][COLOR=#b5cea8]ON[/COLOR][COLOR=#d4d4d4])[/COLOR]
    [COLOR=#c586c0] end[/COLOR]
    Meine Items:
    Code:
     [COLOR=#569cd6]Switch[/COLOR][COLOR=#4ec9b0]Urlaubsmodus[/COLOR] [COLOR=#ce9178]"Urlaubsmodus" [/COLOR][COLOR=#d4d4d4]{knx[/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#ce9178]"0/1/1"[/COLOR][COLOR=#d4d4d4], autoupdate[/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#ce9178]"false"[/COLOR][COLOR=#d4d4d4]}[/COLOR]
    [COLOR=#569cd6]Switch[/COLOR][COLOR=#4ec9b0] Urlaubsmodus_stat[/COLOR][COLOR=#ce9178]"Urlaubsmodus Status" [/COLOR][COLOR=#d4d4d4]{knx[/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#ce9178]"0/1/2"[/COLOR][COLOR=#d4d4d4], autoupdate[/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#ce9178]"false"[/COLOR][COLOR=#d4d4d4]}[/COLOR]
    Dies funktioniert schonmal nicht, da keiner auf die Afrage von 0/1/2 antwortet da dies nur in OpenHab ist und kein Aktor dafür vorhanden ist:
    Code:
    [COLOR=#569cd6]Switch [/COLOR][COLOR=#4ec9b0]Urlaubsmodus[/COLOR][COLOR=#ce9178]"Urlaubsmodus"[/COLOR][COLOR=#d4d4d4] {knx[/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#ce9178]"0/1/1+<0/1/2"[/COLOR][COLOR=#d4d4d4], autoupdate[/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#ce9178]"false"[/COLOR][COLOR=#d4d4d4]}[/COLOR]
    Dies funktioniert schonmal auch nicht wegen Syntaxfehler:
    Code:
    [COLOR=#569cd6]Switch[/COLOR] [COLOR=#4ec9b0]Urlaubsmodus[/COLOR][COLOR=#ce9178] "Urlaubsmodus"[/COLOR][COLOR=#d4d4d4] {knx[/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#ce9178]"0/1/1+<[/COLOR][COLOR=#4ec9b0]Urlaubsmodus_stat[/COLOR][COLOR=#ce9178]"[/COLOR][COLOR=#d4d4d4], autoupdate[/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#ce9178]"false"[/COLOR][COLOR=#d4d4d4]}[/COLOR]
    Jemand eine Idee wie das funktionieren kann?

    Vielen Dank.

    Gruß
    Paulus
    Zuletzt geändert von Paulus; 08.06.2018, 19:15.

    #2
    Wenn ich es richtig verstehe, möchtest Du mit einem Taster an der Wand den Urlaubsmodus ein- und ausschalten. Dabei hast Du (außer dem Taster) keine echte Hardware. Du möchtest eine echte Rückmeldung haben.

    Die einfachste Variante wäre wohl
    Code:
    Switch Urlaubsmodus "Urlaubsmodus [%s]" {knx="0/1/2+0/1/1", autoupdate="true"}
    was letztlich bedeutet, dass über 0/1/1 nur Befehle empfangen werden, während über 0/1/2 Befehle (als Statusmeldung) auch gesendet werden.
    Wenn Du openHAB1 einsetzt, brauchst Du noch eine Regel:
    Code:
    rule Urlaubsmodus
    when
        Item Urlaubsmodus changed
    then
        Urlaubsmodus.sendCommand(Urlaubsmodus.state)
    end
    Die Rule triggert nur bei Änderung, so dass es nicht zu einer Schleife kommt.
    In openHAB2 mit dem knx1 Binding ist die Rule vermutlich unnötig, da openHAB ohnehin so ziemlich alles als Echo nochmal auf den Bus sendet (eventuell... das ist ein Fehler, der aber nicht bei allen auftritt)
    Ansonsten könntest Du auch das knx2 Binding verwenden, dort gibt es sogenannte Control-Channel, die genau das abdecken: openHAB übernimmt die Rolle des Aktors und sendet auch den Status aktiv an den Bus.

    In beiden Fällen musst Du das Item persistieren und mit restoreOnStartup wiederherstellen lassen, da der Status ja nicht vom Bus kommen kann. Wichtig ist vor allem, dass die Gruppenadresse, auf der openHAB senden soll (also der Status) als erstes eingetragen wird.

    Es gibt übrigens noch eine weitere Lösung, ohne Aktor auszukommen. Du kannst den Schalter so konfigurieren, dass er auf Read Requests antwortet (das L-Flag setzen). Wichtig ist nur, dass es pro GA nur maximal ein Device gibt, welches Read Requests beantwortet.

    Kommentar


      #3
      Vielen Dank, das ist der wichtigste Teil der Lösung, da es grundlegend funktioniert!!

      Einziges Problem, aber da muss ich noch bisschen probieren:
      Wenn ich über die openHAB APP den Modus aktiviere funktioniert es ohne Probleme und der Status wird auch sauber auf dem Schalter angezeigt (LED mit GA 0/1/2 geht an.)
      Wenn ich dies jedoch über den Schalter direkt auslöse, da scheint der Status nicht im Schalter anzukommen, da die LED nicht angeht.

      bzgl. dem persistieren:
      Das ist für mich Neuland und habe mir das mal in der Docu (https://docs.openhab.org/configuration/persistence.html) angeschaut...
      Werde da nicht direkt schlau draus, aber stimmen meine Annahmen:
      - die zu persisiteirenden Items müssen eine Strategie mit den [ ] - Klammern zugewiesen bekommen in der *items Datei.
      - Ich muss eine strategie festlegen. (Kommt das auch in die *.Items Datei?
      oder kommt das woanders hin?

      Oder reicht in meinem Fall in der *.items Datei das folgende Beispiel wobei das * durch mein Item zu ersetzen wäre? Sprich so:
      Code:
      Strategies {
      default = everyUpdate
      }
      
      Items {
      [COLOR=#4ec9b0]Urlaubsmodus[/COLOR] : strategy = everyChange, restoreOnStartup
      }
      Hättest du vielleicht ein einfaches Beispiel für mich? Muss ich mir ein in der Docu erwähntes *.sh script anlegen dafür?


      p.s.: Ich nutze openHAB2, somit würde die von dir genannte Zusatzregel ja entfallen.

      Kommentar


        #4
        Die Persistence wird nicht der *.items Datei definiert, sondern in einer Datei *.persist (die im Ordner ./persistence/ liegt). Du nimmst z.B. mapdb als Persistence, das eignet sich hervorragend für restoreOnStartup. Dann sind die einzelnen Schritte:
        1. mapdb Peristence installieren.
        2. ./persistence/mapdb.persist anlegen und mit dem Code aus Deinem Posting füllen
        Fortan schreibt die mapdb Persistence bei jeder Statusänderung von Urlaubsmodus (=everyChange) den Status in seine Datenbank. Wenn openHAB startet, wird der Status des Items wieder hergestellt (=restoreOnStartup)

        Die *.persist Dateien werden einmal pro Persistence Service angelegt und haben den gleichen Aufbau. Der Dateiname gibt Auskunft darüber, welcher Service genutzt wird. Man kann also dasselbe Item mit verschiedenen Services persistieren, man kann dabei auch verschiedene Strategien verwenden.

        Da der Status nicht korrekt auf dem Taster rückgemeldet wird, musst Du vermutlich doch die Rule mit dazu nehmen, wie erwähnt kann es Echos geben, muss aber nicht.

        Kommentar

        Lädt...
        X