Link/Skript-Sammlung

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

BadenPower

Re: Script Probleme (überarbeitete Skripts)

Beitrag von BadenPower » 27.07.2016, 15:02

Xel66 hat geschrieben:Vielleicht hat Dr.Pill ja Zeit und Lust, das anzupassen.
Wenn er dazu Lust hat, dann gebe ich ihm noch folgenden Testcode zu Hand, denn dieser wird vom Excel-Macro von Dr.Pill auch nicht richtig ausgewertet:

Code: Alles auswählen

string lVar1;
string lVar2 = "
string lVar3;
string lVar4;
"; 
string lVar5;
string lVar6 = "string lVar7"; 
string lVar8; !string lVar9; 
die korrekte Ausgabe wäre hier:

Code: Alles auswählen

5 Variabeln
lVar1
lVar2
lVar5
lVar6
lVar8

Dr.Pill
Beiträge: 26
Registriert: 21.07.2013, 18:41

Re: Script Probleme (überarbeitete Skripts)

Beitrag von Dr.Pill » 30.07.2016, 10:23

Hallo zusammen,

das Excel-Programm ist ein einfacher Parser, der nach Angaben in der eq3-Dokumentation programmiert wurde. Das einfache VBA-Macro sucht nicht, nach allen Möglichkeiten der Programmierkunst wie das Script von Badenpower. Es ist eher einfach aufgebaut für Standarddeklarationen.
Es soll helfen, die Anzahl der Variablen zu minimieren. Ich bin eher "old school", möchte gerne sprechende Variablennamen behalten.
Daher versuche ich, zusammen mit den automatisch erstellten Querverweisen, meine oder kopierte (freie) Scripte so zu optimieren, dass weniger Variablennamen entstehen. Versuche sogar dabei, mich an die sowieso angelegten EQ3-Variablen (system interne Programme) zu halten.
Ich sehe, dass Programm eher als Versuch die Variablen dauerhaft in Excel zu pflegen und vor allem zu dokumentieren.

In meiner zu pflegenden CCU2 ist ein Variablennamen nicht gefunden worden (1/179). Sie ist im gebräuchlichen Heizungsscript "versteckt". "if .......... {integer add = 1;} else {integer add = 0;}"

Das VBA-Script kann leicht, von jedem der es nutzen möchte, um seine Bedürfnisse, auch in Aussehen und Form erweitert werden.
Der einfache Code liegt offen und unterliegt ausdrücklich keinerlei Copyrights.(jedenfalls nicht von mir)

Anbei das Ergebnis meiner Variableliste (nur) meiner internen Variablen der systeminternen Programme, oder das was so deklariert ist.

Ich hoffe, dass dieses Excelsheet einigen helfen kann.

Michael

PS: Interne Variablen systeminterner Programme werden mitdokumentiert, jedenfalls bei Add-On "programmedrucken CCU2 1.1 modified by HMside"
Dateianhänge
Ergebnis.jpg
Ergebnis meiner Variableliste (nur) meiner internen Variablen der systeminternen Programme inkl. der Querverweise

tcfigge
Beiträge: 60
Registriert: 18.10.2015, 14:18
Hat sich bedankt: 1 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von tcfigge » 06.08.2016, 17:01

Hallo zusammen!

Ich habe das Servicemeldungen All Inclusiv Script von Alchy http://homematic-forum.de/forum/viewtop ... 31&t=24618, welches von dtp an sein zPNP http://homematic-forum.de/forum/viewtop ... 31&t=26282 angepasst wurde, "versucht" auf tmp umzustellen.

An meine Bedürfnisse wurde die Anwesenheitsvariable angepasst, der Ton von siren auf incoming, und die Farbe Orange auf Grey( da Orange bei mir irgendwie nicht funktioniert).

Ich habe nach der Umstellung alle mir möglichen Sabotagefehler ausgelöst. Das hat zumindest funktioniert.

Also, wer das Script gebrauchen kann. Bitte schön:

Code: Alles auswählen

! Servicemeldungen auslesen und senden über zPNP
! Version 1.1 (erstellt von Alchy, angepasst an das zPNP von dtp, angepasst an Tmp von tcfigge)
! Zum Benutzen: Neues Programm in der CCU wie folgt erstellen:
! WENN Systemzustand: Servicemeldungen im Wertebereich größer als 0 bei Aktualisierung auslösen
! DANN mit einer Sekunde Verzögerung Skript (und dann dieses Script komplett einfügen und mit o.k. bestätigen)
! 
! obligatorisches WebUI-Programm: "CCU PRG Push-Nachrichten"
! obligatorische Systemvariablen: "CCU SV Push Text", "CCU SV Push Prio"
! optionale Systemvariablen: "Anwesend_Thorsten", "CCU SV Pushover Sound"
!
! Unterschiede zu Alchys originalem Allinclusive-Skript: 
! nur Push-Dienste über das zPNP, zum Teil geänderte Variablen, Push-Nachricht bei autoack = 1, 
! kein BLOCK, kein USE_SYSVAR, kein WITHTIME, kein GO

! Löschen bestätigbarer Kommunikationsstörungen (1 = an, 0 = aus)
integer autoack = 1;
 
! ##### ab hier sind keine weiteren Einstellungen mehr notwendig #####

