Ankündigung

Einklappen
Keine Ankündigung bisher.

Fensterkontakte visualisieren, Problem bei Makrogestaltung

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

    [Codebeispiel] Fensterkontakte visualisieren, Problem bei Makrogestaltung

    Hallo,

    ich habe mir im letzten Winter eine Routine gebastelt, die den Fensterzustand mit den Schaltzeiten darstellt. Jeweils 2 Buttuns stellen "geöffnet,am,ab Uhrzeit" und "geschlossen,am,ab" dar. Gleichzeitig habe ich nach einem erneuten Öffnen des geschlossenen Fensters mir ein mail mit den dargestellten Zeiten geschickt.

    Der Hintergrund: Es war der ersten Winter im neuen "Klimahaus" und ich wollte das Lüftungsverhalten mit den Wärmekurven abgleichen.

    Seit einigen Monaten läuft die Routine. Es gibt jedoch Zeitprobleme.

    Jetzt wollte ich die Codezeilen in ein Makro überführen, scheitere aber grandios an der Auführung. Ich bitte um Hilfe.

    Vorgaben des Beispiels:

    F61ID ID für Button offenF6 = 6. Fenster, 1 = Buttun Geoffnet, unter F61 werden abgeleitet:
    _STAT = Zustand des Fensters ,Auf/Zu = Zustand der GA
    var = der gespeicherte Zustand des offenen Fensters

    F61IDTEXT = $$c1400 = Displaytext

    F62ID ID für Button geschlossen
    var = der gespeicherte Zustand des geschlossenen Fensters
    Konfig3ID
    = Seiten-ID
    "OG_SUED_FK_-5/4/4"
    = GA des Kontaktes
    $OG-SUED$
    = Hilfstext für die E-Mail



    Derzeitige Sourcelösung:

    initGA("OG_SUED_FK_-5/4/4")

    if change("OG_SUED_FK_-5/4/4") then F61ID_STAT = "OG_SUED_FK_-5/4/4"b01 endif
    if (F61ID_STAT==EIN and F61IDvar==EIN and F62IDvar==EIN) then \\
    mailText=convert(F61IDTEXT,$$c1400); \\
    sendmail($xyz@hartxy.de$,mailText,mailText); \\
    F61IDTEXT = $$c1400; \\ pdisplay(F61ID,LEERTEXT,WINDOW,DISPLAY,GREY,Konfig 3ID);pdisplay(F62ID,LEERTEXT,WINDOW,DISPLAY,GREY,K onfig3ID); \\
    F61IDvar=AUS; F62IDvar=AUS \\
    endif
    if (F61ID_STAT==EIN and F61IDvar==AUS) then \\
    pdisplay(F61ID,settime(),WINDOW,DISPLAY,GREEN,Konf ig3ID); \\
    F61IDvar=EIN; F61IDTEXT = $OG-Süd Auf: $ + convert(settime(),$$) \\
    endif
    if (F61ID_STAT==AUS and F62IDvar==AUS and F61IDvar==EIN) then \\
    pdisplay(F62ID,settime(),WINDOW,DISPLAY,GREEN,Konf ig3ID); \\
    F62IDvar=EIN; F61IDTEXT = F61IDTEXT+ $ Zu: $ + convert(settime(),$$) \\
    endif


    Die Variablen sind zentral angelegt. In Verbindung mit dem Regensensor oder "Außer Haus"-Signals soll nach ein Warnsystem realisiert werden.



    Problem der Lösung:

    Alle If- Abfragen werden bei jedem Zyklus durchlaufen.

    In einem Versuch den Code in ein Makro zu packen und den gesamten Ablauf mit einem if event(GA) then {
    } endif
    zu optimieren, scheitere ich leider (noch?).

    //FensterStatus(F61ID,F62ID,Konfig3ID,"OG_SUED_FK_-5/4/4",$OG-SUED$) // Fensterkontakt OG-SUED


    Vielleicht gelingt es mir nach einigen Tips aus dem erlauchten Kreis der EIB-Gurus!

    Für jeden Hinweis bin ich dankbar und bedanke mich schon einmal vorab.

    Grüsse aus Bayern

    Wolfgang

    #2
    Hi Wolfgang,

    Alle If- Abfragen werden bei jedem Zyklus durchlaufen.
    Logisch. Im ersten if setzt Du die Bedingungen so das das zweite if gestartet und durchlaufen wird so das die Bedingungen für das dritte if erreicht werden. Das haben wir hier im Forum schon mal gehabt.

    Ich habe es mal ein wenig umgeschrieben (aber nicht getestet):

    [highlight=epc]
    initGA("OG_SUED_FK_-5/4/4")

    if change("OG_SUED_FK_-5/4/4") then {
    F61ID_STAT = "OG_SUED_FK_-5/4/4"b01;

    if (F61ID_STAT==EIN and F61IDvar==EIN and F62IDvar==EIN) then Bedingung = 1 endif;
    if (F61ID_STAT==EIN and F61IDvar==AUS) then Bedingung = 2 endif;
    if (F61ID_STAT==AUS and F62IDvar==AUS and F61IDvar==EIN) then Bedingung = 3 endif;

    if (Bedingung == 1) then {
    mailText=convert(F61IDTEXT,$$c1400);
    sendmail($xyz@hartxy.de$,mailText,mailText);
    F61IDTEXT = $$c1400;
    pdisplay(F61ID,LEERTEXT,WINDOW,DISPLAY,GREY,Konfig 3ID);
    pdisplay(F62ID,LEERTEXT,WINDOW,DISPLAY,GREY,Konfig 3ID);
    F61IDvar=AUS;
    F62IDvar=AUS;
    } endif;

    if (Bedingung == 2) then {
    pdisplay(F61ID,settime(),WINDOW,DISPLAY,GREEN,Konf ig3ID);
    F61IDvar=EIN;
    F61IDTEXT = $OG-Süd Auf: $ + convert(settime(),$$);
    } endif;

    if (Bedingung == 3) then {
    pdisplay(F62ID,settime(),WINDOW,DISPLAY,GREEN,Konf ig3ID);
    F62IDvar=EIN;
    F61IDTEXT = F61IDTEXT+ $ Zu: $ + convert(settime(),$$);
    } endif;
    } endif
    [/highlight]

    So richtig verstanden, was Du nun willst habe ich aber leider nicht.

    Gruß,
    Bernd

    Kommentar


      #3
      Danke Bernd!

      Hi Bernd,

      wie immer der Schnellste. Ich hab es fast vermutet.

      Danke, das ist auf jedenfall schon einmal die Reduzierung der If-Abfragen.
      Ich denke, jetzt ist auch die Lösung als Makro plausibel für mich.

      Ich stochere etwas im Dunkeln, das ist mein eigentliches Problem.

      Ich lese im 30 Minutentakt 7 1-WIRE-Temperature mit Deinem Makro und prüfe 8 Fenster mit der obigen Lösung.

      Im Bad habe ich einen Bewegungsmelder, dessen Ausschalten durch die Spiegelleuchte verhindert wird.
      Makro aus der Sammlung, Bewegungsmelderverriegelbar

      Mit dem Makro habe ich variable Reaktionszeiten, bis zu 2 Sekunden kann der Schaltvorgang nach der Reaktion der Bewegungsanzeige am Melder dauern.

      Jetzt suche ich verzweifelt das Zeitloch.

      Die Reduktion der If-Abfragen ist der erste Schritt. Ich teste und berichte.

      Kann die Überschneidung mit der 1-Wire-Funktion das Zeitloch produzieren?

      Danke noch einmal für den Lösungsansatz!

      Gruß
      Wolfgang

      Kommentar


        #4
        Makro getestet, Problem mit sendmail unklar

        Hallo Bernd,

        ich habe den Makro getestet.

        In der Bedigung ==1 wird das EIN-Signal ausgewertet und Schalter auf AUS gesetzt. Das EIN.Signal sollte aber auch in der Abfrage Bedigung == 2 ausgewertet werden. Ich habe in der Bedingung ==1 zum Abschluss noch die Bedingung = 2 eingefügt, Jetzt stimmt der Ablauf.

        Gescheitert bin ich lange Zeit am sendmail. mailText=$$c1400 lag bei mir unmittelbat hinter dem sendmail und es wurden immer leere mails verschickt.
        Ist das Löschen des mailText schneller ais die Ausführung des sendmail in einem Makro? In der reinen Codeversion des Ablaufes geht das Versenden vor dem Löschen problemlos.

        Vor die "Bedingung" habe ich noch die MakroID zur Eindeutigkeit eingefügt.
        Nur falls jemand das Makro auch nutzen möchte.

        Ich kämpfe noch mit den Zeitproblemen!

        Nochmals besten Dank für Deine Hilfe

        Wolfgang

        Code:
        // Fensterkontakte auswerten
        // FensterStatus(F41ID,F42ID,Konfig2ID,"EG_ESSEN_FK-5/4/0",OG-SÜD)  // Terrassentüre vor OG-Süd
        // @date    11.01.2013
        // @version    1 
        // @author    Wolfgang Schmitz
        // FeID  = Buttonkz für EIN
        // FaID  = Buttonkz für AUS
        // PageID = Seitennummer
        // FStatGA = GA des Fensterkontaktes
        // TEXTfeld zur Bezeichnung des Fensters
        // Bedingung als u08 Feld mit 1. Feld-ID voran , z.B. F41ID_Bezeichnung
        //             mailText=$$c1400 hinter sendmail ging nicht
        :begin ABAFensterStatus(FeID,FaID,PageID,FStatGA,FeTEXT)
            initGA(FStatGA)
           if change(FStatGA) then {
              FeID^_STAT = FStatGA^b01;
        
           if (FeID^_STAT==EIN and FeID^var==EIN and FaID^var==EIN) then FeID^_Bedingung = 1 endif;
           if  (FeID^_STAT==EIN  and  FeID^var==AUS)  then FeID^_Bedingung = 2 endif;
           if  (FeID^_STAT==AUS  and  FaID^var==AUS and FeID^var==EIN)  then FeID^_Bedingung = 3 endif;
        
              if (FeID^_Bedingung == 1) then {
                    mailText=convert(FeID^TEXT,$$c1400);
                    sendmail($xyz@hartxy.de$,mailText,mailText);
                    FeID^TEXT = $$c1400;
                    pdisplay(FeID,LEERTEXT,INFO,DISPLAY,GREY,PageID);
                    pdisplay(FaID,LEERTEXT,INFO,DISPLAY,GREY,PageID);
                    FeID^var=AUS;
                    FaID^var=AUS;
                    FeID^_Bedingung = 2;
               } endif;
        
           
              if (FeID^_Bedingung == 2) then {
                   pdisplay(FeID,settime(),INFO,DISPLAY,GREEN,PageID);
                   FeID^var=EIN;
                   FeID^TEXT  =  convert(FeTEXT + $ Auf: $ + convert(settime(),$$),$$c1400);
              } endif;
           
              if (FeID^_Bedingung == 3) then {
                pdisplay(FaID,settime(),INFO,DISPLAY,GREEN,PageID);
                FaID^var=EIN; FeID^TEXT  =  convert(FeID^TEXT+ $ Zu: $ + convert(settime(),$$),$$c1400);
              } endif;
        } endif
        :end

        Kommentar


          #5
          Moin, moin,

          zum Problem der leeren email:
          [highlight=epc]
          ...
          mailText=convert(FeID^TEXT,$$c1400);
          sendmail($xyz@hartxy.de$,mailText,mailText);
          FeID^TEXT = $$c1400;
          ...
          [/highlight]

          sendmail wird ganz zum Schluß des Zyklus ausgeführt. Ich kenne mich jetzt mit dem EibParser nicht so ganz aus aber es kann sein, das die Abhängigkeit der Auswertung nachher so aussieht, das mailText durch die Zuweisung FeID^TEXT = $$ schon wieder leer ist.

          Vielleicht kann Michael da mehr zu sagen...

          Probier mal folgendes:
          [highlight=epc]
          ...
          mailText=convert(FeID^TEXT,$$c1400);
          TestString = mailText
          sendmail($xyz@hartxy.de$,mailText,mailText);
          FeID^TEXT = $$c1400; <--- diese Zeile löschen
          ...
          [/highlight]
          und ganz am Ende hinzufügen:
          [highlight=epc]
          if change( FeID^TEXT) then FeID^TEXT = $$ endif
          [/highlight]

          Gruß,
          Bernd

          Kommentar

          Lädt...
          X