Heizungssteuerung - HP-Makro

Programmierung der HomeMatic CCU mittels contronics homeputer CL

Moderator: Co-Administratoren

PeterM
Beiträge: 761
Registriert: 14.10.2008, 10:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Walldorf/Baden
Danksagung erhalten: 2 Mal

Heizungssteuerung - HP-Makro

Beitrag von PeterM » 11.03.2010, 06:06

Hallo Rhobin,

hier nun die Weiterführung aus http://homematic-forum.de/forum/viewtop ... 8&start=24.

Auf kaju's Seite gabs mal ne Überlegung zur Benennung der Aktoren (ich finde es gerade nicht mehr wieder), das habe ich aufgegriffen. Deshalb die Namensgebung.
Naja, und der Rest halt wie es einem gerade einfällt.
Also:
FWT (FunkWandThermostat)
Z steht tatsächlich für Zeit und die 1 - 4 für den ersten bis vierten Eintrag.
WF steht für Wochenende/Feiertag.
MAC_wrt_LOG ist tatsächlich ein Makro (MACro) welches die entsprechenden Informationen direkt auf der Visualisierung ausgibt.

Das Heizungsmakro selbst ist eigentlich recht einfach. Ich stelle es hier nochmals in vereinfachter Form und mit mehr Kommentaren ein:

Code: Alles auswählen

//==========================================================================
// FWT_all_... sind globale Variable, die für alle FunkWandThermostate gelten.
// UVA_... sind Benutzervariablen (UserVAriable - das U dient nur dazu, dass diese Objekte in der Anzeige ganz hinten erscheinen), 
// die über die Visualisierung gesetzt werden können und global gültig sind.
// SVA_... sind SystemVAriablen, die über Zustände und/oder Makros gesetzt werden und auch global gültig sind 
// 
// evtl. über deaktivieren/aktivieren steuern????? - aber wann wird wieder aktiviert???
  wenn FWT_all_Heizperiode = "aus" dann
    deaktivieren(FWT_BAD_Mp)
    gehezu VERLASSEN
  endewenn

// Temperaturabsenkung:
// FWT_all_Datum_absenken und FWT_all_Datum_hochfahren = Urlaubszeit!
  wenn Datum = FWT_all_Datum_absenken dann
// wurde eine Absenkung angegeben (FWT_BAD_TAbsenkung > 0)?
    wenn FWT_BAD_TAbsenkung > 0 dann
      FWT_BAD setzen auf FWT_BAD_TAbsenkung
// Datum der Absenkung verändern, damit diese WENN-Anweisung nur einmal ausgeführt wird
      FWT_all_Datum_absenken:= FWT_all_Datum_absenken - 1
      gehezu VERLASSEN
    endewenn
  endewenn

// Bei Urlaubsende wieder aufheizen entsprechend TnachAbsenkung
  wenn Datum = FWT_all_Datum_hochfahren dann
// wurde eine Temperatur nach der Urlaubsabsenkung (FWT_BAD_TnachAbsenkung > 0) angegeben?
// habe noch keine Ahnung, ob das überhaupt notwendig ist, oder die Standard-Einstellung ausreicht...
    wenn FWT_BAD_TnachAbsenkung > 0 dann
      FWT_BAD setzen auf FWT_BAD_TnachAbsenkung
// auch hier das Datum verändern, damit die Temperatur nur einmal gesetzt wird.
      FWT_all_Datum_hochfahren:= FWT_all_Datum_hochfahren - 1
      gehezu VERLASSEN
    endewenn
  endewenn

// Bei Party = an - einmalig auf Party-Temperatur setzen und so lassen
  wenn UVA_Party = "an" dann
// Wenn Party-Temperatur vorgegeben wurde: übernehmen, ansonsten aktuelle Temp. halten
    wenn FWT_BAD_TParty > 0 dann
// FWT_BAD_P_erledigt ist nur ein Flag um zu prüfen, ob die Party-Temperatur bereits gesetzt wurde.
// dies könnte natürlich auch geprüft werden, indem die IST-Temperatur mit der Party-Temperatur verglichen wird...
// viele Wege führen nach Rom:-)
      wenn FWT_BAD_P_erledigt = 0 dann
        FWT_BAD setzen auf FWT_BAD_TParty
        FWT_BAD_P_erledigt:= 1
      endewenn
    endewenn
    gehezu VERLASSEN
  sonst
// Wenn Party ausgeschaltet, dann Flag wieder zurücksetzen
    wenn FWT_BAD_P_erledigt = 1 dann
      FWT_BAD_P_erledigt:= 0
    endewenn
  endewenn

// zunächst Zeitrahmen setzen, falls nicht exakt zur Uhrzeit aktiv!
// kann ja sein, dass die CCU mal etwas lahmt...
  u:= Uhrzeit + "00:00:20"

// SVA_Feiertag wird einmalig in einem Makro zum Tageswechsel gesetzt!
// Feiertagstemperatur prüfen
  wenn SVA_Feiertag <> " " dann
    wenn FWT_BAD_Z1_WF <> " " dann
// FWT_BAD_T1_WF ist ein STRING - also erst mal in einen Typ UHR (lokale Variable z) übernehmen zum vergleichen
      z:= FWT_BAD_Z1_WF
      wenn z zwischen Uhrzeit und u dann
        FWT_BAD setzen auf FWT_BAD_T1
        gehezu VERLASSEN
      endewenn
    endewenn
    gehezu VERLASSEN
  endewenn

// Wochenendtemperatur prüfen
//                   SMDMDFS (Sonntag, Montag, Dienstag...
// hier wird das Wochenende noch wie FEIERTAG behandelt. Hätte man eigentlich auch oben schon abfackeln
// können, aber evtl. will man hier ja doch noch etwas anderes einstellen...
  wenn Wochentag =+ "1000001" dann
    wenn FWT_BAD_Z1_WF <> " " dann
      z:= FWT_BAD_Z1_WF
      wenn z zwischen Uhrzeit und u dann
        FWT_BAD setzen auf FWT_BAD_T1
        gehezu VERLASSEN
      endewenn
    endewenn
    gehezu VERLASSEN
  endewenn

