Ankündigung

Einklappen
Keine Ankündigung bisher.

eventwrite() reagiert auf Leseanfrage

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

    eventwrite() reagiert auf Leseanfrage

    Problem:
    Lesen der GA 0/1/35 führt zum unerwarteten Fahren von Rolladen

    ETS:
    Ein Rolladen-Taster sendet sein Objekt Langzeit-Fahren an GA 0/1/35. Das Flags K,S,Ü sind gesetzt. L (Lesen) ist nicht gesetzt.

    EibPC-Code:

    [highlight=epc]
    if eventwrite("EG Gruppe ohne Rakibe LZ-0/1/35") then {
    EG_Gruppe_oR_zeitgesteuert_Freigabe=AUS;
    write("EG Bad LZ-0/1/2", "EG Gruppe ohne Rakibe LZ-0/1/35");
    write("EG Abstell LZ-0/1/5", "EG Gruppe ohne Rakibe LZ-0/1/35");
    write("EG Küche O LZ-0/1/8", "EG Gruppe ohne Rakibe LZ-0/1/35");
    write("EG Küche S LZ-0/1/11", "EG Gruppe ohne Rakibe LZ-0/1/35");
    write("EG EZ Links LZ-0/1/14", "EG Gruppe ohne Rakibe LZ-0/1/35");
    write("EG EZ Mitte LZ-0/1/17", "EG Gruppe ohne Rakibe LZ-0/1/35");
    write("EG EZ Tür LZ-0/1/19", "EG Gruppe ohne Rakibe LZ-0/1/35");
    write("EG WZ S LZ-0/1/23", "EG Gruppe ohne Rakibe LZ-0/1/35");
    write("EG WZ W LZ-0/1/26", "EG Gruppe ohne Rakibe LZ-0/1/35");
    } endif
    if delay(!EG_Gruppe_oR_zeitgesteuert_Freigabe,2160000 0u64) then EG_Gruppe_oR_zeitgesteuert_Freigabe=EIN endif
    [/highlight]

    Ziel des EibPC-Codes:
    Wenn der Taster "EG Gruppe ohne Rakibe LZ-0/1/35" ein RUNTER (1) schickt, dann sollen diese Rolladen RUNTER.
    Wenn der Taster "EG Gruppe ohne Rakibe LZ-0/1/35" ein RAUF (0) schickt, dann sollen diese Rolladen RAUF.
    Wurde der Taster einmal betätigt, so wird die Zeitsteuerung (EG_Gruppe_oR_zeitgesteuert_Freigabe) für 6h (2160000ms) ausgeschaltet (Freigabe=AUS).
    Macht eine Visu ein "read", so soll nicht geantwortet werden.

    Tatsächlicher Status:
    Lese ich mit der ETS die GA 0/1/35, so bekomme ich keine Antwort. Das erwarte ich auch.
    Es fahren dadurch jedoch die im EibPC-Code aufgeführten Rolladen herunter. Das Debug-Fenster des EibPC sagt, dass "EG Gruppe ohne Rakibe LZ-0/1/35" EIN (=1) ist!
    Ich erkläre das dadurch, dass am Taster ggf. zuletzt auf RUNTER gedrückt wurde.
    Warum führt das Lesen der GA nun zum Fahren der Rolladen?
    Es scheint, als wenn eventwrite() auch auf Lesen reagiert???

    Die Dokumentation des EibPC S 135 beschreibt die Wirkung von eventwrite():
    Rückgabewert: 1b01 (EIN-Impuls), wenn am KNX Bus eine Antwort auf Telegramm mit der Gruppenadresse geschrieben wird, unabhängig von dessen Inhalt.
    Wer schickt denn hier eine Antwort???

    Auszug eib.log:
    2012-10-07 12:19:57.550,A_GroupValue_Read,1.1.114,0/1/35,00,0,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
    2012-10-07 12:19:57.626,A_GroupValue_Write,1.1.113,0/1/2,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
    2012-10-07 12:19:57.772,A_GroupValue_Write,1.1.113,0/1/5,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
    2012-10-07 12:19:57.918,A_GroupValue_Write,1.1.113,0/1/8,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
    2012-10-07 12:19:58.065,A_GroupValue_Write,1.1.113,0/1/11,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
    2012-10-07 12:19:58.211,A_GroupValue_Write,1.1.113,0/1/14,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
    2012-10-07 12:19:58.358,A_GroupValue_Write,1.1.113,0/1/17,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
    2012-10-07 12:19:58.504,A_GroupValue_Write,1.1.113,0/1/19,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
    2012-10-07 12:19:58.651,A_GroupValue_Write,1.1.113,0/1/23,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
    2012-10-07 12:19:58.797,A_GroupValue_Write,1.1.113,0/1/26,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0

    Ist das so gewollt?

    -> Ich habe die Abfrage im Code nun geändert auf
    if change("EG Gruppe ohne Rakibe LZ-0/1/35") then {
    Damit tritt dieses unerwartete Verhalten nicht mehr auf.

    Meine Frage ist nun:
    Interpretiere ich die Funktionsweise von eventwrite() hier falsch?

    Gruß,
    Joachim
    EibPC - Wiregate

    #2
    die Unterscheidung wäre mit eventresponse möglich:
    damit kannst du feststellen, ob ein Telegramm durch eine Response (also Antwort aufgrund eines Read) ausgelöst wird....

    if eventwrite(GA) and !eventresponse(GA) then....
    EPIX
    ...und möge der Saft mit euch sein...
    Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

    Kommentar


      #3
      Zitat von joda123 Beitrag anzeigen
      Wer schickt denn hier eine Antwort???
      Kannst Du bitte den Telegrammmonitor des EibPCs hier posten?
      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
      Enertex Produkte kaufen

      Kommentar


        #4
        Hallo Michael,

        Aus dem eib.log geht hervor, dass niemand antwortet. Und in der ETS kann ich erkennen, dass auf meine Lese-Anfrage auch eben keine Antwort kommt. Das erwarte ich ja auch, da in Richtung des Tasters das Lese-Flag bewusst nicht gesetzt ist. Was ich nicht erwartet hatte war, dass eventwrite() auslöst. Mit eventwrite() hatte ich bewusst nur auf Schreibzugriffe auf diese GA reagieren wollen...

        Gruß, Joachim
        EibPC - Wiregate

        Kommentar


          #5
          Zitat von joda123 Beitrag anzeigen
          Aus dem eib.log geht hervor, dass niemand antwortet. Und in der ETS kann ich erkennen, dass auf meine Lese-Anfrage auch eben keine Antwort kommt. Das erwarte ich ja auch, da in Richtung des Tasters das Lese-Flag bewusst nicht gesetzt ist. Was ich nicht erwartet hatte war, dass eventwrite() auslöst. Mit eventwrite() hatte ich bewusst nur auf Schreibzugriffe auf diese GA reagieren wollen...
          Das habe ich schon verstanden. Aber im CSV-Log des EibPC sind auch Binärdaten, wo man z.B. erkennt, ob und welches Flag gesetzt sind (also z.B. das Schreibflag). Zumindest kann man damit leichter verstehen, warum der EibPC antworten will - setzt man mal voraus, dass der EibPC eventwrite richtig umgesetzt hat. Um dies rauszufinden - Bug oder das Problem im eibd, brauch ich das Log.
          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
          Enertex Produkte kaufen

          Kommentar


            #6
            Verstehe. Das Beispiel von heute früh ist leider nicht mehr im Buffer gewesen. Ich muss es erst noch einmal nachstellen.
            Gruß, Joachim
            EibPC - Wiregate

            Kommentar


              #7
              Neues Beispiel:

              eibd.log:
              2012-10-07 18:40:00.766,A_GroupValue_Read,1.1.114,0/1/35,00,0,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
              ..
              2012-10-07 18:40:02.827,A_GroupValue_Write,1.1.112,0/1/2,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
              ..
              2012-10-07 18:40:02.970,A_GroupValue_Write,1.1.112,0/1/5,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
              2012-10-07 18:40:03.117,A_GroupValue_Write,1.1.112,0/1/8,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
              2012-10-07 18:40:03.263,A_GroupValue_Write,1.1.112,0/1/11,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
              2012-10-07 18:40:03.473,A_GroupValue_Write,1.1.112,0/1/14,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
              2012-10-07 18:40:03.556,A_GroupValue_Write,1.1.112,0/1/17,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
              2012-10-07 18:40:03.703,A_GroupValue_Write,1.1.112,0/1/19,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
              2012-10-07 18:40:03.851,A_GroupValue_Write,1.1.112,0/1/23,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0
              2012-10-07 18:40:03.996,A_GroupValue_Write,1.1.112,0/1/26,01,1,DPT_UpDown,1.008,0,low,6,T_DATA_XXX_REQ,0

              (Werte der Wetterstation, die hiermit nichts zu tun haben, wurden bei ".." herausgeschnitten.
              Das Read in der ersten Zeile wurde manuell aus der ETS ausgelöst.
              Die folgenden Write's wurden offenbar durch den EibPC erstellt. Sie führen dazu, dass die Rolladen herunterfahren.

              Das CSV-Log zu diesem Event habe ich Dir parallel per EMail geschickt.

              Gruß, Joachim
              EibPC - Wiregate

              Kommentar


                #8
                Zitat von joda123 Beitrag anzeigen
                Das CSV-Log zu diesem Event habe ich Dir parallel per EMail geschickt.
                Danke, ich gebe das weiter.
                offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                Enertex Produkte kaufen

                Kommentar


                  #9
                  Zitat von joda123 Beitrag anzeigen
                  Das CSV-Log zu diesem Event habe ich Dir parallel per EMail geschickt.
                  Da bräuchten wir auch noch das EibPC Programm, ESF Daten etc.
                  offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                  Enertex Produkte kaufen

                  Kommentar


                    #10
                    Hallo Michael, hatte Steffi,

                    Programm und Daten hatte ich euch zugeschickt. Habt ihr schon etwas herausbekommen? Alle meine darauf folgenden Tests laufen darauf hinaus, dass eventwrite() auch auf Leseanforderungen reagiert.

                    Die Änderung meiner Abfrage auf "if change()..." war leider doch nicht die Lösung. Manchmal wird dasselbe RAUF oder auch RUNTER wiederholt korrekt und gewollt ausgelöst. Da das im Wiederholungsfall keine Änderung ist, reagiert change() korrekterweise nicht.

                    Ich suche also immer noch nach einer Möglichkeit, auf das write() auf eine GA zu reagieren. Wird von dieser GA gelesen, so soll nicht oder anders reagiert werden.
                    Auch die Formulierung "if !eventread() and !eventresponse() then" führte nicht zum Erfolg. Auch hier wurde auf ein read() reagiert.

                    Any idea?

                    Gruß, Joachim
                    EibPC - Wiregate

                    Kommentar


                      #11
                      Aktuell teste ich den Workaround:

                      if event() and !eventread() and !eventresponse() then ...

                      Sieht auf den ersten Blick gut aus...

                      Gruß, Joachim
                      EibPC - Wiregate

                      Kommentar


                        #12
                        Zitat von joda123 Beitrag anzeigen
                        Aktuell teste ich den Workaround:
                        if event() and !eventread() and !eventresponse() then ...
                        wir haben deinen Log untersucht, mit einer Siemensschnittstelle und einem Testaufbau konnten wir das Verhalten nicht reproduzieren. Auch der Code in der Firmware wurde überprüft und für gut befunden.
                        Kannst Du mal folgenden Code testen
                        Code:
                        if after(systemstart(),1000u64) then read("EG Gruppe ohne Rakibe LZ-0/1/35") endif
                        if eventwrite("EG Gruppe ohne Rakibe LZ-0/1/35") then write("AU Außenlicht O schalten-4/3/1",AUS) endif
                        und ggf. schauen, wann das Problem entsteht oder ob es gar bei diesem Beispiel schon nicht klappt.
                        Hast Du auch mal die Ereignisse abgeholt? Du hast recht hohe Buslast, nicht dass da was passiert...
                        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                        Enertex Produkte kaufen

                        Kommentar


                          #13
                          Hallo Michael,

                          Ich habe folgenden Code ausgeführt:
                          [highlight=epc]
                          // Syslog //
                          if systemstart() then SyslogInit(192.168.249.3, 514u16, 21u08); Syslog(Notice,$main: EibPC started$); endif // IP=lab00.jd.cretis.de, 514u16 Syslog-Port, Facility 21u08 = local5 //

                          // Enertex Tests 20121012 //
                          if after(systemstart(),60000u64) then {
                          Syslog(Notice,$debug: Enertex - read EG Gruppe ohne Rakibe LZ-0/1/35 wird ausgefuehrt.$);
                          read("EG Gruppe ohne Rakibe LZ-0/1/35");
                          Syslog(Notice,$debug: Enertex - read EG Gruppe ohne Rakibe LZ-0/1/35 wurde ausgefuehrt.$)
                          } endif
                          if eventwrite("EG Gruppe ohne Rakibe LZ-0/1/35") then {
                          Syslog(Notice,$debug: Enertex - write("AU Außenlicht O schalten-4/3/1",EIN) wird ausgefuehrt.$);
                          write("AU Außenlicht O schalten-4/3/1",EIN);
                          Syslog(Notice,$debug: Enertex - write("AU Außenlicht O schalten-4/3/1",EIN) wurde ausgefuehrt.$);
                          } endif
                          [/highlight]

                          Das syslog sieht daraufhin so aus:

                          Oct 12 17:35:52 eibpc.jd.cretis.de main: EibPC started
                          Oct 12 17:35:52 eibpc.jd.cretis.de Gaszaehler: UG_SR_Gaszaehler_Zaehlerwert=253449
                          Oct 12 17:36:51 eibpc.jd.cretis.de debug: Enertex - read EG Gruppe ohne Rakibe LZ-0/1/35 wird ausgefuehrt.
                          Oct 12 17:36:51 eibpc.jd.cretis.de debug: Enertex - read EG Gruppe ohne Rakibe LZ-0/1/35 wurde ausgefuehrt.

                          -> Das Aussenlicht wurde also nicht eingeschaltet.

                          Anschl. habe ich per ETS ein read() von dieser Adresse durchgeführt. Das Aussenlicht wurde ebenfalls nicht eingeschaltet. Strange...

                          Meine Lösung an ursprünglicher Codestelle sieht wie folgt aus und funktioniert einwandfrei:
                          [highlight=epc]
                          if event("EG Gruppe ohne Rakibe LZ-0/1/35") and !eventread("EG Gruppe ohne Rakibe LZ-0/1/35") and !eventresponse("EG Gruppe ohne Rakibe LZ-0/1/35") then {
                          [/highlight]

                          Gruß, Joachim
                          EibPC - Wiregate

                          Kommentar


                            #14
                            Zitat von joda123 Beitrag anzeigen
                            Hallo Michael,
                            Ich habe folgenden Code ausgeführt:
                            Hilfreiche wäre nun Stück für Stück den Code vergrößern, die Codestelle belassen und schauen ob und wann der Fehler auftritt. Und dann wieder "entschlacken", bis man den Fehler sieht.
                            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                            Enertex Produkte kaufen

                            Kommentar

                            Lädt...
                            X