SensorAndSwitch: Ideen Sammlung - Wunschliste

SAS Wetterstation auf Pi mit 480x320 TFT-Display:

Dazu nimmt man ein TFT-Display für den Pi zum Draufstecken auf die GPIOs. Dazu Treiber in Raspbian für das Display installieren. Danach verhält sich der Pi, wie ein Desktop-PC.

Nun gilt es, einige störende Dinge des Desktops zu unterbinden, um die komplette Fläche des TFT zur Anzeige nutzen zu können.

Ich habe dazu iceweasel installiert und in Iceweasel die Erweiterung Status4Evar. Damit kann man alle Browsereinblendungen von Linkzielen und Statusleisteninfos im Vollbildmodus F11 ausschalten.

Nun hat man eine 480x319 Pixel große Darstellungsfläche, die man mit PHP und CSS gestalten kann. ;) (1 Pixel schluckt die ausgeblendete Programmleiste von Raspbian bzw. iceweasel.)

Jezt muss noch der Mauszeiger weg. Das geht, indem man unclutter mit apt-get installiert. Wird die Maus nicht bewegt, wird sie nun ausgeblendet.

Noch den Bildschirmschzoner und den black-screen entfernen.

Wer Interesse an einer konkreten Umsetzung hat, möge hier posten. ;)

Theoretisch sind alle Arten von SAS-Anzeigen möglich.
 
SUPER ...

Da bin ich dabei, obwohl ganz wenig Zeit und DAU ... Aber ein Display habe ich zufälliger Weise rumliegen hatte es schon mal auf dem pi2, aber das mit dem Desktop ist ja Spielquatsch und nicht wirklich zu gebrauchen. Mit einer gut gestylten Oberfläche könnte das mit dem touch wirklich ein Wohnungsdiplay werden, dann würde ich mir sogar noch einen pi2 kaufen ....

Kannst Du mal Bilder posten?
 
Hier mal meine Beispielanzeigen:

tft1.png
ein Touch auf das Display bewirkt das Wechseln auf:
tft2.png

Theoretisch kann man auch bedienbare SAS-Buttons dort anzeigen lassen, wenn man ein Touch-TFT hat. Im Prinzip ist das Ganze ein kleiner ständig laufender Webbrowser.

Es können alle in der SAS-Datenbank abgespeicherten Werte zur Anzeige genutzt werden. Der Phantasie sind da keine Grenzen gesetzt. ;)
 
Zuletzt bearbeitet:
Noch eine Info:
Hängt man eine kabellose USB-Maus oder kabellose USB-Minitastatur dran, kann man die Anzeige auf dem Display auch aus der Ferne umschalten.

Sobald die Sprachsteuerung läuft, ginge dies auch per Zuruf.
 
Wie aufwändig ist das denn?

Ich bräuchte da drauf
Schalter 1 dect 200 Drucker
Schalter 2 dect 200 Heizstab
Schalter 3 dect 200 Beleuchtung
Info der Heizung Warmwasser, Raumtemp, Außentemp und aktueller Stromverbrauch
Zeile für Wetterinfos, heute + 4 Tage.

Klicken würde dann die Schalter betätigen und bei der Heizungszeile, die Temperaturen als Grafik, beim Wetter dann die Ausführliche Wetterinfos.

Klar ist das dann schon die Luxusvariante, aber wäre das Möglich und auch für einen Dau wie mich pflegbar?
 
Hallo,
Kann man eigentlich die Werte der DSL-Reiter (Fehler, Syncs, usw) irgendwie darstellen?
 
@HarryHase: Im Prinzip entspricht so ein Anzeigeschirm des TFT in etwa einem etwas groß geratenen psg. Die Nutzung ist ebenfalls sehr ähnlich. Bei mir haben sie schon eine eigene Bezeichnung: dispNAME.php und liegen im psg-Verzeichnis. Der Aufwand für das Erstellen und die Pflege also vergleichbar.

Disps können sich ja durch Anklicken gegenseitig aufrufen, das ist auch kein Problem, sodass man verschiedene Ansichten hat.


-
@SF1975: Oh, da bin ich überfragt, das könnte vielleicht koyaanisqatsi wissen, wie man an die Fritzboxdaten kommt. Kommt man an die Werte, kann mans darstellen.
 
Moins

Ja, ähem, ich geb die Frage weiter an PeterPawn, oder Pikachu. :mrgreen:

Ich hab es jetzt auch nicht nachgekramt, als erstes fallen mir TR-064/UPnP/SOAP Abfragen ein.
...vielleicht dann auch ein simples: "http://fritz.box/query.lua?DSLSTATS=[u.s.w.]&sid=[u.s.w.]"
Das wäre auch kein grösseres Problem, denn mit einer gültigen SID wird dass schon die halbe Miete sein. ;)
 
Zuletzt bearbeitet:
Danke für die Info. Warten wir auch mal ab, was bei der nächsten FB-Version überhaupt noch geht...

Zum TFT: Es gibt in der nächsten SAS Version 4.55 ein erweitertes Log, was auch manuelle Schaltvorgänge protokollieren kann; auch solche direkt an der Steckdose. Mit dieser Version wird es dann auch eine Beispiel-dispNAME.php geben und ein paar spezielle neue öffentlichen Funktionen. Vorher möchte ich noch die Sprachsteuerung realisieren, da die auf die gleiche SAS-Schnittstelle zugreifen wird. ;)
 
@JL3
Hi wollte mal fragen ob es möglich ist erstellte Kettenstart und Folgeglieder zu deaktivieren über eine Häkchen wie aktivieren und deaktivieren mit dem Hintergrund nicht die mühselig erstellten Glieder zu löschen wenn man sie zeitweilig deaktivieren möchte.

Gruß Benne007
 
Das hatte ich bis jetzt noch nicht erwägt einzubauen. Die Idee ist gut und ich habe sie gleich umgesetzt. Du kannst dir bis zur nächsten Version dadurch behelfen, die sasap.conf zu Editieren und das betreffende Kettenstartglied dort statt mit K mit I zu benennen.

Beispiel:

19,K,0,4,0,0,W,!0<=,1.1,Pi,Pi

in

19,I,0,4,0,0,W,!0<=,1.1,Pi,Pi

Dadurch wird es inaktiv und nicht mehr ausgeführt. Folgeglieder eines deaktivierten Startglieds werden dann ebenfalls logischerweise nicht mehr ausgeführt. ;)

Ist in der nächsten Version dann standardmäßig in der sasapui.php verfügbar. Nennt sich dann inaktives Kettenstartglied. ;)
 
@JL3
super das war ja schnell

vielen Dank Gruß Benne007
 
Da die neue Version noch etwas dauern wird, kann man auch die sasapui.php mit folgendem Inhalt ersetzen, um auch in der GUI Kettenstartglieder bereits jetzt schon inaktiv schalten zu können:

PHP:
<?php

	/*
		+---------------------------------------------------------------------+
		|                                                                     |
		|   SensorAndSwitch Automation Pro (User Interface)       (sasapui)   |
		|   ===============================================================   |
		|   Bearbeitung der Konfigurationsdatei                               |
		|                                                                     |
		|   (C)2014/15 BlueDragon                                             !
		|                                                                     |
		+---------------------------------------------------------------------+
	*/
	
	error_reporting(0);
	
	define ("PRG","SensorAndSwitch Automation Pro (UI)");
	include __DIR__."/include/vercpr.php";
	include __DIR__."/include/environ.php";
	include __DIR__."/include/functions.php";
	include __DIR__."/include/geraete.php";
	
	ob_start();

	ConfDat();
	ConfDefault();

	$Wt=array("*","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag");
	
	ConfIn();

	$Conf["PRG"]=PRG;
	$Conf["VER"]=intval(str_replace(".","",substr(VER,2)));
	
	ConfDef();

	date_default_timezone_set(ZEITZONE);
	
	HTMLKopf();
	HTMLBodyTop();

	session_start();
	
	ZeitErmitteln();
	GeraeteErmitteln();
	SchaltlisteEinlesen();	
	
	printf('<h1><center><table><tr>');
	if ($Conf["UPFENSTER"]=="nein") {
		printf ('<td><h1><a href="sasap.php">-</a></h1></td>');
		printf('<td><a href="'.$Conf["EURL"].'"><img style="height:20px;" src="'.PIC.'home.png"></a></td>');
	}
	printf('<td><img style="height:50px;" src="'.PIC.'logo.png"></td><td>'.PRG.' '.VER.'<br />'.CPR.'</td>');
	printf (
		'</tr></table></h1>'
	);
	printf ('<form name="sas" method="POST" action='.$PHP_SELF.'>');
	$Sel=WahlSchalterliste();
	$SI=AuswahlSchaltdatenErmitteln();
	SchaltdatenErfassen();
	printf ('<hr>');
	AuswahlButton();
	Entscheidung();
	printf ('</form>');

	HTMLBodyBottom();

	ob_end_flush();
	exit;


