Meldung für Fenster, Türen, Licht, Rollladen usw

Hallo,

ich versuche seit Wochen ein Startbildschirm mit folgendem Inhalt zu realisieren.
Ich möchte eine Statusseite erstellen, um auf einem Blick zu sehen wieviele Fenster/Türen
sind geöffnet, gekippt oder geschlossen. Auch interessiert mich wieviele Rollläden sind geschlossen,
angehallten oder geöffnet. Wieviele Leuchten sind AN oder Aus. Vorgestellt habe ich mir eine Liste
mit folgendem Inhalt:

Türen / Fenster = geöffnet ( 0 ) geschlossen ( 10 ) gekippt ( 1 )
Rollläden = geöffnet ( 7 ) geschlossen ( 2 ) gestoppt ( 1 )
Licht = An (20) Aus (5)

Dies ist ein Beispiel. Die Werte sollten sich automatisch abgleichen.
Schön wäre noch bei Auswahl Türen/Fenster geöffnet (zum Beispiel), eine Anzeige der
geöffneten Fenster/Türen öffnet.

Ich benutze nur Enocean. Den Status der Fenster/Türen bekomme ich durch Hoppe Fenstergriffe.

Kann mir jemand helfen wie ich sowas Anfange/Realisiere?

Alle Werte habe ich in WF und IPSVIEW.

Schöne Grüße aus Soltau

Detlev

Du must halt einen Array anlegen mit allen Deinen Geräten und dann jeweils prüfen welche Geräte gerade welchen Status haben.
Als Beispiel für Lampen


// Objekt IDs aller Lampen
$lamps = [
47597 /*[Geräte\Homematic\Räume\Büro\Arbeitszimmer\Zustand]*/,
24979 /*[Geräte\Homematic\Räume\Schlafzimmer\Schlafzimmer Wandschrank\Zustand]*/,
55985 /*[Geräte\Homematic\Räume\Bad\Bad Deckenlampe\Zustand]*/
];

$lamps_on = 0;
$lamps_off = 0;
$lamps_arr_on = [];
$lamps_arr_off = [];
foreach($lamps as $lamp)
{
$state = GetValue($lamp);
if($state)
{
	$lamps_on++;
	$lamps_arr_on[] = $lamp;
}
else
{
	$lamps_off++;
	$lamps_arr_off[] = $lamp;
}
}

echo "Es sind ".$lamps_on." Lampen eingeschaltet.
";
echo "Es sind ".$lamps_off." Lampen ausgeschaltet.
";
echo "Es sind die Lampen ";
foreach($lamps_arr_on as $lamp)
{
	echo IPS_GetName(IPS_GetParent($lamp))."
";
}
echo " eingeschaltet.
";
echo "Es sind die Lampen ";
foreach($lamps_arr_off as $lamp)
{
	echo IPS_GetName(IPS_GetParent($lamp))."
";
}
echo " ausgeschaltet.
";


Wie Du die Variablen dann darstellst ist dann ja Dir überlassen, Du kannst die Werte in einzelne Variablen schreiben und diese dann in IPSView anordnen oder aber die Werte als Tabelle in eine String Variable mit Profil ~HTMLBox schreiben.

Dazu must Du auf alle Variablen, die Du prüfen willst, ein Ereigniss legen, dass bei Variablenänderung Dein Skript auslöst. Dann zählt Dein Skript zu dem Zeitpunkt die Anzahl der Lampen durch, die an bzw. aus sind und erstellt Dir eine Liste der Lampen die an/aus sind.

Das gleiche machst Du für Deine anderen Geräte, nur das Du da dann halt auf drei Werte prüfst und nicht nur auf true/false, wie bei einer Lampe.

Ich bin mir ziemlich sicher, dass ich das Folgende schon mal irgendwo im Forum geschrieben habe, aber ich finde es nicht wieder.

Man kann sich durch den Ansatz die Pflege des Array der Quellen sparen, da die Quellen ja im Ereignis bereits enthalten sind ;).


<?
$debug = false;
$Events = IPS_GetScriptEventList($_IPS['SELF']);
if ($debug)
  print_r($Events);

for ($number= 0;$number < count($Events);$number++) {
  foreach(IPS_GetEvent($Events[$number]) as $key => $element) {
    if ($key == 'TriggerVariableID') {
      $type = IPS_GetVariable($element)['VariableType'];
      switch ($type) {
        case "0": $result = GetValueBoolean($element);        break; // Boolean
        case "1": $result = GetValueInteger($element);        break; // Integer
      }
      if ($debug)
		  echo "Event: ".$key." -> ".$element ." : " . $result . "
";
      if ($result) {
        SetValueBoolean(58080 , True);
        return;
      }
    }
  }
}
SetValueBoolean(58080 , False);

