Archiv der Kategorie: Haustechnik

Schaltung Netz Notstrom

Um ein Notstromaggregat ins Hausnetz einzubinden ist ein Umschalter notwendig. Dieser trennt das öffentliche Netz vom Notstrom-Netz. Optional kann noch eine Phasenkontrolle eingebaut werden welche leuchtet wenn das öffentliche Netz wieder verfügbar ist. Dann kann wieder umgeschaltet werden.

Folgend der Schaltplan und der Link zum Umschalter bzw. Phasenkontolle

Phansenkontrolle: https://amzn.to/2U9d2zt

Umschalter: https://amzn.to/2U9dT39

Onkyo hoher Standby Verbrauch – TX-NR545

Ich habe mich immer gewundert warum mein Onkyo so viel Strom im ausgeschalteten Zustand benötigt.

Hier kurz zum Verbrauch:
Musik hören (SONOS als ext. Zuspieler)
mit normaler Lautstärke (Vol. 20): ca. 33Wh
Standby: ca. 26Wh

ich habe alle Zusatzfeatures wie HDMI-thru, Bluetooth oder WLAN deaktiviert

dann habe ich auf dem Display gesehen dass „Zone 2“ leuchtet
Sofort ins Menü und „Zone 2“ deaktiviert
und siehe da der Standby-Verbrauch fiel auf ca. 2Wh

Viel Spaß beim Ausprobieren.

Lupusec Tür-/Fensterkontakt mit Akku betreiben

Um Kosten im laufenden Betrieb der Lupusec XT1/XT2 Alarmanlage zu sparen wird in diesem Betrag der Betrieb mit Akkus beschrieben.

Verwendet werden können Akkus im Format CR2 bzw. 1/2 AA.
Diese 3V Akkus sind mit einer Kapazität von 250mA zu haben.

Achtung: CR123 passen nicht in die Lupusec Tür-/Fensterkontakte.

Lupusec gibt eine Laufzeit von 2,5 Jahren für 850mAh-Batterien an. (bei unserer Testanlage waren die ersten nach 6 Monate leer)
Wie lange die Laufzeit mit den Akkus ist werde ich hier posten – rein rechnerisch müssten diese rund 8-9 Monate halten.

Unterschied Makita Akkus (Ah und B) BL1830 und BL1830B

Der Zusatz B (z.B.: BL1820B oder BL1830B) gibt an ob die optische LED-Ladestatusanzeige an der Rückseite der Akkus vorhanden ist. Akkus ohne B haben keine Ladezustandsanzeige.

unterschied makita BL18XX BL18XXB

Folgende 18V-Akkus sind verfügbar:

Bezeichnung Spannung [V] Kapazität [Ah] Leistung [Wh]
BL 1815 18 1,5 27
BL 1820 18 2,0 36
BL 1830 / BL 1830B 18 3,0 54
BL 1840 / BL 1840B 18 4,0 72
BL 1850 / BL 1850B 18 5,0 90
BL 1860 / BL 1860B 18 6,0 108

Makita Akkus günstig kaufen >>>

Infrarot-Armatur: schick, edel und praktisch

Ich bin auf der Suche nach einem „intelligenten“ Ersatz für meine Grohe Europlus Waschtischarmatur.
Daher habe ich mich bei den verschiedenen Sanitär-Herstellern auf Recherche begeben.
Voraussetzungen waren:
– Infrarot (nie mehr Handhebel auf und runter)
– komfortable Bedienung (Ausladung > 10cm, Höhe > 10cm)
– 230V (kein Batteriewechsel)

Hier das Ergebnis vom objektiven Vergleich der Infrarot Waschtischarmaturen (Hersteller: Hansgrohe, SanTec und Grohe):

Platz 1
Hansgrohe Metris S (31102)
Höhe: 14,5cm
Ausladung: 12,8cm
Preis: ca. 400 Euro (Hansgrohe Metris S günstig kaufen >>>)

Meiner Meinung nach wunderschönes puristisches Design und sehr großer „Arbeitsbereich“.

hansgrohe metris shansgrohe metris s maße

zusätzliche Produktmerkmale
– Infrarot Näherungselektronik
– 230 V / 50 Hz Netzanschluss
– Temperatur einstellbar über seitlichen Mischhebel
– Temperaturbegrenzung einstellbar
– ComfortZone 150
– manueller Wasserstop zur Beckenreinigung
– Hygienespülung aktivierbar (automatischer Wasserlauf für 10 Sekunden alle 24 Stunden nach letzter Betätigung)
– Dauerspülung aktivierbar (einmaliger Wasserlauf für 180 Sekunden, geeignet zur Thermischen Desinfektion)
– Reichweite der Infrarotsensorik einstellbar (2 Einstellungen)
– automatische Umgebungsanpassung der Infrarotsensorik
– Durchflussmenge 5 l/min
– Schmutzfangsiebe in den Anschlussschläuchen
– für Durchlauferhitzer geeignet
– Anschlussart: G 3/8 Anschlussschläuche

Platz 2
SanTec Loft (121070)
Höhe: 11,7cm
Ausladung: 12,5cm
Preis: ca. 420 Euro

Optisch auch sehr ansprechend jedoch geringere räumliche Freiheiten beim Händewaschen.

santec loftsantec loft maße

Weitere technische Daten:
Magnetventil: Kartusche 6 V
Ansprechbereich: automatisch
Nah-Ansprechbereich: ca. 3 cm
Spülstoppzeit: 10 s bis 10 min einstellbar
Freispül-Automatik: aktivierbar, Spülintervall:
nach 3 h bis 48 h Nichtbenutzung,
Spüldauer: 10 s oder 20 s
Dauerlauf: aktivierbar, für die Dauer der Spülstoppzeit
Reinigungsstopp: aktivierbar, für 3 min
Fließdruck: 0,05 bis 0,6 MPa (0,5 bis 6 bar)
Statischer Druck: max. 0,8 MPa (8 bar)
Wassertemperatur: max. 70 °C (max. 80 °C für max. 10 min)
Durchfl ussmenge: ca. 6 l/min (druckunabhängig)

