Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

Screenshot: mehr muss es nicht sein…

Hier die Vorlage zum Download:

View file
nameSonos-Bell 040122.Loxone

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