Heizungsthermostatscript V2.0

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

seemann
Beiträge: 2
Registriert: 13.03.2018, 17:21

Re: Heizungsthermostatscript V2.0

Beitrag von seemann » 13.03.2018, 19:41

ok werde ich machen,
was homematic angeht bin ich anfänger und möchte meine heizung darüber steuern und später licht und steckdosen.

für mich ist alles zur zeit noch neuland was homematic angeht.

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Xel66 » 13.03.2018, 22:17

seemann hat geschrieben:ich habe homematic ip thermostate und heizkörper regler.
Bei dieser Hardwareausstattung würde ich noch mal die Lektüre der ersten Sätze des Postst von Petrus am 12.03.2018, 14:00 empfehlen. Mit modernen Thermostaten ist der Einsatz des Scripts überflüssig, denn die damit erreichte Funktionalität ist schon direkt in die modernen Thermostate in Form von Profilen hinterlegt. Leute mit Mischinstallationen können das ja durchaus einsetzen, aber ein Neuanfang beim Vorhandensein der aktuellen Hardware lohnt nicht wirklich.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Semenchkare
Beiträge: 64
Registriert: 31.08.2014, 19:48
Danksagung erhalten: 1 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Semenchkare » 14.03.2018, 22:55

Hallo Petrus,

nur noch eine Rückmeldung: ich habe einen HMIP Thermostat. Da klappt ebenfalls alles.

Gruß
Seme

PS habe ganzes haus nun mit diesem script am Laufen...
Viele Grüße

Seme

ccu3 Raspberrymatic 3.71.12.20231020,
Thermostate 8x HM-CC-RT-DN 105155 FW 1.4, Thermostat 1x HMIP-eTRV FW 1.6.3
Wandthermostat 1x HM-TC-IT-WM-W-EU FW 1.3
Tuer-Fensterkontakte 7x HM-Sec-SC-2 FW 1.2, Tuer-Fensterkontakt-optisch 1x HMIP-SWDO 1.10.7, Tuer-Fensterkontakt opt. HMIP-SWDO-I FW 1.14.0
Fenster-Drehgriffkontakt HMIP-SRH FW 1.0.1
Bewegungsmelder HM-Sec-MDIR-2 FW 1.6
Temperatur- Feuchtesensor aussen HM-WDS10-TH-O FW 1.3
Rauchmelder HM-Sec-SD FW 1.1, 2x HMIP-SWSD FW 1.0.11
Funk-Schaltaktor HM-LC-Sw1-FM FW 1.12, Funk-Schaltsteckdose HM-ES-PMSw1-Pl 2.5
Zusatzsoftware: CUXDaemon V. 2.11, E-Mail V. 1.7.6, XML API 1.22, hm_pdetect 1.16, Philips Hue 3.2.5

Preisselbeere
Beiträge: 17
Registriert: 27.02.2017, 07:05
Danksagung erhalten: 1 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Preisselbeere » 31.10.2018, 17:44

Hallo zusammen,

jetzt muss ich doch mal ne Frage stellen.

Grundsätzlich läuft das script Top und macht genau was es soll. Ich arbeite im 4-Schichtbetrieb und da nützen Wochenprofile nicht viel.

Es gibt ja die Einstellung deltaStdMin für die manuelle Einstellung für einen gewissen Zeitraum, und genau da liegt das Problem.

Ich habe für jeden Raum ein script am laufen, aber die Scriptvariablen sind ja immer gleich, und die scripte werden bei mir alle 30 Min. angestoßen.

Kann es sein, dass es da zu Problemen kommen kann? Mit den Zeitstempeln?

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Xel66 » 31.10.2018, 18:24

Preisselbeere hat geschrieben:
31.10.2018, 17:44
Ich arbeite im 4-Schichtbetrieb und da nützen Wochenprofile nicht viel.
Logisch, dass einem da die festen Profile nicht viel helfen, aber ein Script, was alle paar Minuten läuft, ist auch der absolute Overkill, um zwei Schaltpunkte täglich festzulegen. Ich arbeite auch im Schichtsystem nach einem festen Schichtplan im Sechs-Wochen-Rhythmus. Für die Sollwertsteuerung läuft bei mir kein Script. Ein Script benötige ich lediglich, um meinen Schichtplan im System abbilden zu können (und selbst das habe ich in einer Erstversion per Programm abgebildet). Alles Andere läuft mit ganz normalen Programmen. Meine Thermostate laufen im Automatikbetrieb mit normalen Heizprofilen und bekommen vom Standard abweichende Sollwerte in Abhängigkeit vom Schichtplan per Programm.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

dft601
Beiträge: 56
Registriert: 15.04.2014, 23:57
Hat sich bedankt: 3 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von dft601 » 11.01.2019, 08:15

Guten Morgen,