Platz 3
Grohe Eurosmart Cosmopolitan E (36325)
Höhe: 10,4cm
Ausladung: 10,5cm
Preis: ca. 260 Euro (GROHE Eurosmart IR günstig kaufen >>>
)

Die preisgünstigere Alternative, recht eingeschränkte Platzverhältnisse, Parameteränderungen nur via Fernbedienung (160 Euro).

grohe eurosmartgrohe eurosmart maße

Technische Daten:
Infrarot-Elektronik für Waschtisch 1/2″ mit Mischung und variabel einstellbarem Temperaturbegrenzer
mit Steckertrafo 100-230 V AC, 50-60 Hz, 6 V DC
mit integriertem Magnetventil
Mischeinrichtung mit einstellbarer Heißwassersperre
7 voreingestellte Programme:
mit 24- oder 72-Stunden-Spülung
Zeit- oder Benutzerabhängig
mit Reinigungsmodus
Sicherheitsabschaltung nach 60 sec.
zusätzliche Funktionen mit Fernbedienung:
Spülzeit einstellbar
mit Fernbedienung einstellbarer Reflexionsbereich
manuelle Aktivierung der thermischen Desinfektion für 3,5 oder 11 min.

GROHE EcoJoy® Mousseur 5,7 l/min
flexible Anschlussschläuche
für kaltes oder vorgemischtes Wasser
Rückflussverhinderer
Schmutzfangsiebe
GROHE EcoJoy® Technologie für Wasser in Perfektion bei reduziertem Verbrauch
GROHE StarLight® Chromoberfläche
Mindestdruck 1,0 bar

Youtube Sound auf Sonos abspielen

Wer kennt das Problem?
Die Party ist am Laufen und das gewünschte MP3 ist lokal am Netzwerkspeicher nicht vorhanden?
Die Lösung ist meistens Youtube – doch der Ton am Ipad/Iphone stellt die Gäste nicht zufrieden.

digital analog konverter
digital analog konverter
Abhilfe schafft hier das Apple-TV und ein Digital/Analog Konverter (DAC).

Verkabelung wie folgt:
Toslink Ausgang Apple-TV —> Kabel: Toslink (digital) —> Toslink Eingang DAC | Cinch Ausgang DAC —> Kabel: Cinch R/L —> Cinch Eingang Sonos

In der Sonos-App kann man dann den externen Eingang aktivieren.
Am Ipad/Iphone muss die aktuelle Wiedergabe auf das Apple-TV gestreamt werden (mit dem Finger von unten nach oben streifen und Airplay -> Apple-TV auswählen)

Um das Ganz noch auf den TV zu bringen wird noch ein HDMI-Kabel benötigt (Apple-TV —> HDIM Eingang TV)

Das ganze gibts für ca. 85 Euro bei Amazon:
1.) Apple TV MD199FD/A (3. Generation, 1080p) schwarz
2.) CSL – Audio digital zu analog Konverter | Wandler/Decoder | Home Entertainment | Neues Modell | Noise Reduction Design | Coaxial SPDIF/digital optisch Toslink zu analogem Composite rechts links Audio | Vollmetall | schwarz
3.) AmazonBasics Optisches Toslink Digital – Kabel (1,8 m)
4.) AmazonBasics Hochgeschwindigkeits-HDMI-Kabel (Ethernet, 3D, und Audio-Return) 2 m

Hansgrohe Metris S Elektronik-Waschtischmischer Versionen/Unterschiede

Folgend die Unterschiede der verschiedenen Artikelnummern:

Metris S Elektronik Waschtischmischer

31101
Temperaturvoreinstellung
6V Batterie

31100
Temperaturregulierung
6V Batterie

31102
Temperaturregulierung
230V

31103
Temperaturvoreinstellung
230V

Anmerkung:

Temperaturvoreinstellung: es kann nur eine Temperatur definiert werden

Temperaturregulierung: mit Hilfe des Hebels rechts kann eine Temperatur eingestellt werden (empfehlenswert)

Smarte KNX Klingel mit Sonos, Gira und Wiregate

Nachdem ich jetzt schon zwei Jahre im Haus wohne und der ständige Batteriewechsel der Funk-Klingel lästig war habe ich mich entschlossen endlich meine Vorstellung einer smarten Klingel zu realisieren.
Grundgedanke war es die vorhandenen Decken-Lautsprecher in das System mit einzubeziehen.
Hier nun zu meiner Anleitung wie ich es gemacht habe:
Material:
Gira Türstation (Klingel)
Gira Türkommunikation Audio oder Video
Gira Türkommunikation Schaltaktor
KNX Binäreingang
Wiregate
Sonos Connect AMP
Funktion Allgemein:
Ein Drücken an der Gira Türstation schaltet den Gira Türkommunikation Schaltaktor. Der Ausgang des Schaltaktors führt auf den Binäreingang und signalisiert dem KNX-Bus dass jemand geklingelt hat. Dieses Signal auf der Gruppenadresse überwacht das Wiregate und startet ein Pearl-Script welches den Sonos Connect AMP den Befehl gibt eine selbst definierte MP3 abzuspielen.
Funktion Sonos-Klingel:
Da sich die Sonos Player im StandBy Modus befinden wird das MP3 sofort abgespielt. Werden in verschiedenen Zonen Musiktitel aus der Playlist oder Webradio abgespielt merkt sich das Skript den aktuellen Titel, unterbricht diesen (inkl. Volume down), spielt den Klingelton ab und startet wieder mit der Playlist bzw. dem Webradio (inkl. Volume up).
Die Klingel via Sonos ist wenn die notwendige Ausstattung vorhanden ist relativ einfach zu realisieren und ist eine meiner Meinung nach sehr feine Sache.

