Heizungssteuerung via Script funktioniert nicht mehr seit CCU3

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Heizungssteuerung via Script funktioniert nicht mehr seit CCU3

Beitrag von Tomiliy » 19.05.2019, 21:17

Hallo,

seit ich meine CCU2 hatte, hatt ich das Script zur Heizungssteuerung von: viewtopic.php?f=31&t=3480&p=51543&hilit ... rud#p51543

Jetzt bin ich auf die CCU3 umgestiegen und alle meine Heizkörper stehen auf OFF.
Variable ist aber richtig gesetzt..
Folgende Meldung kommt in var/log/messages

Code: Alles auswählen

May 19 20:30:00 ccu3-webui local0.err ReGaHss: ERROR: ScriptRuntimeError: string raum = "Abstellkammer" ;  ! Version 1.7.2 ! Script von Erik Groennerud - 8.2009- MM.2010 ! Ergaenzung von Zauberlehrling ! Optimiert und ergaenzt von Petrus (Peter) ! Folgende Systemvariable werden ben▒tigt: !  Heizperiode (boolean) 0 = Zentralheizung an, 1 = aus. Thermostate werden bei abgeschalteter Zentralheizung ge▒ffnet !  Gaeste (boolean) 1= G▒ste im Haus, 0 keine G▒ste !  Urlaub (boolean) 1= Im Urlaub, 0 zu Hause !  Anwesenheit (boolean) 1=zu Hause, 0 weg !  Partytemperatur,(zahl) default -1, Ansonsten Temperatur, Wertebereich: -1 bis 100 !  Feiertag (boolean) 1=Feiertag, 0 kein Feiertag  ! Temperaturen 8-30 Grad, 4,5 = OFF, 100=ON real grad_0 = 16; real grad_1 = 18; real grad_2 = 19; real grad_3 = 20; real grad_4 = 21; real grad_5 = 22; real grad_6 = 23; real grad_7 = 24; real grad_8 = 25; real grad_9 = 100;  real grad_fenster = 6;   ! Temperatur bei offenem Fenster -1 = off real grad_urlaub = 14;   ! Temperatur im Urlaub -1 = off real g
May 19 20:30:01 ccu3-webui local0.err ReGaHss: ERROR: ScriptRuntimeError: string raum = "Badezimmer_Wanne" ;  ! Version 1.7.2 ! Script von Erik Groennerud - 8.2009- MM.2010 ! Ergaenzung von Zauberlehrling ! Optimiert und ergaenzt von Petrus (Peter) ! Folgende Systemvariable werden ben▒tigt: !  Heizperiode (boolean) 0 = Zentralheizung an, 1 = aus. Thermostate werden bei abgeschalteter Zentralheizung ge▒ffnet !  Gaeste (boolean) 1= G▒ste im Haus, 0 keine G▒ste !  Urlaub (boolean) 1= Im Urlaub, 0 zu Hause !  Anwesenheit (boolean) 1=zu Hause, 0 weg !  Partytemperatur,(zahl) default -1, Ansonsten Temperatur, Wertebereich: -1 bis 100 !  Feiertag (boolean) 1=Feiertag, 0 kein Feiertag  ! Temperaturen 8-30 Grad, 0 = OFF, 100=ON real grad_0 = 6; real grad_1 = 18; real grad_2 = 19; real grad_3 = 20; real grad_4 = 21; real grad_5 = 22; real grad_6 = 23; real grad_7 = 24; real grad_8 = 25; real grad_9 = 100;  real grad_fenster = 6;   ! Temperatur bei offenem Fenster -1 = off real grad_urlaub = 14;   ! Temperatur im Urlaub -1 = off real g
May 19 20:30:01 ccu3-webui local0.err ReGaHss: ERROR: ScriptRuntimeError: string raum = "ElternSchlafzimmer" ;  ! Version 1.7.2 ! Script von Erik Groennerud - 8.2009- MM.2010 ! Ergaenzung von Zauberlehrling ! Optimiert und ergaenzt von Petrus (Peter) ! Folgende Systemvariable werden ben▒tigt: !  Heizperiode (boolean) 0 = Zentralheizung an, 1 = aus. Thermostate werden bei abgeschalteter Zentralheizung ge▒ffnet !  Gaeste (boolean) 1= G▒ste im Haus, 0 keine G▒ste !  Urlaub (boolean) 1= Im Urlaub, 0 zu Hause !  Anwesenheit (boolean) 1=zu Hause, 0 weg !  Partytemperatur,(zahl) default -1, Ansonsten Temperatur, Wertebereich: -1 bis 100 !  Feiertag (boolean) 1=Feiertag, 0 kein Feiertag  ! Temperaturen 8-30 Grad, 0 = OFF, 100=ON real grad_0 = 6; real grad_1 = 18; real grad_2 = 19; real grad_3 = 20; real grad_4 = 21; real grad_5 = 22; real grad_6 = 23; real grad_7 = 24; real grad_8 = 25; real grad_9 = 100;  real grad_fenster = 6;   ! Temperatur bei offenem Fenster -1 = off real grad_urlaub = 14;   ! Temperatur im Urlaub -1 = off real
May 19 20:30:02 ccu3-webui local0.err ReGaHss: ERROR: ScriptRuntimeError: string raum = "Garagen_Flur";   ! Version 1.7.2 ! Script von Erik Groennerud - 8.2009- MM.2010 ! Ergaenzung von Zauberlehrling ! Optimiert und ergaenzt von Petrus (Peter) ! Folgende Systemvariable werden ben▒tigt: !  Heizanlage (boolean) 0 = Zentralheizung an, 1 = aus. Thermostate werden bei abgeschalteter Zentralheizung ge▒ffnet !  Gaeste (boolean) 1= G▒ste im Haus, 0 keine G▒ste !  Urlaub (boolean) 1= Im Urlaub, 0 zu Hause !  Anwesenheit (boolean) 1=zu Hause, 0 weg !  Partytemperatur,(zahl) default -1, Ansonsten Temperatur, Wertebereich: -1 bis 100 !  Feiertag (boolean) 1=Feiertag, 0 kein Feiertag  ! Temperaturen 8-30 Grad, 0 = OFF, 100=ON real grad_0 = 6; real grad_1 = 18; real grad_2 = 19; real grad_3 = 20; real grad_4 = 21; real grad_5 = 22; real grad_6 = 23; real grad_7 = 24; real grad_8 = 25; real grad_9 = 100;  real grad_fenster = 6;   ! Temperatur bei offenem Fenster -1 = off real grad_urlaub = 14;   ! Temperatur im Urlaub -1 = off real grad_g
May 19 20:30:02 ccu3-webui user.debug script: Raumthermostat Garagen_Flur neu gesetzt!
May 19 20:30:02 ccu3-webui user.debug script: alte_Solltemperatur: 4.500000 neue_Solltemperatur: 0.000000
May 19 20:30:02 ccu3-webui user.debug script: Letzte_Aenderung: 2019-05-19 20:29:40 Zeitdifferenz:_22sek.
Außerdem habe ich die Meldung: May 19 21:04:56 ccu3-webui user.err Sniffing Mode: Can't remove device remotely
Ich weiß aber nicht was das bedeutet. Ich hab schon gelesen, und es hat evtl. was mit dem LAN HGateway zu tun. Ich hab schon überall den Haken entfernt.

