alle Geräte ausschalten, wie am intelligentesten gelöst?

Hallo,
wieder so eine idee, die mir nächtens einfällt:

ich hätte gerne ein Skript, das mir alle Lampen und alle nicht benötigten Geräte ausschaltet. Aber wie mach ich das am klügsten? Klar könnte ich 100 Zeilen Code schreiben, aber das ist sicher das umständlichste was man machen kann. Hat hier jemand schon einen guten Ansatz? Man müsste sicherlich alle Dimmer extra behandeln aber das geht sicher trotzdem irgenwie elegant!?

Danke schonmal,
Pollibus

Halbwegs elegant wäre das Anlegen einer Kategorie für sowas. Dort kannst Du dann alle Instanzen verlinken. Mit IPS_GetChildren kannst Du dann die Links finden, die verlinkten Instanzen abfragen, die Modultypen der Instanzen abfragen und den passenden Schaltbefehl auslösen.

Nachdem mir der Vorschlag von Horst (danke trotzdem) etwas zu kompliziert war, wollte ichs mit einem array machen, komme hier aber nicht weiter:

<?
$IDs = array("17500", "19572", "42096");

foreach($IDs as $ID)
	{
	HM_WriteValueBoolean($ID,'STATE',false);
        echo $ID;
	}
HM_WriteValueBoolean(19572,'STATE',false);
?>

als Fehlermeldung bekomme ich:


Warning:  Wrong parameter type for hm_writevalueboolean() in C:\IP-Symcon\scripts\55423.ips.php on line 7
17500
Warning:  Wrong parameter type for hm_writevalueboolean() in C:\IP-Symcon\scripts\55423.ips.php on line 7
19572
Warning:  Wrong parameter type for hm_writevalueboolean() in C:\IP-Symcon\scripts\55423.ips.php on line 7
42096

Der letzte Kommando (als Test) funktioniert aber. Irgendwas mach ich grundlegend falsch oder?

Danke,
Pollibus

Deine ID´s stehen als String im Befehl; lass mal die Anführungszeichen im Array weg. Nur ne Idee. :slight_smile:

Ich dachte zwar das ausprobiert zu haben, aber jetzt hats geklappt! Spitze, immer wieder Klasse dieses Forum!

Pollibus

Haha, nochmal Dankeschön. Jetzt hab ichs doch mal mit Links versucht! Hat etwas gedauert bis ich kapiert habe dass IPS_getchildrenIds bei den Links natürlich nur die IDs der Links ausgibt… mithilfe der Doku hab ich dann aber die „Übersetzung“ der Links auch noch gefunden und jetzt funktioniert das auch! Und damit sich andere nicht unbedingt auch noch ärgern müssen:

<?
$IDs = IPS_GetChildrenIDs(11069); //ID der Kategorie mit Links zu den Booleans, Schlataktoren 
$IDs2 = IPS_GetChildrenIDs(44327); //ID der Kategorie mit Links zu den Floats, Dimmer

foreach($IDs2 as $ID2) //erst die Dimmer
	{
	$LinkID2 = IPS_GetLink ($ID2);
	$geLinkedID2 = $LinkID2['LinkChildID'];
	HM_WriteValueFloat($geLinkedID2,'LEVEL',0);
	}
	
	
foreach($IDs as $ID) //jetzt die Schaltaktoren
	{
	$LinkID = IPS_GetLink ($ID);
	$geLinkedID = $LinkID['LinkChildID'];
	HM_WriteValueBoolean($geLinkedID,'STATE',false);
	}
?>

Es müssen nur 2 Kategorien angelegt werden wo die Links mit den Dimmern und den Schaltaktoren reinkommen. Ich freu mich jetzt erst mal über das Erfolgserlebnis :smiley:

Pollibus

An diesem Problem knabbere ich auch grad.

Nur:

1.) Ich will die Kategorie zunächst mit ihrem Namen ansprechen um dann die ID zu bekommen (IPS_GetObjectIDByName bzw IPS_GetCategoryIDByName)