Hier das Wiregate-Plugin welches die Gruppenadresse der Gira Türstation überwacht und das PHP-Skript startet:

1/4: Wiregate Plugin für Sonos-Klingel:

#!/usr/bin/perl
use strict;
use LWP::Simple;
my @GAs;
&readConf;
$plugin_info{$plugname.'_cycle'} = 86400; 

foreach my $curr_ga (@GAs) 
{
	 my $temp_value_ga = knx_read($curr_ga->{ga},0,1);
     $plugin_subscribe{$curr_ga->{ga}}{$plugname} = 1; #An Gruppenadresse anmelden 
     if (($msg{'apci'} eq "A_GroupValue_Write") and ($msg{'dst'} eq ($curr_ga->{ga})) and ($temp_value_ga eq "1")) {    
		plugin_log($plugname,'Es wurde geklingelt.' );
        knx_write($curr_ga->{ga},$curr_ga->{value_aus},1); # Dimmwert senden
		plugin_log($plugname,'GA '.$curr_ga->{ga}. ' (Klingel) auf "'.$curr_ga->{value_aus}.'" gesetzt.' );
    	get( "http://".$curr_ga->{PATH}."/".$curr_ga->{URL});
		plugin_log($plugname,'Aufrufen: ' .  "http://".$curr_ga->{PATH}."/".$curr_ga->{URL} );
	}
return("Status Plugin Klingel: OK");
}

### READ CONF ###
sub readConf
{
 my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
 if (! -f $confFile) {
  plugin_log($plugname, "no conf file [$confFile] found."); 
 } else {
  #plugin_log($plugname, "reading conf file [$confFile]."); 
  open(CONF, $confFile);
  my @lines = ;
  close($confFile);
  my $result = eval("@lines");
  #($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
  if ($@) {
   plugin_log($plugname, "ERR: conf file [$confFile] returned:");
   my @parts = split(/\n/, $@);
   plugin_log($plugname, "--> $_") foreach (@parts);
  }
 }
}

2/4: Wiregate Plugin Konfigurationsdatei:

push @GAs, { URL=> "sonos_2.php", ga => "7/7/0", 
audio => "doorbell_01.mp3", value_ein => 1, value_aus =>0, PATH => "wiregate256/visu_svn_neu/plugins/klingel"};

3/4: Und hier der Link zum txt-File des PHP-Sourcecodes welcher den Sonos-Player die Befehle gibt:

4/4: PHPSonos.inc.php






'
;
*/
$header='POST /DeviceProperties/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:DeviceProperties:1#GetZoneAttributes"
CONTENT-TYPE: text/xml; charset="utf-8"
HOST: '.$this->address.':1400';
$xml='




';
$content=$header . '
Content-Length: '. strlen($xml) .'

'. $xml;

$returnContent = $this->XMLsendPacket($content);


		$xmlParser = xml_parser_create("UTF-8");
		xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
		xml_parse_into_struct($xmlParser, $returnContent, $vals, $index);
		xml_parser_free($xmlParser);


		$ZoneAttributes = Array();

		$key="CurrentZoneName"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneAttributes[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneAttributes[$key] = ""; }

		$key="CurrentIcon"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneAttributes[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneAttributes[$key] = ""; }


		return $ZoneAttributes; //Assoziatives Array
 	}

	public function GetZoneInfo() // added br
	{
/*
$content='POST /DeviceProperties/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:DeviceProperties:1#GetZoneInfo"
CONTENT-TYPE: text/xml; charset="utf-8"
HOST: '.$this->address.':1400
Content-Length: 295






'
;
*/
$header='POST /DeviceProperties/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:DeviceProperties:1#GetZoneInfo"
CONTENT-TYPE: text/xml; charset="utf-8"
HOST: '.$this->address.':1400';
$xml='




';
$content=$header . '
Content-Length: '. strlen($xml) .'

'. $xml;

$returnContent = $this->XMLsendPacket($content);


		$xmlParser = xml_parser_create("UTF-8");
		xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
		xml_parse_into_struct($xmlParser, $returnContent, $vals, $index);
		xml_parser_free($xmlParser);


		$ZoneInfo = Array();

		$key="SerialNumber"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneInfo[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneInfo[$key] = ""; }

		$key="SoftwareVersion"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneInfo[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneInfo[$key] = ""; }

		$key="SoftwareVersion"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneInfo[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneInfo[$key] = ""; }

		$key="DisplaySoftwareVersion"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneInfo[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneInfo[$key] = ""; }

		$key="HardwareVersion"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneInfo[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneInfo[$key] = ""; }

		$key="IPAddress"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneInfo[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneInfo[$key] = ""; }


		$key="MACAddress"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneInfo[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneInfo[$key] = ""; }


		$key="CopyrightInfo"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneInfo[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneInfo[$key] = ""; }


		$key="ExtraInfo"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneInfo[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneInfo[$key] = ""; }


		return $ZoneInfo; //Assoziatives Array
 	}





	public function SetLEDState($state) // added br
	{
   if($state=="On") { $state = "On"; } else
		{	if($state=="Off") { $state = "Off"; } else {
      		if($state) { $state = "On"; } else { $state = "Off"; }
      	}
		}
		
$content='POST /DeviceProperties/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 250
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:DeviceProperties:1#SetLEDState"

' .$state. '';

		return (bool)$this->sendPacket($content);
	}
	public function GetLEDState() // added br
	{

$content='POST /DeviceProperties/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 250
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:DeviceProperties:1#GetLEDState"

0';

		if ($this->sendPacket($content)=="On") { return(true); }else return(false);
	}
