Aufgabenstellung war, durch einen trigger (wie z.b.direktTaste, tastendruck in einer Externen Visu) ein oder auch mehrere Heizelemente bzw auch gruppen in ihrem Wochenprogramm zu ändern. Das ganze sollte auch möglich sein, wenn logisch zusammenhängende Elemente in einer gruppe, gewerk, favorit angegeben sind, die Teilnehmer dieser Aufzählung funkhygenisch sauber auf das neue Wochenprogramm zu stellen, egal, ob es eine Gruppe ein classic oder ein IP Element ist.
Definitionsbereich:
Die folgende Lösung von mir läuft unter folgenden Voraussetungen:
1.Das system ist eine raspberrymatic - Grund: Benutzung von Statedelay.
Alternativ wäre es möglich dies auch auf meine TCL Timerpipe umzuschreiben, definitv baucht es aber dann den equalThan patch.
2. Wenn gewerke, Räume oder favoriten als namen angegeben werden muss dies unter dom eindeutig sein. gibt es einen gleichlautenden Raum und gewerk, ist die Funktion Glücksache.
Wenn 1 +2 Erfüllt sind:
dann
Schritt 1: Anlegen einer Systemvariablen typ Stirng, bei mir heisst diese:
CMD_SubProcHeatProfile
Schritt 2:
Anlegen eines Programmes, welches beim Ändern deisr Systemvariablen ein Script auslöst:
Schritt 3:
in diesem prramm ein Script schreiben and er stelle wo Script steht unter sonst:
Code: Alles auswählen
!- Aufruf als Unterprogramm in der Systemvariablen neu
!- Erster Wert: Datenpunkt, zweiter Wert: das Value
!- Trennzeichen ein ;
!- Achtung: Läuft wegen StateDelay nur auf einer Raspberrymatik
!- by Black in 2020
object osrc= dom.GetObject ("$src$");
object oDev; object oIFace;
string stdErr; string stdOut;
string sEnum;
object oDP;
if (osrc) {
if (osrc.Type() == OT_VARDP) {
string cmd= osrc.State ();
object oDP= dom.GetObject (web.webGetValueFromList (cmd,0));
string value= web.webGetValueFromList (cmd,1).ToInteger ();
if (oDP) { !- der erste Wert muss eine gültige Object ID gewesen sein
if (oDP.Type()== OT_ENUM) {
!- Es ist eine Aufzählung, dann also verzögert die einelnen Punkte triggern
integer iDelay=500;
system.Exec ("logger -t SETHEATPROFILE -p user.debug [Aufzählung Start mit " # oDP.Count ()# " Einträgen]");
WriteLine (oDP # ", " # oDP.EnumIDs () );
foreach (sEnum,oDP.EnumIDs () ) {
WriteLine (sEnum);
osrc.State ((sEnum # ";" # value.ToString () ), iDelay, false);
iDelay= iDelay+5000;
}
} else {
if (oDP.Type()== OT_DEVICE) {oDev= oDP; }
elseif (oDP.Type () == OT_CHANNEL) {oDev= dom.GetObject (oDP.Device () ); }
if (oDev) {
oIFace= interfaces.Get (oDev.Interface () );
if ((oIFace.Name ()== "HmIP-RF") || ((oIFace.Name ()== "VirtualDevices") && (oDev.HssType() == "HmIP-HEATING" )) ) {
!- Ein IP gerät gefunden
foreach (sEnum,oDev.Channels().EnumIDs () ) {
oDP= dom.GetObject (sEnum).DPByControl ("HEATING_CONTROL_HMIP.ACTIVE_PROFILE"); ;
if (oDP) { oDP.State (value); system.Exec ("logger -t SETHEATPROFILE -p user.debug [" # oDev.Name() # " auf Profil " # (value).ToString () #"]");}
}
}
elseif (((oIFace.Name ()== "BidCos-RF") && (oDev.Label()=="HM-TC-IT-WM-W-EU")) || ((oIFace.Name ()== "VirtualDevices") && (oDev.HssType() == "HM-CC-VG-1" )) ) {
!- Ein Gerät gefunden, das Masterset braucht
xmlrpc.PutParamset (oDev.Interface (),oDev.Address(),"MASTER","WEEK_PROGRAM_POINTER",(value-1));
system.Exec ("logger -t SETHEATPROFILE -p user.debug [" # oDev.Name() # " auf Profil " # value.ToString () #"]");
}
else {system.Exec ("logger -t SETHEATPROFILE -p user.debug [ERROR " # oDev.ID () # " enthält kein gültiges Heizprofil]"); }
}
}
}
}
}
Das Script ist rebootfest und auch imun gegen manuelles starten: in den beiden fällen referenziert $src$ einen null-Pointer, was abgefragt wird und zu keiner Funktion führt.
Diese Routine arbeitet quasi als Unterprogramm und wird aufgerufen, indem die unter schritt 1 definierte Systemvariable beschrieben wird:
Syntax dom.GetObject (ID_SYSTEM_VARIABLES).Get ("CMD_SubProcHeatProfile").State ("%ID;%WEEKPRG");
%ID: entweder die ISEID eines gerätes, Channels das ein heizprogramm hat oder die IseID eines gewerkes, Favortien, Raumes. Der Name ist auch zulässig:
%WEEKPRG: Wochenprogramm, so wie es in der WebUI verwendet wird, also 1,2 oder 3
ACHTUNG: GAAAANZ WICHITG: als trenner zwischen %ID und %WEEKPRG ein Symikolon ; <<-- sonst Scriptruntimeerror
damit sind beispielsweise folgende aufrufe sinnig:
Heizung sei ein gewerk mit 3 Geräten:
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("CMD_SubProcHeatProfile").State ("Heizung;1");
Im Log sieht man, das das script Das Gewerk aufgelöst hat und dann zeitlich nacheinander die einzelnen Geräte setzt, hier bei mir ein classic WT, ein IP-HT und eine IP gruppe.
@NimmNenKeks, Systemprotokoll ist übrigens die neue Funktion, über die wir am Stammtisch diskutiert hatten, als wir uns durch original syslog gewühlt haben. nun geht bequemes, konfigurierbares Fitern ^^
Vielleicht hat einer ja auch einen ähnlich gelagerten Anwendungsfall und kann so etwas gebrauchen.
Schönes Wochenende, Black
Edit: Grund Typo im Schreibtext von ID_SYSTEM_VARIABLES