Ankündigung

Einklappen
Keine Ankündigung bisher.

Zehnder ComfoAIR mit EIBPC steuern

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

    Zehnder ComfoAIR mit EIBPC steuern

    Hallo zusammen,
    ​ich habe per Suche leider nichts gefunden, obwohl ich der Meinung bin, dass das schon mal Thema hier war.
    Ich möchte gerne eine Zehnder ComfoAir mit dem EIBPC steuern.
    Mittel der Wahl wäre die RS232 Verbindung.

    Hat das schon mal jemand gemacht und kann mir da vielleicht mit einem Codebeispiel behilflich sein?
    Bei einem Makro gibt´s ein paar Tafeln Schokolade.

    Besten Dank und viele Grüße
    Volker

    Gruß
    Volker

    Wer will schon Homematic?

    #2
    Ich lege noch ein paar Tafeln dazu, bin auch auf der Suche und an dem Thema.
    Falls jemand gleich die Kabel- / Steckerbelegung RJ45 (Zehnder Comfort Air 350) <> RS232 (EIBPC) hat, freue ich mich auf ein Schaltbild.

    Kommentar


      #3
      Ganz normales 1:1 Kabel. Die Comfoair hat oben noch einen 9 poligen Stecker!?
      Gruß Matthias
      EIB übersetzt meine Frau mit "Ehepaar Ist Beschäftigt"
      - PN nur für PERSÖNLICHES!

      Kommentar


        #4
        You do not have permission to view this gallery.
        This gallery has 1 photos.
        Gruß Matthias
        EIB übersetzt meine Frau mit "Ehepaar Ist Beschäftigt"
        - PN nur für PERSÖNLICHES!

        Kommentar


          #5
          Oder hier:

          http://www.see-solutions.de/sonstige...g_ComfoAir.pdf
          Gruß Matthias
          EIB übersetzt meine Frau mit "Ehepaar Ist Beschäftigt"
          - PN nur für PERSÖNLICHES!

          Kommentar


            #6
            ja, scheint gleich geblieben zu sein.
            You do not have permission to view this gallery.
            This gallery has 1 photos.

            Kommentar


              #7
              Hallo zusammen,

              ich habe zu dem Thema früher bereits nachgefragt, leider nur mit mäßigem Erfolg:
              https://knx-user-forum.de/forum/supp...mit-nullstring

              Das parsen der Datenpakete der Zehnder-Anlage mit dem EibPC bereitet mir nach wie vor große Probleme. Ich habe noch keinen einfachen programmtechnischen Weg gefunden, Nullstrings zu verarbeiten bzw. in Strings die einen Nullstring enthalten können nach etwas zu suchen.
              Ich bin auch für jede Mithilfe bei dem Projekt dankbar!

              Grundsätzlich lässt sich die Zehnder-Anlage über RS232 gut auslesen und steuern, nur das originale Bedienteil sollte man abklemmen, das verursacht heftigen permanenten Datenverkehr.

              Gruß

              Bernd

              Kommentar


                #8
                Vielen Dank für Eure Rückmeldungen.
                knxfreak12 Würdest du mir dein Programm mal zur Verfügung stellen?
                Vielleicht können wir zusammen ein wenig daran weiter arbeiten um das hinzubekommen.
                Gruß
                Volker

                Wer will schon Homematic?

                Kommentar


                  #9
                  Da ist wirklich nicht viel dran, um das umzusetzen. Das protokoll ist ja. Etwas tricky ist das mit der Checksumme und der Sonderbehandlung der 0x07. Aber sonst nur Fleißarbeit.

                  Mit dem HS läuft das wunderbar. Ich kann Enertex beim Implementieren unterstützen - wenn sie wollen
                  Gruß Matthias
                  EIB übersetzt meine Frau mit "Ehepaar Ist Beschäftigt"
                  - PN nur für PERSÖNLICHES!

                  Kommentar


                    #10
                    Zitat von MatthiasS Beitrag anzeigen
                    Ich kann Enertex beim Implementieren unterstützen - wenn sie wollen
                    Na da wird dich die Steffi sicher kontaktieren
                    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                    Enertex Produkte kaufen

                    Kommentar


                      #11
                      Zitat von enertegus Beitrag anzeigen
                      Na da wird dich die Steffi sicher kontaktieren
                      Das wäre ein weiteres Kauf-Argument für den EIBpc, eine funktionierende Anbindung zu Comfo Air

                      Kommentar


                        #12
                        Hallo SnowMaKeR,

                        gerne trage ich mit meinen bisherigen Forschungsergebnissen bei!

                        Ich habe meinen Code auf die für die Lueftungsanlage relevanten Teile reduziert, siehe unten.

                        Hier noch einige Anmerkungen zum besseren Verständnis:

                        -Die Protokollbeschreibung von MatthiasS ist super und diente als Grundlage

                        -In meinem Code ist (leider) vieles festverdrahtet (z.B. Kommandopakete die vom EibPC gesendet werden)

                        -Der Empfang der Antwort vom Lüftungsgerät erfolgt asynchron über einen "eigenen RS232 Puffer",
                        der im 250ms Takt Zeichen für Zeichen abgearbeitet wird

                        -Das Suchen/Parsen nach den Antwort-Codes ist sehr mühsam und erfolgt "angepasst" an die zu
                        erwartenden Antworten, z.B. "Temperaturen abrufen" oder "Drehzahlen abrufen",
                        hier wäre etwas generisches, z.B. eine Auswertung nach einer Tabelle (wie in der Protokollbeschreibung)
                        sehr viel schöner.

                        -Das Parsen der empfangenen RS232-Sequenzen nach den Antwort-Codes wird durch die Nullstrings erschwert,
                        die im Datenpaket enthalten sind, die Funktion find() kann hier leider nicht verwendet werden,
                        weil sie nach dem ersten Nullstring abbricht und den String für beendet erklärt.
                        Da hab ich ziemlich rumgebastelt - das Ergebnis gefällt mir nicht wirklich, aber funktioniert.
                        Ich habe auch schon über Ersetzen der 0x00 durch ein anderes Zeichen nachgedacht, aber so eine richtig
                        zündende (=einfache) Idee, um trotzdem alle 256 Zeichen verwenden zu können, hatte ich leider nicht.
                        Wie kann man solche "Binärdaten" mit dem EibPC elegant verarbeiten/parsen/erzeugen?
                        Hier gibts doch bestimmt erfahrene Experten?!

                        -Wenn im Datenstrom eine 0x07 vorkommt, so ist diese gesondert codiert (durch 0x07 0x07),
                        dadurch ändert sich die Paketlänge. Das ist "eigentlich" kein Problem, aber in der EibPC-Programmiersprache
                        bekomme ich das irgendwie nicht so richtig elegant gebacken.

                        -Grundsätzlich funktioniert der Code bei mir seit Monaten schon recht stabil, bis auf Antwortpakete mit einer 0x07.
                        Da kegelt es die empfangenen Daten im Moment noch durcheinander, das ist leider unschön.


                        Ich bin schon sehr gespannt auf Verbesserungen jeglicher Art - eine Kapselung in einem Makro wäre natürlich optimal - wer hilft mit? Auf gehts!

                        Viel Spaß beim Code-Durchstöbern & viele Grüße

                        Bernd


                        Code:
                        [RS232]
                        // Baudrate für die RS-232-Anwenderschnittstelle: Dezimaldarstellung.
                        // Zulässige Werte: 0 , 50 , 75 , 110 , 134 , 150 , 200 , 300 , 600 , 1200 , 1800 , 2400 , 4800
                        // 9600 , 19200, 38400 , 57600 , 115200 , 230400
                        9600
                        //Datenbits für die RS-232-Anwenderschnittstelle: Dezimaldarstellung. Gültige Werte: 5, 6, 7, 8
                        8
                        //Stoppbits für die RS-232-Anwenderschnittstelle: Dezimaldarstellung. Gültige Werte: 1, 2
                        1
                        //Parität für die RS-232-Anwenderschnittstelle: Dezimaldarstellung. aus = 0 / gerade = 1 / ungerade = 2
                        0
                        //Flußsteuerung für die RS-232-Anwenderschnittstelle: Dezimaldarstellung.
                        //aus = 0 / RTS/CTS = 1 / Xon/Xoff = 2
                        0
                        
                        // ________________________________________ Lueftungsanlage (RS232) ________________________________________
                        if (mtime(00,00) or mtime(10,00) or mtime(20,00) or mtime(30,00) or mtime(40,00) or mtime(50,00) or after(systemstart(),10000u64)) then {
                             // Temperaturen abrufen (0x00 0xD1, Checksum: 7e)
                            sendrs232(0x07u08,0xf0u08,0x00u08,0xd1u08,0x00u08,0x7eu08,0x07u08,0x0fu08);
                            RS232_AckPending=1u08
                        } endif
                        
                        if ( cycle(02,00) or after(systemstart(),20000u64) ) then {
                             // Ventilatorstatus abrufen (0x00 0x0B, Checksum: b8)
                            sendrs232(0x07u08,0xf0u08,0x00u08,0x0bu08,0x00u08,0xb8u08,0x07u08,0x0fu08);
                            RS232_AckPending=1u08
                        } endif
                        
                        if ( cycle(02,20) or after(systemstart(),30000u64) ) then {
                             // "EWT / Nachheizung abrufen" (0x00 0xEB, Checksum: 98)
                            sendrs232(0x07u08,0xf0u08,0x00u08,0xebu08,0x00u08,0x98u08,0x07u08,0x0fu08);
                            RS232_AckPending=1u08
                        } endif
                        
                        
                        if change(LueftungTempKomfortSoll) then {
                            // Komforttemperatur setzen (0x00 0xD3, Checksum: 80+Temp)
                            if (LueftungTempKomfort!=LueftungTempKomfortSoll) then {
                            sendrs232(0x07u08,0xf0u08,0x00u08,0xd3u08,0x01u08,convert(2f16*(LueftungTempKomfortSoll+20f16),0u08),(0x81u08+convert(2f16*(LueftungTempKomfortSoll+20f16),0u08)),0x07u08,0x0fu08);
                            RS232_AckPending=1u08
                            } endif
                        } endif
                        
                        if change(LueftungTempEWTniedrigSoll) then {
                            // Update-Request, damit Daten über RS232 ans Lüftungsgerät gesendet werden
                            LueftungEWTRS232UpdateRequest=EIN
                        } endif
                        
                        if change(LueftungTempEWThochSoll) then {
                            // Update-Request, damit Daten über RS232 ans Lüftungsgerät gesendet werden
                            LueftungEWTRS232UpdateRequest=EIN
                        } endif
                        
                        if change(LueftungEWTspeedupSoll) then {
                            // Update-Request, damit Daten über RS232 ans Lüftungsgerät gesendet werden
                            LueftungEWTRS232UpdateRequest=EIN
                        } endif
                        
                        // Update-Request abarbeiten, d.h. Daten über RS232 ans Lüftungsgerät senden
                        // Bedingung :LueftungEWTRS232validRXdata=EIN, d.h. es muss midestens 1x ein Datensatz vom Lüftungsgerät empfangen worden sein
                        // todo: Checksumme pruefen
                        // Verzögertes Schreiben (retriggerbare Verzögerung)
                        if delay(LueftungEWTRS232UpdateRequest and LueftungEWTRS232validRXdata,10000u64) then{
                            LueftungEWTRS232UpdateRequestDelayed=EIN;
                            LueftungEWTRS232UpdateRequest=AUS
                        } endif
                        if after(LueftungEWTRS232UpdateRequest,100u64) then{
                            LueftungEWTRS232UpdateRequest=AUS
                        } endif
                        
                        if LueftungEWTRS232UpdateRequestDelayed then{
                            LueftungEWTRS232ChecksumCalc=173u08;
                            // Sende START + Command 0xed ("EWT / Nachheizung setzen") + 5 Payload Bytes (falls 0x07 0x07, darf dies ohnehin nur 1x gezählt werden)
                            sendrs232(0x07u08,0xf0u08,0x00u08,0xedu08, 0x05u08);
                            LueftungEWTRS232ChecksumCalc=LueftungEWTRS232ChecksumCalc+0xedu08+0x05u08;
                        
                            LueftungTempEWTniedrigSollu08=convert(LueftungTempEWTniedrigSoll,0u08);
                            if (LueftungTempEWTniedrigSollu08==07u08) then {
                                sendrs232(0x07u08)
                            } endif;
                            sendrs232(LueftungTempEWTniedrigSollu08);
                            LueftungEWTRS232ChecksumCalc=LueftungEWTRS232ChecksumCalc+LueftungTempEWTniedrigSollu08;
                        
                            LueftungTempEWThochSollu08=convert(LueftungTempEWThochSoll,0u08);
                            if (LueftungTempEWThochSollu08==07u08) then {
                                sendrs232(0x07u08)
                            } endif;
                            sendrs232(LueftungTempEWThochSollu08);
                            LueftungEWTRS232ChecksumCalc=LueftungEWTRS232ChecksumCalc+LueftungTempEWThochSollu08;
                        
                            LueftungEWTspeedupSollu08=convert(LueftungEWTspeedupSoll,0u08);
                            if (LueftungEWTspeedupSollu08==07u08) then {
                                sendrs232(0x07u08)
                            } endif;
                            sendrs232(LueftungEWTspeedupSollu08);
                            LueftungEWTRS232ChecksumCalc=LueftungEWTRS232ChecksumCalc+LueftungEWTspeedupSollu08;
                        
                            LueftungKuechenhaubespeedupSollu08=convert(LueftungKuechenhaubespeedupSoll,0u08);
                            if (LueftungKuechenhaubespeedupSollu08==07u08) then {
                                sendrs232(0x07u08)
                            } endif;
                            sendrs232(LueftungKuechenhaubespeedupSollu08);
                            LueftungEWTRS232ChecksumCalc=LueftungEWTRS232ChecksumCalc+LueftungKuechenhaubespeedupSollu08;
                        
                            NachheizungTwunschSollu08=convert(NachheizungTwunschSoll,0u08);
                            if (NachheizungTwunschSollu08==07u08) then {
                                sendrs232(0x07u08)
                            } endif;
                            sendrs232(NachheizungTwunschSollu08);
                            LueftungEWTRS232ChecksumCalc=LueftungEWTRS232ChecksumCalc+NachheizungTwunschSollu08;
                        
                            sendrs232(LueftungEWTRS232ChecksumCalc);
                            // Sende END
                            sendrs232(0x07u08,0x0fu08);
                        
                            LueftungEWTRS232UpdateRequest=AUS;
                            LueftungEWTRS232UpdateRequestDelayed=AUS;
                            RS232_AckPending=1u08
                        } endif
                        
                        
                        // RS232
                        RS232InChar=$$
                        RS232Inchar_count=0u16
                        RS232Buffer=$$
                        RS232Buffer_count=0u16
                        
                        RS232_PacketHeader=$$;        // Byte 0,1: Start (0x07 0xf0), Byte 2,3: Command, Byte 4: RS232_PacketPayloadSize
                        RS232_PacketPayload=$$;        // Packet Payload (RS232_PacketPayloadSize Bytes)
                        INVALID_RS232_PacketPayloadSize=254;    //65500u16;
                        RS232_PacketPayloadSize=INVALID_RS232_PacketPayloadSize;    // Packet Payload Size (in Bytes)
                        RS232_PacketChecksum=0u08;    // Checksum (1 Byte)
                        RS232_PacketEnd=$$;        // Byte x,x+1: End (0x07 0x0f)
                        
                        RS232_CommandPending=0u08;    // Notifier, if a new command is ready for checksum evaluation
                        RS232_CommandValid=$$;        // Command Code, if command is really valid (checksum is o.k.)
                        RS232_CommandCount=0;        // Number of valid commands
                        
                        RS232_AckPending=0u08;        // Notifier, that an Ack has not been received yet
                        RS232_PacketChecksumCalc=0u08;    // Checksum (calculated)
                        PayloadCounter=0u08;
                        
                        LueftungTempKomfort=0f16;
                        LueftungTempFrischluft=0f16;
                        LueftungTempZuluft=0f16;
                        LueftungTempAbluft=0f16;
                        LueftungTempFortluft=0f16;
                        LueftungTempEWT=0f16;
                        
                        LueftungTempKomfortSoll=0f16;    // << Default-Wert für Komforttemperatur, wird ca. 10mins nach Systemstart neu vom Lüftungsgerät gelesen
                        
                        // Parameter "EWT / Nachheizung abrufen"
                        LueftungTempEWTniedrig=6f16;
                        LueftungTempEWThoch=17f16;
                        LueftungEWTspeedup=0f16;
                        LueftungKuechenhaubespeedup=10f16;
                        NachheizungLeistung=0f16;
                        NachheizungLeistungIPar=0f16;
                        NachheizungTwunsch=0f16;
                        //LueftungBypassByte8=0f16;    // existiert nicht
                        
                        LueftungTempEWTniedrigSoll=8f16;
                        LueftungTempEWThochSoll=18f16;
                        LueftungEWTspeedupSoll=1f16;             // Dummy-Wert
                        LueftungKuechenhaubespeedupSoll=0f16;
                        NachheizungTwunschSoll=0f16;
                        
                        LueftungEWTRS232UpdateRequest=AUS;
                        LueftungEWTRS232UpdateRequestDelayed=AUS;
                        LueftungEWTRS232validRXdata=AUS;
                        LueftungTempEWTniedrigSollu08=0u08;
                        LueftungTempEWThochSollu08=0u08;
                        LueftungEWTspeedupSollu08=0u08;
                        LueftungKuechenhaubespeedupSollu08=0u08;
                        NachheizungTwunschSollu08=0u08;
                        LueftungEWTRS232ChecksumCalc=0u08;
                        
                        LueftungZuluftProzent=0f16;
                        LueftungAbluftProzent=0f16;
                        LueftungZuluftDrehzahl=0f32;
                        LueftungAbluftDrehzahl=0f32;
                        
                        LueftungBypassProzent=0f16;
                        LueftungVorheizung=0f16;
                        LueftungBypassMotorstrom=0f16;
                        LueftungVorheizungMotorstrom=0f16;
                        
                        LueftungBypassByte1=0f16;
                        LueftungBypassByte2=0f16;
                        LueftungBypassFaktor=0f16;
                        LueftungBypassStufe=0f16;
                        LueftungBypassKorrektur=0f16;
                        LueftungBypassByte6=0f16;
                        LueftungBypassSommermodus=0f16;
                        
                        // ________________________________________ Lueftung ________________________________________
                        Luefterstufe=2u08;        // Default-Luefterstufe
                        if (wtime(7,00,00,WERKTAGS) and LueftungBetriebsmodusAutomatik) then Luefterstufe=1u08 endif // Luefterstufe auf "Away"
                        if (wtime(17,00,00,WERKTAGS) and LueftungBetriebsmodusAutomatik) then Luefterstufe=2u08 endif // Luefterstufe auf 2
                        
                        LueftungBetriebsmodusAutomatik=EIN                // Defaultwert beim PowerOn
                        
                        RS232rawdata=$$
                        len=0u16
                        StrNotFound=65535u16
                        SuccessCount=0
                        checksum=0u08
                        RXCmd=$$
                        debug_string=$$
                        
                        CmdStartPos=0u16
                        CmdAckPos=0u16
                        CmdEndPos=0u16
                        Cmd0x07Pos=0u16
                        
                        Result=0u16 //0u16
                        
                        CMDSTART=$xx$
                        if systemstart() then {
                            stringset(CMDSTART,0x07u08,0u16);
                            stringset(CMDSTART,0xF0u08,1u16)
                        } endif
                        CMDEND=$xx$
                        if systemstart() then {
                            stringset(CMDEND,0x07u08,0u16);
                            stringset(CMDEND,0x0Fu08,1u16)
                        } endif
                        Cmd0x07=$xx$
                        if systemstart() then {
                            stringset(Cmd0x07,0x07u08,0u16);
                            stringset(Cmd0x07,0x07u08,1u16)
                        } endif
                        CMDACK=$xx$
                        if systemstart() then {
                            stringset(CMDACK,0x07u08,0u16);
                            stringset(CMDACK,0xF3u08,1u16)
                        } endif
                        STRINGFF=$x$
                        if systemstart() then {
                            stringset(STRINGFF,0xffu08,0u16)
                        } endif
                        STRINGFE=$x$
                        if systemstart() then {
                            stringset(STRINGFE,0xfeu08,0u16)
                        } endif
                        
                        
                        if pbutton(ButtonLueftungcmd1ID,PageLueftungID)==1 then {
                             // Status "EWT / Nachheizung abrufen" (0x00 0xEB, Checksum: 98)
                            sendrs232(0x07u08,0xf0u08,0x00u08,0xebu08,0x00u08,0x98u08,0x07u08,0x0fu08);
                            RS232_AckPending=1u08
                        } endif
                        
                        if pbutton(ButtonLueftungcmd3ID,PageLueftungID)==1 then {
                             // Klappenstatus abrufen (0x00 0x0D, Checksum: BA)
                            sendrs232(0x07u08,0xf0u08,0x00u08,0x0du08,0x00u08,0xbau08,0x07u08,0x0fu08);
                            RS232_AckPending=1u08
                        } endif
                        
                        if pbutton(ButtonLueftungcmd4ID,PageLueftungID)==1 then {
                             // Status Bypassregelung abrufen (0x00 0xDF, Checksum: 8C)
                            sendrs232(0x07u08,0xf0u08,0x00u08,0xdfu08,0x00u08,0x8cu08,0x07u08,0x0fu08);
                            RS232_AckPending=1u08
                        } endif
                        
                        
                        if (Luefterstufe==1) then {
                            sendrs232(0x07u08,0xf0u08,0x00u08,0x99u08,0x01u08,0x01u08,0x48u08,0x07u08,0x0fu08);
                            RS232_AckPending=1u08
                        } endif
                        
                        if (Luefterstufe==2) then {
                            sendrs232(0x07u08,0xf0u08,0x00u08,0x99u08,0x01u08,0x02u08,0x49u08,0x07u08,0x0fu08);
                            RS232_AckPending=1u08
                        } endif
                        
                        if (Luefterstufe==3) then {
                            sendrs232(0x07u08,0xf0u08,0x00u08,0x99u08,0x01u08,0x03u08,0x4au08,0x07u08,0x0fu08);
                            RS232_AckPending=1u08
                        } endif
                        
                        if (Luefterstufe==4) then {
                            sendrs232(0x07u08,0xf0u08,0x00u08,0x99u08,0x01u08,0x04u08,0x4bu08,0x07u08,0x0fu08);
                            RS232_AckPending=1u08
                        } endif
                        
                        // Zeichen von der RS232-Schnittstelle abholen
                        if (event(readrs232(RS232rawdata,len)) or ((cycle(0,1) or after(cycle(0,1),250u64) or after(cycle(0,1),500u64) or after(cycle(0,1),750u64)) and (len>0u16)) ) then {
                            // Einzelnes Zeichen von RS232 einlesen und in "RS232Buffer" anhaengen
                            if len>0u16 then {
                                RS232InChar=split(RS232rawdata,0u16,0u16);
                                if (stringcast(RS232InChar,0u08,0u16)==0x00) then {
                                    RS232InChar=STRINGFF
                                } endif;
                                RS232Buffer=RS232Buffer + RS232InChar;
                                // Raw-Puffer zuruecksetzen
                                RS232rawdata=split(RS232rawdata,1u16,EOS);
                                len=len-1u16;
                                RS232Inchar_count=RS232Inchar_count+1u16;
                                RS232Buffer_count=RS232Buffer_count+1u16
                            } endif
                        } endif
                        
                        // (Eigenen) RS232-Puffer auswerten
                        if (change (RS232Buffer) or cycle(0,4)) and (RS232Buffer_count>1u16) then {
                            // Suche START oder ACK, andernfalls alles verwerfen
                            CmdStartPos=find(RS232Buffer,CMDSTART,0u16);
                            CmdEndPos=find(RS232Buffer,CMDEND,0u16);
                            // START ohne END
                            // START und END und letztes Kommando wurde abgearbeitet
                            if ( (CmdStartPos != StrNotFound) and (CmdEndPos != StrNotFound) and (CmdStartPos < CmdEndPos) and \\
                            (RS232_CommandPending==0u08) ) then {
                                // Erst ab dem Payload suchen (damit die Payloadlaenge von 0x07 nicht gefunden wird)
                                Cmd0x07Pos=find(split(RS232Buffer,CmdStartPos+5u16,EOS),Cmd0x07,0u16);
                                if (Cmd0x07Pos!= StrNotFound) then {
                                    RS232Buffer=split(RS232Buffer,0u16,Cmd0x07Pos+5u16)+split(RS232Buffer,Cmd0x07Pos+2u16+5u16,EOS);
                                    RS232Buffer_count=RS232Buffer_count-1u16;
                                    CmdEndPos=CmdEndPos-1u16
                                } endif;
                                RS232_PacketHeader=split(RS232Buffer,CmdStartPos,CmdStartPos+3u16);
                                RS232_PacketPayloadSize=stringcast(RS232Buffer,0u08,CmdStartPos+4u16);
                                if (RS232_PacketPayloadSize != 0u08) then {
                                    RS232_PacketPayload= \\
                                    split(RS232Buffer,CmdStartPos+5u16,CmdStartPos+4u16+convert(RS232_PacketPayloadSize,0u16))
                                } endif;
                                RS232_PacketChecksum=stringcast(RS232Buffer,0u08, \\
                                CmdStartPos+5u16+convert(RS232_PacketPayloadSize,0u16));
                                RS232Buffer=split(RS232Buffer,CmdEndPos+2u16,EOS);
                                RS232Buffer_count=RS232Buffer_count-(CmdEndPos+2u16);
                                // Pruefsummenberechnung: Zunaechst Kommandocode und Payloadsize addieren
                                // (es fehlt noch das Payload und die 173 !) --< ### todo ###
                                RS232_PacketChecksumCalc=stringcast(RS232_PacketHeader,0u08,3u16)+RS232_PacketPayloadSize;
                                PayloadCounter=0u08;
                        //     ### vvv hier fehlt noch das eval() --> FEHLER!!??!! ###
                                if (PayloadCounter<RS232_PacketPayloadSize) then {
                                    PayloadCounter=PayloadCounter+1u08;
                                    RS232_PacketChecksumCalc=RS232_PacketChecksumCalc+ \\
                                    stringcast(RS232_PacketPayload,0u08,convert(PayloadCounter,0u16));
                                } endif;
                                // vvv voruebergehend keine Pruefsumme auswerten ### todo ###
                                RS232_CommandPending=1u08;
                            } endif;
                            CmdAckPos=find(RS232Buffer,CMDACK,0u16);
                            // Falls nur ein ACK oder nur ENDE+ACK gefunden wird --> bis zum ACK alles verwerfen
                            if ( ( (CmdStartPos == StrNotFound) and (CmdEndPos == StrNotFound) and (CmdAckPos != StrNotFound) ) or \\
                            ( (CmdStartPos == StrNotFound) and (CmdEndPos != StrNotFound) and (CmdAckPos != StrNotFound) )  ) then {
                                RS232_AckPending=0u08;
                                RS232Buffer=split(RS232Buffer,CmdAckPos+2u16,EOS);
                                RS232Buffer_count=RS232Buffer_count-(CmdAckPos+2u16)
                            } endif;
                        } endif
                        if (RS232_CommandPending==1u08) then {
                            debug_string=debug_string+$P$c1400;
                            // Pruefen auf Antwort: 0x00 0xD2 (=Antwort auf "Temperaturen abrufen")
                            if ( \\
                            (stringcast(RS232_PacketHeader,0u08,3u16)==0xd2) and \\
                            (RS232_PacketPayloadSize==9u08) \\
                            ) then {
                                LueftungTempKomfort=convert(stringcast(RS232_PacketPayload,0u08,0u16),0f16)/2f16-20f16;
                                LueftungTempKomfortSoll=LueftungTempKomfort;
                                LueftungTempFrischluft=convert(stringcast(RS232_PacketPayload,0u08,1u16),0f16)/2f16-20f16;
                                LueftungTempZuluft=convert(stringcast(RS232_PacketPayload,0u08,2u16),0f16)/2f16-20f16;
                                LueftungTempAbluft=convert(stringcast(RS232_PacketPayload,0u08,3u16),0f16)/2f16-20f16;
                                LueftungTempFortluft=convert(stringcast(RS232_PacketPayload,0u08,4u16),0f16)/2f16-20f16;
                                LueftungTempEWT=convert(stringcast(RS232_PacketPayload,0u08,6u16),0f16)/2f16-20f16
                            } endif;
                            // Pruefen auf Antwort: 0x00 0x0C (=Antwort auf "Drehzahlen abrufen")
                            if ( \\
                            (stringcast(RS232_PacketHeader,0u08,3u16)==0x0c) and \\
                            (RS232_PacketPayloadSize==6u08) \\
                            ) then {
                                LueftungZuluftProzent=convert(stringcast(RS232_PacketPayload,0u08,0u16),0f16);
                                LueftungAbluftProzent=convert(stringcast(RS232_PacketPayload,0u08,1u16),0f16);
                                LueftungZuluftDrehzahl=1875000f32/ \\
                                (convert(stringcast(RS232_PacketPayload,0u08,2u16),0f32)*256f32 + \\
                                convert(stringcast(RS232_PacketPayload,0u08,3u16),0f32));
                                LueftungAbluftDrehzahl=1875000f32/ \\
                                (convert(stringcast(RS232_PacketPayload,0u08,4u16),0f32)*256f32 + \\
                                convert(stringcast(RS232_PacketPayload,0u08,5u16),0f32))
                            } endif;
                            // Pruefen auf Antwort: 0x00 0x0E (=Antwort auf "Klappenstatus abrufen")
                            if ( \\
                            (stringcast(RS232_PacketHeader,0u08,3u16)==0x0e) and \\
                            (RS232_PacketPayloadSize==4u08) \\
                            ) then {
                                LueftungBypassProzent=convert(stringcast(RS232_PacketPayload,0u08,0u16),0f16);
                                LueftungVorheizung=convert(stringcast(RS232_PacketPayload,0u08,1u16),0f16);
                                LueftungBypassMotorstrom=convert(stringcast(RS232_PacketPayload,0u08,2u16),0f16);
                                LueftungVorheizungMotorstrom=convert(stringcast(RS232_PacketPayload,0u08,3u16),0f16)
                            } endif;
                            // Pruefen auf Antwort: 0x00 0xE0 (=Antwort auf "Status Bypassregelung abrufen")
                            if ( \\
                            (stringcast(RS232_PacketHeader,0u08,3u16)==0xe0) and \\
                            (RS232_PacketPayloadSize==7u08) \\
                            ) then {
                                LueftungBypassByte1=convert(stringcast(RS232_PacketPayload,0u08,0u16),0f16);
                                LueftungBypassByte2=convert(stringcast(RS232_PacketPayload,0u08,1u16),0f16);
                                LueftungBypassFaktor=convert(stringcast(RS232_PacketPayload,0u08,2u16),0f16);
                                LueftungBypassStufe=convert(stringcast(RS232_PacketPayload,0u08,3u16),0f16);
                                LueftungBypassKorrektur=convert(stringcast(RS232_PacketPayload,0u08,4u16),0f16);
                                LueftungBypassByte6=convert(stringcast(RS232_PacketPayload,0u08,5u16),0f16);
                                LueftungBypassSommermodus=convert(stringcast(RS232_PacketPayload,0u08,6u16),0f16)
                            } endif;
                            // Pruefen auf Antwort: 0x00 0xEC (=Antwort auf "EWT / Nachheizung abrufen")
                            if ( \\
                            (stringcast(RS232_PacketHeader,0u08,3u16)==0xec) \\
                            ) then {
                                LueftungTempEWTniedrig=convert(stringcast(RS232_PacketPayload,0u08,0u16),0f16);
                                LueftungTempEWTniedrigSoll=LueftungTempEWTniedrig;
                                LueftungTempEWThoch=convert(stringcast(RS232_PacketPayload,0u08,1u16),0f16);
                                LueftungTempEWThochSoll=LueftungTempEWThoch;
                                LueftungEWTspeedup=convert(stringcast(RS232_PacketPayload,0u08,2u16),0f16);
                                if LueftungEWTspeedup>254f16 then {
                                    LueftungEWTspeedup=0f16
                                } endif;
                                LueftungEWTspeedupSoll=LueftungEWTspeedup;
                                LueftungKuechenhaubespeedup=convert(stringcast(RS232_PacketPayload,0u08,3u16),0f16);
                                if LueftungKuechenhaubespeedup>254f16 then {
                                    LueftungKuechenhaubespeedup=0f16
                                } endif;
                                LueftungKuechenhaubespeedupSoll=LueftungKuechenhaubespeedup;
                                NachheizungLeistung=convert(stringcast(RS232_PacketPayload,0u08,4u16),0f16);
                                NachheizungLeistungIPar=convert(stringcast(RS232_PacketPayload,0u08,5u16),0f16);
                                NachheizungTwunsch=convert(stringcast(RS232_PacketPayload,0u08,6u16),0f16);
                                if NachheizungTwunsch>254f16 then {
                                    NachheizungTwunsch=0f16
                                } endif;
                                NachheizungTwunschSoll=NachheizungTwunsch;
                                LueftungEWTRS232validRXdata=EIN
                            } endif;
                            RS232_CommandPending=0u08
                        } endif

                        Kommentar


                          #13
                          Ich werde mir das auch mal anschauen. Ggf. bauen wir noch Funktionen ein, die derartige Aufgaben etwas erleichtern. Z.B. die Sache mit den Nullbytes oder den beiden 0x7.
                          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                          Enertex Produkte kaufen

                          Kommentar


                            #14
                            Hallo SnowMaKeR,
                            hallo Forum,

                            wie ist die Lage - konnte jemand mit meinem Code (siehe oben) etwas anfangen?
                            Kommentare / Erweiterungen / Verbesserungen?

                            Viele Grüße

                            Bernd

                            Kommentar


                              #15
                              zur Zeit sind wir auf der L&B, also erst in zwei Wochen...
                              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                              Enertex Produkte kaufen

                              Kommentar

                              Lädt...
                              X