Defektes Teil austauschen ohne in IPS alles neu zu machen

Hallo,

gibt es eine Möglichkeit beim Austausch eines defekten Aktors nicht alle Scripte, Links, Ereignisse usw. neu machen zu müssen?
Mir würde jetzt nur einfallen, die Adresse, in den Instanzen des Aktors, durch die Adresse des neuen Gerätes zu überschreiben.
Geht das überhaupt? Im Konfiguratur sind doch dann beide drin.
Ich wollte mir durch solche Versuche jetzt nicht meine Installation zerschiessen, deshalb erstmal die Frage hier.
Vielleicht hat das ja schon wer gemacht, oder kennt einen anderen Weg.
Danke fürs mitüberlegen.:slight_smile:

Genau so wird es gemacht.
Den Konfigurator brauchst du dafür nicht.
Die Geräte sollten aber schon identisch (= identische Datenpunkte) sein.
Sonst hast du nachher z.B. State von einem Schaltaktor und Level von einem Dimmer in der Instanz. Und das haut dann nicht hin.
Michael

Moin… ich arbeite in meinen Skripten mit keinen ID’s mehr. Ich hole mir alles über Links oder Ereignisse die unter den jeweiligen Skripten liegen.
Sollte ich etwas ändern, z.B. wie in deinem Fall ein Gerät löschen und dafür ein anderes erstellen, brauche ich nur die Linkverknüpfung ändern.
Sauber und übersichtlich.
Du kannst im Objektbaum bereits sehen, welche „Daten“ das Skript benötigt.
Hilft dir in diesem Fall nicht weiter, wäre aber ein Ansatz für neue Skripte.

Zurück zu deinem Problem:
Es gab hier im Forum vor 1-2 Tagen gerade eine ähnliche Frage.
Da wurde von paresy drauf geantwortet. Schau mal in seinen Verlauf.
Grüße,
Peter

Danke, das ging aber schnell.:slight_smile:

Gut dann werde ich das morgen mal so machen.
Die Vorgehensweise von Peter muß ich mir dann mal genau überlegen, so ganz habe ichs noch nicht verstanden.

Angenommen du hast irgendwo in deiner Baumstruktur ( an völlig unterschiedlichen Positionen ) jeweils eine Temperaturvariable.
Diese beiden Variablen willst mit einem Skript abfragen und beide Werte vergleichen.
Mein Ansatz:
Ich würde mir unter das Skript welches ich dafür schreibe zwei Links anlegen, genau zu diesen zwei Variablen.
In dem Skript selbst frage ich ab, ob Links vorhanden sind (unter dem Skript).
Anhand der Bezeichnung der Links weiß ich, welche Variable ich abfrage.
Sollte ich nun eine andere Variable mit einer der Beiden vergleichen wollen, müsste ich nur den Link ändern (das Ziel), das Skript muss ich nicht ändern.
Ebenfalls taucht nicht eine ID in den Skript auf.
Das Skript läuft so lange die Links ok sind.

Interessante Idee, dann arbeiten die Scripte aber fast immer Typenlos… also ips_GetValue? Hab mir das auch schon mal überlegt oder man könnte im Link den Typ mitgeben.(alle Boolean fangen zbsp bei mir mit b an) Die Typenlosigkeit scheint mir mit IPS aber eh nicht so problematisch.Nur wer weiß was kommt.

Morgen

Vielleicht ist es mal weider an der Zeit auf die globale Suchen/Ersetzen Funktion des Editors hinzuweisen.
Ändern einer ID in allen existierenden Scripten ist damit eine Sache von Sekunden.

  • zusätzlich dann noch im Archive Konfigurator die Daten auf die neue ID umkopieren.

  • dann noch den Objektbaum von hierarchisch auf Listenansicht umstellen und so sortieren das ungültige Objekte sichtbar werden. Damit sieht man gleich welche Links nun ungültig sind und kann diese neue setzen.

Fertig.
Dauert im Normalfall keine 2 Minuten.

gruß
bb

