Helios KWL (easycontrols) über modbus tcp einbinden

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Jan W.
    Lox Guru
    • 30.08.2015
    • 1245

    Helios KWL (easycontrols) über modbus tcp einbinden

    Hallo Forengemeinde,

    hier der verkürzte Thread aus dem alten Loxone Forum zu dem Thema. Es geht um die Einbindung der Helios KWL Lüftungsgeräte mit integrierter "easycontrols" Webschnittstelle in Loxone. Mein erster Ansatz direkt die Webschnittstelle anzusprechen funktioniert leider nicht, da die virtuellen HTTP Eingangsverbinder der Loxone nur ein HTTP GET unterstützen, aber die Helios Schnittstelle ein HTTP POST auch für das Auslesen verlangt. Diese in der HTTP Programmierung eher unübliche Variante wird leider von Loxone nicht unterstützt und wird es wohl in absehbarer Zeit auch nicht werden. Ich hatte bei Loxone ein Ticket zu einem Feature Request für HTTP POST für den virtuellen HTTP Eingangsverbinder gestellt, aber dies wurde leider abgelehnt (Ticket 861929) - sehr Schade. Zwei weitere Nachteile kommen noch hinzu: zum Einen erfordert "easycontrols" immer eine Anmeldung und diese muss regelmäßig aufgefrischt werden. Der zweite Nachteil ist der, dass die Variablen nicht einzeln gelesen bzw. geschrieben werden können, sondern nur als "Paket" über XML Dateien zurückgeliefert werden, die dann aufwändig durchsucht werden müssen. Das Webinterface der Helios finde ich zwar ordentlich strukturiert, aber etwas nervend, weil nach einer kurzen Zeit die Anmeldung gelöscht wird und bei mir dann ein Fehler kommt, dass die XML Daten nicht gelesen werden können. Eine zwangsweise Anmeldung im eigenen Haus finde ich auch umständlich. Da schaue ich lieber auf die Loxone App bzw. das Webinterface von Loxone.

    Ein anderer User aus dem alten Loxone Forum (nochmals Danke Axel!) hat mich aber auf die Idee gebracht, die Modbus TCP Schnittstelle zu verwenden, die ebenfalls von Helios mit unterstützt wird. Hinweise zu dieser Schnittstelle gibt es von Helios hier.

    Mittlerweile unterstützt Loxone ja Modbus TCP, allerdings nur "einfache" Abfragen bzw. Setzen einzelner Register. Helios macht es aber durch die Verwendung von Variablennamen und Werten, die als Strings kodiert werden sehr kompliziert. Für das Auslesen eines Wertes ist zunächst die entsprechende Variable zu schreiben - so etwas wird derzeit nicht auf der Loxone mit der Modbus TCP Funktion unterstützt. Da Helios hier eine aus meiner Sicht sehr unübliche und komplizierte Einbindung gewählt hat, ist die Wahrscheinlichkeit der Unterstützung von Loxone für diese Einbindung sehr gering.

    Zum Glück gibt es aber mit Pico C die Möglichkeit die modbus TCP Schnittstelle über die TCP "Streams" Funktionen auf der Loxone selbst zu programmieren. Hier die 2. Version des Pico-C Programmes. Das Auslesen bzw. Setzen von Werten funktioniert problemlos, die CPU Belastung der Loxone ist auch nur minimal gestiegen und es läuft sehr stabil.

    Die Reihenfolge der Parameter (alphabetisch) in der Visu ist nicht unbedingt so, wie man es gerne hätte. Dieser Wunsch ist ja schon mehrfach an Loxone herangetragen worden.

    Was im Code noch verbessert werden könnte, ist das Error-Handling: Falls die IP-Adresse der Helios Anlage nicht erreichbar ist, gibt die Funktion "stream_create" sauber einen NULL-Pointer zurück. Damit werden keine Werte mehr gelesen oder geschrieben. Ein Ausfalls während der Schleife hat allerdings zur Folge, dass die Werte auf -999 bzw. Error gesetzt werden. Der Zustand bleibt dann bis zur Behebung des Problems bestehen.

    Der Code hat etliche Kommentare und es sollte problemlos möglich sein, andere Variablen zu lesen oder zu schreiben. Eine Intelligenz, d.h. welche Lüfterstufe unter welchen Bedingungen eingestellt wird, sollte sinnvollerweise über Loxone Config realisiert und nicht in Pico C fest verdrahtet werden. Ich habe als Beispiel ein Screenshot meiner Loxone Config angehängt, um Neueinsteigern in diesen Bereich zu zeigen, wie ein Pico C Programm in die Loxone Config eingebunden wird. Eine Intelligenz ist noch nicht vorhanden - lediglich die manuelle Auswahl der Lüfterstufe über den Baustein "Radiotasten" und die Anzeige einiger Werte. Da ich die Stufe 0 z.B. für den manuellen Wechsel des Vorfilters praktisch finde, musste ich noch den Baustein "Subtrahierer" einfügen. Wer nur Stufe 1-4 steuern möchte, kann die Logik daher noch etwas vereinfachen. Die IP-Adresse im Pico-C muss natürlich noch an die IP-Adresse der eigenen Helios KWL Lüftungsanlage angepasst werden. Der Modbusserver in der Loxone wird nicht verwendet.

    Hintergrund: Die Implementierung des Modbus-Servers in der Loxone ist leider nicht kompatibel mit Helios, da der Baustein in der Loxone nur einfache Werte auslesen oder schreiben kann. Helios macht es aber sehr kompliziert und man muss z.B. eine auszulesende Variable zuerst als String schreiben, um den Wert anschließend als String wieder auslesen zu können. Dieser String muss dann noch in einen analogen Wert z.B. die Temperatur umgerechnet werden.

    Andere Hersteller verwenden einfach ein "Read Register X", um Variable X als 16- oder 32-Bit Integer Wert mit oder ohne Vorzeichen oder als 32-Bit Float auszulesen. Mit 65535 Registern gibt es sicherlich genügend Register, um alle Variablen eines Gerätes zu definieren. Dann würde ein Pico-C Skript nicht notwendig sein und man könnte mit den modbusTCP Sensoren bzw. Aktoren alle Variablen auslesen bzw. diese ändern. Einen Vorteil durch die Verwendung von Strings bei Helios sehe ich nicht, nur Nachteile.

    Warum Helios die modbus TCP Kommunikation so kompliziert gemacht hat, dass wissen wahrscheinlich nur deren Entwickler. Nach meiner Ansicht ist hier das Problem eindeutig von Helios verursacht worden und man kann nicht von Loxone erwarten, dass so eine umständliche Kommunikation in einem modbusTCP Baustein unterstützt wird. Falls irgendjemand mitliest, der einen direkten Draht zu Helios hat, kann ja mal nachfragen.

    Anhand der Anleitung von Helios zum modbus TCP Interface hatte ich mit dem Tool "modpoll" einen Parameter ausgelesen und geschrieben und die Kommunikation per Wireshark mitgeschnitten. So konnte ich den den genauen modbusTCP Header mitlesen. Zwei Punkte fehlen allerdings in der Doku von Helios: auf Seite 17 in der PDF wird auf eine Tabelle "Codierung" (Beschreibung der Fehler mit Nummern) verwiesen, die es gar nicht gibt. Der Parameter für die Abfrage des Bypass (offen oder zu) mit der Variablen "v02119" fehlt auch. Den habe ich beim Mitlesen der Kommunikation des Webinterfaces per Wireshark gefunden.

    Hinweis: Die aktuelle Version (derzeit 5.6) ist in der Loxwiki zu finden http://www.loxwiki.eu/pages/viewpage...pageId=1639038

    Hier noch die damals erstellten Screenshots zur früheren Version:

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: Bildschirmfoto 2015-07-26 um 22.14.08-2.png Ansichten: 2 Größe: 155,9 KB ID: 1083Klicke auf die Grafik für eine vergrößerte Ansicht  Name: Bildschirmfoto 2015-07-25 um 00.16.14-2.png Ansichten: 2 Größe: 119,4 KB ID: 1084
    Angehängte Dateien
    Zuletzt geändert von Jan W.; 13.01.2019, 15:46.
    Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
    Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
    Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
    Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
    Node-RED: IKEA Tradfri
  • uli
    LoxBus Spammer
    • 30.08.2015
    • 224

    #2
    Ich wollte nun auch mal Feedback geben. Das Programm läuft auf Anhieb einwandfrei und macht genau was es soll!!

    Vielen Dank für Deine Mühe, damit spart man sich die KNX-Schnittstelle. Ich nehme mal an, das ist auch ein Grund, warum es Helios dem Anwender schwer macht, anstatt die Standards so einfach wie möglich umzusetzen.

    Das einzige, was das Programm bei mir nicht macht, ist die aktuelle Lüfterstufe bei den Radiotasten nach einem Miniserver-Neustart anzuzeigen. Kann man das irgendwie bewerkstelligen?

    Kommentar

    • Gast

      #3
      Hallo Jan,


      ich bin auch gerade dabei meine KWL500 per Modbus auszulesen bzw. zu steuern.
      Aktuell noch mit nem Linux Rechner, aber ich habe auch angedacht, dies dann in die Loxone zu integrieren.
      Leider habe ich bis jetzt noch keine Aktivitäten in Richtung Loxone unternommen....
      Jetzt wurde ich auf deinen Beitrag hingewiesen....
      ...gute Arbeit! :-)

      Besteht die Möglichkeit, dass du mir das Programm einmal zukommen lässt?


      Vielen Dank.

      Gruß
      Christian


      Kommentar


      • Jan W.
        Jan W. kommentierte
        Kommentar bearbeiten
        Danke. Das Programm (Pico-C Skript) kannst Du über die o.a. Links direkt herunterladen. Das Skript dann als Inhalt in den Programmbaustein hineinkopieren. Mit dem ebenfalls hochgeladenen Loxone "Schaltplan" (Bildschirmfoto) sollte die Integration nicht allzu schwierig sein.
        Zuletzt geändert von Jan W.; 21.10.2015, 00:23.
    • Fuxi
      LoxBus Spammer
      • 26.08.2015
      • 255

      #4
      JAN:

      Danke für dieses tolle Programm !!
      So etwas habe ich immer gesucht !
      Funktioniert auf Anhieb einwandfrei !!

      Kommentar

      • Jan W.
        Lox Guru
        • 30.08.2015
        • 1245

        #5
        Danke. Hab jetzt das Skript in die Loxwiki portiert: http://www.loxwiki.eu/pages/viewpage...pageId=1639038
        Der Inhalt (Stand Okt. 2015) ist der gleiche wie oben.
        Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
        Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
        Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
        Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
        Node-RED: IKEA Tradfri

        Kommentar

        • Gast

          #6
          Topp!
          Vielen Dank.

          Kommentar

          • Jan W.
            Lox Guru
            • 30.08.2015
            • 1245

            #7
            Ich habe das Programm verbessert (Version 3):

            - auslesen der aktuellen Lüfterstufe bei Start des Skriptes
            - schreiben der Lüfterstufe nur, wenn in Loxone geändert wurde, sonst auslesen
            (erlaubt paralleles Ändern der Lüfterstufe im easycontrols webinterface)

            Link ist unten.

            Gruß Jan
            Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
            Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
            Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
            Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
            Node-RED: IKEA Tradfri

            Kommentar

            • uli
              LoxBus Spammer
              • 30.08.2015
              • 224

              #8
              Hallo Jan,

              gleich mal ausprobiert und läuft einwandfrei. Super Arbeit!

              Ich hatte mir mit der alten Version eine Stoßlüften-Funktion gebastelt (siehe unten). Das geht nun mit der Version 3 nicht mehr, da ja die Lüftungsstufe wieder über den Merker mit einfliest und somit auch geändert wird. Hat jemand eine Idee wie man das umsetzen könnte?

              VG

              Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Stosslüften.JPG