Bitte: Hat jemand eine Idee wie ich meine Heizung wieder funktional bekomme?
Danke
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Heizungssteuerung via Script funktioniert nicht mehr seit CCU3

Beitrag von Tomiliy » 21.05.2019, 17:28

Hat keiner eine Idee?
Läuft euer Heizungsscript?

Anbei mal mein Script:

Code: Alles auswählen

string raum = "Hauseingang" ;

! Version 1.7.2
! Script von Erik Groennerud - 8.2009- MM.2010
! Ergaenzung von Zauberlehrling
! Optimiert und ergaenzt von Petrus (Peter)
! Folgende Systemvariable werden benötigt:
!  Heizperiode (boolean) 0 = Zentralheizung an, 1 = aus. Thermostate werden bei abgeschalteter Zentralheizung geöffnet
!  Gaeste (boolean) 1= Gäste im Haus, 0 keine Gäste
!  Urlaub (boolean) 1= Im Urlaub, 0 zu Hause
!  Anwesenheit (boolean) 1=zu Hause, 0 weg
!  Partytemperatur,(zahl) default -1, Ansonsten Temperatur, Wertebereich: -1 bis 100
!  Feiertag (boolean) 1=Feiertag, 0 kein Feiertag

! Temperaturen 8-30 Grad, 0 = OFF, 100=ON
real grad_0 = 6;
real grad_1 = 18;
real grad_2 = 19;
real grad_3 = 20;
real grad_4 = 21;
real grad_5 = 22;
real grad_6 = 23;
real grad_7 = 24;
real grad_8 = 25;
real grad_9 = 100;

real grad_fenster = 6;   ! Temperatur bei offenem Fenster -1 = off
real grad_urlaub = 14;   ! Temperatur im Urlaub -1 = off
real grad_gaeste = 21;   ! Temperatur fuer Gaeste -1 = off
real grad_aa = 19;   ! Temperatur ausser haus, wird als Absenkung benutzt, -1 = OFF (Anwesenheit)

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

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

