Ankündigung

Einklappen
Keine Ankündigung bisher.

Anlagenstatus einer Alpha Innotec Wärmepumpe (Luxtronik 1.0)

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

    Anlagenstatus einer Alpha Innotec Wärmepumpe (Luxtronik 1.0)

    Hallo Zusammen,

    ich möchte den Anlagenstatus einer Alpha Innotec Wärmepumpe mit Luxtronik 1.0 Steuerung (RS232 Schnittstelle) vom EibPC abfragen.

    Die Wärmepumpe reagiert auf den ASCII Request 1800 mit folgendem Feedback:

    // Header
    1800;8
    // Temperaturwerte
    1100;12;256;254;267;261;50;445;450;125;121;750;200 ;0
    // Status WP-Eingänge
    1200;6;1;1;0;1;1;0
    // Status WP-Ausgänge
    1300;13;0;0;1;1;0;1;0;0;0;0;0;0;0
    // Ablaufzeiten
    1400;29;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;3;0;0;0;0; 0;38;0;0;0;0;0;0
    // Betriebsstunden
    1450;9;3628317;2161;1678;3121663;2162;1443;372727; 0;6230122
    // Sub-Header
    1500;5
    // Fehlermeldung 1 (z.B. Fehler 709, vom 22.11.2008 11.54 Uhr)
    1500;1500;6;709;22;11;8;11;54
    // Fehlermeldung 2
    1500;1501;6;715;22;11;8;12;4
    // Fehlermeldung 3
    1500;1502;6;709;22;11;8;12;4
    // Fehlermeldung 4
    1500;1503;6;711;11;12;8;20;24
    // Fehlermeldung 5
    1500;1504;6;708;13;12;8;14;9
    // Sub-Footer
    1500;5
    // Sub-Header
    1600;5
    // Abschaltung 1 (z.B. Abschaltgrund 010, vom 19.12.2008 12.32 Uhr)
    1600;1600;6;010;19;12;8;12;32
    // Abschaltung 2
    1600;1601;6;010;19;12;8;14;54
    // Abschaltung 3
    1600;1602;6;010;19;12;8;17;10
    // Abschaltung 4
    1600;1603;6;010;19;12;8;19;31
    // Abschaltung 5
    1600;1604;6;010;19;12;8;21;14
    // Sub-Footer
    1600;5
    // Anlagenstatus
    1700;12;2;V2.33;1;5;19;12;8;10;42;12;0;1
    // Footer
    1800;8

    Anmerkung:

    1100 ist z.B. der Datensatz zu den Temperaturen mit 12 Einzelwerten (z.B. 256 = 25,6°C)

    1100;12;“Vorlauftemperatur Heizkreis“;“Rücklauftemperatur Heizkreis“;“Rücklauf-Soll Heizkreis“;
    “Heissgastemperatur“;“Außentemperatur“;“ Brauchwarmwasser Ist-Temperatur“;
    “Brauchwarmwasser Soll-Temperatur“;“Wärmequellen-Eintrittstemperatur“;“ Wärmequellen-Austrittstemperatur“;
    “Mischkreis 1 Vorlauftemperatur“;“ Mischkreis 1 Vorlauf-Soll-Temperatur“;“Raumstation“


    Bis hier bin ich bisher mit der Programmierung gekommen:

    [highlight=epc]
    // Datenauswertung von Alpha Innotec Wärmepumpen über RS232 (Luxtronik 1.0)
    rawdata=$$
    len=0u16
    Buffer=$$
    // Request 1800 für den Anlagenstatus alle 5 Minuten über RS232 senden
    if cycle(5,0) then sendrs232($1800$) endif
    // Empfangen des Anlagenstatus über RS232
    if event(readrs232(rawdata,len)) then {
    Buffer=Buffer + split(rawdata,0u16,len);
    len=0u16
    } endif
    // Einzelwerte zu den Temperaturen definieren
    Heizkreis_Ist_Vorlauftemperatur=0.0
    Heizkreis_Ist_ Rücklauftemperatur=0.0
    Heizkreis_Soll_Rücklauftemperatur=0.0
    Heissgastemperatur=0.0
    Außentemperatur=0.0
    Brauchwarmwasser_Ist_Temperatur=0.0
    Brauchwarmwasser_Soll_Temperatur=0.0
    Wärmequellen_Eintrittstemperatur=0.0
    Wärmequellen_Austrittstemperatur=0.0
    Mischkreis_1_Ist_Vorlauftemperatur=0.0
    Mischkreis_1_Soll_Vorlauftemperatur=0.0
    Raumstation=0.0
    // Einzelwerte zu den Wärmepumpeneingängen definieren
    Abtau_Soledruck_Durchfluss=0u16
    Sperrzeit_vom_EVU=0u16
    Hochdruckpressostat=0u16
    Motorschutz=0u16
    Niederdruckpressostat=0u16
    Anschluss_einer_Fremdstromanode=0u16
    // Einzelwerte zu den Wärmepumpenausgängen definieren
    Abtauventil=0u16
    Brauchwarmwasserumwälzpumpe=0u16
    Fußbodenheizungsumwälzpumpe=0u16
    Heizungsumwälzpumpe=0u16
    Mischer_1_Auf=0u16
    Mischer_1_Zu=0u16
    Ventilation_des_Wärmepumpengehäuses=0u16
    Ventilator_Brunnen_oder_Soleumwälzpumpe=0u16
    Verdichter_1_in_Wärmepumpe=0u16
    Verdichter_2_in_Wärmepumpe=0u16
    Zusatzumwälzpumpe_Zirkulationspumpe=0u16
    Zweiter_Wärmeerzeuger_1=0u16
    Zweiter_Wärmeerzeuger_2_Sammelstörung=0u16
    // Einzelwerte zu den Ablaufzeiten definieren
    Wärmepumpe_läuft_seit=0t24
    Zweiter_Wärmeerzeuger_1_läuft_seit=0t24
    Zweiter_Wärmeerzeuger_2_läuft_seit=0t24
    Netzeinschaltverzögerung=0t24
    Standzeit_Schaltspielsperre=0t24
    Einschaltverzögerung_Schaltspielsperre=0t24
    Verdichter_Standzeit=0t24
    Heizungsregler_Mehr_Zeit=0t24
    Heizungsregler_Weniger_Zeit=0t24
    Thermische_Desinfektion_läuft_seit=0t24
    Sperre_Brauchwarmwasser=0t24
    // Einzelwerte zu den Betriebstunden definieren
    Betriebsstunden_Verdichter_1=0t24
    Impulse_Verdichter_1=0t24
    Durchschnittliche Laufzeit Verdichter_1=0t24
    Betriebsstunden_Verdichter_2=0t24
    Impulse_Verdichter_2=0t24
    Durchschnittliche_Laufzeit_Verdichter 2=0t24
    Betriebsstunden_Zweiter_Wärmeerzeuger_1=0t24
    Betriebsstunden_Zweiter_Wärmeerzeuger_2=0t24
    Betriebsstunden_Wärmepumpe=0t24
    // Einzelwerte zu den Fehlercodes definieren
    Fehler_1_Code=0u16
    Fehler_1_Datum=0d24
    Fehler_1_Uhrzeit=0t24
    Fehler_2_Code=0u16
    Fehler_2_Datum=0d24
    Fehler_2_Uhrzeit=0t24
    Fehler_3_Code=0u16
    Fehler_3_Datum=0d24
    Fehler_3_Uhrzeit=0t24
    Fehler_4_Code=0u16
    Fehler_4_Datum=0d24
    Fehler_4_Uhrzeit=0t24
    Fehler_5_Code=0u16
    Fehler_5_Datum=0d24
    Fehler_5_Uhrzeit=0t24
    // Einzelwerte zu den Abschaltungen definieren
    Abschaltung_1_Code=0u16
    Abschaltung_1_Datum=0d24
    Abschaltung_1_Uhrzeit=0t24
    Abschaltung_2_Code=0u16
    Abschaltung_2_Datum=0d24
    Abschaltung_2_Uhrzeit=0t24
    Abschaltung_3_Code=0u16
    Abschaltung_3_Datum=0d24
    Abschaltung_3_Uhrzeit=0t24
    Abschaltung_4_Code=0u16
    Abschaltung_4_Datum=0d24
    Abschaltung_4_Uhrzeit=0t24
    Abschaltung_5_Code=0u16
    Abschaltung_5_Datum=0d24
    Abschaltung_5_Uhrzeit=0t24
    // Einzelwerte zu dem Anlagenstatus definieren
    Wärmepumpentyp=0u16
    Software_Version=$$
    Bivalenzstufe=0u16
    Aktueller_Betriebszustand=0u16
    // Buffer parsen nach Temperaturwerten
    [/highlight]


    Im nächsten Schritt muß ich im Buffer nach den einzelnen Parameter-Kennungen suchen, wie z.B. 1100;12 für die Temperaturwerte und die darauf folgende Werte auslesen.

    Wie realisiere ich das Parsen am sinnvollsten?

    Außerdem frage ich mich, ob das Einlesen des Anlagenstatus in den Buffer so optimal läuft, da die einzelnen Zeilen (mit CRLF terminiert) im Buffer durch zwei Blanks getrennt sind.

    Viele Grüße

    Michael


    PS: Vielen Dank an Swenga für die sehr gute Schnittstellen-Dokumentation

    #2
    Zitat von Jambala Beitrag anzeigen
    Hallo Zusammen,
    ich möchte den Anlagenstatus einer Alpha Innotec Wärmepumpe mit Luxtronik 1.0 Steuerung (RS232 Schnittstelle) vom EibPC abfragen.
    Im nächsten Schritt muß ich im Buffer nach den einzelnen Parameter-Kennungen suchen, wie z.B. 1100;12 für die Temperaturwerte und die darauf folgende Werte auslesen.
    Wenn du die Positionen berechnen kannst, arbeite am besten mit split. Ansonste such nach den ; mit find und dann trenne den string auf. Kannst du mal den string anzeigen lassen (im Debugger)?
    PS: Vielen Dank an Swgenga für die sehr gute Schnittstellen-Dokumentation
    Hast du mal deinen link zu dieser Doku?
    Wenn
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    Kommentar


      #3
      Hier ist der Link zum von Swenga entwickelten Windows Software Gateway
      für AI Wärmepumpen:

      https://knx-user-forum.de/knx-eib-fo...rmepumpen.html

      Das Programm ist im Download Bereich zu finden.


      Hier ist der Link zur Protokollbeschreibung von Swenga:

      Alpha-InnoTec - Anschluss am PC klappt nicht - HaustechnikDialog

      Beitrag vom 30.12.2008 20:23:30


      Ich habe Dir auch eine erweiterte Beschreibung gemailt.

      Viele Grüße

      Michael

      Kommentar


        #4
        Hier ist der aktuelle String. Den Buffer muß ich aber anscheinend noch auf mehrere Strings ausdehnen, da die Nachricht am Sub-Header 1500;5 endet.

        % Wert von Objekt 381 (Buffer) abfragen:
        % /Users/michael/bin/Eib/nconf.bin -q 381 192.168.0.42
        % Wert von Objekt 381: 31 38 30 30 52 0d 0a 31 38 30 30 3b 38 0d 0a 31 31 30 30 3b 31 32 3b 32 34 34 3b 32 34 32 3b 32 32 32 3b 32 37 36 3b 33 30 3b 34 35 38 3b 34 35 30 3b 31 34 38 3b 31 36 35 3b 37 35 30 3b 32 30 30 3b 30 0d 0a 31 32 30 30 3b 36 3b 31 3b 31 3b 30 3b 31 3b 31 3b 30 0d 0a 31 33 30 30 3b 31 33 3b 30 3b 30 3b 31 3b 31 3b 30 3b 31 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 0d 0a 31 34 30 30 3b 32 39 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 3b 31 3b 31 33 3b 34 31 3b 30 3b 30 3b 30 3b 32 3b 34 34 3b 31 36 3b 30 3b 30 3b 30 3b 30 3b 30 3b 30 0d 0a 31 34 35 30 3b 39 3b 33 31 37 39 39 34 33 31 3b 36 32 36 33 3b 35 30 37 37 3b 30 3b 30 3b 30 3b 32 30 38 30 37 38 31 3b 30 3b 33 31 37 39 39 34 33 31 0d 0a 31 35 30 30 3b 35 0d 0a 31 35 30 30 3b 31 35 30 30 3b 36 3b 37 31 31 3b 31 32 3b 33 3b 37 3b 37 3b 39 0d 0a 31 35 30 30 3b 31 35 30 31 3b 36 3b 37 31 31 3b 31 32 3b 33 3b 37 3b 39 3b 34 34 0d 0a 31 35 30 30 3b 31 35 30 32 3b 36 3b 37 31 31 3b 31 32 3b 33 3b 37 3b 39 3b 34 34 0d 0a 31 35 30 30 3b 31 35 30 33 3b 36 3b 37 31 31 3b 37 3b 33 3b 39 3b 31 32 3b 35 31 0d 0a 31 35 30 30 3b 31 35 30 34 3b 36 3b 37 31 31 3b 37 3b 33 3b 39 3b 31 32 3b 35 31 0d 0a 31 35 30 30 3b 35 0d 0d 0a 31 36 30 30 3b 35 0d 0a 30 31 36 30 30 3b 31 36 30 30 3b 36 3b 30 31 30 3b 31 33 3b 31 31 3b 31 31 3b 32 33 3b 34 0d 0a 30 31 36 30 30 3b 31 36 30 31 3b 36 3b 30 31 30 3b 31 34 3b 31 31 3b 31 31 3b 39 3b 35 31 0d 0a 30 31 36 30 30 3b 31 36 30 32 3b 36 3b 30 31 30 3b 31 34 3b 31 31 3b 31 31 3b 31 34 3b 32 0d 0a 31 36 30 35 30 3b 31 36 30 33 3b 36 3b 30 31 30 3b 31 34 3b 31 31 3b 31 31 3b 31 39 3b 30 0d 0a 32 31 36 30 30 3b 31 36 30 34 3b 36 3b 30 31 30 3b 31 34 3b 31 31 3b 31 31 3b 32 32 3b 35 33 0d 0a 31 36 30 30 3b 35 0d 0d 0a 30 31 37 30 30 3b 31 32 3b 31 31 3b 20 56 32 2e 33 30 3b 31 3b 35 3b 31 34 3b 31 31 3b 31 31 3b 31 39 3b 37 3b 36 2c 30 2c 30 0d 0a 31 38 30 30 3b 38 0d 0d 0a 30 41 38 31 30 30 30 30 30 32 43 36 30 39 30 45 32 38 0d 0a 37 37 37 0d 0a 3b 57 30 31 34 34 0d 0a 37 37 37 0d 0a 39 52 0d 0a 37 37 37 0d 0a 37 57 30 41 42 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 0d 0a 37 37 37 0d 0a 3b 41 35 46 30 30 30 30 30 32 43 36 34 42 33 44 32 38 0d 0a 37 37 37 0d 0a 0a 57 30 31 34 34 0d 0a 37 37 37 0d 0a 42 0d 0a 37 37 37 0d 0a 37 41 35 46 30 30 30 30 30 32 43 36 34 42 33 44 32 38 0d 0a 0a 37 37 37 0d 0a 30 57 30 41 42 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 0d 0a 37 37 37 0d 0a 3b 52 0d 0a 37 37 37 0d 0a 46 41 44 39 30 30 30 30 30 32 43 35 44 32 33 30 32 38 0d 0a 37 37 37 0d 0a 0a 57 30 31 34 34 0d 0a 37 37 37 0d 0a 32 52 0d 0a 37 37 37 0d 0a 37 41 44 39 30 30 30 30 30 32 43 35 44 32 33 30 32 38 0d 0a 37 37 37 0d 0a 0a 57 30 41 42 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 0d 0a 37 37 37 0d 0a 3b 52 0d 0a 37 37 37 0d 0a 46 41 46 33 30 30 30 30 30 32 43 36 32 45 42 41 32 38 0d 0a 37 37 37 0d 0a 0a 57 30 31 34 34 0d 0a 37 37 37 0d 0a 45 52 0d 0a 37 37 37 0d 0a 37 41 46 33 30 30 30 30 30 32 43 36 32 45 42 41 32 38 0d 0a 37 37 37 0d 0a 0a 57 30 41 42 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 0d 0a 37 37 37 0d 0a 3b 52 0d 0a 37 37 37 0d 0a 46 41 46 45 30 30 30 30 30 32 42 37 33 34 42 46 32 38 0d 0a 37 37 37 0d 0a 0a 57 30 31 34 34 0d 0a 37 37 37 0d 0a 34 52 0d 0a 37 37 37 0d 0a 37 41 46 45 30 30 30 30 30 32 42 37 33 34 42 46 32 38 0d 0a 37 37 37 0d 0a 0a 57 30 41 42 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 0d 0a 37 37 37 0d 0a 3b 52 0d 0a 37 37 37 0d 0a 46 41 43 31 30 30 30 30 30 32 43 35 43 33 37 34 32 38 0d 0a 37 37 37 0d 0a 0a 0d 0a 37 37 37 0d 0a 30 52 0d 0a 37 37 37 0d 0a 32 57 30 41 42 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 0d 0a 37 37 37 0d 0a 3b 52 0d 0a 37 37 37 0d 0a 46 41 33 30 30 30 30 30 30 32 43 35 45 46 31 31 32 38 0d 0a 37 37 37 0d 0a 0a 57 30 31 34 34 0d 0a 37 37 37 0d 0a 46 52 0d 0a 37 37 37 0d 0a 37 41 33 30 30 30 30 30 30 32 43 35 45 46 31 31 32 38 0d 0a 37 37 37 0d 0a 0a 57 30 41 42 45 30 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 0d 0a 37 37 37 0d 0a 37 0d 0a 37 37 37 0d 0a 46 41 34 35 30 30 30 30 30 32 43 36 31 45 31 38 32 38 0d 0a 37 37 37 0d 0a 37 38 30 0d 0a 0a 57 30 31 34 34 0d 0a 37 37 00 {2011-11-15 00:17:29}
        % Typ: erweiterter Text
        % Wert: 1800R 1800;8 1100;12;244;242;222;276;30;458;450;148;165;750;200 ;0 1200;6;1;1;0;1;1;0 1300;13;0;0;1;1;0;1;0;0;0;0;0;0;0 1400;29;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;13;41;0;0;0; 2;44;16;0;0;0;0;0;0 1450;9;31799431;6263;5077;0;0;0;2080781;0;31799431 1500;5
        %
        %

        Kommentar


          #5
          Grundsätzlich sind bei Variablen keine Umlaute oder Sonderzeichen erlaubt.
          Das Parsen musst Du gemäß Protokolldefinition Stück für Stück durchführen. Da ein Buffer nicht aussreicht, sind mehrere zu nutzen.
          Das mit CRLF lässt sich durch Überspringen am Ende erreichen bzw. könnte man auch einen eigenen String definieren und mit find suchen.
          [highlight=epc]
          [EibPC]
          rawdata=$$
          len=0u16
          // Die Daten übersteigen 1400 Bytes
          Buffer1=$$
          Buffer2=$$
          // Request 1800 für den Anlagenstatus alle 5 Minuten über RS232 senden
          if cycle(5,0) then sendrs232($1800$);ReadReady=AUS endif

          //
          ReadReady=AUS
          // Empfangen des Anlagenstatus über RS232
          if event(readrs232(rawdata,len)) then {
          /* 1. Durchlauf: da Länge>1400 Byte */;
          if !ReadReady then {
          Buffer1=split(rawdata,0u16,len)
          } endif;
          /* 2. Durchlauf */;
          if ReadReady then {
          Buffer2=split(rawdata,0u16,len)
          } endif;
          ReadReady=EIN
          } endif

          PosStart=0u16
          PosEnd=0u16
          Wert=$$
          if change(Buffer1) then {
          PosStart=find(Buffer1,$;$,0u16);
          PosEnd=find(Buffer1,$;$,PosStart+1u16);
          Wert=split(Buffer1,PosStart,PosEnd);
          /* MyVal_F16=convert(Wert,0.0f16) */;
          /* 2-ter Wert */;
          PosStart=PosEnd;
          PosEnd=find(Buffer1,$;$,PosStart+1u16);
          Wert=split(Buffer1,PosStart,PosEnd);
          /* 3-ter Wert */;
          PosStart=PosEnd;
          PosEnd=find(Buffer1,$;$,PosStart+1u16);
          Wert=split(Buffer1,PosStart,PosEnd)
          } endif
          // Analog mit 2. Buffer
          [/highlight]
          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
          Enertex Produkte kaufen

          Kommentar


            #6
            Bist du denn hier weiter?
            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
            Enertex Produkte kaufen

            Kommentar


              #7
              Wirklich weiter bin ich noch nicht...

              Die Alpha Innotec Schnittstelle liefert beim ASCII Request 1800 mehrmals brav eine strukturierte Antwort in den EibPC Buffer.

              Nach mehrmaligem zyklischem Abfragen im 5 Min. Takt kommt aber eine vollkommen unstrukturierte Antwort von der Wärmepumpe.

              Ich habe jetzt erstmal einen USB/RS232 Adapter bestellt und schaue mir das Verhalten mit der Alpha Innotec Windows Software und Wireshark noch einmal ohne EibPC an.

              Dummerweise erkennt die Alpha Innotec Windows Software den USB/RS232 Adapter bisher nicht.

              Kommentar


                #8
                Hallo Michael,

                die von Dir angepaßte Einleseroutine:

                [highlight=epc]
                rawdata=$$
                len=0u16
                // Verwendung von zwei Buffern, da die Datenmenge 1400 Bytes übersteigt
                Buffer1=$$
                Buffer2=$$
                // Senden der Anfrage zum Anlagenstatus über RS232 (Request 1800)
                if cycle(5,0) then \\
                sendrs232($1800$); \\
                ReadReady=AUS \\
                endif
                ReadReady=AUS
                // Empfangen des Anlagenstatus über RS232
                if event(readrs232(rawdata,len)) then {
                /* 1. Durchlauf: da Länge>1400 Byte */;
                if !ReadReady then {
                Buffer1=split(rawdata,0u16,len)
                } endif;
                /* 2. Durchlauf */;
                if ReadReady then {
                Buffer2=split(rawdata,0u16,len)
                } endif;
                ReadReady=EIN
                } endif
                [/highlight]

                beinhaltet nach dem ersten Durchlauf nur noch "1800", nach dem zweiten Durchlauf "18001800" und nach dem dritten "180018001800".

                Eigentlich sollte die Antwort ja mit 1800 anfangen und danach die Statuswerte folgen. Liegt dies vielleicht an dem ReadReady Ablauf?

                Viele Grüße

                Michael


                % Wert von Objekt 508 (Buffer1) abfragen:
                % /Users/michael/bin/Eib/nconf.bin -q 508 192.168.0.42
                % Wert von Objekt 508: 31 38 30 30 31 38 30 30 31 38 30 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 {2011-12-28 13:50:56}
                % Typ: erweiterter Text
                % Wert: 1800180018000

                Kommentar


                  #9
                  Zitat von Jambala Beitrag anzeigen
                  Hallo Michael,
                  Eigentlich sollte die Antwort ja mit 1800 anfangen und danach die Statuswerte folgen. Liegt dies vielleicht an dem ReadReady Ablauf?
                  Das weiss ich nicht. Aber ich sehe, dass offenbar nur ein einziges Telegramm per RS232 der Länge len eintrifft. Was das zu bedeuten hat, liegt dann an der Luxtronic. Immerhin antwortet die schon. Schau Dir doch den Wert len mal an, das ist die Länge im Buffer. Ggf. auch mal mit dem Hyperterminal o.ä. die Sache genauer debuggen.
                  offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                  Enertex Produkte kaufen

                  Kommentar


                    #10
                    Hallo Michael,

                    mit Hyperterminal ist die Abfrage problemlos möglich (unabhängig ob die Flußsteuerung aus oder auf Xon/Xoff gesetzt ist).

                    Ich tippe einfach 1800 ein und drücke Return.

                    Dann erhalte ich sofort dies zurück:

                    1800;8
                    1100;12;256;254;213;256;70;451;450;120;130;750;200 ;0
                    1200;6;1;1;0;1;1;0
                    1300;13;0;0;1;1;0;1;0;0;0;0;0;0;0
                    1400;29;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;36;24;0;0;0; 1;36;24;0;0;0;0;0;0
                    1450;9;32930185;6433;5118;0;0;0;2080781;0;32930185
                    1500;5
                    1500;1500;6;711;12;3;7;7;9
                    1500;1501;6;711;12;3;7;9;44
                    1500;1502;6;711;12;3;7;9;44
                    1500;1503;6;711;7;3;9;12;51
                    1500;1504;6;711;7;3;9;12;51
                    1500;5
                    1600;5
                    1600;1600;6;010;28;12;11;11;9
                    1600;1601;6;010;28;12;11;12;26
                    1600;1602;6;010;28;12;11;17;44
                    1600;1603;6;010;28;12;11;19;0
                    1600;1604;6;010;28;12;11;21;0
                    1600;5
                    1700;12;11; V2.30;1;5;28;12;11;17;44;47,0,0
                    1800;8


                    Mit dem EibPC Prozess kommt auch über Stunden immer nur wieder die 1800 zurück.

                    Muß ich neben der 1800 noch irgendwie CRLF mitschicken?

                    Ich bin ehrlich gesagt total ratlos.

                    Viele Grüße

                    Michael



                    [highlight=epc]
                    [RS232]
                    // -----------------------------------------------------------------------------------------------------------
                    // RS232-Konfiguration: Baudrate, Datenbits, Stoppbits, Parität, Flusssteuerung
                    // -----------------------------------------------------------------------------------------------------------
                    //
                    // Baudrate: Zulässige Werte = 0 , 50 , 75 , 110 , 134 , 150 , 200 , 300 , 600 , 1200 , 1800 , 2400 , 4800,
                    // 9600 , 19200, 38400 , 57600 , 115200 oder 230400
                    57600
                    // Datenbits: Gültige Werte = 5, 6, 7 oder 8
                    8
                    // Stoppbits: Gültige Werte = 1 oder 2
                    1
                    // Parität: aus = 0, gerade = 1, ungerade = 2
                    0
                    // Flusssteuerung: aus = 0, RTS/CTS = 1, Xon/Xoff = 2
                    0

                    [EibPC]
                    rawdata=$$
                    len=0u16
                    // Verwendung von zwei Buffern, da die Datenmenge 1400 Bytes übersteigt
                    Buffer1=$$
                    Buffer2=$$
                    // Senden der Anfrage zum Anlagenstatus über RS232 (Request 1800)
                    if cycle(1,0) then \\
                    sendrs232($1800$); \\
                    ReadReady=AUS \\
                    endif
                    ReadReady=AUS
                    // Empfangen des Anlagenstatus über RS232
                    if event(readrs232(rawdata,len)) then {
                    /* 1. Durchlauf: da Länge>1400 Byte */;
                    if !ReadReady then {
                    Buffer1=split(rawdata,0u16,len)
                    } endif;
                    /* 2. Durchlauf */;
                    if ReadReady then {
                    Buffer2=split(rawdata,0u16,len)
                    } endif;
                    ReadReady=EIN
                    } endif
                    [/highlight]

                    Kommentar


                      #11
                      Zitat von Jambala Beitrag anzeigen
                      Hallo Michael,
                      mit Hyperterminal ist die Abfrage problemlos möglich (unabhängig ob die Flußsteuerung aus oder auf Xon/Xoff gesetzt ist).
                      Du musst schon genau sagen, was Du siehst und schickst, am besten den Rohpuffer mit zusätzlich als ASCI angezeigt.
                      Die RS232 macht kein CR mit rein, das müsstest Du selbst machen. Aber wie gesagt, zeig uns den Rohpuffer!
                      EDIT:
                      Hab mir http://www.bilder-space.de/show_img....original&o=yes angeschaut. Da steht deutlich, Du musst noch einen CR schicken.
                      also

                      [highlight=epc]
                      if cycle(5,0) then {
                      sendrs232($1800$,0xd);
                      ReadReady=AUS
                      }endif
                      [/highlight]
                      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                      Enertex Produkte kaufen

                      Kommentar


                        #12
                        Hallo Michael,

                        das war es. Ich hatte auch schon mit CR und CRLF herumprobiert, aber es immer in $...$ eingeschlossen.

                        Vielen Dank für den Hinweis. Nun kann ich mich an das parsen begeben.

                        Viele Grüße

                        Michael

                        Kommentar


                          #13
                          Alpha Innotec Wärmenpumpen Gateway v1.0

                          Hallo Zusammen,

                          die erste Version des Gateway läuft nun. Damit lassen sich die Temperaturkennwerte der Anlage automatisch auslesen.

                          Die Erweiterung auf die anderen Kennwerte folgt noch.

                          Viele Grüße

                          Michael


                          [highlight=epc]
                          // -----------------------------------------------------------------------------------------------------------
                          // RS232 Gateway für Alpha Innotec Wärmepumpen mit Luxtronik 1.0 Steuerung (bis Baujahr 2008)
                          // -----------------------------------------------------------------------------------------------------------
                          // - die Anbindung der Wärmepumpe erfolgt über sein serielles 1:1 Kabel (Pin 2&3 Data, Pin 5 GND)
                          // - die Wärmepumpe muß im Menüpunkt Einstellungen, Datenzugang auf Standard stehen (PIN 9445)
                          // - Schnittstellen-Parameter: 57600, 8, N, 1, Xon/Xoff
                          Rawdata=$$
                          Buffer=$$
                          Len=0u16
                          StartPos=0u16
                          EndPos=0u16
                          Data_Temperatur1=$$
                          Data_Eingaenge=$$
                          Data_Ausgaenge=$$
                          Data_Ablaufzeiten=$$
                          Data_Betriebsstunden=$$
                          // Request 1800 für den Anlagenstatus alle 5 Minuten über RS232 senden
                          sendrs232($1800$,0xd)
                          if cycle(5,0) then sendrs232($1800$,0xd) endif
                          // Empfangen des Anlagenstatus über RS232 und kopieren der ersten 1400 Zeichen in den Buffer
                          if event(readrs232(Rawdata,Len)) then \\
                          Buffer=Buffer+split(Rawdata,0u16,Len); \\
                          Len=0u16 \\
                          endif
                          // Parsen der einzelnen Informationsblöcke des Anlagenstatus
                          if change(Buffer) then \\
                          StartPos=0u16; \\
                          EndPos=0u16; \\
                          StartPos=find(Buffer,$1100;12;$,0u16)+size($1100;1 2;$); \\
                          EndPos=find(Buffer,$1200;6;$,0u16)-3u16; \\
                          Data_Temperatur1=split(Buffer,StartPos,EndPos); \\
                          Data_Temperatur1=Data_Temperatur1; \\
                          StartPos=find(Buffer,$1200;6;$,0u16)+size($1200;6; $); \\
                          EndPos=find(Buffer,$1300;13;$,0u16)-4u16; \\
                          Data_Eingaenge=split(Buffer,StartPos,EndPos); \\
                          Data_Eingaenge=Data_Eingaenge; \\
                          StartPos=find(Buffer,$1300;13;$,0u16)+size($1300;1 3;$); \\
                          EndPos=find(Buffer,$1400;29;$,0u16)-4u16; \\
                          Data_Ausgaenge=split(Buffer,StartPos,EndPos); \\
                          Data_Ausgaenge=Data_Ausgaenge; \\
                          StartPos=find(Buffer,$1400;29;$,0u16)+size($1400;2 9;$); \\
                          EndPos=find(Buffer,$1450;9;$,0u16)-3u16; \\
                          Data_Ablaufzeiten=split(Buffer,StartPos,EndPos); \\
                          Data_Ablaufzeiten=Data_Ablaufzeiten; \\
                          StartPos=find(Buffer,$1450;9;$,0u16)+size($1450;9; $); \\
                          EndPos=find(Buffer,$1500;5$,0u16)-3u16; \\
                          Data_Betriebsstunden=split(Buffer,StartPos,EndPos) ; \\
                          Data_Betriebsstunden=Data_Betriebsstunden; \\
                          endif
                          // Einzelwerte zu den Temperaturen definieren
                          WP_Temp_Heizkreis_Ist_Vorlauftemperatur=0.0
                          WP_Temp_Heizkreis_Ist_Ruecklauftemperatur=0.0
                          WP_Temp_Heizkreis_Soll_Ruecklauftemperatur=0.0
                          WP_Temp_Heissgastemperatur=0.0
                          WP_Temp_Aussentemperatur=0.0
                          WP_Temp_Brauchwarmwasser_Ist_Temperatur=0.0
                          WP_Temp_Brauchwarmwasser_Soll_Temperatur=0.0
                          WP_Temp_Waermequellen_Eintrittstemperatur=0.0
                          WP_Temp_Waermequellen_Austrittstemperatur=0.0
                          WP_Temp_Mischkreis_1_Ist_Vorlauftemperatur=0.0
                          WP_Temp_Mischkreis_1_Soll_Vorlauftemperatur=0.0
                          WP_Temp_Raumstation=0.0
                          // Sub-Buffer zur Zerteilung der Temperatur CSV Liste
                          Data_Temperatur1a=$$
                          Data_Temperatur1b=$$
                          // Parsen der einzelnen Temperaturwerte
                          if change(Data_Temperatur1) then \\
                          /* Parsen der Heizkreis_Ist_Vorlauftemperatur */; \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1,$;$,0u16)-1u16; \\
                          WP_Temp_Heizkreis_Ist_Vorlauftemperatur=convert(sp lit(Data_Temperatur1,StartPos,EndPos),0.0)*0.1; \\
                          /* Parsen der Heizkreis_Ist_Ruecklauftemperatur */; \\
                          StartPos=EndPos+2u16; \\
                          EndPos=1399u16; \\
                          Data_Temperatur1a=split(Data_Temperatur1,StartPos, EndPos); \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1a,$;$,0u16)-1u16; \\
                          WP_Temp_Heizkreis_Ist_Ruecklauftemperatur=convert( split(Data_Temperatur1a,StartPos,EndPos),0.0)*0.1; \\
                          /* Parsen der Heizkreis_Soll_Ruecklauftemperatur */; \\
                          StartPos=EndPos+2u16; \\
                          EndPos=1399u16; \\
                          Data_Temperatur1b=split(Data_Temperatur1a,StartPos ,EndPos); \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1b,$;$,0u16)-1u16; \\
                          WP_Temp_Heizkreis_Soll_Ruecklauftemperatur=convert (split(Data_Temperatur1b,StartPos,EndPos),0.0)*0.1 ; \\
                          /* Parsen der Heissgastemperatur */; \\
                          StartPos=EndPos+2u16; \\
                          EndPos=1399u16; \\
                          Data_Temperatur1a=split(Data_Temperatur1b,StartPos ,EndPos); \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1a,$;$,0u16)-1u16; \\
                          WP_Temp_Heissgastemperatur=convert(split(Data_Temp eratur1a,StartPos,EndPos),0.0)*0.1; \\
                          /* Parsen der Aussentemperatur */; \\
                          StartPos=EndPos+2u16; \\
                          EndPos=1399u16; \\
                          Data_Temperatur1b=split(Data_Temperatur1a,StartPos ,EndPos); \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1b,$;$,0u16)-1u16; \\
                          WP_Temp_Aussentemperatur=convert(split(Data_Temper atur1b,StartPos,EndPos),0.0)*0.1; \\
                          /* Parsen der Brauchwarmwasser_Ist_Temperatur */; \\
                          StartPos=EndPos+2u16; \\
                          EndPos=1399u16; \\
                          Data_Temperatur1a=split(Data_Temperatur1b,StartPos ,EndPos); \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1a,$;$,0u16)-1u16; \\
                          WP_Temp_Brauchwarmwasser_Ist_Temperatur=convert(sp lit(Data_Temperatur1a,StartPos,EndPos),0.0)*0.1; \\
                          /* Parsen der Brauchwarmwasser_Soll_Temperatur */; \\
                          StartPos=EndPos+2u16; \\
                          EndPos=1399u16; \\
                          Data_Temperatur1b=split(Data_Temperatur1a,StartPos ,EndPos); \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1b,$;$,0u16)-1u16; \\
                          WP_Temp_Brauchwarmwasser_Soll_Temperatur=convert(s plit(Data_Temperatur1b,StartPos,EndPos),0.0)*0.1; \\
                          /* Parsen der Waermequellen_Eintrittstemperatur */; \\
                          StartPos=EndPos+2u16; \\
                          EndPos=1399u16; \\
                          Data_Temperatur1a=split(Data_Temperatur1b,StartPos ,EndPos); \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1a,$;$,0u16)-1u16; \\
                          WP_Temp_Waermequellen_Eintrittstemperatur=convert( split(Data_Temperatur1a,StartPos,EndPos),0.0); \\
                          /* Parsen der Waermequellen_Austrittstemperatur */; \\
                          StartPos=EndPos+2u16; \\
                          EndPos=1399u16; \\
                          Data_Temperatur1b=split(Data_Temperatur1a,StartPos ,EndPos); \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1b,$;$,0u16)-1u16; \\
                          WP_Temp_Waermequellen_Austrittstemperatur=convert( split(Data_Temperatur1b,StartPos,EndPos),0.0); \\
                          /* Parsen der Mischkreis_1_Ist_Vorlauftemperatur */; \\
                          StartPos=EndPos+2u16; \\
                          EndPos=1399u16; \\
                          Data_Temperatur1a=split(Data_Temperatur1b,StartPos ,EndPos); \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1a,$;$,0u16)-1u16; \\
                          WP_Temp_Mischkreis_1_Ist_Vorlauftemperatur=convert (split(Data_Temperatur1a,StartPos,EndPos),0.0)*0.1 ; \\
                          /* Parsen der Mischkreis_1_Soll_Vorlauftemperatur */; \\
                          StartPos=EndPos+2u16; \\
                          EndPos=1399u16; \\
                          Data_Temperatur1b=split(Data_Temperatur1a,StartPos ,EndPos); \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1b,$;$,0u16)-1u16; \\
                          WP_Temp_Mischkreis_1_Soll_Vorlauftemperatur=conver t(split(Data_Temperatur1b,StartPos,EndPos),0.0)*0. 1; \\
                          /* Parsen der Raumstation */; \\
                          StartPos=EndPos+2u16; \\
                          EndPos=1399u16; \\
                          Data_Temperatur1a=split(Data_Temperatur1b,StartPos ,EndPos); \\
                          StartPos=0u16; \\
                          EndPos=find(Data_Temperatur1a,$;$,0u16)-1u16; \\
                          WP_Temp_Raumstation=convert(split(Data_Temperatur1 a,StartPos,EndPos),0.0); \\
                          endif
                          [/highlight]

                          Kommentar


                            #14
                            Hallo Michael,

                            Du hast kein Komfort-Modul (oder wie das Zusatzmodul gleich heisst) in Deiner Steuerung, oder?
                            Was mir auf den ersten Blick auffällt sind fehlende Temperaturwerte für Solarkollektoren und Solarspeicher.

                            Grüße
                            Matthias

                            Kommentar


                              #15
                              Hallo Matthias,

                              das Komfortmodul habe ich nicht. Dies ist doch diese Zusatzplatine für einen zweiten Heizkreis für Swimming Pool usw., oder?

                              Da Solarkollektoren selten in Kombination mit einer Wärmepumpe verbaut werden, sind diese Art Temperaturwerte vermutlich im Protokoll nicht vorgesehen.

                              Die Alpha Innotec PC Software Luxcontrol, auf welcher mit Hilfe Sniffing diese Umsetzung basiert, zeigt auch keine anderen Temperaturwerte an.

                              Du kannst aber dennoch einfach den Code so bei Dir installieren und Dir dann einmal mit dem Debugger den Buffer anschauen. Bei mir zeigt dieser Buffer 12 Einzeltemperaturwerte an, beginnend mit der Kennung 1100;12 (12 für 12 folgende Temperaturwerte.

                              Eventuell erscheinen dort in Zusammenhang mit der Komfortplatine mehr Werte. Diese dann auszulesen ist leicht möglich.

                              Alternativ verbinde einen PC mit Deiner Wärmepumpe (Details siehe in der Einleitung zum Code) und tippe über Hyperterminal 1800 als Request ein. Anschließend kannst Du in der Antwort hinter 1100;12 die Anzahl der Temperaturwerte anschauen.

                              Viele Grüße

                              Michael

                              Kommentar

                              Lädt...
                              X