Durch die $type werden Boolean und auch Integer berücksichtigt.

Ich setze nur eine Bool zur Anzeige, aber du könntest natürlich auch zählen.

Licht_an.png

Hallo Fonzo,

Super, mit Licht hat das schon einmal geklappt.Danke
Jetzt habe ich es mit Fenstergriffe versucht. Script erweitert
auf 3 Zustände. Leider bekomme ich folgende Ausgabe:

Es sind 13 Fenster geöffnet.
Es sind 13 Fenster geschlossen.
Es sind 0 Fenster gekippt.

Hier mein Script:
<?php

// Objekt IDs aller Fenster/Rüren
$windows = [
24513,
26966,
23281,
45027,
48300,
20205,
18304,
27558,
55235,
21680,
11805,
23094,
49029
];

$windows_close = 0;
$windows_open = 0;
$windows_tipped = 0;
$windows_arr_close = ;
$windows_arr_open = ;
$windows_arr_tipped = ;
foreach($windows as $window)
{
$state = GetValue($window);
if($state)
{
$windows_open++;
$windows_arr_open = $window;
}
{
$state = GetValue($window);
if($state)
{
$windows_close++;
$windows_arr_close = $window;
}
else
{
$windows_tipped++;
$windows_arr_tipped = $window;
}
}
}
echo "Es sind „.$windows_open.“ Fenster geöffnet.
";
echo „<br><br>“;
echo "Es sind „.$windows_close.“ Fenster geschlossen.
";
echo „<br><br>“;
echo "Es sind „.$windows_tipped.“ Fenster gekippt.
„;
echo „<br><br>“;
echo „Es sind die Fenster: <br><br>“;
foreach($windows_arr_open as $window)
{
echo IPS_GetName(IPS_GetParent($window)).“
";
echo „<br><br>“;
}
echo "geöffnet.
„;
echo „<br><br>“;
echo „Es sind die Fenster: <br><br>“;
foreach($windows_arr_close as $window)
{
echo IPS_GetName(IPS_GetParent($window)).“
";
echo „<br><br>“;
}
echo " geschlossen.
„;
echo „<br><br>“;
echo „Es sind die Fenster: <br><br>“;
foreach($windows_arr_tipped as $window)
{
echo IPS_GetName(IPS_GetParent($window)).“
";
echo „<br><br>“;
}
echo " gekippt.
";
SetValueInteger(19665, $windows_close);
SetValueInteger(32604, $windows_open);
SetValueInteger(53525, $windows_tipped);
?>

Was mache ich nur falsch, oder besser gesagt, was verstehe ich nicht.
Für eine kleine Hilfe (grosse nehme ich auch) wäre ich dankbar.

Gruß aus Soltau

Detlev

Moin,

ich hab das Script jetzt nur überflogen, mein Tipp:
du prüfst zweimal ob $state „true“ ist, schreibst das ergebnis dann jeweils als offen und geschlossen weg.