// normale Zeiten berücksichtigen
  z:= FWT_BAD_Z1
  wenn z zwischen Uhrzeit und u dann
    FWT_BAD setzen auf FWT_BAD_T1
    LOG:= "Uhrzeit = Z1, T1 setzen: " + FWT_BAD_T1
    aufrufen(MAC_wrt_LOG)
    gehezu VERLASSEN
  endewenn


VERLASSEN:
Ich denke, jetzt wirds einfacher zu verstehen sein.
Deine Nachfrage hat mich allerdings dazu gebracht mir Überlegungen zu machen, wie man hier ein globales Makro bauen kann, das von allen FWT's aus aufgerufen werden kann.
Problem wird die Visualisierung sein. In meinem Fall mit maximal 4 Temperaturen für alle Wochentage zu gleichen Zeiten und nur am Wochenende/Feiertag zu anderen Zeiten bedeutet momentan schon 12 Variable (4x Temperatur, 4x Wochentagszeiten und 4x Wochenende-/Feiertags-Zeiten). Und das für jeden Thermostaten.
Würde man jetzt WAdlers Spezialschichten zugrunde legen (mit fast täglich wechselnden Zeiten), mag ich mir die Flut der Objekte garnicht vorstellen.

In Erik's Skript wird ja quasi eine Bit-Leiste verwendet, die das alles (zumindest für eine Woche) berücksichtigt (mit 1/2-Stunden-Schaltung), aber dies würde in der Visualisierung nicht besonders brauchbar aussehen!?!?
Eine Umsetzung in ein HM-Makro wäre allerdings machbar.

Mal sehen...

Viele Grüsse,
Peter

EDIT: evtl. könnte man mit 8 Stringvariablen (pro Thermostat) arbeiten (7xWochentag + Feiertag) und diese mit Uhrzeit/Temperatur füllen: 05:30=22,5/09:30=19/20:00=22/21:30=19...
oder so änhlich.
Zuletzt geändert von PeterM am 28.12.2010, 15:53, insgesamt 3-mal geändert.

rhobin
Beiträge: 1007
Registriert: 09.11.2009, 12:01

Re: Heizungsthermostat - HM-Makro

Beitrag von rhobin » 12.03.2010, 13:40

Hallo Peter,

Das Überführen des Threads in ein neues Thema ist sicher richtig, wir sind etwas vom ursprünglichen Thema abgewichen.

Ich kenn' Kajus Überlegungen zur Bennenung der Objekte nicht, aber zwangsweise wird jeder, der mit Homeatic umgeht eine mehr oder weniger systematische Bennenung vornehmen müssen. Wer das nicht von Anfang an macht, der wird schnell im Chaos enden. Aber jeder machts halt etwas anders :wink:

Zu Deinem Makro:
Grundsätzlich kapier ich jetzt, was Du da machst. Danke für die Erläuterungen. Ich werd' mal probieren, ob ich das auf mein System übertragen kriege.

Noch 'ne FRage:

Code: Alles auswählen

wenn Wochentag =+ "1000001" dann
was soll das "+"-Zeichen an dieser Stelle??

Ich schreibe hier

Code: Alles auswählen

Wenn Wo_Tag = "Samstag" oder "Sonntag" Dann...
Das klappt auch, aber wie Du schon sagst: es führen viele Wege nach Rom

Diese Bitleiste vom Erik finde ich auch nicht besonders übersichtlich, sie ist aber sehr zweckmässig.
Ich würde versuchen eine Bedienoberfläche in VB oder in einen HTA-File nachzubauen und so eine bedienerfreundliche Oberfläche zu schaffen, aus dem dann automatisch diese Bitleiste erzeugt wird. In dem Thread vom Erik wurde das auch schonmal angesprochen, aber es hat sich noch keiner drangewagt. Ich selbst hab' auch nicht wirklich Zeit dafür - vielleicht mal im Sommer...
evtl. könnte man mit 8 Stringvariablen (pro Thermostat) arbeiten (7xWochentag + Feiertag) und diese mit Uhrzeit/Temperatur füllen: 05:30=22,5/09:30=19/20:00=22/21:30=19...
oder so änhlich.
Das würde ich auf jeden Fall machen, ist allerdings auch etwas unübersichtlich und bedarf auf jeden Fall einer grafischen Unterstützung zum Setzen und Ändern der Schaltzeiten.

Gruß
Rhobin

PeterM
Beiträge: 761
Registriert: 14.10.2008, 10:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Walldorf/Baden
Danksagung erhalten: 2 Mal

Re: Heizungsthermostat - HM-Makro

Beitrag von PeterM » 12.03.2010, 14:30

Hallo Rhobin,
was soll das "+"-Zeichen an dieser Stelle??
Das wird von HP benötigt, um die Bitleiste "1000001" auch als solche zu verstehen. Im Prinzip wird daraus deine Abfrage "wenn Wochentag = 'Sonntag" oder Wochentag = "Samstag"' erstellt.
Ist zum einen kürzer, wenn man mehrere Tage prüfen möchte und würde auch dann noch funktionieren, wenn es mal ne Sprachenabhängige Version geben sollte :mrgreen:

Ich habe mittlerweile auch schon ein Makro gebastelt, mit dem man einen String auswerten kann. Sobald ich die noch notwendigen Variablen/Vorgehensweise beschrieben habe, werde ich das hier veröffentlichen (dauert nicht mehr lange).

Viele Grüsse,
Peter

PeterM
Beiträge: 761
Registriert: 14.10.2008, 10:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Walldorf/Baden
Danksagung erhalten: 2 Mal

Re: Heizungsthermostat - HP-Makro

Beitrag von PeterM » 13.03.2010, 15:32

Hallo Rhobin,

hier nun die notwendigen Makros.
Makro: FWT_BAD wird im Raumthermostat abgelegt. Für jeden zu steuernden Raumthermostaten wird ein solches Makro benötigt.
Makro: MAC_Heizung_String ist für alle Raumthermostate gültig.
Auf den ersten Blick sieht alles etwas riesig aus, aber keine Angst da steckt in der Hauptsache Beschreibung drin.

Notwendige Anpassungen sind innerhalb der Makros beschrieben.
Sollten noch Fehler auftreten, oder sind Verbesserungswünsche vorhanden - bitte melden :D

Makro: FWT_BAD

Code: Alles auswählen