/* urn:upnp-org:serviceId:GroupManagement */

	public function AddMember($MemberID) // added br
	// Joins a group 1st Arg is RINCON_MAC1400
	// Returns assoziative Array with CurrentSettings and GroupUUIDJoined
		{

$header='POST /GroupManagement/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:GroupManagement:1#AddMember"
CONTENT-TYPE: text/xml; charset="utf-8"
HOST: '.$this->address.':1400';
$xml='
' . $MemberID . '
';
$content=$header . '
Content-Length: '. strlen($xml) .'

'. $xml;


$returnContent = $this->XMLsendPacket($content);

		$xmlParser = xml_parser_create("UTF-8");
		xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
		xml_parse_into_struct($xmlParser, $returnContent, $vals, $index);
		xml_parser_free($xmlParser);


		$ZoneAttributes = Array();

		$key="CurrentTransportSettings"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneAttributes[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneAttributes[$key] = ""; }

		$key="GroupUUIDJoined"; // Lookfor
		if ( isset($index[strtoupper($key)][0]) and isset($vals[ $index[strtoupper($key)][0] ]['value'])) {$ZoneAttributes[$key] = $vals[ $index[strtoupper($key)][0] ]['value'];
      } else { $ZoneAttributes[$key] = ""; }


		return $ZoneAttributes; //Assoziatives Array
		// set AVtransporturi ist notwendig
 	}

/* urn:upnp-org:serviceId:MusicServices */
	// Not implemented
/* urn:upnp-org:serviceId:SystemProperties */
	// Not implemented
/* urn:upnp-org:serviceId:ZoneGroupTopology */
	// Not implemented

	public function RemoveMember($MemberID) // added br
	// Leaves a Group
	// Returns None
		{

$header='POST /GroupManagement/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:GroupManagement:1#RemoveMember"
CONTENT-TYPE: text/xml; charset="utf-8"
HOST: '.$this->address.':1400';
$xml='
' . $MemberID . '
';
$content=$header . '
Content-Length: '. strlen($xml) .'

'. $xml;

	echo $this->sendPacket($content);

		// set AVtransporturi ist für STOP notwendig
 	}

/* urn:upnp-org:serviceId:MusicServices */
	// Not implemented
/* urn:upnp-org:serviceId:SystemProperties */
	// Not implemented
/* urn:upnp-org:serviceId:ZoneGroupTopology */
	// Not implemented


/******************* urn:schemas-upnp-org:device:MediaRenderer:1 ***********

***************************************************************************/

/* urn:upnp-org:serviceId:RenderingControl */

	public function RampToVolume($ramp_type, $volume) //added br
	/* Ramps Vol to $volume using the Method mentioned in $ramp_type as string:
	"SLEEP_TIMER_RAMP_TYPE" - mutes and ups Volume per default within 17 seconds to desiredVolume
	"ALARM_RAMP_TYPE" -Switches audio off and slowly goes to volume
	"AUTOPLAY_RAMP_TYPE" - very fast and smooth; Implemented from Sonos for the unofficial autoplay feature.
	When you switch on a Sonos Device it plays its autoplay Command/Playlist and Settings. It´s all there but currently no GUI setting is possible.
	*Should return Rampseconds* but this is not implemented! */
	{


$header='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
HOST: '.$this->address.':1400
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#RampToVolume"
';
$xml='
0Master'.$ramp_type.''.$volume.'
';
$content=$header . 'Content-Length: '. strlen($xml) .'

'. $xml;


		return (int) $this->sendPacket($content);

	}
