Zeitmodul per Script - nicht dokumentierte Funktionen

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

Zeitmodul per Script - nicht dokumentierte Funktionen

Beitrag von didiator » 12.02.2018, 14:56

Hallo,

ich arbeite gerade an einem Script, in dessen Ergebnis eine zeitgesteuerte Aktion gestartet werden soll. Die Zeit ist aber noch nicht bekannt und muss erst berechnet werden.

Hintergrund:
Über die Schaltsteckdose mit Energiemessung werden Waschmaschine (3h Laufzeit), Trockner (4 Stunden Laufzeit) und Geschirrspüler (2 StundenLaufzeit) gesteuert.
Ich habe eine Solaranlage und möchte gern, dass die Geräte hintereinander angeschaltet und zur besten Energiezeit betrieben werden.
Über die Astrofunktion bekomme ich die Zeit für den höchsten Sonnenstand.
Wenn ich nun z.B. einen Auftrag für die Waschmaschine und den Geschirrspüler habe, errechnet sich der Startzeitpunkt:
höchster Sonnenstand - ((Waschmaschine-Zeit + Geschirrspüler-Zeit)/2), z.B. 09:37 Uhr für den Geschirrspüler und 11:37 Uhr für die Waschmaschine. Trockner wird heute nicht gebraucht und deshalb auf irgendeinen Wert fern in der Zukunft gesetzt.
Eine Statusverwaltung für die Aufträge habe ich bereits implementiert. Ich muss nun nur noch die Timer korrigieren.

Jetzt möchte ich also die drei bereits angelegten Timer auf die entsprechenden Startzeiten per Skript einstellen, Geschirrspüler auf heute 09:37 Uhr und Waschmaschine aif 11:37 Uhr.

Das Objekt "Geschirrspüler.StartRunning" beinhaltet den Timer (einzige Condition in dem Programm).

Ich habe bereits folgenden Code:

Code: Alles auswählen

object prg = dom.GetObject("Geschirrspüler.StartRunning");
object rule = prg.Rule();
object cond=rule.RuleCondition(0).CndSingleCondition(0);
Jetzt müsste ich wahrscheinlich irgendwie das TimeModul-Objekt herausfinden, um dann die Startzeit zu aktualisieren. Wie geht das?

Ich finde Im Netz leider keine entsprechenden Objektbeschreibungen zu CndSingleCondition und weiß nicht einmal wie das Timer-Objekt heißt. Ich würde mich auch für die entsprechenden Konstanten/Typen interessieren.

Habt Ihr da was für mich?

Viele Grüße, Didiator
Zuletzt geändert von alchy am 14.02.2018, 22:26, insgesamt 3-mal geändert.
Grund: Code in Codetags posten & zusammengeführt und Titel angepasst
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

nicht dokumentierte Funktionen entdecken

Beitrag von didiator » 13.02.2018, 10:11

Hallo liebe Spezialisten,

ich fange gerade an, in Homematic Scripts zu programmieren und möchte das gern so professionell wie möglich machen. Habe bisher in anderen Hochsprachen entwickelt, C++, Visual Basic, pascal, Delphi, Powershell, TSQL...

nun stoße ich relativ schnell an Grenzen aufgrund fehlender Dokumentation von Objekten. z.B.:

object prg = dom.GetObject("Geschirrspüler.StartRunning");
object rule = prg.Rule();
object cond=rule.RuleCondition(0).CndSingleCondition(0);

In der cond müsste jetzt ein Timer zu finden sein. Homematic bedient den ja über das Zeitsteuerungsmodul. Leider kann ich den nicht ansprechen weil ich nicht weiß, wie die Syntax dazu ist. Gibt es eine Funktion, die die Objekte, Methoden und Properies des aktuellen Objektes zeigt?

Kann man sich da irgendwie weiterhelfen? Findet man z.B. auf der Unix-Ebene irgendwo Code, aus dem man irgendwas zu den Objekten herausfinden kann? Wenn ja, wo? Oder ist das alles compiliert?