2.) bei mir habe ich die Links erst an dritter Stelle in der Hierarchie, die anzusprechende Kategorie ist also „Kategorie\Subkategorie“:

01_Szenarien
…Panik
…(Links)
…Freunde
…(Links)
…AllesAus
…(Links)
…Nacht
…(Links)

Ich habe also probiert mit „01_Szenarien\Panik“ und auch „01_Szenarien/Panik“ zu arbeiten, ging leider nicht.

Wie komme ich hier weiter? Etwa so?

$id=IPS_GetObjectIDByName("01_Szenarien");
$array=IPS_GetChildrenIDs($id)
foeach Element in array...
    $name=IPS_GetName(aktuelles Element)
    If $name = gewünschte Sub-Kategorie ...

Ist das nicht einfacher möglich?

Grundsätzlich - in Metasprache:

$Szene=„01_Szenarien\Panik“; (DIREKTER ZUGRIFF MIT VOLL QUALIFIZIERTEM NAMEN )
$id=GetID($Szene);
$allids=GetChildren($id);
forall id in allids

Ich hänge aber an der ersten Zeile. Alles andere funktioniert.

Danke
jwka

Die php.ini-Option auto_prepend_file kennst Du ja. Da kannst Du Dir dann einfach eine Funktion für einbinden:

function getIDByLocation ($location)
{
    $elements = explode("\\", $location);
    $id = 0;
    foreach ($elements as $element)
    {
        $id = IPS_GetObjectByName($element, $id);
    }
    return $id;
}

@Horst:
Mal abgesehen davon, dass „IPS_GetObjectByName“ bei mir einen fatal error wirft, ist Deine Antwort:

„Ja, man muss sich per Schleife SELBER runterhangeln, weil die IPS Funktionen keinen direkten Zugriff (ohne Wissen der ObjectID) auf ein Element in zweiter oder dritter Ebene unter Nutzung des full-qualified-name unterstützen.“

Richtig?

Meine Hoffnung war ja, dass ich diese Schleife vermeiden kann und der Aufruf „IPS_GetLinkIDByName“ intelligent genug wäre, dass ich auch direkt ein Element mit Hierarchie „Links\Ebene1\Ebene2\Linkname“ oder „Links.Ebene1.Ebene2.Linkname“ als Parameter übergeben kann.

Für mich also das Ergebnis:

Es wird ein „trade-off“ sein, ob ich
a.) mit „sauberen“ und damit automatisch tieferen Hierarchien arbeite und damit MEINE Scripte langsamer werden (weil jedesmal erst eine oder gar mehrere Loops brauche um die ObjectID zu ermitteln) aber IPS schnell ist

b.) ich doch mit vielen Kategorien auf „Ebene 0“ arbeite, damit IPS etwas ausgebremst ist, aber meine Scripte auf die Loops verzichten können.

(Geschwindigkeit siehe Thread: http://www.ip-symcon.de/forum/f52/systemarchitektur-fragen-variablen-objektbaum-vs-array-per-include-8255/#post68240)

c.) Ich doch wieder zurückfalle und mit Arrays arbeite, deren Struktur ich „flat“ aufbauen kann, dann aber die Ladezeiten der globalen Scripts in Kauf nehme.

Ob du die Schleife in PHP machst oder wir intern macht keinen Unterschied.

Vielleicht fühlst du dich bei der 2. Variante besser. Mich beschleicht das Gefühl, dass du Sachen optimieren willst, die es nicht Wert sind optimiert zu werden. Wenn du schnell sein willst, würde ich alles from-scratch in c++ schreiben. Das wäre schnell. Alles was du jetzt versuchst, ist der Tropen auf dem heißen Stein. Solange du dir keine O(n^2) Operation baust und dein Projekt gefühlt 10000 Objekte hat, wirst du mit einer normalen CPU nie an das Limit kommen. Und wenn ja, dann war es ganz sicher nicht eine PHP Operation, sondern irgendwelcher Code, der in IP-Symcon ausgeführt wird den du nicht beeinflussen kannst.

