TTS-Variable-ID $ECHO_TTS_VAR = [ 19581 => 12615, 21684 => 24064, 33538 => 56783, 34095 => 35822, ]; // === HILFSFUNKTIONEN === function resolveTargetEcho(int $ioId, array $allowed, int $fallback, int $lastEchoVar): int { // 1) Rohwert aus der Last-Activity-Variable holen $raw = 0; $rawStr = ''; if ($lastEchoVar > 0 && IPS_VariableExists($lastEchoVar)) { $val = GetValue($lastEchoVar); if (is_int($val)) { $raw = $val; } else { $rawStr = trim((string)$val); } } // 2) Wenn Integer und erlaubt → direkt nutzen if ($raw > 0 && in_array($raw, $allowed, true)) { echo "LastActivity liefert Echo-ID: $raw (direkt erlaubt)\n"; return $raw; } // 3) Falls String: versuche Namen gegen erlaubte Geräte zu matchen if ($rawStr !== '') { echo "LastActivity liefert Namen: \"$rawStr\" – versuche Match…\n"; foreach ($allowed as $eid) { $name = @IPS_GetName($eid); if ($name && (mb_strtolower($name,'UTF-8') === mb_strtolower($rawStr,'UTF-8'))) { echo "Namens-Match gefunden: \"$name\" → Echo-ID $eid\n"; return $eid; } } // fallback: enthält-Check (z. B. "Küche Echo Dot") foreach ($allowed as $eid) { $name = @IPS_GetName($eid); if ($name && (mb_stripos($name, $rawStr, 0, 'UTF-8') !== false || mb_stripos($rawStr, $name, 0, 'UTF-8') !== false)) { echo "Teil-Match gefunden: \"$rawStr\" ~ \"$name\" → Echo-ID $eid\n"; return $eid; } } } // 4) Falls IO-Kinder prüfen (optional – hier nicht zwingend nötig, da Whitelist da ist) // 5) Fallback aus Whitelist if (in_array($fallback, $allowed, true)) { echo "Kein LastActivity-Match – nutze Fallback $fallback\n"; return $fallback; } echo "Kein LastActivity-Match – nutze ersten erlaubten {$allowed[0]}\n"; return $allowed[0]; } function sayViaTTSMap(array $map, int $echoId, string $text): bool { if (!isset($map[$echoId])) { echo "FEHLER: Kein TTS-Var-Mapping für Echo $echoId.\n"; return false; } $ttsVar = $map[$echoId]; if (!IPS_VariableExists($ttsVar)) { echo "FEHLER: TTS-Variable $ttsVar existiert nicht.\n"; return false; } @RequestAction($ttsVar, $text); echo "Spreche auf: " . @IPS_GetName($echoId) . " (#$echoId), TTS-Var #$ttsVar\n"; return true; } // === CHECKS === if (count($ALLOWED_ECHOS) !== 4) { echo "FEHLER: Whitelist muss genau 4 Echo-IDs enthalten.\n"; return; } if (!IPS_VariableExists($TEXT_VAR_ID)) { echo "FEHLER: String $TEXT_VAR_ID (Auto) nicht gefunden.\n"; return; } $vi = IPS_GetVariable($TEXT_VAR_ID); if ($vi['VariableType'] !== 3) { echo "FEHLER: $TEXT_VAR_ID ist keine String-Variable.\n"; return; } // === TEXT HOLEN === $reply = (string) @GetValueString($TEXT_VAR_ID); if ($reply === '') { $reply = 'Ich konnte gerade keinen Lade-Status ermitteln.'; } // === ZIEL-ECHO BESTIMMEN === $targetEcho = resolveTargetEcho($ECHO_IO_ID, $ALLOWED_ECHOS, $FALLBACK_ECHO, $LAST_ECHO_VAR); // === SPRECHEN === sayViaTTSMap($ECHO_TTS_VAR, $targetEcho, $reply); // === DEBUG === echo "Antwort: $reply\n";