Folgendes Script erstellt für die Visualisierung von Sonos in NEO automatisch Scripte.
Grundvoraussetzung:
- IP Symcon in Version 4
- SonosSymcon PHP Modul für IP-Symcon 4 installiert
https://github.com/tkugelberg/SymconSonos
- Für die Visualisierung in NEO das IP-Symcon Plugin von Mediola für NEO
Bevor das Script ausgeführt wird ist eine Kategorie in IP-Symcon anzulegen unter der dann die Scripte angelegt werden. Die ObjectID der Kategorie ich am Anfang des Scriptes zu ergänzen. dann einfach Inhalt in IP-Symcon kopieren und ausführen.
Code: Alles auswählen
<?
//Konfig
// Angabe des ObjectID der Kategorie unter der die Scripte und Variablen angelegt werden sollen
$KatID = 13456 /*[Geräte\Heimkino\Audio\Sonos\Sonos Erweiterte Variablen]*/;
//Variable für Slideranzeige des Fortschritts anlegen true für setzten der Variable / false wenn diese nicht gesetzt werden soll
$visiblePosition = true;
//-----------------------
$InstanzenListe = IPS_GetInstanceListByModuleID("{F6F3A773-F685-4FD2-805E-83FD99407EE8}");
$InstanzCount = 0;
foreach ($InstanzenListe as $InstanzID) {
createMuteScript($InstanzID, $KatID);
createLoudnessScript($InstanzID, $KatID);
createCrossfadeScript($InstanzID, $KatID);
createPlayPauseScript($InstanzID, $KatID);
createIncreaseVolScript($InstanzID, $KatID);
createDecreaseVolScript($InstanzID, $KatID);
createPositionVar($InstanzID, $KatID);
if ($visiblePosition == True)
{
}
$InstanzCount++;
$Childs[] = IPS_GetChildrenIDs($InstanzID);
}
$Variablen = flatten($Childs);
$Variablen = count(array_unique($Variablen));
echo "Es wurden $InstanzCount Sonos Instanzen gefunden!\n";
echo "Es wurden $Variablen Variablen in den Sonos Instanzen gefunden!\n";
function flatten(array $array) {
$return = array();
array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
return $return;
}
function createMuteScript($InstanzID, $KatID)
{
$name = IPS_GetName($InstanzID)." Mute Toggle";
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $name);
IPS_SetParent($ScriptID, $KatID);
$content = '
<?
$InstanceID = '.$InstanzID.';
$MuteID = @IPS_GetVariableIDByName("Mute", $InstanceID);
$status = GetValueFormatted($MuteID); // Status des Geräts auslesen
IPS_LogMessage( "'.$name.' Mute:" , "Mute $status ausführen" );
if ($status == "Off")// Befehl ausführen
{
SNS_SetMute($InstanceID, true);
}
elseif ($status == "On")// Befehl ausführen
{
SNS_SetMute($InstanceID, false);
}
?>';
IPS_SetScriptContent($ScriptID, $content);
}
function createPlayPauseScript($InstanzID, $KatID)
{
$name = IPS_GetName($InstanzID)." Play Pause Toggle";
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $name);
IPS_SetParent($ScriptID, $KatID);
$content = '
<?
$InstanceID = '.$InstanzID.';
$StatusID = @IPS_GetVariableIDByName("Status", $InstanceID);
$status = GetValueFormatted($StatusID); // Status des Geräts auslesen
var_dump($status);
if ($status == "Stop" || $status == "Pause")// Play ausführen
{
SNS_Play($InstanceID);
IPS_LogMessage( "'.$name.' Play /Pause Toggle:" , "Play ausführen" );
}
elseif ($status == "Play")// Pause ausführen
{
SNS_Pause($InstanceID);
IPS_LogMessage( "'.$name.' Play /Pause Toggle:" , "Pause ausführen" );
}
?>';
IPS_SetScriptContent($ScriptID, $content);
}
function createIncreaseVolScript($InstanzID, $KatID)
{
$name = IPS_GetName($InstanzID)." Volume plus";
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $name);
IPS_SetParent($ScriptID, $KatID);
$content = '
<?
$InstanceID = '.$InstanzID.';
$increment = 5; // Lautstärke jeweils um 5 erhöhen
$VolumeID = @IPS_GetVariableIDByName("Volume", $InstanceID);
$volume = GetValue($VolumeID); // Volume des Geräts auslesen
if ($volume == 100)// nichts tun
{
// Volume is max
}
else // Volume erhöhen
{
SNS_ChangeVolume($InstanceID, $increment);
$newvolume = $volume + $increment;
IPS_LogMessage( "'.$name.'" , "Set Volume to ".$newvolume." %" );
}
?>';
IPS_SetScriptContent($ScriptID, $content);
}
function createDecreaseVolScript($InstanzID, $KatID)
{
$name = IPS_GetName($InstanzID)." Volume minus";
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $name);
IPS_SetParent($ScriptID, $KatID);
$content = '
<?
$InstanceID = '.$InstanzID.';
$increment = -5; // Lautstärke jeweils um 5 erniedrigen
$VolumeID = @IPS_GetVariableIDByName("Volume", $InstanceID);
$volume = GetValue($VolumeID); // Volume des Geräts auslesen
if ($volume == 0)// nichts tun
{
// Volume is min
}
else // Volume erniedrigen
{
SNS_ChangeVolume($InstanceID, $increment);
$newvolume = $volume - $increment;
IPS_LogMessage( "'.$name.'" , "Set Volume to ".$newvolume." %" );
}
?>';
IPS_SetScriptContent($ScriptID, $content);
}
function createLoudnessScript($InstanzID, $KatID)
{
$name = IPS_GetName($InstanzID)." Loudness Toggle";
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $name);
IPS_SetParent($ScriptID, $KatID);
$content = '
<?
$$InstanceID = '.$InstanzID.';
$LoudnessID = @IPS_GetVariableIDByName("Loudness", $InstanceID);
$status = GetValueFormatted($LoudnessID); // Status des Geräts auslesen
IPS_LogMessage( "'.$name.' Mute:" , "Mute $status ausführen" );
if ($status == "Off")// Befehl ausführen
{
SNS_SetLoudness($InstanceID, true);
}
elseif ($status == "On")// Befehl ausführen
{
SNS_SetLoudness($InstanceID, false);
}
?>';
IPS_SetScriptContent($ScriptID, $content);
}
function createCrossfadeScript($InstanzID, $KatID)
{
$name = IPS_GetName($InstanzID)." Crossfade Toggle";
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $name);
IPS_SetParent($ScriptID, $KatID);
$content = '
<?
$$InstanceID = '.$InstanzID.';
$CrossfadeID = @IPS_GetVariableIDByName("Crossfade", $InstanceID);
$status = GetValueFormatted($CrossfadeID); // Status des Geräts auslesen
IPS_LogMessage( "'.$name.' Mute:" , "Mute $status ausführen" );
if ($status == "Off")// Befehl ausführen
{
SNS_SetCrossfade($InstanceID, true);
}
elseif ($status == "On")// Befehl ausführen
{
SNS_SetCrossfade($InstanceID, false);
}
?>';
IPS_SetScriptContent($ScriptID, $content);
}
function createPositionVar($InstanzID, $KatID)
{
$Icon = "Move";
$ProfilName = "SONOS.PositionP";
$Name = IPS_GetName($InstanzID);
RegisterProfileInteger($ProfilName, $Icon, "", " %", 0, 100, 1, 0);
CreateProfileP( $Name, $ProfilName, $KatID);
}
function RegisterProfileInteger($Name, $Icon, $Prefix, $Suffix, $MinValue, $MaxValue, $StepSize, $Digits)
{
if(!IPS_VariableProfileExists($Name)) {
IPS_CreateVariableProfile($Name, 1);
} else {
$profile = IPS_GetVariableProfile($Name);
if($profile['ProfileType'] != 1)
throw new Exception("Variable profile type does not match for profile ".$Name);
}
IPS_SetVariableProfileIcon($Name, $Icon);
IPS_SetVariableProfileText($Name, $Prefix, $Suffix);
IPS_SetVariableProfileDigits($Name, $Digits); // Nachkommastellen
IPS_SetVariableProfileValues($Name, $MinValue, $MaxValue, $StepSize);
}
function CreateProfileP ($Name, $Profilname, $KatID)
{
$VarID_ProfileP = IPS_CreateVariable(1);
IPS_SetName($VarID_ProfileP, $Name." PositionP"); // Variable benennen
IPS_SetParent($VarID_ProfileP, $KatID); // Variable einsortieren unter dem Objekt mit der ID
IPS_SetVariableCustomProfile($VarID_ProfileP, $Profilname);
}
?>
Um ein Cover aus IP-Symcon von Sonos in NEO anzeigen zu können wird zur Zeit ein Webseitenelement benötigt. Dazu ist in IP-Symcon unterhalb von webfront/user der Ordner neo anzulegen und unterhalb des Ordners neo zwei neue Ordner js und css .
In den Unterordner js legen wir die datei reflex.js von
http://www.netzgesta.de/reflex/
ab.
Im Ordner css legen wir die Datei neowebelement.css mit dem folgenden Inhalt ab
neowebelement.css
Code: Alles auswählen
@charset "utf-8";
#webelementwrapper {
position: relative;
}
.button .icon img {
background-image: -webkit-linear-gradient(270deg,rgba(255,255,255,1.00) 0%,rgba(83,75,75,0.60) 100%);
background-image: -moz-linear-gradient(270deg,rgba(255,255,255,1.00) 0%,rgba(83,75,75,0.60) 100%);
background-image: -o-linear-gradient(270deg,rgba(255,255,255,1.00) 0%,rgba(83,75,75,0.60) 100%);
background-image: linear-gradient(180deg,rgba(255,255,255,1.00) 0%,rgba(83,75,75,0.60) 100%);
top: 160px;
left: 141px;
position: absolute;
border-radius: 64px;
-webkit-box-shadow: 2px 2px 3px rgba(46,44,44,1.00);
box-shadow: 2px 2px 3px rgba(46,44,44,1.00);
}
body {
background-color: transparent;
}
SonosCover.php
Code: Alles auswählen
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Sonos Bad</title>
<script type="text/javascript" src="js/reflex.js"></script><script type="text/javascript" src="js/moment-with-locales.min.js"></script>
<link href="css/neowebelement.css" rel="stylesheet" type="text/css">
</head>
<body marginheight="0" marginwidth="0">
<?php
//Prüft ob POST oder GET
//POST
if (isset($_POST["objektid"]))
{
// ObjektID auslesen
$objektid = $_POST["objektid"];
if(isset($_POST["size"]))
{
$size = $_POST["size"];
}
else
{
$size = 340;
}
getdataips($objektid, $size);
}
//GET
elseif (isset($_GET["objektid"]))
{
// ObjektID auslesen
$objektid = $_GET["objektid"];
if(isset($_GET["size"]))
{
$size = $_GET["size"];
}
else
{
$size = 340;
}
getdataips($objektid, $size);
}
//kein GET oder POST
else
{
echo "Es wurden keine Daten empfangen";
}
function getdataips($objektid, $size)
{
// HTMLBox ausgeben
$sonoscover = GetValue($objektid);
if($sonoscover == "")
{
$img = imagecreatetruecolor($size, $size);
imagesavealpha($img, true);
$color = imagecolorallocatealpha($img, 0, 0, 0, 127);
imagefill($img, 0, 0, $color);
imagepng($img, 'transparentcover.png');
echo '<a href="sonos://"><img src="transparentcover.png" width="'.$size.'" height="'.$size.'" border="0" alt="Cover Sonos"></a>';
}
else
{
echo '<a href="sonos://"><img class="reflex" src="'.$sonoscover.'" width="'.$size.'" height="'.$size.'" border="0" alt="Cover Sonos"></a>';
}
}
?>
</body>
</html>
http:// [IP-Symcon IP]:3777/user/neo/SonosCover.php?objektid=12345
Wobei 12345 durch die 5 stellige ObjektID der Variable CoverURL der Sonos Instanz in IP-Symcon ersetzt wird.
IP-Symcon IP [IP-Symcon IP] IP Adresse vom IP-Symcon Server
Wenn die Größe des Covers angepasst werden soll kann noch der Parameter size aufgerufen werden. Bei einer Größe von 200x200 wäre der Aufruf der Seite:
http:// [IP-Symcon IP]:3777/user/neo/SonosCover.php?objektid=12345&size=200