Wenn das compiliert ist, an wen könne man sich da wenden? Man muss ja irgendwie herausbekommen können, wie die Objekte genutzt werden können.

Viele Grüße, Didiator
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: nicht dokumentierte Funktionen entdecken

Beitrag von anli » 13.02.2018, 13:56

Hallo und herzlich willkommen,

das gibt es alles unkompiliert in den Dateien. Hier zum Beispiel ein NICHT funktionierender Auszug aus einem Skript welches ich vor einigen Jahren mal erstellt habe:

Code: Alles auswählen

if (tmObj.Type() == OT_CALENDARDP) {
		    	Write("ID " # tmObj.ID() # "; ");
		      if (tmObj.SunOffsetType() == sotNone) {
		        if ( (tmObj.CalDuration() == 0) && (tmObj.Time() == 0) ) {
		          Write("ganztägig");
		        }
		        else {
		          if (tmObj.CalDuration() != 0) {
		            Write("Zeitspanne ");
		            Write("von: " # tmObj.Time());
		            Write(" bis: " # tmObj.Time() # ", Dauer: " # tmObj.CalDuration());
		          }
		          else {
		            Write("Zeitpunkt ");
		            Write("von: " # tmObj.Time());
		          }
		        }
		      }
		      else {
		        if (tmObj.SunOffsetType() == sotAfterSunrise) {
		          Write("Zeitspanne: Astro Tag");
		        }
		        if (tmObj.SunOffsetType() == sotAfterSunset) {
		          Write("Zeitspanne: Astro Nacht");
		        }
		      }
		    
		      string sCalRep = tmObj.CalRepeatTime();  
		      integer iPeriod = tmObj.Period();
		      integer iRepVal = tmObj.CalRepetitionValue();
		      integer iWdays = tmObj.Weekdays();
		      integer iType = tmObj.TimerType();
		      
		      if (iType == ttCalOnce) {
		        Write("; Serienmuster: einmalig am " # sCalRep);  
		      }
		      if (iType == ttPeriodic) {
		        Write("; Serienmuster: Zeitintervall");
		        integer iSelIdx = 0;
		        string sVal = "";
		        sVal = iPeriod;
		        if ( (iPeriod / (3600)) > 0) 
		        {
		          if( (iPeriod % 3600) == 0 )
		          {
		            sVal = iPeriod / (3600);
		            iSelIdx = 0;
		          }
		          else
		          {
		            if( (iPeriod % 60) == 0 )
		            {
		              sVal = iPeriod / (60);
		              iSelIdx = 1;
		            }
		            else
		            {
		              sVal = iPeriod;
		              iSelIdx = 2;
		            }
		          }
		        }
		        else 
		        {
		          if ( (iPeriod / 60) > 0) 
		          {
		            if( (iPeriod % 60) == 0 )
		            {
		              sVal = iPeriod / (60);
		              iSelIdx = 1;
		            }
		            else
		            {
		              sVal = iPeriod;
		              iSelIdx = 2;
		            }
		          }
		          else 
		          {
		            sVal = iPeriod;
		            iSelIdx = 2;
		          }
		        }
		        Write(" alle " # sVal # " ");
		        if (iSelIdx == 0) {
		        	Write("Stunden");
		        }
		        if (iSelIdx == 1) {
		        	Write("Minuten");
		        }
		        if (iSelIdx == 2) {
		        	Write("Sekunden");
		        }
		      }
		      if (iType == ttCalDaily) {
		        Write("; Serienmuster: täglich");
		        if (iRepVal != 0) {
		          Write(", alle " # iRepVal #" Tage");
		        }
		        if (iWdays != 0) {
		          if (iWdays == 96) { Write(", an Wochenenden"); }
		          else { Write(", werktags"); }
		        }
		        if ((iRepVal == 0) && (iWdays == 0)) {
		          Write(", jeden Tag");
		        }
		      }
		      if (iType == ttCalWeekly) {
		        Write("; Serienmuster: wöchentlich");
		        if (iRepVal != 0) {
		          Write(", alle " # iRepVal # " Wochen am ");
		        }
		        else {
		          Write(", jede Woche am ");
		        }
		        if ( (iWdays & 1) != 0) { Write("Montag"); }
		        if ( (iWdays & 2) != 0) { Write(", Dienstag"); }
		        if ( (iWdays & 4) != 0) { Write(", Mittwoch"); }
		        if ( (iWdays & 8) != 0) { Write(", Donnerstag"); }
		        if ( (iWdays & 16) != 0) { Write(", Freitag"); }
		        if ( (iWdays & 32) != 0) { Write(", Samstag"); }
		        if ( (iWdays & 64) != 0) { Write(", Sonntag"); }
		      }
		      if (iType == ttCalMonthly) {
		        Write("; Serienmuster: monatlich");
		        if (iWdays == 0) {
		          Write("am "#iPeriod#". Tag jedes "#iRepVal#". Monats");
		        }
		        else {
		          Write("am "#iPeriod#". ");
		          integer iSelIdx = 0;
			        if ( (iWdays & 1) != 0) { Write(" Montag"); }
			        if ( (iWdays & 2) != 0) { Write(" Dienstag"); }
			        if ( (iWdays & 4) != 0) { Write(" Mittwoch"); }
			        if ( (iWdays & 8) != 0) { Write(" Donnerstag"); }
			        if ( (iWdays & 16) != 0) { Write(" Freitag"); }
			        if ( (iWdays & 32) != 0) { Write(" Samstag"); }
			        if ( (iWdays & 64) != 0) { Write(" Sonntag"); }
		          Write(" jedes "#iRepVal#". Monats");
		        }
		      }
		      if (iType == ttCalYearly) {
		        Write("; Serienmuster: jährlich");
		        if (iWdays == 0) {
		          Write("am "#iPeriod#"."#iRepVal#".");
		        }
		        else {
		          Write("am "#iPeriod#". ");
		          if ( (iWdays & 1) != 0) { Write(" Montag"); }
			        if ( (iWdays & 2) != 0) { Write(" Dienstag"); }
			        if ( (iWdays & 4) != 0) { Write(" Mittwoch"); }
			        if ( (iWdays & 8) != 0) { Write(" Donnerstag"); }
			        if ( (iWdays & 16) != 0) { Write(" Freitag"); }
			        if ( (iWdays & 32) != 0) { Write(" Samstag"); }
			        if ( (iWdays & 64) != 0) { Write(" Sonntag"); }
		        	Write(" im Monat "#iRepVal);
			      }
		      }
		      
		      string sBegin = tmObj.Begin();
		      string sEnd = tmObj.End();
		      integer iCalCount = tmObj.CalRepetitionCount();
		      Write("; Gültigkeitsdauer: "#sBegin);
		      if ( (iCalCount == 0) && (tmObj.EndSeconds() == 0) ) 
		      {
		        Write(", kein Enddatum");
		      }
		      else 
		      {
		        if (iCalCount == 0) 
		        {
		          Write(", endet am "#sEnd);
		        }
		        else 
		        {
		          Write(", endet nach"#iCalCount#" Terminen");
		        }
		      }
Anhand dieses Skriptes findest Du Funktionsnamen, nach denen Du in den anderen Dateien nur suchen musst um mehr heruaszufinden.
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

Benutzeravatar
didiator
Beiträge: 97
Registriert: 21.12.2017, 13:25
System: CCU
Wohnort: Lübesse

Re: nicht dokumentierte Funktionen entdecken

Beitrag von didiator » 13.02.2018, 20:14

Hallo Anli,

vielen Dank für das Script. Dazu eine Frage. Das tmpObj, was ist das bei Dir? Kannst Du mir noch zeigen, wie Du das bezogen hast?

tmpObj = dom.getObject("... oder wie? Wo kriegst Du das her?

Ich muss ja erstmal herausfinden, in welchem Objekt die Kalenderfunktinen stecken...

Viele Grüße, Didiator
---------------------------------------------------------------
stay original...

Debmatic auf der Basis von Paspberry Pi4, SSD
ca. 90 HM, HmIP und Wired Geräte
HB-RF-ETH
Alexa Anbindung
Node-Red

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

Re: nicht dokumentierte Funktionen entdecken

Beitrag von alchy » 13.02.2018, 21:27

ID_CALENDARDPS

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
Black
Beiträge: 5527
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 432 Mal
Danksagung erhalten: 1093 Mal
Kontaktdaten:

Re: nicht dokumentierte Funktionen entdecken

Beitrag von Black » 14.02.2018, 14:06

hi Alchy,

die Objecte kann man da greifen, dass ist richtig. Ihc hatte vor ner Weile auch mal damit gespielt, bei mir hings aber , das ich zwar zeiten verändern konnte, die aber irgenwie nicht in den internen Scheduler übernommen worden sind. da fehlte mir noch was.

Ansatz war. leere CCU, ein Prog mit einem zeitprogramm, Ausführung jeden Tag um hh:mm Uhr.

das Object lässt sich dann sauber finden und identifizierne.

Wenn man im WEBUI das programm änderte, liessen diech die Zeiten da auch reproduzierbar drin wiederfinden.

Leider bewirkte es nichts, wenn man das Object dann auf den anderen Wert geändert hatte. er startete nicht. da fehlt wohl noch irgendwie ein Timer scharfmachen.

oder kennst du den Trick ?

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: 10760
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 674 Mal

Re: nicht dokumentierte Funktionen entdecken

Beitrag von alchy » 14.02.2018, 19:15

didiator hat geschrieben: Gibt es eine Funktion, die die Objekte, Methoden und Properies des aktuellen Objektes zeigt?
Klar gäbe es Möglichkeiten, sich alles Mögliche und auch Unmögliche anzeigen zu lassen. :wink:
HMINVESTIGATOR_Zeitmoduil.jpg

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
Black
Beiträge: 5527
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 432 Mal
Danksagung erhalten: 1093 Mal
Kontaktdaten:

Re: nicht dokumentierte Funktionen entdecken

Beitrag von Black » 14.02.2018, 21:37

wobei man sich hier die Frage nach der allgemeingültigen Zugänglichkeit der Informationen stellen darf.

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: 10760
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 674 Mal

Re: nicht dokumentierte Funktionen entdecken

Beitrag von alchy » 14.02.2018, 22:14

Das ist relativ.
Wenn du die allgemein gültige Zugänglichkeit zu dem abgebildeten genialen Tool HM-Investigator von BadenPower meinst, geb ich dir Recht.
Da hat sich das Forum wohl ein Ei gelegt. Er hatte den HM-Investigator hier frei zur Verfügung gestellt.

Grundsätzliche Zugänglichkeit zu den Informationen ist allerdings durchaus gegeben.
BadenPower ist ja schließlich auch nicht vom Himmel gefallen. :?:
Er hat ja mehrfach betont das er sich die Informationen alle zusammensuchen musste,
genau wie die meisten anderen User hier, inklusive mir selber auch.

Ich hatte mir auch ein Script zusammengeschrieben, um die Zeitmoduleinträge auszulesen,
Script_Zeitmodul.jpg
noch bevor ich Zugang zu HM-Investigator oder ähnliches hatte.

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
Black
Beiträge: 5527
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 432 Mal
Danksagung erhalten: 1093 Mal
Kontaktdaten:

Re: nicht dokumentierte Funktionen entdecken

Beitrag von Black » 14.02.2018, 22:25

[...]
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

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“