Anwesenheit über ToggleScript

Hallo zusammen,

ich nutze folgendes Script um über einen HM-Taster die Anwesenheit von Personen zu schalten.

<?

 // Toggle-Button für Anwesenheit Person
 // 1. Boolean-Variable anlegen (z.B. Person1)
 
$person1_kai = 17552 /*[WORK\Anwesenheit Haus\Personen\Toggle Person1 Kai\Person1_Kai]*/;
$funkgong = 19690 /*[Hardware\Homematic\EG\Wohnzimmer\Sicherheit\Wohnzimmer Funk Gong\Wohnzimmer Funk Gong 2]*/;

 switch(GetValueBoolean($person1_kai)) {
    case false:
    toggleOn($person1_kai);
    break;
    
    case true:
    toggleOff($person1_kai);
    break;
}

function toggleOn($person1_kai) {
	SetValue($person1_kai , true);
	HM_WriteValueString($funkgong,"SUBMIT","0.5,1,5,22");
}

function toggleOff($person1_kai) {
	SetValue($person1_kai , false);
	HM_WriteValueString($funkgong,"SUBMIT","0.5,1,5,23");
}

?>

Die Variable von Person1 wird bei jedem Tasentdruck umgeschaltet. Leider wird die MP3 Ansage nicht ausgeführt.
Wenn ich ein seperates Script für die Ansage verwende funktioniert es.

Kann mir jemand erklären wieso es nicht mit einem Script umsetzbar ist.

Vielen Dank und beste Grüße
Kai

Hallo Kai,

die Variable $funkgong ist innerhalb der function nicht bekannt. Du solltes eigentlich entsprechende Fehlermeldungen im Log haben.

Du must die Variable, beim Aufruf der function, mitgeben.


    toggleOn($person1_kai,$funkgong);

.
.
.
.
function toggleOff($person1_kai,$funkgong)

 

Attain

Hallo Attain,

vielen Dank so funktioniert es. :slight_smile:

<?

 // Toggle-Button für Anwesenheit Person
 // Boolean-Variable anlegen (z.B. Person1)
 
$person1_kai = 17552 /*[WORK\Anwesenheit Haus\Personen\Toggle Person1 Kai\Person1_Kai]*/;
$funkgong = 19690 /*[Hardware\Homematic\EG\Wohnzimmer\Sicherheit\Wohnzimmer Funk Gong\Wohnzimmer Funk Gong 2]*/;
$ccusysvar = 37585 /*[Hardware\Homematic\Systemvariablen]*/;

 switch(GetValueBoolean($person1_kai)) {
    case false:
    toggleOn($person1_kai,$funkgong,$ccusysvar);
    break;
    
    case true:
    toggleOff($person1_kai,$funkgong,$ccusysvar);
    break;
}

function toggleOn($person1_kai,$funkgong,$ccusysvar) {
	SetValue($person1_kai , true);
	HM_WriteValueString($funkgong,"SUBMIT","0.5,1,5,22");
	HM_WriteValueBoolean2($ccusysvar, '2539', true);	
}

function toggleOff($person1_kai,$funkgong,$ccusysvar) {
	SetValue($person1_kai , false);
	HM_WriteValueString($funkgong,"SUBMIT","0.5,1,5,23");
	HM_WriteValueBoolean2($ccusysvar, '2539', false);
}

?>

Beste Grüße
Kai

nur der Vollständigkeit halber, alternativ kannst du in der Function auch

global $funkgong

schreiben, dann kannst du auch auf die Variable zugreifen.

Hallo zusammen,

vielen Dank. DIe Schaltung über einen HM-Taster konnte ich damit umsetzen.

Jetzt stehe vor einem neuem Problem :banghead:

Ich würde gerne eine Variable z.B. Anwesenheit Haus, 60 Sekunden verzögert auf „false“ setzen.
Dies gelingt mir mit diesem Script.

<?

$Person1_Var = 51012 /*[WORK\Test\Person1Test]*/;  // Hier die BOOL-Variable von Person1Test eintragen (TRUE = Anwesend, FALSE = Abwesend)
$Person2_Var = 33048 /*[WORK\Test\Person2Test]*/;  // Hier die BOOL-Variable von Person2Test eintragen (TRUE = Anwesend, FALSE = Abwesend)
$Person1 = GetValue($Person1_Var);
$Person2 = GetValue($Person2_Var);

// Trigger-Events anlegen, damit dieses Skript immer ausgeführt wird, wenn die
// Anwesenheits-Variablen von Person1 oder Person2 sich ändern
CreateEventTrigger("EVENT_Anwesenheit_Person1", $Person1_Var, $_IPS['SELF'], 1);
CreateEventTrigger("EVENT_Anwesenheit_Person2", $Person2_Var, $_IPS['SELF'], 1);