Ansichten: 3450
Größe: 67,2 KB
ID: 18919

              Kommentar

              • Frank71
                Extension Master
                • 25.08.2015
                • 110

                #9
                Hallo Jan,

                ich hab mir auch eine Helios geleistet und gleich mal dein Programm verwendet. Danke nochmal.

                Hier ist meine Version mit Automatikbetrieb und manueller Lüftereinstellung. Hiermit ist auch eine Stoßlüftung möglich.

                Vieleicht kannst du aus beiden eine neue Version 4 machen ;-)

                // Helios KWL mit easyControls über Modbus TCP steuern v2.0
                // by jan punkt wachsmuth at web.de, Feedback gerne erwünscht.
                //
                //INPUTS
                //AI1 .... Betriebsart
                //AI2 .... Lüfterstufe
                //
                //OUTPUTS
                //AQ1 .... Temperatur Aussenluft
                //AQ2 .... Temperatur Zuluft
                //AQ3 .... Temperatur Fortluft
                //AQ4 .... Temperatur Abluft
                //AQ5 .... Ventilator Zuluft (rpm)
                //AQ6 .... Ventilator Abluft (rpm)
                //AQ7 .... Bypass aktiv
                //AQ8 .... Anzahl Fehler
                //AQ9 .... Anzahl Warnungen
                //A10 .... Anzahl Infos
                //A11 .... Luefertestufe
                //A12 .... Betriebsart
                //TQ1 .... Artikelbezeichnung


                //CONSTANTS
                // Disable/enable debug mode (writes log messages)
                #define DEBUG_MODE 1


                //VARIABLES
                char* answer;
                float tempAussenluft = 0.0;
                float tempZuluft = 0.0;
                float tempFortluft = 0.0;
                float tempAbluft = 0.0;
                float rpmZuluft = 0.0;
                float rpmAbluft = 0.0;
                float bypass = 0.0;
                float anzahlFehler = 0.0;
                float anzahlWarnungen = 0.0;
                float anzahlInfo = 0.0;
                char artikelBez[32];
                int betriebsart = 0;
                int luefterStufe = 0;

                // Modbus TCP header
                char modbusTCP[30];

                char tIDl,tIDh;
                char szBuffer[100];
                int nLen;
                int err;
                int zaehler;

                printf("Helios KWL Modbus TCP start");

                // modbusTCP Header vorbereiten und konstante Werte eintragen
                tIDl=0;
                tIDh=0;
                // Protocol Identifier - 2 Byte Zahl, immer 0
                modbusTCP[2]=0;
                modbusTCP[3]=0;
                // Length - 2 Byte Zahl - Länge des nachfolgenden Datenpaketes insgesamt
                modbusTCP[4]=0;
                modbusTCP[5]=0;
                // Unit Identifier - immer 180 für Helios KWL
                modbusTCP[6]=180;
                // reference number - Zweck unklar
                modbusTCP[8]=0;
                modbusTCP[9]=1;
                // Word count - Anzahl der zu schreibenden Worte (16 Bit)
                modbusTCP[10]=0;


                int modbusTCPwriteVar(char* heliosVar)
                {
                int wordLen;
                int nLen;

                // Anfrage mit modbusTCP Header erstellen (variabler Anteil)

                // Transaction Identifier - 2 Byte Zahl, die mit jeder Anfrage hochzählt
                modbusTCP[0] = tIDh;
                modbusTCP[1] = tIDl;
                tIDl++;
                if (tIDl == 256) {
                tIDl = 0;
                tIDh++;
                if (tIDh == 256)
                tIDh = 0;
                }
                // Function Code
                modbusTCP[7] = 16; // Write Multiple Registers (16)
                // Word count - Anzahl der zu schreibenden Worte (16 Bit)
                // inkl. 0-Byte am Ende (+1), aufrunden (+1)
                nLen = strlen(heliosVar);
                wordLen = (nLen + 2) >> 1;
                nLen = wordLen << 1;
                // Length - 2 Byte Zahl - Länge des nachfolgenden Datenpaketes insgesamt
                modbusTCP[5] = 7 + nLen;
                // Anzahl der zu schreibenden Register (a 16 Bit)
                modbusTCP[11] = wordLen;
                // Byte count - Anzahl der nachfolgenden Bytes
                modbusTCP[12] = nLen;
                strncpy(&modbusTCP[13], heliosVar, nLen);

                // Header und Daten an Helios senden
                stream_write(stream, modbusTCP, 13 + nLen);
                stream_flush(stream);

                // TCP Datenpaket empfangen, max. 500 msec auf Antwort warten
                nLen = stream_read(stream, szBuffer, sizeof(szBuffer) - 1, 500);
                if (nLen == 0) {
                printf("modbusTCP request for %s failed (0 bytes read) !", heliosVar);
                return 1;
                } else {
                // weitere Überprüfung der Antwort fehlt - Werte ähnlich wie in der Anfrage
                // es wird angenommen, dass die Antwort passt
                return 0;
                }
                }


                char* modbusTCPreadVar(char* heliosVar, int len)
                {
                // "countWords" Worte (a 16-Bit) aus Holding Register auslesen
                // TCP Anfrage mit modbusTCP Header erstellen

                // Transaction Identifier - 2 Byte Zahl, die mit jeder Anfrage hochzählt
                modbusTCP[0] = tIDh;
                modbusTCP[1] = tIDl;
                tIDl++;
                if (tIDl == 256) {
                tIDl = 0;
                tIDh++;
                if (tIDh == 256)
                tIDh = 0;
                }
                // Length - 2 Byte Zahl - Länge des nachfolgenden Datenpaketes insgesamt
                modbusTCP[5] = 6;
                // Function Code
                modbusTCP[7] = 3; // Read Holding Registers (3)
                // Word count - Anzahl der zu lesenden Worte (16 Bit), muss < 256 sein!
                // Variable=6 Byte, "="=1 Byte, Wert=len Byte, 0-Byte am Ende (+1), aufrunden (+1)
                modbusTCP[11] = (9 + len) >> 1;
                // TCP Datenpaket mit modbus Header senden
                stream_write(stream, modbusTCP, 12);
                stream_flush(stream);

                // TCP Datenpaket empfangen, max. 500 msec auf Antwort warten
                nLen = stream_read(stream, szBuffer, sizeof(szBuffer) - 1, 500);

                // Länge der Antwort prüfen (mind v0XXXX=y\0)
                if (nLen>16) {
                // Variable auslesen und überprüfen, immer 6 Bytes lang "v0XXXX"
                if (strncmp(heliosVar, &szBuffer[9], 6) == 0) {
                return &szBuffer[16];
                } else {
                szBuffer[15]=0;
                printf("modbusTCP variable %s is not %s !", heliosVar, &szBuffer[9]);
                return NULL;
                }
                } else {
                printf("modbusTCP answer too short, only %i Bytes, <%s>", nLen, &szBuffer[9]);
                return NULL;
                }
                }


                float heliosReadFloat(char* heliosVar, int len)
                {
                int err;
                char* answer;
                float floatValue;
                // 1. Teil: String für Variable schreiben
                err = modbusTCPwriteVar(heliosVar);
                if (err)
                return -999;

                // 2. Teil: Antwort aus Holding Register auslesen
                answer = modbusTCPreadVar(heliosVar, len);
                if (answer != NULL) {
                floatValue = atof(answer);
                if (DEBUG_MODE)
                printf("modbusTCP READ %s = %f", heliosVar, floatValue);
                return floatValue;
                }
                return -999;
                }


                void heliosReadString(char* heliosVar, char* heliosString, int len)
                {
                int err;
                char* answer;
                // 1. Teil: String für Variable schreiben
                err = modbusTCPwriteVar(heliosVar);
                if (err) {
                strcpy(heliosString, "Error!");
                return;
                }

                // 2. Teil: Antwort aus Holding Register auslesen
                answer = modbusTCPreadVar(heliosVar, len);
                if (answer != NULL) {
                strcpy(heliosString, answer);
                if (DEBUG_MODE)
                printf("modbusTCP READ %s = %s", heliosVar, heliosString);
                } else {
                strcpy(heliosString, "Error!");
                }
                }


                void heliosWriteInt(char* heliosVar, int value)
                {
                char heliosString[20];

                sprintf(heliosString,"%s=%d", heliosVar, value);
                if (DEBUG_MODE)
                printf("modbusTCP WRITE %s = %d", heliosVar, value);

                modbusTCPwriteVar(heliosString);
                }


                while(TRUE)
                {
                // Stream zur IP-Adresse der Helios KWL (Modbus TCP Gegenstelle)
                STREAM* stream = stream_create("/dev/tcp/192.168.0.120/502", 1, 0);

                if (stream != NULL)
                {

                // Betriebsart w�hlen 0 = Automat. 1 = Handbetrieb
                // Betriebsart schreiben
                betriebsart=(int)getinput(0);

                if(betriebsart<0)
                betriebsart=0;
                if(betriebsart>1)
                betriebsart=1;

                heliosWriteInt("v00101", betriebsart);
                sleep(100);

                if(betriebsart==1)
                {
                // Luefterstufe setzen
                luefterStufe = (int)getinput(1);
                if(luefterStufe<0) luefterStufe=0;
                heliosWriteInt("v00102", luefterStufe);
                printf("Lüfterstufe manuell schreiben %f",luefterStufe);
                sleep(100);
                }
                else {
                printf("Lüfterstufe in Automatik ");
                }

                // Betriebsart auslesen, char[1]
                anzahlInfo = heliosReadFloat("v00101", 1);
                setoutput(11, anzahlInfo);
                sleep(100);

                // Luefterstufe auslesen, char[1]
                anzahlInfo = heliosReadFloat("v00102", 1);
                setoutput(10, anzahlInfo);
                sleep(100);

                // Temperatur Aussenluft auslesen, char[7]
                tempAussenluft = heliosReadFloat("v00104", 7);
                setoutput(0, tempAussenluft);
                sleep(100);

                // Temperatur Zuluft auslesen, char[7]
                tempZuluft = heliosReadFloat("v00105", 7);
                setoutput(1, tempZuluft);
                sleep(100);

                // Temperatur Fortluft auslesen, char[7]
                tempFortluft = heliosReadFloat("v00106", 7);
                setoutput(2, tempFortluft);
                sleep(100);

                // Temperatur Abluft auslesen, char[7]
                tempAbluft = heliosReadFloat("v00107", 7);
                setoutput(3, tempAbluft);
                sleep(100);

                // Drehzahl Zuluft (rpm) auslesen, char[4]
                rpmZuluft = heliosReadFloat("v00348", 4);
                setoutput(4, rpmZuluft);
                sleep(100);

                // Drehzahl Abluft (rpm) auslesen, char[4]
                rpmAbluft = heliosReadFloat("v00349", 4);
                setoutput(5, rpmAbluft);
                sleep(100);

                // Bypass auslesen, char[1], undokumentiert!
                bypass = heliosReadFloat("v02119", 1);
                setoutput(6, bypass);
                sleep(100);

                // AnzahlFehler auslesen, char[2]
                anzahlFehler = heliosReadFloat("v01300", 2);
                setoutput(7, anzahlFehler);
                sleep(100);

                // AnzahlWarnungen auslesen, char[1]
                anzahlWarnungen = heliosReadFloat("v01301", 1);
                setoutput(8, anzahlWarnungen);
                sleep(100);

                // AnzahlInfo auslesen, char[1]
                anzahlInfo = heliosReadFloat("v01302", 1);
                setoutput(9, anzahlInfo);
                sleep(100);

                // Artikelbezeichnung auslesen, char[31]
                heliosReadString("v00000", artikelBez, 31);
                setoutputtext(0, artikelBez);
                sleep(100);


                } else {
                printf("Unable to create TCP stream");
                sleeps(9);
                }
                stream_close(stream);
                sleeps(1);
                }
                Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Bild 1.jpg
