Remote Variable setzen / Skript aufrufen über logische Namen

Hallo zusammen,

angeregt durch diese Anleitung

Tasker-Skripte-in-IP-Symcon-starten

habe ich die Frage, welches zur Zeit und auch in IPS 4.x der „Weg der Wahl“ ist, um remote Variablen in IPS zu setzen oder Skripte auszuführen, egal ob der Client ein Android, Windows oder Linux ist.

Eine wichtige Bedingung für mich ist es, dabei niemals über eine ID zu gehen, sondern immer über den logischen Namen bzw. Pfad der Variablen auf dem IPS Server.

Gibt es schon etwas derartiges?

Danke und Gruß
micheljarre

Eine wichtige Bedingung für mich ist es, dabei niemals über eine ID zu gehen, sondern immer über den logischen Namen bzw. Pfad der Variablen auf dem IPS Server.

Das widerspricht dem Konzept von IP-Symcon. Je Lösung, die du über den Pfad machst, werde ich persönlich für „den falschen Weg“ titulieren :slight_smile:

Für IDs würde ich per JSON-RPC gehen, oder gerne auch die neuen WebHooks.

paresy

Danke für die Infos.

Warum hältst Du den Weg für falsch / IPS widersprechend, über logische Namen zu gehen?

Namen (=Strukturinformationen) haben für mich eine längere Halbwertszeit als IDs (=Implementierungsinformationen).

Ich generiere zur Zeit einen Großteil der IPS Strukturen automatisch über Skripte, so dass sich IDs mit jedem Neuaufbau ändern.

Alles auf einmal gleich… Da bleibt echt nur JSON…

Tankst du auch so dein Auto? Niemals schauen was auf der Säule steht immer im Notizbuch die Beschreibung „Dritte von Links“ merken oder per Pfad „An der Tanke in Hamburg, Wandsbeker Chaussee, Säule 3, 5. Zapfhahn von Links“. Irgendwann bauen sie eine zweite Tankstelle in der Straße… Kann man machen. Auch in IPS. Erkennst du das Fehlerpotential? :wink:

Gruß,

Toni

Hallo Toni,

Ich lasse mich gerne korrigieren, aber diese Analogie ist für mich keine. :wink:

Ich möchte nicht an Tankstelle 23345 tanken, sondern an der Tankstelle mit dem Namen xy. Ich möchte auch nicht 32133 tanken, sondern Diesel. Also muss dort Diesel stehen. IDs sind für mich Schall und Rauch und können sich ändern, wenn ich IPS das nächste mal (neu)konfiguriere, während Namen (oder von mir aus auch Idents) die persistente Information sind. Wenn ich zwei Tankstellen mit dem gleichen Namen in die Wandsbeker Chaussee setze, habe ich tatsächlich eine Mehrdeutigkeit. Dann ist diese aber entweder gewollt (=es ist egal, wo ich tanke) oder aber ein logischer Fehler beim Erzeugen der Strukturen.

Eine gewisse Relevanz hat natürlich die sinnvolle und eindeutige Strukturierung, so dass „3. Zapfsäule von links“ ungünstiger ist als z.B. „Diesel“.

Gruß
micheljarre

Wenn du meine Analogie nicht magst passe ich sie dir gerne an :wink:

Wie eindeutig ist der Pfad für die Variable /Tankstelle/Hamburg/Wandsbecker Straße/Diesel in diesem Beispiel?

Es geht noch weiter. Mit einem Klick (absicht, unbedacht oder versehen) verschiebe ich ganze Bäume und Strukturen. Die Pfade ändern sich die Variablen sind „verschwunden“. Die ID bleibt.

Wie gesagt. Kann man machen in IPS. Aber eine ID bleibt der eindeutige Identifizierer eines jeden Objekts.

so dass „3. Zapfsäule von links“ ungünstiger ist als z.B. „Diesel“.

Du meinst der eindeutige Bezeichner „Diesel“ ist aussagekräftiger für das Produkt in der 3. Säule am 4. Hahn? Genau! :wink:

