Vorstellung Windows App - oder endlich eine Frau die macht was ich sage :-)

Hallo zusammen,

nachdem es doch deutlich mehr Nutzer meiner Windows Phone App gab als ich jemals dachte, hat mich das Feedback nach weiteren Features ein wenig beschäftigt. Nachdem Microsoft dann mit Windows 10 die Universal App Platform eingeführt hat (eine App läuft auf allen Geräten Desktop, Tablet, Mobile, x86, x64, Arm) und die Jungs von der Symcon GmbH mir auf absehbare Zeit keine Windows App zur Verfügung stellen wollten, habe ich mal ein paar Abende in die Tasten gehauen und was gebaut.

ips4Windows soll auf einem Windows Desktop oder Tablet das Webfrontend mit Cortana (Sprachedialoge) und Benachrichtigungen (via LiveTile oder Pushbenachritung) ergänzen. Dabei läuft ips4Windows komplett im Hintergrund und wird vom Betriebssystem beim Eintreffen von Events aufgerufen.
Eigentlich braucht die App nach der einmaligen Konfiguration kein UI mehr, da so eine App aber nun mal ein UI hat habe ich noch drei weitere Dinge umgesetzt welche ich bisher vermisst habe.

Webseiten Darstellung: eine beliebige Webseite (z.B. das Webfront) wird dargestellt, entweder in einem Fenster oder als Vollbild. Interaktionen mit Cortana kommen einfach aus dem Hintergrund

Digitaler Bilderrahmen: ein beliebiger Ordner mit Bildern wird durchsucht und in zufälliger Reihenfolge angezeigt. Interaktionen mit Cortana kommen einfach aus dem Hintergrund

Bei mir hängt ein „Volkstablet“ in der Küche und blättert unsere Urlaubsbilder vom NAS durch, während ein Ruf nach „Hey Cortana, Schneckchen dimme das Licht im Wohnzimmer auf 30 Prozent“ von ihr im Hintergrund ohne murren ausgeführt wird. Als Rückmeldung gibt es dann ein „erledigt Chef“. Natürlich sind auch Abfragen „Wie warm ist es gerade im Wohnzimmer?“ oder Dialoge möglich.

Als dritte Option gibt es noch die „Mobile Darstellung“, welche analog iOS / Android bzw. ipsControl für Windows Phone 8.1 eine Steuerung von IPS zulässt (noch in der Entwicklung).

Ich habe versucht die Einrichtung so einfach wie möglich zu machen, trotzdem aber so viel Flexibilität wie möglich zu liefern.
Richtig gut funktioniert das nur mit IPS V4, hier liefern WebHooks und Module den Rahmen. Unter IPS V3.x sind die Möglichkeiten leider beschränkt, beschreibe ich aber in den nächsten Einträgen.

Voraussetzung für all das ist Windows 10 als Client, der Server kann auf allem laufen was IPS unterstützt.

Wer die App ausprobieren möchte, finde sie hierim Windows Store. Die App läuft 30 Tage im Test ohne Einschränkungen, danach hätte ich gerne einen kleinen Unkostenbeitrag um meine Familie mit einem warmen Essen bei Laune zu halten :slight_smile:

Freu mich auf euer Feedback.

PS: Vielen Dank an meinen Tester (Helmut) und seine Geduld!

Doku der Konfiguration und Einstellungen findet man unter https://ips4windows.wordpress.com

Grüße
Seb.

Cortana mit IPS V4 - Schritt für Schritt Anleitung kann man hierfinden

Cortana mit IPS V3
Hier gibt es leider keine Module und Webhooks, weshalb das nicht so schön zu lösen war 
Es gehen keine Dialoge und man muss vorher festlegen was man schalten will. DokuDie Funktionsweise/Syntax ist komplett identisch zur App ipsControl.

Benachrichtigungen mit IPS V4

  • Installation meines Moduls von GitHub (siehe Cortana)
  • Danach eine Instanz „ips4WinDeviceRegistration" anlegen
  • in der App unter Interaktionen den Regler für Pushbenachrichtigungen aktivieren und die Einstellungen verlassen
  • in IPS sollte jetzt unter dem Modul das Gerät mit Adresse und Schlüssel erscheinen

Im Moment wird der Schlüssel nicht automatisch im Hintergrund erneuert, nach den vier Wochen müsste man einmal in die App gehen (kommt aber sobald ich die Mobile Variante fertig habe, weil ich dort den Task dafür sowieso baue).

Um Nachrichten zu verschicken, legt man sich jetzt einfach ein Script an und fügt folgendes hinzu:

include(IPS_GetKernelDirEx()."scripts/__ipsmodule.inc.php");
	include("../modules/ips4Windows/ips4WinNotifications/module.php");
	$ips4WNS = new ips4WinNotifications("");
	$ips4WNS->EnableDebug(true);
	$result = $ips4WNS->sendToastNotification(null,"text1","text2");
	$result = $ips4WNS->sendBagdeNotification(null,"12");
	$ips4WNS->SetWNSTileTag("Block1");
	$result = $ips4WNS->sendTileNotification(null,"text1","text2","text3","text4");
	print_r ($result);
	$ips4WNS->SetWNSTileTag("Block2");
	$result = $ips4WNS->sendTileNotification(null,"text2","text22","text32","text42");

Ein ausführen des Scripts würde an alle Geräte jetzt eine Nachricht sowie eine TileBenachrichtigung verschicken. Möchte man nur an ein Gerät eine Nachricht senden, so muss man den deviceName aus dem DeviceRegistrationModul als ersten Parameter verwenden (anstelle null).

Es gibt drei Arten von Nachrichten:

  • Toast (bekannt von WhatsApp und Co)
  • Bagge (das ist die Zahl auf dem LiveTile wie z.B. ungelesene Mails)
  • Tile (das ist die Kachel, je nach Größe gibt es mehr oder weniger Content)
    Für die LiveTiles gibt es zwei Besonderheiten, mit SetWNSTileTag kann man eine Nachrichten Queue erstellen. Diese läuft dann einfach mit den unterschiedlichen Benachrichtigungen durch.
    Mit sendTileNotificationXML($device, $XML) kann man den Tile vollkommen anpassen. Die gigantischen Möglichkeiten sind hierbeschrieben.

Cortana V3
Hier ist die Konfiguration wieder deutlich komplizierter und auch im ipsControl Threadbeschrieben. Dafür gibt es diesmal keine Einschränkungen
Hier die für Windows 10 angepasste Klasse (hat sich zur Version von ipsControl geändert)


	class WindowsNotification
	{
   	private $header1 = 'Content-Type: text/xml';
		private $header2 = 'X-WNS-Type: ';
   	private $header3 = 'Authorization: Bearer ';
   	private $header4 = 'X-WNS-Tag: ';
   	private $deviceURI;
    	private $authToken;
    	private $Debug = false;
    	private $WNSMsgToken = "abc";

    	function __construct($ObjID)
    	{
			$deviceToken = GetValueString($ObjID);
			$data = explode("###",$deviceToken);
			if (count($data) > 1)
			{
				$this->deviceURI = $data[0];
				$this->authToken = $data[1];
			}
    	}

    	public function EnableDebug($Debug)
    	{
    	   $this->Debug = $Debug;
		}

		public function SetWNSMsgToken($Token)
    	{

    	   $this->WNSMsgToken = "abc".$Token;
		}


		public function sendBagdeNotification($Value)
	 	{
	 	   $headers = array($this->header1,$this->header2.'wns/badge',$this->header3.$this->authToken);
	 	   $body = '<?xml version="1.0" encoding="utf-8"?><badge version="1" value="'.$Value.'"/>';
	 	   if ($this->Debug)
	 	   {
	 	      echo "headers
";
	 	      print_r($headers);
	 	      echo "body
".$body."
";
			}
	 	   $response = $this->sendNotification($headers,$body);
	 	   return $response;
	 	}

		 public function sendToastNotification($text1,$text2)
	 	 {
	 	   $headers = array($this->header1,$this->header2.'wns/toast',$this->header3.$this->authToken);
	 	   $body = '<?xml version="1.0" encoding="utf-8"?><toast><visual><binding template="ToastText02">'.
	 	   '<text id="1">'.$text1.'</text><text id="2">'.$text2.'</text>'.
			'</binding></visual></toast>';

			if ($this->Debug)
	 	   {
	 	      echo "headers
";
	 	      print_r($headers);
	 	      echo "body
".$body."
";
			}
	 	   $response = $this->sendNotification($headers,$body);
	 	   return $response;
	 	}
	 	 	public function sendTileNotification($text1,$text2,$text3, $text4)
	 	 {
			$text1 = utf8_encode($text1);
			$text2 = utf8_encode($text2);
			$text3 = utf8_encode($text3);
			$text4 = utf8_encode($text4);

			$bodystart = "<tile><visual>";
			$bodysmall =
					'<binding template="TileSmall">'.
                                '<text hint-style="base">'.$text1.'</text>'.
                               '<text hint-style="caption">'.$text2.'</text>'.
                     '</binding>';

			$bodymedium =
                     '<binding template="TileMedium">'.
                                '<text hint-style="base">'.$text1.'</text>'.
                               '<text hint-style="caption">'.$text2.'</text>'.
                               '<text hint-style="caption">'.$text3.'</text>'.
                               '<text hint-style="caption">'.$text4.'</text>'.
                     '</binding>';
            $bodywide =
                     '<binding template="TileWide">'.
                                '<text hint-style="base">'.$text1.'</text>'.
                               '<text hint-style="caption">'.$text2.'</text>'.
                               '<text hint-style="caption">'.$text3.'</text>'.
                               '<text hint-style="caption">'.$text4.'</text>'.
                     '</binding>';

			$bodyend = "</visual></tile>";

			$body = $bodystart.$bodysmall.$bodymedium.$bodywide.$bodyend;

	 	   $headers = array($this->header1,$this->header2.'wns/tile',$this->header4.$this->WNSMsgToken,$this->header3.$this->authToken );

			if ($this->Debug)
	 	   {
	 	      echo "headers
";
	 	      print_r($headers);
	 	      echo "body
".$body."
";
			}
	 	   $response = $this->sendNotification($headers,$body);
	 	   return $response;
	 	}
	 

	 	private function sendNotification($headers,$body)
	 	{
	 	 	if ($this->Debug)
	 	   {
	 	      echo "URL:
".$this->deviceURI."
";
			}

			if ($this->deviceURI != "")
			{
		 		// use Client URL Library
				$ch = curl_init();
				// set an options for a cURL transfer
				// look options here:  http://www.php.net/manual/en/function.curl-setopt.php
				// and what are needed here: http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202970(v=vs.92).aspx
				curl_setopt($ch, CURLOPT_URL, $this->deviceURI);
				curl_setopt($ch, CURLOPT_POST, true);
				curl_setopt($ch, CURLOPT_HEADER, true);
				curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
				curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
				curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
				curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
				// perform a cURL session
				$response = curl_exec($ch);

				// Check for errors
				if($response === FALSE)
				{
				  echo "Error in WindowsNotifications->sendNotifications: ".curl_error($ch);
				}
				// close a cURL session
				curl_close($ch);
				if($response === FALSE)
					return "Error in WindowsNotifications->sendNotifications: ".curl_error($ch);
				else
			   return true;
			}
			else
				return "Error in WindowsNotifications->sendNotifications: DeviceURI is null! Will skip message";

		}

	}


