Programm im Programm ausführen ?
Moderator: Co-Administratoren
-
- Beiträge: 280
- Registriert: 16.05.2018, 22:54
- Hat sich bedankt: 6 Mal
- Danksagung erhalten: 5 Mal
Programm im Programm ausführen ?
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
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
- 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 ?
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 ...
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 ...
- 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 ?
Code: Alles auswählen
object oPRG= dom.GetObject (ID_PROGRAMS).Get ("IchBinDerProgrammName");
oPRG.ProgramExecute ();
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
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
- 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 ?
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:
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.
-
- 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 ?
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
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.
- 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 ?
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.
- 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 ?
Ein Fehlerhandling auf ein nicht existierendes Objekt oder Objekttyp ist in dem zugegeben effizient geschirebenen Einzeiler nicht wirklich zu realisieren.
Jedem seinen Stil
Black
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
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
-
- 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 ?
Mal als Beispiel, was man natürlich zusammenziehen kann in eine Zeile:
Variante 1
oder auch
Variante 2
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.
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
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");
}
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");
}
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.
Geb ich dir Recht. Funktionieren würde auch:
Code: Alles auswählen
dom.GetObject("IchBinDerProgrammName").ProgramExecute();
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.
Re: Programm im Programm ausführen ?
Mein Grund ist: Das Get könnte schief gehen...blackhole hat geschrieben: ↑30.01.2019, 11:46Leicht 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();
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
- 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 ?
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.