Was mache ich hier falsch?

Es soll einfach eine Sammelmeldung geben, sobald eine Batterie leer ist.

Hab mal eine auf true gesetzt, zeigt trotzdem immer OK an.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Batterie_Status.ips.php
Trigger  : 
Interval : 
*/


$status = GetValueBoolean("ankleide_low_bat")or("bad_low_bat")or("buero_low_bat")or("kueche_low_bat")or("Tuerkontakt_Haustuer_low_bat")or("Tuerkontakt_Keller_low_bat")or("TF_Wohnzimmer_low_bat");


if ($status == false)
{
SetValueString("Batterie_voll", "Status OK");
echo "OK";
}
else
{
echo "leer";
}
?>

Hi RWN

Du liest nur den Status der ersten Variable ein (ankleide_low_bat).
Ich hab im Moment kein IPS vor mir, aber ich meine, dass du mit GetValueBoolean nur eine einzelne Variable abfragen kannst.

Gruß Dieter

Das schaut in der Tat seltsam aus…

versuchs so:


$status_Ankleide  = GetValueBoolean("ankleide_low_bat");
$status_bad = GetValueBoolean("bad_low_bat");
$status_buero = GetValueBoolean("buero_low_bat");
$status_kueche = GetValueBoolean("kueche_low_bat");
$status_Haustuer = GetValueBoolean("Tuerkontakt_Haustuer_low_bat");
$status_Keller = GetValueBoolean("Tuerkontakt_Keller_low_bat");
$status_Wohnzimmer = GetValueBoolean("TF_Wohnzimmer_low_bat");

$Status=($status_Ankleide or $status_bad or $status_buero or $status_kueche or $status_Haustuer or $status_Keller or $status_Wohnzimmer);

so long,

Toni

Hallo Dieter,

so wie es aussieht, hast Du Recht. Also muss ich umstricken.

Danke.

Hi Toni,

danke, ist aber das selbe, geht nur bei der ersten.

Klammern vergessen

in IPS getestet und oben korrigiert.

Das hatte ich schon angepasst:)

Im Moment habe ich es so.

Das geht soweit, bis auf das zurücksetzen.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Batterie_Status.ips.php
Trigger  : 
Interval : 
*/


$status_Ankleide = GetValueBoolean("ankleide_low_bat");
$status_bad = GetValueBoolean("bad_low_bat");
$status_buero = GetValueBoolean("buero_low_bat");
$status_kueche = GetValueBoolean("kueche_low_bat");
$status_Haustuer = GetValueBoolean("Tuerkontakt_Haustuer_low_bat");
$status_Keller = GetValueBoolean("Tuerkontakt_Keller_low_bat");
$status_Wohnzimmer = GetValueBoolean("TF_Wohnzimmer_low_bat");

$Status = array ("$status_Ankleide","$status_bad","$status_buero","$status_kueche","$status_Haustuer","$status_Keller","$status_Wohnzimmer");


if ($Status == false)
{
SetValueString("Batterie_voll", "Status OK");
echo "OK";
}
else //if ($status == true)
{
echo "leer";
}
?>

Edit: ja geht, hatte auch die Klammern beim Status vergessen!

Tschuldige, aber was du da hast ist Müll…

in $Status steht nun ein Array of Bool… Das hat nichts mehr mit Batterien zu tun…:rolleyes:

$Status wird niemals „true“ oder „false“ sein, weil es immer „array“ ist.

Toni

Hallo Rainer,

das Einlesen der Boolean-Variablen und deren gleichzeitige Verknüpfung ist OK. Dein erstes Skript ist also fast brauchbar.

Aber Du solltest Dich einmal mit Bool’scher Algebra befassen.

Die Variable $status wird bereits true, wenn nur ein einziger Sensor eine intakte Batterie meldet.

Sie wird nur dann false, wenn alle „low-bat“ melden.

Du musst also in diesem Falle (wegen der negativen Logik) nicht mit OR sondern mit AND verknüpfen.

Gruß
HJH

Hallo HJH,

das hatte ich auch probiert, ging aber auch nicht. Ich lerne es aber noch.

Hier jetzt das funktionierende Script.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Batterie_Status.ips.php
Trigger  : 
Interval : 
*/