! Steuerung welche Leiste aktiv sein soll. Normaler oder Winter Betrieb
var dp_temperatur_aussen = (dom.GetObject("Temperatur [°C]"));
var temperatur_aussen = dp_temperatur_aussen.State();
var tempsoll = 10;
if (temperatur_aussen < tempsoll) {
integer leiste = 2;            ! Wenn Temp unter 10 Grad dann Leiste 2
} else {
integer leiste = 1;            ! Sonst, bei über 10 Grads Leiste 1
};

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 = "333333333333333333333333333333333333333333333333";
string zeitleiste_die = "000000000000012210000000000000000011111111111110";
string zeitleiste_mit = "000000000000012210000000000000000011111111111110";
string zeitleiste_don = "000000000000012210000000000000000011111111111110";
string zeitleiste_fre = "000000000000012210000000000000000011111111111110";
string zeitleiste_sam = "333333333333355555555555555555555555555555555555";
string zeitleiste_son = "000000000000001111111111111111111112222111000000";
};
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 = "444444444444444444444444444444444444444444444444";
string zeitleiste_die = "000000000000012210000000000000000011111133321110";
string zeitleiste_mit = "000000000000012210000000000000000011111133321110";
string zeitleiste_don = "000000000000012211111111111111111111111133321110";
string zeitleiste_fre = "000000000000012110000000000000000011111133321110";
string zeitleiste_sam = "444444444444466666666666666666666666666666666666";
string zeitleiste_son = "000000000000001211111111111111111111223333221110";
};

boolean debug = 1;   ! Debug Infos ins Syslog

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

! 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;                ! Datenobjekt des Reglers für die Solltemperatur (Kanal 4)

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 geändert 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.
 
!Wenn keine Heizperiode, dann Heizkörper auf
if (dom.GetObject('Heizanlage').State()) {
    soll_neu = 4.5;
    prioritaet = true;

    var myAssembly = dom.GetObject(raum);
    string itemID;

    ! 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") {
                if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...

                    ! ...dann aktuelle Solltemperatur auslesen.
                    regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
                    soll_ist = regler.Value();
                }
            }
        }
    }
} else {
   
    ! Alle Geräte im "raum" abfragen und auswerten.
    var myAssembly = dom.GetObject(raum);
    string itemID;
    integer offen = 0;
      
    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") {
                if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...

                    ! ...dann aktuelle Solltemperatur auslesen.
                    regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
                    soll_ist = regler.Value();
                }

            } else {
            
                ! Prüfen, ob Verschluss offen
                ! Testen, ob Fenster Dachluken, usw. offen sind. Diese müssen dem jeweiligen Raum und dem Gewerk "Verschluss" zugeordnet sein
                ! Alle Gewerke dem Raum zugeordneten Geräte untersuchen
                ! Andere als die aufgeführten Sensoren oder Aktoren, die als Verschluss dienen, einfach in nachfolgender IF-Anweisung ändern oder ergänzen.

                     ! Türfensterkontakte                 Jalousienaktor / Dachluken Funk         Jalousienaktor / Dachluken Wired Schließerkontakt-Sensor Hutschienenmontage Fenster-Drehgriffsensoren
                if ((device.HssType() == "HM-Sec-SCo") || (device.HssType() == "HM-LC-Bl1-FM") || (device.HssType() == "HMW-LC-Bl1-DR")  || (device.HssType() == "HMW-Sen-SC-12-DR") || (device.HssType() == "HM-Sec-RHS")) {
                    var myChannel = dom.GetObject(item);
                    string id;
                    foreach(id, myChannel.ChnFunction()) {
                        var func = dom.GetObject(id);
                        if (func.Name() == "Verschluss") {
                            if (item.State() > 0) { offen = offen + 1.00; }
                        }
                    }
                }
            }
        }
    }
        
    ! 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
        sv_timestamp = dom.GetObject('Partytemperatur').Timestamp();

        ! Partytemperatur testen und einstellen, -1 = deaktiviert
        integer partytemperatur = dom.GetObject('Partytemperatur').State();
        if (partytemperatur > -1) { !Wenn Partytemperatur, dann einstellen
            soll_neu = partytemperatur;
        } else {
         
            ! Prüfen ob Timestamp "Urlaub" jünger ist als "Partytemperatur" => Wenn ja, merken
                time settime = dom.GetObject('Urlaub').Timestamp();
                if (settime > sv_timestamp) {sv_timestamp = settime;}
      
            ! Urlaub testen und einstellen, -1 = deaktiviert
            if ((dom.GetObject('Urlaub').State()) && (grad_urlaub > -1)) { !Wenn im Urlaub und grad_urlaub nicht -1 (deaktiviert)
                 soll_neu = grad_urlaub;
            } else {

                ! Prüfen ob Timestamp "Gaeste" jünger ist als "Urlaub" => Wenn ja, merken
                settime = dom.GetObject('Gaeste').Timestamp();
                if (settime > sv_timestamp) {sv_timestamp = settime;}

                ! Gaeste testen und einstellen, -1 = deaktiviert
                if ((dom.GetObject('Gaeste').State()) && (grad_gaeste > -1)){ !Wenn Gaeste im Haus und grad_gaeste nicht -1 (deaktiviert)
                     soll_neu = grad_gaeste;
                } else {
            
                    ! Prüfen ob Timestamp "Anwesenheit" jünger ist als "Gaeste" => Wenn ja, merken
                    settime = dom.GetObject('Anwesenheit').Timestamp();
                    if (settime > sv_timestamp) {sv_timestamp = settime;}

                    ! Differenzen von außer Haus Testen und beachten
                    if ((!dom.GetObject('Anwesenheit').State()) && (grad_aa > -1)) {
                        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 gilt die Temperatur von Samstag bzw. Sonntag
                        if (dom.GetObject('Feiertag_heute').State() && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
                        if (dom.GetObject('Feiertag_heute').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 muß 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

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

    ! ...dann prüfen 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 spät 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))) {
            
            ! Temperatur setzen                       
            regler.State(soll_neu);
            integer regler_gesetzt = 1;
            if (debug) {
                dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug Raumthermostat " # raum # " neu gesetzt!\n");
                dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug alte_Solltemperatur: " # soll_ist # " neue_Solltemperatur: " # soll_neu # "\n");
                dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug Letzte_Aenderung: " # rt_timestamp # " Zeitdifferenz:_" # diff # "sek.");
            }
        }  
    }
} else {
    dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug Raumthermostat " # raum # " antwortet nicht!"); 
}
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

Bratmaxe
Beiträge: 1573
Registriert: 28.05.2015, 12:48
Wohnort: Willich
Hat sich bedankt: 4 Mal
Danksagung erhalten: 10 Mal

Re: Heizungssteuerung via Script funktioniert nicht mehr seit CCU3

Beitrag von Bratmaxe » 22.05.2019, 15:47

Ich wüsste nicht wieso es nicht mehr laufen sollte.
Debugging ist im Script integriert und aktiviert, schau doch mal ins Syslog, was steht denn da so drin?

Wurde das Gewerk "Heizanlage" oder der Raum "Hauseingang" evtl. umbenannt?
Gruß Carsten

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Heizungssteuerung via Script funktioniert nicht mehr seit CCU3

Beitrag von Tomiliy » 22.05.2019, 22:21

Hm, ich weiß auch nicht, warum es nicht laufen sollte.
Deswegen wende ich mich ja an das Schwarmgehirn :-) Weil ich leider keine Ahnung mehr habe, wo ich suchen soll.
leider bin ich auch kein Programmierer und kann die Scripte zwar lesen, aber nicht entwicklen oder debuggen
Das ist eins von 11 Programmen, die die Heizkörper, bzw. das Programm triggern.
2019-05-22_22h07_55.png
Programmtrigger
Wie gesagt, das Script habe ich aus dem Forum hier vor ca. 3 Jahren übernommen (Siehe 1. Beitrag mit dem Ursprung & das Script in Beitrag 2)und unverändert laufen lassen. Alle 11 Programme liefen tadellos. Dann wechselte ich zur CCU3.

