Taster schaltet Leuchte

Hallo erstmal :slight_smile:

Ich hab vorgestern angefangen unsere IPS zu konfigurieren und hätte eine Entwurfsfrage.

Wenn ich einen Taster habe mit 2 events. Hoch und Runter und eine Leuchte die ich per

HM_WriteValueBoolean(33566 /[Räume\EG Büro 3\EG Büro 3 Licht]/, „STATE“, true);

ein und aus schalten kann. Wie würdet Ihr das am saubersten lösen?

Im Moment habe ich 2 Scripte mit jeweils dem Befehl drin der dann an das jeweilige event des Tasters gehängt ist.
Das ist ja aber nicht gerade sauber so :slight_smile:

Gibt es eine Möglichkeit die Lampe je nach aktuellem Status um zu schalten statt an und aus?
Gibt es eine Möglichkeit alle events an ein Script zu senden und dann per Abfrage die Quelle heraus zu finden?
Per sender ID oder so. Dann könnte ich mir da eine Managment Klasse schreiben an die man Lichter und Schalter einfach anmelden kann.

ja und ja :wink:

Z.B. im Script den Zustand der Leuchte abfragen und umkehren.

Viele nützliche Variablen findest du bei den Systemvariablen.

Danke für den Link auf die Systemvariablen.

Das mit dem Status habe ich schon versucht mit

boolean HM_RequestStatus ( $InstanzID, „STATE“ )

Leider bekomme ich… wie in der Beschreibung des Befehls auch angegben:

Konnte der Befehl erfolgreich ausgeführt werden, liefert er als Ergebnis TRUE, andernfalls FALSE.

Immer nur 1 also TRUE zurück geliefert. Also das der Befehl erfolgreich ausgeführt wurde… Wie komme ich dann an den benötigten Status Wert?

Außerdem gibt es ja hier noch den Hinweiß:

Diese Funktion belastet den Funkverkehr erheblich. Sie sollte ausschliesslich verwendet werden, um kritische Geräte zum IP-Symcon-Start zu aktualisieren. Ein erneutes Abfragen zur Laufzeit wird nicht benötigt, da die HomeMatic alle Statusänderungen direkt an IP-Symcon weiterleitet.

Wobei, so oft am Tag ja nicht ein Schaltevent ausgelöst werden sollte das es das Netzwerk stört.

Ich denke ich muss was IPS angeht erstmal ein paar grundlegende Missverständniss Hürden überwinden :slight_smile:

Einfach GetValue nutzen. :smiley:
Michael

Nahh :slight_smile:

Hab mich total auf die Modul Definition versteift.
Jetzt tut das super. Noch in eine nette Klasse gepackt und das Anlegen der ganzen Lampen wird easy.



HM_WriteValueBoolean(33566 /*[Räume\EG Büro 3\EG Büro 3 Licht]*/, "STATE", 
(GetValue(18070 /*[Räume\EG Büro 3\EG Büro 3 Licht\Zustand]*/) == 1) ? false : true);

Ein Ausrufezeichen zum invertieren reicht auch :wink:
Ist aber Geschmacksache.
Michael

Ging bei mir nicht, da der Befehl bei false nichts also „“ liefert und bei true 1.
Hatte es probiert.

GetValueBoolean sollte false/true liefern.
GetValue eigentlich auch, wenn die IPS-Variable boolean ist. Außer hier wurde aus Gründen der Kompatibilität was anders gemacht.
Ich empfehle da Typensicher zu arbeiten.
Dann kommen solche komischen Effekte hat nicht erst.
Michael

Nur das PHP halt nicht typensicher ist. false und true ist 0 und 1 :slight_smile:
Ich teste es nochmal mit der getBolean Version.

Hier mal mein kleines Script für die Lampen.

Durch

$lightMan->addConnection(HardwareID,VariablenID,EventID);

Können jetzt soviele Lampen wie man mag hinzugefügt werden.

Hab jetzt noch eingebaut das man Taster als nur off oder nur on verbinden kann.
Um zb einen Ausschalter für mehrere Lampen zu implementieren. Standart ist tog für toggle.

<?
if($_IPS['SENDER'] != "Variable") die();

class LightConnection
{
	public $lightId;
	public $lightVar;
	public $eventId;
	public $behavior;
	
	function LightConnection($_lightId, $_lightVar, $_eventId, $_behavior)
	{
        $this->lightId 	= $_lightId;
        $this->lightVar = $_lightVar;
        $this->eventId 	= $_eventId;
        $this->behavior = $_behavior;
   }
}

class LightManager
{
    private $lightSwitchConnections = array();

    function addConnection($lightId, $lightVar, $eventId, $behavior = "tog")
	 {
      $this->lightSwitchConnections[] = new LightConnection($lightId, $lightVar, $eventId, $behavior);
    }
    
    function handleEvent($eventId)
    {
	    foreach ($this->lightSwitchConnections as &$connection)
		 {
	    	if($connection->eventId == $eventId)
	    	{
	    		IPS_LogMessage("Licht Manager", "Event call:" . $eventId . " - " . $connection->behavior );
				if($connection->behavior == "tog")
	    			$newState = GetValue($connection->lightVar /*[Räume\EG Büro 3\EG Büro 3 Licht\Zustand]*/) == 1 ? false : true;
				else if($connection->behavior == "on")
	    			$newState = true;
				else if($connection->behavior == "off")
	    			$newState = false;

				IPS_LogMessage("Licht Manager", "Light geschaltet:" . IPS_GetName($connection->lightVar) . " auf " . $newState );
				HM_WriteValueBoolean($connection->lightId /*[Räume\EG Büro 3\EG Büro 3 Licht]*/, "STATE", $newState);
			}
		 }
	 }
}


$lightMan = new LightManager;
// Setup all connections
$lightMan->addConnection(33566,18070,42521);
$lightMan->addConnection(33566,18070,39631,"off");

// Handle the current event
$lightMan->handleEvent($_IPS['EVENT']);
?>