Szenensteuerung mit HM Script

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

Moderator: Co-Administratoren

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Szenensteuerung mit HM Script

Beitrag von alchy » 29.08.2017, 20:01

In >> diesem Thread << kam die Frage auf nach einer Art Szenensteuerung auf.

Die Anfangsanforderung war:
  • per Knopfdruck speichern des Zustandes
  • Kanäle werden alle an oder umgeschalten durch was auch immer.
  • per Knopfdruck wird der "alte " Zustand wiederhergestellt
Darüber habe ich mir Gedanken gemacht, dies so einfach wie möglich und nur mittels HM-Script zu realisieren.
Mal sehen,was da noch daraus wird.

Zu den Scripten als Voraberklärung:

Teil 1 liest den Status der Kanäle in dem Gewerk aus und speichert diesen in der Systemvariable
Teil 2 liest den Sollstatus aus der Systemvariable aus, vergleicht diesen mit dem Status des Kanals zur Laufzeit des Scriptes und schaltet bei Bedarf dann den Kanal um.

Voraussetzungen:

Gehen wir davon aus, das man ein Gewerk oder Favoriten anlegt, welcher den ein oder anderen Aktor beinhaltet.
Im Beispiel ist es der Favorit mit dem Namen: Lichter
Gehen wir weiter davon aus, das der geneigte User eine Systemvariable Typ Zeichenkette in der CCU anlegt
Im Beispiel ist der Name: Name deiner Speichervariable

Damit sind die Vorrausetzungen eigentlich schon erfüllt.

Anwendunsgfälle:

da gibt es massig Anwendungsfälle, die ich mir vorstellen kann oder könnte. :mrgreen:
  • Lichter im Haus sind an, per Knopfdruck werden ALLE Lichter eingeschalten, danach soll der "alte Zustand wiederhergestellt werden.
  • Rolläden sind zumindest theoretisch auch integriert. Man fährt abends alle Rollos runter und will morgens den Zustand vom "vor dem Runterfahren" wiederherstellen.
    Ergo abends Teil ! laufen lassen, morgens Teil 2.
  • ihr lasst das Script auf eine Raum laufen. Stellt also das ein, was ihr immer so haben wollt, z.B. zum Fernsehschauen. Rollo runter, Dimmer Stehleuchte 20%, Aktor Fernseher ein....
    Teil 1 speichert die Szene in der Variable, Teil 2 würde die Aktoren dann per Tastendruck wieder herstellen wenn Ihr z.B. die Systemvariable Fernsehen auf true setzt......
Aber Achtung

Bitte beachten: Das Script ist strikt - Was an Kanälen im Gewerk enthalten ist, wird mit Teil 1 gescannt und gespeichert und mit Teil 2 wieder geschalten.
IHR müsst dafür sorgen,das auch nur das im Gewerk enthalten ist, was ihr auch gescannt und geschalten haben wollt.
Dafür könnt ihr es aber (UND das solltet ihr im Bedarfsfall auch machen) es vielfach anwenden. Ein Gewerk mit Lichtern, eines mit Rollos usw.
Dazu einfach eben mehrere Kopien des Scriptes benutzen mit unterschiedlichen Systemvariablen.


Beide Scripte arbeiten zu ihrer Laufzeit!
Ein Programm könnt ihr euch selber ausdenken, spielt keine Rolle.
Am Anfang macht es einfach mal Sinn zu schauen, was passiert und die Scripte jewels im Scriptexecuter oder unter Script testen auszuführen.
Es wird selbsterklärender Text auf dem Bildschirm ausgegeben.

Kurzanleitung
  • Gewerk / Favoriten / Raum ... anlegen & Kanäle zuordnen
  • Systemvariable anlegen
  • Kanäle irgendwie schalten
  • Script1 ausführen - Bildschirmausgabe beachten
  • Kanäle irgendwo anders hinschalten
  • Script 2 ausführen
und?

Falls etwas unklar ist melden.
Falls Fehler keine Funktion usw. >> Fehlerprotokoll << posten mit Angabe der Schaltzeit.



Script Teil 1:

Code: Alles auswählen