function GeraeteErmitteln() {
/*************************/
	global $GerListARR,$WGerListe,$WGerListeP,$WGerListeO,$WGerListe7,$WGerListe8,$WGerListe9,$WGerListe9a;
	global $fbARR,$psARR,$GerARRDat;
	
	$Sort="name";
	alleGeraeteX();
	sortGeraete();
	foreach ($GerListARR as $nr => $GerInfo) {
		if ($GerInfo["NoAuto"]!="1") {
			$GWatt=0;
			foreach ($GerListARR as $nrD => $GerInfoD) {
				if ($GerInfo["Typ"]=="Gruppe" and $GerInfo["Name"]==$GerInfoD["MemberOf"] and $GerInfoD["Typ"]=="Gerät") {
					$GWatt+=$GerInfoD["Watt"];
				}
			}
			if ($GerInfo["Typ"]=="Gruppe") {
				$GerListARR[$nr]["Watt"]=sprintf('%.3f',($GWatt));
			}
			$WGerListe[$nr]=array($GerInfo["Name"],$GerInfo["Typ"].": ".$GerInfo["Name"]);
			if ($GerListARR[$nr]["FBITP"]=="1" and strtoupper($GerListARR[$nr]["PSensor"][1])!="HTML") {
				$WGerListeP[$nr]=array($GerInfo["Name"],$GerInfo["Typ"].": ".$GerInfo["Name"]);
			}
			if ($GerListARR[$nr]["FBITO"]=="1") {
				$WGerListeO[$nr]=array($GerInfo["Name"],$GerInfo["Typ"].": ".$GerInfo["Name"]);
			}
			if ($GerListARR[$nr]["FBIT7"]=="1") {
				$WGerListe7[$nr]=array($GerInfo["Name"],$GerInfo["Typ"].": ".$GerInfo["Name"]);
			}
			if ($GerListARR[$nr]["FBIT8"]=="1") {
				$WGerListe8[$nr]=array($GerInfo["Name"],$GerInfo["Typ"].": ".$GerInfo["Name"]);
			}
			if ($GerListARR[$nr]["FBIT9"]=="1") {
				$WGerListe9[$nr]=array($GerInfo["Name"],$GerInfo["Typ"].": ".$GerInfo["Name"]);
				$WGerListe9a[$nr]=array($GerInfo["Name"],$GerInfo["Typ"].": ".$GerInfo["Name"]);
			}
		}
	}
	$WGerListe9[$nr+2]=array("-","nichts");
}	

	

