Berechtigungsbaustein - Text be-/verarbeiten

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

    #1

    Berechtigungsbaustein - Text be-/verarbeiten

    Hi Loxonauten.

    Ich nutze bei mir einen Berechtigungsbaustein um Meine Alarmanlage via I-Button scharf und unscharf zu schalten.

    Dabei wird durch die Farbe des LED-Rings angezeigt ob scharf oder Unscharf ist. soweit so gut.


    Nun Logge ich schon längere Zeit mit, und was mir aber nicht gefällt, das immer nur da Steht "Berechtigung erteilt".

    Ich möchte gerne, das je nachdem ob scharf oder unscharf geschalten wurde, das auch mit im Log steht.

    Dazu kam mir der Bedingte Statusbaustein in den Kopf, auf Analogeingang 1 den Textausgang von Berechtigungsbaustein, und an den 2. den Ausgang ob Scharf oder Unscharf, und dann halt entsprechend formatiert. nur leider kann ich anscheind keinen Text über den Analogeingang rein schieben.

    Sonst noch wer eine Idee dazu? Würde es auch über einen Programmbaustein machen, der hat aber auch keinen Texteingang.

  • maxw
    Lox Guru
    • 25.08.2015
    • 1372

    #2
    Oh ja, da habe ich auch schon bei Loxon versucht eine Erweiterung des Bausteins zu erwirken, da die Texte selten passen. Bitte bitte mach das auch , wenn mehr Leute Nachfrage wachen Sie vielleicht ja auf.

    Einstweilen habe ich dafür ein PicoC Programm in Einsatz - ziemlicher Overkill aber mit dem Standard Text kann ich nicht leben.

    Kommentar

    • Gast

      #3
      Werde ich mal machen.

      Wie hast du das mit Pico-C umgesetzt?

      Kommentar

      • maxw
        Lox Guru
        • 25.08.2015
        • 1372

        #4
        Das ist nicht so schwer, ich habe es so gemacht
        Klicke auf die Grafik für eine vergrößerte Ansicht

Name: PicoC-text.png
Ansichten: 318
Größe: 7,0 KB
ID: 18202



        Und hier das Programm:

        Code:
        // skip all the text up to and including the defined text
        
        #define BUFF_SIZE 100
        
        char *str;
        int e;
        char buff[BUFF_SIZE];
        
        int debug = 1;
        
        while(1) {
        
            e = getinputevent();
        
            if (e == 1) {
                // Textmeldung von Berechtigungsbaustein        
                str = getinputtext(0);
                if (debug) setlogtext(str);
        
                // Name suchen (kommt nach ": ") und Text nach Name ersetzen
                char *pName = strstrskip(str, ": ");
                if (pName != NULL) {
                    strcpy(index(pName, ' '), " kommt");
                }
                else {
                    pName = str;
                }
        
                // avoid buffer overrun
                strncpy(buff, pName, BUFF_SIZE);
                buff[BUFF_SIZE-1] = '\0';
                if (debug) setlogtext(buff);
                setoutputtext(0, buff);
                free(str);
            }
            else if (e == 3) {
                // Abwesenheitsimpuls
                setoutputtext(0, "Niemand mehr da");
            }
            else {
                setoutputtext(0, "");
            }
        
            sleep(100);
        }
        
        [FONT=courier new][/FONT]

        Kommentar

        • romildo
          Lebende Foren Legende
          • 25.08.2015
          • 5161

          #5
          Zitat von ichraffsnicht
          Hi Loxonauten.
          ...........
          Dazu kam mir der Bedingte Statusbaustein in den Kopf, auf Analogeingang 1 den Textausgang von Berechtigungsbaustein, und an den 2. den Ausgang ob Scharf oder Unscharf, und dann halt entsprechend formatiert. nur leider kann ich anscheind keinen Text über den Analogeingang rein schieben.
          Wieso soll das nicht gehen?
          Klicke auf die Grafik für eine vergrößerte Ansicht

Name: BerechtigungsTracker.png
Ansichten: 414
Größe: 12,1 KB
ID: 18219 Klicke auf die Grafik für eine vergrößerte Ansicht