! Szenensteuerung Teil 1 durch Auslesen des Zustandes der Kanäle eines Gewerkes oder Favoriten und speichern in Systemvariable
! v 0.6 (c) by Alchy
string liste = "Licht"; ! Name des Gewerkes, Favoriten usw. auch mehrere Möglich dann trennen mit \t 
string sysvar = "Name deiner Speichervariable"; ! Name deiner Speichervariable Typ Zeichenkette welche die ISE_IDs der Datenpunkte enthalten soll 
! Dont touch behind this Line
string index;string slist;var status = "";integer an = 0;integer aus = 0;integer counter = 0; 
foreach (index, liste) {
object sec = dom.GetObject(index);
string itemId;
foreach(itemId, sec.EnumUsedIDs()) {
object item = dom.GetObject(itemId);
if (item.IsTypeOf(OT_CHANNEL)) {
object device = dom.GetObject(item.Device());
string hssType = item.HssType();
! Schalter
if ( (hssType == "SWITCH") && (item.DPByHssDP("STATE")) ) {
status = item.DPByHssDP("STATE").Value();
slist = slist# (item.DPByHssDP("STATE")).ID()#"="#status#" ";
if(status){ an = an+1; }else{ aus = aus+1;}}
!Dimmer
if ( (hssType == "DIMMER") && (item.DPByHssDP("LEVEL")) ) {
status = item.DPByHssDP("LEVEL").Value();
slist = slist# (item.DPByHssDP("LEVEL")).ID()#"="#status#" ";
if(status){ an = an+1; }else{ aus = aus+1;}
}
!RGBW_COLOR
if ( (hssType == "RGBW_COLOR") && (item.DPByHssDP("COLOR")) ) {
status = item.DPByHssDP("COLOR").Value();
slist = slist# (item.DPByHssDP("COLOR")).ID()#"="#status#" ";
if(status){ an = an+1; }else{ aus = aus+1;}
}
!IP Schalter
if ( (hssType == "SWITCH_VIRTUAL_RECEIVER") && (item.DPByHssDP("STATE")) ) {
status = item.DPByHssDP("STATE").Value();
slist = slist# (item.DPByHssDP("STATE")).ID()#"="#status#" ";
if(status){ an = an+1; }else{ aus = aus+1;}
}
!Rolloaktoren
if ( (hssType == "BLIND") && (item.DPByHssDP("LEVEL")) ) {
status = item.DPByHssDP("LEVEL").Value();
slist = slist# (item.DPByHssDP("LEVEL")).ID()#"="#status#" ";
if(status){ an = an+1; }else{ aus = aus+1;}
}
counter = an + aus;
}}
}
if (counter > 0) {
WriteLine("von "#counter #" gescannten Kanälen, sind "#an #" Kanäle an und "#aus#" Kanäle aus" );
slist = slist.Substr(0, slist.Length()-1);
WriteLine("\tDatenpunkt IDs "#slist #" aufgenommen");
if ( (dom.GetObject(ID_SYSTEM_VARIABLES)).Get(sysvar) ) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(slist); WriteLine("\t\tgespeichert")}else{WriteLine("Speichervariable nicht vorhanden");}
} else{
WriteLine ("Keine berücksichtigten Kanäle gescannt");
if ( (dom.GetObject(ID_SYSTEM_VARIABLES)).Get(sysvar) ) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(""); WriteLine("Speichervariable zurückgesetzt")}else{WriteLine("Speichervariable nicht vorhanden");}
}

Script Teil 2

Code: Alles auswählen

! Szenensteuerung Teil 2 Auslesen des Sollzustandes von Kanälen und Umschalten bei Bedarf
! v 0.5 (c) by Alchy
string sysvar = "Name deiner Speichervariable"; ! Name deiner Speichervariable Typ Zeichenkette welche die Ausgabe aus Teil 1 enthält
! Dont touch behind this Line
string liste = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).Value();
string index;string dpID;string dpsSTATE;string slist;       
foreach(index, liste.Split(" ")) {
dpID = index.StrValueByIndex("=",0);
dpsSTATE = index.StrValueByIndex("=",1);
object dp = (dom.GetObject(ID_DATAPOINTS)).Get(dpID);
if (dp){
var state = dp.Value(); 
slist = slist #"Datenpunkt "#dp.Name() #" Sollwert: "#dpsSTATE;
if (!dpsSTATE == state) { 
dp.State(dpsSTATE);
slist = slist #" Istwert: "#state #" nicht o.k. geschalten\n";  
}else{slist = slist #" Istwert: "#state #" in Ordnung\n";}
}else{WriteLine("Datenpunkt falsch");}
}
WriteLine(slist);

Es werden noch nicht alle möglichen Geräte unterstützt. Wenn wer eine Integration wünscht, dann bitte melden.
Zuletzt geändert von alchy am 22.11.2018, 08:03, insgesamt 2-mal geändert.

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

sailor79ac

Re: Szenensteuerung mit HM Script

Beitrag von sailor79ac » 30.08.2017, 09:04

Geschwindigkeitsbildplatzhalter:-)

Ernsthaft? 20:01 Uhr - 19:17 Uhr macht ne knappe 3/4 h :!: :shock: :mrgreen:

Vielen Dank für diese tolle Szenensteuerung, ich werd mich gleich heute ans implementieren/ testen machen :D

Nachtrag:
Habe es mit HM-LC-SW1-DR und HM-LC-SW4-DR in allen erdenklichen Kombinationen getestet:
Ohne Titel.png
Ohne Titel.png (14.87 KiB) 6778 mal betrachtet
Ergebnis: Funktioniert bestens! Fehlermeldungen: Keine!
Zuletzt geändert von sailor79ac am 30.08.2017, 14:38, insgesamt 2-mal geändert.

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Szenensteuerung mit HM Script

Beitrag von alchy » 30.08.2017, 11:52

