Gelöst: Saugroboter bei Abwesenheit per Skript starten lassen

Guten Morgen,
ich möchte per Skript gerne meine Saugroboter bei Abwesenheit starten lassen.
Das Skript hierzu sieht wie folgt aus:

<?php

// IDs definieren
$saugroboter1 = 47970; // Integer Variable Saugroboter1
$saugroboter2 = 38716; // Integer Variable Saugroboter2
$abwesenheit1 = 43397; // Boolean Variable Abwesenheit Simon
$abwesenheit2 = 32756; // Boolean Variable Abwesenheit Stefanie

// Tag ermitteln
$dayOfWeek = date('N'); // 1 (for Monday) through 7 (for Sunday)

// Prüfen, ob heute Montag, Mittwoch, Donnerstag ist
if ($dayOfWeek == 1 || $dayOfWeek == 3 || $dayOfWeek == 4) {
    // Prüfen, ob die Abwesenheit von Simon und Stefanie erfüllt ist
    if (GetValueBoolean($abwesenheit1) && GetValueBoolean($abwesenheit2)) {
        // Wait for 60 minutes
        IPS_Sleep(3600000); // 60 minutes in milliseconds

        // nochmals prüfen, ob beide immer noch abwesend sind
        if (GetValueBoolean($abwesenheit1) && GetValueBoolean($abwesenheit2)) {
            // Start Saugroboter1 and Saugroboter2 
            SetValueInteger($saugroboter1, 1); // Startbefehl Saugroboter1
            SetValueInteger($saugroboter2, 1); // Startbefehl Saugroboter2
        }
    }
}

?>

Ich bekomme aber irgendwie die korrekte Erkennung der Abwesenheit nicht hin.
Die Abwesenheit lese ich über das Unifi-Modul und demzufolge über die Handys aus:

Demzufolge ist abwesend = false

Das Skript habe ich mir mit ChatGPT erstellen lassen - ich frage mich jetzt, an welcher Stelle die Abwesenheit=false geprüft wird?
Ich hätte jetzt mit meinem laienhaften Verständnis erwartet, dass noch irgendwo auf „false“ abgefragt wird?
müsste es nicht korrekterweise heißen:

