Programm im Programm ausführen ?

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Antworten
michaelapp
Beiträge: 280
Registriert: 16.05.2018, 22:54
Hat sich bedankt: 6 Mal
Danksagung erhalten: 5 Mal

Programm im Programm ausführen ?

Beitrag von michaelapp » 26.01.2019, 18:57

Hallo zusammen,

gibt es eine Möglichkeit das ich in einem Programm ein anderes Programm ausführe?

Hier meine Herausforderung:

Ich habe über das Mediola V4 Gateway meine Warema Rollläden eingebunden und hierzu ein Programm erstellt wo der Rollladen runter fährt und nach der hälfte des Fahrweges kommt der Stop Befehl -> das sind dann 50%.

Jetzt möchte ich das Programm in meinen anderen Programmen z.b. Beschattung verwenden.

Gruß
Michael

Benutzeravatar
robbi77
Beiträge: 13845
Registriert: 19.01.2011, 19:15
System: CCU
Wohnort: Landau
Hat sich bedankt: 181 Mal
Danksagung erhalten: 738 Mal

Re: Programm im Programm ausführen ?

Beitrag von robbi77 » 26.01.2019, 19:20

Mit einer SV.
Bei Risiken und Nebenwirkungen fragen Sie den Elektriker Ihres geringsten Mißtrauens!
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/downloads/download/ ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907
Troll des Forums ...

Benutzeravatar
Black
Beiträge: 5470
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1070 Mal
Kontaktdaten:

Re: Programm im Programm ausführen ?

Beitrag von Black » 26.01.2019, 19:28

Code: Alles auswählen

object oPRG= dom.GetObject (ID_PROGRAMS).Get ("IchBinDerProgrammName");
oPRG.ProgramExecute ();
Gruss,
Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Benutzeravatar
blackhole
Beiträge: 3730
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 587 Mal

Re: Programm im Programm ausführen ?

Beitrag von blackhole » 30.01.2019, 11:46

Leicht OT:

Ich habe mich in letzter Zeit desöfteren gefragt, warum in vielen Skripten ein Objekt(-name) in einer Variablen geparkt wird, nur um dann einmalig wieder ausgelesen zu werden.
Vergleichbares findet man in sehr vielen Skriptschnippseln mit unterschiedlichen Funktionen von verschieden Autoren (bestimmt auch in älteren Beiträgen von mir) hier im Forum.
Gibt es hierfür einen bestimmten Grund oder werden einfach nur alte, zumindest auf den ersten Blick ineffektive Skriptschnippsel aufgefrischt und wiederverwendet? (Bei mir war das so.).

Heute sehen Aufrufe dieser Art bei mir etwa so aus:

Code: Alles auswählen

dom.GetObject(ID_PROGRAMS).Get("Programmname").ProgramExecute();
Zuletzt geändert von blackhole am 30.01.2019, 12:05, insgesamt 1-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: Programm im Programm ausführen ?

Beitrag von alchy » 30.01.2019, 12:05

Auch wen es in diesem Fall nicht genutzt wird, hat es z.B. den Vorteil leichter ein Fehlerhandling einbauen (z.B. auf Existenz des Objekts) zu können.
Klar, das kann man auch ohne Scriptvariablen bauen, aber das macht es nicht einfacher oder leichter.
Da die Script-Variablenbegrenzung nicht mehr vorhanden ist, würde ich es nicht unbedingt als ineffektiv ansehen, wenn man Objekte erst deklariert um später mit anderen Methoden darauf zugreift.
Es gab ja Zeiten, wo man gezwungen war die Anzahl der Script-Variablen im Auge zu behalten, dem ist ja glücklicherweise nicht mehr so.

Wichtiger oder "richtiger" ist *IMHO* natürlich, das eben nach Möglichkeit nicht direkt über
dom.GetObject() auf das Object verwiesen wird sondern über die Selektierung nur auf Programmobjekte.
Das lindert den "gleiche Namen Bug", was in beiden Fällen genutzt wird.
Funktionieren würde es natürlich auch so.

Und ebenfalls wichtig, man muss wissen, das der Scriptcode das DANN des Programmes ausführt und keine Prüfung der Bedingungen durchgeführt werden. So wie ein händisches Ausführen des Programmes. Da sollte man dann lieber eine virtuelle Taste einbauen, antriggern o.ä.

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.

Benutzeravatar
blackhole
Beiträge: 3730
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 587 Mal

Re: Programm im Programm ausführen ?

Beitrag von blackhole » 30.01.2019, 12:22

alchy hat geschrieben:
30.01.2019, 12:05
Auch wen es in diesem Fall nicht genutzt wird ...
Genau, ich rede ja von eben den Skripten in denen das nie und nimmer genutzt wird (wie in dem von Black gepostetem Schnippsel und auch in vielen anderen).
Eben Skripte in denen ein Objekt(-name) in einer Variablen geparkt wird, nur um dann einmalig wieder ausgelesen zu werden. So war das (wörtlich) gemeint.