/* urn:upnp-org:serviceId:AVTransport */
// If you don´t set $id you may get duplicate playlists!!!

 	public function SaveQueue($title,$id="") // added br
    {

        $header='POST /MediaRenderer/AVTransport/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SaveQueue"
CONTENT-TYPE: text/xml; charset="utf-8"
HOST: '.$this->address.':1400';
$xml='0'.$title.''.$id.'

';
$content=$header . '
Content-Length: '. strlen($xml) .'

'. $xml;

    $returnContent = $this->sendPacket($content);
	}
	
	public function GetCrossfadeMode() // added br
	{

$header='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$this->address.':1400
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetCrossfadeMode"
';
$xml='
0
';
$content=$header . 'Content-Length: '. strlen($xml) .'

'. $xml;

		return (bool)$this->sendPacket($content);
	}

	public function SetCrossfadeMode($mode) // added br
	{


		if($mode) { $mode = "1"; } else { $mode = "0"; }
$header='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$this->address.':1400
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetCrossfadeMode"
';
$xml='
0'.$mode.'';
$content=$header . 'Content-Length: '. strlen($xml) .'

'. $xml;

	$this->sendPacket($content);
		

	}

	public function Stop()
	{
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 250
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Stop"

0';

		$this->sendPacket($content);
	}




	public function Pause()
	{
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 252
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Pause"

0';

		$this->sendPacket($content);
	}

	public function Play()
	{

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 266
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Play"

01';

		$this->sendPacket($content);
	}
	
	public function Next()
	{
	
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 250
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Next"

0';

		$this->sendPacket($content);
	}
	
	public function Previous()
	{
	
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 258
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Previous"

0';

		$this->sendPacket($content);
	}
	
	public function Seek($arg1,$arg2="NONE")
	{
// Abwärtskompatibel zu Paresys Original sein
	if ($arg2=="NONE"){
		$Unit="REL_TIME"; $position=$arg1;
	} else {$Unit=$arg1; $position=$arg2;}

 $header='POST /MediaRenderer/AVTransport/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Seek"
CONTENT-TYPE: text/xml; charset="utf-8"
CONNECTION: close
HOST: '.$this->address.':1400';
$xml='
0'. $Unit .''.$position.'';
$content=$header . '
Content-Length: '. strlen($xml) .'

'. $xml;

    $returnContent = $this->sendPacket($content);



	}
	
	public function Rewind()
	{
	
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 296
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Seek"

0REL_TIME00:00:00';

		$this->sendPacket($content);
	}
	
	public function SetVolume($volume)
	{

$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 32'.strlen($volume).'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetVolume"

0Master'.$volume.'';

		$this->sendPacket($content);
	}
	
	public function GetVolume()
	{

$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 290
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#GetVolume"

0Master';

		return (int)$this->sendPacket($content);
	}
	
	public function SetMute($mute)
	{

		if($mute) { $mute = "1"; } else { $mute = "0"; }

$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 314
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetMute"

0Master'.$mute.'';

		$this->sendPacket($content);
	}
	
	public function GetMute()
	{

$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 286
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#GetMute"

0Master';

		return (bool)$this->sendPacket($content);
	}
	
	public function SetPlayMode($mode)
	{

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: '.(291+strlen($mode)).'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetPlayMode"

0'.$mode.'';

		$this->sendPacket($content);
	}
	
	public function GetTransportSettings()
	{

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 282
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetTransportSettings"

0';

		$returnContent = $this->sendPacket($content);

//	echo "\n===" . $this->address. "====\n" . $returnContent . "\n===\n";

		if (strstr($returnContent, "NORMAL") !== false) {
			return Array (
				"repeat" => false,
				"shuffle" => false
			);
		} elseif (strstr($returnContent, "REPEAT_ALL") !== false) {
			return Array (
				"repeat" => true,
				"shuffle" => false
			);	
		
		} elseif (strstr($returnContent, "SHUFFLE_NOREPEAT") !== false) {
			return Array (
				"repeat" => false,
				"shuffle" => true
			);

		} elseif (strstr($returnContent, "SHUFFLE") !== false) {
			return Array (
				"repeat" => true,
				"shuffle" => true
			);
   	}
   	/* what is PLAYING??? br */
   /*	} elseif (strstr($returnContent, "PLAYING") !== false) {
			return Array (
				"repeat" => false,
				"shuffle" => true
			);
   	} */

	}

	public function GetTransportInfo()
	{

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 274
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetTransportInfo"

0';

		$returnContent = $this->sendPacket($content);
		
		if (strstr($returnContent, "PLAYING") !== false) {
		   return 1;
		} elseif (strstr($returnContent, "PAUSED_PLAYBACK") !== false) {
		   return 2;
		} elseif (strstr($returnContent, "STOPPED") !== false) {
		   return 3;
		}
		
	}
	
		public function GetMediaInfo()
	{

// NOTEBR: diese F. ist aktuell noch buggy

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 266
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetMediaInfo"

0';

		$returnContent = $this->XMLsendPacket($content);
		
/*		$returnContent = substr($returnContent, stripos($returnContent, '<'));
		$returnContent = substr($returnContent, 0, strrpos($returnContent, '>') + 4);
		$returnContent = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $returnContent);
*/
		$xmlParser = xml_parser_create("UTF-8");
		xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
		xml_parse_into_struct($xmlParser, $returnContent, $vals, $index);
		xml_parser_free($xmlParser);

		$mediaInfo = Array();

		if (isset($index["DC:TITLE"]) and isset($vals[$index["DC:TITLE"][0]]["value"])) {
			$mediaInfo["title"] = $vals[$index["DC:TITLE"][0]]["value"];
		} else {
			$mediaInfo["title"] = "";
		}
		if (isset($vals[5]["value"])) {
			$mediaInfo["CurrentURI"] = $vals[5]["value"];
		} else {
			$mediaInfo["CurrentURI"] = "";
		}
				if (isset($vals[6]["value"])) {
			$mediaInfo["CurrentURIMetaData"] = $vals[6]["value"];
		} else {
			$mediaInfo["CurrentURIMetaData"] = "";
		}
		return $mediaInfo;
		
	}
	
	public function GetPositionInfo()
	{

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 272
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetPositionInfo"

0';

		$returnContent = $this->sendPacket($content);
	
		$position = substr($returnContent, stripos($returnContent, "NOT_IMPLEMENTED") - 7, 7);

		$returnContent = substr($returnContent, stripos($returnContent, '<'));
		$returnContent = substr($returnContent, 0, strrpos($returnContent, '>') + 4);
		$returnContent = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $returnContent);
		
		
		$xmlParser = xml_parser_create("UTF-8");
		xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, "UTF-8");
		xml_parse_into_struct($xmlParser, $returnContent, $vals, $index);
		xml_parser_free($xmlParser);
	
		$positionInfo = Array ();
		
		$positionInfo["position"] = $position;
		$positionInfo["RelTime"] = $position;
		
	
		if (isset($index["RES"]) and isset($vals[$index["RES"][0]]["attributes"]["DURATION"])) {
			$positionInfo["duration"] = $vals[$index["RES"][0]]["attributes"]["DURATION"];
				$positionInfo["TrackDuration"] = $vals[$index["RES"][0]]["attributes"]["DURATION"];
		} else {
			$positionInfo["duration"] = "";
				$positionInfo["TrackDuration"] = "";
		}

		
		if (isset($index["RES"]) and isset($vals[$index["RES"][0]]["value"])) {
			$positionInfo["URI"] = $vals[$index["RES"][0]]["value"];
			$positionInfo["TrackURI"] = $vals[$index["RES"][0]]["value"];
		} else {
			$positionInfo["URI"] = "";
			$positionInfo["TrackURI"] = "";
		}
		
		if (isset($index["DC:CREATOR"]) and isset($vals[$index["DC:CREATOR"][0]]["value"])) {
			$positionInfo["artist"] = $vals[$index["DC:CREATOR"][0]]["value"];
		} else {
			$positionInfo["artist"] = "";
		}
		
		if (isset($index["DC:TITLE"]) and isset($vals[$index["DC:TITLE"][0]]["value"])) {
			$positionInfo["title"] = $vals[$index["DC:TITLE"][0]]["value"];
		} else {
			$positionInfo["title"] = "";
		}
		
		if (isset($index["UPNP:ALBUM"]) and isset($vals[$index["UPNP:ALBUM"][0]]["value"])) {
			$positionInfo["album"] = $vals[$index["UPNP:ALBUM"][0]]["value"];
		} else {
			$positionInfo["album"] = "";
		}
		
		if (isset($index["UPNP:ALBUMARTURI"]) and isset($vals[$index["UPNP:ALBUMARTURI"][0]]["value"])) {
			$positionInfo["albumArtURI"] = "http://" . $this->address . ":1400" . $vals[$index["UPNP:ALBUMARTURI"][0]]["value"];
		} else {
			$positionInfo["albumArtURI"] = "";
		}
		
		if (isset($index["R:ALBUMARTIST"]) and isset($vals[$index["R:ALBUMARTIST"][0]]["value"])) {
			$positionInfo["albumArtist"] = $vals[$index["R:ALBUMARTIST"][0]]["value"];
		} else {
			$positionInfo["albumArtist"] = "";
		}
		
		if (isset($index["UPNP:ORIGINALTRACKNUMBER"]) and isset($vals[$index["UPNP:ORIGINALTRACKNUMBER"][0]]["value"])) {
			$positionInfo["albumTrackNumber"] = $vals[$index["UPNP:ORIGINALTRACKNUMBER"][0]]["value"];
		} else {
			$positionInfo["albumTrackNumber"] = "";
		}
		
		if (isset($index["R:STREAMCONTENT"]) and isset($vals[$index["R:STREAMCONTENT"][0]]["value"])) {
			$positionInfo["streamContent"] = $vals[$index["R:STREAMCONTENT"][0]]["value"];
		} else {
			$positionInfo["streamContent"] = "";
		}
		// added br if this contains "rincon" we are slave to a coordinator mentioned in this field (otherwise path to the file is provided)!
		// implemented via second XMLsendpacket to not break michaels current code


