Tip: "Verzögert um" aus Script heraus verändern

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

Moderator: Co-Administratoren

Antworten
Benutzeravatar
Black
Beiträge: 1801
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Tip: "Verzögert um" aus Script heraus verändern

Beitrag von Black » 15.04.2019, 13:09

Bekanntlich lässt die CCU mit bekannten und dokumentierten Boardmitteln keine Möglichkeit zu, in einem WebUI Programm Einträge von SingleDestinations sofort, verzögert um aus einem Programm heraus zu verändern.

Es geht aber, ist aber nicht gaaaanz so einfach.

basierend auf den Grundlagen eines Programmaufbaues, die ich hier: viewtopic.php?f=26&t=49806 mal beschreiben hatte, lässt sich ein Programm so darstellen:
ProgramRules.jpg
ich muss also, wenn ich die Verzögerung ändern möchte, folgendes kennen:

1. Den Programmnamen. (ok, das war das einfachste)
2. In welcher Rule (welchem Bedingungsblock) steht die SingleDestination, die ich verändern will
3. An welcher Stelle steht die Singledestination im DestinationBlock.

Hieraus erkennt man schon, es ist nicht ganz trivial, daran rumzumachen. Zugriff erfolgt über den Programmnamen, damit geht man der sich ändernden IDs bein Editieren erfolgreich aus dem Weg.
Aber nun kommt die Einschränkung:
Ich muss Rule und Singledestination numerischh angeben. Also änder ich da rum, in dem ich über der SingleDestination eine SingleDestination lösche, so ändert sich die nummer derjenigen, die ich ansprechen möchte. folglich würde ein Zugriff von einem externen Programm die falsche Singledestination packen. Das direkte angeben einer IseID wäre auch nicht zielführend, wird das programm mal leicht verändert (ohne die o.g. Punkte zu verletzen), so würden sich auch die ISE-IDs ändern.

DIESEN ABSCHNITT IMMER IM HINTERKOPF BEHALTEN


Wenn aber ein Programm an sich steht, man in der Programmbeschreibung hinterlegt hat, das ein Programm xyz die SDest mit der nummer R1SD1 verändert, lässt sich dieses beherrschen.
Mit einem externen Programm wie dem SDV lässt sich die Reaktion und das Ändern der Objecte natürlich auch schneller und effektiver beobachten und nachvollziehen als über webUI oder Scripte.

Wie funktioniert das nun:
In einem Programm, in dem ich in einem anderen Programm die verzögert um umschrieben möchte, folgenden Code hinzufügen und anpassen:

Code: Alles auswählen