Mit dem Ergebnis das alle Heizkörper auf OFF gehen und in /var/log/Messeages die obigen Meldungen kommen.
Ich habe jetzt mal nur ein Programm aktiviert.

Code: Alles auswählen

! Steuerung welche Leiste aktiv sein soll. Normaler oder Winter Betrieb
var dp_temperatur_aussen = (dom.GetObject("Temperatur [°C]"));
var temperatur_aussen = dp_temperatur_aussen.State();
Die Temperaturvariable ist aktive und funktioniert:
2019-05-22_22h15_56.png
Temperatur
2019-05-22_22h15_56.png (7.04 KiB) 2564 mal betrachtet
2019-05-22_22h18_27.png
temperaturanzeige
2019-05-22_22h18_27.png (3.22 KiB) 2564 mal betrachtet
Auch der Raum ist vorhanden:
2019-05-22_22h22_45.png
raum
Mit dem Ergebnis das die Heizung sofort auf Off geht:
2019-05-22_22h20_04.png
Heizung
2019-05-22_22h20_04.png (19.13 KiB) 2564 mal betrachtet
Ich hoffe auf eine Idee oder einen Hinweis.
Jetzt habe ich im Log aber trotz Debug =1 keinen Hinweis, wenn ich das Programm starte. es kommt dort keine Meldung
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

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

Re: Heizungssteuerung via Script funktioniert nicht mehr seit CCU3

Beitrag von Xel66 » 23.05.2019, 00:43

Ich würde die Verwendung von Sonderzeichen in Systemvariablennamen, die auch in Scripten Verwendung finden sollen, grundsätzlich meiden. Das wird auch die Ursache für das Nichtfunktionieren sein.

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

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Heizungssteuerung via Script funktioniert nicht mehr seit CCU3

Beitrag von Tomiliy » 23.05.2019, 22:02

Hi @Xel66 Hi All.
Ich habe Xel66 Idee mal umgesetzt
Was mich ein bisschen Stutzig macht ist die Meldung an der Console:
ccu3-webui local0.err ReGaHss: ERROR: ScriptRuntimeError:....
Obwohl es im Script, Lt. Homematic keine Fehler gibt

Programm:

Code: Alles auswählen

string raum = "Garagen_Flur"; 