Ich würde auch deine Idee mit den kryptischen Namen überdenken und das normale Prinzip


Etage\Zimmer\Gerät

verwenden. Darauf ist IP-Symcon ausgelegt. Daraufhin sind alle Funktionen optimiert. Alles andere ist Zweckendfremdung der Funktionen und wird von uns auch nicht als relevant angesehen, falls es dort Geschwindigkeitsprobleme geben sollte. Oder andere Probleme (Siehe dein Feature Wunsch)

Und übrigens… Guck dir mal die webfront/data/ips.php an. Ich will nicht wissen wie die Komplexität dieses Quellcodes ist. Aber es funktioniert gut und ohne merklichen CPU Verbrauch.

paresy

@paresy:

erstmal Danke für die konstruktive Kritik.

Dein Gefühl, dass ich an Dingen rumoperiere, die es nicht Wert sind, mag gar nicht so falsch sein, das sehe ich auch ein - wenn man mir’s im Konkreten Punkt sagt wie soeben geschehen.

Wer „unwissend“ ist, kann nicht wissenlich an der richtigen Stelle rumlaborieren.

Aber genau für solche Diskussionen sind ja Foren auch ein Stück weit da.

Mein Fehler ist vielleicht, „diesmal alles besser“ machen zu wollen, sonst hätte ich „drauf los“ gemacht. Ich habe halt nur bei schon mehreren anderen Programmierprojekten nach einiger Zeit einen riesigen Aufräum-Akt gehabt.

Was ich mit meinen „kryptischen“ (soooo kryptisch sind die gar nicht) Namen halt erreichen will, ist vermutlich schwer zu transportieren. Ich sag’s mal so: Ich tippe schneller als dass ich mouseklicke. Mir wäre ne Anleitung, wie man die settings.xml füllt, lieber als die GUI.

Vielleicht zur Erklärung:
Ich bin einer dieser Idioten/Urgesteine, die mit MS-DOS 1.0 und Großrechner-Betriebssystemen wie MVS aufgewachsen sind und denen es Elend wird, wenn noch ne Taste und noch ne Propertiesbox und noch’n „weiter“ Button zu bedienen ist. Ich mache auch heute unter Windows noch mehr mit „ctrl-xyz shortcuts“ als mit der Maus und kann über viele Benutzer, die ne Ewigkeit für einfachste Sachen brauchen, nur den Kopf schütteln.

jwka

Da gebe ich dir völlig Recht. Und deswegen sind die IDs nur 5-stellig. Du guckst in den Baum, merkst sie dir und tippst sie schnell ein. (Notfalls: Rechte Maustaste -> ID kopieren)
(Für dich: In IP-Symcon sind alle Zugriff die du mit IDs machst in O(1). Schneller geht es nicht :))

Bei einem großen Projekt wirst du deine Konventionen zwar haben, die einzelnen Objekte vergisst du aber eh. Und deswegen wirst du immer mal wieder rübergucken müssen.

Dann kannst du auch gleich die ID verwenden. Die ist ja da. Und:
Die IDs werden automatisch vom System mit den richtigen Kommentaren versehen und automatisch aktualisiert. Du kannst dein Projekt umräumen wie du willst - an deinen Skripten ändert sich nichts.

Letzter Punkt:
Kryptische Namen musst du Dokumentieren, falls ein anderer an das Projekt will. Eine Anordnung nach Etage\Raum\Gerät ist einfach und super verständlich.

Falls du im WebFront eine andere Anordnung brauchst, kannst du diese immer noch mit Links erstellen.

paresy

Das mit den Links hatte ich gerade schon an anderer Stelle hier im Forum (Feature Requests) auch so „erkannt“ oder besser „zähneknirschend akzeptiert“.

Wir lassen’s mal gut sein.

Ich werde mir wahrscheinlich einige Scripte schreiben, die mir den Objektbaum bearbeiten und „in meinem Sinne“ umbiegen.

Danke
jwka