// Dieses Makro muss in jeden einzelnen FWT (FunkWandThermostat) übernommen werden.
// Danach ist über die Funktion Suchen/Ersetzen der String FWT_BAD mit dem jeweiligen
// Namen des Raumthermostaten zu ersetzen.
// Sollte das Makro für die eigentliche Heizungssteuerung nicht MAC_Heizung_string lauten,
// so ist dieses auch über Suchen/Ersetzen anzupassen.
// Das Ausführungsintervall diese Makros ist auf den notwendigen Wert zu setzen.
// Sinnvoll ist hierbei wohl ein Wert von 10 - 30 Minuten. Im Programm werden aber auch
// Minuten-Intervalle berücksichtigt (wer's braucht:-).
// Jeder Raumregler benötigt zusätzlich noch die folgenden Objekte:
// Name                    Typ
//---------------------------------
// FWT_BAD_TAbsenkung      Zahl
// FWT_BAD_TnachAbsenkung  Zahl
// FWT_BAD_TParty          Zahl
// FWT_BAD_TFK_Absenkung   Zahl
// FWT_BAD_TFK_offen       Zahl
// FWT_BAD_S1              Zeichen
// FWT_BAD_S2              Zeichen
// FWT_BAD_S3              Zeichen
// FWT_BAD_S4              Zeichen
// FWT_BAD_S5              Zeichen
// FWT_BAD_S6              Zeichen
// FWT_BAD_S7              Zeichen
// FWT_BAD_S8              Zeichen
//
// Mit Ausnahme von FWT_BAD_TFK_offen und FWT_BAD_TParty sollten alle Objekte über die
// Visualisierung steuerbar gemacht werden.
//
// Die Objekte FWT_BAD_S1 - FWT_BAD_S8 enthalten die notwendigen Zeit- und Temperaturangaben
// für die einzelnen Wochentage (FWT_BAD_S1 = Montag, FWT_BAD_S2 = Dienstag, ...
// FWT_BAD_S8 = Feiertag)
// Soll von Montag-Freitag das gleiche gelten, muss nur FWT_BAD_S1 gefüllt werden.
// Gilt für Samstag, Sonntag und Feiertag der gleiche Wert, ist auch hier nur der
// Samstag zu füllen.
// Gilt eine Angabe für alle Tage, reicht es FWT_BAD_S1 zu füllen.
// Uhrzeit und Temperatur sind jeweils durch "=" zu trennen. Die einzelnen Angaben werden
// jeweils durch "/" getrennt. Leerzeichen sind möglich, aber nicht notwendig.
// Für die Dezimalentrennung kann Punkt, oder Komma verwendet werden.
// Die Uhrzeit muss zwingend im Format HH:MM (also führende Null) eingegeben werden!
// z.B.:
// 05:30 = 22,5 / 09:30 = 19 / 20:00=22.0 / 22:00 = 19
// Die Länge der Eingabe ist durch die mögliche Länge eines Strings begrenzt.
// Dies liegt irgendwo jenseits von 1024 Zeichen. Man kann sich also austoben...
// Die Minuten-Angabe ist abhängig von dem eingestellten Ausführungsintervall.
// Bei einem Intervall von 10 Minuten und der Eingabe von 14:22 = 21,0 wird diese
// Anweisung nie ausgeführt, da das Makro nur um 14:20 und 14:30 läuft. Es gibt also
// keine Übereinstimmung. Bei einem Intervall von 1 Minute würde die Temperatur auf
// 21,0 gesetzt werden, da das Makro direkt um 14:22 ausgeführt wird.
// Eine aufsteigende Reihenfolge der Einstellzeiten ist nicht notwendig.
//
// Tür-/Fensterkontakt.
// Dieser Name (TFK_BAD) ist durch den Namen des eigenen TürFensterKontaktes zu ersetzen.
// sollen mehrere TFKs berücksichtigt werden, muss der geöffnete Kontakt ermittelt werden:
// z.B.
// zunächst auf "0" setzen!
// Tür-/Fensterkontakt
  MAC_Heizung_string.TFK:= "geschlossen"
// falls Fensterkontakt nicht berücksichtigt werden soll, die folgenden 3 Zeilen löschen!
  wenn TFK_BAD = "offen" dann
    MAC_Heizung_string.TFK:= TFK_BAD
  endewenn
// sollen mehrere Kontakte berücksichtigt werden, die folgenden Zeilen aktivieren und anpassen!
// wenn TFK_2 = "offen" dann
//   MAC_Heizung_string.TFK:= TFK_2
// endewenn
// Fenstergriff
// wenn TFK_3 <> "verriegelt" dann
//   MAC_Heizung_string.TFK:= TFK_3
// endewenn
// ...
//

  MAC_Heizung_string.TAbsenkung:=     FWT_BAD_TAbsenkung
  MAC_Heizung_string.TnachAbsenkung:= FWT_BAD_TnachAbsenkung
  MAC_Heizung_string.TParty:=         FWT_BAD_TParty

  MAC_Heizung_string.S1:=             FWT_BAD_S1
  MAC_Heizung_string.S2:=             FWT_BAD_S2
  MAC_Heizung_string.S3:=             FWT_BAD_S3
  MAC_Heizung_string.S4:=             FWT_BAD_S4
  MAC_Heizung_string.S5:=             FWT_BAD_S5
  MAC_Heizung_string.S6:=             FWT_BAD_S6
  MAC_Heizung_string.S7:=             FWT_BAD_S7
  MAC_Heizung_string.S8:=             FWT_BAD_S8

  MAC_Heizung_string.IstTemp:=        FWT_BAD

  MAC_Heizung_string.TFK_Absenkung:=  FWT_BAD_TFK_Absenkung

  aufrufen(MAC_Heizung_string)

  wenn FWT_BAD <> MAC_Heizung_string.SETTemp dann
    FWT_BAD setzen auf MAC_Heizung_string.SETTemp
  endewenn

  FWT_BAD_TParty:=     MAC_Heizung_string.TParty
  FWT_BAD_TFK_offen:=  MAC_Heizung_string.TFK_offen

Makro: MAC_Heizung_String

Code: Alles auswählen