Gruß,

Toni

Hallo Toni,

ich glaube, unsere Diskussion ist eher philosophisch bzw. Einstellungssache und unsere Positionen widersprichen sich auch nicht direkt.

Für mich ist die „Struktur“ die Wahrheit, nicht die IDs. Wenn ich die Struktur verschiebe oder ändere, habe ich in der Tat ein Problem, wenn ich mit Pfaden arbeite. Dementprechend ist das von dir angesprochene Fehlerpotenzial vorhanden.

Wenn ich aber von außen auf ein System schaue und es erkunde (z.B. einen Verzeichnisbaum, ein Haus mit Geschossen, Räumen, Gewerken, …), sind die internen IDs für mich nicht relevant. Wie sonst würde ich mich in einem weiteren/neuen Haus zurecht finden?

Gruß
micheljarre

Kein Problem, ist ja nicht verboten. Probiers aus.

Bevor ich loslaufe und an einer eigenen Lösung arbeite: Gibt es schon fertige Lösungen? Oder ist der Beitrag
Tasker-Skripte-in-IP-Symcon-starten als Grundlage zu nehmen und daraus eine neue Lösung zu entwickeln?

Ich glaube du hast noch keine konkrete Fragestellung gepostet, oder? Tasker ist ja nun nicht grad egal ob Android, Windows oder Linux.

JSON-RPC ist eine fertige Lösung. Du brauchst es nur von Android, Windows oder Linux bedienen. So wie in dem Tasker Beispiel.

Hallo Toni,

meine Frage war eigentlich:

mit der Bedingung

Hinter dem vorgestellten Tasker-Mechanismus steckt ein http Post, das sollte also von allen OS möglich sein. Meine Frage ging eher in die Richtung, wie ich den Namen/Pfad mit in den Aufruf packe?

Danke und Gruß
micheljarre

Da inzwischen bei mir neben dem Wirksystem auf Windows mit IPS 3.4 noch 4 andere Raspis mit IPS 4.0 und denselben Skripts zusammenarbeiten sollen, habe ich weitgehend auf Pfad-Identifizierung umgestellt. Thema war hier

Voraussetzung ist natürlich, daß die zusammengehörigen Objekte immer in gleicher Position zueinander stehen. Bei Homematik-Komponenten ist das ja auch zwangsläufig so.

Ein Remote-Aufruf von einem Raspi an das Wirksystem sieht dann bei mir in etwa so aus:

                        $rpc = new JSONRPC ("http://" . $LAN['Svr1']['Li'] . ':' . $LAN['Svr1']['PW'] . '@' . $LAN['Svr1']['IP'] . ':' . $LAN['Svr1']['Port'] . '/api/');
                        $rpc -> IPS_RunScriptEx ($LAN['Svr1']['ObjRX'], Array (
                            'Cmd'    => "PutData",
                            'PcTX'   => PCname,
                            'PcRX'   => 'Svr1',
                            'Act'    => 'BLEvis/ACT', // Präsenz-Manager
                            'ObjTp'  => 'LE', // = Bluetooth Low Energie
                            'EAObj'  => 'LE',
                            'ParPac' => serialize ($DvListe ['LE']),
                            'TRIG'   => $_IPS['SELF'] . '@' . PCname));

wobei im Beispiel ‚BLEvis/ACT‘ der Ident-Pfad eines Skriptes ist, zusammengesetzt aus
‚BLEvis‘ als im System eindeutiger Ident einer Kategorie und
‚ACT‘ als Ident eines darunterliegenden Skriptes (das aufgerufen wird) und eben in dieser ‚BLEvis‘-Objektgruppe verankert ist. Andere Objektgruppen können auch so ein Skript beinhalten.

