Anfängerfehler in Skript

Hallo, da ich erst seit 1 Tag mit PHP und Scripten arbeite, habe ich zwar schon einiges gelernt und viel gelesen, nur komm ich Aktuell bei diesem Problem nicht weiter.

Und zwar soll eigentlich nur anzeigen wie viele Stunden das BHKW schon am laufen ist. Tele habe ich hier aus dem Forum kopiert und angepasst.

<?

 $Status = GetValueBoolean("BHKW_EIN");
if ($Status == false) 			                                // BHKW schaltet ein
{
  SetValueInteger("Startzeit", time());              // Einschaltzeit merken
}
else                                                 // Brenner schaltet wieder aus
{
  $laufzeit = GetValueInteger("BHKW_Laufzeit");      // bisherige Laufzeit
  $startzeit = GetValueInteger("Startzeit");         // Startzeit holen
  $dauer = time() - $startzeit;                      // Dauer berechnen
  $laufzeit = $laufzeit + $dauer;                    // Dauer zur bisherigen Laufzeit hinzuaddieren
  SetValueInteger("BHKW_Laufzeit", $laufzeit);       // neue Brennerlaufzeit abspeichern
}

?>

als Wert bekomme ich 1.323.542.899 heraus. Ich kann nur nix damit anfangen, geschweige deuten was es sein soll.
Es gibt auch ein fertiges Sript für Betriebsstunden, nur da stand was von 343 Tagen eingeschaltet drin. Mir fehlt noch etwas grundwissen um voran zu kommen… Vielleich kann sich das Jemand mal anschauen…

Hi Udo,

das ist ein UNIX-Timestamp,
den kann man in ein lesbares Format umwandeln:


$date = date("H:i:s, d.m.Y" , 1323542899);
echo "Datum: $date";

Ergebnis:


Datum: 19:48:19, 10.12.2011

… jetzt nochmal genauer nachgefragt: was meinst Du mit

„…nur anzeigen wie viele Stunden das BHKW schon am laufen ist…“

a) wieviele Stunden seit dem letzten Einschalten
b) Laufzeit insgesamt (quasi Betriebsstundenzähler)?

Hi Raketenschnecke,
erstmal danke für die superschnelle Antwort, es soll bei mir im Webfront nur stehen wie lange das BHKW aktuell schon läuft. Das mit den gesammten Betriebsstunden soll auch noch dazu, es geht halt nur langsam voran wenn man da ganz neu ist…
Dann kannst du mir bestimmt auch sagen wie ich
… („H:i:s, d.m.Y“ , 1323542899); anstatt der Zahl 1323… dort eine Variable hinbekomme…

ich weiß ich muß da noch viel lernen… wie z.b. $startzeit

Gruß Udo

kein Problem,

zunächst solltest Du Dir angewöhnen die Variablen nicht per Namen zu definieren sondern per ID

nicht gut (bezieht sich auf das „BHKW_EIN“):


$Status = GetValueBoolean("BHKW_EIN");

besser:


$Status = GetValueBoolean(12345);

12345 = die ID der betreffenden Variable, findest Du im Objektbaum.

Zur Frage: Poste dochmal den Ausschnitt der Variablen aus deinem Objektbaum die mit dem BHKW zu tun haben. Ich befürchte das das Script was ganz anderes macht als Du denkst.

Hm möglich ist das, im moment experementiere ich und schau mir an was passiert…
Mir dämmert es erst langsam wie Ipsym mit den ganzen Variabelen usw. umgeht, aber der PHP Syntax ist mir noch Rätselhaft…

ist schon ok, wir alle haben mehr oder weniger so angefangen (ich mit weniger :D)

so wie dein Objektbaum aussieht müssen die Daten von irgend einer Schnittstelle ins IPS geliegert werden und die Variablen mit aktuellen Werten updaten. ich kann nur nicht erkennen wie. Das Thema könne wir aber auch erstmal parken.

für die o.g. Frage bietet es sich z.B., an den Timestamp der letzten Änderung der Variable „BHKW_Status“ abzufragen. Evtl. ginge auch „Startzeit“, nur ist mir in diesem Kontext die genaue Bedeutung nicht klar (macht nur Sinn wenn dieser Wert vom BHKW geliefert wird).

Bleiben wir mal beim Beispiel „BHKW_Status“. Du fragst den Timestamp der letzten Variablenänderung wie folgt ab:


$bhkw_status = getvalueBolean(45338); // um welche Variable aus dem Objektbaum geht es?