! Version 1.7.2
! Script von Erik Groennerud - 8.2009- MM.2010
! Ergaenzung von Zauberlehrling
! Optimiert und ergaenzt von Petrus (Peter)
! Folgende Systemvariable werden benötigt:
!  Heizanlage (boolean) 0 = Zentralheizung an, 1 = aus. Thermostate werden bei abgeschalteter Zentralheizung geöffnet
!  Gaeste (boolean) 1= Gäste im Haus, 0 keine Gäste
!  Urlaub (boolean) 1= Im Urlaub, 0 zu Hause
!  Anwesenheit (boolean) 1=zu Hause, 0 weg
!  Partytemperatur,(zahl) default -1, Ansonsten Temperatur, Wertebereich: -1 bis 100
!  Feiertag (boolean) 1=Feiertag, 0 kein Feiertag

! Temperaturen 8-30 Grad, 0 = OFF, 100=ON
real grad_0 = 6;
real grad_1 = 18;
real grad_2 = 19;
real grad_3 = 20;
real grad_4 = 21;
real grad_5 = 22;
real grad_6 = 23;
real grad_7 = 24;
real grad_8 = 25;
real grad_9 = 100;

real grad_fenster = 6;   ! Temperatur bei offenem Fenster -1 = off
real grad_urlaub = 14;   ! Temperatur im Urlaub -1 = off
real grad_gaeste = 21;   ! Temperatur fuer Gaeste -1 = off
real grad_aa = 19;   ! Temperatur ausser haus, wird als Absenkung benutzt, -1 = OFF (Anwesenheit)

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

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

! Steuerung welche Leiste aktiv sein soll. Normaler oder Winter Betrieb
var dp_temperatur_aussen = (dom.GetObject("Temperatur"));
var temperatur_aussen = dp_temperatur_aussen.State();
var tempsoll = 10;
if (temperatur_aussen < tempsoll) {
integer leiste = 2;            ! Wenn Temp unter 10 Grad dann Leiste 2
} else {
integer leiste = 1;            ! Sonst, bei über 10 Grads Leiste 1
};

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 = "333333333333333333333333333333333333333333333333";
string zeitleiste_die = "000000000000012210000000000000000011111111111110";
string zeitleiste_mit = "000000000000012210000000000000000011111111111110";
string zeitleiste_don = "000000000000012210000000000000000011111111111110";
string zeitleiste_fre = "000000000000012210000000000000000011111111111110";
string zeitleiste_sam = "333333333333355555555555555555555555555555555555";
string zeitleiste_son = "000000000000001111111111111111111112222111000000";
};
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 = "444444444444444444444444444444444444444444444444";
string zeitleiste_die = "000000000000012210000000000000000011111133321110";
string zeitleiste_mit = "000000000000012210000000000000000011111133321110";
string zeitleiste_don = "000000000000012211111111111111111111111133321110";
string zeitleiste_fre = "000000000000012110000000000000000011111133321110";
string zeitleiste_sam = "444444444444466666666666666666666666666666666666";
string zeitleiste_son = "000000000000001211111111111111111111223333221110";
};

boolean debug = 1;   ! Debug Infos ins Syslog

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

! 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;                ! Datenobjekt des Reglers für die Solltemperatur (Kanal 4)

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 geändert 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.
 