Nicht unbedingt. Du kannst schon z.B GetValueFloat im Skript nehmen, das ist ja kein Universal-Skript. Es wird lediglich auf ID’s innerhalb des PHP-Codes verzichtet.

Ich hatte hier mal ein Fenster-Status Skript gepostet, welches nur Ereignisse benötigt um zu funktionieren. Nix anzupassen, keine ID einzugeben. Nur die Struktur von Skript und Ereignissen musste stimmen!

Hallo,
das mit den Links zieht aber auch einiges an Arbeit mit sich, oder? Abhängig davon, wie oft die Variable verwendet wird. Oder verstehe ich das falsch?

Ich habe eine „_config.ips.php“ in der ist ein Array mit allen VariablenIDs. Diese Datei include ich am Anfang eines jeden Skripts. Im Skript kann ich dann bequem bspw. per „$roomArray[„OG SZ“][„Heizung“][„Solltemp“]“ auf die jeweilige Variable zugreifen. Sind Events an Skripten, welche abhängig von einer Variablen sind, dann wird am Ende des Skripts überprüft, ob die VariablenID im Event mit der ID in der Konfig übereinstimmt. Wenn nicht werden die Events angepasst.
So mache ich das konsequent von Anfang an und es funktioniert für meinen Geschmack hervorragend.

Weiterführend mach ich das Schalten von beispielsweise Steckdosen, Lichtern, Heizung und so weiter per Funktionen, welche in bspw. „_functionsHeating.ips.php“ liegen. In den jeweiligen Funktionen wird ermittelt, ob es sich um einen KNX- oder Homematic-Aktor oder sonst etwas handelt und dementsprechend wird per „powerSupplySwitch($id, true)“ der jeweilige Aktor geschaltet.
Ersetze ich einen Homematic-Aktor gegen einen KNX-Aktor funktioniert alles weiterhin und ich muss nur in der Config die ID anpassen.

:cool:

Den Ansatz von Brovning verfolge ich mit meiner AktorSteuerung ebenfalls und funktioniert tadellos :slight_smile: :cool:

Hatte die auch mal hier veröffentlicht, aber irgendwie sieht niemand das potential oder keine Ahnung :smiley:
>> AktorSteuerung (alle Aktoren über eine zentrale Steuerung ansprechen/bedienen)

Grüße,
Chris

Hallo Chris,
soweit ich das sehe, unterscheidest du jedoch beim Funktionsaufruf.
Beispielsweise:

// THERMOSTATE > HOMEMATIC
//AktorSteuerung("Gaestezimmer_Heizung", "TEMPERATUR", 21);               // Thermostat auf 21 Grad stellen

// THERMOSTATE > Z-WAVE STELLAZ
//AktorSteuerung("Gaestezimmer_Heizung", "KOMFORT-TEMPERATUR", 21);         // Temperatur für Komfort-Modus auf 21 Grad setzen

Bei mir ist das eine Funktion. Beispielsweise „setSollTemp($id, $temp)“. In der Funktion wird ermittelt, ob es ein Homematic oder Z-Wave Gerät oder was auch immer ist und entsprechend gehandelt.

Hallo Jürgen!

Stimmt, bei Thermostaten habe ich „Unterschiede“, das ist einfach den verfügbaren Funktionen/Möglichkeiten der Geräte geschuldet. Da aber weder ich, noch jemand im Bekanntenkreis, die Thermostate unterschiedlicher Hersteller „gemischt“ hat, stellt das für niemanden ein Problem dar.

Ich wollte damit auch nicht ausdrücken, dass ich die perfekte Lösung habe, sondern das ist eher eine sehr gute Basis die man noch um seine Bedürfnisse erweitern/anpassen kann :slight_smile:

Grüße,
Chris

Dem wollte ich auch nicht widersprechen. Nur anmerken.

Falls du jemanden mit Mischbetrieb kennen möchtest:
Habe mit Homematic für die Heizungssteuerung, Steckdosen und Licht in allen Räumen gestartet und seit 2 Jahren Raum für Raum (Renovierung) auf KNX umgestellt. Somit war und ist bei mir immer noch ein Mischbetrieb mit diesen beiden Systemen vorhanden. :wink:

Zu dem Anfangs-Thema „Defektes Teil austauschen ohne in IPS alles neu zu machen“ möchte ich auch noch meinen Senf dazugeben :slight_smile: weil

Die Methode, alle Objekt-IDs in einer Datei zu referenzieren und diese Datei bei allen Skripten zu inkludieren ist bei einem einzigen System schön und gut !!

Da aber 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, muß ich die Datei 5fach individuell pflegen.

Ich arbeite deshalb meine Skripts, die identisch auf allen IPS-Systemen sind, Zug um Zug um, indem
Skripte und Variablen nur noch über einen Identpfad aufgerufen werden
nach folgendem Prinzip:

  1. Die Idents von Kategorien und Instanzen müssen im System eindeutig sein
  2. Unter den Kategorien können dann (wie IPS z.B. die HomeMatic Geräte anlegt) verschiedene Skripte und Variablen mit in dieser Ebene eindeutigen Idents angelegt werden.
  3. Aufruf oder Zugriff erfolgt über eine eigene Function GetObjectIDByIdentPath ($Path)

Hier einige Beispielsaufrufe:


...
IPS_RunScriptEx (GetObjectIDByIdentPath ('CRONjobs/ACT'), array ());
...
        IPS_RunScript (GetObjectIDByIdentPath ('BLEvis/MON1'));          // Mon_BLE gleich anzeigen
        IPS_RunScript (GetObjectIDByIdentPath ('BLEvis/MON2'));
...
if (IPS_GetEvent (GetObjectIDByIdentPath ('CRONjobs/ACT/TRG'))['NextRun'] < time()) 
    IPS_RunScript(GetObjectIDByIdentPath ('CRONjobs/ACT'));
...
// aber auch, wenn die Variable unterhalb des Skriptes angelegt ist:
    $ListeNr = IPS_GetObjectIDByIdent ( "DTA", IPS_GetObject ($_IPS['SELF'])['ParentID'] );


Die Idents und die Struktur lege ich mit einem Konfigurations-Skript an, das ich per JSON auf die Raspis transferiere und dort starten lasse. Auszug:

/*
 * file          Struktur_Install.ips.php

 * 
 * Legt alle Komponenten einer neuen Struktur an, z.B.:
 * VIS  String-Variable als HTML-Box (?-Anzeige)
 * DTA  String-Variable als Speicher (?-Daten)
 * MON  Skript zur Befüllung von VIS in Abhängigkeit von DTA (?_Mon.ips.php)
 * ACT  Skript zur Ereignisverarbeitung (?_Act.ips.php)
 * 
 * Wird u.a. per JSON auf remoten Raspis gestartet und legt dort leere Skripte, Variablen usw. an
 *  
 */
....

    case 1:    // ein Beispiel
        $KAT = CreateCategory ('Name', 0, 100, 'Ident');    // Kategorie als Root
        $VIS = CreateVariable ('Variable zur Visualisierung', 3, $KAT, 0, "~HTMLBox", null, '', '', "VIS");
        $DTA = CreateVariable ('Variable zur Datenspeicherung', 3, $KAT, 1, "~String", null, '', '', "DTA");
        IPS_SetHidden ($DTA, true);
        $MON = CreateEmptyScript ('Anzeige-Skript', $KAT, 2, true, 'MON');    // Skript zur Anzeige, Position 2, Hidden
        $ACT = CreateEmptyScript ('Ausführungs-Skript', $KAT, 3, true, 'ACT');    // Skript zur Ausführung
        $TRG = CreateTimer_CyclicByMinutes ('Trigger', $ACT, 8, false, 'TRG');        // Timer, noch nicht aktiviert
        CreateEmptyScript ('Linux', $ACT, 2, false, '', 'sh');       // ein Batchfiles für Linux (Linux.sh) als Beispiel
        break;

....

Bedeudet also: einmal auf dem Hauptsystem erstellt, mehrfach selbsttätig auf die Raspis kopiert, wo die Struktur ohne individuelle Anpassung ablauffähig ist.

Viele Grüsse
Harald