bisher habe ich zur Abfrage des Status von KNX Devices, z.B. bei Neustart von IPS, die Funktion EIB_RequestStatus benutzt. Dazu habe ich ein kleines Startup Skript geschrieben, welches abfragt, ob ein EIB/KNX Device das „Lesen“ Flag gesetzt hat. Ist dies so, so wird über EIB_RequestStatus der aktuelle Status vom Bus abgefragt.
Das funktioniert super und so hat IPS immer den aktuellen Status der KNX devices, wenn IPS einmal neu gestartet wird.
Die neuen KNX DPT x devices kennen einen solchen Befehl nicht (ich habe nur KNX_Write…) Befehle gefunden.
Wie kann man den Status der neuen KNX DPTx devices vom Bus auslesen (eine Leseanfrage an den Bus, analog EIB_RequestStatus)?
in dem Zusammenhang eine Frage: liest die Instanz eigentlich bei gesetzter „Lesen“-Eigenschaft den Wert automatisch beim Neustart vom Bus oder ist das nur eine Fähigkeit, bei der man das Auslesen per Code selbst veranlassen muß?
Nach meinen Tests reicht es nicht, nur das „Lesen“ Flag zu setzen. Nach einem Reboot initiiert IPS kein automatisches aktualisieren der Instanz, wenn das „Lesen“ Flag gesetzt ist.
Ich gehe hin und hole die Instanzen mit gesetztem „Lesen“ Flag und sende dann ein EIB_RequestStatus an diese Instanz.
Ich interpretiere den Schalter so: Der Instanz wird erlaubt Werte vom Bus abzufragen. Das bedeutet aber nicht, dass IPS das automatisch macht.
Ich gehe hin und habe für die meisten KNX Geräte auch Instanzen der Status-Rückmeldeadresse angelegt (beispielsweise Status eines Schaltaktors für eine Lampe). Normalerweise ist ja KNX seitig nur für die Rückmeldeadresse das KNX-Flag „Lesen“ gesetzt (siehe ETS).
In IPS setze ich dann für diese Instanz ebenfalls das IPS-Flag „Lesen“ und kann den Status wie beschrieben auslesen.
Vielleicht geht es auch einfacher, aber bisher hat es nur so funktioniert.
Feature
Wer z.b. bei KNX oder auch Homematic den aktuellen Status beim Starten von IPS einlesen will, muss dies über das Start-Skript selber umsetzen.
Michael
Ich weiß, daß IPS immer etwas umständlich tickt. Die Automatisierungssoftware, wo nix automatisch ist und der Anwender sich bitte um alles selbst kümmern muß.
In KNX-üblich wäre es, so eine Abfrage einzustellen und dann wird sie ausgeführt oder nicht, je nach Einstellung. Den Nutzen, das einstellen zu können und dann muß der Anwender sich doch selbst drum kümmern, diesen Nutzen sehe ich noch nicht.
Die KNX_RequestStatus Funktion kommt für die DPTs zum nächsten Update.
Ich habe mal ein Skript erstellt, welches dann die GAs über die jeweiligen Instanzen abfragt. Dies kann man dann per Start-Skript auch automatisch machen lassen.
<?
$gatewayIDs = IPS_GetInstanceListByModuleID("{1C902193-B044-43B8-9433-419F09C641B8}");
$instanceIDs = IPS_GetInstanceList();
foreach($gatewayIDs as $gatewayID) {
foreach($instanceIDs as $instanceID) {
$i = IPS_GetInstance($instanceID);
if($i['ConnectionID'] == $gatewayID) {
switch($i['ModuleInfo']['ModuleID']) {
case "{24A9D68D-7B98-4D74-9BAE-3645D435A9EF}": //Shutter
case "81F54858-72B1-4C2C-8CE3-7E00A3168378": //RGB (Legacy until IP-Symcon 5.0)
case "{81F54858-72B1-4C2C-8CE3-7E00A3168378}": //RGB (IP-Symcon 5.1+)
case "4D7F7548-0979-4ABD-9BB3-81F9477C0903": //RGBW (Legacy until IP-Symcon 5.0)
case "{4D7F7548-0979-4ABD-9BB3-81F9477C0903}": //RGBW (IP-Symcon 5.1+)
EIB_RequestStatus($instanceID);
break;
case "{D62B95D3-0C5E-406E-B1D9-8D102E50F64B}": //Group
if(IPS_GetProperty($instanceID, "GroupCapabilityRead")) {
EIB_RequestStatus($instanceID);
}
break;
default:
//DPTs
if(strpos($i['ModuleInfo']['ModuleName'], "DPT") !== false) {
if(IPS_GetProperty($instanceID, "CapabilityRead")) {
KNX_RequestStatus($instanceID);
}
}
break;
}
}
}
}
paresy
PS: Das landet demnächst auch in der Doku zum schnellen Copy&Paste
Das ein Haken in der Instanz gesetzt werden kann, wenn das lesen-Flag aktiv ist, wodurch bei einem Neustart die GA abgefragt wird.
Dann muss man wirklich nicht für jeden „Kleinkram“ selbst ein Skript triggern.
Schade das HM da vom Aufbau so doof ist, sonst hätte ich es mir dort auch gewünscht (als sep. Eigenschaft, wie lese Status bei Verbindungsaufbau).
Michael