//==========================================================================
// Notwendige Variablendefinitionen für dieses Makro:
// Name             Typ       Startwert
//-------------------------------------
// TAbsenkung       Zahl      0,0
// TnachAbsenkung   Zahl      0,0
// hm               Zeichen   hh:mm
// string           Zeichen
// TFK              Zahl      0,0
// TFK_Absenkung    Zahl      0,0
// TFK_offen        Zahl      0,0
// IstTemp          Zahl      0,0
// SETTemp          Zahl      0,0
// TParty           Zahl      0,0
// p                Zahl
// S1               Zeichen
// S2               Zeichen
// S3               Zeichen
// S4               Zeichen
// S5               Zeichen
// S6               Zeichen
// S7               Zeichen
// S8               Zeichen
// obige Variablen müssen innerhalb dieses Makros definiert werden!
//
// Notwendige Objekte (Variablen):
// Name                      Typ        Startwert
//-----------------------------------------------
// UVA_Party                 Schalter   an oder aus
// FWT_all_Datum_absenken    Zeichen
// FWT_all_Datum_hochfahren  Zeichen
// FWT_all_Heizperiode       Schalter   an oder aus
// Diese 4 Objekte sollten über die Visualisierung steuerbar gemacht werden.
//
// Übergabe-Parameter:
// S1 - S7: Zeitangaben und Temperaturen für die Wochentage Montag-Sonntag
// S8: Zeitangaben und Temperaturen für Feiertage
//     z.B:
//     05:30=22,5 / 09:30= 19/20:00=22 /21:30=19...
//     Achtung: Uhrzeit und Wert müssen immer duch "=" getrennt sein
//              die einzelnen Uhrzeit und Temperaturpaare müssen immer durch "/" getrennt sein
//              Leerstellen sind erlaubt, aber nicht notwendig.
//     Eine Reihenfolge in der Zeitangabe ist nicht vorgegeben (vereinfacht aber die Lesbarkeit).
//     Neue Schaltzeiten können einfach an eine bestehende Zeichenfolge angehängt werden.
//     Sollen die Temperaturen und Zeiten für mehrere Tage gleich sein, muss in der
//     Visualisierung nur für den ersten Tag etwas eingegeben werden. Jeder folgende Tag
//     bei dem keine Temp-/Zeitwerte vorahnden sind, enthält dann die Werte des Vorgängers.
//
// TFK: Status eines TürFensterKontaktes. Sind mehrere zu berücksichtigen, muss im
//      rufenden Makro der aktuelle Zustand geprüft und der zu berücksichtigende
//      Zustand übergeben werden.
//
// TFK_Absenkung: falls bei offenem Fenster eine Absenkung erwünscht, wird diese hier ünbergeben.
//
// TFK_offen: wurde hier die Temperatur abgesenkt, wir in TFK_offen die zuvor aktive
//            Temperatur zwischengespeichert, um beim schließen des Fensters wieder die
//            zuvor aktive Temperatur einzustellen.
//
// TAbsenkung: Wird für einen bestimmten Zeitraum eine Temperaturabsenkung gewünscht,
//             dann müssen die globalen Variablen FWT_all_Datum_absenken und
//             FWT_all_Datum_hochfahren gesetzt sein und in TAbsenkung der entsprechende
//             Wert übergeben werden.
//
// TnachAbsenkung: evtl. wird nach der Temperaturabsenkung ein erhöhter Temperaturwert erwünscht
//                 um die (trägen) Heizungssteller zu bewegen die Ventile weiter als sonst zu
//                 öffnen. Dies wird hier übergeben. Dieser Wert wird dann beim nächstfälligen
//                 Zeitpunkt mit dem dann gültigen Wert überschrieben.
//                 Wird hier nichts übergeben, läuft die normale Logik ab.
//
// TParty: gibt es einen PARTY-Schalter (UVA_Party), ist diesser aktiv und wird dann eine andere
//         Temperatur gewünscht, wird sie hier übergeben. Diese Temperatur wird erst wieder
//         verändert, wenn UVA_Party ausgeschaltet wird.
//
// IstTemp: die aktuell vorgegebene Temperatur des Raumreglers (nicht die gerade erreichte
//          Temperatur).
//
// Rückgabe-Parameter:
// SETTemp: die zu setzende Temperatur. Dies kann auch die bereits gesetzt Temp sein. Im
//          rufenden Makro muss deswegen eine entsprechende Abfrage vorhanden sein.
//
// TFK_offen: falls Fenster offen, wird hier die vor einer Absenkung gesetzte Temperatur
//            zurückgegeben.
//
// zusätzlich verwendete Variablen:
// FWT_all_Heizperiode: Schalter, ob Heizperiode überhaupt aktiv ist, oder nicht.
//
// FWT_all_Datum_absenken: Datum ab dem abgesenkt werden soll.
//
// FWT_all_Datum_hochfahren: Datum ab dem die Heizung wieder hochgefahren werden soll.
//
// string: temporäre Variable zur Übernahme der für den aktuellen Tag gültigen Zeit-/Temp-Werte.
//
// hm: enthält die Stunden und Minuten der aktuellen Uhrzeit, um den entsprechenden Wert
//     in der zuvor bereitgestellten Variablen "string" zu ermitteln
//
// p: Position des Wertes aus "hm" innerhalb der Variablen "string" um damit die zugehörige
//    Temperatur aus "string" abzugreifen.
//
// DatAbs: Datumsvariable zum rechnen mit Datum
//
// Es werden auch Zeiten von 1-Minunten/5-Minuten Rhythmus berücksichtigt. Dann
// muss das Ausführungsintervall des rufenden Makros entsprechend gesetzt werden.
// Ein Ausführungsintervall kleiner 1 Minute findet keine Berücksichtigung.
// Dieses Makro selbst besitzt kein Ausführungsintervall!!!
//
// dieses Makro muss von den FWT's (FunkWandThermostate) und den entsprechenden
// TFK's (TürFensterKontakte) im gewünschten Rhythmus aufgerufen werden.
//
// so, genug gelabert. Ran ans verarbeiten!


// init Variable
  SETTemp:= IstTemp

// evtl. über deaktivieren/aktivieren steuern?????
  wenn FWT_all_Heizperiode = "aus" dann
    gehezu VERLASSEN
  endewenn

// ******************************************************************************
// TFK: wenn ein Fenster offen ist und eine Temperaturabsenkung übergeben wurde,
// dann muss darauf reagiert werden.
  wenn TFK <> "verriegelt" und
    TFK <> "geschlossen"  dann
    wenn TFK_Absenkung > 0 dann
      SETTemp:= TFK_Absenkung
