Was mache ich hier falsch?

Rainer…

Sorry, wir (das forum) gehen immer davon aus das scripte automatisch laufen und niemals per execute-button … wie du gerade probiert hasst.

Schreibe mal oben dein script folgendes:


if ($IPS_SENDER=="Execute") $IPS_VARIABLE="ankleide_low_bat";

Damit simulierst du alsob die ankleide_low_bat einem neuen wert bekommt und dadurch das script getriggert wird, wenn du auf execute druckst.

Simulieren mach ich über ändern des Typs. von false auf true oder umgekehrt.

Es geht! nur falsch herrum oder ich habe ein Verständniss Problem mit true und False.

False ist Batterie voll, wenn True dann Batterie leer.?

Oder bin ich hier auf dem Holzweg. False ist ja vorgegeben.

Zumindest stimmt die Anzeige in meinem Script:confused:

Es wird nicht der batteriestatus gemeldet sondern ob die Batterie zuende geht und somit Handlungbedarf besteht.

Als etwa so:

Batteriealarm: False -> alles okay
Batteriealarm: True -> Batterie geht zu ende.

Du selbst schreibst doch auch „ankleide_low_bat“ - ist sie low? True - also leer = Handlungsbedarf! Andernfalls eben nicht. Logisch oder?

Toni

Hallo Rainer, hallo Toni,

ich habe versehentlich in meinem Kurz-Skript die TRUE- und FALSE-Terme vertauscht:

statt:

$meldung3 = ($status) ? "OK" : "leer";

muss es so heißen:

$meldung3 = ($status) ? "leer" : "OK";

oeder alternativ:

$meldung3 = (!$status) ? "OK" : "leer";

Gruß
HJH

DIe globale variable ist dan also doch recht…
Wenn ich es geschreiben habe - war ich ganz vom eis. Was ist jetzt true / false… „egal“ habe ich mich gedacht - das oberige script lauft auch so.

Hallo HJH,

ich habe versehentlich in meinem Kurz-Skript die TRUE- und FALSE-Terme vertauscht:

da hätte ich auch selbst drauf kommen müssen:mad:

Nochmal Vielen Dank an alle die mir hierbei geholfen haben:)

Anbei noch das fertige Script so wie es bei mir nun läuft

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


//Einzelmeldungen, Zusammenfassung in einem Array

$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" ),
               );
                 //$IPS_VARIABLE[1]                     //$IPS_VARIABLE[0]


$status = GetValueBoolean ($IPS_VARIABLE); //Status von der Variable mit der Variable die getriggert hat.true/false
$var = $raeume[$IPS_VARIABLE][1];          //Welche Variable hat getriggert
$meldung1 = $raeume[$IPS_VARIABLE][0];     //Wie heißt die Zugehörigkeit der getriggerten Variable
$meldung2 = "
Batterie Status
";
$meldung3 = ($status) ? "leer" : "OK";
SetValueString($var, $meldung1. $meldung2. $meldung3);  //Ausgabe der Meldung(en)

//Sammelmeldung, Ausgabe auf allgemeiner Seite

if (!$status)
{
SetValueString("Batterie_Meldung", "Batterie Status OK");
}
else
{
SetValueString("Batterie_Meldung", "Batterie leer");
}
?>

Hallo Rainer,

Deine Sammelmeldung ist nur eine Einzelmeldung. Sie sollte aber alle Batterie-Zustände berücksichtigen.

Das folgende Skript ist ähnlich aufgebaut wie das von Fredje vorgeschlagene:

$sammelstatus = false;
$keys = array_keys($raeume);
foreach ($keys as $key)
 $sammelstatus = $sammelstatus or GetValueBoolean($key);
$sammelmeldung = ($sammelstatus) ? "leer" : "OK";
SetValueString("Batterie_Meldung", "Batterie Status ". $sammelmeldung);

Jetzt wird „leer“ gemeldet, solange noch mindestens eine leere Batterie vorhanden ist.

Gruß
HJH

Hallo HJH,

ich kapituliere:mad:

es geht bei mir nicht, lese jetzt schon seit 6 Stunden die Heilige Schrift des PHP :slight_smile: aber irgendwie mach ich was falsch.

Getestet wird so.

if ($IPS_SENDER=="Execute") $IPS_VARIABLE="ankleide_low_bat";
if ($IPS_SENDER=="Execute") $IPS_VARIABLE="bad_low_bat";
if ($IPS_SENDER=="Execute") $IPS_VARIABLE="TF_Wohnzimmer_low_bat";

SetValueBoolean ("ankleide_low_bat", false);
SetValueBoolean ("bad_low_bat", true);
SetValueBoolean ("TF_Wohnzimmer_low_bat", false);

Nach jedem ändern von true auf false, speichern und dann ausführen.