sailor79ac hat geschrieben:Ernsthaft?
Klar, aber das mit der Zeit stimmt nicht ganz. Ich hab ja zwischendurch noch etwas anderes gemacht. :P :lol: :lol: :lol:

Achiwo, war nur Spass. :mrgreen:

Danke für die positive Rückmeldung, fehlt noch die des 2. User Silverhawk mit berechtigtem Interesse. :mrgreen:
Eigentlich müsste das Script ja viele ansprechen, aber vielleicht irre ich mich ja auch. Oder man vergisst nur, hier eine Rückmeldung zu schreiben.
Dachte schon, ich habe Fehler drin oder die Anleitung nicht hilfreich genug geschrieben, weil sich trotz 200 Zugriffen gar keiner gemeldet hat.
Vielleicht wissen die User auch nur nicht, für was sie das alles einsetzen können.

Wie ich schon oben schrieb, mal sehen was daraus wird. :mrgreen:

Alchy
PS: Kannst du/ darf ich die Bildschirmcopy "schneller ging es nicht ..." löschen? Schäme mich.

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

sailor79ac

Re: Szenensteuerung mit HM Script

Beitrag von sailor79ac » 30.08.2017, 14:23

User Silverhawk ist sicherlich noch auf Arbeit wie die meisten hier.

Der Rest muss das erstmal sacken lassen, um zu erkennen was man damit alles tolles machen kann. :mrgreen: ich auch...

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Szenensteuerung mit HM Script

Beitrag von alchy » 30.08.2017, 14:32

Na wir werden sehen.
Ich denke auch, vielleicht muss man erstmal gedanklich durchspielen, was man damit so machen kann.
Ich habe mal oben das Beispiel mit einem Raum aufgeführt.
Kann ja jeder Beispiele zur Anwendung posten.

Wichtig ist natürlich, das man es nicht übertreibt. Eine Scene wo in einem Rutsch 20 Rolläden und 20 Aktoren geschaltet werden, wird vielleicht / wahrscheinlich nicht immer zum gewünschten Ergebnis führen.
Mein Testscenario mit 10 gemischten(IP,RF) Kanälen + einem Rolloaktor (hab nur einen Testaktor) hat aber immer funktioniert.


Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Silverhawk
Beiträge: 40
Registriert: 25.06.2014, 14:29

Re: Szenensteuerung mit HM Script

Beitrag von Silverhawk » 30.08.2017, 15:29

Super!
Vielen Dank alchy!
Das Script läuft bei mir auch bestens ohne Fehler.
Nun hat meine kleine einen kleinen Knopf in ihrem Nachttisch verbaut, wo sie schnell im gesamten Haus das Licht einschalten kann. :mrgreen:
Super, dass auch die Dimmerwerte gespeichert werden 8)

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Szenensteuerung mit HM Script

Beitrag von alchy » 30.08.2017, 15:40

Freut mich, geholfen zu haben und danke für die Rückmeldung.

Wie oben schon erwähnt, nicht alle Kanäle werden funktionieren. Dazu brauch dann Input. Aber ein Anfang ist gemacht.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

HerzAss
Beiträge: 75
Registriert: 05.09.2014, 21:55
Wohnort: Schweiz

Re: Szenensteuerung mit HM Script

Beitrag von HerzAss » 24.09.2017, 18:29

Hallo Alchy
Ich werde mit deiner Idee einen Hagelalarm realisieren. Ich bekomme auf mein Handy einen Hagelalarm. Daraufhin sage ich der CCU2 alle Jalousien hoch (merken der alten Position). Sobald der Hagel vorbei ist, können die Jalousien wieder an die alte Position fahren. Ich denke das sollte mit deinen beiden Scripts funktionieren. :D
Danke und en Gruess
Urs

Sechserpack
Beiträge: 83
Registriert: 26.02.2017, 22:31
Hat sich bedankt: 3 Mal
Danksagung erhalten: 2 Mal

Re: Szenensteuerung mit HM Script

Beitrag von Sechserpack » 24.09.2017, 19:14

Schöner Ansatz, danke dafür!


Gesendet von iPhone mit Tapatalk

Benutzeravatar
roe1974
Beiträge: 746
Registriert: 17.10.2017, 16:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wien
Hat sich bedankt: 52 Mal
Danksagung erhalten: 13 Mal

Re: Szenensteuerung mit HM Script

Beitrag von roe1974 » 15.11.2017, 11:20

Hallo Alchy

Vielen Dank für die Erweiterung um die Jalousien Steuerung. :D
Jetzt können die letzten Positionen (Höhe/Lamelle) gespeichert werden und bei Bedarf wieder angefahren werden.
Bei den JALOUSIEN Aktoren geht das übrigens super über LEVEL_COMBINED. Man muss nicht über ganze unten oder ganz oben die Position anfahren, sondern kann direkt Höhe und Lamellenpositioen angeben, die mit einem Befehl hintereinander (zuerst Höhe, dann Lamelle) angefahren wird.

Vielen DANK !

lg Richard

Antworten

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