die BETA Version der mobilen App steht jetzt zur Verfügung! (ab Version 1.1.41)

Dazu einfach in den Einstellungen „Mobile App“ aktivieren und unter Verbindung eine Webfront Konfigurator auswählen. Zur Konfiguration auf dem IPS Server, bitte einfach der Dokufür die mobilen Apps (iOS / Android) folgen.

Pushbenachrichtigungen funktionieren nicht über das Modul vom IPS Server sondern über das von mir weiter oben beschrieben Modul.

Mit der Option „Modern UI Darstellung“ werden alle Kategorien auf der ersten ebene nebeneinander als Einträge dargestellt (so wie man das aus anderen Apps kennt). Alle Objekte welche nicht in einer Kategorie enthalten sind, werden in einer Kategorie (=Webfront Name) zusammengefasst. Bei der Verwendung von „Modern UI“ kann im moment nur max. eine weitere Kategorie in die Navigation gesprungen werden.

Was kann ips4Windows „Mobile App“?

  • Darstellung der Objekte analog der iOS/Android App
  • Darstellen von Variablen anhand der Variablen Profile
  • Ausführen von Aktionen (Schalter, Slider, Wertauswahl, Aufzählungen, Wheel, Skripte)
  • Darstellen von Medien Objekten (Bilder, Audio, Streams inkl. MJPEG)
  • Darstellung von Webseiten oder HTML Boxen

    Was geht noch nicht?
  • Farbauswahl, TextBoxen, Zyklische Ereignisse inkl. Wochenplan
  • TextBoxen und Strings im Editiermodus
  • Custom Icons
  • zustandsabhängige Icons
  • Charts

Hey Sebi!

Das sieht echt sehr cool aus und ich hab großes Interesse daran es mal auszuprobieren! Schon mal großes Lob für die Mühen! :slight_smile:

Aktuell bin ich noch auf keiner Kiste auf Win10 und derzeit werkelt auch noch kein IPS 4 bei mir, sodass ein Test bei mir noch etwas dauern wird. Dennoch schon mal eine Frage vorab:
Meine Überlegung war, wie ich am einfachsten die Sprachsteuerung in die einzelnen Räume bekomme. Da ich bisher dort noch keinerlei Tablets etc. für nutze war eine Idee vielleicht Win10 auf einen Raspberry Pi zu packen, an welchem dann noch irgendein gutes Mikro hängt. Wäre dies möglich, oder gibt es bezüglich des Pis irgendwelche Einschränkungen hinsichtlich deiner App?

Danke schon mal für die Info!

Servus

nette Sache die du da vorstellst.
Testen werd und wohl auch kaufen werd ichs schon. Das WF schön in eine App eingepackt würde mir gefallen.
Cortana und das Tiles Zeugs brauch ich persönlich nicht.

Leider wird es wohl noch einige Zeit dauern bis IPS4 für mich einsetzbar ist. zzt. viel zu instabil.

Aber wie wird das mit WIN Phone? Läuft dann auch nur das WF im Browser oder gibt es auch wieder „native“ so wie für Win Phone 8.
Deine aktuelle WinPhone App finde ich echt gut. Kein unnötiger Schnickschnak einfach nur Funktion. So soll es sein.

gruß
bb

Hi,

@Sketch:
auf einem PI2 mit Windows 10 würde zwar die App laufen, aber meines Wissens gibt es dort keine Möglichkeit über den Store. Zweites Problem, ich denke da gibt es keine Cortana APIs. Die Win 10 IoT hat ja keinen „Desktop“ - also wird das nichts mit dem PI2.

@bb
das mobile Webfrontend aus der ipsControl App bin ich gerade am implementieren. Die Idee ist identisch, der Code aber komplett neu um einige Designfehler zu beheben und näher an der iOS App zu bleiben was die Features angeht. So muss ich nicht bei jeder Änderung die Logik anpassen.

Sollte aber in ein paar Wochen dann auch fertig sein.

Grüße
Seb.

Moin,

erstmal vielen Dank.
Die App unter win8.1 läuft wieder.
Da habe ich auch gleich die unter win 10 Installiert.
Leider bekomme ich nicht so richtig eine Verbindung.
Vielleicht kannst Du mir einmal auf die Sprünge helfen, welche Verbindungsdaten ich hier genau eingeben muss.
IPS4 und die App sind auf dem selben Rechner…
Die Benutzerdaten, sind das die der Konsole oder des web?
Vielen Dank.
Gruß
Thomas

Hi SebiMann,

auch von mir noch mal vielen Dank für die App, das ist eine Super Ergänzung zu IPS für alle Windows Fans und die es durch Windows 10 noch oder wieder werden.

@Thomas ich vermute du hast unter dem Reiter „Interaktion“ noch nicht den ersten Schalter auf „IPS V4“ aktiviert. Dann sollte der Dialog unter dem Reiter Verbindung nur noch Einträge haben.

Wünsche allen viel Spaß und Erfolg mit der App, bin gespannt was sich daraus alles entickelt…
Grüße Helmut

Moin,
Vielen Dank.
Hatte ich tatsächlich nicht.
Trotzdem bin ich immer noch nicht weiter mit den Anmeldedaten.
Sind das die der Konsole?
In der Webkonfiguration habe ich keine.
Habe es mit und ohne probiert. Immer gibt er die Fehlermeldung: net_uri_BadFormat
Vielen Dank.
Gruß
Thomas

@Thomas: deine URL ist nicht korrekt, es fehlt ein / am Ende. http://192.168.1.1:3777/
ich korrigiere das beim schliessen der Settingsseite automatisch - aber vermutlich nicht wenn du direkt auf Sprachbefehle einlesen drückst.

Grüße
Seb.

Hallo SebiMann,

ich habe keine Sprachbefehle eingelesen.
Auch mit dem Strich am ende funktioniert es nicht.
Gruß
Thomas

Verbindung.jpg

bisschen genauere Fehlermeldung wäre hilfreich :slight_smile:
Was steht im Debug Log?

Kommst du mit der IPS Console auf dem Rechner auf den Server (Firewall)?
Hast du im Webfront Konfigurator ein Password unter Sicherheit eingetragen?

Grüße
Seb.

hast du dein Webfront wirklich auf Port 3777? Ich habe es von der älteren Version 3.X übernommen und dabei bleibt der alte Port bei mir 82 erhalten… und damit gilt ggf. dann der alte Port.