$status_Ankleide = GetValueBoolean("ankleide_low_bat");
$status_bad = GetValueBoolean("bad_low_bat");
$status_buero = GetValueBoolean("buero_low_bat");
$status_kueche = GetValueBoolean("kueche_low_bat");
$status_Haustuer = GetValueBoolean("Tuerkontakt_Haustuer_low_bat");
$status_Keller = GetValueBoolean("Tuerkontakt_Keller_low_bat");
$status_Wohnzimmer = GetValueBoolean("TF_Wohnzimmer_low_bat");

$Status=($status_Ankleide or $status_bad or $status_buero or $status_kueche or $status_Haustuer or $status_Keller or $status_Wohnzimmer);

if ($Status == false)
{
SetValueString("Batterie_voll", "Status OK");
echo "OK";
}
else
{
SetValueString("Batterie_leer", "Batterie leer");
echo "Batterie leer";
}
?>

Im Prinzip hast du Recht. Nur die umgekehrte Logik besteht darin, dass, wenn ich das nun richtig weiss, keine intakten, sondern leere Batterien gemeldet werden.

Also stimmt RWNs Script nun so… Es genügt also wenn eine einzelne Batterie leer meldet um eine Message auszulösen. Ich denke das ist es was er will.

so long,

Toni

Hallo Rainer,

es war doch ein Fehler im Skript: vor der Klammer fehlte der Funktionsaufruf

So sollte es funktionieren (mit positiver Logik):

// Voraussetzung:
// XXX_low_bat ==  true, wenn Batterie schwach
// XXX_low_bat == false, wenn Batterie OK

$status = GetValueBoolean("ankleide_low_bat") or
          GetValueBoolean("bad_low_bat") or
          GetValueBoolean("buero_low_bat") or
          GetValueBoolean("kueche_low_bat") or
          GetValueBoolean("Tuerkontakt_Haustuer_low_bat") or
          GetValueBoolean("Tuerkontakt_Keller_low_bat") or
          GetValueBoolean("TF_Wohnzimmer_low_bat");

if ($status == false)
{
 SetValueString("Batterie_voll", "Status OK");
 echo "OK";
}
else
{
 echo "leer";
}

Gruß
HJH

Habt Vielen Dank ihr 3 für die Super schnelle Hilfe.

Habe wieder was gelernt und das ich wichtig.

Werde das ganze jetzt noch mit array´s ausstatten, so das genaue Meldungen erscheinen. Ich denke, wenn ich nicht weiter komme werde ich noch mal fragen.

Könnte hier mal jemand drüber sehen, ob man das eventuell auch eleganter lösen kann oder ob es so OK ist.
Ist ja schon eine Menge Code für ein paar Meldungen und es kommen noch einige hinzu. Funktion ist einwandfrei.

Achso, es werden einzelne Meldungen und eine Sammelmeldung ausgegeben.

Danke

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Batterie_Status.ips.php
Trigger  : 
Interval : 
*/


$status_Ankleide = GetValueBoolean("ankleide_low_bat");
$status_bad = GetValueBoolean("bad_low_bat");
$status_buero = GetValueBoolean("buero_low_bat");
$status_kueche = GetValueBoolean("kueche_low_bat");
$status_Haustuer = GetValueBoolean("Tuerkontakt_Haustuer_low_bat");
$status_Keller = GetValueBoolean("Tuerkontakt_Keller_low_bat");
$status_Wohnzimmer = GetValueBoolean("TF_Wohnzimmer_low_bat");

$Status=($status_Ankleide or $status_bad or $status_buero or $status_kueche or $status_Haustuer or $status_Keller or $status_Wohnzimmer);

