>>>> Bitte auch den Beitrag zum Debugging beachten. <<<<
korrektes Referenzieren einer Systemvariablen (zur Vermeidung von falschen Objekt-Referenzen durch doppelte Vergabe von Namen)
Code: Alles auswählen
! System-Variable auslesen
var Daten = dom.GetObject(ID_SYSTEM_VARIABLES).Get("sysvarname").Value();
! System-Variable beschreiben
dom.GetObject(ID_SYSTEM_VARIABLES).Get("sysvarname").State(Daten);
! falls man nicht sicher sein kann, das die Systemvariable auch existiert:
object SV;
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get("sysvarname");
if (SV) { SV.State(Daten); }
Datenpunkte
Wie man Datenpunkte identifiziert und ausliest hat alchy ausführlich beschrieben :
viewtopic.php?f=31&t=30127
Unterschied .State() und .Value() und .Variable()
.State() fragt die Geräte aktiv ab, d.h. netzversorgte Geräte werden über Funk abgefragt
.Value() nimmt immer den letzten übermittelten Wert; nur Read, Write löst RuntimeError aus
.Variable() Write führt nicht zum Triggern! Ergebnis bei Read ist immer vom Typ String!
State-Methode kann mit Verzögerung und mit/ohne Abbruch einer laufenden Verzögerung ausgeführt werden (wie in der WebUI)
ab Rega R1.00.0388.0220 auch auf Kanäle (OT_CHANNEL) und Programme (OT_PROGRAM) anwendbar
ACHTUNG: ein State(x) bricht keine laufende Verzögerung ab (im Gegensatz zur WebUI)
siehe auch viewtopic.php?f=19&t=61630&start=10
Code: Alles auswählen
! State() mit Verzögerung
! State(var Value,{integer Delay in ms[0]},{boolean Retrigger[false]})
! Value = Wert der geschrieben wird
! Delay = Verzögerung in ms (optional, Standard 0)
! Retrigger = bisheriger Delay wird abgebrochen/überschrieben (optional, Standard false)
! darf nicht auf Kanäle angewendet werden, bei Geräten muss der Datenpunkt angesprochen werden
! setzt Automatik nach 60000 Millisekunden auf TRUE
dom.GetObject(ID_SYSTEM_VARIABLES).Get("Automatik").State(1, 60000);
dom.GetObject("Steckdose Lampe:3").DPByHssDP("STATE").State(true,60000);
! setzt Automatik nach 120000 Millsekunden auf TRUE, laufende Verzögerung wird nicht unterbrochen
! ACHTUNG: die Verzögerung zählt ab dem absetzen des Befehls, nicht nach Ablauf des vorherigen!
dom.GetObject(ID_SYSTEM_VARIABLES).Get("Automatik").State(1, 120000, false);
dom.GetObject("Steckdose Lampe:3").DPByHssDP("STATE").State(true, 120000, false);
Code: Alles auswählen
(dom.GetObject(ID_CHANNELS).Get("KANALNAME")).DPByHssDP("ON_TIME").State(dauer);
(dom.GetObject(ID_CHANNELS).Get("KANALNAME")).DPByHssDP("STATE").State(true);
Code: Alles auswählen
! dp.ValueName()
object oSysvar = dom.GetObject(ID_SYSTEM_VARIABLES).Get("SysVarName");
WriteLine("ValueName: "#oSysvar.ValueName()); ! "was auch immer man für true/false definiert hat"
! im Gegensatz zu
WriteLine("Value: "#oSysvar.Value()); ! true oder false
hier geht es ans Eingemachte - siehe Erläuterungen von Black
Code: Alles auswählen
! [object]= dom.CreateObject ([OT_TYPE],[opt OBJ_NAME],[opt OBJ_ID]);
! [boolean] =dom.DeleteObject (ID [int,string, object])
Entgegen der offiziellen Doku ist der Längen-Parameter optional. Ohne Angabe der Länge wird die verbleibende Rest-Länge angenommen:
Code: Alles auswählen
! string string.Substr(integer index {,integer length});
string s = "Hallo Welt!";
string world = s.Substr(6); ! world = "Welt"
Code: Alles auswählen
break; ! bricht die Schleife ab
continue; ! überspringt das aktuelle Element
Code: Alles auswählen
! system.GenerateEnum(min [integer], max [integer])
! erzeugt eine durch Tab getrennte Werteliste von min bis max
var test = system.GenerateEnum(1,10);
WriteLine(test); ! 1 2 3 4 5 6 7 8 9 10
! Hilfreich für eine Foreach-Schleife:
string index;
foreach(index,system.GenerateEnum(1,10))
{
WriteLine (index);
}
alle Werte der Werteliste auflisten
Code: Alles auswählen
! alle Werte der Werteliste auflisten
string sSysvar = "Status";
string itemID; integer i = 0;
var Liste = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sSysvar).ValueList();
WriteLine("Index: Wert");
foreach(itemID, Liste.Split(";"))
{
WriteLine(i#": "#itemID);
i = i + 1;
}
Code: Alles auswählen
! einen bestimmten Wert der Liste ausgeben
string sSysvar = "Status";
integer iValue = 1; ! Welchen Wert? - beginnend mit 0
WriteLine( web.webGetValueFromList((dom.GetObject(ID_SYSTEM_VARIABLES).Get(sSysvar)).ValueList(), iValue) );
Code: Alles auswählen
string sSysvar = "Status";
! Index des gültigen Wertes
WriteLine(dom.GetObject(ID_SYSTEM_VARIABLES).Get(sSysvar).Value());
! Klartext des gültigen Wert ausgeben
WriteLine( web.webGetValueFromList((dom.GetObject(ID_SYSTEM_VARIABLES).Get(sSysvar)).ValueList(), (dom.GetObject(ID_SYSTEM_VARIABLES).Get(sSysvar)).Value()) );
! oder
WriteLine( (dom.GetObject(ID_SYSTEM_VARIABLES).Get(sSysvar).ValueList() ).StrValueByIndex(";",dom.GetObject(ID_SYSTEM_VARIABLES).Get(sSysvar).Value()) );
! oder
object oList = dom.GetObject (ID_SYSTEM_VARIABLES).Get (sSysvar);
WriteLine( web.webGetValueFromList(oList.ValueList(), oList.Value()) );
Code: Alles auswählen
! Anzahl der Elemente in einer Liste ermitteln
! Liste muss String mit ; getrennt sein
string liste = "A;B;C";
var n = web.webGetValueListCount(liste) ;
WriteLine(n);
Code: Alles auswählen
! SunAzimuth({time}) / SunAltitude({time}) optional: Angabe eines Zeitstempel für die Berechnung, Standard aktuelle Zeit
system.SunAzimuth(); ! gibt Azimutwinkel für aktuelle Uhrzeit und in der Systemeinstellung definierte Position aus
system.SunAltitude(); ! gibt Elevationswinkel für aktuelle Uhrzeit und in der Systemeinstellung definierte Position aus
system.SunAzimuth (@08:00@); ! gibt Azimut für heute 8 Uhr aus
system.SunAltitude (@2020-01-01 06:00:00@); ! Sonnenhöhe am 01.01.2020 um 06:00 Uhr
! das geht auch mit einem Zeitstempel als Integerwert
! system.SunAltitude (integer Timestamp);
integer iZeit = system.Date("%F %T").ToTime().ToInteger();
iZeit = iZeit + 6000;
WriteLine(system.SunAltitude (iZeit));
Mit %H, %M, %S gibt man an, ob man Stunden, Minuten, Sekunden haben möchte. Ohne Parameter wird Datum und Uhrzeit ausgegeben.
Code: Alles auswählen
var auf = system.SunriseTime("%H:%M:%S"); ! Sonnenaufgangszeit in Stunden:Minuten:Sekunden
var ab = system.SunsetTime("%H:%M"); ! Sonnenuntergangszeit in Stunden:Minuten
Code: Alles auswählen
system.Longitude();
system.Latitude();
Code: Alles auswählen
!- Uhrzeit zu einer gegebenen Sonnenhöhe berechnen V1.0 MN
real Sollwert = -6; !- gegebene Sonnenhöhe
integer Genauigkeit = 5; !- Schrittweite in Minuten (nur Ganzzahlen,>0)
string SV_Aufgang = "Aufgangszeit"; !- Namen der Systemvariablen in der das Ergebnis abgelegt wird
string SV_Untergang ="Untergangszeit";
integer AktuelleZeit = system.Date("%F").ToTime().ToInteger();
integer NeueZeit;
real IstElevation = -100.0;
object SV;
!- Morgendämmerung berechnen
NeueZeit = AktuelleZeit + ( 10800 - ( Genauigkeit * 60)); !- um 3 Uhr starten
while ( IstElevation < Sollwert ) {
NeueZeit = ( NeueZeit + ( Genauigkeit * 60)) ; !- x Minuten hinzu
IstElevation = system.SunAltitude(NeueZeit); !- Elevation zur neuen Zeit berechnen
}
WriteLine("Ergebnis Morgendämmerung: " #NeueZeit.ToTime().Format("%T"));
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SV_Aufgang);
if ( SV ) {SV.State(NeueZeit.ToTime().Format("%T"));}
!- Abenddämmerung berechnen
IstElevation = 100.0;
NeueZeit = AktuelleZeit + ( 54000 - ( Genauigkeit * 60)); !- um 15 Uhr starten
while ( IstElevation > Sollwert ) {
NeueZeit = ( NeueZeit + ( Genauigkeit * 60)) ; !- x Minuten hinzu
IstElevation = system.SunAltitude(NeueZeit); !- Elevation zur neuen Zeit berechnen
}
WriteLine("Ergebnis Abenddämmerung: " #NeueZeit.ToTime().Format("%T"));
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SV_Untergang);
if ( SV ) {SV.State(NeueZeit.ToTime().Format("%T"));}
Code: Alles auswählen
dom.GetObject("RolladenZP").State(NeueZeit);
dom.GetObject("CUxD.CUX2800001:1.TIMER_SET").State(NeueZeit);
Im Gegensatz zum dokumentierten system.Date(), welches die aktuelle Zeit als String liefert, liefert das undokumentierte localtime die aktuelle Zeit als Time-Datentyp. Und damit lässt sich einfacher rechnen:
Code: Alles auswählen
! Aktuelle Zeit plus 5 Minuten
WriteLine((localtime+300).Format("%H:%M"));
! versus
WriteLine((system.Date().ToTime().ToInteger()+300).ToTime().Format("%H:%M "));
mit #inc können externe Skripte aus externen Dateien eingebunden werden
siehe Beschreibung von Black
ProgramExecute()
Führt ein anderes WebUI Programm aus. Allerdings ohne Prüfung der Bedingungen. Es wird immer das erste DANN ausgeführt. Die Ausführung erfolgt erst wenn das aufrufende Skript beendet ist.
Der Nutzen ist also begrenzt. Nicht nur aus dem Grund rate ich von der Benutzung ab. Siehe auch viewtopic.php?f=26&t=75299&start=10#p730346
wget über system.Exec nutzen
ruft eine URL auf bzw. Daten ab ohne die CCU zu blockieren
Code: Alles auswählen
! hhtp per exec senden
string send_data = "http://......";
string stdout; string stderr;
system.Exec("wget --timeout=10 -q -O - '"#send_data#"'", &stdout, &stderr);
! hhtp per exec senden, wenn man gar keine Rückmeldung braucht
string send_data = "http://......";
system.Exec("timeout 10 wget --timeout=10 -q -O /dev/null '"#send_data#"' &");