function SchaltdatenErfassen() {
/****************************/
	global $Sel,$SI,$Schaltliste;
	global $Zeit,$SoWi,$SonnenAufgang,$SonnenUntergang;
	global $WGerListe,$WGerListeP,$WGerListeO,$WGerListe7,$WGerListe8,$WGerListe9,$WGerListe9a;
	global $WWochentag,$WTypen,$WSchalter,$WSchalterToggle,$WAktiv,$WSonnenaufgang,$WSonnenuntergang,$WBedingung,$WKette;
	if ($_POST["FSel"]==$Sel) {
		if (isset($_POST["FSI06"])) {
			$SI[6]=$_POST["FSI06"];
			$SI[5]="";
			$SI[7]="";
			$SI[8]="";
			$SI[9]="";
			$SI[10]="";
		}
	}
	
	$SI[6]=strtoupper($SI[6]);

	if ($SI[6]=="X") {
		$SI[7]=substr("****".$SI[7],-4);
	}
	if ($SI[6]=="X" or $SI[6]=="A" or $SI[6]=="U") {
		$SI[8]=substr("*".$SI[8],-1);
		$SI[9]=substr($SI[9]."********",0,8);
	}
	
	if ($SI[6]=="X" or $SI[6]=="A" or $SI[6]=="U" or $SI[6]=="O" or $SI[6]=="T" or $SI[6]=="W" or $SI[6]=="P" or $SI[6]=="S") {
		printf ('<hr><p>Schalttyp: ');
		printf ('<select onchange="sas.submit();" name="FSI06" size="1">');
		foreach ($WTypen as $nr => $WX) {
			if ($SI[6]==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
		printf ('<input type="hidden" name="FSel" value="'.$Sel.'">');
		printf ('</p>');
	}
	
	printf ('<hr>');
	if ($SI[1]=="K" and $SI[2]==0) {
		printf ('<p id="binfo">Nächster Schaltzeitpunkt: '.$Schaltliste[$Sel][7].'</p>');
	}
	printf ('<p>');

	if ($SI[6]=="X" or $SI[6]=="A" or $SI[6]=="U" or $SI[6]=="O" or $SI[6]=="T" or $SI[6]=="W" or $SI[6]=="P" or $SI[6]=="S") {
		printf (' [SCHID:'.$SI[0].'] ');
		printf ('<select name="FSI01" size="1">');
		foreach ($WKette as $nr => $WX) {
			if ($SI[1]==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>, SCHID des Folgekettengliedes ');
		printf ('<input type="text" name="FSI02" size="5" value="'.$SI[2].'">, Delay <input type="text" name="FSI03" size="5" value="'.$SI[3].'">, +Zufall <input type="text" name="FSI04" size="5" value="'.$SI[4].'">');		
		printf (' <br />');
	}
	
	if ($SI[6]=="X") {
		printf (' Wenn es ');
		printf ('<input type="text" name="FSI071" maxlength="2" size="2" value="'.substr($SI[7],0,2).'">:<input type="text" name="FSI072" maxlength="2" size="2" value="'.substr($SI[7],2,2).'"> Uhr ist');		
	}

	if ($SI[6]=="A" or $SI[6]=="U") {
		printf (' Wenn es ');
		printf ('<input type="text" name="FSI072" maxlength="4" size="4" value="'.abs($SI[7]).'"> Min.');
	}

	if ($SI[6]=="A") {
		printf (' ');
		printf ('<select name="FSI071" size="1">');
		foreach ($WSonnenaufgang as $nr => $WX) {
			if (substr(sprintf('%+d',$SI[7]),0,1)==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select> ist');
	}

	if ($SI[6]=="U") {
		printf (' ');
		printf ('<select name="FSI071" size="1">');
		foreach ($WSonnenuntergang as $nr => $WX) {
			if (substr(sprintf('%+d',$SI[7]),0,1)==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select> ist');
	}

	if ($SI[6]=="X" or $SI[6]=="A" or $SI[6]=="U") {
		printf (' </p><p> am Wochentag ');
		printf ('<select name="FSI08" size="1">');
		foreach ($WWochentag as $nr => $WX) {
			if ($SI[8]==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>,');
	}

	if ($SI[6]=="X" or $SI[6]=="A" or $SI[6]=="U") {
		printf (' den ');
		printf ('<input type="text" name="FSI091" maxlength="2" size="2" value="'.substr($SI[9],0,2).'">.<input type="text" name="FSI092" maxlength="2" size="2" value="'.substr($SI[9],2,2).'">.<input type="text" name="FSI093" maxlength="4" size="4" value="'.substr($SI[9],4,4).'">, ');		
	}

	if ($SI[6]=="O") {
		printf (' Wenn ');
		printf ('<select name="FSI09" size="1">');
		foreach ($WGerListeO as $nr => $WX) {
			if ($SI[9]==$WX[0] or substr($SI[9],0,1)==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
	}

	if ($SI[6]=="T") {
		printf (' Wenn ');
		printf ('<select name="FSI09" size="1">');
		foreach ($WGerListe8 as $nr => $WX) {
			if ($SI[9]==$WX[0] or substr($SI[9],0,1)==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
	}

	if ($SI[6]=="P") {
		printf (' Wenn ');
		printf ('<select name="FSI09" size="1">');
		foreach ($WGerListeP as $nr => $WX) {
			if ($SI[9]==$WX[0] or substr($SI[9],0,1)==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
	}

	if ($SI[6]=="W") {
		printf (' Wenn ');
		printf ('<select name="FSI09" size="1">');
		foreach ($WGerListe7 as $nr => $WX) {
			if ($SI[9]==$WX[0] or substr($SI[9],0,1)==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
	}

	if ($SI[6]=="S") {
		printf (' Wenn ');
		printf ('<select name="FSI09" size="1">');
		foreach ($WGerListe9a as $nr => $WX) {
			if ($SI[9]==$WX[0] or substr($SI[9],0,1)==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
	}

	if ($SI[6]=="O") {
		printf (' ');
		printf ('<select name="FSI07" size="1">');
		foreach ($WBedingung as $nr => $WX) {
			if ($SI[7]==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
	}

	if ($SI[6]=="O") {
		printf (' ');
		printf ('<input type="text" name="FSI08" maxlength="4" size="4" value="'.$SI[8].'"> Einheiten ist,');
	}

	if ($SI[6]=="T") {
		printf (' ');
		printf ('<select name="FSI07" size="1">');
		foreach ($WBedingung as $nr => $WX) {
			if ($SI[7]==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
	}

	if ($SI[6]=="T") {
		printf (' ');
		printf ('<input type="text" name="FSI08" maxlength="4" size="4" value="'.$SI[8].'"> °C warm ist,');
	}

	if ($SI[6]=="P") {
		printf (' ');
		printf ('<select name="FSI07" size="1">');
		foreach ($WBedingung as $nr => $WX) {
			if ($SI[7]==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
	}

	if ($SI[6]=="P") {
		printf (' ');
		printf ('<input type="text" name="FSI08" maxlength="4" size="4" value="'.$SI[8].'"> ist,');
	}

	if ($SI[6]=="W") {
		printf (' ');
		printf ('<select name="FSI07" size="1">');
		foreach ($WBedingung as $nr => $WX) {
			if ($SI[7]==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
	}

	if ($SI[6]=="W") {
		printf (' ');
		printf ('<input type="text" name="FSI08" maxlength="4" size="4" value="'.$SI[8].'"> Watt verbraucht,');
	}

	if ($SI[6]=="S") {
		printf (' ');
		printf ('<select name="FSI07" size="1">');
		foreach ($WAktiv as $nr => $WX) {
			if ($SI[7]==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
	}

	if ($SI[6]=="S") {
		printf (' ist und Schalter ');
		printf ('<select name="FSI08" size="1">');
		foreach ($WSchalter as $nr => $WX) {
			if ($SI[8]==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>,');
	}
	if ($SI[6]=="X" or $SI[6]=="A" or $SI[6]=="U" or $SI[6]=="O" or $SI[6]=="T" or $SI[6]=="W" or $SI[6]=="P" or $SI[6]=="S") {
		printf (' </p><p> dann schalte von ');
		printf ('<select name="FSI10" size="1">');
		foreach ($WGerListe9 as $nr => $WX) {
			if ($SI[10]==$WX[0] or substr($SI[10],0,1)==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>');
	}
	
	if ($SI[6]=="X" or $SI[6]=="A" or $SI[6]=="U" or $SI[6]=="O" or $SI[6]=="T" or $SI[6]=="W" or $SI[6]=="P" or $SI[6]=="S") {
		printf (' den Schalter ');
		printf ('<select name="FSI05" size="1">');
		foreach ($WSchalterToggle as $nr => $WX) {
			if ($SI[5]==$WX[0]) {$selected=' selected="selected"';} else {$selected='';}
			printf ('<option value="'.$WX[0].'"'.$selected.'>'.$WX[1].'</option>');
		}
		printf ('</select>.');
	}

	printf (' </p>');
}	

	
function Entscheidung() {
/*********************/
	global $Sel,$SI,$pseudoURL;
	if ($_POST["Löschen"]=="Löschen") {
		$_SESSION['button']="CLEAR";
		$Text='Schaltvorgang "'.SchaltlisteElDel($Sel).'" wurde gelöscht.';
		$_SESSION['inhalt']=$Text;
		session_write_close();
		header("Location: ".$_SERVER["PHP_SELF"]);
	}
	if ($_POST["OK"]=="OK") {
		$_SESSION['button']="OK";
		
		$SI[1]=$_POST["FSI01"];
		$SI[2]=$_POST["FSI02"];
		$SI[3]=$_POST["FSI03"];
		$SI[4]=$_POST["FSI04"];
		$SI[5]=$_POST["FSI05"];
		$SI[6]=$_POST["FSI06"];
		$SI[6]=strtoupper($SI[6]);
		if ($SI[6]=="X") {
			$SI[7]=$_POST["FSI071"].$_POST["FSI072"];
			$SI[8]=$_POST["FSI08"];
			$SI[9]=$_POST["FSI091"].$_POST["FSI092"].$_POST["FSI093"];
			$SI[10]=$_POST["FSI10"];
		}
		if ($SI[6]=="A" or $SI[6]=="U") {
			$SI[7]=intval($_POST["FSI071"].$_POST["FSI072"]);
			$SI[8]=$_POST["FSI08"];
			$SI[9]=$_POST["FSI091"].$_POST["FSI092"].$_POST["FSI093"];
			$SI[10]=$_POST["FSI10"];
		}
		if ($SI[6]=="W") {
			$SI[7]=$_POST["FSI07"];
			$SI[8]=str_replace(',', '.',$_POST["FSI08"]);
			$SI[9]=$_POST["FSI09"];
			$SI[10]=$_POST["FSI10"];
		}
		if ($SI[6]=="P") {
			$SI[7]=$_POST["FSI07"];
			$SI[8]=str_replace(',', '.',$_POST["FSI08"]);
			$SI[9]=$_POST["FSI09"];
			$SI[10]=$_POST["FSI10"];
		}
		if ($SI[6]=="O") {
			$SI[7]=$_POST["FSI07"];
			$SI[8]=str_replace(',', '.',$_POST["FSI08"]);
			$SI[9]=$_POST["FSI09"];
			$SI[10]=$_POST["FSI10"];
		}
		if ($SI[6]=="T") {
			$SI[7]=$_POST["FSI07"];
			$SI[8]=str_replace(',', '.',$_POST["FSI08"]);
			$SI[9]=$_POST["FSI09"];
			$SI[10]=$_POST["FSI10"];
		}
		if ($SI[6]=="S") {
			$SI[7]=$_POST["FSI07"];
			$SI[8]=$_POST["FSI08"];
			$SI[9]=$_POST["FSI09"];
			$SI[10]=$_POST["FSI10"];
		}
		if ($SI[6]=="X") {
			$SI[7]=substr("****".$SI[7],-4);
		}
		if ($SI[6]=="X" or $SI[6]=="A" or $SI[6]=="U") {
			$SI[8]=substr("*".$SI[8],-1);
			$SI[9]=substr($SI[9]."********",0,8);
		}
				
		if ($Sel!=0) {
			$Text='Schaltvorgang "['.SchaltlisteElAdd($SI).']" wurde geändert.';
		}
		else {
			$Text='Schaltvorgang "['.SchaltlisteElAdd($SI).']" wurde hinzugefügt.';
		}
		$_SESSION['inhalt']=$Text;
		session_write_close();
		header("Location: ".$_SERVER["PHP_SELF"]);
	}
	if (isset($_SESSION['button'])) {
		$button=$_SESSION['button'];
		if ($button=="OK") {
			printf ('<hr><p id="binfo">'.$_SESSION['inhalt'].'<p>');
		}
		if ($button=="CLEAR") {
			printf ('<hr><p id="binfo">'.$_SESSION['inhalt'].'<p>');
		}
		session_unset();
	}
}
	
	
function AuswahlButton() {
/**********************/
	global $Sel,$Conf;
	printf ('<p>');
	if ($Sel!=0) {
		printf ('<input id="buttonloeschen" type="submit" value="Löschen" name="Löschen">');
	}
	printf (' ');
	printf ('<input id="buttonok" type="submit" value="OK" name="OK">');
	printf ('</p>');
}
	

function AuswahlSchaltdatenErmitteln() {
/************************************/
	global $Sel;
	global $Schaltliste,$AlleSchaltdaten;
	$ASD="";
	foreach ($AlleSchaltdaten as $nr => $SD) {
		if ($Schaltliste[$Sel][0]==$SD) {
			$ASD=$SD;
		}
	}
	if (substr($ASD,0,1)=="#") {
		$ASD="0,K,0,0,0,0,X,****,*,********,";
	}
	return explode(",",trim($ASD));
}
	

function WahlSchalterliste() {
/**************************/
	global $Sel;
	global $Schaltliste,$AlleSchaltdaten;
	printf ('<h2>Schaltliste:</h2>');
	$CLi=count($Schaltliste);
	if ($CLi>15) {
		$CLi=15;
	}
	printf ('<select onchange="sas.submit();" name="FSchalterliste" size="'.$CLi.'">');
	if (!isset($Sel)) {
		$Sel=0;
	}
	if (isset($_POST['FSchalterliste'])) {
		$Sel=$_POST['FSchalterliste'];
	}
	foreach ($Schaltliste as $nr => $SL ) {
		$selected="";
		if ($Sel==$nr) {
			$selected=' selected="selected"';
		}
		printf ('<option value="'.$nr.'"'.$selected.'>'.$SL[1].'</option>');
	}
	printf ('</select>');
	return $Sel;
}
	

function SchaltlisteElAdd($El) {
/****************************/
	global $Sel;
	global $SchaltConfigPro;
	global $Schaltliste,$AlleSchaltdaten;
	$SelX=$Sel;

	if ($Sel==0) {
		$neueSCHID=false;
		$SCHID=1;
		while (!$neueSCHID) {
			$belegt=false;
			foreach ($AlleSchaltdaten as $n => $Schaltdaten) {
				$AlleSchaltdaten[$n]=trim($AlleSchaltdaten[$n]);
				$SI=explode(",",trim($Schaltdaten));
				if ($SI[0]==$SCHID) {
					$belegt=true;
				}
			}
			if (!$belegt) {
				$neueSCHID=true;
				$El[0]=$SCHID;
				break;
			}
			$SCHID+=1;
		}
	}

	$iEl=implode(",",$El);
	if ($Sel==0) {
		$AlleSchaltdaten=array_merge(array_slice($AlleSchaltdaten,0,1),(array)$iEl,array_slice($AlleSchaltdaten,1));
	}
	else {
		$AlleSchaltdaten=array_merge(array_slice($AlleSchaltdaten,0,$Sel),(array)$iEl,array_slice($AlleSchaltdaten,$Sel+1));
	}
	$Status=$El[0];
	foreach ($AlleSchaltdaten as $n => $Schaltdaten) {
		if ($n==0) {
			$Typ1[$n]="0";
			$Typ2[$n]="0";
			$Typ3[$n]="0";
			$Typ4[$n]="0";
			$Typ5[$n]="0";
		}
		else {
			$SI=explode(",",trim($Schaltdaten));
			$Typ1[$n]=strtolower($SI[6]);
			$Typ2[$n]=$SI[7];
			$Typ3[$n]=$SI[8];
			$Typ4[$n]=$SI[9];
			$Typ5[$n]=$SI[10];
		}
	}
	array_multisort($Typ1,SORT_ASC,$Typ2,SORT_ASC,$Typ3,SORT_ASC,$Typ4,SORT_ASC,$Typ5,SORT_ASC,$AlleSchaltdaten);
	$fp=fopen($SchaltConfigPro,"w");
		for ($i=0;$i<count($AlleSchaltdaten);$i++) {
			if ($i!=0) {
				fputs($fp,"\n"); 
			}
			fputs($fp,trim($AlleSchaltdaten[$i])); 
		}
	fclose($fp);
	SchaltlisteEinlesen();
	return $Status;
}


function SchaltlisteElDel($El) {
/****************************/
	global $SchaltConfigPro;
	global $Schaltliste,$AlleSchaltdaten;
	$Status=$Schaltliste[$El][1];
	unset ($AlleSchaltdaten[$Schaltliste[$El][2]]);
	$AlleSchaltdaten=array_merge($AlleSchaltdaten);
	foreach ($AlleSchaltdaten as $n => $Schaltdaten) {
		if ($n==0) {
			$Typ1[$n]="0";
			$Typ2[$n]="0";
			$Typ3[$n]="0";
			$Typ4[$n]="0";
			$Typ5[$n]="0";
		}
		else {
			$SI=explode(",",trim($Schaltdaten));
			$Typ1[$n]=strtolower($SI[6]);
			$Typ2[$n]=$SI[7];
			$Typ3[$n]=$SI[8];
			$Typ4[$n]=$SI[9];
			$Typ5[$n]=$SI[10];
		}
	}
	array_multisort($Typ1,SORT_ASC,$Typ2,SORT_ASC,$Typ3,SORT_ASC,$Typ4,SORT_ASC,$Typ5,SORT_ASC,$AlleSchaltdaten);
	$fp=fopen($SchaltConfigPro,"w");
		for ($i=0;$i<count($AlleSchaltdaten);$i++) {
			if ($i!=0) {
				fputs($fp,"\n"); 
			}
			fputs($fp,trim($AlleSchaltdaten[$i])); 
		}
	fclose($fp);
	SchaltlisteEinlesen();
	return $Status;
}	
	
	
function SchaltlisteEinlesen() {
/****************************/
	global $SchaltConfigPro;
	global $GerListARR,$WGerListe,$WGerListeP,$WGerListeO,$WGerListe7,$WGerListe8,$WGerListe9,$WGerListe9a;
	global $Schaltliste,$AlleSchaltdaten;
	global $Zeit,$SonnenAufgang,$SonnenUntergang,$SonnenAufgangM,$SonnenUntergangM;
	global $WWochentag,$WTypen,$WSchalter,$WSchalterToggle,$WAktiv,$WSonnenaufgang,$WSonnenuntergang,$WBedingung,$WKette;
	global $Wt;
	$AlleSchaltdaten=file($SchaltConfigPro);
	$Liste=array();
	$ListeDAT=array();
	$nn=-1;
	$AlleSchaltdaten[0]="# ".PRG." ".VER." ".CPR;

	foreach ($AlleSchaltdaten as $n => $Schaltdaten) {
		if ($n==0) {
			$Typ1[$n]="0";
			$Typ2[$n]="0";
			$Typ3[$n]="0";
		}
		else {
			$SI=explode(",",trim($Schaltdaten));
			$Typ1[$n]=strtolower($SI[6]);
			$Typ2[$n]=$SI[7];
			$Typ3[$n]=$SI[8];
		}
	}
	array_multisort($Typ1,SORT_ASC,$Typ2,SORT_ASC,$Typ3,SORT_ASC,$AlleSchaltdaten);
	
	foreach ($AlleSchaltdaten as $n => $Schaltdaten) {
		$AlleSchaltdaten[$n]=trim($AlleSchaltdaten[$n]);
		$GD=array();
		$GDX=array();
		$SI=explode(",",trim($Schaltdaten));
		$SI[6]=strtoupper($SI[6]);
		if ($SI[5]=="0" or $SI[5]=="1" or $SI[5]=="T") {
			$Schaltzeit="0000000000000";
			if ($SI[5]=="0") {
				$Schalter="aus";
			}
			if ($SI[5]=="1") {
				$Schalter="an";
			}
			if ($SI[5]=="T") {
				$Schalter="toggle";
			}
			$Geraet=$SI[10];
			if ($SI[6]=="X") {
				foreach ($GerListARR as $nr => $inhalt) {
					if ($inhalt["Name"]==$SI[10]) {
						$GD["Aktiv"]=$inhalt["Aktiv"];
						$GD["Name"]=$inhalt["Name"];
						$GD["AIN"]=$inhalt["AIN"];
						$GD["Temp"]=$inhalt["Temp"];
						$GD["Watt"]=$inhalt["Watt"];
						$GD["PSensor"]=$inhalt["PSensor"];
						$GD["Schalter"]=$inhalt["Schalter"];						
					}
				}
				$SI[7]=substr("****".$SI[7],-4);
				$SI[8]=substr("*".$SI[8],-1);
				$SI[9]=substr($SI[9]."********",0,8);
				$Schaltzeit=$SI[7].$SI[8].$SI[9];
				for($i=0;$i<=12; ++$i) {
					if (substr($Schaltzeit,$i,1)=="*") {
						$Schaltzeit=substr_replace($Schaltzeit,substr($Zeit,$i,1),$i,1);
					}
				}
			}
			if ($SI[6]=="A") {
				foreach ($GerListARR as $nr => $inhalt) {
					if ($inhalt["Name"]==$SI[10]) {
						$GD["Aktiv"]=$inhalt["Aktiv"];
						$GD["Name"]=$inhalt["Name"];
						$GD["AIN"]=$inhalt["AIN"];
						$GD["Temp"]=$inhalt["Temp"];
						$GD["Watt"]=$inhalt["Watt"];
						$GD["PSensor"]=$inhalt["PSensor"];
						$GD["Schalter"]=$inhalt["Schalter"];						
					}
				}
				$SI[8]=substr("*".$SI[8],-1);
				$SI[9]=substr($SI[9]."********",0,8);
				$Schaltzeit="0000".$SI[8].$SI[9];
				$Abweichung=$SI[7];
				for($i=0;$i<=12; ++$i) {
					if (substr($Schaltzeit,$i,1)=="*") {
						$Schaltzeit=substr_replace($Schaltzeit,substr($Zeit,$i,1),$i,1);
					}
				}
				$SAA=date("HiNdmY",(mktime(substr($SonnenAufgang,0,2),substr($SonnenAufgang,2,2),0,substr($Schaltzeit,7,2),substr($Schaltzeit,5,2),substr($Schaltzeit,9,4)))+(60*$Abweichung));
				if (strpos($SI[9],"*")===false) {$Stern="nein";} else {$Stern="ja";}
				if (substr($Zeit,9,4).substr($Zeit,7,2).substr($Zeit,5,2).substr($Zeit,4,1).substr($Zeit,0,4)>substr($SAA,9,4).substr($SAA,7,2).substr($SAA,5,2).substr($SAA,4,1).substr($SAA,0,4) and $Stern=="ja") {
					$Schaltzeit=date("HiNdmY",(mktime(substr($SonnenAufgangM,0,2)+24,substr($SonnenAufgangM,2,2),0,substr($Schaltzeit,7,2),substr($Schaltzeit,5,2),substr($Schaltzeit,9,4)))+(60*$Abweichung));
				}
				else {
					if (substr($Zeit,9,4).substr($Zeit,7,2).substr($Zeit,5,2)<substr($SAA,9,4).substr($SAA,7,2).substr($SAA,5,2) and $Stern=="ja") {
						$Schaltzeit=date("HiNdmY",(mktime(substr($SonnenAufgangM,0,2),substr($SonnenAufgangM,2,2),0,substr($Schaltzeit,7,2),substr($Schaltzeit,5,2),substr($Schaltzeit,9,4)))+(60*$Abweichung));
					}
					else {
						$Schaltzeit=date("HiNdmY",(mktime(substr($SonnenAufgang,0,2),substr($SonnenAufgang,2,2),0,substr($Schaltzeit,7,2),substr($Schaltzeit,5,2),substr($Schaltzeit,9,4)))+(60*$Abweichung));
					}
				}
			}
			if ($SI[6]=="U") {
				foreach ($GerListARR as $nr => $inhalt) {
					if ($inhalt["Name"]==$SI[10]) {
						$GD["Aktiv"]=$inhalt["Aktiv"];
						$GD["Name"]=$inhalt["Name"];
						$GD["AIN"]=$inhalt["AIN"];
						$GD["Temp"]=$inhalt["Temp"];
						$GD["Watt"]=$inhalt["Watt"];
						$GD["PSensor"]=$inhalt["PSensor"];
						$GD["Schalter"]=$inhalt["Schalter"];						
					}
				}
				$SI[8]=substr("*".$SI[8],-1);
				$SI[9]=substr($SI[9]."********",0,8);
				$Schaltzeit="0000".$SI[8].$SI[9];
				$Abweichung=$SI[7];
				for($i=0;$i<=12; ++$i) {
					if (substr($Schaltzeit,$i,1)=="*") {
						$Schaltzeit=substr_replace($Schaltzeit,substr($Zeit,$i,1),$i,1);
					}
				}
				$SUA=date("HiNdmY",(mktime(substr($SonnenUntergang,0,2),substr($SonnenUntergang,2,2),0,substr($Schaltzeit,7,2),substr($Schaltzeit,5,2),substr($Schaltzeit,9,4)))+(60*$Abweichung));
				if (strpos($SI[9],"*")===false) {$Stern="nein";} else {$Stern="ja";}
				if (substr($Zeit,9,4).substr($Zeit,7,2).substr($Zeit,5,2).substr($Zeit,4,1).substr($Zeit,0,4)>substr($SUA,9,4).substr($SUA,7,2).substr($SUA,5,2).substr($SUA,4,1).substr($SUA,0,4) and $Stern=="ja") {
					$Schaltzeit=date("HiNdmY",(mktime(substr($SonnenUntergangM,0,2)+24,substr($SonnenUntergangM,2,2),0,substr($Schaltzeit,7,2),substr($Schaltzeit,5,2),substr($Schaltzeit,9,4)))+(60*$Abweichung));
				}
				else {
					if (substr($Zeit,9,4).substr($Zeit,7,2).substr($Zeit,5,2)<substr($SUA,9,4).substr($SUA,7,2).substr($SUA,5,2) and $Stern=="ja") {
						$Schaltzeit=date("HiNdmY",(mktime(substr($SonnenUntergangM,0,2),substr($SonnenUntergangM,2,2),0,substr($Schaltzeit,7,2),substr($Schaltzeit,5,2),substr($Schaltzeit,9,4)))+(60*$Abweichung));
					}
					else {
						$Schaltzeit=date("HiNdmY",(mktime(substr($SonnenUntergang,0,2),substr($SonnenUntergang,2,2),0,substr($Schaltzeit,7,2),substr($Schaltzeit,5,2),substr($Schaltzeit,9,4)))+(60*$Abweichung));
					}
				}
			}
			if ($SI[6]=="S" or $SI[6]=="W" or $SI[6]=="O" or $SI[6]=="T" or $SI[6]=="P") {
				foreach ($GerListARR as $nr => $inhalt) {
					if ($inhalt["Name"]==$SI[10]) {
						$GD["Aktiv"]=$inhalt["Aktiv"];
						$GD["Name"]=$inhalt["Name"];
						$GD["AIN"]=$inhalt["AIN"];
						$GD["Temp"]=$inhalt["Temp"];
						$GD["Watt"]=$inhalt["Watt"];
						$GD["PSensor"]=$inhalt["PSensor"];
						$GD["Schalter"]=$inhalt["Schalter"];						
					}
				}
				foreach ($GerListARR as $nr => $inhalt) {
					if ($inhalt["Name"]==$SI[9]) {
						$GDX["Aktiv"]=$inhalt["Aktiv"];
						$GDX["Name"]=$inhalt["Name"];
						$GDX["AIN"]=$inhalt["AIN"];
						$GDX["Temp"]=$inhalt["Temp"];
						$GDX["Watt"]=$inhalt["Watt"];
						$GDX["PSensor"]=$inhalt["PSensor"];
						$GDX["Schalter"]=$inhalt["Schalter"];						
					}
				}
				if ($SI[6]=="S") {
					if ($SI[7]==$GDX["Aktiv"] and $SI[8]==$GDX["Schalter"]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]==$GDX["Aktiv"] and $GDX["Aktiv"]=="0") {
						$Schaltzeit=$Zeit;
						$GDX["Aktiv"]="0";
						$GDX["Schalter"]="2";
						$GDX["Watt"]="-";
						$GDX["Temp"]="-";
						$GDX["PSensor"][0]="-";
					}
				}
				if ($SI[6]=="W" and $GDX["Aktiv"]=="1" and $GDX["Schalter"]>0) {
					if ($SI[7]==">" and $GDX["Watt"]>$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]==">=" and $GDX["Watt"]>=$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="=" and $GDX["Watt"]==$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="==" and $GDX["Watt"]==$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="<" and $GDX["Watt"]<$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="<=" and $GDX["Watt"]<=$SI[8]) {
						$Schaltzeit=$Zeit;
					}
				}
				if ($SI[6]=="T" and $GDX["Aktiv"]=="1") {
					if ($SI[7]==">" and $GDX["Temp"]>$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]==">=" and $GDX["Temp"]>=$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="=" and $GDX["Temp"]==$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="==" and $GDX["Temp"]==$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="<" and $GDX["Temp"]<$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="<=" and $GDX["Temp"]<=$SI[8]) {
						$Schaltzeit=$Zeit;
					}
				}
				if ($SI[6]=="O" and $GDX["Aktiv"]=="1") {
					if ($SI[7]==">" and $GDX["Einheiten"]>$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]==">=" and $GDX["Einheiten"]>=$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="=" and $GDX["Einheiten"]==$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="==" and $GDX["Einheiten"]==$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="<" and $GDX["Einheiten"]<$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="<=" and $GDX["Einheiten"]<=$SI[8]) {
						$Schaltzeit=$Zeit;
					}
				}
				if ($SI[6]=="P" and $GDX["Aktiv"]=="1") {
					if ($SI[7]==">" and $GDX["PSensor"][0]>$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]==">=" and $GDX["PSensor"][0]>=$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="=" and $GDX["PSensor"][0]==$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="==" and $GDX["PSensor"][0]==$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="<" and $GDX["PSensor"][0]<$SI[8]) {
						$Schaltzeit=$Zeit;
					}
					if ($SI[7]=="<=" and $GDX["PSensor"][0]<=$SI[8]) {
						$Schaltzeit=$Zeit;
					}
				}
			}
			$SI[11]=substr($Schaltzeit,9,4).substr($Schaltzeit,7,2).substr($Schaltzeit,5,2).substr($Schaltzeit,4,1).substr($Schaltzeit,0,4);
			$SI[12]=substr($Schaltzeit,0,2).":".substr($Schaltzeit,2,2)." ".substr($WWochentag[substr($Schaltzeit,4,1)][1],0,2).", ".substr($Schaltzeit,5,2).".".substr($Schaltzeit,7,2).".".substr($Schaltzeit,9,4);
			$SI[13]=substr($Zeit,9,4).substr($Zeit,7,2).substr($Zeit,5,2).substr($Zeit,4,1).substr($Zeit,0,4);
			if (strpos($SI[9],"*")===false) {$Stern="nein";} else {$Stern="ja";}
			if ($Schaltzeit=="0000000000000") {
				$SI[12]="bei erfüllter Bedingung";
			}
			else {
				if ($SI[13]>$SI[11] and $Stern=="ja") {
					$SI[12]="bei erfüllter Platzhalterersetzung (heute nicht)";
				}
				if (($SI[13]>$SI[11]) and ($SI[6]=="X" or $SI[6]=="A" or $SI[6]=="U") and $Stern=="ja") {
					$SI[12]="bei erfüllter Platzhalterersetzung (heute nicht)";
				}
				if (($SI[13]>$SI[11]) and ($SI[6]=="X" or $SI[6]=="A" or $SI[6]=="U") and $Stern=="nein") {
					$SI[12]="Schaltzeitpunkt überschritten!";
				}
			}
		}
		if (substr($SI[5],0,1)=="#") {
			$SI[6]="";
		}
		if ($nn==-1) {
			$nn++;
			$Liste[$nn]="--- neuer Eintrag ---";
			$SI[6]="-";
		}
		if ($SI[6]=="X") {
			$nn++;
			$WTA=$SI[8];
			if ($WTA!="*") {
				$WTA="am ".$Wt[$SI[8]].", den";
				}
			else {
				$WTA="an jedem Wochentag am";
			}
			$Liste[$nn]="[".$SI[0]."] ".$SI[1]." [".$SI[2]."] ".$SI[3].",".$SI[4]." - Zeitpunkt: "."(".$SI[10].")"." um ".substr($SI[7],0,2).":".substr($SI[7],2,2)." ".$WTA." ".substr($SI[9],0,2).".".substr($SI[9],2,2).".".substr($SI[9],4,4);
			if ($SI[5]=="0") {
				$Liste[$nn]=$Liste[$nn]." ausschalten.";
			}
			if ($SI[5]=="1") {
				$Liste[$nn]=$Liste[$nn]." einschalten.";
			}
			if ($SI[5]=="T") {
				$Liste[$nn]=$Liste[$nn]." umschalten.";
			}
			$ListeDAT[$n]=$Liste[$nn];
		}
		if ($SI[6]=="A") {
			$nn++;
			$WTA=$SI[8];
			if ($WTA!="*") {
				$WTA="am ".$Wt[$SI[8]].", den";
				}
			else {
				$WTA="an jedem Wochentag am";
			}
			$Liste[$nn]="[".$SI[0]."] ".$SI[1]." [".$SI[2]."] ".$SI[3].",".$SI[4]." - Sonnenaufgang: "."(".$SI[10].")";
			if (intval($SI[7])==0) {
				$Liste[$nn]=$Liste[$nn]." zum Sonnenaufgang ";
			}
			if (intval($SI[7])>0) {
				$Liste[$nn]=$Liste[$nn]." ".abs($SI[7])." Min. nach Sonnenaufgang ";
			}
			if (intval($SI[7])<0) {
				$Liste[$nn]=$Liste[$nn]." ".abs($SI[7])." Min. vor Sonnenaufgang ";
			}
			$Liste[$nn]=$Liste[$nn]." ".$WTA." ".substr($SI[9],0,2).".".substr($SI[9],2,2).".".substr($SI[9],4,4);
			if ($SI[5]=="0") {
				$Liste[$nn]=$Liste[$nn]." ausschalten.";
			}
			if ($SI[5]=="1") {
				$Liste[$nn]=$Liste[$nn]." einschalten.";
			}
			if ($SI[5]=="T") {
				$Liste[$nn]=$Liste[$nn]." umschalten.";
			}
			$ListeDAT[$n]=$Liste[$nn];
		}
		if ($SI[6]=="U") {
			$nn++;
			$WTA=$SI[8];
			if ($WTA!="*") {
				$WTA="am ".$Wt[$SI[8]].", den";
				}
			else {
				$WTA="an jedem Wochentag am";
			}
			$Liste[$nn]="[".$SI[0]."] ".$SI[1]." [".$SI[2]."] ".$SI[3].",".$SI[4]." - Sonnenuntergang: "."(".$SI[10].")";
			if (intval($SI[7])==0) {
				$Liste[$nn]=$Liste[$nn]." zum Sonnenuntergang ";
			}
			if (intval($SI[7])>0) {
				$Liste[$nn]=$Liste[$nn]." ".abs($SI[7])." Min. nach Sonnenuntergang ";
			}
			if (intval($SI[7])<0) {
				$Liste[$nn]=$Liste[$nn]." ".abs($SI[7])." Min. vor Sonnenuntergang ";
			}
			$Liste[$nn]=$Liste[$nn]." ".$WTA." ".substr($SI[9],0,2).".".substr($SI[9],2,2).".".substr($SI[9],4,4);
			if ($SI[5]=="0") {
				$Liste[$nn]=$Liste[$nn]." ausschalten.";
			}
			if ($SI[5]=="1") {
				$Liste[$nn]=$Liste[$nn]." einschalten.";
			}
			if ($SI[5]=="T") {
				$Liste[$nn]=$Liste[$nn]." umschalten.";
			}
			$ListeDAT[$n]=$Liste[$nn];
		}
		if ($SI[6]=="W") {
			$nn++;
			$Liste[$nn]="[".$SI[0]."] ".$SI[1]." [".$SI[2]."] ".$SI[3].",".$SI[4]." - Verbrauch: "."(".$SI[10].")";
			if ($SI[5]=="0") {
				$Liste[$nn]=$Liste[$nn]." ausschalten,";
			}
			if ($SI[5]=="1") {
				$Liste[$nn]=$Liste[$nn]." einschalten,";
			}
			if ($SI[5]=="T") {
				$Liste[$nn]=$Liste[$nn]." umschalten.";
			}
			$Liste[$nn]=$Liste[$nn]." wenn (".$SI[9].") ".$SI[7]." ".number_format($SI[8],3,",",".")." Watt verbraucht.";
			$ListeDAT[$n]=$Liste[$nn];
		}
		if ($SI[6]=="T") {
			$nn++;
			$Liste[$nn]="[".$SI[0]."] ".$SI[1]." [".$SI[2]."] ".$SI[3].",".$SI[4]." - Temperatur: "."(".$SI[10].")";
			if ($SI[5]=="0") {
				$Liste[$nn]=$Liste[$nn]." ausschalten,";
			}
			if ($SI[5]=="1") {
				$Liste[$nn]=$Liste[$nn]." einschalten,";
			}
			if ($SI[5]=="T") {
				$Liste[$nn]=$Liste[$nn]." umschalten.";
			}
			$Liste[$nn]=$Liste[$nn]." wenn (".$SI[9].") ".$SI[7]." ".number_format($SI[8],3,",",".")." °C warm ist.";
			$ListeDAT[$n]=$Liste[$nn];
		}
		if ($SI[6]=="O") {
			$nn++;
			$Liste[$nn]="[".$SI[0]."] ".$SI[1]." [".$SI[2]."] ".$SI[3].",".$SI[4]." - Einheiten: "."(".$SI[10].")";
			if ($SI[5]=="0") {
				$Liste[$nn]=$Liste[$nn]." ausschalten,";
			}
			if ($SI[5]=="1") {
				$Liste[$nn]=$Liste[$nn]." einschalten,";
			}
			if ($SI[5]=="T") {
				$Liste[$nn]=$Liste[$nn]." umschalten.";
			}
			$Liste[$nn]=$Liste[$nn]." wenn (".$SI[9].") ".$SI[7]." ".number_format($SI[8],3,",",".")." Einheiten ist.";
			$ListeDAT[$n]=$Liste[$nn];
		}
		if ($SI[6]=="P") {
			$nn++;
			$Liste[$nn]="[".$SI[0]."] ".$SI[1]." [".$SI[2]."] ".$SI[3].",".$SI[4]." - Sensor: "."(".$SI[10].")";
			if ($SI[5]=="0") {
				$Liste[$nn]=$Liste[$nn]." ausschalten,";
			}
			if ($SI[5]=="1") {
				$Liste[$nn]=$Liste[$nn]." einschalten,";
			}
			if ($SI[5]=="T") {
				$Liste[$nn]=$Liste[$nn]." umschalten.";
			}
			$Liste[$nn]=$Liste[$nn]." wenn (".$SI[9].") ".$SI[7]." ".number_format($SI[8],3,",",".")." ".$GDX["PSensor"][1]." ist.";
			$ListeDAT[$n]=$Liste[$nn];
		}
		if ($SI[6]=="S") {
			$nn++;
			$Liste[$nn]="[".$SI[0]."] ".$SI[1]." [".$SI[2]."] ".$SI[3].",".$SI[4]." - Schalterposition: "."(".$SI[10].")";
			if ($SI[5]=="0") {
				$Liste[$nn]=$Liste[$nn]." ausschalten,";
			}
			if ($SI[5]=="1") {
				$Liste[$nn]=$Liste[$nn]." einschalten,";
			}
			if ($SI[5]=="T") {
				$Liste[$nn]=$Liste[$nn]." umschalten.";
			}
			$Liste[$nn]=$Liste[$nn]." wenn (".$SI[9].")";
			if ($SI[7]=="0") {
				$Liste[$nn]=$Liste[$nn]." inaktiv und";
			}
			if ($SI[7]=="1") {
				$Liste[$nn]=$Liste[$nn]." aktiv und";
			}
			if ($SI[8]=="0") {
				$Liste[$nn]=$Liste[$nn]." ausgeschaltet ist.";
			}
			if ($SI[8]=="1") {
				$Liste[$nn]=$Liste[$nn]." eingeschaltet ist.";
			}
			$ListeDAT[$n]=$Liste[$nn];
		}
		if ($SI[6]!="") {
			$Schaltliste[$nn][0]=trim($Schaltdaten);
			$Schaltliste[$nn][1]=$Liste[$nn];
			if ($SI[12]=="Schaltzeitpunkt überschritten!") {
				$Schaltliste[$nn][1]="(".$Liste[$nn].")";
			}
			$Schaltliste[$nn][2]=$n;
			$Schaltliste[$nn][3]=$SI[6];
			$Schaltliste[$nn][4]=$SI[5];
			$Schaltliste[$nn][5]=$SI[10];
			$Schaltliste[$nn][6]=$SI[11];
			$Schaltliste[$nn][7]=$SI[12];
			$Schaltliste[$nn][8]=substr($Schaltzeit,9,4).substr($Schaltzeit,7,2).substr($Schaltzeit,5,2).substr($Schaltzeit,0,4);
		}
	}
}
	

function ZeitErmitteln() {
/**********************/
	global $Zeit,$SoWi,$SonnenAufgang,$SonnenUntergang,$SonnenAufgangM,$SonnenUntergangM;
	global $WWochentag,$WTypen,$WSchalter,$WSchalterToggle,$WAktiv,$WSonnenaufgang,$WSonnenuntergang,$WBedingung,$WKette;

	$ZeitG=date("HiNdmYI");
	$Zeit=substr($ZeitG,0,13);
	$ZeitM=date("HiNdmYI",mktime(substr($Zeit,0,2)+24,substr($Zeit,2,2),0,substr($Zeit,7,2),substr($Zeit,5,2),substr($Zeit,9,4)));
	$DST=substr($ZeitG,13,1)*1;
	$DSTM=substr($ZeitM,13,1)*1;
	if ($DST==1) {$SoWi="Sommerzeit";} else {$SoWi="Winterzeit";}
	$GMT=$DST+1;
	$GMTM=$DSTM+1;
	$SonnenAufgang = substr(date_sunrise(mktime(substr($Zeit,0,2),substr($Zeit,2,2),0,substr($Zeit,7,2),substr($Zeit,5,2),substr($Zeit,9,4)), SUNFUNCS_RET_STRING, BREITENGRAD, LAENGENGRAD, ZENITA, $GMT),0,2).substr(date_sunrise(mktime(substr($Zeit,0,2),substr($Zeit,2,2),0,substr($Zeit,7,2),substr($Zeit,5,2),substr($Zeit,9,4)), SUNFUNCS_RET_STRING, BREITENGRAD, LAENGENGRAD, ZENITA, $GMT),3,2);
	$SonnenUntergang = substr(date_sunset(mktime(substr($Zeit,0,2),substr($Zeit,2,2),0,substr($Zeit,7,2),substr($Zeit,5,2),substr($Zeit,9,4)), SUNFUNCS_RET_STRING, BREITENGRAD, LAENGENGRAD, ZENITU, $GMT),0,2).substr(date_sunset(mktime(substr($Zeit,0,2),substr($Zeit,2,2),0,substr($Zeit,7,2),substr($Zeit,5,2),substr($Zeit,9,4)), SUNFUNCS_RET_STRING, BREITENGRAD, LAENGENGRAD, ZENITU, $GMT),3,2);
	$SonnenAufgangM = substr(date_sunrise(mktime(substr($Zeit,0,2),substr($Zeit,2,2),0,substr($Zeit,7,2),substr($Zeit,5,2),substr($Zeit,9,4))+60*60*24, SUNFUNCS_RET_STRING, BREITENGRAD, LAENGENGRAD, ZENITA, $GMTM),0,2).substr(date_sunrise(mktime(substr($Zeit,0,2),substr($Zeit,2,2),0,substr($Zeit,7,2),substr($Zeit,5,2),substr($Zeit,9,4))+60*60*24, SUNFUNCS_RET_STRING, BREITENGRAD, LAENGENGRAD, ZENITA, $GMTM),3,2);
	$SonnenUntergangM = substr(date_sunset(mktime(substr($Zeit,0,2),substr($Zeit,2,2),0,substr($Zeit,7,2),substr($Zeit,5,2),substr($Zeit,9,4))+60*60*24, SUNFUNCS_RET_STRING, BREITENGRAD, LAENGENGRAD, ZENITU, $GMTM),0,2).substr(date_sunset(mktime(substr($Zeit,0,2),substr($Zeit,2,2),0,substr($Zeit,7,2),substr($Zeit,5,2),substr($Zeit,9,4))+60*60*24, SUNFUNCS_RET_STRING, BREITENGRAD, LAENGENGRAD, ZENITU, $GMTM),3,2);
	$WWochentag=array(
		array("*","jedem"),
		array("1","Montag"),
		array("2","Dienstag"),
		array("3","Mittwoch"),
		array("4","Donnerstag"),
		array("5","Freitag"),
		array("6","Samstag"),
		array("7","Sonntag")
		);
	$WTypen=array(
		array("X","Zeitpunkt"),
		array("A","Sonnenaufgang"),
		array("U","Sonnenuntergang"),
		array("T","Temperatur"),
		array("W","Verbrauch"),
		array("O","Pseudo-Einheiten"),
		array("P","Pseudo-Sensor"),
		array("S","Schalterposition")
		);
	$WSchalter=array(
		array("0","aus"),
		array("1","an")
		);
	$WSchalterToggle=array(
		array("0","aus"),
		array("1","an"),
		array("T","toggle")
		);
	$WAktiv=array(
		array("0","inaktiv"),
		array("1","aktiv")
		);
	$WSonnenaufgang=array(
		array("-","vor Sonnenaufgang"),
		array("+","nach Sonnenaufgang")
		);
	$WSonnenuntergang=array(
		array("-","vor Sonnenuntergang"),
		array("+","nach Sonnenuntergang")
		);
	$WBedingung=array(
		array(">","größer"),
		array(">=","größergleich"),
		array("=","gleich"),
		array("<","kleiner"),
		array("<=","kleinergleich"),
		array("!0<=","ungleich 0 und kleinergleich")
		);
	$WKette=array(
		array("K","Kettenstartglied"),
		array("+","Kettenfolgeglied"),
		array("I","inaktives Kettenstartglied")
	);
	return true;
}

	
function HTMLKopf() {
/*****************/
	printf ('<!DOCTYPE html>
<html>
   <head>
		<meta charset="UTF-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<title>'.PRG.'</title>
		<link rel="shortcut icon" href="images/sas.ico">
		<style type="text/css">
			html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote,pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {
				margin:0;
				padding:0;
				border:0;
				outline:0;
				font-size:100%%;
				vertical-align:baseline;
				background:transparent;
			}
			body {
				line-height:1;
			}
			ol, ul {
				list-style:none;
			}
			blockquote, q {
				quotes:none;
			}
			blockquote:before, blockquote:after, q:before, q:after {
				content:"";
				content:none;
			}
			:focus {
				outline:0;
			}
			ins {
				text-decoration:none;
			}
			del {
				text-decoration:line-through;
			}
			table {
				border-collapse:collapse;
				border-spacing:0;
			}
			#seite {
				display:table;
				overflow:hidden;
				margin:0px auto;
			}
			*:first-child+html #seite {
				position:relative;
			}
			* html #seite {
				position:relative;
			}
			#container {
				display:table-cell;
				vertical-align: middle;
			}
			*:first-child+html #container {
				position:absolute;
				top:50%%;
			}
			* html #container {
				position:absolute;
				top:50%%;
			}
			*:first-child+html #inhalt {
				position:relative;
				top:-50%%;
			}
			* html #inhalt {
				position:relative;
				top:-50%%;
			}
			html, body {
				height:100%%;
			}
			body { 
				margin:0; 
				padding:0; 
				font-family:"Arial"; 
				color:#00AAAA;
				background-color:#112222;
				font-size:18px; 
				text-align:center; 
			}
			#seite {
				height:100%%;
			}
			#container {
				padding:0px;
			}
			table, tr, td {
				border:1px solid #007777;
				margin-bottom:10px;
				padding:3px;
				spacing:3px;
				border-collapse:collapse;
				vertical-align:middle;
			}
			img {
				height:50px;
			}
			div {
				border:0px; 
				border-style:solid;
				border-color:red;
			}
			a {
				border:1px; 
				border-style:solid;
				border-color:#00AAAA;
				background-color:#007755;
				padding-top:0px;
				padding-bottom:0px;
				padding-left:10px;
				padding-right:10px;
				background-size:cover;
				text-decoration:none;
				border-radius:10px;
				color:#00FFFF;
			}
			a:hover {
				border-radius:10px;
				color:#112222;
				background-color:#00AAAA;
				text-decoration:none;
				box-shadow:0px 0px 20px #007777,0px 0px 20px #007777,0px 0px 20px #007777;
			}
			seite {
				width:1200px;
			}
			#hgr {
				position:relative; 
				left:0px; 
				top:0px; 
				width:1200px;
				height:780px;
				border-radius:10px;
				padding:10px;
				border:2px;
				border-style:solid;
				border-color:#009999;
				color:#00FFFF;
				font-size:16px;
				text-align:center; 
				background-color:#001111;
				text-decoration:none;
				text-shadow:0px 0px 20px #00BBBB,0px 0px 20px #00BBBB;
			}
			#buttonwahl {
				padding-bottom:15px;
				position:relative; 
				width:140px;
				text-align:right; 
				text-decoration:none;
				text-shadow:0px 0px 20px #00BBBB,0px 0px 20px #00BBBB,0px 0px 20px #00BBBB;
			}
			h1 {
				font-size:20px;
				text-shadow:0px 0px 20px #00BBBB,0px 0px 20px #00BBBB,0px 0px 20px #00BBBB;
			}
			h2 {
				font-size:16px;
			}
			h3 {
				font-size:22px;
			}
			h1,h2,h3 {
				margin-top:3px;
				margin-bottom:3px;
				text-decoration:none;
			}
			input {
				font-family:"Courier"; 
				padding-left:5px;
				padding-right:5px;
			}
			input,select {
				margin-top:3px;
				margin-bottom:3px;
				border-radius:10px;
				font-size:16px;
				color:#112222;
				background-color:#008888;
				text-decoration:none;
			}
			#binfo {
				border-radius:10px;
				padding:5px;
				margin:15px;
				border:2px;
				border-style:solid;
				border-color:#009999;
				color:#00FFFF;
				position:relative; 
				font-size:12px;
				text-align:center; 
				background-color:#002222;
				text-decoration:none;
				text-shadow:0px 0px 20px #00BBBB,0px 0px 20px #00BBBB,0px 0px 20px #00BBBB;
			}
			#buttonok {
				font-family:"Arial"; 
				border-style:solid;
				border-color:#006600;
				color:#00FF00;
				position:relative; 
				width:140px;
				font-size:24px;
				text-align:center; 
				background-color:#004400;
				text-decoration:none;
				text-shadow:0px 0px 20px #00BB00,0px 0px 20px #00BB00,0px 0px 20px #00BB00;
			}
			#buttonok:hover {
				border-color:#00BB00;
				color:#CCFFCC;
			}
			#buttonok:active {
				border-color:#00FF00;
				color:#CCFFCC;
			}
			#buttonloeschen {
				font-family:"Arial"; 
				border-style:solid;
				border-color:#660000;
				color:#FF0000;
				position:relative; 
				width:140px;
				font-size:24px;
				text-align:center; 
				background-color:#440000;
				text-decoration:none;
				text-shadow:0px 0px 20px #BB0000,0px 0px 20px #BB0000,0px 0px 20px #BB0000;
			}
			#buttonloeschen:hover {
				border-color:#BB0000;
				color:#FFCCCC;
			}
			#buttonloeschen:active {
				border-color:#FF0000;
				color:#FFCCCC;
			}
			hr {
				border-color:#006666;
				color:#006666;
			}
		</style>
	</head>');
}


function HTMLBodyTop () {
/******************/
	printf (
   '<body>
		<div id="seite">
			<div id="container">
				<div id="inhalt">
					<div id="hgr">');
}


function HTMLBodyBottom() {
/***********************/
	printf (
				   '</div>
				</div>
			</div>
		</div>
	</body>
</html>');
}
?>
 
@JL3,
hi JL3 habe die sasapui.php geändert aber mir ist noch nicht klar wie ich das Kettenstartglied deaktivieren kann.
Ich sehe keinen Button oder ähnliches.

Eine kurze Info wäre mir hilfreich

Gruß Benne007
 
Betreffendes Kettenstartglied in der GUI durch Anklicken auswählen. Im Dropdown nun statt "Kettenstartglied" nun "inaktives Kettenstartglied" wählen und speichern. Fertig. ;)

Nachtrag: Zum wieder Aktivieren einfach von "inaktives Kettenstartglied" zu "Kettenstartglied" abändern und speichern.
 
Zuletzt bearbeitet:
Ja danke funzt super

Gruß Benne007
 
Danke für die Rückmeldung. :)

Im Momenr ändere ich das Konzept der LOG-Datei, die per Mail verschickt wird. Zukünftig sollen dort ALLE Schaltvorgänge protokolliert werden können. Das schließt Automation, WebGUI (SAS), manuell am Gerät, Fremdgerät, etc. mit ein. So hat man dann einen besseren Überblick. ;)

Bei der Sprachsteuerung warte ich noch auf die Pi-kompatible USB-Soundkarte fürs Mikrofon. Vorher kann ich nicht loslegen...
 
Mein Pi spricht bereits. Jetzt haperts noch mit dem Zuhören, aber das wird. ;)
 
Das hört sich ja schon mal super an.

Danke
 
Das Projekt "SAS-Sprachsteuerung" liegt jetzt auf Eis.

Die Gründe:
  • Die Spracherkennung macht Probleme.
    • Entweder nutzt man "Google-Speech-API" serverbasiert und "verkauft" Google dafür seine Daten, um überhaupt erst einen Key generieren zu können, den man nur eine sehr begrenzte Anzahl Aufrufe am Tag nutzen kann.
    • Oder man nutzt eine rein clientseitige Lösung, die entweder aus PocketSphinx oder Julius besteht. Hier muss alles Benötigte komplett auf dem Pi kompiliert werden, was mehrere Stunden dauert. Danach ist die Engine noch immer nicht nutzbar, weil die Trefferquote mehr als gering ist. Ein Training zur Verbesserung der Worterkennung dauert mindestens einen Monat oder länger, um halbwegs sichere Treffer bei der Erkennung zu erhalten.
      Für die deutsche Sprache gibt es keine funktionierenden Modelle.
  • Zudem ist die clientseitige Sprachausgabe auch nicht wirklich gut. Dazu die nicht ganz so berauschende Ausgabequalität von USB-Soundkarten. Es zirpt und zwitschert leise, wenn der Pi arbeitet.

Fazit:

Bis keine vernünftige Spracherkennung exisitiert, war es eine nette Idee und nicht mehr... Leider... :(
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.