Die Türglocke über Sonos abspielen und im Anschluss wieder zum letzten Stream zurück schalten.
Das Programm schaltet auch in den letzten Zustand (Ein oder Aus).
Nach dem zurück schalten wird auf START-Volume reduziert.
MUTE (Lautlos) wird immer automatisch aufgehoben.
Ihr könnt im Programm folgende Einstellungen einfach vornehmen:
START_volume 10 Startlautstärke (Zahl 1-100)
EVENT_volume 55 Eventlautstärke (Zahl 1-100)
mySONOS "192.168.1.61" Geräte-IP-Adresse
myBELL "http : // xxxxxxxxxxxx / DingDong.mp3" Datei-Adresse (AAC/MP3 möglich)
Somit ist endlich Schluss mit dem mühsamen Radio-Sender in MP3 suchen und stehts erneuern…
Hier der vollständige Quellcode:
Codeblock |
/*
SONOS-Glocke mit LOXONE
by Smart-Harry
----------------------------------------------------------------------------------------------- */
char xSTREAM[2048]; // Verbindungsspeicher
char PUFFER[16384]; // Datenpuffer
char ZEILE[1024]; // Zeilendaten
char PFAD[1024]; // V-Out Zeile 1
char SOAP[2048]; // V-Out Zeile 2
char BODY[4096]; // V-Out Zeile 3
char URI[1024]; // Stream-Url
char META[2048]; // Stream-Metadata
int HTTP_Statuscode; // Rueckmeldung der Webseite
int ON; // Geraetezustand (0/1)
// =========================== ▼ SONOS (ANPASSEN !!!) ▼ =======================================
#define START_volume 10 // Startlautstaerke (Zahl 1-100)
#define EVENT_volume 55 // Eventlautstaerke (Zahl 1-100)
#define mySONOS "192.168.1.61" // Geraete-IP-Adresse
#define myBELL "http://www.smart-harry.at/Sonos/MP3/DingDong.mp3" // MP3-Glocke
// ======================= ▼ ab hier nichts mehr ändern !! ▼ ==================================
// --- Funktion: Senden und Empfangen --------------------------------------------------------
void Senden()
{
// --- Senden ---
sprintf(PUFFER,"POST %s HTTP/1.1\r\nHOST: %s\r\nCONTENT-LENGTH: %d\r\nCONTENT-TYPE: text/xml; charset=UTF-8\r\nCONNECTION: close\r\n%s\r\n%s", PFAD, mySONOS, strlen(BODY), SOAP, BODY);
int PUFFER_size = strlen(PUFFER); // Zeichenanzahl bestimmen
int LINE_size = 0; // Zeilen-Byte-Zaehler
HTTP_Statuscode = 400; // Als unguelige Anforderung definieren
sprintf(xSTREAM,"/dev/tcp/%s/1400/", mySONOS); // Verbindungspfad festlegen
STREAM* Verbindung = stream_create(xSTREAM,0,0); // Verbindung öffnen
if (Verbindung == NULL) // Verbindungsprüfung
{ ON=-1; } // Fehler
else
{
stream_write(Verbindung, PUFFER, PUFFER_size); // Schreibe in den Datenpuffer
stream_flush(Verbindung); // Sende Datenpuffer
sprintf(PUFFER,""); // Speicher leeren
PUFFER_size=0; // Zaehler ruecksetzen
// --- LESEN ---
do
{
LINE_size = stream_read(Verbindung,ZEILE,sizeof(ZEILE),2000); // Zeile einlesen und Byteanzahl bestimmen
if((PUFFER_size + LINE_size) < (sizeof(PUFFER)-8)) // Datenpruefung mit Reserve
{
strncpy(((char*)PUFFER + PUFFER_size), ZEILE, LINE_size); // Speicher fuellen
PUFFER_size = strlen(PUFFER); // Speicherverbrauch bestimmen
}
else
{ break; } // Speichergoesse erreicht
}
while (LINE_size > 0); // Schleife beenden wenn Zaehler < 1
stream_close(Verbindung); // Verbindung trennen
if (PUFFER_size > 0) // Kontrollfrage
{
strncpy(ZEILE, PUFFER, 12); // Statuscode lesen
sprintf(SOAP,strstrskip(ZEILE,"HTTP/1.1")); // Statuscode filtern
HTTP_Statuscode = batoi(SOAP); // Statuscode in Zahl wandeln
}
}
LINE_size=0;
PUFFER_size=0;
}
// --- Sonos-Zustandspruefung (ON/OFF) ---------------------------------------------------------
void getON()
{
sprintf(PFAD, "/MediaRenderer/AVTransport/Control");
sprintf(SOAP, "soapaction: \"urn:schemas-upnp-org:service:AVTransport:1#GetTransportInfo\"\r\n");
sprintf(BODY, "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:GetTransportInfo xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID></u:GetTransportInfo></s:Body></s:Envelope>");
Senden();
if(HTTP_Statuscode == 200)
{
strcpy(BODY,getxmlvalue(PUFFER,0,"CurrentTransportState"));
ON = (0 - strcmp(BODY,"STOPPED")); // On=1 / Off=0
}
else
{ ON = -1; } // Offline
}
// --- Die aktuellen Musikdaten abfragen -------------------------------------------------------
void getMUSIK()
{
sprintf(PFAD, "/MediaRenderer/AVTransport/Control");
sprintf(SOAP, "soapaction: \"urn:schemas-upnp-org:service:AVTransport:1#GetMediaInfo\"\r\n");
sprintf(BODY, "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:GetMediaInfo xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID></u:GetMediaInfo></s:Body></s:Envelope>");
Senden();
if(HTTP_Statuscode == 200)
{
sprintf(URI,getxmlvalue(PUFFER,0,"CurrentURI"));
sprintf(META,getxmlvalue(PUFFER,0,"CurrentURIMetaData"));
}
else
{
sprintf(URI,"x");
sprintf(META,"x");
}
}
// --- Command: Volume (0-100) ----------------------------------------------------------------
void setVolume(int VOL)
{
sprintf(PFAD, "/MediaRenderer/RenderingControl/Control");
sprintf(SOAP, "soapaction: \"urn:schemas-upnp-org:service:RenderingControl:1#SetVolume\"\r\n");
sprintf(BODY, "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:SetVolume xmlns:u=\"urn:schemas-upnp-org:service:RenderingControl:1\"><InstanceID>0</InstanceID><Channel>Master</Channel><DesiredVolume>%d</DesiredVolume></u:SetVolume></s:Body></s:Envelope>", VOL);
Senden();
}
// --- Command: Play! --------------------------------------------------------------------------
void setPlay()
{
sprintf(PFAD, "/MediaRenderer/AVTransport/Control");
sprintf(SOAP, "soapaction: \"urn:schemas-upnp-org:service:AVTransport:1#Play\"\r\n");
sprintf(BODY, "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:Play xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID><Speed>1</Speed></u:Play></s:Body></s:Envelope>");
Senden();
}
// --- Command: Stop! --------------------------------------------------------------------------
void setStop()
{
sprintf(PFAD, "/MediaRenderer/AVTransport/Control");
sprintf(SOAP, "soapaction: \"urn:schemas-upnp-org:service:AVTransport:1#Stop\"\r\n");
sprintf(BODY, "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:Stop xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID></u:Stop></s:Body></s:Envelope>");
Senden();
}
// --- Command: Mute --------------------------------------------------------------------------
void setMute(int MUTE)
{
sprintf(PFAD, "/MediaRenderer/RenderingControl/Control");
sprintf(SOAP, "soapaction: \"urn:schemas-upnp-org:service:RenderingControl:1#SetMute\"\r\n");
sprintf(BODY, "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:SetMute xmlns:u=\"urn:schemas-upnp-org:service:RenderingControl:1\"><InstanceID>0</InstanceID><Channel>Master</Channel><DesiredMute>%d</DesiredMute></u:SetMute></s:Body></s:Envelope>", MUTE);
Senden();
}
// --- Sequenz: MP3-Stream setzen -------------------------------------------------------------
void setBELL()
{
sprintf(PFAD, "/MediaRenderer/AVTransport/Control");
sprintf(SOAP, "SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI\"\r\n");
sprintf(BODY, "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:SetAVTransportURI xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID><CurrentURI>x-rincon-mp3radio://%s</CurrentURI><CurrentURIMetaData></CurrentURIMetaData></u:SetAVTransportURI></s:Body></s:Envelope>", myBELL);
Senden();
}
// --- Command: Radiostream setzen ------------------------------------------------------------
void setLastStation()
{
if(strlen(URI) > 3)
{
sprintf(PFAD, "/MediaRenderer/AVTransport/Control");
sprintf(SOAP, "SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI\"\r\n");
sprintf(BODY, "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:SetAVTransportURI xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID><CurrentURI>%s</CurrentURI><CurrentURIMetaData>%s</CurrentURIMetaData></u:SetAVTransportURI></s:Body></s:Envelope>", URI, META);
Senden();
}
}
// === PROGRAMM ===============================================================================
while(true)
{
if(getinput(0) > 0)
{
setVolume(0); // Lautlos setzen
getON(); // Geraetezustand speichern
getMUSIK(); // aktuellen Stream speichern
setBELL(); // MP3 spielen
setVolume(EVENT_volume); // Lautstaerke setzen
setMute(0); // Lautlos abschalten
setPlay(); // Zone abspielen
sleeps(5); // Eventdauer abwarten
setVolume(START_volume); // Lautstaerke setzen
setLastStation(); // Setze gemerkten Radiostream
if(ON > 0) { setPlay(); } // Zone war ein, also Radio spielen
else { setStop(); }
}
sleep(100); // Programmpause
}
// === ENDE ==========================================================================================