if ($bhkw_status == false) // Prüfung: ist der Status der Variable "Ein/false"? -> wenn ja dann:
{
   $var_infos = IPS_GetVariable(45338); //hole alle Variableninformationen
  $var_timestamp = $var_infos["VariableChanged"]; // gebe mir den Wert des Parameters "VariableChanged" zurück
  echo "letzte Änderung um ".date("H:i:s, d.m.Y" , $var_timestamp); // gebe den formatierten Timestamp (aus "VariableChanged" ) aus
}

Das Script macht folgendes:

  1. wird der Script-Variable „$bhkw_status“ die ID der IPS-Variable im „BHKW_Status“ aus dem Objektbaum zugewiesen
  2. Das Script prüft, ob der Status der Variable auf „Ein“ steht (in diesem Fall ist das vermutlich der Bool-Wert „False“)
  3. wenn die Prüfung positiv ist holt das Script den Timestamp der letzten Änderung aus den IPS-Variablen-Infos
  4. Das Script wandelt den Unix-Timestamp in ein lesbares Format um und gibt es per echo aus 8zusehen im unteren Scriptfenster und im Meldungsfenster

das Script müsste per Ereignis auf "Variablenänderung der Variable „BHKW_Status“ getriggert werden.
Wenn der vom Script ausgegebene Wert auch im WFE angezeigt werden soll, muß der per „echo“ ausgegebene Wert in eine zusätzliche Variable geschrieben werden. Diese wird dann ins WFE verlinkt und schon kannst Du dort sehen wann das BHKW zuletzt eingeschaltet wurde.

War doch einfach, oder ?

:D:D:D

nee, im Ernst: Du wirst vermutlich ne Weile brauchen um das nachzuvollziehen. PHP.net ist ne sehr gute Hilfe, dieses Forum auch. Du wirst mindestens beides brauchen. Also: bei Fragen -> fragen!
:wink:

Soooo das habe ich hinbekommen, funzt auch soweit, nur wie bekomme ich die Echo ausgabe in eine IPS Variabele - die $var_timestamp kann ich ja nicht nehmen… ins WFE einbinden ist kein Problem, da habe ich nach etlichen Änderungen schon übung drin.

die Variable BHKW_Status 43558 kommt von dem Homematic Modul mit den 12 Eingeängen, habe den Namen nicht parat, das klappt auch ohne Probleme!

Danach wird dann wieder erst gelesen… und im Keller das EKM868 installiert…

immer locker bleiben, wir gehen da Schritt für Schritt ran - sonst minimiert sich der Lerneffekt :wink:

Den Wert, den Du im WFE anzeigen willst haben wir mit dem Script bereits ermittelt, er stekt in der Script-Variablen $var_timestamp drin. Nun schreibt man diesen Wert (noch ist es ein UNIX-TS) in eine IPS-Variable. Prinzipiell geht das so:


setValueInteger(12345, $var_timestamp);

übersetzt: setValueInteger => schreibe einen Integerwert in die IPS-Variable mit der ID „12345“, den Wert der da reingeschrieben werden soll steckt in der Scriptvariable „$var_timestamp“.
Dann würde z.B. 1323542899 in der IPS-Variable stehen und auch so im WFE angezeigt werden.

Wenn Du die Uhrzeit aber lesbar dargestellt haben willst musst Du den Unix-TS in ein lesbares Format umwandeln. Das hatten wir schon, wenn wir jetzt Beides kombinieren kommt folgendes Script heraus:


$bhkw_status = getvalueBolean(45338); // um welche Variable aus dem Objektbaum geht es? 

if ($bhkw_status == false) // Prüfung: ist der Status der Variable "Ein/false"? -> wenn ja dann: 
{ 
   $var_infos = IPS_GetVariable(45338); //hole alle Variableninformationen 
  $var_timestamp = $var_infos["VariableChanged"]; // gebe mir den Wert des Parameters "VariableChanged" zurück 
  echo "letzte Änderung um ".date("H:i:s, d.m.Y" , $var_timestamp); // gebe den formatierten Timestamp (aus "VariableChanged" ) aus
  setValue(12345, date("H:i:s, d.m.Y" , $var_timestamp));// schreibe den umgewandelten Unix-TS in die IPS-Variable "12345" 
} 

Wichtig: der in die Variable zu schreibende Wert ist nun vom Typ her kein Integer mehr sondern ein String. Daher muß auch die IPS-Variable (wo der Wert reingeschrieben werden soll) vom Typ „String“ sein.