// aktuelle IstTemperatur nur sichern (TFK_offen), falls noch nicht schon geschehen
// Dies darf nur einmal passieren, da sonst immer die Ist-Temperatur übernommen
// wird, die natürlich bei der Absenkung kontinuierlich sinkt...
      wenn TFK_offen = 0 dann
        TFK_offen:= IstTemp
      endewenn
// weiterlaufen, um zu sehen ob bereits ein neuer Zeitpunkt/Temperaturwert erreicht wurde!
    endewenn
  sonst
// Temperatur wieder auf Wert vor dem Fensteröffnen setzen, aber weiterlaufen,
// falls bereits genau jetzt schon ein neuer Zeitpunkt erreicht wurde.
    wenn TFK_offen <> 0 dann
      SETTemp:= TFK_offen
      TFK_offen:= 0
    endewenn
  endewenn
// ******************************************************************************

// ******************************************************************************
// Temperaturabsenkung:
// FWT_all_Datum_absenken und FWT_all_Datum_hochfahren = Urlaubszeit:-))
// Ist das Datum der Absenkung erreicht, wird abgesenkt und das Datum reduziert,
// damit beim nächsten Durchlauf nicht wieder abgesenkt wird.
  wenn Datum = FWT_all_Datum_absenken dann
    wenn TAbsenkung > 0 dann
      SETTemp:= TAbsenkung
      DatAbs:= FWT_all_Datum_absenken
      DatAbs:= DatAbs - 1
      FWT_all_Datum_absenken:= DatAbs
      gehezu VERLASSEN
    endewenn
  endewenn

// Bei Urlaubsende wieder aufheizen entsprechend TnachAbsenkung
  wenn Datum = FWT_all_Datum_hochfahren dann
    wenn TnachAbsenkung <> 0 dann
      SETTemp:= TnachAbsenkung
      DatAbs:= FWT_all_Datum_hochfahren
      DatAbs:= DatAbs - 1
      FWT_all_Datum_hochfahren:= DatAbs
      gehezu VERLASSEN
    endewenn
  endewenn

// TAbsenkung gesetzt und innerhalb des angegebenen Zeitraumes, dann beenden!
  wenn Datum >= FWT_all_Datum_absenken und
    Datum <= FWT_all_Datum_hochfahren dann
    wenn TAbsenkung > 0 dann
      gehezu VERLASSEN
    endewenn
  endewenn
// ******************************************************************************

// ******************************************************************************
// Bei Party = an - einmalig auf Party-Temperatur setzen und so lassen
  wenn UVA_Party = "an" dann
// Wenn Party-Temperatur vorgegeben wurde: übernehmen, ansonsten aktuelle Temp. halten
    wenn TParty > 0 dann
      SETTemp:= TParty
    endewenn
    gehezu VERLASSEN
  endewenn
// ******************************************************************************

// ******************************************************************************
// die einzelnen strings vorbereiten. Dies sollte evtl. bereits bei der Eingabe
// durchgeführt werden, um hier Verarbeitungszeit zu sparen!?
// einen gefüllten Eintrag suchen und den nächsten evtl. leeren damit füllen.

  wenn S1 <> "" und
    S1 <> " " dann
    string:= S1
    wenn S2 = "" oder
      S2 = " " dann
      S2:= string
    endewenn
  endewenn
  wenn S2 <> "" und
    S2 <> " " dann
    string:= S2
    wenn S3 = "" oder
      S3 = " " dann
      S3:= string
    endewenn
  endewenn
  wenn S3 <> "" und
    S3 <> " " dann
    string:= S3
    wenn S4 = "" oder
      S4 = " " dann
      S4:= string
    endewenn
  endewenn
  wenn S5 <> "" und
    S5 <> " " dann
    string:= S5
    wenn S6 = "" oder
      S6 = " " dann
      S6:= string
    endewenn
  endewenn
  wenn S6 <> "" und
    S6 <> " " dann
    string:= S6
    wenn S7 = "" oder
      S7 = " " dann
      S7:= string
    endewenn
  endewenn
  wenn S7 <> "" und
    S7 <> " " dann
    string:= S7
    wenn S8 = "" oder
      S8 = " " dann
      S8:= string
    endewenn
  endewenn
// ******************************************************************************

// ******************************************************************************
// jetzt den zum Wochentag/Feiertag passenden String ermitteln
// zunächst Stunde und Minute der Uhrzeit separieren, da nur diese zur
// Temperaturschaltung verwendet werden.
  hm:= Uhrzeit
  hm:= linkerteil(hm,5)

// SVA_Feiertag wird einmalig in einem Makro zum Tageswechsel gesetzt!
// aktivieren der zum Wochentag/Feiertag gehörenden Einträge
// hier nicht die übliche Anweisung 'wenn Wochentag = "Montag"' verwenden,
// da nicht klar ist, wie dies im fremdsprachigen Raum aussieht!
  wenn SVA_Feiertag <> " " dann
    string:= S8
  sonst
    wenn Wochentag =+ "0100000" dann
      string:= S1
    sonst
      wenn Wochentag =+ "0010000" dann
        string:= S2
      sonst
        wenn Wochentag =+ "0001000" dann
          string:= S3
        sonst
          wenn Wochentag =+ "0000100" dann
            string:= S4
          sonst
            wenn Wochentag =+ "0000010" dann
              string:= S5
            sonst
              wenn Wochentag =+ "0000001" dann
                string:= S6
              sonst
                string:= S7
              endewenn
            endewenn
          endewenn
        endewenn
      endewenn
    endewenn
  endewenn
// ******************************************************************************

// ******************************************************************************
// nun die eigentliche Verarbeitung der Uhrzeit/Temperaturpaare
// prüfen, ob für die aktuelle Zeit HH:MM ein Eintrag vorhanden ist
// Achtung: Uhrzeit und Wert müssen immer duch "=" getrennt sein
//          die einzelnen Uhrzeit und Temperaturpaare müssen immer durch "/" getrennt sein
// im string steht z.B.: 05:30=22,5/ 09:30= 19.3 / 20:00=22 /21:30=19...
//                       ....+....1....+....2....+....3....+....4
//                                   ^-- hier ist das Beispiel zu finden
// z.B: Uhrzeit ist 9:30:14, damit steht in hm 09:30 und p würde auf 13 gesetzt werden,
// da genau dort die 09:30 zu finden ist!
  p:= textposition(string,hm)
  wenn p > 0 dann