!Wenn keine Heizperiode, dann Heizkörper auf
if (dom.GetObject('Heizanlage').State()) {
    soll_neu = 4.5;
    prioritaet = true;

    var myAssembly = dom.GetObject(raum);
    string itemID;

    ! 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") {
                if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...

                    ! ...dann aktuelle Solltemperatur auslesen.
                    regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
                    soll_ist = regler.Value();
                }
            }
        }
    }
} else {
   
    ! Alle Geräte im "raum" abfragen und auswerten.
    var myAssembly = dom.GetObject(raum);
    string itemID;
    integer offen = 0;
      
    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") {
                if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...

                    ! ...dann aktuelle Solltemperatur auslesen.
                    regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
                    soll_ist = regler.Value();
                }

            } else {
            
                ! Prüfen, ob Verschluss offen
                ! Testen, ob Fenster Dachluken, usw. offen sind. Diese müssen dem jeweiligen Raum und dem Gewerk "Verschluss" zugeordnet sein
                ! Alle Gewerke dem Raum zugeordneten Geräte untersuchen
                ! Andere als die aufgeführten Sensoren oder Aktoren, die als Verschluss dienen, einfach in nachfolgender IF-Anweisung ändern oder ergänzen.

                     ! Türfensterkontakte                 Jalousienaktor / Dachluken Funk         Jalousienaktor / Dachluken Wired Schließerkontakt-Sensor Hutschienenmontage Fenster-Drehgriffsensoren
                if ((device.HssType() == "HM-Sec-SCo") || (device.HssType() == "HM-LC-Bl1-FM") || (device.HssType() == "HMW-LC-Bl1-DR")  || (device.HssType() == "HMW-Sen-SC-12-DR") || (device.HssType() == "HM-Sec-RHS")) {
                    var myChannel = dom.GetObject(item);
                    string id;
                    foreach(id, myChannel.ChnFunction()) {
                        var func = dom.GetObject(id);
                        if (func.Name() == "Verschluss") {
                            if (item.State() > 0) { offen = offen + 1.00; }
                        }
                    }
                }
            }
        }
    }
        
    ! 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
        sv_timestamp = dom.GetObject('Partytemperatur').Timestamp();

        ! Partytemperatur testen und einstellen, -1 = deaktiviert
        integer partytemperatur = dom.GetObject('Partytemperatur').State();
        if (partytemperatur > -1) { !Wenn Partytemperatur, dann einstellen
            soll_neu = partytemperatur;
        } else {
         
            ! Prüfen ob Timestamp "Urlaub" jünger ist als "Partytemperatur" => Wenn ja, merken
                time settime = dom.GetObject('Urlaub').Timestamp();
                if (settime > sv_timestamp) {sv_timestamp = settime;}
      
            ! Urlaub testen und einstellen, -1 = deaktiviert
            if ((dom.GetObject('Urlaub').State()) && (grad_urlaub > -1)) { !Wenn im Urlaub und grad_urlaub nicht -1 (deaktiviert)
                 soll_neu = grad_urlaub;
            } else {

                ! Prüfen ob Timestamp "Gaeste" jünger ist als "Urlaub" => Wenn ja, merken
                settime = dom.GetObject('Gaeste').Timestamp();
                if (settime > sv_timestamp) {sv_timestamp = settime;}

                ! Gaeste testen und einstellen, -1 = deaktiviert
                if ((dom.GetObject('Gaeste').State()) && (grad_gaeste > -1)){ !Wenn Gaeste im Haus und grad_gaeste nicht -1 (deaktiviert)
                     soll_neu = grad_gaeste;
                } else {
            
                    ! Prüfen ob Timestamp "Anwesenheit" jünger ist als "Gaeste" => Wenn ja, merken
                    settime = dom.GetObject('Anwesenheit').Timestamp();
                    if (settime > sv_timestamp) {sv_timestamp = settime;}

                    ! Differenzen von außer Haus Testen und beachten
                    if ((!dom.GetObject('Anwesenheit').State()) && (grad_aa > -1)) {
                        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 gilt die Temperatur von Samstag bzw. Sonntag
                        if (dom.GetObject('Feiertag_heute').State() && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
                        if (dom.GetObject('Feiertag_heute').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 muß 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

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

    ! ...dann prüfen 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 spät 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))) {
            
            ! Temperatur setzen                       
            regler.State(soll_neu);
            integer regler_gesetzt = 1;
            if (debug) {
                dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug Raumthermostat " # raum # " neu gesetzt!\n");
                dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug alte_Solltemperatur: " # soll_ist # " neue_Solltemperatur: " # soll_neu # "\n");
                dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug Letzte_Aenderung: " # rt_timestamp # " Zeitdifferenz:_" # diff # "sek.");
            }
        }  
    }
} else {
    dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug Raumthermostat " # raum # " antwortet nicht!"); 
}
Consolen Output in Var/log/messages:

Code: Alles auswählen

May 23 21:56:07 ccu3-webui local0.err ReGaHss: ERROR: ScriptRuntimeError: string raum = "Garagen_Flur";   ! Version 1.7.2 ! Script von Erik Groennerud - 8.2009- MM.2010 ! Ergaenzung von Zauberlehrling ! Optimiert und ergaenzt von Petrus (Peter) ! Folgende Systemvariable werden ben▒tigt: !  Heizanlage (boolean) 0 = Zentralheizung an, 1 = aus. Thermostate werden bei abgeschalteter Zentralheizung ge▒ffnet !  Gaeste (boolean) 1= G▒ste im Haus, 0 keine G▒ste !  Urlaub (boolean) 1= Im Urlaub, 0 zu Hause !  Anwesenheit (boolean) 1=zu Hause, 0 weg !  Partytemperatur,(zahl) default -1, Ansonsten Temperatur, Wertebereich: -1 bis 100 !  Feiertag (boolean) 1=Feiertag, 0 kein Feiertag  ! Temperaturen 8-30 Grad, 0 = OFF, 100=ON real grad_0 = 6; real grad_1 = 18; real grad_2 = 19; real grad_3 = 20; real grad_4 = 21; real grad_5 = 22; real grad_6 = 23; real grad_7 = 24; real grad_8 = 25; real grad_9 = 100;  real grad_fenster = 6;   ! Temperatur bei offenem Fenster -1 = off real grad_urlaub = 14;   ! Temperatur im Urlaub -1 = off real grad_g
May 23 21:56:07 ccu3-webui user.debug script: alte_Solltemperatur: 4.500000 neue_Solltemperatur: 0.000000
May 23 21:56:07 ccu3-webui user.debug script: Raumthermostat Garagen_Flur neu gesetzt!
May 23 21:56:07 ccu3-webui user.debug script: Letzte_Aenderung: 2019-05-23 21:55:33 Zeitdifferenz:_34sek.

Ich hoffe es kann mal jemand drüber gucken... und uns helfen.
Ich weiß nicht, was die Homeatic von mir will.
Please help
Danke
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

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

Re: Heizungssteuerung via Script funktioniert nicht mehr seit CCU3

Beitrag von Xel66 » 23.05.2019, 23:32

Tomiliy hat geschrieben:
23.05.2019, 22:02
Obwohl es im Script, Lt. Homematic keine Fehler gibt
Das ist eine reine Syntax-Prüfung. Es wird nicht das Script auf Funktion und korrekte Zuordnung von Datenpunkten geprüft. Darum besitzt diese Prüfung keine Aussagekraft.

Mich macht die Zeile "alte_Solltemperatur: 4.500000 neue_Solltemperatur: 0.000000" stutzig. Eine Solltemperatur von 0°C kann in den Thermostaten nicht gesetzt werden und wird logischerweise von diesen zurückgewiesen. Die kleinste Solltemperatur ist eben 4,5°C (aka OFF).

Beim Script selbst kann ich Dir nicht helfen. Für mich ist der Ersatz von im System vorhandenen Funktionen durch ein zyklisch laufendes Script auch nur bedingt sinnvoll. Diese Lösung hatte seine Berechtigung bei den alten Thermostaten, aber mit aktueller Hardware ist es m.E. überflüssig. Aber das ist meine persönliche Meinung. Jeder wie er will.

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

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Heizungssteuerung via Script funktioniert nicht mehr seit CCU3

Beitrag von Tomiliy » 24.05.2019, 09:16

Die Scripte sind schon einige Jahre alt.
Ich habe die nie in Frage gestellt, weil das schöne ist das man damit relative Problemfrei die Lösungen erreichen kann, die ich wollte.
Welche Alternative gäbe es denn?
Mich macht die Zeile "alte_Solltemperatur: 4.500000 neue_Solltemperatur: 0.000000" stutzig. Eine Solltemperatur von 0°C kann in den Thermostaten nicht gesetzt werden und wird logischerweise von diesen zurückgewiesen. Die kleinste Solltemperatur ist eben 4,5°C (aka OFF).
Das ist ja die Zeile um die es geht, die ich auch nicht verstehe... Und wenn du dir das Script ansiehst, da wird nirgendwo diese Gradzahl erstellt.
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

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

Re: Heizungssteuerung via Script funktioniert nicht mehr seit CCU3

Beitrag von Xel66 » 24.05.2019, 14:15

Tomiliy hat geschrieben:
24.05.2019, 09:16
Die Scripte sind schon einige Jahre alt.
Genau, und wurden für Hardware geschrieben, die ihre Sollwerte von der "Zentrale" bekamen und deren Betriebsmodus sich nicht per Programm umschalten ließ. Darum musste man auch derartige Winkelzüge anwenden, um das nachzubilden, was die aktuellen Geräte mit ihrer Profilsteuerung und Direktverknüpfung zu einem TFK völlig autark über die (je nach Gerät und Serie) hinterlegbaren Profil(e) leistet. Zuordnungen von Wochentag, Uhrzeit und Solltemperatur kann man für jedes Gerät dort im Profil hinterlegen. Abweichungen hierzu kann man jederzeit durch das Setzen einer anderen Solltemperatur per Programm, oder wenn gewünscht, auch manuell am Drehrädchen einstellen (wenn es der LAG gerade im Moment etwas kühl ist). Diese Temperatur wird dann bis zur nächsten Schaltzeit gehalten.
Tomiliy hat geschrieben:
24.05.2019, 09:16
Ich habe die nie in Frage gestellt, weil das schöne ist das man damit relative Problemfrei die Lösungen erreichen kann, die ich wollte.
Ja, weil Du damals schon die mitgelieferten Möglichkeiten ignoriert hast und dem Forum "auf den Leim gegangen" bist. Der Grund ist einfach. Threads zu diesen Scripts waren hier fast täglich unter den aktuellen, so dass der Einsteiger den Eindruck gewinnen musste, dass dieses der einzige und "richtige" Weg ist. die Möglichkeiten der aktuellen Hardware wurden nicht zur Kenntnis genommen. Spätestens mit Erscheinen der aktuellen Gerätegeneration war diese Lösung aber überholt, da das Script nicht viel mehr kann, als die in den Geräten hinterlegten Zeitprofile. In Deinem System laufen alle paar Minuten Scripts (je nach Tatkung zwischen 250 und 400 mal täglich) um durchschnittlich vier Schaltzeiten am Tag zu bedienen. Und das pro Gerät. Bei der Profilsteuerung läuft für diesen Zweck genau kein Script. Die Dinger machen das einfach von allein und denen ist egal, ob die CCU läuft. Die brauchen sie nur zum Sync der Uhrzeit ab und zu.

Fährt man in den Urlaub, werden die Thermostate per Programm auf manuell ECO-Temperatur gestellt. Im Sommer stellt man auch auf manuell und gibt die gewünschte Solltemperatur vor (ON oder OFF), so dass sie nichts mehr machen und die Batterien nicht belasten. Ist ein Feiertag, setzt man morgens die Wohlfühltemperatur und diese wird über den Tag gehalten. Natürlich braucht man für letzteren Zweck ein Programm (Script) was diesen Zustand für den aktuellen Tag ermittelt, weil das System von Haus aus keine Feiertage berechnen kann. Das braucht man aber für Deine Scriptlösung auch. Und solche Programme/Scripte laufen genau ein Mal am Tag. Und die Thermostate müssen nur umgesteuert werden, wenn sich dort Änderungen ergeben (Heizperiode, Urlaub etc.).
Tomiliy hat geschrieben:
24.05.2019, 09:16
Und wenn du dir das Script ansiehst, da wird nirgendwo diese Gradzahl erstellt.
Würde dieses nicht erstellt, dann würde sie nicht gesetzt. :-) Dein Log sagt aber, dass sie gesetzt wird. Und ohne den Inhalt der anderen Systemvariablen zu kennen, ist es auch schwer nachzvollziehen. Auf alle Fälle wird die Solltemperatur im oberen Scriptbereich initialisiert und besitzt dann keinen Inhalt. In der weiteren Folge wird dann vermutlich auf Grund der individuellen Konstellation kein Sollwert in die initialiserte Variable geschrieben und am Ende der Leere Inhalt als Solltemperatur geschrieben, weil 4.5 nun mal ungleich 0 ist.

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

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Heizungssteuerung via Script funktioniert nicht mehr seit CCU3