/*		if (isset($index["RES"][0]) and isset($vals[($index["RES"][0])]["value"])) {
			$positionInfo["trackURI"] = $vals[($index["RES"][0])]["value"];

        } else {
*/
			$returnContent = $this->XMLsendPacket($content);

			$xmlParser = xml_parser_create("UTF-8");
			xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
			xml_parse_into_struct($xmlParser, $returnContent, $vals, $index);
			xml_parser_free($xmlParser);
//	  }

			if (isset($index["TRACKURI"][0]) and isset($vals[($index["TRACKURI"][0])]["value"])) {
			$positionInfo["trackURI"] = $vals[($index["TRACKURI"][0])]["value"];
			$positionInfo["TrackURI"] = $vals[($index["TRACKURI"][0])]["value"];
			} else {
				$positionInfo["trackURI"] = "";
			}
		
			// Track Number in Playlist
			if (isset($index["TRACK"][0]) and isset($vals[($index["TRACK"][0])]["value"])) {
			$positionInfo["Track"] = $vals[($index["TRACK"][0])]["value"];;

			} else {
				$positionInfo["Track"] = "";
			}
			

		
		return $positionInfo;
	}
	
	public function SetRadio($radio,$Name="IP-Symcon Radio")
	{
	$Metadata="<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="R:0/0/0" parentID="R:0/0" restricted="true"><dc:title>".$Name."</dc:title><upnp:class>object.item.audioItem.audioBroadcast</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON65031_</desc></item></DIDL-Lite>";

 	$this->SetAVTransportURI($radio,$MetaData);

	}

	public function SetAVTransportURI($tspuri,$MetaData="")
	{

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: '.(342+strlen(htmlspecialchars($tspuri))+strlen(htmlspecialchars($MetaData))).'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"

0'.htmlspecialchars($tspuri).''.htmlspecialchars($MetaData).'.';

		$this->sendPacket($content);
	}
	
	public function SetQueue($queue,$MetaData="")
	{
 	$this->SetAVTransportURI($queue,$MetaData);

	}

	public function ClearQueue()
	{

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: 290
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#RemoveAllTracksFromQueue"

0';

		$this->sendPacket($content);
	}

	public function AddToQueue($file)
	{
	
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: '.(438+strlen(htmlspecialchars($file))).'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#AddURIToQueue"

0'.htmlspecialchars($file).'01';

		$this->sendPacket($content);
	}
	
	public function RemoveFromQueue($track)
	{

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: '.(307+strlen($track)).'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#RemoveTrackFromQueue"

0Q:0/'.$track.'';

		$this->sendPacket($content);
	}
	
	public function SetTrack($track)
	{
	
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: '.(288+strlen($track)).'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Seek"

0TRACK_NR'.$track.'';

		$this->sendPacket($content);
	}