!- Verzögerung setzen einer Programm SingleDestination
!- Black in Februar 2019 -
!-----------------------------------------------------
!- Parameter
!- Name des Programmes hier angeben (ID_PROGRAMS).Get("IchBineinNeuesProgramm")
!- ruleNr: Die Bedingung, in der die SDest verändert wird (wird von oben gezählz, erste Rule hat Nummer 1
!- Sdestnr: Nummer der SingleDestination, erste hat Nummer 1
!- Delay: verzögerung in Sekunden, 0 oder kleiner = keine verzögerung (sofort)

object oPRG= dom.GetObject (ID_PROGRAMS).Get("IchBineinNeuesProgramm");
integer ruleNr=2;
integer SdstNr=1;
integer delay=5;
! ------------------------------
!-  ab hier nix mehr ändern
object oSDEST;
if (oPRG) {
  object oRule= oPRG.Rule ();
  while (oRule && (ruleNr>1)){
     ruleNr=ruleNr-1;
     oRule= oRule.RuleSubRule ();
  }
  if (oRule && (ruleNr==1)) {
    object oDST= oRule.RuleDestination ();
    if (oDST) {
       if ((SdstNr<= oDST.DestSingleDestinations().Count ()) && (SdstNr>=1)) {
          oSDEST= oDST.DestSingleDestination (SdstNr-1);
       } else { WriteLine ("Ungültige SingleDestinationNummer");}
    } else { WriteLine ("Keine Destination angegeben"); }
  } else { WriteLine ("Ungültige Rulenummer");}
}
if (oSDEST) {
   if (oSDEST.Type() == OT_SINGLEDESTINATION) {
   if (delay<=0) {
       oSDEST.DestinationValueParamType ( ivtEmpty);
   } else {
       oSDEST.DestinationValueParamType ( ivtDelay);
       oSDEST.DestinationValueParam ( system.Date ("%F").ToTime ()+ delay );
   }}
}          
anpassen nur in den ersten Zeilen, der Programmname in dem Get,
die RuleNummer und die SingleDestinationNummer und die Verzögerungszeit eintragen.

das wars.

Black
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 3.45.7.20190507 mit Groundplane Antennenmod (Mein Grundstück ist halt etwas gross)
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker unter ProxMox auf NUC als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.3
SDV 3.08.11 Scripteditor und Objektinspektor

Benutzeravatar
Black
Beiträge: 1801
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Tip: "Verzögert um" aus Script heraus verändern

Beitrag von Black » 15.04.2019, 15:37

Weil das ganze ein bisschen kompliziert klingt, praktisches Beispiel:

webUI programm
WEBUI 1.jpg
Aktivitäten unter Wenn sind hier die Rule 1, also der erste bedingungsblock

Aktivitäten unter sonst: sind die Rule 2, der 2. Bedingungsblock.

Die erste Rule hat nur eine Singlecondition, wnen ich diese Anspreche, ist es rule 1, SCDN 1

Der Sonst Block hat 2 Single Conditions,
Alarmzone2 ist Rule2 SCND 1
und
CFG_TagGruppe ist >Rule 2 SCND 2

Im SDV aufgelöst ergibt sich das beschriebene Bild als Object Abfolge
WEBUI 2.jpg
Will ich jetzt z.b. die Verzögerung der Alarmzone 2 ändern so ist dieses: Rule 2 Single Condition 1
Beispielsweise auf 15 Sekunden

Code: Alles auswählen

!- Verzögerung setzen einer Programm SingleDestination
!- Black in Februar 2019 -
!-----------------------------------------------------
!- Parameter
!- Name des Programmes hier angeben (ID_PROGRAMS).Get("IchBineinNeuesProgramm")
!- ruleNr: Die Bedingung, in der die SDest verändert wird (wird von oben gezählz, erste Rule hat Nummer 1
!- Sdestnr: Nummer der SingleDestination, erste hat Nummer 1
!- Delay: verzögerung in Sekunden, 0 oder kleiner = keine verzögerung (sofort)

object oPRG= dom.GetObject (ID_PROGRAMS).Get("IchBineinNeuesProgramm");
integer ruleNr=2;
integer SdstNr=1;
integer delay=15;
! ------------------------------
!-  ab hier nix mehr ändern
object oSDEST;
if (oPRG) {
  object oRule= oPRG.Rule ();
  while (oRule && (ruleNr>1)){
     ruleNr=ruleNr-1;
     oRule= oRule.RuleSubRule ();
  }
  if (oRule && (ruleNr==1)) {
    object oDST= oRule.RuleDestination ();
    if (oDST) {
       if ((SdstNr<= oDST.DestSingleDestinations().Count ()) && (SdstNr>=1)) {
          oSDEST= oDST.DestSingleDestination (SdstNr-1);
       } else { WriteLine ("Ungültige SingleDestinationNummer");}
    } else { WriteLine ("Keine Destination angegeben"); }
  } else { WriteLine ("Ungültige Rulenummer");}
}
if (oSDEST) {
   if (oSDEST.Type() == OT_SINGLEDESTINATION) {
   if (delay<=0) {
       oSDEST.DestinationValueParamType ( ivtEmpty);
   } else {
       oSDEST.DestinationValueParamType ( ivtDelay);
       oSDEST.DestinationValueParam ( system.Date ("%F").ToTime ()+ delay );
   }}
}          
e voila:
WEBUI 3.jpg
Im Object wurde dies schon geändert

Im WebUi programm ist es nun auch geändert_
WEBUI 4.jpg

Würde ich in diesem Beispiel CFG_TagGruppe auf 2 Seknden verzögerung setzen wollen:
so sähe das programm dann so aus

Code: Alles auswählen

!- Verzögerung setzen einer Programm SingleDestination
!- Black in Februar 2019 -
!-----------------------------------------------------
!- Parameter
!- Name des Programmes hier angeben (ID_PROGRAMS).Get("IchBineinNeuesProgramm")
!- ruleNr: Die Bedingung, in der die SDest verändert wird (wird von oben gezählz, erste Rule hat Nummer 1
!- Sdestnr: Nummer der SingleDestination, erste hat Nummer 1
!- Delay: verzögerung in Sekunden, 0 oder kleiner = keine verzögerung (sofort)

object oPRG= dom.GetObject (ID_PROGRAMS).Get("IchBineinNeuesProgramm");
integer ruleNr=2;  !<<--- Die RuleNummer
integer SdstNr=2;  !<<-- Die 2. SingleDestination
integer delay=2;   !<---- 2 Sekunden verzögerung
! ------------------------------
!-  ab hier nix mehr ändern
object oSDEST;
if (oPRG) {
  object oRule= oPRG.Rule ();
  while (oRule && (ruleNr>1)){
     ruleNr=ruleNr-1;
     oRule= oRule.RuleSubRule ();
  }
  if (oRule && (ruleNr==1)) {
    object oDST= oRule.RuleDestination ();
    if (oDST) {
       if ((SdstNr<= oDST.DestSingleDestinations().Count ()) && (SdstNr>=1)) {
          oSDEST= oDST.DestSingleDestination (SdstNr-1);
       } else { WriteLine ("Ungültige SingleDestinationNummer");}
    } else { WriteLine ("Keine Destination angegeben"); }
  } else { WriteLine ("Ungültige Rulenummer");}
}
if (oSDEST) {
   if (oSDEST.Type() == OT_SINGLEDESTINATION) {
   if (delay<=0) {
       oSDEST.DestinationValueParamType ( ivtEmpty);
   } else {
       oSDEST.DestinationValueParamType ( ivtDelay);
       oSDEST.DestinationValueParam ( system.Date ("%F").ToTime ()+ delay );
   }}
}          

Black
Zuletzt geändert von Black am 15.04.2019, 15:50, insgesamt 1-mal geändert.
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 3.45.7.20190507 mit Groundplane Antennenmod (Mein Grundstück ist halt etwas gross)
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker unter ProxMox auf NUC als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.3
SDV 3.08.11 Scripteditor und Objektinspektor

Benutzeravatar
Black
Beiträge: 1801
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Tip: "Verzögert um" aus Script heraus verändern

Beitrag von Black » 15.04.2019, 15:37

Platzhalter...
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 3.45.7.20190507 mit Groundplane Antennenmod (Mein Grundstück ist halt etwas gross)
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker unter ProxMox auf NUC als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.3
SDV 3.08.11 Scripteditor und Objektinspektor

Antworten

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