if($state)
{
$windows_open++;
$windows_arr_open[] = $window;
}
{
$state = GetValue($window);
if($state)
{
$windows_close++;
$windows_arr_close[] = $window;
}

Das kann ja nicht richtig sein ?! Ich kenn deine Statusvariable nicht, aber die muss ja 3 Zustände haben, z.B. 0,1,2, dadrauf musst du prüfen.

Ich finde den Ansatz von Ralf allerdings viel eleganter … danke für diesen Tip, das werd ich mir mal abspeichern für später :smiley:

Gruß Julian

Edit:

Vielleicht hilft das:
wenn du Variablen prüfst geht das z.B. so: if ($variable == true) oder if ($variable == 4)
als Abkürzung verwendet man oft einfach nur if($variable), wenn die variable true ist, ist die Bedingung erfüllt, alles ausser 0 ist true. Das würde ich als Anfänger aber nicht machen, das verwirrt dich nur.

Hallo Ralf,

nach Rat von Fonzo habe ich mich an deine Lösung gesetzt (soll leichter sein).
Es funktioniert auch. Leider bekomme ich nur eine Meldung Licht an oder aus (nicht welche sind an oder aus).
Ich weiß auch nicht wie ich es mit drei Zustände (Fenster geöffnet/geschlossen/gekippt) hinbekomme.
Vieleicht kannst du mir ein wenig den Weg zeigen.

Gruß aus Soltau

Detlev

Ich meine den Tip von Inspra ! Sorry

Deine If Schleife ist falsch Du brauchst elseif.


foreach($windows as $window)
{
	$state = GetValue($window);
	if($state == 0)
	{
	$windows_open++;
	$windows_arr_open[] = $window;
	}
	elseif($state == 1)
	{
	$windows_close++;
	$windows_arr_close[] = $window;
	}
	elseif($state == 2)
	{ 
	$windows_tipped++;
	$windows_arr_tipped[] = $window;
	}
}

Wobei in dem Fall die Werte 0,1,2 wären, da must Du schauen was denn die Werte sind, die bei dem jeweiligen Status vorliegen.

Hallo Fonzo,

super das hat geklappt. Danke.
Meine Hoppe Fenstergriffe haben 4 Zustände:
0=geöffnet
1=gekippt
2=geöffnet
3=geschlossen.

Kann ich die Zustände 0 + 2 irgendwie zusammen fassen?
Je nachdem wie die Fenster geöffnet werden, bekomme ich mal 0 für geöffnet
und mal 2 für geöffnet.

Gruß aus Soltau

Detlev


foreach($windows as $window)
{
    $state = GetValue($window);
    if($state == 0 || $state == 2)
    {
    $windows_open++;
    $windows_arr_open[] = $window;
    }
    elseif($state == 3)
    {
    $windows_close++;
    $windows_arr_close[] = $window;
    }
    elseif($state == 1)
    { 
    $windows_tipped++;
    $windows_arr_tipped[] = $window;
    }
}  

so ?

Das hatte ich dir heute morgen schon versucht zu sagen, dass du die $state auf irgendwas prüfen musst mit $state == „integer vom fensterzustand“

Gruß

Julian

Hallo Inspra,

super es funktioniert. Danke.

Ich hatte es heute morgen gelesen. Leider bin ich im Programmieren nicht die hellste Leuchte.
Mein Hauptgebiet ist die Installation. Ich versuche aber die Lösungen / Lösungsvorschläge zu
verstehen und daraus zu lernen. Leider fehlt mir als selbständiger Elektromeister auch immer die
nötige Zeit. Ich Versuche jetzt mit meinen anderen Aufgaben (Rollläden, Steckdosen, Lüftungsstatus usw)
weiter zu kommen. Durch diese Lösungen, habe ich schon wieder etwas gelernt und hoffe wenn ich
fertig bin, dass sich das Wissen auch etwas gefestigt hat.
Für eure Hilfe aber gang lieben Dank.

Grüße aus Soltau

Detlev

Hallo Fonzo,

warum bekomme ich von deinem Script täglich Hunderte von Warnungen? Habe ich etwas falsch gemacht? Ist das normal?
Kann ich das ändern?

Hier dein Script von mir etwas geändert.

<?php

// Objekt IDs aller Lampen
$lamps = [
43460,
59578,
32398,
33349,
17454,
28776,
11134,
22333,
17490,
17074,
14354,
35614,
52139,
32938,
52185,
34340,
20326,
25871,
11265,
18791,
39762
];

$lamps_on = 0;
$lamps_off = 0;
$lamps_arr_on = ;
$lamps_arr_off = ;
foreach($lamps as $lamp)
{
$state = GetValue($lamp);
if($state)
{
$lamps_on++;
$lamps_arr_on = $lamp;
}
else
{
$lamps_off++;
$lamps_arr_off = $lamp;
}
}

echo "Es sind „.$lamps_on.“ Lampen eingeschaltet.
";
echo „<br><br>“;
echo "Es sind „.$lamps_off.“ Lampen ausgeschaltet.
„;
echo „<br><br>“;
echo „Es sind die Lampen: <br><br>“;
foreach($lamps_arr_on as $lamp)
{
echo IPS_GetName(IPS_GetParent($lamp)).“
";
echo „<br><br>“;
}
echo "eingeschaltet.
„;
echo „<br><br>“;
echo „Es sind die Lampen: <br><br>“;
foreach($lamps_arr_off as $lamp)
{
echo IPS_GetName(IPS_GetParent($lamp)).“
";
echo „<br><br>“;
}
echo " ausgeschaltet.
";
SetValueInteger(39331, $lamps_off);
SetValueInteger(44377, $lamps_on);
?>

schöne Grüße aus Soltau

Detlev

IP-Symcon Management Console.pdf (1.3 MB)

Das echo macht ja eigentlich nur Sinn wenn Du das testen willst beim Skript ausführen, ansonsten würde ich den Wert (Anzahl) nur in eine Variable schreiben. Meldungen sind normal, auch wenn eine Variable geändert wird. Wenn Dich das stört kannst Du das unter Spezialschalter anzeigen das Watch für Variablen oder Skripte deaktivieren.

natürlich gleich ausprobiert und erfolgreich angewendet.
Danke dafür.

Schöne Grüße aus Soltau

Detlev