In anderen Skripten hat das natürlich seine Daseinsberechtigung, genau wie Du schriebst und auch aus vielerlei anderen Gründen.

Benutzeravatar
Black
Beiträge: 5470
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1070 Mal
Kontaktdaten:

Re: Programm im Programm ausführen ?

Beitrag von Black » 30.01.2019, 12:29

Ein Fehlerhandling auf ein nicht existierendes Objekt oder Objekttyp ist in dem zugegeben effizient geschirebenen Einzeiler nicht wirklich zu realisieren.

Jedem seinen Stil

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

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

Re: Programm im Programm ausführen ?

Beitrag von alchy » 30.01.2019, 12:55

Mal als Beispiel, was man natürlich zusammenziehen kann in eine Zeile:

Variante 1

Code: Alles auswählen

object oPRG= dom.GetObject (ID_PROGRAMS).Get("IchBinDerProgrammName");
if (oPRG){ 
WriteLine("Programm vorhanden");
oPRG.ProgramExecute(); 
WriteLine("Programm ausgeführt");
}else{
WriteLine("Programm NICHT vorhanden");
}
oder auch

Variante 2

Code: Alles auswählen

if ( dom.GetObject(ID_PROGRAMS).Get("IchBinDerProgrammName") ) { 
WriteLine("Programm vorhanden");
dom.GetObject(ID_PROGRAMS).Get("IchBinDerProgrammName").ProgramExecute(); 
WriteLine("Programm ausgeführt");
}else{
WriteLine("Programm NICHT vorhanden");
}
um z.B. rudimentäres, ausbaufähiges Fehlerhandling benutzen zu können.
Nachteil der Variante 2 ist schon mal, das man aufpassen muss da an beiden Stellen den selben Namen IchBinDerProgrammName einzugeben.
ergo, in Userscripten versuche ich dies zu vermeiden.
Black hat geschrieben:
30.01.2019, 12:29
Jedem seinen Stil
Geb ich dir Recht. Funktionieren würde auch:

Code: Alles auswählen

dom.GetObject("IchBinDerProgrammName").ProgramExecute();
und da ist die Fehleranfälligkeit bei Usern die nicht damit umgehen können entschieden höher und deshalb würde ich dies nicht empfehlen.

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.

Benutzeravatar
mirochen
Beiträge: 43
Registriert: 25.01.2019, 18:13

Re: Programm im Programm ausführen ?

Beitrag von mirochen » 30.01.2019, 13:14

blackhole hat geschrieben:
30.01.2019, 11:46
Leicht OT:

Ich habe mich in letzter Zeit desöfteren gefragt, warum in vielen Skripten ein Objekt(-name) in einer Variablen geparkt wird, nur um dann einmalig wieder ausgelesen zu werden.
Vergleichbares findet man in sehr vielen Skriptschnippseln mit unterschiedlichen Funktionen von verschieden Autoren (bestimmt auch in älteren Beiträgen von mir) hier im Forum.
Gibt es hierfür einen bestimmten Grund oder werden einfach nur alte, zumindest auf den ersten Blick ineffektive Skriptschnippsel aufgefrischt und wiederverwendet? (Bei mir war das so.).

Heute sehen Aufrufe dieser Art bei mir etwa so aus:

Code: Alles auswählen

dom.GetObject(ID_PROGRAMS).Get("Programmname").ProgramExecute();
Mein Grund ist: Das Get könnte schief gehen...

Man sollte niemals davon ausgehen, dass irgendetwas einfach funktioniert. Sonst trittst du dir Bugs ein, die manchmal wirklich kniffelig zu finden sind - nicht in allen Situationen wird der NullPointer (was es ist, wenn bspw. das Get schief geht) unmittelbar ein Problem aufwerfen (in diesem konkreten Fall wäre es wohl so... aber ist halt eine grundsätzliche Vorgehensweise, so etwas unbedingt zu vermeiden).

Ich frage fast immer mit "if (objekt_variable)" ab, ob ich eine Referenz bekommen habe... denn eine Referenz ist immer true, eine Nicht-Referenz immer false (zumindest hier bei Homematic, manch andere Programmiersprache braucht hier eine explizite Prüfung gegen null, aber das führt hier halt zu weit...).
Signatur hat Urlaub

Benutzeravatar
blackhole
Beiträge: 3730
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 587 Mal

Re: Programm im Programm ausführen ?

Beitrag von blackhole » 30.01.2019, 13:35

Black hat geschrieben:
30.01.2019, 12:29
Jedem seinen Stil
Ja, das sowieso.

Ich höre aber schon raus, dass es sonst wohl keine besonderen Gründe gibt, die relevant wären.
Alchys genannte Gründe treffen aus meiner Sicht dann tatsächlich eher auf andere Skripte zu.
Für die Skripte, um die es hier geht, wäre ein Fehlerhandling, wie sehr schön von Alchy in seinen Beispielen aufgezeigt, totaler Overkill.

Insofern danke ich euch und verkürze/optimiere wo es (aus meiner Sicht) sinnvoll ist.

Antworten

Zurück zu „HomeMatic allgemein“