// Anwesenheit TEST
$anwesenheit = 42064 /*[WORK\Test\Anwesenheit_TEST\Anwesenheit_TEST]*/;

// Telegram
$TelegramID = 22786 /*[Module\TelegramMessenger IPS]*/;
$UserID = 377280332;

// Je nach Anwesenheit-Abwesenheit wird die Anwesenheits-Variable auf die entsprechende Zahl gesetzt

if (($Person1 == true) AND ($Person2 == false)) {
    SetValue($anwesenheit, true);
}
if (($Person1 == false) AND ($Person2 == true)) {
    SetValue($anwesenheit, true);
}
if (($Person1 == true) AND ($Person2 == true)) {
    SetValue($anwesenheit, true);
}

// Die Variable $anwesenheit soll 60 Sekunden verzögert auf false gesetzt werden.
if (($_IPS['SENDER'] == "TimerEvent") and ($Person1 == false) AND ($Person2 == false)) {
	SetValue($anwesenheit, false);																		// Verzögerung von 60 Sekunden
	IPS_SetScriptTimer($_IPS['SELF'], 0);
}

if (($Person1 == false) AND ($Person2 == false)) {
	IPS_SetScriptTimer($_IPS['SELF'], 60); 
	Telegram_SendText($TelegramID, "Timer 60 Sek", $UserID, $ParseMode='HTML');
}

else {
	IPS_SetScriptTimer($_IPS['SELF'], 0);																// Timer beendet
	Telegram_SendText($TelegramID, "Timer beendet", $UserID, $ParseMode='HTML');
}



function CreateEventTrigger($EventName, $VarID, $ParentID, $EventTyp) {
    $eid = @IPS_GetEventIDByName($EventName, $ParentID);
    if (is_numeric($eid) == false) {
        $eid = IPS_CreateEvent(0);
        IPS_SetEventTrigger($eid, $EventTyp, $VarID);
        IPS_SetParent($eid, $ParentID);
        IPS_SetName($eid, $EventName);
        IPS_SetEventActive($eid, true);
    }
}

?>

Leider wird das Script nicht beendet. Es läuft die ganze Zeit weiter, wenn die Variable „Anwesenheit“ auf false gesetzt wird. Ist das evtl. normal …?

Habe mir über Telegram schon hilfen zukommen lassen, damit ich sehe welche Scriptzeile gerade ausgeführt wird.

Beste Grüße
Kai

Spontan und nur auf dem Handy überflogen ist mir aufgefallen das du einmal nen Kommentar „Findet beenden“ hast, in da aber nicht beendest (auf Null setzt)

Hallo Hagbard235,

also ich blick da nicht durch…
Kannst du das evtl. etwas genauer beschreiben?

Ich habe das Script nochmal geändert, hat aber auch nichts gebracht.

// Die Variable $anwesenheit soll 60 Sekunden verzögert auf false gesetzt werden.
if (($_IPS['SENDER'] == "TimerEvent") and ($Person1 == false) AND ($Person2 == false)) {
    SetValue($anwesenheit, false);                                                                        // Verzögerung von 60 Sekunden
    IPS_SetScriptTimer($_IPS['SELF'], 0);
}

if (($Person1 == false) AND ($Person2 == false)) {
    IPS_SetScriptTimer($_IPS['SELF'], 20); 
    Telegram_SendText($TelegramID, "Timer 60 Sek", $UserID, $ParseMode='HTML');
}

elseif (GetValue(42064 /*[WORK\Test\Anwesenheit_TEST\Anwesenheit_TEST]*/)) {
    IPS_SetScriptTimer($_IPS['SELF'], 0);                                                                // Timer beendet
    Telegram_SendText($TelegramID, "Timer beendet", $UserID, $ParseMode='HTML');
}

Beste Grüße
Kai

Edit:

Ich glaub ich habs!!!
„return“ war die Lösung.

// Die Variable $anwesenheit soll 60 Sekunden verzögert auf false gesetzt werden.
if (($_IPS['SENDER'] == "TimerEvent") and ($Person1 == false) AND ($Person2 == false)) {
    SetValue($anwesenheit, false);                                                                        // Verzögerung von 60 Sekunden
    IPS_SetScriptTimer($_IPS['SELF'], 0);
	return;
}

if (($Person1 == false) AND ($Person2 == false)) {
    IPS_SetScriptTimer($_IPS['SELF'], 20); 
    Telegram_SendText($TelegramID, "Timer 60 Sek", $UserID, $ParseMode='HTML');
}

else {
    IPS_SetScriptTimer($_IPS['SELF'], 0);                                                                // Timer beendet
    Telegram_SendText($TelegramID, "Timer beendet", $UserID, $ParseMode='HTML');
}

Besten Dank
Kai