Ankündigung

Einklappen
Keine Ankündigung bisher.

Zustandsspeicher / StateSave

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

    [WireGate-Plugin] Zustandsspeicher / StateSave

    Ich habe in paar Zustände, die der Bus kennen sollte und die auch über einen Stromausfall hinweg gespeichert sein sollen.

    Z.B. habe ich "Erzwinge Wochenende". Wenn ich das per Visu aktiviere, verhält sich alles so wie an einem Wochenende und nicht unter der Woche. So öffnen sich beispielsweise die Rollläden im Schlafzimmer deutlich später.

    Meine aktuelle Programmierung (und seit gerade eben im SVN) dafür ist:
    Code:
    #############################################################################
    # Plugin StateSave
    # V0.5 2011-09-18
    # Copyright: Christian Mayer (mail at ChristianMayer.de)
    # License: GPL (v3)
    #
    # Plugin to remember states on the bus if over power failures
    #
    # TODO: DPT is currently required - but it should be optional
    #############################################################################
    
    #############################################################################
    # Configuration:
    
    # The %states hash defines the global names to use in the plugins in the form of
    #   $plugin_info{'Global_...'}
    # as well as the KNX GA
    
    # Syntax:
    # 'Global_Name' => [ 'KNX GA', 'Initial Value', 'DPT (optional)' ],
    my %states = (
      'Global_ErzwingeWochenende'             => [ '0/3/20', 0    ],
      'Global_WeihnachtsbeleuchtungAutomatik' => [ '0/3/21', 0, 1 ], 
    );
    
    my $reset_states = 0; # set to 1 to reset the states, run script and change to 0 again
    my $show_debug   = 1; # switches debug information that will be shown in the log
    
    #############################################################################
    # Do NOT change anything below!
    #############################################################################
    
    #############################################################################
    # Initialisation
    for my $this_state ( keys %states ) 
    { 
      # Initialise global variable an the bus
      if( $reset_states or not exists $plugin_info{ $this_state } )
      {
        $plugin_info{ $this_state } = $states{ $this_state }[1];
        knx_write( $states{ $this_state }[0], $plugin_info{ $this_state }, $states{ $this_state }[2] );
      }
      
      # subscribe GA
      $plugin_subscribe{ $states{ $this_state }[0] }{ $plugname } = 1;
    }
    
    # No cycling, run only on request
    $plugin_info{$plugname.'_cycle'} = 0;
    
    my $ret_val = '';
    
    #############################################################################
    # Handle the bus traffic
    
    # Early exit during a response messeage - it's usually from us...
    if( $msg{'apci'} eq 'A_GroupValue_Response' )
    {
      return;
    Aber:
    Ist das alles so richtig?
    Sollte man noch etwas einbauen, dass gleich von sich aus den Cache des eibd passend befüllt, damit gerade nach einem WireGate-Restart alles funktioniert?
    Jetzt dürfen andere Plugins wohl nur die Variable $plugin_info{'Global_ErzwingeWochenende'} befragen, ein Befragen der GA ist nicht erlaubt, da ja ein Plugin kein anderes per knx_read aufrufen darf IIRC.

    Und: Wie kann ich einen knx_write benutzen um ein response zu schicken, aber ohne DPT anzugeben. Oder, fast noch wichtiger, wie kann ich im Plugin herausfinden, welcher DPT zu einer GA gehört?
    TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

    #2
    Zitat von Chris M. Beitrag anzeigen
    Ist das alles so richtig?
    Sollte man noch etwas einbauen, dass gleich von sich aus den Cache des eibd passend befüllt, damit gerade nach einem WireGate-Restart alles funktioniert?
    Schon, Cache befüllen geht aber nur auf umwegen (Write oder Response)

    Jetzt dürfen andere Plugins wohl nur die Variable $plugin_info{'Global_ErzwingeWochenende'} befragen, ein Befragen der GA ist nicht erlaubt, da ja ein Plugin kein anderes per knx_read aufrufen darf IIRC.
    Richtig.

    Und: Wie kann ich einen knx_write benutzen um ein response zu schicken, aber ohne DPT anzugeben.
    A_Groupvalue_Response geht seit PL28 mit
    knx_write(<GA>,<VALUE>,<DPT>,0x40)
    (0x40 = Response, 0x80 = Write, Default, optional)

    -> Das taugt auch zum "befüllen" des eibd-Cache ohne vorherigen read und ohne weitere Aktionen (_Write) auszulösen.
    Den DPT muss man allerdings aktuell zwingend angeben (oder die 3 Zeilen aus der sub knx_write ins Plugin kopieren) aber was hier so steht lässt sich ja mit DPT 5.010 pauschal erschlagen.
    Allerdings muss man gleich mal daran denken, das der eibd unabhängig vom WG/wiregated restartet werden könnte!
    Für persistente/remanente Werte ist $plugin_info eigentlich die einfachere Wahl, dort stellt sich auch das Lese-Problem nicht..

    Oder, fast noch wichtiger, wie kann ich im Plugin herausfinden, welcher DPT zu einer GA gehört?
    Code:
    if ($eibgaconf{'1/2/3'}{'DPTSubId'}) {
      # .. DPT steht in der config
    } else {
      # .. DPT steht nicht drin
    }
    Makki
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    Kommentar


      #3
      Klappt das eigentlich auch mit Werten für "höhere" DPTs?
      z.B. einer Solltemperatur-Vorgabe?
      Code:
        'Global_Flur_Temperatur_Soll'  => [ '7/2/21', 2050, 9 ],
      Gruß -mfd-
      KNX-UF-IconSet since 2011

      Kommentar


        #4
        Das sollte mit allen DPTs funktionieren die das WireGate spricht.
        TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

        Kommentar


          #5
          Wenn ich das wie oben geschrieben angebe (oder irgend einen anderen Wert als Soll Voreinstellung eintrage) bekomme ich beim Lesen als Antwort nur:
          Code:
          00 64 |1 C°
          Der Wert für DPT 9 wird auch nicht aktualisiert so wie bei den DPT 1.
          Wo muss ich da auf Fehlersuche gehen?
          Gruß -mfd-
          KNX-UF-IconSet since 2011

          Kommentar


            #6
            Was mir spontan auffällt: willst Du wirklich 2050°C als Initialwert?
            Gehört Dein Flur zur Walzstraße eine Stahlwerks?
            TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

            Kommentar


              #7
              Was müsste ich eintragen für 20,5°C ?

              Gruß -mfd-
              KNX-UF-IconSet since 2011

              Kommentar


                #8
                Ich würde mal 20.5 versuchen
                TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

                Kommentar


                  #9
                  Leider nicht. Mit
                  Code:
                  'Global_Flur_Temperatur_Soll'  => [ '7/2/21', 20.5, 9 ],
                  bekomme ich bei einer Abfrage der Solltemperatur

                  Code:
                  00 64 | 1 °C
                  als Antwort.
                  Gruß -mfd-
                  KNX-UF-IconSet since 2011

                  Kommentar

                  Lädt...
                  X