ich bin zwar nicht der Profi, aber das ging relativ simpel. Ich habe in einer Version 2.14 noch 2 Homematic - IP Geräte aufgenommen.
Ich habe ein Starterset Heizung gekauft und das hat so leider noch nicht funktioniert.

Ergänzt von mir in der Heizung: HmIP-eTRV-B

und dort war noch ein fehlernder Magnetkontakt dabei: HmIP-SWDM

Bitte wie üblich die Variablen noch anpassen, meine sind die aus dem "Kalenderscript"

Code: Alles auswählen

    ! Version 2.14
    ! Script von Erik Groennerud - 8.2009- MM.2013
    ! Ergaenzung von Zauberlehrling
    ! Optimiert und ergaenzt von Petrus (Peter) - 01.2018
    ! Performance Ideen von Goersch

    ! **************************************************************************
    ! Angabe fuer "raum" nur notwendig, wenn das Script die Thermostate
    ! und Sensoren automatisch ermitteln soll. Andernfalls leer lassen.
    ! **************************************************************************

      string raum = "Flur Erdgeschoss";

    ! **************************************************************************
    ! Eingabe fuer thermostat (nur wenn "raum" nicht angegeben ist):
    !   Gerät: HM-CC-TC           Angabe: BidCos-RF.<SERIENNUMMER>:2.SETPOINT
    !   Gerät: HM-CC-RT-DN        Angabe: BidCos-RF.<SERIENNUMMER>:4.SET_TEMPERATURE
    !   Gerät: HM-TC-IT-WM-W-EU   Angabe: BidCos-RF.<SERIENNUMMER>:2.SET_TEMPERATURE
    !   Gerät: HmIP-WTH-2         Angabe: HmIP-RF.<SERIENNUMMER>:1.SET_POINT_TEMPERATURE
    !   Gerät: HMIP-eTRV-2        Angabe: HmIP-RF.<SERIENNUMMER>:1.SET_POINT_TEMPERATURE
    ! **************************************************************************

      string thermostat = "";

    ! **************************************************************************
    ! Eingabe fuer Sensoren (optional und nur, wenn "raum" nicht angegeben ist):
    ! Bsp. HM-Sec-SC-2        		Angabe: BidCos-RF.<SERIENNUMMER>:1.STATE
    !      HmIP-SWDM oder ähnliche HmIP Angabe: HmIP-RF.<SERIENNUMMER>:1.STATE
    ! **************************************************************************

      string sensoren = ""; ! Angabe mehrerer Sensoren moeglich -> Eingaben mit ";" trennen

    ! **************************************************************************
    ! Namen der Systemvariablen in der CCU
    ! Namen von nicht verwendeten Systemvarialen einfach leer lassen
    ! **************************************************************************

      string sv_Heizperiode = "Heizperiode";           		 ! Fuer Pruefung, ob Winter oder Sommer
      string sv_Partytemperatur = "Partytemperatur";   	 ! Selbsterklaerend
      string sv_Urlaub1 = "IST-Urlaub-01-Abwesend-Heute";    ! Fuer Pruefung, ob Urlaub und auf Reisen => Temperatur "grad_urlaub"
      string sv_Urlaub2 = "IST-Urlaub-01-Anwesend-Heute";    ! Fuer Pruefung, ob Urlaub und zu Hause => Temperatur Zeitleiste Sa. oder So.
      string sv_Gaeste = "Gaeste";                     			 ! Fuer Pruefung, ob Gaeste im Hause sind => Temperatur "grad_gaeste"
      string sv_Anwesenheit = "Anwesenheit";           		 ! Fuer Pruefung, ob ausser Haus => Temperatur "grad_aa"
      string sv_Feiertag = "IST-Feiertag-Heute";           		 ! Fuer Pruefung, ob heute Feiertag ist => Temperatur Zeitleiste Sa. oder So.

      string Gewerk_Verschluss = "Verschluss";  ! Gewerk in der CCU fuer die Veschluesse

    ! **************************************************************************

    ! Temperaturen 6-30 Grad, 0 = OFF, 100=ON
      real grad_0 = 17.0;
      real grad_1 = 19.0;
      real grad_2 = 20.0;
      real grad_3 = 20.5;
      real grad_4 = 21.0;
      real grad_5 = 21.5;
      real grad_6 = 22.0;
      real grad_7 = 22.5;
      real grad_8 = 23.0;
      real grad_9 = 24.0;

      real grad_fenster = 6;         ! Temperatur bei offenem Fenster -1 = off
      real grad_urlaub  = 16.5;      ! Temperatur, wenn Urlaub und auf Reisen -1 = off
      real grad_gaeste  = 22;        ! Temperatur fuer Gaeste -1 = off
      real grad_aa      = 18;        ! Temperatur ausser haus, wird als Absenkung benutzt, -1 = OFF (immer Anwesenheit)

      string deltaStdMin = "02:00";  ! deltaStdMin mit "hh:mm" setzten (Std / Min immer zweistellig) Differenzzeit, die manuelle Temperatur erhalten bleibt bis überschrieben wird

      integer woche = 0;             ! 0=7 Tage Woche, 1=Montag=Wochentags & Samstag=Wochenende, 2= Montag=Woche, 3=Montag=Wochentags & Samstag=Samstag & Sonntag=Sonntag

      integer leiste = 1;                   ! Welche Zeitleiste aktiv ist

    if (leiste == 1){
    ! Zeitleiste 1
    ! Uhrzeit                0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2|
    !                        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3|
    string zeitleiste_mon = "000000000000134442222222222222222222333333322110";
    string zeitleiste_die = "000000000000134442222222222222222222333333322110";
    string zeitleiste_mit = "000000000000134442222222222222222222333333322110";
    string zeitleiste_don = "000000000000134442222222222222222222333333322110";
    string zeitleiste_fre = "000000000000134442222222222222222222333333322110";
    string zeitleiste_sam = "000000000000001122444444444444444444433333322110";
    string zeitleiste_son = "000000000000001122444444444444444444433333222110";
    };
    if (leiste == 2){
    ! Zeitleiste 2
    ! Uhrzeit                0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2|
    !                        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3|
    string zeitleiste_mon = "000000000000134440000000000000000001344444422110";
    string zeitleiste_die = "000000000000134440000000000000000001344444422110";
    string zeitleiste_mit = "000000000000134440000000000000000001344444422110";
    string zeitleiste_don = "000000000000134440000000000000000001344444422110";
    string zeitleiste_fre = "000000000000134440000000000000000001344444422110";
    string zeitleiste_sam = "000000000000001122444444444444444444433333222110";
    string zeitleiste_son = "000000000000001122444444444444444444433333222110";
    };

    boolean debug = 0;             ! Zu Testzwecken: Ausgaben im Parser und Werte werden bei jedem Skriptaufruf gesendet!
                                   ! Im Normalbetrieb muss debug immer auf 0 sein!
    boolean syslog = 0;            ! 1= Infos erfolgen ins Syslog ; 0= Kein Syslog (Standard)

    !******************************************************
    ! Ab hier Script CODE - Do not change behind this line
    !******************************************************

    ! Script abbrechen, wenn Eingaben nicht korrekt.
    if (((!raum) && (!thermostat)) || (!sv_Heizperiode)) {
        if (debug) { WriteLine("Angaben fuer raum und/oder thermostat pruefen!"); }
        if (syslog) {
            string stdout;
            string stderr;
            system.Exec("logger -t script -p user.debug Heizungsthermostatscript: " # raum # " Variablen raum und thermostat pruefen!\n", &stdout, &stderr);
        }
        quit;
    }

    ! Umwandeln deltaStdMin in Sekunden
    integer stunde = deltaStdMin.Substr(0, 2).ToInteger();
    integer minute = deltaStdMin.Substr(3, 2).ToInteger();
    integer setdelta = (stunde * 3600) + (minute * 60);

    object regler=null;           ! Datenobjekt des Reglers fuer die Solltemperatur
    object svObj=null;            ! Datenobjekt fuer die Ueberpruefung der Systemvariablen

    real soll_neu;                ! Die neue Solltemperatur fuer den Raumthermostaten (Regler).
    real soll_alt;                ! Die alte Solltemperatur der Zeitleiste, die zuletzt aktuell war.
    real soll_ist = -1;           ! Die aktuelle Solltemperatur im Raumthermostat (Regler).

    time sv_timestamp;            ! Zeitstempel der Systemvariablen, die zuletzt geaendert worden ist (Wert in Sekunden).
    time rt_timestamp;            ! Zeitstempel, wann die Solltemperatur im RT zuletzt gesetzt wurde.
    boolean prioritaet = false;   ! Ist prioritaet = true, dann wird die neue Solltemperatur auf jeden Fall in den Regler geschrieben.


        ! Beginn Thermostate abfragen
        if (raum) {
            var myAssembly = dom.GetObject(raum);
            string itemID;
            var OldItem;
            boolean IstWandthermostat=false;

            ! Solltemperatur im Raumthermostat ermitteln.
            foreach(itemID, myAssembly.EnumUsedIDs()) {
                var item = dom.GetObject(itemID);
                if (item.IsTypeOf(OT_CHANNEL)) {
                    var device = dom.GetObject(item.Device());

                    ! Wenn Raumthermostat gefunden wurde...
                    if ((device.HssType() == "HM-CC-RT-DN") && (!IstWandthermostat)) {
                        if (OldItem<>device) {
                            regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
                            soll_ist = regler.Value();
                            OldItem=device;
                            if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: HM-CC-RT-DN)"); }
                        }
                    } else {
                        if ((device.HssType() == "HM-CC-TC") && (!IstWandthermostat)) {
                            if (OldItem<>device) {
                                regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SETPOINT");
                                soll_ist = regler.Value();
                                OldItem=device;
                                IstWandthermostat=true;
                                if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: HM-CC-TC)"); }
                            }
                        } else {
                            if ((device.HssType() == "HM-TC-IT-WM-W-EU") && (!IstWandthermostat)) {
                                if (OldItem<>device) {
                                    regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SET_TEMPERATURE");
                                    soll_ist = regler.Value();
                                    OldItem=device;
                                    if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: HM-TC-IT-WM-W-EU)"); }
                                }
                            } else {
                                if (((device.HssType() == "HmIP-WTH")||(device.HssType() == "HmIP-WTH-2")) && (!IstWandthermostat)) {
                                    if (OldItem<>device) {
                                        regler = dom.GetObject("HmIP-RF." # device.Address() # ":1.SET_POINT_TEMPERATURE");
                                        soll_ist = regler.Value();
                                        OldItem=device;
                                        IstWandthermostat=true;
                                        if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: " # device.HssType() # ")"); }
                                    }
                                } else {
                                    if (((device.HssType() == "HmIP-eTRV")||(device.HssType() == "HmIP-eTRV-2")||(device.HssType() == "HmIP-eTRV-B")) && (!IstWandthermostat)) {
                                        if (OldItem<>device) {
                                            regler = dom.GetObject("HmIP-RF." # device.Address() # ":1.SET_POINT_TEMPERATURE");
                                            soll_ist = regler.Value();
                                            OldItem=device;
                                            if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: " # device.HssType() # ")"); }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            !Wenn kein "regler" gefunden wurde, Script beenden
            if (regler==null){ quit; }
        } else {
            ! Aktuelle Solltemperatur auslesen
            regler = dom.GetObject(thermostat);
            if (regler) {
                soll_ist = regler.Value();
                if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C  (" # thermostat # ")"); }
            } else { quit; }
        }

        ! Ende Thermostate abfragen

        ! Beginn Ermittlung Solltemperatur

        ! Heizperiode pruefen
        if (dom.GetObject(sv_Heizperiode).State()) {
            soll_neu = 100.0;
            prioritaet = true;
        } else {

            integer offen = 0;

            if ((raum) && (Gewerk_Verschluss)) {
              ! Alle Geraete im "raum" abfragen und auswerten.
              var myAssembly = dom.GetObject(raum);
              string itemID;

              foreach(itemID, myAssembly.EnumUsedIDs()) {
                var item = dom.GetObject(itemID);
                if (item.IsTypeOf(OT_CHANNEL)) {
                    var device = dom.GetObject(item.Device());

                    ! Pruefen, ob Verschluss offen
                    ! Testen, ob Fenster Dachluken, usw. offen sind. Diese muessen dem jeweiligen Raum und dem "Gewerk_Verschluss" zugeordnet sein
                    ! Alle Gewerke dem Raum zugeordneten Geraete untersuchen
                    ! Andere als die aufgefuehrten Sensoren oder Aktoren, die als Verschluss dienen, einfach in nachfolgender IF-Anweisung aendern oder ergaenzen.

                    !    Tuerfensterkontakte                   Jalousienaktor / Dachluken Funk         Jalousienaktor / Dachluken Wired          Schliesserkontakt-Sensor Hutschienenmontage  Fenster-Drehgriffsensoren             Funk-Rollladenaktor fuer Markenschalter
                    if ((device.HssType() == "HM-Sec-SC") || (device.HssType() == "HM-Sec-SC-2") || (device.HssType() == "HM-LC-Bl1-FM") || (device.HssType() == "HMW-LC-Bl1-DR")  || (device.HssType() == "HMW-Sen-SC-12-DR") || (device.HssType() == "HM-Sec-RHS") || (device.HssType() == "HM-Sec-RHS-2") || (device.HssType() == "HM-LC-Bl1PBU-FM") || (device.HssType() == "HmIP-SRH") || (device.HssType() == "HmIP-SWDO-I") || (device.HssType() == "HMIP-SWDO")|| (device.HssType() == "HmIP-SWDM")) {
                        var myChannel = dom.GetObject(item);
                        string id;
                        foreach(id, myChannel.ChnFunction()) {
                            var func = dom.GetObject(id);
                            if (func.Name() == Gewerk_Verschluss) {
                                if (item.State() > 0) {
                                    offen = offen + 1.00;
                                    if (debug) { WriteLine(device.HssType() # ": geöffnet"); }
                                } else { if (debug) { WriteLine(device.HssType() # ": geschlossen"); }}
                            }
                        }
                    }
                }
              }

            } else {
               if (sensoren) {
                   string id;
                   foreach (id, sensoren.Split(";")) {
                       var item = dom.GetObject(id);
                       if (item) {
                           if (item.State() > 0) {
                               offen = offen + 1.00;
                               if (debug) {WriteLine("Verschluss (" # id # ") ist offen!");}
                           } else {
                               if (debug) {WriteLine("Verschluss (" # id # ") ist geschlossen!");}
                           }
					   } else { if (debug) {WriteLine("Fehler:" # id # " ist kein Verschluss-Objekt!");}}
                   }
               }
            }

            ! Wenn ein Verschluss im Raum offen ist, dann Fenstertemperatur einstellen
            if (offen > 0) { ! Fenster offen, Ventile einstellen
                if (soll_ist <= grad_fenster) { ! Wenn soll_ist niedriger als grad_fenster (z.B. Ventile zu -> soll_ist = 0), dann nichts machen
                    soll_neu = soll_ist;
                } else {
                    soll_neu = grad_fenster;
                    prioritaet = true;
                }
            } else {

             ! Timestamp "Partytemperatur" festhalten
             boolean b_svVar = false;
             sv_timestamp = "1970-01-01 01:00:00";
                if (sv_Partytemperatur) {
                  svObj = dom.GetObject(sv_Partytemperatur);
                  if (svObj) {
                    sv_timestamp = svObj.Timestamp();

                    ! Partytemperatur testen und einstellen; -1 = deaktiviert
                    if (svObj.Value() > -1) { b_svVar = true; }
                  }
                }
                if (b_svVar) { !Wenn Partytemperatur, dann einstellen
                    soll_neu = svObj.Value();
                } else {

                    ! Pruefen ob Timestamp "Urlaub" juenger ist als "Partytemperatur" => Wenn ja, merken
                    if (sv_Urlaub1) {
                      svObj = dom.GetObject(sv_Urlaub1);
                      if (svObj) {
                          time settime = svObj.Timestamp();
                          if (settime > sv_timestamp) {sv_timestamp = settime;}
                     if ((svObj.State()) && (grad_urlaub > -1)) { boolean b_svVar = true; }
                      }
                    }
                    ! Urlaub testen und einstellen; -1 = deaktiviert
                    if (b_svVar) { !Wenn im Urlaub und grad_urlaub nicht -1 (deaktiviert)
                         soll_neu = grad_urlaub;
                    } else {
                        if (sv_Gaeste) {
                            ! Pruefen ob Timestamp "Gaeste" juenger ist als "Urlaub" => Wenn ja, merken
                            svObj = dom.GetObject(sv_Gaeste);
                            if (svObj) {
                                settime = svObj.Timestamp();
                                if (settime > sv_timestamp) {sv_timestamp = settime;}
                                ! Gaeste testen und einstellen, -1 = deaktiviert
                          if ((svObj.State()) && (grad_gaeste > -1)) { b_svVar = true; }
                            }
                        }
                        if (b_svVar){ !Wenn Gaeste im Haus und grad_gaeste nicht -1 (deaktiviert)
                             soll_neu = grad_gaeste;
                        } else {
                            if (sv_Anwesenheit) {
                                svObj = dom.GetObject(sv_Anwesenheit);
                                if (svObj) {
                                    ! Pruefen ob Timestamp "Anwesenheit" juenger ist als "Gaeste" => Wenn ja, merken
                                    settime = svObj.Timestamp();
                                    if (settime > sv_timestamp) {sv_timestamp = settime;}
                                    if ((!svObj.State()) && (grad_aa > -1)) { b_svVar = true; }
                                }
                            }
                            ! Differenzen von ausser Haus Testen und beachten
                            if (b_svVar) {
                                soll_neu = grad_aa;
                            } else {

                                string zeitleiste_heute;        ! Die Temperaturleiste fuer den aktuellen Tag.
                                string zeitleiste_gestern;      ! Die Temperaturleiste von gestern.
                                string heizwert;                ! Enthaelt den Wert, der in der Zeitleiste zum jetzigen Zeitpunkt gilt.

                                ! Hier nun die Auswertung der Zeitleisten
                                !Auswerten, welche Zeitleiste heute ist
                                integer tag = system.Date("%u");
                                if ((tag == 1) && (woche == 0)) {zeitleiste_heute = zeitleiste_mon;} else {
                                if ((tag == 2) && (woche == 0)) {zeitleiste_heute = zeitleiste_die;} else {
                                if ((tag == 3) && (woche == 0)) {zeitleiste_heute = zeitleiste_mit;} else {
                                if ((tag == 4) && (woche == 0)) {zeitleiste_heute = zeitleiste_don;} else {
                                if ((tag == 5) && (woche == 0)) {zeitleiste_heute = zeitleiste_fre;} else {
                                if ((tag == 6) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_sam;} else {
                                if ((tag == 7) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
                                if ((tag >= 1) && (tag <= 5) && ((woche == 1) || (woche == 3))) {zeitleiste_heute = zeitleiste_mon;} else {
                                if ((tag >= 6) && (tag <= 7) && (woche == 1)) {zeitleiste_heute = zeitleiste_sam;} else {
                                if (woche == 2) {zeitleiste_heute = zeitleiste_mon;} }}}}}}}}}

                                ! An Feiertagen oder bei Urlaub und zu Hause, gilt die Temperatur von Samstag bzw. Sonntag
                                b_svVar = false;
                                if (sv_Urlaub2) { svObj = dom.GetObject(sv_Urlaub2); if (svObj) { if (svObj.State()) { b_svVar = true; }}}
                                if (((b_svVar) || (dom.GetObject(sv_Feiertag).State())) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
                                if (((b_svVar) || (dom.GetObject(sv_Feiertag).State())) && (woche == 1)) {zeitleiste_heute = zeitleiste_sam;}}

                                ! Position der Zeitleiste bestimmen
                                if (system.Date("%M").ToInteger() > 29) {integer add = 1;} else {integer add = 0;}
                                integer sTime = (system.Date("%H").ToInteger()*2)+add;
                                heizwert = zeitleiste_heute.Substr(sTime, 1);

                                ! Temperatur bestimmen, die gesetzt werden soll
                                if (heizwert == "0") {soll_neu = grad_0;} else {
                                if (heizwert == "1") {soll_neu = grad_1;} else {
                                if (heizwert == "2") {soll_neu = grad_2;} else {
                                if (heizwert == "3") {soll_neu = grad_3;} else {
                                if (heizwert == "4") {soll_neu = grad_4;} else {
                                if (heizwert == "5") {soll_neu = grad_5;} else {
                                if (heizwert == "6") {soll_neu = grad_6;} else {
                                if (heizwert == "7") {soll_neu = grad_7;} else {
                                if (heizwert == "8") {soll_neu = grad_8;} else {
                                if (heizwert == "9") {soll_neu = grad_9;} }}}}}}}}}

                                ! letzte Solltemeratur bestimmen, dabei muss der wert von 00:00 beachtet werden - der letzte Wert war gestern
                                if (sTime == 0) {
                                    if ((tag == 1) && ((woche == 0) || (woche == 3))) {zeitleiste_gestern = zeitleiste_son;} else {
                                    if ((tag == 2) && (woche == 0)) {zeitleiste_gestern = zeitleiste_mon;} else {
                                    if ((tag == 3) && (woche == 0)) {zeitleiste_gestern = zeitleiste_die;} else {
                                    if ((tag == 4) && (woche == 0)) {zeitleiste_gestern = zeitleiste_mit;} else {
                                    if ((tag == 5) && (woche == 0)) {zeitleiste_gestern = zeitleiste_don;} else {
                                    if ((tag == 6) && (woche == 0)) {zeitleiste_gestern = zeitleiste_fre;} else {
                                    if ((tag == 7) && ((woche == 0) || (woche == 3))) {zeitleiste_gestern = zeitleiste_sam;} else {
                                    if ((tag >= 2) && (tag <= 6) && ((woche == 1) || (woche == 3))) {zeitleiste_gestern  = zeitleiste_mon;} else {
                                    if (((tag == 1) || (tag == 7)) && (woche == 1)) {zeitleiste_gestern = zeitleiste_sam;} else {
                                    if (woche == 2) {zeitleiste_gestern = zeitleiste_mon;} }}}}}}}}}

                                    heizwert = zeitleiste_gestern.Substr(47, 1);
                                } else {
                                    heizwert = zeitleiste_heute.Substr((sTime-1), 1);
                                }

                                ! Temperatur bestimmen, die in der letzten 30 Minutenn war
                                if (heizwert == "0") {soll_alt = grad_0;} else {
                                if (heizwert == "1") {soll_alt = grad_1;} else {
                                if (heizwert == "2") {soll_alt = grad_2;} else {
                                if (heizwert == "3") {soll_alt = grad_3;} else {
                                if (heizwert == "4") {soll_alt = grad_4;} else {
                                if (heizwert == "5") {soll_alt = grad_5;} else {
                                if (heizwert == "6") {soll_alt = grad_6;} else {
                                if (heizwert == "7") {soll_alt = grad_7;} else {
                                if (heizwert == "8") {soll_alt = grad_8;} else {
                                if (heizwert == "9") {soll_alt = grad_9;} }}}}}}}}}
                            } !Ende IF Anwesenheit
                        } !Ende IF Gaeste
                    } !Ende IF Urlaub
                } !Ende IF Partytemperatur
            } !Ende IF Fenster offen
        } !Ende IF Heizungsperiode

        ! Ende Ermittlung Solltemperatur
        ! ******************************

        if (soll_ist >= 0) { ! Wenn RT geantwortet hat (Sollwert konnte ausgelesen werden)...

            ! ...dann pruefen ob neue Solltemperatur in RT geschrieben werden muss.
            if (soll_ist <> soll_neu) { ! Wenn aktuelle Solltemperatur = neue Solltemp., dann nichts machen
                time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime(); ! wie spaet ist es jetzt?
                rt_timestamp = regler.Timestamp();
                integer diff = now.ToInteger() - rt_timestamp.ToInteger();

                if ((diff >= setdelta) || (prioritaet) || (soll_ist == grad_fenster) || (sv_timestamp >= rt_timestamp) || ((soll_ist == soll_alt) && (soll_alt <> soll_neu))) {
                    regler.State(soll_neu);
                    if (debug) {
                        WriteLine("Neue Solltemperatur (" # soll_neu.ToString(1) # "°C) an Thermostat gesendet!");
                        WriteLine("Letzter Zeitstempel (Sollwertänderung Thermostat): " # rt_timestamp);
                    }
                    if (syslog){
                        string stdout;
                        string stderr;
                        system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " neu gesetzt!\n", &stdout, &stderr);
                        system.Exec("logger -t script -p user.debug alte_Solltemperatur: " # soll_ist # " neue_Solltemperatur: " # soll_neu # "\n", &stdout, &stderr);
                        system.Exec("logger -t script -p user.debug Letzte_Aenderung: " # rt_timestamp # " Zeitdifferenz:_" # diff # "sek.", &stdout, &stderr);
                        system.Exec("logger -t script -p user.debug Offene_Luken: " # offen , &stdout, &stderr);
                    }
                } else {
                    if (debug) {
                        WriteLine("\rAuswertung (ODER-Verknüpfung):");
                        WriteLine("1. (diff >= setdelta) : ("#diff.ToString()#" >= "#setdelta.ToString()#") : "#(diff >= setdelta));
                        WriteLine("2. (prioritaet) : "#prioritaet);
                        WriteLine("3. (soll_ist == grad_fenster) : ("#soll_ist.ToString(1)#"°C == "#grad_fenster.ToString(1)#"°C) : "#(soll_ist == grad_fenster));
                        WriteLine("4. (sv_timestamp >= rt_timestamp) : ("#sv_timestamp#" >= "#rt_timestamp#") : "#(sv_timestamp >= rt_timestamp));
                        WriteLine("5. ((soll_ist == soll_alt) && (soll_alt <> soll_neu)) : (("#soll_ist.ToString(1)#"°C == "#soll_alt.ToString(1)#"°C) && ("#soll_alt.ToString(1)#"°C <> "#soll_neu.ToString(1)#"°C)) : "#((soll_ist == soll_alt) && (soll_alt <> soll_neu)));
                        WriteLine("Ergebnis = False = Keine Solltemperatur an Thermostat gesendet!");
                    }
                }
            } else { if (debug) { WriteLine("Keine neue Solltemperatur (" # soll_neu.ToString(1) #"°C)"); }}
        } else {
            if (syslog) {
                string stdout;
                string stderr;
                system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " antwortet nicht!", &stdout, &stderr);
            }
        }

Noch eine Frage, hat jemand den HMIP-SWDO ? Funktioniert der ?
Ich hatte beim Kopieren der Scriptstellen diesen als Vorlage genommen und damit ging mein HmIP-SWDM nicht.

-> Der Fehler war die Groß und Kleinschreibung von HmIP , als ich das für den SWDM korrigiert habe, hat es geklappt
Dann müsste man im Script ggf. den HMIP-SWDO in HmIP-SWDO umbenennen.


Gruß
Mike

Benutzeravatar
spitzlbergerj
Beiträge: 42
Registriert: 23.11.2014, 10:02
Kontaktdaten:

Re: Heizungsthermostatscript V2.0

Beitrag von spitzlbergerj » 17.02.2019, 10:34

Hallo beieinander, hallo Petrus, Hallo Eric,

ich habe noch eine sehr alte Version des Skriptes im Einsatz und möchte jetzt auf die neue 2.13 / 2.14 umstellen, insbesondere, weil meine Erweiterung zur Beibehaltung manueller Temperatureinstellungen nicht wirklich funktioniert ;-)

Beim Untersuchen der neuen 2.14 bin ich über den Umgang mit dem neuen Wandthermostat HM-TC-IT-WM-W-EU gestolpert.

Code: Alles auswählen

...
                    } else {
                        if ((device.HssType() == "HM-CC-TC") && (!IstWandthermostat)) {
                            if (OldItem<>device) {
                                regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SETPOINT");
                                soll_ist = regler.Value();
                                OldItem=device;
                                IstWandthermostat=true;
                                if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: HM-CC-TC)"); }
                            }
                        } else {
                            if ((device.HssType() == "HM-TC-IT-WM-W-EU") && (!IstWandthermostat)) {
                                if (OldItem<>device) {
                                    regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SET_TEMPERATURE");
                                    soll_ist = regler.Value();
                                    OldItem=device;
                                    if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: HM-TC-IT-WM-W-EU)"); }
                                }
                            } else {
...
Beim Wandthermostat HM-CC-TC wird

Code: Alles auswählen

IstWandthermostat=true
gesetzt, beim HM-TC-IT-WM-W-EU nicht. Ich kann im weiteren Verlauf des Skriptes keinen Grund dafür finden. In meiner alten Version behandle ich HM-TC-IT-WM-W-EU als Wandthermostat.

Warum wird HM-TC-IT-WM-W-EU in der 2.14 nicht als Wandthermostat behandelt? Oder hat sich hier ein Fehler eingeschlichen?

Und Eric,

noch eine andere Frage. Ich lasse mir alle relevanten Daten meiner Homematic über den selbstgebauten Smart Mirror https://forum.magicmirror.builders/topi ... gic-mirror anzeigen. Dafür schreibe und erweitere ich Module auf github.com. Sollten wir nicht auch dieses Skript auf github.com setzen? das würde die Versionsverwaltung einfacher machen? Ich helfe da gerne mit.
Grüße
Sepp

Fang nie an aufzuhören!
Hör nie auf anzufangen!
--------------------------------------------
CCU3, CCU2 in abgesetzter Garage
3x HM-RC-P1, 2x HM-LC-Sw4-PCB, 1x HM-RC-19, 1x HM-PB-4Dis-WM-2, 3x HM-ES-PMSw1-Pl-DN-R1, 1x HM-LC-Sw1-Pl-DN-R1, 3x HM-Sec-SCo, 15x HM-CC-RT-DN, 1x HM-PBI-4-FM, 9x HM-LC-Sw1-FM, 1x HM-LC-Sw1-PCB, 1x HM-LC-Sw2-FM, 6x HM-SwI-3-FM, 3x HM-PB-2-WM55-2, 1x HM-Sec-SC-2, 7x HM-TC-IT-WM-W-EU, 2x HM-PB-6-WM55, 1x HmIP-RCV-50, 4x HM-Sen-MDIR-O, 73 Systemvariable, 69 Programme
CUxD, Cloudmatic, RedMatic, HM-pdetect
Anbindung MagicMirror über diverse Module
--------------------------------------------

chka
Beiträge: 2482
Registriert: 13.02.2012, 20:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 300 Mal
Danksagung erhalten: 116 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von chka » 03.04.2019, 18:57

Habe auch das Problem mit dem HM-TC-IT-WM-W-EU und dem HM-CC-RT-DN es geht einfach nicht wieso.

musste von der 2.12 auf die neuste wechseln, wegen Wechsel auf x86ccu

lasse ich das script durchlaufen:
Soll-Ist = 20.0°C (HssType: HM-TC-IT-WM-W-EU)
Soll-Ist = 20.0°C (HssType: HM-CC-RT-DN)
HM-Sec-SC: geschlossen
HM-Sec-SC-2: geschlossen
Neue Solltemperatur (19°C) an Thermostat gesendet!
Letzter Zeitstempel (Sollwertänderung Thermostat): 2019-04-03 18:47:39
nach kurzer Zeit hüpf die Temperatur wieder auf den alten wert zurück.

was ich auch nicht verstehe ist was wird unter string thermostat = ""; angegeben HM-TC-IT-WM-W-EU oder HM-CC-RT-DN oder doch beide?


Noch ein Nachtrag, das script schreibt in den Steller aber das Thermostat überschreibt das ganze wieder nach ca. 1 Minute
RaspberryMatic - CuL 868mHz- CuxDemon - PioTek Tracker - Velux mit KLF200 und Somfy Anbindung- io.Broker auf Proxmox NUC6I3SYH i3-6100U RAM: 40Gig Crucial 8GB DDR4 CT2K8G4SFS824A + 32GB DDR4CT32G4SFD8266

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Xel66 » 03.04.2019, 21:00

Das ist logisch, weil entsprechend der Anleitung des Herstellers Solltemperaturen nicht an die physischen Geräte gesendet werden sollen, sondern ins erstellte virtuelle Gerät der Gruppe geschrieben werden sollen.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

chka
Beiträge: 2482
Registriert: 13.02.2012, 20:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 300 Mal
Danksagung erhalten: 116 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von chka » 03.04.2019, 21:22

sorry ich kann dir leider nicht folgen
RaspberryMatic - CuL 868mHz- CuxDemon - PioTek Tracker - Velux mit KLF200 und Somfy Anbindung- io.Broker auf Proxmox NUC6I3SYH i3-6100U RAM: 40Gig Crucial 8GB DDR4 CT2K8G4SFS824A + 32GB DDR4CT32G4SFD8266

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“