if (GetValueBoolean($abwesenheit1) == false && GetValueBoolean($abwesenheit2) == false) {

Kann mir netterweise jemand auf die Sprünge helfen?

PS:
das fertige und funktionierende Skript ist hier zu finden:

Spontan würde ich sagen das da ein ! Vor GetValueBoolean($abwesenheit1) fehlt. Du willst ja auf false prüfen.

Gruß Stephan

Hi,
oder wie er schrieb == false. Das ist das Problem wenn man abwesend so hat das es false ist wenn man abwesend ist. Ich hätte es nach den Namen auch so wie ChatGPT gemacht. Bei mir heißen die Variablen anwesend und da würde es passen.

Welchen Roboter hast Du denn? Oft muss es ein RequestAction sein.

Ralf

es sind zwei Xiaomi S12

<?php

// IDs definieren
$saugroboter1 = 47970; // Integer Variable Saugroboter1
$saugroboter2 = 38716; // Integer Variable Saugroboter2
$abwesenheit1 = 43397; // Boolean Variable Abwesenheit Simon
$abwesenheit2 = 32756; // Boolean Variable Abwesenheit Stefanie

// Tag ermitteln
$dayOfWeek = date('N'); // 1 (for Monday) through 7 (for Sunday)

// Prüfen, ob heute Montag, Mittwoch, Donnerstag ist
if ($dayOfWeek == 1 || $dayOfWeek == 3 || $dayOfWeek == 4) {

// Prüfen, ob die Abwesenheit von Simon und Stefanie erfüllt ist (Boolean=false)
if (GetValueBoolean($abwesenheit1) == false && GetValueBoolean($abwesenheit2) == false) {
        // 60 Minuten warten, damit nicht zwischendurch jemand zurückkommt oder man nur kurz einkaufen war
        IPS_Sleep(3600000); // 60 minutes in milliseconds

        // nochmals prüfen, ob beide immer noch abwesend sind
        if (GetValueBoolean($abwesenheit1) == false && GetValueBoolean($abwesenheit2) == false) {
            // Start Saugroboter1 and Saugroboter2 
            SetValueInteger($saugroboter1, 1); // Startbefehl Saugroboter1
            SetValueInteger($saugroboter2, 1); // Startbefehl Saugroboter2
        }
    }
}

?>

Code wäre dann so korrekt?

Nicht ganz,

if( (GetValueBoolean($abwesenheit1) == false) && (GetValueBoolean($abwesenheit2) == false)) {

Die Vergleiche gehören in Klammern.

Ralf

perfekt Danke!
jetzt mal abwarten, ob die Roboter Xiaomi S12 tatsächlich starten, oder ob ich den Startbefehl noch anpassen muss.

Simulier doch einfach mit einem Sript:

<?php
$saugroboter1 = 47970; // Integer Variable Saugroboter1
SetValueInteger($saugroboter1, 1); // Startbefehl Saugroboter1
?>

Ralf

okay ich musste es auf RequestAction ändern, aber nun funktioniert es wie gewünscht.

Muss jetzt nur noch ergänzen, dass wenn es einmal am Tag ausgeführt wurde, dass es dann erst am Folgetag wieder passiert :wink:
Sonst laufen die Roboter die ganze Zeit :smiley:

der fertige Code sieht dann wie folgt aus und funktioniert:

<?php

// IDs definieren
$saugroboter1 = 47970; // Integer Variable Saugroboter1
$saugroboter2 = 38716; // Integer Variable Saugroboter2
$abwesenheit1 = 43397; // Boolean Variable Abwesenheit Simon
$abwesenheit2 = 32756; // Boolean Variable Abwesenheit Stefanie
$lastRunID = 29795; // String Variable, die das Datum des letzten erfolgreichen Starts speichert

// Tag ermitteln
$dayOfWeek = date('N'); // 1 (for Monday) through 7 (for Sunday)
$today = date('Y-m-d'); // Heutiges Datum

// Letztes Ausführungsdatum ermitteln
$lastRunDate = GetValueString($lastRunID);

// Prüfen, ob heute Montag, Mittwoch, Donnerstag ist
if ($dayOfWeek == 1 || $dayOfWeek == 3 || $dayOfWeek == 4) {

    // Prüfen, ob das Skript heute bereits ausgeführt wurde
    if ($lastRunDate != $today) {
        
        // Prüfen, ob die Abwesenheit von Simon und Stefanie erfüllt ist (Boolean=false)
        if( (GetValueBoolean($abwesenheit1) == false) && (GetValueBoolean($abwesenheit2) == false)) {
            // 60 Minuten warten, damit nicht zwischendurch jemand zurückkommt oder man nur kurz einkaufen war
            IPS_Sleep(3600000); // 60 minutes in milliseconds

            // nochmals prüfen, ob beide immer noch abwesend sind
            if( (GetValueBoolean($abwesenheit1) == false) && (GetValueBoolean($abwesenheit2) == false)) {
                // Start Saugroboter1 und Saugroboter2 
                RequestAction($saugroboter1, 1); // Startbefehl Saugroboter1
                RequestAction($saugroboter2, 1); // Startbefehl Saugroboter2
                
                // Aktualisiere das letzte Ausführungsdatum
                SetValueString($lastRunID, $today);
            }
        }
    }
}

?>

Gratuliere. Ich habe mir von ChatGPT bei Python (Remote Two) auch schon öfter helfen lassen. Ist besser/schneller als per Google zu suchen :grinning: In Discord haben wir aber festgestellt man muss sehr genau fragen dann sind die Antworten ziemlich brauchbar.

Ralf

Danke!
Ich versuche auch immer sehr konkret vorzugeben was ich benötige.
so ganz ohne Fachexpertise geht es dann doch nicht (wie z.B. beim RequestAction) - aber für mich als absoluten Programmierlaien ist es echt hilfreich zumindest mal das grobe Gerüst zu bekommen :slight_smile:

Den Befehl IPS_Sleep(3600000); würde ich an deiner Stelle nicht verwenden.
So blockierst du dein Script für 60 Min.
Wenn du im Grunde mehre solche Scripte hast wird irgendwann kein Script mehr verarbeitet.
Ist hier beschrieben.

Benutz lieber gleich den ScriptTimer

Wie kann ich...? — IP-Symcon :: Automatisierungssoftwareaus_PHP_einen_Timer&_Variable_anlegen

Danke für den Hinweis - aktuell habe ich hier zum Glück noch keine Limitierung, passe mein Script aber gerne an.

wäre das folgende Coding dann korrekt:

<?php

// IDs definieren
$saugroboter1 = 47970; // Integer Variable Saugroboter1
$saugroboter2 = 38716; // Integer Variable Saugroboter2
$abwesenheit1 = 43397; // Boolean Variable Abwesenheit Simon
$abwesenheit2 = 32756; // Boolean Variable Abwesenheit Stefanie
$lastRunID = 29795; // String Variable, die das Datum des letzten erfolgreichen Starts speichert

// Tag ermitteln
$dayOfWeek = date('N'); // 1 (for Monday) through 7 (for Sunday)
$today = date('Y-m-d'); // Heutiges Datum

// Letztes Ausführungsdatum ermitteln
$lastRunDate = GetValueString($lastRunID);

// Timer-Event einrichten
if($_IPS['SENDER'] == "Execute") {
    $eventid = @IPS_GetEventIDByName("Timer", $_IPS['SELF']);
    if($eventid === false) {
        $eventid = IPS_CreateEvent(1); // Cyclic
        IPS_SetEventActive($eventid, true);
        IPS_SetName($eventid, "Timer");
        IPS_SetEventScript($eventid, $_IPS['SELF']);
        IPS_SetEventCyclic($eventid, 0, 0, 0, 0, 2, 1); // alle 1 Stunde
    }
    $variableid = @IPS_GetVariableIDByName("Daytime", $_IPS['SELF']);
    if($variableid === false) {
        $variableid = IPS_CreateVariable(1);
        IPS_SetName($variableid, "Daytime");
        IPS_SetParent($variableid, $_IPS['SELF']);
    }
}

SetValue(IPS_GetVariableIDByName("Daytime", $_IPS['SELF']), floor(date("H") / 6));

// Prüfen, ob heute Montag, Mittwoch oder Donnerstag ist
if ($dayOfWeek == 1 || $dayOfWeek == 3 || $dayOfWeek == 4) {

    // Prüfen, ob das Skript heute bereits ausgeführt wurde
    if ($lastRunDate != $today) {
        
        // Prüfen, ob die aktuelle Zeit zwischen 09:00 und 15:00 Uhr liegt
        $currentHour = date('H');
        if ($currentHour >= 9 && $currentHour < 15) {
            
            // Prüfen, ob die Abwesenheit von Simon und Stefanie erfüllt ist (Boolean=false)
            if (GetValueBoolean($abwesenheit1) == false && GetValueBoolean($abwesenheit2) == false) {
                // Timer für 60 Minuten setzen
                $waitEventId = @IPS_GetEventIDByName("WaitTimer", $_IPS['SELF']);
                if ($waitEventId === false) {
                    $waitEventId = IPS_CreateEvent(1); // Cyclic
                    IPS_SetEventActive($waitEventId, true);
                    IPS_SetName($waitEventId, "WaitTimer");
                    IPS_SetEventScript($waitEventId, $_IPS['SELF']);
                    IPS_SetEventCyclic($waitEventId, 0, 0, 0, 0, 2, 60); // alle 60 Minuten
                }

                if ($_IPS['SENDER'] == "TimerEvent" && IPS_GetName($_IPS['EVENT']) == "WaitTimer") {
                    // nochmals prüfen, ob beide immer noch abwesend sind
                    if (GetValueBoolean($abwesenheit1) == false && GetValueBoolean($abwesenheit2) == false) {
                        // Start Saugroboter1 und Saugroboter2 
                        RequestAction($saugroboter1, 1); // Startbefehl Saugroboter1
                        RequestAction($saugroboter2, 1); // Startbefehl Saugroboter2

                        // Aktualisiere das letzte Ausführungsdatum
                        SetValueString($lastRunID, $today);

                        // Warte-Timer deaktivieren
                        IPS_SetEventActive($waitEventId, false);
                    }
                }
            }
        }
    }
}

?>

So auf die schnelle würde ich sagen das es so etwas einfacher geht.

<?php

// IDs definieren
$saugroboter1 = 47970; // Integer Variable Saugroboter1
$saugroboter2 = 38716; // Integer Variable Saugroboter2
$abwesenheit1 = 43397; // Boolean Variable Abwesenheit Simon
$abwesenheit2 = 32756; // Boolean Variable Abwesenheit Stefanie
$lastRunID = 29795; // String Variable, die das Datum des letzten erfolgreichen Starts speichert

// Tag ermitteln
$dayOfWeek = date('N'); // 1 (for Monday) through 7 (for Sunday)
$today = date('Y-m-d'); // Heutiges Datum

// Letztes Ausführungsdatum ermitteln
$lastRunDate = GetValueString($lastRunID);


if($_IPS['SENDER'] == "TimerEvent")
{
    // nochmals prüfen, ob beide immer noch abwesend sind
    if( (GetValueBoolean($abwesenheit1) == false) && (GetValueBoolean($abwesenheit2) == false)) {
        // Start Saugroboter1 und Saugroboter2 
        RequestAction($saugroboter1, 1); // Startbefehl Saugroboter1
        RequestAction($saugroboter2, 1); // Startbefehl Saugroboter2
          
        // Aktualisiere das letzte Ausführungsdatum
        SetValueString($lastRunID, $today);
        }
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);

} else {
    // Prüfen, ob heute Montag, Mittwoch, Donnerstag ist
    if ($dayOfWeek == 1 || $dayOfWeek == 3 || $dayOfWeek == 4) {

    // Prüfen, ob das Skript heute bereits ausgeführt wurde
        if ($lastRunDate != $today) {
            
            // Prüfen, ob die Abwesenheit von Simon und Stefanie erfüllt ist (Boolean=false)
            if( (GetValueBoolean($abwesenheit1) == false) && (GetValueBoolean($abwesenheit2) == false)) {
            
            // 60 Minuten warten, damit nicht zwischendurch jemand zurückkommt oder man nur kurz einkaufen war
            IPS_SetScriptTimer($_IPS['SELF'], 3600);
            }
        }
    }
}

Danke!
ich hau das Skript mal in mein IPS und dann mal schauen ob die Roboter heute loslaufen :wink:

Guten Morgen,
der Start funktioniert schon mal, allerdings löst das Script in der jetzigen Form mehrfach am Tag aus und nicht nur einmalig.
Könntest du das Coding dahingehend bitte nochmals prüfen, dass es die Variable


prüft, ob am Tag bereits eine Ausführung erfolgt ist?
Danke!

Das kann eigentlich vom Script her nicht passieren.

Ich habe es mal so getestet. Mit 15 sec.

Ich kann das Script einmal ausführen.
Danach wird der Timer nicht mehr gesetzt da ja das Datum das gleiche ist.

Hast du evtl. noch ein anders Script welches die Roboter Startet.
Wie wir das Script ausgelöst?

<?php

// IDs definieren
//$saugroboter1 = 47970; // Integer Variable Saugroboter1
//$saugroboter2 = 38716; // Integer Variable Saugroboter2
$abwesenheit1 = false; // Boolean Variable Abwesenheit Simon
$abwesenheit2 = false; // Boolean Variable Abwesenheit Stefanie
$lastRunID = 10678; // String Variable, die das Datum des letzten erfolgreichen Starts speichert

// Tag ermitteln
$dayOfWeek = date('N'); // 1 (for Monday) through 7 (for Sunday)
$today = date('Y-m-d'); // Heutiges Datum

// Letztes Ausführungsdatum ermitteln
$lastRunDate = GetValueString($lastRunID);

echo "Robo Script - start";
echo "\n";
echo "Heutiges Datum ".$today;
echo "\n";

if($_IPS['SENDER'] == "TimerEvent")
{
    // nochmals prüfen, ob beide immer noch abwesend sind
    if( (($abwesenheit1) == false) && (($abwesenheit2) == false)) {
        // Start Saugroboter1 und Saugroboter2 
        //RequestAction($saugroboter1, 1); // Startbefehl Saugroboter1
        //RequestAction($saugroboter2, 1); // Startbefehl Saugroboter2
        echo "Robo Script - Starte Saugroboter";
        echo "\n";  

        // Aktualisiere das letzte Ausführungsdatum
        SetValueString($lastRunID, $today);
        }
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);

} else {
    // Prüfen, ob heute Montag, Mittwoch, Donnerstag ist
    if ($dayOfWeek == 1 || $dayOfWeek == 3 || $dayOfWeek == 4) {
        echo "Robo Script - Prüfe auf Tag";
        echo "\n";
    // Prüfen, ob das Skript heute bereits ausgeführt wurde
        echo "Letze Ausführung Datum ".$lastRunDate;
        echo "\n";
        if ($lastRunDate != $today) {
        echo "Robo Script - Prüfe ob Script diesen Tag bereits ausgeführt wurde"; 
        echo "\n";   
            // Prüfen, ob die Abwesenheit von Simon und Stefanie erfüllt ist (Boolean=false)
            if( (($abwesenheit1) == false) && (($abwesenheit2) == false)) {
            echo "Robo Script - Prüfe auf Abwesenheit";
            echo "\n";
            // 60 Minuten warten, damit nicht zwischendurch jemand zurückkommt oder man nur kurz einkaufen war
            //IPS_SetScriptTimer($_IPS['SELF'], 3600);
            IPS_SetScriptTimer($_IPS['SELF'], 15);
            }
        }
    }
}

