Zum Ende der Metadaten springen
Zum Anfang der Metadaten

Sie zeigen eine alte Version dieser Seite an. Zeigen Sie die aktuelle Version an.

Unterschiede anzeigen Seitenhistorie anzeigen

« Vorherige Version anzeigen Version 2 Nächste Version anzeigen »

Screenshot: mehr muss es nicht sein…

Hier die Vorlage zum Download:

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:

/*
                                    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 ==========================================================================================

  • Keine Stichwörter