/******************* // urn:schemas-upnp-org:device:MediaServer:1 ***********

***************************************************************************/
/* urn:upnp-org:serviceId:ContentDirectory */
 // MERKERTITLE
    //Gibt ein Array mit den Songs der aktuellen Playlist
    public function GetCurrentPlaylist()
    {
        $header='POST /MediaServer/ContentDirectory/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
CONTENT-TYPE: text/xml; charset="utf-8"
HOST: '.$this->address.':1400';
$xml='


Q:0BrowseDirectChildren01000

';
$content=$header . '
Content-Length: '. strlen($xml) .'

'. $xml;

    $returnContent = $this->sendPacket($content);

        $returnContent = substr($returnContent, stripos($returnContent, '<'));
        $returnContent = substr($returnContent, 0, strrpos($returnContent, '>') + 4);
        $returnContent = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $returnContent);

        $xml = new SimpleXMLElement($returnContent);
        $liste = array();
        for($i=0,$size=count($xml);$i<$size;$i++)
        {
            $aktrow = $xml->item[$i];
            $albumart = $aktrow->xpath("upnp:albumArtURI");
            $title = $aktrow->xpath("dc:title");
            $artist = $aktrow->xpath("dc:creator");
            $album = $aktrow->xpath("upnp:album");
            $liste[$i]['listid']=$i+1;
            if(isset($albumart[0])){
                $liste[$i]['albumArtURI']="http://" . $this->address . ":1400".(string)$albumart[0];
            }else{
                $liste[$i]['albumArtURI'] ="";
            }
            $liste[$i]['title']=(string)$title[0];
            if(isset($artist[0])){
                $liste[$i]['artist']=(string)$artist[0];
            }else{
                $liste[$i]['artist']="";
            }
            if(isset($album[0])){
                $liste[$i]['album']=(string)$album[0];
            }else{
                $liste[$i]['album']="";
            }
        }
return $liste;
    }



    //Liefert ein Array mit allen Sonos Wiedergabelisten und deren Aufrufinformationen
    public function GetSonosPlaylists()
    {
        $header='POST /MediaServer/ContentDirectory/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
CONTENT-TYPE: text/xml; charset="utf-8"
HOST: '.$this->address.':1400';
$xml='


SQ:BrowseDirectChildren0100

';
$content=$header . '
Content-Length: '. strlen($xml) .'

'. $xml;

    $returnContent = $this->sendPacket($content);
    $returnContent = substr($returnContent, stripos($returnContent, '<'));
        $returnContent = substr($returnContent, 0, strrpos($returnContent, '>') + 4);
        $returnContent = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $returnContent);

        $xml = new SimpleXMLElement($returnContent);
        $liste = array();
        for($i=0,$size=count($xml);$i<$size;$i++)
        {
            $attr = $xml->container[$i]->attributes();
            $liste[$i]['id'] = (string)$attr['id'];
            $title = $xml->container[$i];
            $title = $title->xpath('dc:title');
            $liste[$i]['title'] = (string)$title[0];
            $liste[$i]['typ'] = "Sonos";
            $liste[$i]['file'] = (string)$xml->container[$i]->res;
        }


return $liste;
    }



    //Liefert ein Array mit allen "Importierte Playlisten" Wiedergabelisten und deren Aufrufinformationen
    public function GetImportedPlaylists()
    {
        $header='POST /MediaServer/ContentDirectory/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
CONTENT-TYPE: text/xml; charset="utf-8"
HOST: '.$this->address.':1400';
$xml='


A:PLAYLISTSBrowseDirectChildren0100

';
$content=$header . '
Content-Length: '. strlen($xml) .'

'. $xml;

    $returnContent = $this->sendPacket($content);
    $returnContent = substr($returnContent, stripos($returnContent, '<'));
        $returnContent = substr($returnContent, 0, strrpos($returnContent, '>') + 4);
       $returnContent = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $returnContent);

        $xml = new SimpleXMLElement($returnContent);
        $liste = array();
        for($i=0,$size=count($xml);$i<$size;$i++)
        {
            $attr = $xml->container[$i]->attributes();
            $liste[$i]['id'] = (string)$attr['id'];
            $title = $xml->container[$i];
            $title = $title->xpath('dc:title');
				// br substring use cuts my playlist names at the 4th char
			
				$liste[$i]['title'] = (string)$title[0];
					$liste[$i]['title']=preg_replace("/^(.+)\.m3u$/i","\\1",$liste[$i]['title']);
            $liste[$i]['typ'] = "Import";
            $liste[$i]['file'] = (string)$xml->container[$i]->res;
        }


return $liste;
    }



    //Gibt ein Array mit den einzelnen Songs der Playlist wieder
    //ObjektID aus GetSonosPlaylists() oder GetImportetPlaylists()
    public function GetPlaylist($value)
    {
        $header='POST /MediaServer/ContentDirectory/Control HTTP/1.1
SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
CONTENT-TYPE: text/xml; charset="utf-8"
HOST: '.$this->address.':1400';
$xml='


'.$value.'BrowseDirectChildren01000

';
$content=$header . '
Content-Length: '. strlen($xml) .'

'. $xml;

    $returnContent = $this->sendPacket($content);
    $xmlParser = xml_parser_create();
        $returnContent = substr($returnContent, stripos($returnContent, '<'));
        $returnContent = substr($returnContent, 0, strrpos($returnContent, '>') + 4);
        $returnContent = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $returnContent);

        $xml = new SimpleXMLElement($returnContent);
        $liste = array();
        for($i=0,$size=count($xml);$i<$size;$i++)
        {
            $aktrow = $xml->item[$i];
            $albumart = $aktrow->xpath("upnp:albumArtURI");
            $title = $aktrow->xpath("dc:title");
            $artist = $aktrow->xpath("dc:creator");
            $album = $aktrow->xpath("upnp:album");
            $liste[$i]['listid']=$i+1;
            if(isset($albumart[0])){
                $liste[$i]['albumArtURI']="http://" . $this->address . ":1400".(string)$albumart[0];
            }else{
                $liste[$i]['albumArtURI'] ="";
            }
            $liste[$i]['title']=(string)$title[0];
            if(isset($interpret[0])){
                $liste[$i]['artist']=(string)$artist[0];
            }else{
                $liste[$i]['artist']="";
            }
            if(isset($album[0])){
                $liste[$i]['album']=(string)$album[0];
            }else{
                $liste[$i]['album']="";
            }
        }