nein, die Roboter werden definitiv nur von diesem Skript getriggert.

Hier mal die relevanten Objekte:

die Schnellausführung ist noch vom Testen und kann ignoriert werden, da hier keine Trigger hinterlegt sind.

Ich habe dein Coding jetzt nochmals übernommen und auf mich angepasst, bzw, ein Teil der Auskommentierungen von dir wieder raus genommen:

<?php

// IDs definieren
$saugroboter1 = 47970; // Integer Variable Saugroboter1
$saugroboter2 = 38716; // Integer Variable Saugroboter2
$abwesenheit1 = 43397; // Boolean Variable Abwesenheit Simon
$abwesenheit2 = 32756; // Boolean Variable Abwesenheit Stefanie
$lastRunID = 29795; // String Variable, die das Datum des letzten erfolgreichen Starts speichert


// Tag ermitteln
$dayOfWeek = date('N'); // 1 (for Monday) through 7 (for Sunday)
$today = date('Y-m-d'); // Heutiges Datum

// Letztes Ausführungsdatum ermitteln
$lastRunDate = GetValueString($lastRunID);

echo "Robo Script - start";
echo "\n";
echo "Heutiges Datum ".$today;
echo "\n";

if($_IPS['SENDER'] == "TimerEvent")
{
    // nochmals prüfen, ob beide immer noch abwesend sind
    if( (($abwesenheit1) == false) && (($abwesenheit2) == false)) {
        // Start Saugroboter1 und Saugroboter2 
        RequestAction($saugroboter1, 1); // Startbefehl Saugroboter1
        RequestAction($saugroboter2, 1); // Startbefehl Saugroboter2
        echo "Robo Script - Starte Saugroboter";
        echo "\n";  

        // Aktualisiere das letzte Ausführungsdatum
        SetValueString($lastRunID, $today);
        }
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);

} else {
    // Prüfen, ob heute Montag, Mittwoch, Donnerstag ist
    if ($dayOfWeek == 1 || $dayOfWeek == 3 || $dayOfWeek == 4) {
        echo "Robo Script - Prüfe auf Tag";
        echo "\n";
    // Prüfen, ob das Skript heute bereits ausgeführt wurde
        echo "Letze Ausführung Datum ".$lastRunDate;
        echo "\n";
        if ($lastRunDate != $today) {
        echo "Robo Script - Prüfe ob Script diesen Tag bereits ausgeführt wurde"; 
        echo "\n";   
            // Prüfen, ob die Abwesenheit von Simon und Stefanie erfüllt ist (Boolean=false)
            if( (($abwesenheit1) == false) && (($abwesenheit2) == false)) {
            echo "Robo Script - Prüfe auf Abwesenheit";
            echo "\n";
            // 60 Minuten warten, damit nicht zwischendurch jemand zurückkommt oder man nur kurz einkaufen war
            IPS_SetScriptTimer($_IPS['SELF'], 3600);
            }
        }
    }
}

?>

beim manuellen Ausführen erhalten ich folgende Ausgabe:

Robo Script - start
Heutiges Datum 2024-06-14