br_IPS / PHP Libraries zu IP-Symcon

Moin zusammen,

ich bin immer auf der Suche nach APIs und Standards gewesen und habe mir dazu zumeist unabhängige Funktionen und Libaries programmiert, welche den nicht Programmierern unter den IPS Anwendern sicher auch helfen können!

Ich veröffentliche hier einfach einen Teil meines Arbeitsstandes - auf dem Weg meine pers. Hausautomatisierung zu strukturieren und zu verbessern selektiv und hoffe es hilft Jemandem weiter.

Meine Libs sollten zumeist direkt sinnvoll eingesetzt werden können oder sie suchen sich die notwendigen Informationen aus der Ip-Symcon Hierarchie (bei Beachtung der Anleitung) selber. Vorraussetzungen wie z.B. eine bestimmte Hierarchie werden erläutert und Hintergründe sind in Kommentaren des Codes aufgeführt…

Nutzung

  • Skripte in den Ordner IP-Symcon\scripts kopieren
  • Include im eigenen Skript machen
require ("functions.inc.php")
  • Ggf. die einzelnen Skriptdateien in IP-Symcon erstellen (spezieller Name und Datei hochladen) um die Dateien als Funktionsreferenz über den Objektbaum im Zugriff zu haben

Beispiel: „Alle Lichter aus“
Vorraussetzung: Lichter müssen „Licht“ im Namen enthalten um gefunden zu werden.


<?
require ("functions.inc.php");
// br_searchinst sucht hier alle Objekte mit Licht im Namen und liefert ein Array
// Der Wrapper br_switch bearbeitet bei Übergabe eines Arrays alle Elemente
// und schaltet über false aus.
// Wenn die 0 als Parent für die Suche auf die Kategorie eines Raums gesetzt 
// wird, werden z.B. nur die Lichter in diesem Raum abgeschaltet.

br_switch(br_searchinst(0,"Licht"),false);
?>

Historie
22.05.2010 20:00 Neue Version, Problem mit doppelten