Name: BerechtigungsTrackerStatus.png
Ansichten: 419
Größe: 11,9 KB
ID: 18220

          lg Romildo

          Kommentar

          • Gast

            #6
            Ja der Status Baustein ist ne Möglichkeit. Ich finde es schade das die Visu in vielen Fällen dadurch ich sag mal auseinander gezogen wird... Aber oft bleibt keine andere Möglichkeit.

            Kommentar

            • Gast

              #7
              hi Leute,

              ich hab heute mal den Code von maxw genommen, etwas bearbeitet, so das er für meine Zwecke dient.

              Funzt auch soweit, ich hab nur das Problem, das er den Text Mehrmals pro Sekunde in den Logger schreibt, obwohl der Wert sich gar nicht ändert.

              folgendes mache ich: immer wenn sich AQ1 ändert, wird der Text vom Texteingang bearbeitet, und je nachdem ob AQ1 1 oder 0 ist erweitert. dann wird der Text an TQ ausgegeben und in einen Logger geschrieben.

              hier der code:

              Code:
              // skip all the text up to and including the defined text
              
              #define BUFF_SIZE 100
              
              char *str;
              float e;
              float sts;
              char buff[BUFF_SIZE];
              
              int debug = 1;
              
              while(1) {
              
              //    e = getinputevent();
              
                  sts = getinput(0);
              
                  if (e != sts) {
                      e = sts;
                      // Textmeldung von Berechtigungsbaustein        
                      str = getinputtext(0);
                      if (debug) setlogtext(str);
              
                      // Name suchen (kommt nach ": ") und Text nach Name ersetzen
                      char *pName = strstrskip(str, ": ");
                      if (pName != NULL) {
                          if(sts == 1){
                              strcpy(index(pName, ' '), " :Alarm unscharf");
                          }
                          else {
                              strcpy(index(pName, ' '), " :Alarm scharf");        
                          }
                      }
                      else {
                          pName = str;
                      }
              
                      // avoid buffer overrun
                      strncpy(buff, pName, BUFF_SIZE);
                      buff[BUFF_SIZE-1] = '\0';
                      if (debug) setlogtext(buff);
                      setoutputtext(0, buff);
                      free(str);
                  }
                  else {
                  }
              
              
                  sleep(1000);
              }

              Kommentar

              • romildo
                Lebende Foren Legende
                • 25.08.2015
                • 5161

                #8
                Hast du die Zeile
                e = getinputevent();
                absichtlich ausdokumentiert // ?
                Die ist genau dafür vorgesehen.
                lg Romildo

                Kommentar

                • maxw
                  Lox Guru
                  • 25.08.2015
                  • 1372

                  #9
                  Da sind mehrere Fehler drinnen.
                  • wie romildo schon sagte, die Zeile e = getinputevent(); ausdokumentieren ist keine gute Idee, weil da wird ermittelt WAS bzw. an WELCHEM EINGANG etwas geschehen ist, siehe Doku http://www.loxone.com/enen/service/d...#getinputevent
                  • dann vergleichst du sts, den WERT der an AI1 anliegt mit e. e ist aber nicht initialisiert (Zeile hast du ja ausdokumentiert) bzw. 0
                  • dann setzt du e gleich sts - wozu?
                  • du verstehst nicht wirklich was du machst, oder? Ich auch nicht :-)

                  Was meinst du mit: immer wenn sich AQ1 ändert ? Meinst du immer wenn sich AI1 ändert?
                  Wenn ja, dann probier mal folgendes

                  Code:
                  while(1) {
                  
                      e = getinputevent();
                  
                      if (e == 2) {
                          // Der Wert an AI1 hat sich geändert  
                          sts = getinput(0);  // hole Wert von AI1
                          str = getinputtext(0); // hole den Text
                  
                          // Rest wie oben - leeres else kannst du löschen
                      }
                  
                  
                      sleep(1000);
                  }

                  Kommentar

                  • Gast

                    #10
                    Hallo Ihr beiden.

                    ja ich hab die Zeile

                    e = getinputevent();

                    absichtlich auskommentiert, da getinputevent alles mögliche ausgibt, nur nicht das was es soll. Wenn sich an AI1 was ändert müsste getinputevent "2" ausgeben. allerdings gibt die Funktion 0 oder 2 oder 256 oder 268. die 2 kommt aber nicht zuverlässig wenn sich was ändert.

                    deshalb hab ich mich mit e = sts beholfen.

                    mit sts = getinput(0); hole ich mir den wert von AI1 ab,

                    prüfe dann ob e ungleich sts ist. das ist der fall wenn sich AI1 ändert.

                    dann setze ich in der Bedingung e = sts damit beim nächsten durchlauf der schleife die Bedingung nicht mehr erfüllt ist.

                    Was meinst du mit: immer wenn sich AQ1 ändert ? Meinst du immer wenn sich AI1 ändert?
                    Wenn ja, dann probier mal folgendes
                    hatte ich verwechselt richtig ;-)

                    mfg

                    Kommentar

                    • maxw
                      Lox Guru
                      • 25.08.2015
                      • 1372

                      #11
                      0 wird nur dann "ausgegeben" wenn sich nichts geändert hat. Es macht also schon Sinn das zu verwenden. Hast du auch noch andere Eingänge als TI und AI1 beschalten? Dann kommen auch andere Werte als 0 ... Nix geändert, 1 ... TI geändert, 2 ... AI1 geändert, 3 ... TI und AI1 geändert - ansonsten wäre das sehr seltsam und du solltest den Baustein mal löschen und neu anlegen.

                      Zumindest solltest du aber e einlesen und auf != 0 abfragen, sonst hast du jede Sekunde einen Eintrag in deinem Logger - wie du ja schon bemerkt hast.
                      Zuletzt geändert von maxw; 07.01.2016, 11:03.

                      Kommentar

                      Lädt...