// Inhalt davor löschen - im o.g. Beispiel würde string danach so aussehen:
// 09:30= 19.3 / 20:00=22 /21:30=19...
// ....+....1....+....2....+....3....+....4
    string:= textteil(string,p,255)
// p auf Wert nach der Uhrzeit positionieren (HH:MM=)
    p:= textposition(string,"=")
    p:= p + 1
// übernahme der Temperatur in der Länge 7. damit würde aus
    string:= textteil(string,p,7)
// string enthält nun:
//  19.3 /
// ....+....1....+....2....+....3....+....4
// jetzt nach "/" suchen
    p:= textposition(string,"/")
    wenn p > 0 dann
// und den Rest der Zeile löschen. Enthält string nicht mehr das "/" (weil evtl.
// mehrere Leerstellen verwendet wurden, macht dies auch nichts!
      p:= p - 1
      string:= textteil(string,1,p)
    endewenn
// jetzt den Wert in den Rückgabeparameter übernehmen!
    SETTemp:= string
  endewenn

VERLASSEN:
// nun alle lokalen Variablen wieder initialisieren für den nächsten Aufruf,
// falls der nächste Aufruf nicht alle Variablen initialisiert haben sollte.
  TAbsenkung:=     " "
  TnachAbsenkung:= " "
  TParty:=         " "
  string:=         ""
  p:=              0

  S1:= ""
  S2:= ""
  S3:= ""
  S4:= ""
  S5:= ""
  S6:= ""
  S7:= ""
  S8:= ""
In der Visualisierung könnte es dann so aussehen:
Heizungssteuerung.png
Viele Grüsse,
Peter

rhobin
Beiträge: 1007
Registriert: 09.11.2009, 12:01

Re: Heizungsthermostat - HP-Makro

Beitrag von rhobin » 14.03.2010, 11:10

Hallo Peter,

WOW! Das ist riesig, ehrlich!

Ich bin eigentlich mit einem ganz anderen Ansatz an meine Heizungssteuerung gegangen, muss jetzt aber erkennen, dass ich bei weitem nicht an Dein Programm herankomme. Bin angefangen mit ausschließlich verschachtelten "WENN...DANN:::SONST" Konstrukten - das wird aber irgendwann sehr unübersichtlich und fehleranfällig bei Änderungen :cry:

Ich hatte eigentlich immer vor, mir das Skript vom Erik irgendwann ( :( ) mal reinzuziehen und dann die wichtigsten Dinge in HP zu übertragen. Das hast Du jetzt in vorbildlicher Form (vorbildlich vor allem wg. der exellenten Kommentare), nur wenige machen sich soviel Mühe! Dickes Lob!

Ich bin leider am Wochenende noch nicht zu viel gekommen, die beste Ehefrau von allen hat so diverse WÜnsche im und ums Haus (nur leider nicht Homematic :P ), das Frühjahr kommt ja dann doch irgendwann. Jetzt will Sie eine Gartenbewässerung (Super Idee - vor allem kann/muss man das automatisieren :)) , aber erstmal muss 'ne Wasserleitung in den Garten....

Ich muss entweder meine Systematik der Variablen-Bezeichnungen anpassen oder das Programm entsprechend umfummeln - ich weiß noch nicht was sinniger ist. Warum unterscheidest Du zwischen SVA (ich nehme an "SystemVariable") und UVA ("UnterVariablen"???).

Was ich auf jeden Fall nich ändern werde, ist die Bennung der Makros als MAC_.... Bislang hab' ich Makros auch unter VAR_... eingeordnet, aber es wird langsam unübersichtlich.