Soweit ich das verstanden habe.

array_keys() gibt die Schlüssel (numerisch und String) des Arrays input zurück. $keys = array_keys ($raeume); Also true oder false.

foreach ($keys as $key) durchsucht das Array und weisst den Schlüssel true oder false $key zu.

Hilfe:confused:

Rainer,

Arrays sind schwierig… und sicher wenn es eine array in arrays sind…
fängen wir mal einfach von vorne an :


$raeume = array( "ankleide_low_bat" => "FHT_Ankleide"  ), 
                 "bad_low_bat" => "FHT_Bad" ), 
                 "buero_low_bat" => "FHT_Buero" ), 
               ); 

Jetzt habe ich eine 3x1 matrix mit werte = array
reihe 1 heisst ‚ankleide_low_bat‘ und darein steckt den wert ‚FHT_Ankleide‘ als string
reihe 2 heisst ‚bad_low_bat‘ und hat den wert ‚FHT_Bad‘)
usw.

jetzt:


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; 
    }

Was tut foreach.
Fur jedem wert in $raume (array) tue:
stecke in variable $key den wert „ankleide_low_bat“ und in $value „FHT_Ankleide“
wenn die GetValueBoolean(„ankleide_low_bat“) = true dann gleicht $result = $result or true;

gehe zum naechsten wert und stecke "bad_low_bat" in $key, und "FHT_bad" in $value

usw…

In das ursprungliche script wird eine 5x2x2 matrix von werte angelegt.
zb: „buero_low_bat“ => array(„FHT Büro“, „FHT_Buero“ ),
das heisst das eine reihe „buero_low_bat“ heisst und die werte „FHT Büro“ und „FHT_Buero“ befasst. Bei der 2e array werden die reihen nicht benannt… also mussen wir diese elemente addressieren mit index(0) und index(1)
wenn wir jetzt wieder diese foreach() laufen lassen mit
foreach($raume, $key => $value);
dann kommt "buero_low_bat’ im $key zu stehen, und in $value steckt die array (0: FHT_Büro, 1: FHT_Buero)
wenn ich jetzt den booleanwert schreiben möchte dann muss ich:


if (GetValueBoolean($key)) SetValueBoolean($value[1],true);
//heisst: wenn GetValueBoolean("buero_low_bat") = true dann schreiben true in IPS Variable FHT_Buero
// oder
SetValueBoolean("FHT_Buero")

Capiche ?

Schwierig ich weisst… aber spass garantiert wenn du es kappiert hast.

Was dein script auch schwierig macht : was ist true und was ist falsch… ist true die batterien sind alle? true <> batterien fertig… wurde gefuhlsmässig mehr batterien fertig = false (also sprich ‚nicht gut‘, falsch)…
Aber dann stimmt die benennung „buero_low_bat“ auf wieder nicht -> deshalb ist dein script schwierig.

mein tipp: halte positieve (also ‚gute‘) werte immer true und gehe davon aus… Also deine variable umbenennen als buero_bat und dann kommt den wert true als ‚gut‘ raus. Bei false ist er ‚schlecht‘.

Einfach.

Happy Hunting, aber melde dich bitte wenn du es nicht kappierst.

Schönen abend

Hi GGGss und auch HJH und die anderen,

Ihr seit tolle Lehrmeister, wenn man hier nichts lernt, wenn dann wo :slight_smile:

@GGGss „Super tolle Beschreibung“, Danke´.

mein tipp: halte positieve (also ‚gute‘) werte immer true und gehe davon aus… Also deine variable umbenennen als buero_bat und dann kommt den wert true als ‚gut‘ raus. Bei false ist er ‚schlecht‘.

Die Werte werden aber doch vorgegeben? Batterie_OK =false, Batterie_leer =true

Anderst: Schalter Aus=false, Schalter Ein=true? wahr oder nicht wahr
Schalter= True Licht brennt
Schalter= False Licht aus ist klar und vorgegeben.

Ich müsste ja die vorgegebenen Variablen von z.B. false umkehren nach true? bei Bat_low.

Oder es ist das was ich nicht verstanden habe :confused: man gibt nicht low_bat, sondern high bat ein.

Würde heißen in meinem Fall, da ich ja die Variable selber vorgebe, sollte die Variable für Batterie = voll, true heissen müssen.

Ich denke ich bin auf den richtigen Wege :slight_smile:

Hallo Rainer,

man sollte immer bestrebt sein mit positiver Logik zu arbeiten, da diese am ehesten der natürlichen Denkweise entspricht. Aber letztendlich ist es egal, solange man sie konsequent handhabt.

Dein letztes Skript tut sicher nicht das, was Du erwartest:

if ($IPS_SENDER=="Execute") $IPS_VARIABLE="ankleide_low_bat";
if ($IPS_SENDER=="Execute") $IPS_VARIABLE="bad_low_bat";
if ($IPS_SENDER=="Execute") $IPS_VARIABLE="TF_Wohnzimmer_low_bat";

Die if-Bedingung ist in den ersten drei Zeilen immer die selbe. Daher kannst Du sie so zusammenfassen:

if ($IPS_SENDER=="Execute")
{
  $IPS_VARIABLE="ankleide_low_bat";
  $IPS_VARIABLE="bad_low_bat";
  $IPS_VARIABLE="TF_Wohnzimmer_low_bat";
}

Und jetzt wirst Du sicher besser erkennen, dass die ersten beiden Zeilen in der Block-Anweisung (die Anweisungen zwischen den geschweiften Klammern) nicht sonderlich sinnvoll sind. Dort wird dreimal der selben Variablen ($IPS_VARIABLE) ein Wert zugewiesen. Eine Variable kann natürlich nur einen einzigen Wert annehmen. So bleibt also nur die letzte Zuweisung wirksam. Die ersten beiden werden zwar ausgeführt, aber durch die darauffolgende sofort wieder zunichte gemacht.

Jetzt stellt sich also die Frage: Was willst Du eigentlich erreichen?

Gruß
HJH

Moin HJH,

das war alles nur angedacht zum Testen.

Wenn ich darf, zeige ich auch gern den Verlauf der einzelnen Seqenzen auf!

Hallo Rainer,

noch ein paar ergänzende Worte zu Arrays:

Ein Array ist eine Sammlung von Werten. Die Werte eines Arrays nennt man Elemente. Bei der Definition eines Arrays werden diese durch Kommas voneinander getrennt. Hier ein sehr einfaches Array mit 5 Elementen:

$geradeZahlen = array(2, 4, 6, 8, 10);

In PHP kann ein Element von beliebigem Datentyp sein, also Integer, Float, String, Boolean und andere. Ein Element kann sogar selbst ein Array sein.

Wenn man auf ein Element zugreifen möchte (Adressierung), muss man seinen Index kennen. Der Index ist die Platznummer, wobei die Zählung bei 0 (Null) beginnt.

$zahl = $geradeZahlen[3]; // $zahl erhält den Wert 8

Anstatt einen Index zu verwenden kann man auch den Speicherplatz über seinen Namen ansprechen. Dazu muss aber das Element mit einem Namen versehen sein.

$geradeZahlen = array(2, 4, 6, "vierte Zahl" => 8, 10);

Hier hat der vierte Speicherplatz den Namen „vierte Zahl“ bekommen. Und so wird er verwendet:

$zahl = $geradeZahlen["vierte Zahl"]; // $zahl erhält den Wert 8

Das Array $raeume enthält also 7 mit Namen benannte Elemente. Jedes dieser Elemente besteht aus einem Array mit 2 Elementen, Von denen jedes Element vom Typ String ist.

$keys = array_keys($raeume);

Die Funktion array_keys() liefert die Namen (keys) der Elemente. Das Ergebnis dieser Funktion ist ebenfalls ein Array, dessen Elemente die Namen der Elemente des Arrays $raeume sind.

So, ich glaube das verwirrend genug für heute.

Gruß
HJH

Hi HJH;

Danke, aber wir reden da im Moment aneinander vorbei.

Hallo HJH und GGGss,

nochmal 1000 Dank für die sehr ausführliche und aufschlußreiche Hilfe.

Batterie true = leer
Batterie false = OK

Jetzt macht das Script genau das was es machen soll, nämlich „Batterie leer melden“ bis auch die letzte leere Batterie gewechselt wurde und dann erst wieder OK!
Ich habe es mit deinem Script und auch GGGss Script nicht hinbekommen, die Sammelmeldung:confused:

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


//Einzelmeldungen, Zusammenfassung in einem Array

$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); //Status von der Variable mit der Variable die getriggert hat.true/false
$var = $raeume[$IPS_VARIABLE][1];          //Welche Variable hat getriggert
$meldung1 = $raeume[$IPS_VARIABLE][0];     //Wie heißt die Zugehörigkeit der getriggerten Variable
$meldung2 = "
Batterie Status
";
$meldung3 = ($status) ? "leer" : "OK";
SetValueString($var, $meldung1. $meldung2. $meldung3);  //Ausgabe der Meldung(en)

//Sammelmeldung, Ausgabe auf allgemeiner Seite

