KOSV
5. Februar 2018 um 20:47
1
Hallo zusammen,
ich versuche in meinem PHP-Modul das Ereignis zum Start von IPS zu abonieren. Leider will mir das nicht gelingen.
Folgenden Code verwende ich
public function ApplyChanges()
{
...
$this->RegisterMessage(0, 10001 /*IPS_KERNELSTARTED*/);
}
public function MessageSink($TimeStamp, $SenderID, $Message, $Data)
{
switch ($SenderID)
{
...
case 0:
$this->Reset();
break;
}
}
Was mache ich falsch?
Viele Grüße
Sven
Bayaro
6. Februar 2018 um 09:27
2
Moin!
Ich verwende in ApplyChanges das hier:
$this->RegisterMessage(0, 10000);
$this->RegisterMessage(0, 10001);
................
if (IPS_GetKernelRunlevel() <> 10103) // KR_READY
{
$this->SendDebug("Function -ApplyChanges-", "Kernel is not ready! Kernel Runlevel = ".IPS_GetKernelRunlevel(), 0);
return;
}
Und dann die function „MessageSink“:
public function MessageSink($TimeStamp, $SenderID, $Message, $Data)
{
switch ($Message)
{
case 10100: // IPS_KERNELMESSAGE
switch ($Data[0])
{
case 10103: // KR_READY
// Was auch immer du machen willst // z.B. Timer starten
break;
}
break;
case 10001: // IPS_KERNELSTARTED
// Was auch immer du machen willst
break;
}
}
Grüße,
Chris
IPS_KERNELSTARTED setzt eine bestimmte IPS Version vorraus, ab welcher es funktioniert kann ich dir gerade nicht sagen.
Mit 4.4 sollte es aber auf jeden Fall funktionieren.
Michael
KOSV
6. Februar 2018 um 20:13
4
Laut Doku sollte „IPS_KERNELSTARTED“ ab v4.2 funktionieren. Ich nutze v4.4
Leider funktioniert die Lösung von Chris bei mir auch nicht. Irgendetwas mache ich falsch, nur was? Auch 10103 (KR_READY) funktioniert bei mir nicht.
Bayaro
7. Februar 2018 um 07:17
5
Moin!
Was genau willst du denn bei IPS_KERNELSTARTED machen? Vlt. funktioniert das was du vor hast zu dem Zeitpunkt noch nicht?!
Grüße,
Chris
KOSV
7. Februar 2018 um 19:53
6
Ich rufe diese function auf
public function Reset()
{
SetValueInteger($this->GetIDForIdent("LightMode"), PowerMode::Auto);
}
Allerdings habe ich ein Ereignis abonniert welches den folgenden Code ausführt wenn die Variable „LightMode“ geändert wird.
private function LightModeChanged()
{
$currentLightMode = GetValueInteger($this->GetIDForIdent("LightMode"));
switch($currentLightMode)
{
case PowerMode::On:
$this->SetTimerInterval("AutoOffTimer", 1000 * 60 * $this->ReadPropertyInteger("MaxPowerTime"));
// Set status LEDS
EIB_Switch($this->ReadPropertyInteger("StatusLedAuto"), false);
EIB_Switch($this->ReadPropertyInteger("StatusLedOff"), false);
EIB_Switch($this->ReadPropertyInteger("StatusLedOn"), true);
$this->SetPowerMode(PowerMode::On);
break;
case PowerMode::Auto:
$this->SetTimerInterval("AutoOffTimer", 0);
// Set status LEDS
EIB_Switch($this->ReadPropertyInteger("StatusLedAuto"), true);
EIB_Switch($this->ReadPropertyInteger("StatusLedOff"), false);
EIB_Switch($this->ReadPropertyInteger("StatusLedOn"), false);
$this->HandlePresenceSensor();
break;
case PowerMode::Off:
$this->SetTimerInterval("AutoOffTimer", 0);
// Set status LEDS
EIB_Switch($this->ReadPropertyInteger("StatusLedAuto"), false);
EIB_Switch($this->ReadPropertyInteger("StatusLedOff"), true);
EIB_Switch($this->ReadPropertyInteger("StatusLedOn"), false);
$this->SetPowerMode(PowerMode::Off);
break;
}
}
Viele Grüße
Sven