Ankündigung

Einklappen
Keine Ankündigung bisher.

Makros in OpenHAB? oder Templates / Generics?

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

    Makros in OpenHAB? oder Templates / Generics?

    Hallo,

    für die items und vor allem für die rules in OpenHAB hätte ich am liebsten eine Art Makro- oder Template-Funktion. Gibt es da etwas?


    Hintergrund: Ich habe viele Items, die gleichartig sind, sich nur in einzelnen Eigenschaften (z.B. Name oder Gruppenzugehörigkeit) unterscheiden. Man denke z.B. an Jalousien, Temperatursensoren oder Fensterkontakte.

    Wenn ich jetzt für solche Objekte rules baue, muss ich das immer mehrfach tun (Copy & Paste).

    Beispiel: Bei mir hat jedes Fenster zwei Kontakte: offen + gekippt. Über eine rule setze ich jetzt eine dritte Number-Variable, die den Gesamtzustand darstellt (0=geschlossen, 1=gekippt, 2=offen). Die Rule habe ich nun etliche Male in der rules-Datei stehen -- jeweils nur mit geänderten Item-Namen.

    Wenn ich so eine Rule ändern möchte, artet das in einer aufwendigen Suchen-Ersetzen-Aktion aus.

    Was ich also suche: eine -- möglichst in OpenHAB eingebaute -- Funktionalität, mit der ich z.B. ein rule-Template mit Platzhaltern definieren und dieses Template dann via kurzem Aufruf verwenden könnte.

    Auf openhab.org habe ich dazu bisher nichts entdecken können.
    Ich möchte aber lieber mal hier nachfragen, bevor ich über einen externen Makroprozessor (M4 o.ä.) nachdenke.

    Stefan

    #2
    Hallo Stefan,

    suchst Du so etwas wie die Lambda-Expressions? Die Statements der Art
    Code:
    val org.eclipse.xtext.xbase.lib.Functions$Function2 someLogic = [
    sehen zwar etwas gruselig aus, aber es funktioniert zumindest. Martin

    Kommentar


      #3
      Ok. Das ist ja schon mal eine Lösung für den Rule-body. Danke für den Tipp.

      Kommentar


        #4
        Also ich habe mit m4 durchaus gute Erfahrungen gemacht.
        Ich bin noch nicht komplett fertig damit, mein items-File damit zu de-duplizieren und alle beim bisherigen Copy&Paste eingeflossenen Tippfehler konsistent zu beseitigen, aber die 9 Rolladenaktoren sind jetzt schon schön konsistent (inklusive RSSI-Werten und Unreachable-Flag), ebenso die 7 Wandthermostate (inkl. RSSI, Low-Bat, Unreachable, und Batteriespannung).
        Weitere Zusammenfassungen werden in den Items noch folgen.

        Für die Sitemap plane ich ähnliches, hatte aber noch keine Zeit, aber dort gibt's natürlich auch ganz viel Potential, z.B. für die Charts, die man zwischen Tag, Woche und Monat umschalten kann, momentan ist das nur kopierter Code, das kann auch m4 machen und die Source-Datei bleibt übersichtlicher.

        Ein Kollege hat m4 sogar schon für die rules im Einsatz. Das ist deutlich lesbarer als die Lambda-Ausdrücke und hat wohl auch einige Probleme mit letzteren umgangen.
        Auch den Bug, dass manchmal nicht alle rules-Files eingelesen werden, kann man damit umgehen, indem man zwar mehrere m4-Files nutzt, aber daraus per make am Ende ein einzelnes rules-File generiert.

        Einziger Nachteil von m4 ist, dass man die m4-Source-Files nicht mit dem Designer editieren kann, der sieht die Macros als Syntaxfehler an. Da ich mit dem aber ohnehin nicht wirklich warm werde und ihn meist nur im Nachgang als Syntax-Checker über meine Files jage, ist das für mich nicht so relevant.

        Kommentar


          #5
          @RoRo: klingt interessant, was Du da beschreibst, nur sagt mir das nix. Bei Goolge finde ich unter m4 ein Maschinengewehr oder den BMW
          Kannst Du bitte genauer erklären, was Du da treibst? Ist das, was Du beschreibst für einen Normalsterblichen machbar oder bedarf es dazu Hacker-Qualitäten?
          Meine Rule-Files sind mittlerweile auch so lang, dass ein Arbeiten mit dem Designer zur Katastrophe wird. Außerdem werden meine rules-Files auch sporadisch nicht geladen. Insofern wäre ich an einer Code-Konsolidierung sehr interessiert.

          Viele Grüße
          Michael

          Kommentar


            #6
            @staehler:
            https://de.wikipedia.org/wiki/Makrop...r_als_Beispiel
            Hier solltest du einen guten Startpunkt haben.

            Kommentar


              #7
              Hallo zusammen,

              habe das jetzt bei mir auch auf den Makroprozessor m4 umgestellt.

              Für die Lambda-Variante sprach zwar, dass es kein separates Prozessing braucht und dass es ein eingebautes Sprachfeature ist (z.B. Editor).

              Für m4 spricht aber, dass es für alles funktioniert, also auch für items, die gesamte rule-Definition und alle sonstigen Dateien (sitemaps...)
              Außerdem hat man dann (zwangsweise) einen Präprozessor-Output, der dann wieder einfach zu lesen ist. Notfalls kann man den dann direkt editieren (z.B. Fix durch Dritte).

              Schließlich hatte ich ohnehin schon ein kleines Skript auf dem pi, auf dem OpenHAB läuft, was die Konfiguration aus einem git repo pullt. Da war m4 schnell integriert. Ich checke den Output (z.B. die generierte default.items) direkt im Skript ein, kann das dann also auf dem PC dann wiederum gegenchecken (OpenHAB Designer).

              Viele Grüße
              Stefan

              Kommentar


                #8
                Hier mal ein Beispiel für meine Rollläden mit m4:

                Code:
                divert(-1)
                # $1 = variablen-Name   $2 = Real-Name   $3 = Homematic-S/N   $4 = Gruppe
                define(`Rollladen',
                `Rollershutter RS_$1 "RS $2 [%d%%]" ($4, Rollaeden) { homematic="address=$3,channel=1,parameter=LEVEL" }
                Number RS_$1_Unreach "RS $2 unerreichbar [%d]" (Unreached) {homematic="address=$3, channel=0, parameter=UNREACH"}
                Number RS_$1_RSSI_Device   "RS $2 RSSI device [%d dbm]" ($4, RRD, RSSI)  {homematic="address=$3, channel=0, parameter=RSSI_DEVICE"}
                Number RS_$1_RSSI_Peer     "RS $2 RSSI peer [%d dbm]" ($4, RRD, RSSI)    {homematic="address=$3, channel=0, parameter=RSSI_PEER"}
                ')
                divert(0)dnl
                dnl
                
                Rollladen(`Wohnzimmer', `Wohnzimmer', `LEQXXXXXXX', `EG_Wohnzimmer')
                Rollladen(`Esszimmer', `Esszimmer', `LEQYYYYYYY', `EG_Wohnzimmer')
                Bzgl. der Variablen gibt's sicher noch Verbesserungsbedarf und Vereinfachungsmöglichkeiten, aber ich wollte erstmal den Ist-Bestand übernehmen...

                Dabei verwende ich GNU M4, siehe http://www.gnu.org/software/m4/m4.html
                Oder als Tutorial http://mbreen.com/m4.html

                Kommentar


                  #9
                  Hallo,

                  habe jetzt noch ein kleines Problem. Ich bekomme gelegentlich einen Fehler beim Laden einzelner Dateien, obwohl sie existieren:

                  Code:
                  2015-07-10 14:17:03.360 [INFO ] [c.internal.ModelRepositoryImpl] - Loading model 'm4out_abwesenheit.rules'
                  2015-07-10 14:17:03.402 [INFO ] [c.internal.ModelRepositoryImpl] - Loading model 'm4out_quadra.rules'
                  2015-07-10 14:17:03.406 [ERROR] [r.i.DefaultResourceDescription] - m4out_abwesenheit.rules (No such file or directory)
                  java.io.FileNotFoundException: m4out_abwesenheit.rules (No such file or directory)
                          at java.io.FileInputStream.open(Native Method) ~[na:1.8.0]
                          at java.io.FileInputStream.<init>(FileInputStream.java:131) ~[na:1.8.0]
                          at org.eclipse.emf.ecore.resource.impl.FileURIHandlerImpl.createInputStream(FileURIHandlerImpl.java:99) ~[org.eclipse.emf.ecore_2.8.3.v20130125-0546.
                  jar:na]
                          at org.eclipse.emf.ecore.resource.impl.ExtensibleURIConverterImpl.createInputStream(ExtensibleURIConverterImpl.java:354) ~[org.eclipse.emf.ecore_2.8.
                  Dabei habe ich mein Skript, dass den m4-Output (m4out_*) erzeugt, bereits so gebaut, dass es den Output erst in einem temporären Verzeichnis komplett zusammenbaut und dann mit
                  Code:
                  rsync -v -W -d -c --delete-after --filter='-! m4out_*' items.tmp/ items/
                  alle m4out-Dateien ins produktive Verzeichnis spiegelt. Die Optionen sorgen dafür, dass nur m4out-Dateien angefasst werden und von denen nur solche, die sich wirklich geändert haben (Prüfung über Checksumme via Schalter -c).

                  Am Dateidatum und an den Ausgaben des Skripts sehe ich, dass die Datei m4out_abwesenheit.rules seit 2 Stunden unverändert ist. Trotzdem gibt es (gelegentlich) Ladefehler (No such file or directory). Unklar ist mir dabei, ob OpenHAB die Datei dann später vielleicht korrekt laden würde (neuer Versuch?).

                  Edit: Irgendwie klappt das Anhängen meiner Skripte hier nicht. Werde das nachreichen.

                  Viele Grüße
                  Stefan
                  Angehängte Dateien
                  Zuletzt geändert von stb; 10.07.2015, 13:47.

                  Kommentar


                    #10
                    Zitat von stb Beitrag anzeigen
                    habe jetzt noch ein kleines Problem. Ich bekomme gelegentlich einen Fehler beim Laden einzelner Dateien, obwohl sie existieren:
                    Das klingt mir sehr nach dem unter https://github.com/openhab/openhab/issues/736 dokumentierten Fehler, dass bei mehreren rules-Files manche manchmal nicht geladen werden. Als Workaround soll man die betroffenen Files so lange touchen, bis sie dann doch irgendwann geladen werden :-(
                    Der Fehler besteht seit Anfang 2014 und wurde meines Wissens noch nicht gefixt.

                    Tschoeeee
                    Roland

                    Kommentar

                    Lädt...
                    X