(das ganze nur mal zur Anheizung der Diskussion, über Philosophien läßt sich ja trefflich streiten.

Viele Grüße
Harald

Ich hab mal einen Telnet Client gestrickt, der einem ermöglichte durch den Baum zu navigieren wie in der guten Alten DOS Zeit. War ein nettes Null-Nutzen-Projekt. Just for fun. Wollte davon immer noch mal ne neue Version von auflegen. :slight_smile:

Für dich soll ja die Struktur die neue „Wahrheit“ werden, wie du schreibst. Wir waren uns ja schon einig, dass sie aber keinesfalls eindeutig ist. Um durch diese Struktur zu navigieren musst du sie zu allererst einmal auslesen. Du beginnst einfach damit dir aller Entities der Ebene 0 (das rootverzeichnis) zu erfragen. IPS wehrt sich mit einer Liste aller Objekte wenn du es mit IPS_GetObjectList beim idlen störst. Mit dem Aufruf von [b]IPS_GetObject[/b] bekommst du alle Details zu deinem Objekt. Dann kannst du, wie du es nanntest, von hier aus dein Haus „erkunden“ und dich tiefer in deinen Baum hineinhangeln.

Wenn du nur Interesse an einem Teilbereich des Baumes hast lässt sich diese Prozedur natürlich beliebig verkürzen.

Deinen Pfad bekommst du dann rückwärts mit [b]IPS_GetObjectIDByName[/b] wieder aufgelöst. Ist ein bisschen Fummelkram aber mit etwas Fleiß kannst du dir so die IPS-Console komplett nachbauen. Ich habs schon gemacht. :slight_smile:

Toni

Übersetzt in PHP:


// ObjID eines Objektes oder einer Instance wird ggf. durch einen Pfad mit Idents identifiziert
function GetObjectIDByIdentPath ($Path) {
    if (is_numeric ($Path)) {
        if (IPS_ObjectExists ($Path)) {
            return $Path;
        } else {
            return false;
        }
    } else {
        $Obj = explode ('/', $Path);
        $ParentId = GetObjectIdAusListe (IPS_GetCategoryList (), $Obj[0]);          // suche bei den Kategorien
        if ($ParentId === false)
            $ParentId = GetObjectIdAusListe (IPS_GetInstanceList (), $Obj[0]);      // oder es handelt sich um eine Instanz
        if ($ParentId === false)
            return false;
        if (count ($Obj) == 1)
            return $ParentId;
        for ($i = 1; $i < count ($Obj); $i ++ ) {
            $ObjectId = @IPS_GetObjectIDByIdent ($Obj[$i], $ParentId);
            if ($ObjectId === false)
                return false;
            $ParentId = $ObjectId;
        }
        if (IPS_ObjectExists ($ObjectId)) {
            return $ObjectId;
        } else {
            return false;
        }
    }
}
function GetObjectIdAusListe ($Liste, $Obj) {
    foreach ($Liste as $ID) {
        if (IPS_GetObject ($ID)['ObjectIdent'] == $Obj)
            return $ID;
    }
    return false;
}

// Pfad mit Idents wird aus ObjectID ermittelt (Revers-Fuktion von GetObjectIDByIdentPath)
function GetIdentPathByObjectID ($ListeNr) {
    if (IPS_ObjectExists (GetObjectIDByIdentPath ($ListeNr))) {
        if (is_numeric ($ListeNr)) {
            $Liste = $ListeNr;
            $Path = @IPS_GetObject ($Liste)['ObjectIdent'];
            if (($Path === '') || $Path === false)
                return false;
            do {
                $Liste = IPS_GetObject ($Liste)['ParentID'];
                $Path = IPS_GetObject ($Liste)['ObjectIdent'] . '/' . $Path;
                if (stripos ($Path, '/') === 0)
                    return false;
            } while (GetObjectIDByIdentPath ($Path) != $ListeNr);
            return $Path;
        } else {
            return $ListeNr;    // ist $Path
        }
    } else {
        return false;
    }
}




Viele Grüße
Harald

Danke für die ausführlichen Informationen, die mir auf jeden Fall weiterhelfen.

Viele Grüße
micheljarre