Ja, mit der Console komm ich drauf.
Port ist 3777
Log im Anhang.

würde ich gerne mal nachstellen, das verstehe ich nicht.

Kannst du mir bitte mal einen Screenshot von den Einstellungen (Darstellung, Verbindungen, Interaktion, Debug) per Mail schicken an ipscontrol@outlook.com würde das gerne mal testen.

Danach bitte folgendes versuchen, Einstellungsseite einmal schliessen und neu öffnen:
Darstellungen:

Verbindung:

Interaktion:
IPS V4.x aktivieren
Push und Cortana an

Wenn ich das so lese, dann fällt mir nur eins ein: Leider Geil!!!

Noch eins, das mir die Umstellung auf IPS V4 schmackhaft macht (das andere ist das Sonos Modul). Wenn man nur nicht so viel über die instabilitäten lesen würde :(.

Ich warte noch ein wenig auf IPS V4 und freue mich dann darauf, deine App zu test :).

P.s: Was hat es mit der iOS Anbindung auf sich?

Hi,

ich habe mich jetzt auch nochmal an ips4windows versucht.

Unter Windows10 Desktop habe ich es auch geschafft, zumindest ein Licht an und aus zu schalten.
Grundsätzlich geht es also bei mir.

Allerdings habe ich noch folgende Probleme:

Ich habe 6 Geräte im Script und das Script wird auch korrekt ausgeführt:


add 'Licht#Arbeitszimmer#46339#34828' as new content
append 'Licht#Heimkino#29792#56390' to existing content
append 'Deckenfluter#Heimkino#29792#56390' to existing content
append 'Deckenfluter#Wohnzimmer#53970#39067' to existing content
append 'Licht#Wohnzimmer#53501#26210' to existing content
append 'Licht#Esszimmer#57121#47447' to existing content
working on 6 sets of data

Beim Einlesen der App steht aber nur „1 Sprachbefehle geladen“.
Die Stringvariable liegt im mobile Bereich.

In meine Lumia 950 werden gar keine Sprachbefehle geladen.
Der Webkonfig wird gefunden, aber einladen: Fehlanzeige.

„HomeControl! Was kann ich sagen?“ Ruft immer nur den Webbrowser auf.
Gleiches gilt für „Haussteuerung“ oder einen selbstgewählten Begriff.

Konfig im Lumia wird nicht immer angenommen.
Habe herausgefunden, dass es am besten ist, zu ändern und dann App zu beenden.
Da solltest du auch noch mal schauen.

… Aber wenn das funktioniert ist’s cool :wink:

Bin noch auf IPS 3.4, V4 traue ich mich nicht. Ist mir die Liste der täglichen Fixes zu lang ;-).

Mic

Hi Mic,

danke für’s Feedback - ja da habe ich wohl ein wenig viel im Code aufgeräumt. Bei V3 führt der Druck in der App tatsächlich zu nichts. Habe das korrigiert und kommt mit dem nächsten Update.

Das Laden des Sprachfiles geschieht aktuell immer nur beim Neustart der App, oder aber beim Druck auf den Button in den Settings (wenn er funktioniert). Desktop und dein Handy sollten sich dabei vollkommen identisch Verhalten.
Allerdings dauert es ein wenig, teilweise bis zu 10 Sekunden bis Cortana das Sprachfile akzeptiert - ich habe das deshalb schon in einen eigenen Thread ausgelagert. Wenn du das Debug aktivierst, sieht man was da passiert (ReadVoiceCommands & RegisterVoiceCommandsThread, exit Thread). Bei einem eigenen AppNamen ist es hilfreich dann nochmal die App zu schliessen - Cortana ist da ein bißchen zickig :slight_smile:

Der Befehl zu Hilfe ist: „Was kann ich sagen?“ - dann erscheint die App mit den registrieren Namen in der Liste.

Grüße
Seb.

Moin,

habe es mit IPS4 und Windows 10 Tablet relativ problemlos zum laufen bekommen. Danke erstmal für die super Arbeit!
Die Ansprache „Homecontrol“ lässte sich bei mir noch nicht durch etwas anderes ersetzen - da scheint noch ein Bug zu sein.
Werde jetzt mal versuchen, ob man das irgendwie mit einem smartband/smartwach verknüpfen kann. Fühle mich ein wenig unwohl dabei wenn Cortana allen Unterhaltungen lauscht - und jedes Mal zum Tablet rennen und den Knopf für die Spracherkennung drücken erscheint mir auch keine Dauerlösung.

Beste Grüße,
HvS