Fazit:
Tolles Sache, die du da erarbeitet hast, ich brauch' etwas zeit zum Einbauen/Anpassen. Ich meld' mich (wenn ich Probleme krieg' sowieso, aber auch bei Erfolg). Wenn Du mal in der Nähe bist, lad' ich Dich gerne zum Bier ein (selbstgebrautes)

Danke nochmal und Gruß
Rhobin

PeterM
Beiträge: 761
Registriert: 14.10.2008, 10:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Walldorf/Baden
Danksagung erhalten: 2 Mal

Re: Heizungsthermostat - HP-Makro

Beitrag von PeterM » 14.03.2010, 14:57

Hallo Rhobin,

danke. Freut mich dass es dir gefällt. Frühjahr und Sommer ist ja die beste Zeit, um solch ein Makro zu testen. Die Heizung it eh aus (nee, jetzt noch nicht), da macht es auch nichts, wenn das Makro doch noch ein paar Programmirritationen enthält :mrgreen:
Klar, kommt jetzt erst mal der Garten dran. Ist bei mir auch so. Im übrigen hatte meine Frau auch ne Idee - neue Lampe über dem Küchentisch. Natürlich mit Sparbirnen. Die waren dann leider viel zu hell. Da sie von solchen Sachen keine Ahnung hat, konnte ich sie ganz schnell davon überzeugen, dass Sparbirnen nur!!! mir Homematic-Abschnittsdimmer und einem OLED-Wandtaster gedimmt werden können :mrgreen: :mrgreen:
Ich hätte natürlich auch schwächere Birnen (die dabei waren) nehmen können - dann hätt's aber keinen Abschnittsdimmer und OLED-Wandtaster gegeben :lol: Man muss halt manchmal etwas manipulativ Argumentieren...

Die beste Symantik zur Benennung von Aktoren/Variablen ist die, die einem gefällt. Ich wollte meine Variablen in der (mittlerweile sehr grossen) Liste recht weit hinten haben, deshalb SVA (SystemVariable) und UVA (UserVariable). BVA für BenutzerVariable wäre zu weit vorne erschienen. SystemVariable werden immer durch das System verwaltet und werden in der Visualisierung maximal angezeigt, während UserVariable immer eingabebereit in der Visualisierung dargestellt werden. Nicht unbedingt notwendig, aber wenn man sich's so angewöhnt hat :wink:

Leider ist mit HP keine generische Programmierung möglich, also muss man immer etwas anpassen. Und alle Normierungen werden irgendwann platzen, dann muss man sich halt neue Varianten überlegen.

Das mit dem (selbstgebrauten), hoffentlich unfiltriertem Bier nehme ich gerne an :D .
Deiner Wortwahl
Bin angefangen mit
entnehme ich mal, dass du im Großraum Dortmund wohnst!? Dann würde das auch super passen, denn dort bin ich häufiger - meine Frau (übrgigens die Beste aller) is "von da wech".

Also ab in den Garten, Graben ausheben (richtig tief), Kiesbett rein, Rohr rein, Leerrohr rein (richtig dickes - man hat immer etwas vergessen), mit Kies und Steinplatten abdecken uuuund natürlich die HM-Teile ordern!

Viele Grüsse,
Peter

rhobin
Beiträge: 1007
Registriert: 09.11.2009, 12:01

Re: Heizungsthermostat - HP-Makro

Beitrag von rhobin » 16.03.2010, 21:13

Hallo Peter,

lass' uns mal wieder öffentlich diskutieren, damit die anderen auch teilhaben können.

Also ich bin der Meinung, dass meine semantischen Anpassungen korrekt sind, aber dennoch klappts nicht mit der Übergabe der "Soll"-Temperatur (Du nennst das wohl SETTemp) an den Thermostat.

Das BA_Thermostat-Makro läuft testweise alle 5 min, die Steuerungszeiten sehen so aus

Code: Alles auswählen

Var_FWT_BA_S1=16:00=21,5/19:00= 21/20:00=19/22:00=18,5;
Ich übergebe den Variableninhalt übrigens über eine "init.txt"-Datei, die auf dem USB-Stick der CCU liegt. Diese Init.txt lese ich mit LESEWERTEDATEI ein. Dabei habe ich ein Problem mit der Übergabe von Datumsangaben (siehe dazu mein Post im Forum Homeputer CL Software. Aber das nur nebenbei...

Code: Alles auswählen

      MAC_Heizung_string.TFK:= "geschlossen"

      MAC_Heizung_string.TAbsenkung:=     Var_FWT_BA_TAbsenkung
      MAC_Heizung_string.TnachAbsenkung:= Var_FWT_BA_TnachAbsenkung
      MAC_Heizung_string.TParty:=         Var_FWT_BA_TParty

      MAC_Heizung_string.S1:=             Var_FWT_BA_S1
      MAC_Heizung_string.S2:=             Var_FWT_BA_S2
      MAC_Heizung_string.S3:=             Var_FWT_BA_S3
      MAC_Heizung_string.S4:=             Var_FWT_BA_S4
      MAC_Heizung_string.S5:=             Var_FWT_BA_S5
      MAC_Heizung_string.S6:=             Var_FWT_BA_S6
      MAC_Heizung_string.S7:=             Var_FWT_BA_S7
      MAC_Heizung_string.S8:=             Var_FWT_BA_S8

      MAC_Heizung_string.IstTemp:=  BA_Thermostat

      MAC_Heizung_string.TFK_Absenkung:=  Var_FWT_BA_TFK_Absenkung

      AUFRUFEN(MAC_Heizung_string)

      WENN BA_Thermostat <> MAC_Heizung_string.SETTemp DANN
        BA_Thermostat SETZEN AUF MAC_Heizung_string.SETTemp
      ENDEWENN

      Var_FWT_BA_TParty:=     MAC_Heizung_string.TParty
      Var_FWT_BA_TFK_offen:=  MAC_Heizung_string.TFK_offen
Hier seh' ich kaum Fehlermöglichkeiten

eher hier (ich hab' mal die ganzen Kommentarzeilen gelöscht).

Code: Alles auswählen

      SETTemp:= IstTemp

      WENN Var_Heizperiode = 0 DANN
        gehezu VERLASSEN
      ENDEWENN

      WENN TFK <> "verriegelt" und
        TFK <> "geschlossen"  DANN
        WENN TFK_Absenkung > 0 DANN
          SETTemp:= TFK_Absenkung
          WENN TFK_offen = 0 DANN
            TFK_offen:= IstTemp
          ENDEWENN
        ENDEWENN
      sonst
        WENN TFK_offen <> 0 DANN
          SETTemp:= TFK_offen
          TFK_offen:= 0
        ENDEWENN
      ENDEWENN

      WENN Datum = Var_FWT_all_Absenkdatum DANN
        WENN TAbsenkung > 0 DANN
          SETTemp:= TAbsenkung
          DatAbs:= Var_FWT_all_Absenkdatum
          DatAbs:= DatAbs - 1
          Var_FWT_all_Absenkdatum:= DatAbs
          gehezu VERLASSEN
        ENDEWENN
      ENDEWENN

    // Bei Urlaubsende wieder aufheizen entsprechend TnachAbsenkung
      WENN Datum = Var_FWT_all_Hochfahrdatum DANN
        WENN TnachAbsenkung <> 0 DANN
          SETTemp:= TnachAbsenkung
          DatAbs:= Var_FWT_all_Hochfahrdatum
          DatAbs:= DatAbs - 1
          Var_FWT_all_Hochfahrdatum:= DatAbs
          gehezu VERLASSEN
        ENDEWENN
      ENDEWENN

    // TAbsenkung gesetzt und innerhalb des angegebenen Zeitraumes, DANN beenden!
      WENN Datum >= Var_FWT_all_Absenkdatum und
        Datum <= Var_FWT_all_Hochfahrdatum DANN
        WENN TAbsenkung > 0 DANN
          gehezu VERLASSEN
        ENDEWENN
      ENDEWENN
      WENN UVA_Party = "an" DANN
        WENN TParty > 0 DANN
          SETTemp:= TParty
        ENDEWENN
        gehezu VERLASSEN
      ENDEWENN
      WENN S1 <> "" und
        S1 <> " " DANN
        string:= S1
        WENN S2 = "" oder
          S2 = " " DANN
          S2:= string
        ENDEWENN
      ENDEWENN
      WENN S2 <> "" und
        S2 <> " " DANN
        string:= S2
        WENN S3 = "" oder
          S3 = " " DANN
          S3:= string
        ENDEWENN
      ENDEWENN
      WENN S3 <> "" und
        S3 <> " " DANN
        string:= S3
        WENN S4 = "" oder
          S4 = " " DANN
          S4:= string
        ENDEWENN
      ENDEWENN
      WENN S5 <> "" und
        S5 <> " " DANN
        string:= S5
        WENN S6 = "" oder
          S6 = " " DANN
          S6:= string
        ENDEWENN
      ENDEWENN
      WENN S6 <> "" und
        S6 <> " " DANN
        string:= S6
        WENN S7 = "" oder
          S7 = " " DANN
          S7:= string
        ENDEWENN
      ENDEWENN
      WENN S7 <> "" und
        S7 <> " " DANN
        string:= S7
        WENN S8 = "" oder
          S8 = " " DANN
          S8:= string
        ENDEWENN
      ENDEWENN
      hm:= Uhrzeit
      hm:= linkerteil(hm,5)

      WENN SVA_Feiertag <> " " DANN
        string:= S8
      sonst
        WENN Wochentag =+ "0100000" DANN
          string:= S1
        sonst
          WENN Wochentag =+ "0010000" DANN
            string:= S2
          sonst
            WENN Wochentag =+ "0001000" DANN
              string:= S3
            sonst
              WENN Wochentag =+ "0000100" DANN
                string:= S4
              sonst
                WENN Wochentag =+ "0000010" DANN
                  string:= S5
                sonst
                  WENN Wochentag =+ "0000001" DANN
                    string:= S6
                  sonst
                    string:= S7
                  ENDEWENN
                ENDEWENN
              ENDEWENN
            ENDEWENN
          ENDEWENN
        ENDEWENN
      ENDEWENN

      p:= textposition(string,hm)
      WENN p > 0 DANN
        string:= textteil(string,p,255)
        p:= textposition(string,"=")
        p:= p + 1
        string:= textteil(string,p,7)
        p:= textposition(string,"/")
        WENN p > 0 DANN
          p:= p - 1
          string:= textteil(string,1,p)
        ENDEWENN
        SETTemp:= string
      ENDEWENN

    VERLASSEN:
      TAbsenkung:=     " "
      TnachAbsenkung:= " "
      TParty:=         " "
      string:=         ""
      p:=              0

      S1:= ""
      S2:= ""
      S3:= ""
      S4:= ""
      S5:= ""
      S6:= ""
      S7:= ""
      S8:= ""
Siehst Du irgendeinen Bock, den ich geschossen hab'??

Ratlos :(
Gruß
Rhobin

PeterM
Beiträge: 761
Registriert: 14.10.2008, 10:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Walldorf/Baden
Danksagung erhalten: 2 Mal

Re: Heizungsthermostat - HP-Makro

Beitrag von PeterM » 17.03.2010, 08:29

Hallo Rhobin,

auf den ersten Blick sehe ich nicht direkt einen Fehler. Ist denn deine Variable Var_FWT_BA_S1 vom Typ Zeichen?
Bin mir auch nicht sicher was passiert, wenn man einer Variablen (Zeichen) einen String ohne Anführungszeichen zuweist.

Was passiert denn, oder auch nicht wenn das Makro exact um 19:00/20:00.. läuft?
Wie sitzt denn Var_Heizperiode?

Setzte mal in das Makro der Variable Var_FWT_BA_S1 auch die Anweisung "aufrufen(BA_Thermostat-Makro)". Dann kannst du auch die aktuelle Uhrzeit (der CCU) als Schaltzeit eintragen und mußt nicht immer auf das 5-Minuten-Intervall warten.

Wenn das nicht weiterhilft, schick mir bitte mal deine .SPG-Datei (falls ich die sehen darf - ansonsten eben alle beteiligten Objektdefinitionen). Dann wühle ich mich da mal durch.

Viele Grüsse,
Peter

rhobin
Beiträge: 1007
Registriert: 09.11.2009, 12:01

Re: Heizungsthermostat - HP-Makro

Beitrag von rhobin » 17.03.2010, 09:18

Morgen Peter,
Ist denn deine Variable Var_FWT_BA_S1 vom Typ Zeichen?
yep!
Bin mir auch nicht sicher was passiert, wenn man einer Variablen (Zeichen) einen String ohne Anführungszeichen zuweist.
Nix bzw. eigentlich funktioniert das problemlos
Was passiert denn, oder auch nicht wenn das Makro exact um 19:00/20:00.. läuft?
Wie sitzt denn Var_Heizperiode?
Heizperiode sitzt auf "an" bzw. "1"
Ansonsten passiert vordergründig zu den Zeitpunkten 19:00 oder 20:00 h gar nix. Die eingestellte SollTemp am Thermostat ändert sich nicht. Allerdings ist mir gestern nachmittag aufgefallen (nachdem ich vorgestern das Makro installiert hatte) und es einfach über Nacht hab' laufen lassen, dass das BAD-Thermostat eine Soll-Temperatur von "ON" zeigte. D.H. irgendwie wurde die Solltemperatur auf T>30,5 Grad erhöht, dann zeigt das Display "ON". Als ich abends die Sitzung beendet hatte stand die SollTemp definitiv auf 24 Grad. Modus "Manu".

Ich hab' schon die Laufzeit des Makros auf 1 Minute erhöht zu Testzwecken...

Das mit der SPG-Datei kann ich nicht von Dir erwarten. Ich hab' kein Problem damit, Dir die Datei zu schicken, aber es dauert sicher einige Zeit, bis Du Dich da durchgearbeitet hast, das möchte ich Dir nicht zumuten.

Danke und Gruß
Rhobin

PeterM
Beiträge: 761
Registriert: 14.10.2008, 10:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Walldorf/Baden
Danksagung erhalten: 2 Mal

Re: Heizungsthermostat - HP-Makro

Beitrag von PeterM » 17.03.2010, 10:05

Hallo Rhobin,

kann es sein, dass der HEX-Code von "/" aus der init-Datei nicht dem in Microsoft entspricht?
Das "on" im Heizungsthermostat kommt nur, wenn der zugewiesene Wert sehr hoch ist (z.B. hier: 19:00= 21/20). Wenn hierbei der Schrägstrich nicht erkannt wird, steht danach in SETTemp 2120. Das wäre die einzige Stelle, wo es zu solch einem Fehler kommen könnte (nach meiner Meinung).
Ich übernahme ja, nachdem ich "=" gefunden habe die nächsten 7 Stellen (wegen etwaiger Leerstellen), suche nach dem "/" und lösche ab diesem (falls gefunden). Ansonsten bleibt alles so stehen...
Könntest du die Variable mal in der Visualisierung überschreiben?
Sollte dies der Fehler sein, muss ich mir natürlich etwas einfallen lassen :(

Viele Grüsse,
Peter

Antworten

Zurück zu „homeputer CL“