Hallo Burkhard,
Etwas eleganter ist es, ihm in einem Auftrag die zu reinigenden Räume mitzugeben.
Genau das macht das Script…
Aber teste es einfach mal. Vielleicht hast du ja weitere Ideen.
Ich nutze es mit einem Roborock S50.
Die auskommentierten Zeilen so lassen oder löschen, weil ich darüber andere Scripte eingebunden habe.
<?php
################################################################################
# Scriptbezeichnung: Roborock_Multiroom.ips.php
# Version: 1.0.20201212
# Author: Oliver Vogt (Housmann) & Kai Marleaux (Karlinho)
#
# Beschreibung
# =========================
#
# Mit diesem Skript lässt sich die Reinigung der einzelnen Räume einstellen.
# Automatik via ScriptTimer
# oder Manuell die Räume auswählen und über die Varaibale Starten, die Reinigung ausführen.
#
# Installation:
# -------------
#
# Dieses Skript richtet automatisch alle nötigen Objekte bei manueller
# Ausführung auf der Console ein.
#
# - Kategorie erstellen
# - Neues Skript erstellen
# - Diesen PHP-Code hineinkopieren
# - Abschnitt 'Konfiguration' den eigenen Gegebenheiten anpassen
# - Skript Abspeichern und Ausführen
#
# --------------------------- Globale Funktionen -------------------------------
# Include Skripte
#include ("function_IPS_SetScriptFile.ips.php");
#include ("include_IPS_SendToNotifyBoard.ips.php");
#
# ------------------------------ Konfiguration ---------------------------------
$DateiName = "Roborock_Multiroom";
#
# ObjektID vom Roborock Modul eintragen
$ModulID = 55615;
#
# Räume anlegen (Zonen aus dem Roborock Modul)
$Raeume_Array = array(
"Badezimmer"
,"Büro"
,"Diele"
,"Küche"
,"Schlafzimmer"
,"Wohnküche"
);
#
# Status Zähler wegen doppelter Push-Nachricht Reinigunf
$VAR_Zähler = 42189;
#
# Timer Event anlegen
$NameEvent = "Täglich";
$Datumstyp = 2; // 0 = Kein Datumstyp / 1 = Einmalig / 2 = Täglich / 3 = Wöchentlich / 4 = Monatlich / 5 = Jährlich
$Datumsintervall = 1; // 0 = Keine Auswertung / 1 = Jeden Tag / 2 = Alle X Tage / 3 = Alle X Wochen / 4 = Alle X Monate / 5 = 1 = Januar … 12 = Dezember
$Datumstage = 0; // 0 = Keine Auswertung / 1 = Montag / 2 = Dienstag / 4 = Mittwoch / 8 = Donnerstag / 16 = Freitag / 32 = Samstag / 64 = Sonntag
$Zeittyp = 0; // 0 = Einmalig / 1 = sekündlich / 2 = minütlich / 3 = stündlich
$Zeitintervall = 0; // Alle X Sekunden / Minuten / Stunden
$StartStunde = 11; // Startzeit Stunde
$StartMinute = 0; // Startzeit Minute
$StartSekunde = 0; // Startzeit Sekunde
#
################################################################################
# ------------------------- Ab hier nichts mehr ändern -------------------------
$ScriptID = $_IPS['SELF'];
$ParentID = IPS_GetParent($ScriptID);
# Aktionsskript anlegen
$ActionScriptID = CreateActionScript($ScriptID);
#SetActionScriptFile ($ActionScriptID, "Aktionsskript_$ActionScriptID");
$Raum_IDs = array();
$Array_Multizone = array();
$Array_Zimmerreinigung = array();
if ($_IPS['SENDER'] == 'Execute') {
#SetScriptFile ($ScriptID, $DateiName);
IPS_SetHidden($ScriptID, true);
foreach ($Raeume_Array as $Raum) {
$Raum_ID = CreateInstance($Raum, $ParentID);
$Raum_IDs[] = $Raum_ID;
for ($i =3; $i <= 9; $i++) {
$WD = "";
if ($i == 3) {
$WD = "Montag";
}
elseif ($i == 4) {
$WD = "Dienstag";
}
elseif ($i == 5) {
$WD = "Mittwoch";
}
elseif ($i == 6) {
$WD = "Donnerstag";
}
elseif ($i == 7) {
$WD = "Freitag";
}
elseif ($i == 8) {
$WD = "Samstag";
}
elseif ($i == 9) {
$WD = "Sonntag";
}
# Variable anlegen
$VAR_Manuell = CreateVariable($Raum_ID, "Manuelle Reinigung", 0, "", "", 0, false);
CreateVariableProfileBooleanManu($VAR_Manuell, "Roborock.Manuell");
$VAR_Automatik = CreateVariable($Raum_ID, "Automatische Reinigung", 0, "", "", 1, false);
CreateVariableProfileBooleanAuto($VAR_Automatik, "Roborock.Automatik");
$VAR_Anzahl = CreateVariable($Raum_ID, "Anzahl Reinigungen", 1, "", "", 2, false);
CreateVariableProfileInteger($VAR_Anzahl, "Roborock.Anzahl", "Execute", "", "", 1, 5, 1);
$VAR_Wochentag = CreateVariable($Raum_ID, $WD, 0, "", "", $i, false);
CreateVariableProfileBooleanDay($VAR_Wochentag, "Roborock.Wochentag");
# Aktionsskript zuweisen
IPS_SetVariableCustomAction($VAR_Anzahl, $ActionScriptID);
IPS_SetVariableCustomAction($VAR_Manuell, $ActionScriptID);
IPS_SetVariableCustomAction($VAR_Automatik, $ActionScriptID);
IPS_SetVariableCustomAction($VAR_Wochentag, $ActionScriptID);
# Anzahl Reinigung beim erstellen auf 1 setzen
$ID_Anzahl_Reinigung = IPS_GetObjectIDByName("Anzahl Reinigungen", $Raum_ID);
$Anzahl_Reinigung = GetValue($ID_Anzahl_Reinigung);
if ($Anzahl_Reinigung == 0) {
SetValue($ID_Anzahl_Reinigung, 1);
}
}
}
# Variable anlegen
$VAR_Starten = CreateVariable ($ScriptID, "Starten", 1, "", "", 0, false);
CreateVariableProfileIntegerStart($VAR_Starten, "IPS.Starten");
CreateEventTriggerValue($VAR_Starten, "EventTrigger_Starten", 4, 1);
IPS_SetVariableCustomAction($VAR_Starten, $ActionScriptID);
# Events anlegen
$VAR_Roborock_Status = IPS_GetObjectIDByName("Status", $ModulID);
CreateEventTriggerValue($VAR_Roborock_Status, "EventTrigger_Roborock_Status", 4, 100);
# Timer Event anlegen
CreateEventTimer($_IPS['SELF'], $NameEvent, $Datumstyp, $Datumsintervall, $Datumstage, $Zeittyp, $Zeitintervall, $StartStunde, $StartMinute, $StartSekunde);
}
########################
# Automatische Reinigung
elseif ($_IPS['SENDER'] == 'TimerEvent') {
# Wochentag
$Wochentage = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
$Wochentag_Heute = time();
$Tag = $Wochentage[date("w",$Wochentag_Heute)];
$ParentIds = IPS_GetChildrenIds(IPS_GetParent($_IPS['SELF']));
foreach ($ParentIds as $ParentID) {
if ($ParentID <> $_IPS['SELF']) {
$Children_IDs = IPS_GetChildrenIds($ParentID);
$ID_Roborock_Auto = IPS_GetObjectIDByName("Automatische Reinigung", $ParentID);
foreach ($Children_IDs as $Children_ID) {
switch (IPS_GetName($Children_ID)) {
case "Anzahl Reinigungen":
$Anzahl_Reinigung = GetValue($Children_ID);
break;
case $Tag:
if (GetValue($ID_Roborock_Auto)) {
if (GetValue($Children_ID)) {
$Raumname = IPS_GetName($ParentID);
$Raum_Koordinaten = Roborock_GetZoneCoordinatesByName($ModulID, $Raumname);
$Array_Multizone[] = [$Raum_Koordinaten, $Anzahl_Reinigung];
$Array_Zimmerreinigung[] = $Raumname;
}
}
break;
}
}
}
}
# Startet die Reinigung
$Multizone = json_encode($Array_Multizone);
Roborock_ZoneCleanMultiName($ModulID, $Multizone);
# Push-Nachricht
asort($Array_Zimmerreinigung);
$count_Raumname = count($Array_Zimmerreinigung);
$Zimmerreinigung = implode(", ", $Array_Zimmerreinigung);
if (!empty($Zimmerreinigung)) {
# Push-Nachricht
#$Message = "<b>Roborock S50 Automatische Reinigung...</b>
".$Zimmerreinigung;
#SendToNotifyBoard("Xiaomi", $Message, "information", "Robot", "Xiaomi", "1", "stumm");
SetValue($VAR_Zähler, 1);
}
}
####################
# Manuelle Reinigung
elseif ($_IPS['SENDER'] == 'Variable') {
$ParentIds = IPS_GetChildrenIds(IPS_GetParent($_IPS['SELF']));
if ($_IPS['EVENT'] == IPS_GetObjectIDByName("EventTrigger_Roborock_Status", $ScriptID)) {
foreach ($ParentIds as $ParentID) {
if ($ParentID <> $_IPS['SELF']) {
$Children_IDs = IPS_GetChildrenIds($ParentID);
foreach ($Children_IDs as $Children_ID) {
switch (IPS_GetName($Children_ID)) {
case "Manuelle Reinigung":
if (GetValue($Children_ID) == 1) {
SetValue($Children_ID, false);
SetValue($VAR_Zähler, 0);
}
break;
}
}
}
}
}
else {
$VAR_Starten = IPS_GetObjectIDByName("Starten", $ScriptID);
foreach ($ParentIds as $ParentID) {
if ($ParentID <> $_IPS['SELF']) {
$Children_IDs = IPS_GetChildrenIds($ParentID);
foreach ($Children_IDs as $Children_ID) {
switch (IPS_GetName($Children_ID)) {
case "Anzahl Reinigungen":
$Anzahl_Reinigung = GetValue($Children_ID);
break;
case "Manuelle Reinigung":
if (GetValue($Children_ID) == 1) {
$Raumname = IPS_GetName($ParentID);
$Raum_Koordinaten = Roborock_GetZoneCoordinatesByName($ModulID, $Raumname);
$Anzahl_Reinigung = GetValue(IPS_GetObjectIDByName("Anzahl Reinigungen", $ParentID));
$Array_Zone[] = [$Raum_Koordinaten, $Anzahl_Reinigung];
$Array_Zimmerreinigung[] = $Raumname;
}
break;
}
}
}
}
# Startet die Reinigung
$Zone = json_encode($Array_Zone);
Roborock_ZoneCleanMultiName($ModulID, $Zone);
IPS_Sleep(500);
SetValue($VAR_Starten, 0);
asort($Array_Zimmerreinigung);
$count_Raumname = count($Array_Zimmerreinigung);
$Zimmerreinigung = implode(", ", $Array_Zimmerreinigung);
# Push-Nachricht
#$Message = "<b>Roborock S50 Manuelle Reinigung...</b>
".$Zimmerreinigung;
#SendToNotifyBoard("Xiaomi", $Message, "information", "Robot", "Xiaomi", "1", "stumm");
SetValue($VAR_Zähler, 1);
}
}
#
# IPS_LogMessage
IPS_LogMessage(IPS_GetName($_IPS["SELF"]), "Skript -- " .IPS_GetName($_IPS["SELF"]) ." -- ausgeführt!");
################################################################################
# -------------------------------- FUNKTIONEN ----------------------------------
# Variable mit Logging
function CreateVariable($ParentID, $VarName, $VarTyp, $VarProfile = "", $VarActionScript = "", $Position = 0, $VarLog) {
$VarID = @IPS_GetVariableIDByName($VarName, $ParentID);
if($VarID === false) {
$VarID = IPS_CreateVariable($VarTyp);
IPS_SetParent($VarID, $ParentID);
IPS_SetName($VarID, $VarName);
IPS_SetPosition($VarID, $Position);
IPS_SetInfo($VarID, $_IPS["SELF"]);
if ($VarLog == true) {
$ArchiveID = IPS_GetInstanceListByModuleID ("{43192F0B-135B-4CE7-A0A7-1475603F3060}")[0];
AC_SetLoggingStatus($ArchiveID, $VarID, $VarLog);
IPS_ApplyChanges($ArchiveID);
}
if($VarProfile !== "") {
IPS_SetVariableCustomProfile($VarID, $VarProfile);
}
if($VarActionScript !== "") {
IPS_SetVariableCustomAction($VarID, $VarActionScript);
}
}
return $VarID;
}
# ------------------------------------------------------------------------------
# Variablen Profil Integer
function CreateVariableProfileInteger ($VarID, $ProfileName, $ProfileIcon, $ProfilePrefix, $ProfileSuffix, $ProfileMinValue, $ProfileMaxValue, $ProfileStepSize) {
if(!IPS_VariableProfileExists($ProfileName)) {
IPS_CreateVariableProfile($ProfileName, 1); // Variablen Typ Integer
}
else {
$Profile = IPS_GetVariableProfile($ProfileName);
if($Profile['ProfileType'] != 1)
throw new Exception("Variable profile type does not match for profile ".$ProfileName);
}
IPS_SetVariableProfileIcon($ProfileName, $ProfileIcon); // Icon
IPS_SetVariableProfileText($ProfileName, $ProfilePrefix, $ProfileSuffix); // Präfix, Suffix
IPS_SetVariableProfileValues($ProfileName, $ProfileMinValue, $ProfileMaxValue, $ProfileStepSize); // MinimalWert, MaximalWert, Schrittweite
IPS_SetVariableCustomProfile ($VarID, $ProfileName);
}
# ------------------------------------------------------------------------------
# Variablen Profil Integer
function CreateVariableProfileIntegerStart ($VarID, $ProfileName) {
# VariablenProfile vorher löschen
@IPS_DeleteVariableProfile ($ProfileName);
if (IPS_VariableProfileExists ($ProfileName) === false) {
IPS_CreateVariableProfile ($ProfileName, 1); // Variablen Typ Integer
IPS_SetVariableProfileAssociation($ProfileName, 0, ">", "", -1); // Wert, Name, Icon, Farbe
IPS_SetVariableProfileAssociation($ProfileName, 1, "Starten", "", 0x64FF64);
IPS_SetVariableProfileIcon($ProfileName, "Script"); // Icon
}
IPS_SetVariableCustomProfile ($VarID, $ProfileName);
}
# ------------------------------------------------------------------------------,
# Variablen Profile Boolean
function CreateVariableProfileBooleanManu ($VarID, $ProfileName) {
if (IPS_VariableProfileExists ($ProfileName) === false) {
IPS_CreateVariableProfile ($ProfileName, 0); // Variablen Typ Boolean
IPS_SetVariableProfileAssociation($ProfileName, 0, ">", "", 0xFF6464); // Wert, Name, Icon, Farbe
IPS_SetVariableProfileAssociation($ProfileName, 1, "Aktiviert", "", 0x64FF64);
IPS_SetVariableProfileIcon($ProfileName, "HouseRemote"); // Icon
}
IPS_SetVariableCustomProfile ($VarID, $ProfileName);
}
# ------------------------------------------------------------------------------
# Variablen Profile Boolean
function CreateVariableProfileBooleanAuto ($VarID, $ProfileName) {
if (IPS_VariableProfileExists ($ProfileName) === false) {
IPS_CreateVariableProfile ($ProfileName, 0); // Variablen Typ Boolean
IPS_SetVariableProfileAssociation($ProfileName, 0, "Deaktiviert", "", 0xFF6464); // Wert, Name, Icon, Farbe
IPS_SetVariableProfileAssociation($ProfileName, 1, "Aktiviert", "", 0x64FF64);
IPS_SetVariableProfileIcon($ProfileName, "HouseRemote"); // Icon
}
IPS_SetVariableCustomProfile ($VarID, $ProfileName);
}
# ------------------------------------------------------------------------------
# Variablen Profile Boolean
function CreateVariableProfileBooleanDay ($VarID, $ProfileName) {
if (IPS_VariableProfileExists ($ProfileName) === false) {
IPS_CreateVariableProfile ($ProfileName, 0); // Variablen Typ Boolean
IPS_SetVariableProfileAssociation($ProfileName, 0, "Deaktiviert", "", 0xFF6464); // Wert, Name, Icon, Farbe
IPS_SetVariableProfileAssociation($ProfileName, 1, "Aktiviert", "", 0x64FF64);
IPS_SetVariableProfileIcon($ProfileName, "Ok"); // Icon
}
IPS_SetVariableCustomProfile ($VarID, $ProfileName);
}
# ------------------------------------------------------------------------------
# Actionsskript anlegen
function CreateActionScript($ParentID) {
$Script = '<?php if ($_IPS[\'SENDER\'] == \'WebFront\') {SetValue($_IPS[\'VARIABLE\'], $_IPS[\'VALUE\']);}elseif ($_IPS["SENDER"] == "VoiceControl") {SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);}?>';
$ID_Aktionsskript = @IPS_GetScriptIDByName ( "Aktionsskript", $ParentID );
if ($ID_Aktionsskript === false) {
$NewScriptID = IPS_CreateScript ( 0 );
IPS_SetParent($NewScriptID, $ParentID);
IPS_SetName($NewScriptID, "Aktionsskript");
IPS_SetScriptContent($NewScriptID, $Script);
$ID_Aktionsskript = $NewScriptID;
#IPS_SetVariableCustomAction($ParentID, $ID_Aktionsskript);
IPS_SetHidden ($ID_Aktionsskript, true);
}
return $ID_Aktionsskript;
}
# ------------------------------------------------------------------------------
# Timer Event anlegen
function CreateEventTimer($ParentID, $NameEvent, $Datumstyp, $Datumsintervall, $Datumstage, $Zeittyp, $Zeitintervall, $StartStunde, $StartMinute, $StartSekunde) {
$EventId = @IPS_GetEventIDByName($NameEvent, $ParentID);
if ($EventId === false) {
$EventId = IPS_CreateEvent(1);
IPS_SetParent($EventId, $ParentID);
IPS_SetName($EventId, $NameEvent);
IPS_SetIdent($EventId, str_replace("-","",str_replace("ö","oe",str_replace("ü","ue",str_replace("ä","ae",str_replace(" ","",$NameEvent))))));
IPS_SetEventCyclic ($EventId, $Datumstyp, $Datumsintervall, $Datumstage, 0, $Zeittyp, $Zeitintervall);
IPS_SetEventCyclicTimeFrom($EventId, $StartStunde, $StartMinute, $StartSekunde);
IPS_SetEventActive($EventId, true);
}
return $EventId;
}
# ------------------------------------------------------------------------------
# EventTriggerValue
function CreateEventTriggerValue ($VarID, $EventName, $EventTyp, $EventValue) {
$ParentID = $_IPS['SELF'];
$EventId = @IPS_GetEventIDByName($EventName, $ParentID);
if (is_numeric($EventId) == false) {
$EventId = IPS_CreateEvent(0);
IPS_SetEventTrigger($EventId, $EventTyp, $VarID);
IPS_SetEventTriggerValue($EventId, $EventValue);
IPS_SetParent($EventId, $ParentID);
IPS_SetName($EventId, $EventName);
IPS_SetEventActive($EventId, true);
IPS_SetEventTriggerSubsequentExecution($EventId, false);
}
}
# ------------------------------------------------------------------------------
# Instanz erstellen
function CreateInstance ($InstanzName, $ParentID) {
$VarID = @IPS_GetInstanceIDByName ($InstanzName, $ParentID);
if ($VarID === false) {
$VarID = @IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
IPS_SetParent($VarID, $ParentID);
IPS_SetName($VarID, $InstanzName);
#IPS_SetPosition($VarID, $Position); // CreateInstance ($InstanzName, $ParentID, $Position)
}
return $VarID;
}
# ------------------------------------------------------------------------------
$Raeume_Array
Automatische Reinigung
Wochentag, Anzahl der Reinigungen / Raum und den Timer einstellen.
Wenn Variable Automatische Reinigung auf Aktiviert steht, werden die eingestellten Räume nach der Reihe angefahren.
Manuelle Reinigung
Räume (Variable Manuelle Reinigung) aktivieren und Starten…
Bei Fragen einfach melden.
Beste Grüße
Kai