Beitrag von Tomiliy » 30.05.2019, 21:53

Du hast schon recht @Xel66, irgendwas setzt das ganze auf 0.
Aber was und wieso? Zumal es ja auf der CCU2 unverändert lief.

Anbei einmal die komplette Variablen Übersicht:
Ich hoffe du oder jemand kann damit was anfangen:
Ich fand die Programme schon genial... Und ich weiß nicht, wie ich das in der klicki Bunti Oberfläche abbilden soll.

Code: Alles auswählen


deltaStdMin	00:00
regler	BidCos-RF.LEQ0779044:4.SET_TEMPERATURE
stunde	0
tag	0
offen	0
debug	1
zeitleiste_gestern	 
soll_alt	0.000000
zeitleiste_mon	333333333333333333333333333333333333333333333333
zeitleiste_heute	 
woche	2
soll_ist	4.500000
partytemperatur	-1.000000
heizwert	 
prioritaet	false
grad_0	6
id	 
grad_1	18
grad_2	19
grad_aa	19
grad_3	20
grad_urlaub	14
add	0
grad_4	21
grad_5	22
grad_6	23
USER_ID	1361
zeitleiste_mit	000000000000012210000000000000000011111111111110
grad_7	24
raum	Garagen_Flur
grad_8	25
grad_9	100
myChannel	null
grad_fenster	6
sv_timestamp	2019-05-12 12:01:45
grad_gaeste	21
zeitleiste_fre	000000000000012210000000000000000011111111111110
setdelta	0
myAssembly	Garagen_Flur
device	TK-Garagentuer
soll_neu	0.000000
rt_timestamp	2019-05-30 21:28:56
settime	Urlaub
now	2019-05-30 21:29:12
regler_gesetzt	1
item	TK-Garagentuer:1
zeitleiste_son	000000000000001111111111111111111112222111000000
zeitleiste_don	000000000000012210000000000000000011111111111110
zeitleiste_sam	333333333333355555555555555555555555555555555555
zeitleiste_die	000000000000012210000000000000000011111111111110
itemID	52975
diff	16
sTime	0
minute	0
func	null