<?[/CODE> Tags behoben
15.06.2010 Neue Version, Improvements beim Object Handling und -Zusammenführung mit meiner pers Entwicklung (der Quellcode enthält allerdings vermutlich immer mehr Funktionen als meine Beschreibungen in diesem Thread)
19.11.2010 Kleinere Korrekturen
21.11.2010 1.5 Abgleich mit meiner Entwicklungskopie(!)
- Hinzufügen von br_piri (zur Verwaltung eines PIRI in einer Category)
- Vorbereitungen um Konfigurationen in eigene Dateien auszulagern
- Verbesserungen in dem Kommentaren und taggen der Dateien mittels PHP define um Versionsinformationen (Major, Minor und eindeutigem und sprechenden Tag) unterzubringen (aktuell werden die Informationen nicht abgefragt und nur gesetzt). Zukünftig kann darüber ggf. eine Abwärstkompatibilität gewährleistet werden. 

[b][u]Aktuellste Version:[/u][/b]
[b]25.11.2010 1.5.1 Bugfix $NAME_SI in br_searchinst
- Bugfix $NAME_SI in br_searchinst ist nicht definiert bzw. im Scope: Auslagern von NAME_SI in $cfg_br_ips['si_default_name'] in einer config.inc.php
- Einführung config.inc.php für globale Parameter und Defaults[/b]
- (PRE - SONOS Routinen) 
[b]An dieser Stelle, nochmals Vielen Dank für das bisher erhaltene Feedback![/b]

Bitte sendet mir bei veröffentlichten Logik oder Programmcodefehlern gerne direkt eine PM, so dass ich den Fehler schnellstmöglich korrigieren kann, damit sich Niemand bei der - nicht notwendigen Suche - von Fehlern aufhalten muss.

Grüße, Benjamin

[b][u]Pre 1.5.7 löst unlinked Sonos Groups ggf. nicht auf / Fix in br_sonos.inc.php:[/u][/b]

```php

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// TAG_TODO_BR Intelligenz zum Aufbau der Zonen Topologie hier einbauen
//  We are slave and save to coord rincon

   $curCoord=$match[1];
	$arrzonegroups[$curCoord]['Coordinator']=(string) $curCoord;

	$arrzonegroups[$curCoord]['Member'][$arrzoneplayers[$curzoneplayerid]['Rincon']]['ID'] = $arrzoneplayers[$curzoneplayerid]['ID'];
  	$arrzonegroups[$curCoord]['Member'][$arrzoneplayers[$curzoneplayerid]['Rincon']]['Rincon'] = $arrzoneplayers[$curzoneplayerid]['Rincon'];
 	$arrzonegroups[$curCoord]['Member'][$arrzoneplayers[$curzoneplayerid]['Rincon']]['CurrentZoneName'] = $arrzoneplayers[$curzoneplayerid]['CurrentZoneName'];
 	$arrzonegroups[$curCoord]['Member'][$arrzoneplayers[$curzoneplayerid]['Rincon']]['CurrentIcon'] = $arrzoneplayers[$curzoneplayerid]['CurrentIcon'];
 	$arrzonegroups[$curCoord]['Member'][$arrzoneplayers[$curzoneplayerid]['Rincon']]['IPSId'] = $arrzoneplayers[$curzoneplayerid]['IPSId'];

	// So unset our Master entry
   unset($arrzonegroups[$arrzoneplayers[$curzoneplayerid]['Rincon']]);

	if (function_exists('IPSLogger_Dbg'))
		{ IPSLogger_Dbg(__file__ , "== Line ".__line__." == " .
		"We are slave " . $arrzoneplayers[$curzoneplayerid]['Rincon'] . " and save to coord " .  $curCoord
		); }
	
  	

	// $arrzoneplayers[$match['ID']]['IPAddress'];



	} else {



   $curCoord=$arrzoneplayers[$curzoneplayerid]['Rincon'];
	$arrzonegroups[$curCoord]['Coordinator']=$curCoord;

	$arrzonegroups[$curCoord]['Member'][$curCoord]['ID'] = $arrzoneplayers[$curzoneplayerid]['ID'];
  	$arrzonegroups[$curCoord]['Member'][$curCoord]['Rincon'] = $arrzoneplayers[$curzoneplayerid]['Rincon'];
 	$arrzonegroups[$curCoord]['Member'][$curCoord]['CurrentZoneName'] = $arrzoneplayers[$curzoneplayerid]['CurrentZoneName'];
 	$arrzonegroups[$curCoord]['Member'][$curCoord]['CurrentIcon'] = $arrzoneplayers[$curzoneplayerid]['CurrentIcon'];
 	$arrzonegroups[$curCoord]['Member'][$curCoord]['IPSId'] = $arrzoneplayers[$curzoneplayerid]['IPSId'];
// We are master so delete our slave entries
		
// br fixed bug for unlinking zones
	foreach ($arrzonegroups as $curzonegroup) {
			$thisCoord=$curzonegroup['Coordinator'];
					foreach ($curzonegroup['Member'] as $curmember) {
						if (is_string($curzonegroup)) {
							echo "
====
  Coord:" . $curzonegroup;
						} else {
							
				  			if($curmember['Rincon']==$curCoord){
							//	echo "Should unset now!

";
							   unset($arrzonegroups[$thisCoord]['Member'][$arrzoneplayers[$curzoneplayerid]['Rincon']]);
							}
						}
					}
	}
	


	

	  		if (function_exists('IPSLogger_Dbg'))
		{ IPSLogger_Dbg(__file__ , "== Line ".__line__." == " .
		"We are coord " . $curzoneplayerid . "AKA " . $curCoord
		);}
	}
	


br_ips_1.5.1.zip (13.6 KB)

br_ips_1.5.7PRE.zip (38.5 KB)

Hallo,
ich möchte einen weiteren Teil meiner Hilfs-Funktionen vorstellen (br_dim.inc.php) einführen:

Um keine falsche Anzeige der Intensität (bei FS20 Steuerung; kein BiDi) zu haben, habe ich mir eine Variable Helligkeit mit speziellem Profil angelegt, welche den aktuellen Helligkeitsgrad NICHT darstellt, sondern nur zur Entgegennnahme von Kommandos im Webfront dient. Die arbeitende Funktion liest den Wert dann aus, schaltet den Dimmer und setzt auf einen nicht dargestellten Wert zurück.

Zum Senden des Kommandos muss noch ein Skript zur Übertragung verknüpft werden, welches an beliebigem Ort angelegt werden kann und dann unter „Eigene Aktion“ des Variablenprofils zu hinterlegen ist:

<?
//Script zum WERTEZUWEISEN aus dem Webfrontend

if($IPS_SENDER == "WebFront")
{
    SetValue($IPS_VARIABLE, $IPS_VALUE);
}

?>

Die Function br_dimHandleVar arbeitet mit dem Parent, Ihr müsst das aufrufende Skript also unterhalb der zu dimmenden Lampe anlegen, damit es intellligent die Variable findet (idealerweise auch verstecken fürs Webfront) mit dem folgenden Inhalt:

<?
require "functions.inc.php";

br_dimHandleVar($IPS_VARIABLE);
?>

Da das o.g. Skript allgemeingültig ist, habe ich es unter einem speziellen Namen „Dimmer“ gespeichert und verwende es somit wieder (bzw. lade es über diesen Namen bei der Neuanlage von weiteren Dimmern).

So sieht das dann im Webfront aus:

Bei meinen Lampen (Philips LED) ergibt sich noch das Problem, dass diese aufgrund der Dimmerkonstruktion von ELV nicht ausschalten (sondern flackern), aber auch dies kann man gut skripten, wenn man noch einen FS20 SU davor bezahlen/ bauen möchte (näheres zu LED und den FS20 Produkten bitte per PM erfragen). :mad:

Der relevante Part der
Lib (wobei dieser in dem ZIP enthalten sein sollte):

<?
/*
    This file is part of br_IPSLibaries for IP-Symcon.

    Foobar is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    br_IPSLibaries is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 	 Please contact me at br@con8.de and use "br_IPS" anywhere in your email-subject.


Handle dimrequest and Reset Calling var to zero,
develeoped for webfront and non bidi devices
*/
function br_dimHandleVar($IDVar){


	$VarValue=GetValue($IDVar);

if ($VarValue==0) return;
	switch ($VarValue) {
	
	

	
		case 1:
			FS20_DimDown((int)br_objParent($IDVar));
			break;
	

		case 100:
		

			FS20_SetIntensity((int)br_objParent($IDVar),16,2);
  			IPS_Sleep(2);
			FS20_SetIntensity((int)br_objParent($IDVar),16, 1);

			IPS_Sleep(21);
			FS20_SetIntensity((int)br_objParent($IDVar),16, 0);


		

			break;

		case 101:
			FS20_DimUp((int)br_objParent($IDVar));
			break;

		default:
		
			FS20_SetIntensity((int)br_objParent($IDVar),(int) $VarValue/100*16 ,0);
  			IPS_Sleep(1);
			FS20_SetIntensity((int)br_objParent($IDVar),(int) $VarValue/100*16, 0);

			IPS_Sleep(50);
			FS20_SetIntensity((int)br_objParent($IDVar),(int) $VarValue/100*16 ,0);


	}
	
	br_objSetVar(br_objParent($IDVar),"Helligkeit",0);

}
?>

An dieser Stelle, nochmals Vielen Dank für das bisher erhaltene Feedback!
Bitte sendet mir bei veröffentlichten Logik oder Programmcodefehlern gerne direkt eine PM, so dass ich den Fehler schnellstmöglich korrigieren kann, damit sich Niemand bei der nicht notwendigen Suche von Fehlern aufhalten muss.

Viele Grüße,
Benjamin

dim_varieblenprofil.png

Hallo zusammen,

ich möchte Euch gerne ein Beispiel zur Anwendung der bestehenden und bekannten Funktionen (br_fs20.inc.php und br_searchinst.inc.php) der Library geben…

An der weiteren Abstraktion und der Erweiterung der Library arbeite ich gerade! Wenn Funktionen nicht allgemeingültig sind, lohnt sich allerdings keine Veröffentlichung, da diese dann nicht einfach oder ohne weitere Programmierkenntnisse :confused: für Jeden nutzbar sind. :slight_smile:

Das Licht in einem Badezimmer schaltet man ja zumeist vor der Tür ein (Decke). Ich habe da noch Leuchten über dem Spiegel, eine Effektbeleuchtung im Schrank und an der Sauna, welche einzeln eingeschaltet werden können (über Schalter im Badezimmer).

Und wenn ich den gleichen Schalter vor der Tür drücke, soll es im Bad bitte komplett dunkel sein (ohne das ich die IDs der Geräte pflege muss oder über Masteradressen schon beim Betreten des Raums die Beleuchtung komplett anschalte)! :slight_smile:

Vorbedingungen:

  • Ich programmiere die Fs20 Geräte auf einzelne Adressen ohne Master (oder nutze diesen zumindest nicht am Schalter außen)
  • Der Schalter außen schaltet nur mein Hauptlicht direkt per FS20 (und an die Daten Variable dieses Schalter hänge ich ein Ereignis welches das nachfolgende Skript aufruft)
  • Die Namen meiner Lampen enthalten durchgängig einen eindeutigen Begriff um diese zu finden, bei mir „Licht“

<?
 require ("functions.inc.php");
 // Ausschalten eines Raumes über den Masterschalter
			
				if($IPS_VALUE == 0){
	  				//	kurz aus bzw. switch off
					// ID der Kategorie des Raums anpassen und den String zum finden
					// der auszuschaltenden Geräte, hier "Licht"
					br_switch(br_searchinst(50895 /*[Wohnung\Bad]*/,"Licht"),false);
				}
			   if($IPS_VALUE == 20){
				
				}
			   if($IPS_VALUE == 17){

				}
			   if($IPS_VALUE == 19){

   			}
?>


Direkt übernehmen lässt sich das o.g. Beispiel z.B. auch im Schlafzimmer: Hier möchte ich beim Eintreten das Hauptlicht einschalten, nicht jedoch die Leseleuchten am Bett oder die Beleuchtung des Kleiderschranks - beim Verlassen jedoch, soll dann der Raum komplett ausgeschaltet werden!

Was kann man damit noch machen?
Die Abschaltung sämtlicher Lichter plus dem Herd und der Kaffeemaschine beim Verlassen der Wohnung ist leicht zu programmieren. :slight_smile: Und wenn ich den Lichtschalter für die Leselampe am Bett länger auf AUS drücke ist die Wohnung stromlos oder das Licht geht zumindest aus und IPS wünscht mir eine Gute Nacht!

Aktuell sind einige meiner Routinen recht FS20 lastig, aber die verwendeten Wege um die Instanzen zu suchen, sind bei anderen Systemen sehr ähnlich.

Viele Grüße, Benjamin

Hallo,

im Rahmen der Version 1.5 habe ich meine Piri Steuerung (br_priri.inc.php) in die Veröffentlichung eingebaut. :slight_smile:

Nutzen und Funktion:
Man kann damit den Raum am Webinterface auf Automatik AN oder AUS schalten und und somit die automatische Einschaltung eines Raumlichts steuern. Bei abgeschalteter Automatik schaltet das Skript bei mangelnder Bewegung auch nach der Ausschaltzeit die Geräte der genannten Kategorie aus - so dass ein Licht auch beim Vergessen nach dieser max. Zeit ausgeschaltet wird.

Vorsicht:
Die Routinen waren bei mir ca. 7 Monate problemlos und zuverlässig in Betrieb, wurden aber nach der Umarbeitung für diese Veröffentlichung nicht gründlich getestet (ich habe zur IP-Symcon Entwicklung kein Test System!).

Nutzung:

  • Fügt das u.g. Skript der Kategorie des Raums hinzu
  • Definiert ein Ereignis bei Veränderung der Statusvariable des Hauptlichts im Raum (um die Steuerung von Außen zu ermöglichen)
  • Definiert ein Ereignis bei der Veränderung der Statusvariable des PIRIS im betreffenden Raum
  • Passt die Konfiguration im Skript an (feste Werte oder GetValue)
  • Schaut Euch das unter dem Quelltext folgende Bild zur Einrichtung an bzw. bzw. passt Webfront und Variablenprofile für die gewünschte Darstellung und Auswahl an.

Falls die Bilder nicht ausreichen, schreibt mir gerne eine PM!

<?

/* Events:
		- Aufruf durch Veränderung der Statusvariable des Lichts zur Behandlung einer
	     manuellen Schaltung über die Statusvariable des Lichts im Raum,
		- über den Status des Piris im Raum
*/

// include br_libs
require "functions.inc.php";

/********************************************
Konfiguration für den Raum / Bereich
*********************************************/

// Automatisches Einschalten? (bool)
$PIRI_AUTOMATIK=GetValue(48907 /*[Wohnung\Abstelle\Automatik\Status]*/);
// wird bei Auto vom skript aktiv eingeschaltet
$ID_LIGHT_AUTO=39388 /*[Wohnung\Abstelle\Licht]*/;

// Dauer, Einschaltdauer bei Automatik=true, Abschaltung immer ohne Bewegung auch bei
// manueller Betätigung eines Schalters
$EINSCHALTDAUER=GetValue(58522 /*[Wohnung\Abstelle\Automatik\Einschaltdauer]*/);
$ABSCHALTUNG=GetValue(26739 /*[Wohnung\Abstelle\Automatik\Abschaltung nach (bei manueller Schaltung)]*/);

/***************************************
Routine aus br_piri.inc.php Aufrufen
****************************************/
br_piri_handle($IPS_VARIABLE, $PIRI_AUTOMATIK, $ID_LIGHT_AUTO, $EINSCHALTDAUER, $ABSCHALTUNG);


?>

Viel Spaß und Grüße, Benjamin