Ankündigung

Einklappen
Keine Ankündigung bisher.

Heizpumpensteuerung KNX

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

    Heizpumpensteuerung KNX

    Hallo zusammen!

    Ich gehe derzeit mit einer Idee schwanger, habe allerdings keine Ahnung, wie ich das im Programm umsetzen soll.

    Ich habe drei Heizpumpen (EG, OG und Garage), die drei Kreisläufe der Fußbodenheizung ansteuern.

    Für jedes Zimmer in den jeweiligen Kreisläufen gibt es eine Einzeltemperaturregelung, auf den Ventilen der Fußbodenheizung sitzt ein Stellmotor, der von einem Albrecht Jung Heizungsaktor PWN 206701 angesteuert wird.

    Die Temperatursignale werden von einem Albrecht Jung Stetigregler 4093KRMTSD in den Bus gespeist.

    Ich würde gerne die Pumpen je nach Anforderung der Temperatur ein- und ausschalten.

    Wenn also zB im Erdgeschoß es warm genug ist, sodass die Ventile zumachen, dann soll die EG-Pumpe sich ausschalten. Benötigt auch nur ein Raum aber Wärme, dann soll die Pumpe wieder anspringen.

    Ganz vertrackt wird es dann in der Garage, denn die Stetigregler kennen keinen Frostschutz (laut Hersteller), sondern haben als Mindesttemperatur 7 Grad. Das ist an einem Ort, der nur frostfrei sein soll (außer es wird gearbeitet, darum die Heizung) zu warm. Die Pumpe soll daher laufen, wenn die Temperatur in der Garage auf 3 Grad fällt, aber auch, wenn es in der Nacht unter -5 Grad hat....

    Ich bin für jeden Input dankbar, mir schwirren nur einige Rules durch den Kopf, ich komme aber leider auf keinen grünen Zweig.

    LG

    Fred

    #2
    Na ja, Du musst halt die Information, ob ein Stellantrieb geöffnet ist auf ein Contact Item verlinken. Dann bildest Du Gruppen aller Stellantriebe pro Stockwerk. Die Gruppe ist natürlich auch vom Typ Contact und mit der Funktion OR(OPEN,CLOSED) versehen. Jetzt sollte es so sein, dass, sobald eines der Ventile geöffnet wird, sowohl das zugehörige Item als auch die Gruppe auf OPEN wechselt. Erst wenn alle Ventile geschlossen sind, wechselt die Gruppe nach CLOSED.

    Jetzt schreibst Du eine einfache Rule, die auf die Gruppe triggert und die Pumpe entsprechend ein- und ausschaltet. Es reicht, wenn die Rule auf changed triggert.
    Du könntest sogar noch die Gruppen EG und OG in einer Gruppe zusammenfassen und die Rule auf Member of Hauptgruppe changed triggern lassen. Dann wird die Rule allerdings komplizierter, denn Du musst den Namen des triggeringItem auswerten und entsprechend die passende Pumpe schalten lassen. Dafür brauchst Du dann aber nur eine Rule.

    Für die Garage muss das natürlich etwas anders aussehen, dafür brauchst Du auf jeden Fall eine eigene Rule, die auf Temperaturänderungen des Garagenfühlers genauso triggert wie auf Temperaturänderungen des Außensensors.
    Dann prüfst Du, ob die Innentemperatur unter 3 Grad ist oder die Außentemperatur unter -5 Grad. Wenn eine der beiden Bedingungen erfüllt ist, lässt Du die Pumpe laufen, sonst nicht.

    Wenn Du nicht weiter kommst, poste mal alle beteiligten Items (wie erwähnt, Du brauchst je Stetigregler ein Item, welches den Wärmebedarf (also Ventil = offen) signalisiert, weiterhin pro Pumpe ein Item und natürlich die Temperatursensoren.

    Kommentar


      #3
      Hallo Udo!

      Vielen Dank erstmal, du hast mir sehr weitergeholfen.

      Ich habe alle Heizventile als Contact Items angelegt, funktioniert auch alles, hab es mal probeweise in die Sitemap gelegt, es wechselt die Ansicht je nach Schaltzustand (der Stetigregler regelt hier in drei Stufen den Druchfluss, aber das ist für die angedachte Rule ohne Bedeutung, da nur open/close zählt).

      Nur hänge ich bei den Gruppen.

      Ich habe die Stellmotoren in die Gruppen Heizung Erdgeschoß (gHE), Heizung Obergeschoß (gHO) und Heizung Garage (gHG) unterteilt.

      Nur, wie weise ich der jeweiligen Gruppe den Typ Contact zu?

      Wenn ich:
      Group:Contact:OR(OPEN,CLOSED) (gHG)
      in die Items schreibe, kommt ein schwerer Fehler und sie wird nicht mehr geladen.

      So, ich habe weiter getestet, ich habe keinen Fehler mehr, aber auch keine Anzeige in der Sitemap, nur ein undefinierbares Symbol.

      Group:Contact:OR(OPEN, CLOSED) HG_Garage_alle "Garage" (gHG)
      Group:Contact:OR(OPEN, CLOSED) HE_Keller_EG "Keller EG" (gHE)
      Group:Contact:OR(OPEN, CLOSED) HO_OG "OG" (gHO)
      Sitemap:

      Text item=HG_Garage_alle
      Text item=HE_Keller_EG
      Text item=HO_OG
      Die anderen (einzelnen) Items funktionieren einwandfrei, zB

      Contact HG_Heizventile_Garage "Garage" {channel="knx:device:bridge:heizungkeller:Heizvent ile_Garage"}
      Text item=HG_Heizventile_Garage
      Zuletzt geändert von fred07; 21.10.2018, 14:40.

      Kommentar


        #4
        Eines ist mir noch aufgefallen: eine korrekte Anzeige bekomme ich nur dann, wenn ich auf den Raumtemperaturreglern mal die Temperatur erhöhe, sodass das Signal an die Ventile geht, dann wieder verringere, damit sie wieder zumachen.

        Mache ich das nicht, wird der Zustand nicht ausgelesen.

        Das ist natürlich unbefriedigend, denn bei jeder Änderung in der Sitemap oder den Items geht der Zustand verloren und ich müsste das neuerlich machen.

        Hatte jemand schon so ein Problem?

        Mein Signal für die Heizungsaktoren geht vom Ausgang "Meldung Heizen". Es gibt dann noch im RTR Schalten (ist belegt für Präsenz), Präsenzobjekt (gleiche GA wie Schalten zuzüglich Ga für Gesamtabsenkung) und (alle unbelegt): Fensterstatus, Soll-Temperatur, Reglerstatus, Zwangsobjekt-Betriebsmodus, Basis-Sollwert, Rückmeldung Sollwertverschiebung, Ist-Temperatur unabgeglichen, Vorgabe Sollwertverschiebung, PWM Stellgröße Heizen, Statusmeldung Zusatz, Stellgröße Heizen (PWM); Betriebsmodusumschaltung…

        Gehört da noch etwas dazugeschaltet als zusätzliche GA?

        Oder fehlt einfach nur das L-Flag?
        Zuletzt geändert von fred07; 21.10.2018, 16:58.

        Kommentar


          #5
          Du musst die Items den Gruppen zuordnen und das Label korrekt setzen:
          Code:
          [COLOR=#000000]Group:Contact:OR(OPEN, CLOSED) HG_Garage_alle "Garage [%d]"[/COLOR]
          [COLOR=#000000]Group:Contact:OR(OPEN, CLOSED) HE_Keller_EG "Keller EG [%d]"[/COLOR]
          [COLOR=#000000]Group:Contact:OR(OPEN, CLOSED) HO_OG "OG [%d]" [/COLOR]
          
          [COLOR=#000000]Contact HG_Heizventile_Garage "Garage" (HG_Garage_alle) {channel="knx:device:bridge:heizungkeller:Heizventile_Garage"}[/COLOR]
          Zeig doch mal Deine Items und die Channel-Definitionen, dann finden wir den Fehler schon.

          Grundsätzlich müssen alle GA, die von openHAB gelesen werden sollen, auf knx-Seite exakt in einem verknüpften Kommunikationsobjekt das L-Flag gesetzt haben, damit dieses Kommunikationsobjekt auf den Read Request eine Antwort schickt. Logischerweise handelt es sich meist um den Aktor, außer natürlich bei Sensoren.

          Eine Änderung an der Sitemap sollte indes nicht zum Verlust der Status führen, nur wenn Items oder verknüpfte Channel geändert werden, werden die Status zurück gesetzt (in ersteren Fall für alle Items, in letzterem Fall meines Wissens nur für die betroffenen Items).

          Kommentar


            #6
            Hallo,

            ev kann Dir auch der Aktor ein Signal liefern. Bei dem Aktor von MDT zb gibt es ein Objekt welches die Pumpe einschaltet sobald ein Ausgang die Mindestöffnung überschreitet. Dieser regelt dann acuh nachlauf usw. der Pumpe. Schau doch mal ob es bei deinem Aktor soetwas auch gibt.
            Gruß

            Guido

            Kommentar


              #7
              Danke für den Tipp, Höhlenbär :-)

              Würde grundsätzlich gehen, ich habe mir das angesehen, der Aktor unterstützt sowas, wenn man im ETS entsprechend umprogrammiert. Leider hilft mir das nicht, da an einem Aktor zwei Pumpenkreisläufe "hängen". Der Aktor reagiert aber nur auf alle Ventile geschlossen, das haut dann leider nicht hin. Hätte ich pro Pumpe einen Aktor könnte ich das wählen, wäre sogar eine relativ einfache Lösung.

              Aber mit meiner Konfiguration 2 Aktoren/3 Pumpen muss ich über die Rule gehen.

              Udo, über Nacht hatten die Aktoren einen Status bekommen. In der Früh habe ich die Items angepaßt, damit die Gruppe stimmt, einige Rückmeldungen kamen dann, einige nicht und das für 12 Stunden Beobachtungszeitraum. Ich habe dann die Heizungsaktoren komplett im ETS umprogrammiert, damit die Stellgrößen und die zyklische Überwachung der Stellgrößen freigegeben ist.

              Nach dem Reboot kamen sofort alle Statusmeldungen der Aktoren ohne Verzögerung. Auch die Gruppe wechselt von OPEN nach CLOSED und umgekehrt.

              Wie sollte eine korrekte Rule jetzt aussehen, die auf die Gruppe reagiert bzw. auf die vorgegebene Temperatur im zweiten Fall?

              Sorry, wenn das vielleicht eine einfache Frage ist, aber bei den Rules steige ich ziemlich aus.

              Sollte man in die Rule dann noch einen Ein/Ausschalter einbauen, damit für Sommer/Winterbetrieb oder ist das unnötig?

              Vielen Dank im Voraus

              Kommentar


                #8
                Ich würde auf Zeit abfragen alle 10 min oder auf Änderung der Gruppe

                Code:
                rule "Pumpen"
                when
                Time cron "0 10 * * ?"
                then
                
                if HG_Garage_alle == OPEN {
                
                Pumpe1.sendCommand(ON)
                
                }
                
                if HG_Garage_alle == OPEN {
                
                Pumpe1.sendCommand(OFF)
                
                }
                das geht auch mit einer ELSE Anweisung aber da kenne ich den Syntax nicht.

                Die Regel prüft alle 10 Minuten ob ein Ventil offen ist. und führt dann die Reaktion aus.

                Du kannst aber auch deine Gruppe auf Änderungen abfragen

                Code:
                rule "Pumpen"
                when Item HG_Garage_alle received update
                then
                
                if HG_Garage_alle == OPEN {
                
                Pumpe1.sendCommand(ON)
                
                }
                
                if HG_Garage_alle == OPEN {
                
                Pumpe1.sendCommand(OFF)
                
                }
                Zuletzt geändert von Höhlenbär; 22.10.2018, 19:24.
                Gruß

                Guido

                Kommentar


                  #9
                  Die einfache Variante, bei der Du für jedes Stockwerk eine eigene Rule benötigst, sieht das so aus:
                  Code:
                  rule "Pumpe OG"
                  when
                      Item HO_OG changed
                  then
                      Pumpe_OG.sendCommand(if(HO_OG.state != CLOSED) ON else OFF)
                  end
                  
                  rule "Pumpe EG"
                  when
                      Item HO_EG changed
                  then
                      Pumpe_EG.sendCommand(if(HO_EG.state != CLOSED) ON else OFF)
                  end
                  
                  rule "Pumpe Garage"
                  when
                      Item Temp_Garage changed or
                      Item Temp_Aussen changed
                  then
                      if(!(Temp_Aussen.state instanceof Number)) {
                          logError("pumpe_garage","Außenfühler hat keinen gültigen Wert!")
                          return;
                      }
                      if(!(Temp_Garage.state instanceof Number)) {
                          logError("pumpe_garage","Innenfühler hat keinen gültigen Wert!")
                          return;
                      }
                      Pumpe_Garage.sendCommand(if((Temp_Aussen.state as Number) < -5 || (Temp_Garage.state as Number) < 3) ON else OFF)
                  end
                  das ist die einfachste Variante. Man könnte eine Hysterese einbauen (speziell bei der Garagen-Rule) um ein häufiges Ein- und Ausschalten zu verhindern. Für die beiden anderen Pumpen müsste man eigentlich einen Timer verwenden, um zu verhindern, dass die Pumpe zu häufig geschaltet wird.

                  Kommentar


                    #10
                    Läuft mal perfekt. Nur einige Verständnisfragen: was bedeuten die logError Zeilen?

                    Geht es, dass man auf den Zustand open/closed abstellt, und nicht auf die Änderung des Zustandes? Hintergrund ist der, wenn ich die Heizung generell einschalte (mache ich normal erst Anfang November) und einige Zimmer sind schon unter dem Schwellwert, ändert sich der Zustand ja nicht und damit springen die Pumpen nicht an. Ändere ich item changed auf item == open, habe ich einen schweren Fehler und die Rule geht nicht mehr.

                    Wie gehe ich die Hysterese an? Ich habe hier
                    http://knx-user-forum.de/forum/supportforen/openhab/1002348-infrarotheizung-mit-openhab einen Link gefunden, aber wie passe ich das an, außerdem steht einmal Hysterese 0.1 und einmal 0.2?

                    Hier mal meine Rule:


                    rule "Pumpe OG"
                    when
                    Item HO_OG changed
                    then
                    Pumpe_OG.sendCommand(if(HO_OG.state != CLOSED) ON else OFF)
                    end

                    rule "Pumpe Keller und EG"
                    when
                    Item HE_Keller_EG changed
                    then
                    Pumpe_Keller_EG.sendCommand(if(HE_Keller_EG.state != CLOSED) ON else OFF)
                    end

                    rule "Pumpe Garage"
                    when
                    Item Grad_WE_Aussentemperatur changed or
                    Item ActualTemperature_GA_Garage changed
                    then
                    if(!(Grad_WE_Aussentemperatur.state instanceof Number)) {
                    logError("pumpe_garage","Außenfühler hat keinen gültigen Wert!")
                    return;
                    }
                    if(!(ActualTemperature_GA_Garage.state instanceof Number)) {
                    logError("pumpe_garage","Innenfühler hat keinen gültigen Wert!")
                    return;
                    }
                    Pumpe_Garage.sendCommand(if((Grad_WE_Aussentempera tur.state as Number) < -3 || (ActualTemperature_GA_Garage.state as Number) < 3) ON else OFF)
                    end

                    Bei jeder Änderung der Temperatur in der Garage, also alle paar Minuten kommt command off

                    Kommentar


                      #11
                      Wegen deinem Takten wäre ja die Abfrage alle 10 min sinnvoll. Dann hast du gleich die Nachlaufzeit eingebaut, bauchtest nur 1 Rule und hättest auch das Problem mit den Change nicht.
                      In der When Abfrage kannst Du nicht mit == arbeiten.

                      Code:
                      Item <item> received command [<command>]
                      Item <item> received update [<state>]
                      Item <item> changed [from <state>] [to <state>]
                      Das steht in der Doku Diese kannst Du hier einsehen
                      Gruß

                      Guido

                      Kommentar


                        #12
                        Du kannst ohne Probleme weitere Trigger zur Rule hinzufügen, z.B. einen Trigger, wenn Du den Schalter von Sommer auf Winter schaltest. der Ansatz mit einem Time cron statt changed ist auch eine Variante, Du ersetzt einfach die Rules durch folgendes:
                        Code:
                        rule "Pumpen"
                        when
                            Time cron "0 0/10 * * * ?" // alle 10 Minuten
                        then
                            if(Winter.state != OFF) {
                                Pumpe_OG.sendCommand(if(HO_OG.state != CLOSED) ON else OFF)
                                Pumpe_EG.sendCommand(if(HO_EG.state != CLOSED) ON else OFF)
                                if(!(Temp_Aussen.state instanceof Number)) {
                                    logError("pumpe_garage","Außenfühler hat keinen gültigen Wert!")
                                    return;
                                }
                                if(!(Temp_Garage.state instanceof Number)) {
                                    logError("pumpe_garage","Innenfühler hat keinen gültigen Wert!")
                                    return;
                                }
                                Pumpe_Garage.sendCommand(if((Temp_Aussen.state as Number) < -5 || (Temp_Garage.state as Number) < 3) ON else OFF)
                            } else {
                                Pumpe_OG.sendCommand(OFF)
                                Pumpe_EG.sendCommand(OFF)
                                Pumpe_Garage.sendCommand(OFF)
                            }
                        end
                        logError() erzeugt in der Datei openhab.log eine Logzeile der Kategorie ERROR. Die Idee dabei ist, dass sowohl der Außenfühler als auch der Innenfühler jederzeit einen Messwert liefern sollte, entsprechend wäre es ein eindeutiger Fehler, wenn einer der beiden Werte nicht korrekt gemeldet werden kann.
                        Das return; bewirkt einen frühen Abbruch der Rule, da das nachfolgende if() (innerhalb des sendCommand()) sonst einen hässlichen Fehler schmeißt.

                        Das nächste Problem lauert hier aber schon, weil nun nicht mehr auf Zustandsänderung geschaut wird, werden viele unnötige Befehle geschickt, das heißt, Du müsstest eigentlich vor dem Schaltbefehl Soll mit Ist vergleichen und nur bei Abweichung einen Schaltbefehl schicken.
                        Zuletzt geändert von udo1toni; 24.10.2018, 07:09.

                        Kommentar


                          #13
                          Vielen Dank für die Erklärung, Udo, und danke auch Guido.

                          Ich habe es gemischt gelöst, einerseits auf die Änderung des Zustandes abstellen (schlimmstenfalls ändert sich der ja mit Ende der Nachtabsenkung) und andererseits mit der Temperatur, aber mit Time Cron.

                          Kommentar


                            #14
                            So, eines hab ich leider noch.

                            Meine Rule sieht so aus:

                            rule "Pumpe OG"
                            when
                            Item HO_OG changed
                            then

                            if (Heizung.state==ON)
                            Pumpe_OG.sendCommand(if(HO_OG.state != CLOSED) ON else OFF)

                            end

                            rule "Pumpe Keller und EG"
                            when
                            Item HE_Keller_EG changed
                            then
                            if (Heizung.state==ON)
                            Pumpe_Keller_EG.sendCommand(if(HE_Keller_EG.state != CLOSED) ON else OFF)
                            end

                            rule "Pumpe Garage"
                            when
                            Time cron "0 0/20 * * * ?"
                            then
                            if(Heizung.state==ON) {
                            if(!(Grad_WE_Aussentemperatur.state instanceof Number)) {
                            logError("pumpe_garage","Außenfühler hat keinen gültigen Wert!")
                            return;
                            }
                            if(!(ActualTemperature_GA_Garage.state instanceof Number)) {
                            logError("pumpe_garage","Innenfühler hat keinen gültigen Wert!")
                            return;
                            }
                            Pumpe_Garage.sendCommand(if((Grad_WE_Aussentempera tur.state as Number) < -5 || (ActualTemperature_GA_Garage.state as Number) < 3) ON else OFF)
                            } else {
                            Pumpe_Garage.sendCommand(OFF)
                            }
                            end


                            OG und Keller+EG gehen tadellos, nur bei Garage feuert die Rule alle 20 Minuten, obwohl Heizung.state auf OFF ist und sie eigentlich nicht feuern dürfte....


                            Und noch was, wie kriege ich diesen nervigen Fehler weg: The type HeizungssteuerungRules is already defined in Heizungssteuerung.rules (org.eclipse.xtext.validation.IssueCodes.duplicate _type)?
                            Zuletzt geändert von fred07; 27.10.2018, 14:53.

                            Kommentar


                              #15
                              Bitte achte immer darauf, den Code als Code (nicht als Quote!!!) zu posten. Man kann seine Posts auch nachträglich bearbeiten (solange ein Thema nicht vom Admin gesperrt wurde).

                              Zitat von fred07 Beitrag anzeigen
                              OG und Keller+EG gehen tadellos, nur bei Garage feuert die Rule alle 20 Minuten, obwohl Heizung.state auf OFF ist und sie eigentlich nicht feuern dürfte....
                              das ist schon richtig, die Rule wird alle 20 Minuten ausgelöst. Falls die Heizung ausgeschaltet ist, wird auch nicht eingeschaltet, sondern immer wieder aus. Um nur einmal zu schalten, könntest Du im else-Teil (wo bis jetzt nur Pumpe_Garage.sendCommand(OFF) steht) folgendes einbauen:
                              Code:
                              if(Pumpe_Garage.state != OFF) Pumpe_Garage.sendCommand(OFF)
                              Dann wird der Schaltbefehl nur ausgeführt, wenn es nötig ist. Diese Abfrage kannst Du auch an allen anderen Stellen entsprechend einbauen, um unnötige Schaltbefehle zu verhindern, also "Schalte das Item X auf Status y, falls der Status von Item X ungleich y ist."

                              Zitat von fred07 Beitrag anzeigen
                              Und noch was, wie kriege ich diesen nervigen Fehler weg: The type HeizungssteuerungRules is already defined in Heizungssteuerung.rules (org.eclipse.xtext.validation.IssueCodes.duplicate _type)?
                              Offensichtlich hast Du zwei Rules mit identischem Namen. Achte immer darauf, dass kein Name doppelt verwendet wird. Dies gilt für Items, Bridges pro Binding, Things pro Bridge (oder Binding, falls bridgeless), Channel pro Thing, Rules, globale Variablen (dateiübergreifend!), Sitemaps, usw.
                              Weiterhin sollte man vermeiden, identische Namen für unterschiedliche Sachen zu verwenden, also bitte Items nicht identisch mit Things, Channels, Variablen oder Rules benennen. Im Einzelfall mag das sogar funktionieren (z.B. Thing und Item), aber es erschwert die Fehlersuche.
                              Zuletzt geändert von udo1toni; 27.10.2018, 13:06.

                              Kommentar

                              Lädt...
                              X