Code: Alles auswählen

6495	Feiertag_heute	 	Feiertag	 	Kein Feiertag;Feiertag	 	 	Logikwert			2019-05-30 05:00:00
48573	Feiertag_morgen	 	Kein Feiertag	 	Kein Feiertag;Feiertag	 	 	Logikwert			2019-05-30 05:00:00
1479	Gaeste	Sind Gaeste im Haus	Wir haben Gaeste	 	Wir haben keine Gaeste;Wir haben Gaeste	 	 	Logikwert			2019-05-12 12:01:45
40103	Heizanlage	0 = an; 1 = aus	ist in Betrieb	 	ist in Betrieb;ist aus	 	 	Logikwert			2019-05-27 00:04:52
45940	Partytemperatur	Partytemperatur	-1.00	 	 	-1	100	Zahl			2019-05-12 12:01:45
12229	Schulferien	Sind Schulferien	Nein	 	Nein;Ja	 	 	Logikwert			2019-05-30 04:00:01
3202	Temperatur	Temperatur [°C]	18.00	°C	 	-30	100	Zahl	
2019-05-30 21:00:08
2886	Urlaub	Urlaub	Wir sind nicht im Urlaub	 	Wir sind nicht im Urlaub;Wir sind im Urlaub	 	 	Logikwert			2019-05-12 12:01:45
3189	Windgeschwindigkeit [km/h]	Windgeschwindigkeit [km/h]	0.00	km/h	 	0	250	Zahl			
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“