return $liste;
    }






/***************************************************************************
				Helper / sendPacket
***************************************************************************/

/*
Unter LocalUID findet sich der String, den man im $sonos->SetQueue Befehl braucht.
Den String kann man z.B. über folgendes Codeschnipsel bekommen:
$url = "http://"..":1400/status/zp";
$xml = simpleXML_load_file($url);
$result = $xml->ZPInfo->LocalUID;
Quelle: http://www.ip-symcon.de/forum/f53/php-sonos-klasse-ansteuern-einzelner-player-7676/#post87054
*/

// do not filter xml answer

	private function XMLsendPacket( $content )
	{
		$fp = fsockopen($this->address, 1400 /* Port */, $errno, $errstr, 10);
		if (!$fp)
		    throw new Exception("Error opening socket: ".$errstr." (".$errno.")");
		    
		fputs ($fp, $content);
		$ret = "";
		$buffer = "";
		while (!feof($fp)) {
			$buffer = fgets($fp,128);
		//	echo "\n;" . $buffer . ";\n"; //DEBUG
			$ret.= $buffer;
		}

//		echo "\n\nReturn:" . $ret . "!!\n";
		fclose($fp);

		if(strpos($ret, "200 OK") === false)
			throw new Exception("Error sending command: ".$ret);
		$array = preg_split("/\n/", $ret);
		
		return $array[count($array) - 1];
	}



	private function sendPacket( $content )
	{
		$fp = fsockopen($this->address, 1400 /* Port */, $errno, $errstr, 10);
		if (!$fp)
		    throw new Exception("Error opening socket: ".$errstr." (".$errno.")");

		fputs ($fp, $content);
		$ret = "";
		while (!feof($fp)) {
			$ret.= fgetss($fp,128); // filter xml answer
		}
		fclose($fp);

		if(strpos($ret, "200 OK") === false)
   	throw new Exception("Error sending command: ".$ret);

		// echo "sendPacketDebug: "; //DEBUG
		// print_r($ret);
		
		$array = preg_split("/\n/", $ret);

		return $array[count($array) - 1];
	}

}

?>

Anbindung Somfy Funkbus an KNX/EIB Bus

Da ich bei der Bestellung meiner Unterglas-Markise nicht darauf geachtet habe das diese mit dem proprietären Funkbus von Somfy gesteuert wird musste ich eine Lösung finden wie ich die Markise auf den KNX/EIB Bus bekomme.
Dazu wird ein Baustein der Firma Somfy namens „Dry Contact Transmitter“ (Art.-Nr.: 1810334) benötigt. Dieses Modul wandelt externe Signale wie zum Beispiel von einem Schaltaktor oder Taster in Funksignale um.
somfy-knx-bus
Verkabelung:
Klemme 1 und 2 dienen zur Spannungsversorgung (230V)
Klemme 3 (C) dient als Masse
Klemme 4 und 5 sind die Eingänge für das öffnen/schließen bzw. hinaus- und hineinfahren

Es muss also die Verbindung zwischen Klemme 3 und Klemme 4 bzw. Klemme 3 und Klemme 5 durch einen Taster oder einen Schaltaktor geschlossen werden.
Ein gleichzeitiges Signal auf Klemme 4 und 5 generiert ein Stopp-Signal.

Im Falle der Verwendung eines Schaltaktors werden also 3 Kanäle benötigt.
Kanal A für das Öffnen/Hinausfahren
Kanal B für das Schließen/Hineinfahren
Kanal C für das Stoppsignal

Mit diesem Workaround ist es möglich den Somfy Funkmotor via KNX/EIB Bus zu bedienen.

Anmerkung:
– Achtung der Somfy Funkempfänger Dry Contact (Art.-Nr.: 1810750) macht genau das Gegenteil – bei der Bestellung aufpassen.
– Im Bild habe ich einen Jalousieaktor verwendet und das Stoppsignal nicht realisiert (wird mit der Cometvisu durch gleichzeitiges aufrufen der Gruppenadressen simuliert)

Umbau Neon-Röhre auf SMD-LED-Röhre

Um eine 230V T8 SMD-LED-Röhre in einer bestehenden Leuchte mit Leuchtröhre (Kaltkathodenröhre)
aus dem Baumarkt betreiben zu können müssen zwei Dinge geändert werden.

1.) den Starter ausbauen (Bild 4)
2.) den vorhandenen Trafo abklemmen und die Kabel überbrücken (Bild 5)

Da die SMD-LED-Röhre mit Netzspannung (230V) funktioniert wird kein Trafo benötigt.
Es muss lediglich auf der einen Fassung (z.B. links) der Neutralleiter (blau) anliegen und an der zweiten Fassung (z.B. rechts) die Phase (schwarz, braun oder grau).

Neon-Röhre vor Umbau auf SMD-LED Neon-Röhre nach Umbau auf SMD-LED Verkabelung Leuchte Neon-Röhre Verkabelung Leuchte SMD-LED Überbrückung Trafo Neon-Röhre

Vorteile der SMD-LED-Röhre gegenüber der guten alten Neon-Röhre ist:
– der geringere Energieverbrauch
– sofort Licht ohne das bekannte Zünden bzw. Aufblinken durch den Starter
– kein Brummen durch den Trafo

Hinweis.:
– Umbauten sollten nur von Profis durchgeführt werden
– Vor Umbau allpolig vom Versorgungsnetz trennen
– Es können natürlich auch zwei Fassungen mit G13-Sockel im entsprechenden Abstand montiert werden.
  Optisch finde ich aber eine Leuchte schöner