- Angelegt von Smart-Harry, zuletzt geändert am 23.01 2022
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 »
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