Ankündigung

Einklappen
Keine Ankündigung bisher.

Generisches $plugin_subscribe möglich?

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] Generisches $plugin_subscribe möglich?

    Hi,

    gibt es eine möglichkeit, ein plugin über einen generischen Ausdruck, z.B. durch ein regulären Ausdruck, auf Gruppenadressen zu registrieren?

    Ich muss für alle GA 1/x/y den knx_read über einen Algorithmus ausführen, hab bisher alle GA's einzeln aufgeführt, aber nach 25 Stück hab ich keine Lusst mehr - vor allem, weil immer wieder welche dazukommen...

    Danke und Gruß,
    Waldemar
    OpenKNX www.openknx.de

    #2
    So ohne weiteres geht das nicht. Aber im DMX-Plugin steht sowas

    Code:
    for (my $i=0; $i<$dmx_channels;$i++) {
      $plugin_subscribe{$knx_startGA}{$plugname} = 1;
      $knx_startGA = addr2str(str2addr($knx_startGA)+1,1);
    }
    Vielleicht kannst du ja alles was in Frage kommt durchlaufen und auf $knx_startGA dein Regexp loslassen, bevor Du $plugin_subscribe aufrufst.

    Gruss,

    der Jan
    KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

    Kommentar


      #3
      So direkt nicht, ich hielte das auch für schwer erklärbar; Ziel ist ja nicht das man zum schreiben von Plugins die seltsame Welt von RE verstehen muss

      Aber machen kann man alles, mal so in einfach:

      Code:
      my $startga= '1/0/0'; # start-ga
      my $numgas = 8*256; # 12/0/0 - 12/7/255
      $plugin_info{$plugname.'_cycle'} = 0; # zyklischer aufruf nur zum init
      
      # ENDE Definitionen
      
      # die arbeit..
      if (%msg) { # telegramm vom KNX auf subscribte GAs
          # was damit tun
          #....
      } else { #subscribe to GA's
          # etwas ausfuehrlich und wenig verschachtelt geschrieben
          my $startga_num = str2addr($startga);
          for (my $i = 0; $i <= $numgas; $i++) {
            my $subscribe_ga = addr2str($startga_num + $i,1); # aus der zahl wieder a/b/c machen
            $plugin_subscribe{$subscribe_ga}{$plugname} = 1;
          }
      }
      Ebenso ist das natürlich für andere Anwendungsfälle - so oder so ähnlich möglich..
      Aber merke: komplexer, (in 2J) evtl. unverständlicher Code, wo man immer Klammern und, Punkte usw. zählen muss ist nicht immer hilfreich; ich stehe mehr auf einfach und leserlich; komplexe RE für einfache Aufgaben halte ich eher für kontraproduktiv (ausser es geht um Geschwindigkeit und/oder man arbeitet täglich damit..)

      Makki
      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
      -> Bitte KEINE PNs!

      Kommentar


        #4
        Super, danke!

        Werde ich gleich ausprobieren!

        Gruß, Waldemar
        OpenKNX www.openknx.de

        Kommentar


          #5
          Hallo zusammen,

          ganz unverbindlich möchte ich hier mal für meinen Ansatz werben, der sich bei mir bereits bewährt hat:

          Alle GAs sind mit Namen und DPTs korrekt in /etc/wiregate/eibga.conf eingepflegt. Die GA-Namen enthalten als erstes Wort ein eindeutiges Kürzel, das die Funktion codiert (zB "TA_TE3 Aussentemperatur Terrasse DG"). Für diese Kürzel existiert ein konsequent durchgezogendes Namensschema aller GAs. Bei mir zB:

          Code:
          TA = Aussentemperaturen 
          TL = Lufttemperaturen innen (TL_WZ = Lufttemperatur Wohnzimmer)
          TE = Estrichtemperaturen
          TO = sonstige Temperaturen (Heizungsrohr, Kamin, ...)
          
          LI = Beleuchtung schalten (LI_WF = Licht im Windfang schalten)
          LD = Beleuchtung dimmen
          LK = Konstantlichtwerte eingehen
          
          HI = Helligkeit innen (zB HI_K1 = Helligkeit Kinderzimmer 1 vom Präsenzmelder gemessen)
          HA = Helligkeit aussen (zB HA_Nord = kommt aus der Quadra)
          
          JA = Jalousie auf/ab (zB JA_WZ_Ost: Jalousie im Wohnzimmer-Ostfenster auf/ab) 
          JS = Jalousie stop/fein
          JP = Jalousie positionieren
          JW = Jalousie anwinkeln
          
          .... und so weiter
          Die GAs mit Namen und Nummern, DPTSubIds usw. erzeuge ich übrigens in einer Exceltabelle, die einmal in den Wiregate exportiert wird (per Copy&Paste und einem Perl-Einzeiler zur Formatierung) und andererseits in die ETS (per Abspeichern als CSV und dort Importieren).

          In jeder Hinsicht ist die GA-Editierung übrigens DEUTLICH komfortabler im Wiregate (wo man die Wahl hat zwischen Web-Interface und Kommandozeile/Texteditor mit Suchen/Ersetzen usw) als in der ETS4 (wo man diese Wahl nicht hat, außerdem das Interface deutlich Windows-Nonstandard ist, man denke nur an die komische Art, wie man neue Fenster aufmacht oder den Inhalt von Fenstern beeinflusst, ich könnte hier noch ewig weitermaulen: was für ein Sch...stück Software für diesen Schw... preis).

          Aber zurück zum Thema.

          Das vergebene NUMMERNschema für die GAs mag in der ETS helfen (die konfrontiert einen ja gnadenlos mit den nackten Zahlen), im Wiregate-Plugin habe ich allerdings den Komfort, auf die Namenskürzel zugreifen zu können. Und zwar mit folgendem Ansatz:

          %eibgaconf wird auch nach diesen Kürzeln indiziert - aktuell enthält jedes Plugin am Anfang die Sequenz

          Code:
          # eibgaconf auch invers indizieren falls nicht bereits komplett indiziert
          unless(exists $eibgaconf{ZV_Uhrzeit})
          {
              plugin_log($plugname, "fixing \%eibgaconf");
          
              # alle GAs durchlaufen
              for my $ga (grep /^[0-9\/]+$/, keys %eibgaconf)
              {
                  # eibgaconf auch nach Namen indizieren
                  $eibgaconf{$ga}{ga}=$ga;
                  my $name=$eibgaconf{$ga}{name};
                  next unless defined $name;
                  $eibgaconf{$name}=$eibgaconf{$ga};
          
                  # Jetzt auch noch nach Namenskuerzeln indizieren
                  next unless $name=~/^\s*(\S+)/;
                  my $short=$1;
                  $short='ZV_'.$1 if $eibgaconf{$ga}{name}=~/^Zeitversand.*(Uhrzeit|Datum)/;
          
                  $eibgaconf{$ga}{short}=$short;
                  $eibgaconf{$short}=$eibgaconf{$ga};
              }
          }
          Drei Kommentare hierzu:

          (i) eigentlich ist es nicht Aufgabe von Plugins, den %eibgaconf zu modizifieren (wobei das aktuell gefahrlos geht, beim Neustart des wiregated.pl ist allerdings wieder der alte %eibgaconf da). Es wäre aber wesentlich besser, wiregated.pl würde den %eibgaconf bereits in dieser Form bereitstellen - ein entsprechender Vorschlag liegt Makki vor, der aber laut Stefan durch die aktuelle PL30/31-Diskussion "unter Wasser" ist... also Geduld.

          (ii) der obige Code "beschädigt" nichts, auch wenn das Namensschema nicht meines ist. Allerdings funktionieren die folgenden Tricks dann eben auch nicht....

          (iii) Die Mehrfachindizierung des %eibgaconf kostet NICHT den mehrfachen Speicherplatz, weil mit Referenzen gearbeitet wird (wenn '1/2/3' die GA für 'TL_WZ' = Lufttemp. Wohnzimmer ist, dann ist %eibgaconf{'1/2/3'} IDENTISCH mit %eibgaconf{TL_WZ}, die beiden teilen sich den gleichen Speierplatz für $eibgaconf{TL_WZ}{ga, name, DPTSubId, short, ...})

          Ok, was ist damit erreicht:

          Mit dem mehrfach indizierten %eibgaconf funktioniert nicht nur $eibgaconf{'1/2/3'}{name}, sondern auch $eibgaconf{TA_TE3}{ga} - und was ist wohl besser verständlich?

          Schließlich funktionieren dann auch Schleifen wie zB

          Code:
          # alle Aussentemperaturen abonnieren - Kuerzel fuer Aussentemp ist "TA"
          for my $ga (grep /^TA\S*$/, keys %eibgaconf) 
          {
             $plugin_subscribe{$ga}{$plugname}=1;
          }
          Was die Lesbarkeit von solchem Code nach 2 Jahren angeht, so bin ich der Meinung,

          (i) das muss man durch gute Kommentierung unterstützen.

          (ii) obiger Code ist (kommentiert) allemal verständlicher als ein (unkommentierter) Code, der auf "wahllose" nackte Zahlen subscribed.

          Generell sind Regexp-Ausdrücke (/^TA\S*$/ = alles was mit "TA" anfängt und keine Spaces enthält) am Anfang erstmal schwer leserlich, man liest sich da aber ein.

          VG,
          Fry

          PS. In einer Hinsicht ist Perl aber schon gefährlich: Alles, was man tun will, geht auf 6546 verschiedene Arten, von denen nicht alle leserlich sind. Die Schleife in der letzten Box ließe sich zB auch so schreiben.

          Code:
             map $_->{$plugname}=1, @plugin_subscribe{(grep /^TA\S*$/, keys %eibgaconf)};
          aber wer will das noch in 2 Jahren lesen, vielleicht sogar unkommentiert?
          (es ist übrigens auch möglich, schlechten Code in C++, Java, Python ... zu schreiben. In Visual Basic ist es hingegen unmöglich, guten Code zu schreiben. Meine Meinung.)

          Kommentar


            #6
            Zitat von Fry Beitrag anzeigen
            ganz unverbindlich möchte ich hier mal für meinen Ansatz werben
            Ähm, das musst du nicht mehr, ist ja bereits im internen SVN
            (und Termin war Freitag, ich habe gestern allerdings 3 neue Dinger gefunden und möchte nicht in 3 Tagen PL33 PL32 nachwerfen..)

            ..als in der ETS4 (wo man diese Wahl nicht hat, außerdem das Interface deutlich Windows-Nonstandard ist, man denke nur an die komische Art, wie man neue Fenster aufmacht oder den Inhalt von Fenstern beeinflusst, ich könnte hier noch ewig weitermaulen..
            Reden wir lieber nicht drüber, das ist aber gerade Mode, STRG-TAB zum Umschlaten der Tabs stand mal in den GUI-Designguidelines die ich kenne von W98-XP), heute muss man dafür zwingend die Maus schubsen

            (iii) Die Mehrfachindizierung des %eibgaconf kostet NICHT den mehrfachen Speicherplatz, weil mit Referenzen gearbeitet wird
            Da muss ich dich leider enttäuschen, egal was man in Perl tut, es kostet den 10x Speicher als man dachte;
            Auch dank Deiner Hilfe habe ich die Buben aber in den letzten Wochen von 48MB auf 22MB gebracht, da haben wir mehr Platz für memleaks und auf die 200kb die Perl aus einer 22kB config macht sein mal ein Ei gepellt..
            (48MB Startwert, über die memleaks beim eval müssen wir demnächst noch reden..ich versuch das gerade zusammenzufassen)

            Makki
            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
            -> Bitte KEINE PNs!

            Kommentar

            Lädt...
            X