! +++++ Deklaration weiterer Variablen +++++
string tmpA; string tmpB = ""; string tmpC; string tmpD; string tmpE; string tmpF; string tmpG;  
string tmpH; string tmpI; string tmpJ; string tmpK; string tmpL; string tmpM; string tmpN; string tmpO; string tmpP; string tmpQ; string tmpR;
var tmpS; var tmpT;
integer tmpU = 1; integer tmpV = 0; integer tmpW = -2;
 
! +++++ Auslesen der Systemvariablen "Anwesend_Thorsten" +++++
if(dom.GetObject("Anwesend_Thorsten")){tmpU = dom.GetObject("Anwesend_Thorsten").Variable();}
 
! +++++ Sound für Pushover-Nachricht
if(dom.GetObject("CCU SV Pushover Sound")){dom.GetObject("CCU SV Pushover Sound").State("incoming");}
 
! +++++ Batteriezuweisungen inklusive Anzahl +++++
! noch nicht integrierte Geräte werden mit unbekannt ausgegeben
tmpH = "HM-RC-4\tHM-RC-4-B\tHM-RC-Sec3\tHM-RC-Sec3-B\tHM-RC-P1\tHM-RC-Key3\tHM-RC-Key3-B\tZEL_STG_RM_HS_4";
tmpI = "HM-SCI-3-FM\tHM-PBI-4-FM\tHM-PB-2-WM\tHM-SwI-3-FM\tHM-PBI-4-FM\tHM-Sec-TiS";
tmpJ = "HM-Sec-SC\tHM-Sec-SC2\tHM-Sec-SC-2\tHM-Sec-RHS";
tmpK = "HM-CC-VD\tHM-CC-RT-DN\tHM-Sec-WDS\tHM-Sec-WDS-2\tHM-CC-TC\tHM-Dis-TD-T\tHB-UW-Sen-THPL-I\tHM-TC-IT-WM-W-EU\tHM-WDS40-TH-I\tHM-WDS40-TH-I-2\tHM-WDS10-TH-O\tHmIP-SMI\tHMIP-eTRV\tHM-WDS30-OT2-SM-2";
tmpL = "HM-Sec-MDIR\tHM-Sec-MDIR-2\tHM-Sec-SD\tHM-Sec-Key\tHM-Sec-Key-S\tHM-Sec-Key-O\tHM-Sen-Wa-Od\tHM-Sen-MDIR\tHM-Sen-MDIR-O\tHM-Sen-MDIR-O-2\tHM-WDS100-C6-O\tHM-WDS100-C6-O-2";
tmpM = "HM-ES-TX-WM\tHM-CCU-1";
tmpN = "HM-Sec-SCo\tHM-RC-4-2\tHM-RC-Key4-2\tHM-RC-Sec4-2\tHmIP-KRCA\tHMIP-SWDO";
tmpO = "HM-OU-CFM-TW\tHM-PB-6-WM55\tHM-Sen-MDIR-WM55\tHM-PBI-2-FM\tHM-RC-8\tHM-Sen-DB-PCB\tHB-UW-Sen-THPL-O\tHM-Sen-EP\tHM-WDS30-T-O\tHM-WDS30-OT2-SM\tHM-TC-IT-WM-W-EU\tHM-Dis-WM55\tHM-PB-2-WM55\tHM-PB-2-WM55-2\tHM-Sen-MDIR-SM\tHMIP-WTH\tHMIP-WRC2";
tmpP = "HM-PB-4Dis-WM\tHM-Sen-LI-O";
tmpQ = "HM-RC-19\tHM-RC-19-B\tHM-RC-12\tHM-RC-12-B\tHM-RC-12-W";
tmpR = "HM-LC-Sw1-Ba-PCB\tHM-LC-Sw4-PCB\tHM-MOD-EM-8\tHM-MOD-Re-8\tHM-Sen-RD-O\tHM-OU-CM-PCB\tHM-LC-Sw4-WM";