if (!$Status)
{
SetValueString("Batterie_Meldung", "Batterie Status OK");
}
if (!$status_Ankleide)
{
SetValueString("FHT_Ankleide", "FHT Ankleide
Batterie Status
OK");
}
if (!$status_bad)
{
SetValueString("FHT_Bad", "FHT Bad
Batterie Status
OK");
}
if (!$status_buero)
{
SetValueString("FHT_Buero", "FHT Büro
Batterie Status
OK");
}
if (!$status_kueche)
{
SetValueString("FHT_Kueche", "FHT Küche
Batterie Status
OK");
}
if (!$status_Haustuer)
{
SetValueString("TFK_Haustuer", "TFK Haustür
Batterie Status
OK");
}
if (!$status_Keller)
{
SetValueString("TFK_Kellertuer", "TFK Kellertür
Batterie Status
OK");
}
if (!$status_Wohnzimmer)
{
SetValueString("TF_Wohnzimmer", "TF Wohnzimmer
Batterie Status
OK");
}
if ($Status)
{
SetValueString("Batterie_Meldung", "Batterie leer ");
}
if ($status_Ankleide)
{
SetValueString("FHT_Ankleide", "FHT Ankleide
Batterie leer");
}
if ($status_bad)
{
SetValueString("FHT_Bad", "FHT Bad
Batterie leer");
}
if ($status_buero)
{
SetValueString("FHT_Buero", "FHT Büro
Batterie leer");
}
if ($status_kueche)
{
SetValueString("FHT_Kueche", "FHT Küche
Batterie leer");
}
if ($status_Haustuer)
{
SetValueString("TFK_Haustuer", "TFK Haustür
Batterie leer");
}
if ($status_Keller)
{
SetValueString("TFK_Kellertuer", "TFK Kellertür
Batterie leer");
}
if ($status_Wohnzimmer)
{
SetValueString("TF_Wohnzimmer", "TF Wohnzimmer
Batterie leer");
}
?>

Hallo Rainer,

wie wär’s damit:

$raeume = array( "ankleide_low_bat"             => array("FHT Ankleide",  "FHT_Ankleide"  ),
                 "bad_low_bat"                  => array("FHT Bad",       "FHT_Bad"       ),
                 "buero_low_bat"                => array("FHT Büro",      "FHT_Buero"     ),
                 "kueche_low_bat"               => array("FHT Küche",     "FHT_Kueche"    ),
                 "Tuerkontakt_Haustuer_low_bat" => array("TFK Haustür",   "TFK_Haustuer"  ),
                 "Tuerkontakt_Keller_low_bat"   => array("TFK Kellertür", "TFK_Kellertuer"),
                 "TF_Wohnzimmer_low_bat"        => array("TF Wohnzimmer", "TF_Wohnzimmer" )
               );
$status = GetValueBoolean($IPS_VARIABLE);
$var = $raeume[$IPS_VARIABLE][1];
$meldung1 = $raeume[$IPS_VARIABLE][0];
$meldung2 = "
Batterie Status
";
$meldung3 = ($status) ? "OK" : "leer";
SetValueString($var, $meldung1. $meldung2. $meldung3);

Zuvor musst Du die XXX_low_bat Variablen unter Events als Trigger-Variablen mit dem Typ OnChange eingetragen haben.

Gruß
HJH

@HJH
das ist fein :slight_smile:

Vielleicht ist das der falsche Weg. HJH schreibt bestimmt kurzen und effektiven Code - Keine Frage. Aber verstehst du ihn auch? Denk immer daran, dass du in einem Jahr oder zwei vielleicht mal was ändern willst oder einen Fehler suchst.

Ich versuche hier im Forum, grade bei Anfängern, möglicht einfachen, übersichtlichen Code zu posten und wundere mich immer wieder was für komprimierte Code-Klötze, grade von den Laien, bevorzugt werden.

HJH, Olli und auch ich haben kein Problem damit den Code zu lesen, zu interpretieren und zu verstehen. Kannst du das auch noch, wenn du zuhause mal allein davor sitzt? Denk bitte daran, dass dir das Forum vielleicht nicht immer zur Verfügung steht wenn du mal ein Problem mit diesem Code hast. Wichtig ist, dass du verstehst was in deinem Server, also in deinem Haus, vorgeht. Sonst baust du dir ein System, dass du hinterher selbst nicht bedienen kannst.

Du musst schlimmstenfalls auch allein noch mit dem Code klarkommen wenn du dich ein Jahr oder länger überhauptnicht mehr mit PHP beschäftigt hast. Denk da bitte drüber nach.

@HJH: Sollte keine Kritik an deinem Code sein :wink:

Toni

Hallo Toni,

Du hast absolut Recht.

Ich muss gestehen, dass ich den Code bewusst unkommentiert gepostet habe, einfach um eine Reaktion zu provozieren. :smiley:

Mir ist beim Schreiben des Codes durchaus klar geworden, dass mit jedem weiteren Schritt in Richtung Kompaktheit die Verständlichkeit irgendwann auf der Strecke bleibt.

Der Schlüssel zum Code liegt hier im Verständnis von PHP-Arrays.
Der Rest ist eigentlich harmlos.

aber im Allgemeinen ist die Vorgehensweise, Einsteigern PHP nach Deiner Methode nahe zu bringen, sicher die bessere Wahl.

Gruß
HJH

Finde es ein super vorbild wie der ganse thread sich zusammen gebaut hat.
Und dann letztlich mit arrays arbeiten… super !
Wer sich schon mal das ganse durchgelesen hat, bekommt die array-sache sicher mit.

Nur die kombination durch und trigger und array wird es schwierig machen um es zu kapieren.

Deshalb: (wenn HJH es zulasst)


//lege ein array an die beeinhaltet: 
//   die verknupfte low-bat variable   <- hierdurch wird dieses script getriggert
//   die nahmen vom derre ausgabe-string
//   und wie wir den raum heissen möchten im status tekst.

$raeume = array( "ankleide_low_bat"             => array("FHT Ankleide",  "FHT_Ankleide"  ), 
                 "bad_low_bat"                  => array("FHT Bad",       "FHT_Bad"       ), 
                 "buero_low_bat"                => array("FHT Büro",      "FHT_Buero"     ), 
                 "kueche_low_bat"               => array("FHT Küche",     "FHT_Kueche"    ), 
                 "Tuerkontakt_Haustuer_low_bat" => array("TFK Haustür",   "TFK_Haustuer"  ), 
                 "Tuerkontakt_Keller_low_bat"   => array("TFK Kellertür", "TFK_Kellertuer"), 
                 "TF_Wohnzimmer_low_bat"        => array("TF Wohnzimmer", "TF_Wohnzimmer" ) 
               ); 

//gib mir den status von die variable die mich (dieser script) getriggert hat (true/false)
$status = GetValueBoolean($IPS_VARIABLE); 

//lese im array wie der statusvariable heisst
$var = $raeume[$IPS_VARIABLE][1]; 

//lese im array wie ich der raum genannt habe
$meldung1 = $raeume[$IPS_VARIABLE][0];

//
 : starte auf eine neue linie 
$meldung2 = "
Batterie Status
"; 

//schnell condition: gleicht if ($status) { $meldung3="OK"; } else { $meldung3="leer";}
$meldung3 = ($status) ? "OK" : "leer"; 

//schiebe alles zuruck im statusvariable
SetValueString($var, $meldung1. $meldung2. $meldung3); 

Und was HJH vergessen ist in sein eifer :smiley:


// setzen vom algemeine meldung

//wen es schon einem lehre batterie gibt
if (!$IPS_VARIABLE){
    //nur bei false-wert
    SetValueString("Batterie_Meldung", "Batterie leer");
} else {
    //nachsehen ob es noch andere lehre batterien gibt
    //anders muss die algemeine meldung zuruckgesetst werden.
    
    // init
    $result = false;

    // foreach = durchlaufe jedem wert des array
    // und nehme den einzelne element nahme in $key  (ist gleich aus die variable-nahmen)
    // und schiebe in $value die beide werte rein (also ist $value eigentlich jetzt ein array)
    // $value wird hier nicht gebraucht
    foreach($raume as $key => $value){
        //lese alle variable und addiere derren status
        //lauft nur bei true deshalb oben erst den $result=false init
        if (GetValueBoolean($key)) $result = $result or true;
    }
    //bei $result true (alle batterien sind ok) neue algemeine botschaft setzen
    if ($result) SetValueString("Batterie_Meldung","Batterie OK");
}
//Fertig

Bitte um strukturiertes ubernehmen im wiki als beispiel in die newbie-ecke (Tony’s Handbuch)

Bei mir läuft das Script nicht. Getriggert ist alles.

Notice: Undefined variable: IPS_VARIABLE in C:\IPS\scripts.currentscript on line 23

Notice: Unable to locate IPSVariable: in C:\IPS\scripts.currentscript on line 23

Notice: Undefined variable: IPS_VARIABLE in C:\IPS\scripts.currentscript on line 24

Notice: Undefined index: in C:\IPS\scripts.currentscript on line 24

Notice: Undefined variable: IPS_VARIABLE in C:\IPS\scripts.currentscript on line 25

Notice: Undefined index: in C:\IPS\scripts.currentscript on line 25

Warning: Unable to locate IPSVariable: in C:\IPS\scripts.currentscript on line 28