if ($status)
{
    //nur bei true-wert
    SetValueString("Batterie_Meldung", "Batterie leer");
}
else
{
    //nachsehen ob es noch andere leere Batterien gibt
    //anders muss die allgemeine meldung zurückgesetzt werden.

    // init
    $result = true;

    // foreach = durchlaufe jede Wert des array
    // und nehme den einzelne element name in $key  (ist gleich aus die variable-namen)
    // und schiebe in $value die beiden Werte rein (also ist $value eigentlich jetzt ein array)
    // $value wird hier nicht gebraucht
    foreach($raeume as $key => $value)
    {
        //lese alle Variablen und addiere deren Status
        //lauft nur bei false deshalb oben erst den $result=true init
        if (GetValueBoolean($key)) $result = false;
    }
    if ($result) SetValueString("Batterie_Meldung", "Batterie Status OK");
}

?>

Rainer …

logisch das es nicht funzt:


// init 
    $result = true; 

    // foreach = durchlaufe jede Wert des array 
    // und nehme den einzelne element name in $key  (ist gleich aus die variable-namen) 
    // und schiebe in $value die beiden Werte rein (also ist $value eigentlich jetzt ein array) 
    // $value wird hier nicht gebraucht 
    foreach($raeume as $key => $value) 
    { 
        //lese alle Variablen und addiere deren Status 
        //lauft nur bei false deshalb oben erst den $result=true init 
        if (GetValueBoolean($key)) $result = false; 
    } 
    if ($result) SetValueString("Batterie_Meldung", "Batterie Status OK"); 
} 

jetzt die änderung:
Habe die variablen in nahmen geändert so das die ihre positive-logik behalten.
$result heisst jetzt $low_bat


// init 
//-> edit hier
    $low_bat = false;  //normal sind alle batterien ok 

    // foreach = durchlaufe jede Wert des array 
    // und nehme den einzelne element name in $key  (ist gleich aus die variable-namen) 
    // und schiebe in $value die beiden Werte rein (also ist $value eigentlich jetzt ein array) 
    // $value wird hier nicht gebraucht 
    foreach($raeume as $key => $value) 
    { 
        //lese alle Variablen und addiere deren Status 
        //lauft nur bei false deshalb oben erst den $result=true init 
        if (GetValueBoolean($key)) $low_bat = true or $low_bat; //<- hier muss das vorherige resultat mit abgeglichen werden. sehe **
    } 
    if (!$low_bat) SetValueString("Batterie_Meldung", "Batterie Status OK");  //auch geändert
} 

2 sachen:
if (GetValueBoolean($key)) $low_bat = $low_bat or true;
diese zeile wird nur ausgefuhrt wenn $key = true also immer ‚or true‘
jetzt habe ich einem problem gefunden in .php und or
true or false = true
aber
false or true = false :confused:

in diesem stuck script gehen wir davon aus das es keine lehre batterien geben, und lassen die $low_bat variable änderen wenn es eine (1) lehre batterie gibt.
Das heisst also das den wert immer false bleiben soll solange es keine neue true gibt als resultat von einlesen von GetValueBoolean… Noch mit?
Deshalb mussen wir die false werte mit true vergleichen um letztendlich eine true zu bekommen. Gestehe : habe dies testen mussen um es funzen zu lassen:


$res = false or true;
$res2 = true or false;
echo("false or true = '$res'  true or false = '$res2'");

ergibt:

false or true = ''  true or false = '1'

Also ergibt die reihenfolge im $low_bat = $low_bat or true, eine anderem resultat wie $low_bat = true or $low_bat
und wir brauchen eine $low_bat=true !

Und jetzt soll’s arbeiten :cool:

Hallo GGGss,

nicht das wir uns Missverstehen :slight_smile: das Script funktioniert so, wie ich es oben angegeben habe!

Aber da bekanntlich viele Wege nach Rom führen, werde ich deine Änderungen auch noch mal ausprobieren.

Trotzdem Danke für deine Bemühungen.

Ich dachte :

Ich habe es mit deinem Script und auch GGGss Script nicht hinbekommen, die Sammelmeldung

und damit bin ich noch mal im 3en gang gefahren :wink:

Super das es funzt!
Ideal als vorbild fur die eingsteiger-ecke im wiki.
Ein beispiel die ‚nur‘ variablen braucht und einem technischem aspect des .php beibringt. Hier ist das thema array

Hallo GGGss,

sorry, wenn ich mich etwas falsch formuliert hatte, gelobe Besserung :slight_smile:

Trotzdem ziehe ich meinen Hut vor euch allen die grade uns(mir) Einsteigern nicht lapidar, sondern sehr ausführlich Hilfe geben.
Die PHP-Bibel ist da auch sehr hilfreich, allerdings mangelt es zumindest dann bei mir meist an der Umsetzung.
Ohne Toni´s (auch das Handbuch), HJH (mit seinen super Beispielscripten) und deiner Hilfe, wäre ich längst noch nicht soweit.

In diesem Sinne ein schönes Wochenende!