if(dom.GetObject(ID_SERVICES)){
  if(dom.GetObject(41).Value() > dom.GetObject(41).LastValue()){
    foreach(tmpG, dom.GetObject(ID_SERVICES).EnumIDs()){
      if(dom.GetObject(tmpG).IsTypeOf(OT_ALARMDP) && (dom.GetObject(tmpG).AlState() == asOncoming)){
        tmpS = dom.GetObject(dom.GetObject(tmpG).AlTriggerDP());
        tmpT = tmpS.Value();
        tmpC = dom.GetObject(tmpS.Channel());
        tmpD = dom.GetObject(tmpC.Device());
        tmpA = tmpS.AlDestMapDP().Name().StrValueByIndex(".", 2);
        
        ! Meldungen über bestätigbare Kommunikationsstörungen automatisch löschen +++++
        if((tmpA == "STICKY_UNREACH") && (autoack == 1)){
          dom.GetObject(tmpG).AlReceipt();
          tmpA = "<font color='green'>Meldung über bestätigbare Kommunikationsstörung gelöscht.</font>"; tmpV = -2; if(tmpV >= tmpW){tmpW = tmpV;}
        }

        ! Übersetzen der Fehlermeldungen               
        if(tmpA == "CONFIG_PENDING"){tmpA = "Konfigurationsdaten stehen zur Übertragung an."; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
        if(tmpA == "DEVICE_IN_BOOTLOADER"){tmpA = "Gerät startet neu."; tmpV = -2; if(tmpV >= tmpW){tmpW = tmpV;}}
        if(tmpA == "LOWBAT"){tmpA = "<font color='blue'>Spannung Batterien/Akkus gering. </font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
        if(tmpA == "STICKY_UNREACH"){tmpA = "Kommunikation war gestört."; tmpV = -2; if(tmpV >= tmpW){tmpW = tmpV;}}
        if(tmpA == "UNREACH"){tmpA = "<font color='blue'>Kommunikation gestört.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
        if(tmpA == "UPDATE_PENDING"){tmpA = "Update verfügbar."; tmpV = -2; if(tmpV >= tmpW){tmpW = tmpV;}}
        if(tmpA == "U_SOURCE_FAIL"){tmpA = "Netzteil ausgefallen."; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
        if(tmpA == "USBH_POWERFAIL"){tmpA = "USB-Host deaktiviert."; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
        
       ! Sonderfehler
        if(tmpA == "ERROR"){
          if((tmpD.HssType()=="HM-Sec-RHS") || (tmpD.HssType()=="HM-Sec-SC") || (tmpD.HssType()=="HM-Sec-SC-2") || (tmpD.HssType()=="HM-Sec-SCo") || (tmpD.HssType()=="HM-Sec-MD") || (tmpD.HssType()=="HM-Sec-MDIR") || (tmpD.HssType()=="HM-Sec-MDIR-2")){
            if(tmpT == 7){
              if(tmpU == 0){tmpA = "<font color='red'>SABOTAGE.</font>"; tmpV = 1; if(tmpV >= tmpW){tmpW = tmpV;}}
              if(tmpU == 1){tmpA = "<font color='blue'>Sabotage.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
            }
          }   
          if((tmpD.HssType()=="HM-Sec-Key") || (tmpD.HssType()=="HM-Sec-Key-S") || (tmpD.HssType()=="HM-Sec-Key-O")){
            if(tmpT == 1){tmpA = "<font color='blue'>Einkuppeln fehlgeschlagen.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
            if(tmpT == 2){tmpA = "<font color='blue'>Motorlauf abgebrochen.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
          }
          if(tmpD.HssType()=="HM-CC-VD"){
            if(tmpT == 1){tmpA = "<font color='blue'>Stellantrieb blockiert.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
            if(tmpT == 2){tmpA = "<font color='blue'>Ventil nicht montiert.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
            if(tmpT == 3){tmpA = "<font color='blue'>Stellbereich zu klein.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
            if(tmpT == 4){tmpA = "<font color='blue'>Spannung Batterien/Akkus gering. </font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
          }
        }

        if(tmpA == "FAULT_REPORTING"){
          if(tmpD.HssType()=="HM-CC-RT-DN"){
            if(tmpT == 1){tmpA = "<font color='blue'>Ventil blockiert.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
            if(tmpT == 2){tmpA = "<font color='blue'>Einstellbereich Ventil zu groß.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
            if(tmpT == 3){tmpA = "<font color='blue'>Einstellbereich Ventil zu klein.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
            if(tmpT == 4){tmpA = "<font color='blue'>Kommunikationsfehler.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
            if(tmpT == 6){tmpA = "<font color='blue'>Spannung Batterien/Akkus gering. </font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
            if(tmpT == 7){tmpA = "<font color='blue'>Fehlstellung Ventil.</font>"; tmpV = -1; if(tmpV >= tmpW){tmpW = tmpV;}}
          }
        }

        if(tmpA == "Spannung Batterien/Akkus gering. "){
          tmpF = "unbekannt";
          foreach(tmpE, tmpH){if(tmpE == tmpD.HssType()){tmpF = "<font color='blue'>1x CR2016 wechseln!</font>";}}
          foreach(tmpE, tmpI){if(tmpE == tmpD.HssType()){tmpF = "<font color='blue'>1x CR2032 wechseln!</font>";}}
          foreach(tmpE, tmpJ){if(tmpE == tmpD.HssType()){tmpF = "<font color='blue'>2x LR44 (AG13) wechseln!</font>";}}
          foreach(tmpE, tmpK){if(tmpE == tmpD.HssType()){tmpF = "<font color='blue'>2x Mignon AA (LR6) wechseln!</font>";}}
          foreach(tmpE, tmpL){if(tmpE == tmpD.HssType()){tmpF = "<font color='blue'>3x Mignon AA (LR6) wechseln!</font>";}}
          foreach(tmpE, tmpM){if(tmpE == tmpD.HssType()){tmpF = "<font color='blue'>4x Mignon AA (LR6) wechseln!</font>";}}
          foreach(tmpE, tmpN){if(tmpE == tmpD.HssType()){tmpF = "<font color='blue'>1x Micro AAA (LR3) wechseln!</font>";}}
          foreach(tmpE, tmpO){if(tmpE == tmpD.HssType()){tmpF = "<font color='blue'>2x Micro AAA (LR3) wechseln!</font>";}}
          foreach(tmpE, tmpP){if(tmpE == tmpD.HssType()){tmpF = "<font color='blue'>3x Micro AAA (LR3) wechseln!</font>";}}
          foreach(tmpE, tmpQ){if(tmpE == tmpD.HssType()){tmpF = "<font color='blue'>3x Akkus Micro AAA (LR3) aufladen!</font>";}}
          foreach(tmpE, tmpR){if(tmpE == tmpD.HssType()){tmpF = "<font color='blue'>1x 9V-Block wechseln!</font>";}}                   
          tmpB = tmpB#"\n"#tmpD.Name()#" - "#tmpA#tmpF;
        }
        else{
          tmpB = tmpB#"\n"#tmpD.Name()#" - "#tmpA;
        }
      }
    }

    ! +++++ Setzen der Systemvariablen "CCU SV Push Prio" für die Push-Nachricht +++++
    dom.GetObject("CCU SV Push Prio").State(tmpW);
 
    ! +++++ Erzeugen der Nachricht +++++
    tmpA = "Servicemeldung!";
    tmpA = tmpA#tmpB;
 
    ! +++++ Programm "CCU PRG Push-Nachrichten" ausführen +++++
    dom.GetObject("CCU SV Push Text").State(tmpA);
    dom.GetObject("CCU PRG Push-Nachrichten").ProgramExecute();
  }
}
Ich hoffe ich habe alle erwischt und es läuft...

Bis dahin!
Viele Grüße
tcfigge
--------------------------------------------
223 Kanäle in 70 Geräten und 82 CUxD-Kanäle in 7 CUxD-Geräten:
3x HM-PB-6-WM55, 7x HM-ES-PMSw1-Pl, 3x HM-Sen-MDIR-O-2, 2x HM-Sec-TiS, 7x CUX28, 1x HM-RC-Key4-2, 4x HM-LC-Dim1T-FM, 6x HM-Sec-SC-2, 1x HM-Sec-Key, 3x HM-LC-Sw1-FM, 4x HM-Sec-SCo, 2x HMIP-WTH, 9x HM-LC-Bl1-FM, 2x HM-LC-Sw2-FM, 3x HM-LC-Sw1PBU-FM, 1x HM-LC-Sw4-WM, 1x HM-OU-CFM-Pl, 3x HM-Sec-RHS, 1x HM-Sen-RD-O, 1x HM-PB-4Dis-WM, 1x HM-PBI-4-FM, 1x HMIP-PSM, 11x HM-CC-RT-DN
--------------------------------------------

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

Re: Script Probleme (überarbeitete Skripts)

Beitrag von chka » 07.08.2016, 20:39

Danke für die klasse Arbeit!!!
Hat sich schon wer an das Heitzungsscript gemacht
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

Tharanis
Beiträge: 119
Registriert: 15.04.2015, 11:39
Hat sich bedankt: 2 Mal
Danksagung erhalten: 5 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von Tharanis » 07.08.2016, 22:47

Ja, ich habe die Heizungsscripte mit tmp-Variablen versehen. Allerdings sind mir dabei ein paar Variablen durch die Lappen gegangen, also ein paar Variablen haben noch ihren alten Namen. Durch das Script von Badenpower ist mir das aufgefallen. Wenn ich das korrigiert habe, kann ich die tmp-Variante zur Verfügung stellen. Das kann aber noch ein paar Tage dauern, wenn es so viel Zeit hat...
DWD-Unwetterwarnscript v1.32.b03 (RaspberryMatic) - Lüftungswarnung auf Temperatur-Basis

RaspberryMatic (3.65.11.20221005) - Längste Laufzeit bislang: 48 Tage (RaspberryMatic), 72 Tage (CCU2), >100 Tage (CCU1)

Benutzeravatar
AndiN
Beiträge: 2621
Registriert: 10.06.2015, 08:54
Wohnort: Hennef
Hat sich bedankt: 10 Mal
Danksagung erhalten: 28 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von AndiN » 07.08.2016, 22:53

... und wenn Du es hier postest, dann packe ich das auf die erste Seite.

Brauche nur noch den eigentlichen Autor + Themalink, damit ich das schön sauber hinterlegen kann.

:-)

Andi
Andi (Greenhorn)

Letzter Reboot: 17.03.24 => FW Update (Uptime:Rekord:153 Tage)
Systeminfos: Raspberry Pi3 Firmware: 3.75.6.20240316 142 Geräte
System angebunden: 3 Roomba 650 - Sprachausgabe via Home24 Media - Pocket Control
- Zentrale: Asus TF103 mit Home24 Tablet
Addons: Drucken 2.5 - HQ WebUI 2.5.9 - XML-API 1.22 - CUx-Daemon 2.9.3 - E-Mail 1.7.4 - hm_pdetect 1.11 - VPN cloudmatic
Diverse Links

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Script Probleme (überarbeitete Skripts)

Beitrag von JPS » 08.08.2016, 23:31

Hallo und zunächst herzlichen Dank an alle, die hier mitgewirkt haben.

Ich habe diesen Thread in einem Beitrag auf meinem Blog verlinkt und dort die wesentlichen Skripte zu meinen eigenen Tutorials (Stromzähler, Gaszähler, Ölverbrauch, Schimmelanalyse etc.) in der angepassten Form gelistet.

Darüber hinaus habe ich noch einige "fremde" Skripte umgestellt, die ich hier zur Verfügung stellen möchte...

EDIT
In Ansprache mit AndiN habe ich die Skripte in einzelne Beiträge verschoben, damit sie von der ersten Seite besser zu verlinken sind
/EDIT
Zuletzt geändert von JPS am 11.08.2016, 15:04, insgesamt 2-mal geändert.
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

Benutzeravatar
AndiN
Beiträge: 2621
Registriert: 10.06.2015, 08:54
Wohnort: Hennef
Hat sich bedankt: 10 Mal
Danksagung erhalten: 28 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von AndiN » 09.08.2016, 06:41

@JPS: Danke Dir.

Werde die Skripte vorne mit rein packen. Mit dem Tageszeiten ist mir am Wochenende auch aufgefallen. Hatte irgendeine andere tmp genommen (wusste nicht, wie ich auf die Schnelle raus finde welche noch frei ist und habe eine von hinten genommen ;-)

Werde ich auch gleich mit rein stellen.

Andi
Andi (Greenhorn)

Letzter Reboot: 17.03.24 => FW Update (Uptime:Rekord:153 Tage)
Systeminfos: Raspberry Pi3 Firmware: 3.75.6.20240316 142 Geräte
System angebunden: 3 Roomba 650 - Sprachausgabe via Home24 Media - Pocket Control
- Zentrale: Asus TF103 mit Home24 Tablet
Addons: Drucken 2.5 - HQ WebUI 2.5.9 - XML-API 1.22 - CUx-Daemon 2.9.3 - E-Mail 1.7.4 - hm_pdetect 1.11 - VPN cloudmatic
Diverse Links

Tharanis
Beiträge: 119
Registriert: 15.04.2015, 11:39
Hat sich bedankt: 2 Mal
Danksagung erhalten: 5 Mal

Re: Script Probleme (überarbeitete Skripts)

Beitrag von Tharanis » 09.08.2016, 18:53

Heizungsthermostatscript V2.0

Das Heizungsscript stammt ursprünglich aus der Feder von erik und wurde seitdem u.a. von Petrus und MartinS verbessert: http://homematic-forum.de/forum/viewtop ... 60#p142493

Es gibt in dem Forenthema noch andere Varianten des Heizungsscripts. Ich selber nutze aber nur noch diese Variante. Ich habe die tmp-Variablen nochmal durchgesehen und neu ersetzt. Nun sollten keine anderen Variablennamen mehr vorhanden sein, außer die tmp-Variablen. Ein Testlauf verlief bei mir ohne Probleme.

Hier nun meine tmp-Variablen-Variante:

Code: Alles auswählen

string tmpA = "Zimmer" ; ! Zimmer-Name

! Version 2.0
! Script von Erik Groennerud - 8.2009- MM.2013
! Ergaenzung von Zauberlehrling
! Optimiert und ergaenzt von Petrus (Peter)
! Performance Ideen von Goersch 
! Ergaenzungen von Martin Schneider
! tmp-Variablen-Umschreibung von Tharanis


! Definition Thermostat - Abfrage/Setzen der Temperatur: BidCos-RF.<SERIENNUMMER>:<KANALNUMMER>.<DATENPUNKT>
!   HM-CC-TC           BidCos-RF.<SERIENNUMMER>:2.SETPOINT
!   HM-CC-RT-DN        BidCos-RF.<SERIENNUMMER>:4.SET_TEMPERATURE
!   HM-TC-IT-WM-W-EU   BidCos-RF.<SERIENNUMMER>:2.SET_TEMPERATURE
string tmpB = "BidCos-RF.JEQ0123456:2.SETPOINT";  

! Definition Sensoren: BidCos-RF.<SERIENNUMMER>:<KANALNUMMER>.<DATENPUNKT>
!   HM-Sec-SC-2        BidCos-RF.<SERIENNUMMER>:1.STATE
! Hier koennen 0 bis n-Geraete rein - mit ";" trennen oder "" fuer kein Geraet (ohne Leerzeichen)
string tmpC = "BidCos-RF.KEQ0123456:1.STATE;BidCos-RF.KEQ7654321:1.STATE";   

! Temperaturen 6-30 Grad, 0 = OFF, 100=ON
real tmpD = 18.0; ! grad_0
real tmpE = 19.0; ! grad_1
real tmpF = 19.5; ! grad_2
real tmpG = 20.0; ! grad_3
real tmpH = 20.5; ! grad_4
real tmpI = 21.0; ! grad_5
real tmpJ = 21.5; ! grad_6
real tmpK = 22.0; ! grad_7
real tmpL = 22.5; ! grad_8
real tmpM = 23.0; ! grad_9

real tmpN  = 6;         ! Temperatur bei offenem Fenster -1 = off - Grad_fenster
real tmpO  = 18;        ! Temperatur im Urlaub -1 = off - Grad_urlaub
real tmpP  = 18.5;        ! Temperatur fuer Gaeste -1 = off - Grad_gaeste
real tmpQ  = 18;        ! Temperatur ausser haus, wird als Absenkung benutzt, -1 = OFF (immer Anwesenheit) - tmpQ

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

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

integer tmpT = 1;            ! Welche Zeitleiste aktiv ist

if (tmpT == 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 tmpA2 = "000000000000000000000000000000000033355555555330"; ! Zeitleiste Montag
string tmpB2 = "000000000000000000000000000000000033355555555330"; ! Zeitleiste Dienstag
string tmpC2 = "000000000000000000000000000000000033355555555330"; ! Zeitleiste Mittwoch
string tmpD2 = "000000000000000000000000000000000033355555555330"; ! Zeitleiste Donnerstag
string tmpE2 = "000000000000000000000000000022335555555555555330"; ! Zeitleiste Freitag
string tmpF2 = "000000000000113335555555553355555555555555544433"; ! Zeitleiste Samstag
string tmpG2 = "000000000000113335555555553355555555555555544433"; ! Zeitleiste Sonntag
};
if (tmpT == 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 tmpA2 = "000000000000000000000000000000000033355555555330"; ! Zeitleiste Montag
string tmpB2 = "000000000000000000000000000000000033355555555330"; ! Zeitleiste Dienstag
string tmpC2 = "000000000000000000000000000000000033355555555330"; ! Zeitleiste Mittwoch
string tmpD2 = "000000000000000000000000000000000033355555555330"; ! Zeitleiste Donnerstag
string tmpE2 = "000000000000000000000000000022335555555555555330"; ! Zeitleiste Freitag
string tmpF2 = "000000000000113335555555553355555555555555544433"; ! Zeitleiste Samstag
string tmpG2 = "000000000000113335555555553355555555555555544433"; ! Zeitleiste Sonntag
};

boolean tmpU = 0;             ! Debug Infos ins Syslog - sollte immer auf 0 sein, nur bei Problemen auf 1

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

! Umwandeln tmpR in Sekunden
integer tmpV = tmpR.Substr(0, 2).ToInteger();
integer tmpW = tmpR.Substr(3, 2).ToInteger();
integer tmpX = (tmpV * 3600) + (tmpW * 60);

! SN aus tmpB bestimmen
string tmpY = tmpB.Substr(10, (tmpB.Find(":") - 10));

object tmpZ;                ! Datenobjekt des Reglers fuer die Solltemperatur (Kanal 2)

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

time tmpD1;            ! Zeitstempel der Systemvariablen, die zuletzt geaendert worden ist (Wert in Sekunden).
time tmpE1;            ! Zeitstempel, wann die Solltemperatur im RT zuletzt gesetzt wurde.
boolean tmpF1 = false;   ! Ist tmpF1 = true, dann wird die neue Solltemperatur auf jeden Fall in den Regler geschrieben. Prioritaet
 
!Wenn keine Heizperiode, dann Heizkoerper auf - Bei Einsatz von HM-CC-RT-DN muss der tmpA1-Wert auf 30 gesetzt werden, sonst gibt es einen zu hohen Duty-Cycle
if (dom.GetObject('Heizperiode').State()) {
    tmpA1 = 100;
    tmpF1 = true;
   
    ! Aktuelle Solltemperatur auslesen
    object tmpZ = dom.GetObject(tmpB);
    tmpC1 = tmpZ.Value();

} else {

    integer tmpG1 = 0;
        
    tmpZ = dom.GetObject(tmpB);
    tmpC1 = tmpZ.Value();
    if ( tmpC != "" ) {
        string tmpH1;
        foreach (tmpH1,tmpC.Split(";")) {
            object tmpI1 = dom.GetObject(tmpH1);
            if (tmpI1.State() > 0) {
                tmpG1 = tmpG1 + 1.00;
            }
        }
    }  
    
    ! Wenn ein Verschluss im Raum offen ist, dann Fenstertemperatur einstellen   
    if (tmpG1 > 0) { ! Fenster offen, Ventile einstellen
        if (tmpC1 <= tmpN) { ! Wenn tmpC1 niedriger als tmpN (z.B. Ventile zu -> tmpC1 = 0), dann nichts machen
            tmpA1 = tmpC1;
        } else {
            tmpA1 = tmpN;
            tmpF1 = true;
        }
    } else {

        ! Timestamp "Partytemperatur" festhalten
        tmpD1 = dom.GetObject('Partytemperatur').Timestamp();

        ! Partytemperatur testen und einstellen, -1 = deaktiviert
        integer tmpJ1 = dom.GetObject('Partytemperatur').State();
        if (tmpJ1 > -1) { !Wenn Partytemperatur, dann einstellen
            tmpA1 = tmpJ1;
        } else {
           
            ! Pruefen ob Timestamp "Urlaub" juenger ist als "Partytemperatur" => Wenn ja, merken
            time tmpK1 = dom.GetObject('Urlaub').Timestamp();
            if (tmpK1 > tmpD1) {tmpD1 = tmpK1;}
        
            ! Urlaub testen und einstellen, -1 = deaktiviert
            if ((dom.GetObject('Urlaub').State()) && (tmpO > -1)) { !Wenn im Urlaub und tmpO nicht -1 (deaktiviert)
                  tmpA1 = tmpO;
            } else {

                ! Pruefen ob Timestamp "Gaeste" juenger ist als "Urlaub" => Wenn ja, merken
                tmpK1 = dom.GetObject('Gaeste').Timestamp();
                if (tmpK1 > tmpD1) {tmpD1 = tmpK1;}

                ! Gaeste testen und einstellen, -1 = deaktiviert
                if ((dom.GetObject('Gaeste').State()) && (tmpP > -1)){ !Wenn Gaeste im Haus und tmpP nicht -1 (deaktiviert)
                    tmpA1 = tmpP;
                } else {
                
                    ! Pruefen ob Timestamp "Anwesenheit" juenger ist als "Gaeste" => Wenn ja, merken
                    tmpK1 = dom.GetObject('Anwesenheit.Heizung').Timestamp();
                    if (tmpK1 > tmpD1) {tmpD1 = tmpK1;}

                    ! Differenzen von ausser Haus Testen und beachten
                    if ((!dom.GetObject('Anwesenheit.Heizung').State()) && (tmpQ > -1)) {
                        tmpA1 = tmpQ;
                    } else {

                        string tmpL1;        ! Die Temperaturleiste fuer den aktuellen Tag. Zeitleiste heute
                        string tmpM1;      ! Die Temperaturleiste von gestern. Zeitleiste gestern
                        string tmpN1;                ! Enthaelt den Wert, der in der Zeitleiste zum jetzigen Zeitpunkt gilt. heizwert

                        ! Hier nun die Auswertung der Zeitleisten
                        !Auswerten, welche Zeitleiste heute ist
                        integer tmpO1 = system.Date("%u");
                        if ((tmpO1 == 1) && (tmpS == 0)) {tmpL1 = tmpA2;} else {
                        if ((tmpO1 == 2) && (tmpS == 0)) {tmpL1 = tmpB2;} else {
                        if ((tmpO1 == 3) && (tmpS == 0)) {tmpL1 = tmpC2;} else {
                        if ((tmpO1 == 4) && (tmpS == 0)) {tmpL1 = tmpD2;} else {
                        if ((tmpO1 == 5) && (tmpS == 0)) {tmpL1 = tmpE2;} else {
                        if ((tmpO1 == 6) && ((tmpS == 0) || (tmpS == 3))) {tmpL1 = tmpF2;} else {
                        if ((tmpO1 == 7) && ((tmpS == 0) || (tmpS == 3))) {tmpL1 = tmpG2;} else {
                        if ((tmpO1 >= 1) && (tmpO1 <= 5) && ((tmpS == 1) || (tmpS == 3))) {tmpL1 = tmpA2;} else {
                        if ((tmpO1 >= 6) && (tmpO1 <= 7) && (tmpS == 1)) {tmpL1 = tmpF2;} else {
                        if (tmpS == 2) {tmpL1 = tmpA2;} }}}}}}}}}
                  
                        ! An Feiertagen gilt die Temperatur von Samstag bzw. Sonntag
                        if (dom.GetObject('Feiertag').State() && ((tmpS == 0) || (tmpS == 3))) {tmpL1 = tmpG2;} else {
                        if (dom.GetObject('Feiertag').State() && (tmpS == 1)) {tmpL1 = tmpF2;}}
                   
                        ! Position der Zeitleiste bestimmen
                        if (system.Date("%M").ToInteger() > 29) {integer tmpP1 = 1;} else {integer tmpP1 = 0;}
                        integer tmpQ1 = (system.Date("%H").ToInteger()*2)+tmpP1;
                        tmpN1 = tmpL1.Substr(tmpQ1, 1);
             
                        ! Temperatur bestimmen, die gesetzt werden soll
                        if (tmpN1 == "0") {tmpA1 = tmpD;} else {
                        if (tmpN1 == "1") {tmpA1 = tmpE;} else {
                        if (tmpN1 == "2") {tmpA1 = tmpF;} else {
                        if (tmpN1 == "3") {tmpA1 = tmpG;} else {
                        if (tmpN1 == "4") {tmpA1 = tmpH;} else {
                        if (tmpN1 == "5") {tmpA1 = tmpI;} else {
                        if (tmpN1 == "6") {tmpA1 = tmpJ;} else {
                        if (tmpN1 == "7") {tmpA1 = tmpK;} else {
                        if (tmpN1 == "8") {tmpA1 = tmpL;} else {
                        if (tmpN1 == "9") {tmpA1 = tmpM;} }}}}}}}}}

                        ! letzte Solltemeratur bestimmen, dabei muss der wert von 00:00 beachtet werden - der letzte Wert war gestern
                        if (tmpQ1 == 0) {
                            if ((tmpO1 == 1) && ((tmpS == 0) || (tmpS == 3))) {tmpM1 = tmpG2;} else {
                            if ((tmpO1 == 2) && (tmpS == 0)) {tmpM1 = tmpA2;} else {
                            if ((tmpO1 == 3) && (tmpS == 0)) {tmpM1 = tmpB2;} else {
                            if ((tmpO1 == 4) && (tmpS == 0)) {tmpM1 = tmpC2;} else {
                            if ((tmpO1 == 5) && (tmpS == 0)) {tmpM1 = tmpD2;} else {
                            if ((tmpO1 == 6) && (tmpS == 0)) {tmpM1 = tmpE2;} else {
                            if ((tmpO1 == 7) && ((tmpS == 0) || (tmpS == 3))) {tmpM1 = tmpF2;} else {
                            if ((tmpO1 >= 2) && (tmpO1 <= 6) && ((tmpS == 1) || (tmpS == 3))) {tmpM1  = tmpA2;} else {
                            if (((tmpO1 == 1) || (tmpO1 == 7)) && (tmpS == 1)) {tmpM1 = tmpF2;} else {
                            if (tmpS == 2) {tmpM1 = tmpA2;} }}}}}}}}}
                       
                            tmpN1 = tmpM1.Substr(47, 1);
                        } else {
                            tmpN1 = tmpL1.Substr((tmpQ1-1), 1);
                        }
     
                        ! Temperatur bestimmen, die in der letzten 30 Minutenn war
                        if (tmpN1 == "0") {tmpB1 = tmpD;} else {
                        if (tmpN1 == "1") {tmpB1 = tmpE;} else {
                        if (tmpN1 == "2") {tmpB1 = tmpF;} else {
                        if (tmpN1 == "3") {tmpB1 = tmpG;} else {
                        if (tmpN1 == "4") {tmpB1 = tmpH;} else {
                        if (tmpN1 == "5") {tmpB1 = tmpI;} else {
                        if (tmpN1 == "6") {tmpB1 = tmpJ;} else {
                        if (tmpN1 == "7") {tmpB1 = tmpK;} else {
                        if (tmpN1 == "8") {tmpB1 = tmpL;} else {
                        if (tmpN1 == "9") {tmpB1 = tmpM;} }}}}}}}}}
                    } !Ende IF Anwesenheit
                } !Ende IF Gaeste
            } !Ende IF Urlaub
        } !Ende IF Partytemperatur
    } !Ende IF Fenster offen
} !Ende IF Heizungsperiode

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

    ! Workaround fuer automatisches setzen der Zeitstempel im Thermostat
    ! Es wird nur noch eine Systemvariable "LastChg_LEQxxxxxxx" vom Typ Zeichenkette verwendet.
    var tmpR1 = dom.GetObject('LastChg_' # tmpY);
    time tmpS1;
    real tmpT1 = -1;
    if (tmpR1 != null) {
        string tmpU1 = tmpR1.Variable();
        if (tmpU1.Find(";") >= 0) {
            tmpS1 = tmpU1.StrValueByIndex(";", 0).ToTime();
            tmpT1 = tmpU1.StrValueByIndex(";", 1).ToFloat();
        }

        if (tmpC1 != tmpT1) {
            ! Temperatur wurde manuell verstellt, neu abspeichern
            tmpU1 = system.Date("%Y-%m-%d %H:%M:%S") # ";" # tmpC1.ToString();
            tmpR1.Variable(tmpU1);
            tmpS1 = tmpU1.StrValueByIndex(";", 0).ToTime();
            tmpT1 = tmpU1.StrValueByIndex(";", 1).ToFloat();            
        }        
    }
    
    ! ...dann pruefen ob neue Solltemperatur in RT geschrieben werden muss.
    if (tmpC1 <> tmpA1) { ! Wenn aktuelle Solltemperatur = neue Solltemp., dann nichts machen
           
        tmpZ = dom.GetObject(tmpB);
        time tmpV1 = system.Date("%Y-%m-%d %H:%M:%S").ToTime(); ! wie spaet ist es jetzt?
        if (tmpR1 != null) {
            tmpE1 = tmpS1;
        } else {
            tmpE1 = tmpZ.Timestamp();
        }
        integer tmpW1 = tmpV1.ToInteger() - tmpE1.ToInteger();

        if ((tmpW1 >= tmpX) || (tmpF1) || (tmpC1 == tmpN) || (tmpD1 >= tmpE1) || ((tmpC1 == tmpB1) && (tmpB1 <> tmpA1))) {
           
            ! Temperatur setzen                       
            tmpZ.State(tmpA1);
            
            ! Abspeichern der neuen Soll-Temperatur zum Vergleich bei manueller Aenderung.
            ! Alten Zeitstempel und nicht den aktuellen verwenden, da sonst Probleme mit tmpW1/tmpX
            if (tmpR1 != null) {
                tmpR1.Variable('2010-01-01 00:00:00' # ';' # tmpA1.ToString());
            }

            integer tmpX1 = 1;
            if (tmpU) {
            dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.tmpU Raumthermostat " # tmpA # " neu gesetzt!\n");
            dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.tmpU alte_Solltemperatur: " # tmpC1 # " neue_Solltemperatur: " # tmpA1 # "\n");
            dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.tmpU Letzte_Aenderung: " # tmpE1 # " Zeitdifferenz:_" # tmpW1 # "sek.");
                }
            } 
        }
    } else {
        dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.tmpU Raumthermostat " # tmpA # " antwortet nicht!");
    }
Im Vergleich zur Version von MartinS sind bei dieser Version die System.exec-Befehle durch CuxD ersetzt.

Ich habe bei den Zeitleisten extra einen Sprung in der Reihenfolge der Variablenbenennung gemacht, damit die Zeitleisten nicht durch unterschiedlich lange Variablennamen schwerer lesbar sind. Die Reihenfolge der Variablennamen greife ich danach wieder auf.

EDIT: Ich habe im Script die Systemvariable "Anwesenheit" in "Anwesenheit.Heizung" geändert. Bei mir hat das den Hintergrund, dass ich eine TRennung von der normalen Abwesenheit haben wollte, aber trotzdem die Heizung auf Abwesend stellen können wollte. In den Originalscripten heisst die Systemvariable aber "Anwesenheit".
Zuletzt geändert von Tharanis am 09.08.2016, 23:22, insgesamt 2-mal geändert.
DWD-Unwetterwarnscript v1.32.b03 (RaspberryMatic) - Lüftungswarnung auf Temperatur-Basis

RaspberryMatic (3.65.11.20221005) - Längste Laufzeit bislang: 48 Tage (RaspberryMatic), 72 Tage (CCU2), >100 Tage (CCU1)

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

Re: Script Probleme (überarbeitete Skripts)

Beitrag von chka » 09.08.2016, 18:57

Klasse Danke,

das werde ich aber erst umstellen, wenn man es auch testen kann :-)

Das sind echt viele Variablen :shock:
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 Zentrale (CCU / CCU2 / CCU3 / Charly)“