Ansichten: 3652
Größe: 88,6 KB
ID: 18977

                Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Bild 2.GIF
Ansichten: 3293
Größe: 44,0 KB
ID: 18978

                Kommentar


                • Jan W.
                  Jan W. kommentierte
                  Kommentar bearbeiten
                  Hallo Frank,
                  leider habe ich Deinen Beitrag zu spät gelesen. Die Idee mit dem Automatikmodus, wo die Loxone nur lesend auf die Helios zugreift finde ich gut. Ich werden versuchen, die Betriebsart in der nächsten Version zu integrieren. Heute hatte ich parallel das Skript angepasst, um die aktuelle Lüfterstufe beim Start und während der Laufzeit auszulesen und die Funktion Stoßlüften integriert.
                  Gruß Jan
              • Jan W.
                Lox Guru
                • 30.08.2015
                • 1245

                #10
                Hallo Uli,

                da Du wahrscheinlich nicht der Einzige bist, der eine Funktion Stoßlüften (vergleichbar mit Partybetrieb) haben möchtest, habe ich die Funktion noch eingebaut und in Loxwiki als Version 4 hochgeladen. Im Beispiel nur mit einem einfachen Taster zum An- bzw. Abschalten, aber der kann ja je nach Geschmack durch einen Treppenlichtschalter bzw. einem Baustein Ausschaltverzögerung angepasst werden. Mit einem virtuellem analogen Eingang (Eingabetyp Schieber) kann man leicht die "original" Partyfunktion für x Stunden / Minuten nachbilden.

                Während der Funktion Stoßlüften/Partybetrieb können die Werte nicht über ein externes Interface z.B. easycontrols geändert werden, sondern es wird fest die Stufe 4 (Maximalwert) geschrieben. Im Normalbetrieb ist ein paralleler Betrieb möglich, allerdings sollte die Automatik in easycontrols abgeschaltet werden.

                Gruß Jan
                Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
                Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
                Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
                Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
                Node-RED: IKEA Tradfri

                Kommentar

                • uli
                  LoxBus Spammer
                  • 30.08.2015
                  • 224

                  #11
                  Getestet und für gut befunden

                  Dankeschön euch beiden...

                  Kommentar

                  • LoxFFB
                    Extension Master
                    • 29.08.2015
                    • 197

                    #12
                    Super Programm

                    wie macht ihr die ansteuerung von der bypass klappe?

                    Kommentar

                    • Jan W.
                      Lox Guru
                      • 30.08.2015
                      • 1245

                      #13
                      Bisher noch gar nicht, d.h. es läuft bei mir noch die automatische Aktivierung durch die Anlage selbst. Ist aber für den Sommer noch geplant, wenn ich zeitlich dazu komme.

                      Die Steuerung des Bypass solle möglich sein, allerdings weiß ich nicht, ob das direkt über ein Register geht oder nur indirekt über Bypass Tag/Monat und Außenluft / Ablufttemperatur. Wenn es direkt geht, dann müsste man ja das interne "Berechnungsverfahren" über die genannte Parameter irgendwie abschalten können. Dazu habe ich nichts gefunden.

                      Indirekte Konfiguration: Man könnte z.B. für Abluft mind. 22 Grad, Außenluft nicht kälter als 5 Grad einstellen, was den Bypass aktivieren sollte. Tagsüber, wenn es draußen ganz heiß ist, dann könnte man die Abluft auf mind. 30 Grad einstellen, was den Bypass schließen dürfte. Damit würde die wärmere Außenluft sogar durch die kühlere Abluft etwas heruntergekühlt werden. Man soll wohl dann noch einen Stopfen entfernen (siehe Anleitung für die Anlage). Alternativ kann man ja auch die Stufe tagsüber deutlich heruntersetzen oder ausschalten.

                      Alternativ könnte man noch die "Funktion 6" für den externen Kontakt wählen und diesen über Loxone steuern. Das soll wohl die eingebaute Bypass-Steuerung abschalten und durch den externen Kontakt ersetzen.

                      Habe alles noch nicht ausprobiert, aber der Sommer kommt ja noch. Im letzten Sommer habe ich an einigen Tagen/Nächten manuell die Stufe verstellt, um die Innentemperatur etwas herunterzukühlen, allerdings ein Problem mit der Lautstärke gehabt. Dann habe ich die passive Kühlung unserer Wärmepumpe aktiviert und auf diese Weise die Innentemperatur reduziert.

                      Nach meiner Ansicht gibt es ein "Konstruktionsproblem" mit der Helios Anlage: Mit installiertem Pollenfilter im Bypass (nur dann!) und einer Anlage mit konstanter Luftstrommenge, z.B. dem Modell KWL 370 erhöht sich die Drehzahl der Lüfter deutlich. Bei uns hat man dann im Schlafzimmer die Anlage dann deutlich gehört. Hatte letztes Jahr deswegen beim Support von Helios angerufen, aber die haben mich nur auf die Firma verwiesen, die die Installation gemacht hat. Die meine, dass ich die Stufe dann reduzieren sollte. Na toll. Dummerweise war bei uns der Weg von der Anlage zum Schlafzimmer recht kurz, so dass es nur da zu hören war.

                      Letztendlich habe ich das Problem dadurch gelöst, dass ich sowohl vor als auch hinter die Anlage eine Box für Industriefilter eingebaut habe und dadurch einen wesentlich höheren Querschnitt im Filter habe. Einen weiteren Schalldämpfer habe ich auch noch mit eingebaut. Nun ist es deutlich leiser durch reduzierte Drehzahlen bei gleicher Lüftungsleistung. Hier habe ich die Teile bestellt:
                      - G4 Filter vor der Anlage, G7 Filter danach, Ersatzfilter 287x287mm kosten z.B. bei filter-mueller.de weniger als 15 Euro
                      - Filterboxen gibt es z.B. bei gastroplus24.de für gut 100 Euro

                      Der Einbau war auch nicht so schwierig. Falls jemand ebenfalls das gleiche Problem hat: die Lösung mit den Filterboxen ist super und man spart dadurch auch noch Geld bei den Filtern ein. Das hätte die Firma mal gleich so bauen sollen! Ich kann jedem nur empfehlen, solche Filter gleich von Anfang an einzubauen bzw. einbauen zu lassen.

                      Gruß Jan
                      Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
                      Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
                      Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
                      Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
                      Node-RED: IKEA Tradfri

                      Kommentar

                      • Frank71
                        Extension Master
                        • 25.08.2015
                        • 110

                        #14
                        Zitat von Jan W.
                        Indirekte Konfiguration: Man könnte z.B. für Abluft mind. 22 Grad, Außenluft nicht kälter als 5 Grad einstellen, was den Bypass aktivieren sollte.
                        Gruß Jan
                        Hallo Jan,

                        könntest du mir bitte die Einstellung erklären wie Helios die Berechnung bzw. Status
                        mit "Raum-/Ablufttemperatur in °C:" und "Min. Außenlufttemperatur in °C:" durchführt?
                        Ich bin daraus noch nicht schlau geworden und finde nirgends eine Erklärung.

                        Danke und Gruß Frank

                        Kommentar

                        • Jan W.
                          Lox Guru
                          • 30.08.2015
                          • 1245

                          #15
                          Hier https://www.heliosventilatoren.de/mb...82208_0514.pdf ist die Berechnung auf Seite 9 erläutert.

                          Kurz gesagt geht der Bypass auf, wenn
                          - die Außentemperatur niedriger als die Abluft ist (wenn die Außentemperatur höher ist, dann kühlt der Wärmetauscher die Aussenluft etwas herunter - der Bypass ist dann zu)
                          - die Außentemperatur nicht zu kalt ist - hierfür ist die "min. Außenlufttemperatur" konfigurierbar. Das macht Sinn, denn Nachts bei 5 Grad möchte man keine eiskalte Zugluft haben.
                          - die Ablufttemperatur einen bestimmten Wert überschreitet - Es soll natürlich nur gekühlt werden, wenn es drinnen "zu warm" ist. Der Wert ist ebenfalls konfigurierbar.

                          Zusätzlich gibt es noch den Beginn und das Ende (nach Kalender), so dass der Bypass nur "im Sommer" aktiviert wird. Die Tage kann man ebenfalls einstellen.

                          Wenn Du den Bypass auf jeden Fall aktivieren möchtest, dann könntest Du "Abluft mind. -10 Grad", "Außenluft mind. -20" einstellen. Die von mir im Post #13 genannten Werte sind nicht ganz so krass und waren nur als Beispiel gedacht - i.d.R. sollten sie den Bypass aktivieren. Auch bei Ausfall der Steuerung durch Loxone würde die Lüftungsanlage dann noch sinnvolle Werte haben.

                          Hoffe, dass war verständlich.

                          Gruß Jan
                          Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
                          Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
                          Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
                          Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
                          Node-RED: IKEA Tradfri

                          Kommentar

                          Lädt...