Betriebsstunden - Erfassung

Hallo,

leider bin ich mit meinem php noch gaaanz am Anfang.

ich möchte die Betriebsstunden meines Brenners auslesen bzw. diesen Wert im script weiter behandeln. Ich habe Steiners Brenner ein/aus Steuerung sowie das „wann sind wir aufgestanden“- script versucht zu verstehen und für meine Zwecke umzuschreiben aber ich komm’ einfach nicht drauf.
Also wenn der Wert $Brenner true ist, soll das Ding zählen und bei false stoppen. Schön wäre noch eine Formel für die Laufzeit/Tag (Nullstellung+Neustart alle 24h).
Ich hoffe, das weitere kann ich dann daraus ableiten.
den Unix-Zeitstempel habe ich mittlerweile verstanden - aber wie weiter?

Ein ganz einfaches script mit genauer Erklärung wäre sehr nett!

Danke für alle Tipps

Ralf

Hallo Ralf,

beim Workshop waere es fuer Dich am einfachsten, das zu erhalten. Im Moment habe ich leider keine Zeit, Dir mal schnell die paar Zeilen zu pinseln…sorry.

Gruss Torro

ok - dachte ich mir schon. Ich wäre auch gerne gegangen, hatte aber schon andere Termine.
Ich dachte sowieso, DIESES Rad muss bestimmt nicht neu erfunden werden…hat doch bestimmt schon einer eingebaut, oder?

Naja - eilt auch wirklich nicht;)

… und ich gehe zum Workshop.

Wenn ich da etwas „rausziehen“ kann, hast du auch was davon :wink:

Hallo Ralf,

um es ein bischen einfacher zumachen, sag doch mal, was genau Du willst.

ich möchte die Betriebsstunden meines Brenners auslesen bzw. diesen Wert im script weiter behandeln.

Steht der Wert schon in einer Variablen zur Verfügung oder musst Du dir erst noch Gedanken machen wie Du ihn bekommst ?

Wenn ja, als bol oder integer Wert. Wenn nein, wie stellst Du dir das vor ?

Hi Ralf,

hier mal ein Betriebsstundenzähler den ich ziemlich am Anfang meiner PHP Karriere gebaut habe und seitdem auch nicht mehr geändert habe. Ist vielleicht etwas umständlich, aber er läuft :wink:


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Betriebsstundenzaehler_Kessel.ips.php
Trigger  : 
Interval : 
*/
$told = GetValueInteger("Oldtime_Kessel"); //alter Minutenwert
$BM = GetValueBoolean("BM_Kessel"); //BM Gerät

If ($BM == 1){
IPS_SetScriptTimer("Betriebsstundenzaehler_Kessel",60);
$minute = ($told + 1);
$time = $minute/60;
$m1 = round((strchr($time,".")* 0.6),2);
$m2 = strrpos($m1,".");
$m = substr($m1,2,2);
$z = strrpos($time,".");
$h = substr($time,0,$z);
$l = strlen($m);
 If ($z > 0){
   If ($l < 2){
   SetValueInteger("Oldtime_Kessel",$minute);
   SetValueString("Betriebsstunden_Kessel",$h.":".$m."0");
    }else{
   SetValueInteger("Oldtime_Kessel",$minute);
   SetValueString("Betriebsstunden_Kessel",$h.":".$m);
   }
   } else{
   SetValueInteger("Oldtime_Kessel",$minute);
   SetValueString("Betriebsstunden_Kessel",$time.":".$m."00");
   }
   } else{
   IPS_SetScriptTimer("Betriebsstundenzaehler_Kessel",0);
   }
?>


Gruß
Thomas

@UweR - danke Uwe, das wäre echt nett

@RWN - ok, habe mich undeutlich ausgedrückt, ich möchte die Betriebsstunden nicht auslesen, sondern erzeugen! Liefern kann ich eine Variable (nenn’ ich jez mal $Brenner), die true (oder 1) ist, wenn der Brenner läuft. Rauskommen soll dann eine Variable (meinetwegen $time), die ich dann im Designer auf’s Bild bringen kann. Prinzipiell reichen würde eine Minutenzahl - hh:mm:ss wäre unnötiger Luxus.
Dazu soll (im Designer) noch ein Button, der mir das Ganze auf 0 setzt (reset).
Ich hoffe, dass ich daraus dann meinen Verbrauch (2Kg/h=2,366l/h) darstellen kann. Respektive Tankinhalt.
Ich habe im Brenner schon einen Betriebsstundenzähler eingebaut, der mir den Verbrauch anzeigt (Verbrauch/Std kann man per DIP Switch eingeben). Das funktioniert einwandfrei.

@MSR_Junky - $BM ist so ziemlich das Einzige, das ich verstehe, und auch liefern könnte. Woher kommt denn

GetValueInteger("Oldtime_Kessel")

?? Und wo steht denn dann der Wert (besser gesagt die Zeit)??

Euch allen schon mal vielen Dank.

In der Stringvariable „Betriebsstunden_Kessel“
Der Wert „Oldtime_Kessel“ ist der Merker für den alten Wert, vor Ausführung des Scriptes, das durch die Variable „BM_Kessel“ (oder den Minutentimer )getriggert wird.

Installier dir mal den Script. Das zählt dir die Minuten, in denen die Variable „BM_Kessel“, die anzeigt, ob das Gerät lauft, wahr ist.

Hallo,
von welcher variablen wird das script von @MSR_Junky eigentlich getriggert.

cu uwe

Ich würde es für sinnvoll halten, dass das Script jede Minute läuft und dabei beim Zustand der BM_Kessel-Variablen ==True den Zeitwert um eine Minute erhöht.

Danke Rainer,
habe es so umgesezt. Es klappt wunderbar.

cu uwe

Hallo Uwe!
Ich verfolge den Tread schon länger.
Zeitmessung funktioniert auch ganz gut.:slight_smile:
Was mir dabei fehlt ist die fortlaufende Zeitanzeige während der Brenner läuft. Dann wärs perfekt.
Evtl. gibts da mal ein Brick??:cool:
Mit Auswertung: Pro Std, Tag Woche usw.
Wie lange ist der Brenner pro Einschaltung gelaufen, bei mir sinds oft nur 50 Sek. das krieg ich im Trend (WIIPS) gar nicht mit

Schönen Abend noch.

Leider gibts vom Usertreffen keine „Wasserstandsmeldungen“-sind wohl noch alle mit IPS zu Gange. :smiley:
Egon

…da bin ich aber froh, wenn ich nicht der Einzige bin, den das interessiert…

folgendes habe ich nicht verstanden:

Ich würde es für sinnvoll halten, dass das Script jede Minute läuft und dabei beim Zustand der BM_Kessel-Variablen ==True den Zeitwert um eine Minute erhöht.

Das heißt, die Laufzeit würde nur in vollen Minuten berechnet? Also die $BM-Abfrage nur jede Minute? Jetzt läuft der Brenner 1,5 Minuten…dann wird eine Minute erfasst und 30 Sekunden werden nicht erfasst? Ich habe das mal überschlagen und bin auf eine mögliche Abweichung von 80 litern in 5 Monaten gekommen. Dieser Fall wird zwar nicht eintreten (weil sich positive und negative Abweichung aufheben) - dennoch ist ein großer Unsicherheitsfaktor dabei.

Das script kann doch laufen, sobald der Brenner läuft, oder? OnEvent oder so (weiß jetzt nicht wie das geht). Das mit der triggerei hab ich noch gar nicht kapiert. Ich habe halt mal bei den Events den Timer interval auf 1sec. gesetzt, dann lief’s erstmal einwandfrei. (hat aber wohl keine Zukunft…)

Noch eine Frage: Ich habe versucht, meinen Verbrauch darzustellen (der Einfachheit vorerst Gesamtverbrauch). Das wären in 180 sec. 0,1 Liter. Oder 1/1800 Liter pro Sekunde.

$verbrauch=$told/1800

Ist das richtig?
Wie bekomme ich jetzt $verbrauch in den Designer?

SetValueFloat("verbrauch",$verbrauch); //Gesamtverbrauch in Gesamtlaufzeit

Ok?
jetzt noch auf zwei Nachkommastellen kürzen (weißnichwiegeht)
klasse…jetzt bräuchte ich noch eine Formel, die mir alle 24 Stunden in eine Variable ($Tagesverbrauch) schreibt und für die nächsten 24h wieder von vorne zählt…

danke Freunde, langsam komme ich hinter einiges:rolleyes:

P.s. sollte IPS nicht IKEA heißen? (kaufen…selber bauen…) - entdecke die Möglichkeiten !!!

Also, ich weiss nicht, ob ein Script im Sekundentakt nicht große Probleme erzeugt.
Heute abend ode morgen sind die Spezialisten wieder da, vielleicht kommt da noch was.

Wenn Du dir aber das Script durch „OnUpdate“ der Variablen laufen läßt, kannst Du die Zeitdiff. vielleicht etwas genauer erhalten. Wenn es aber irgendeine Verzögerung durch andere Scripte gibt, dann stimmt das ganze nicht mehr.

Für meinen Zweck reicht eine Bestandsfortschreibung minütlich aus.

Zum Designer: Hier solltest Du dir wirklich die Beschreibung des Designers etwas genauer ansehen. Dort ist alles beschrieben. Z.B. Label.

Zum Formatieren gibts bei PHP den Befehl „sprintf“ oder für die Zeit z.B. „strftime“. Mußt Du dir im PHP-Handbuch
http://www.php.net/manual/de/preface.php
mal ansehen.

Hi Ralf,

das Script wird wie schon geschrieben über „OnChange“ getriggert (findest du rechts oben unter Events) damit es startet und sich selbst auf 60 Sekunden Intervall setzt. Wenn die Betriebsmeldung des Kessels verschwindet wird das Scriptintervall auf 0 gesetzt (braucht ja dann auch nicht zu laufen).
Du kannst das Script ohne weiteres umbauen damit du auch Sekunden erfassen kannst aber ob das sinnvoll ist :confused:

Gruß
Thomas

Hallo Ralf,

die Laufzeitberechnung Deines Brenners ist ganz einfach. Du musst nur einige Voraussetzungen schaffen und ein kleines Skript schreiben:

Voraussetzungen:

  1. eine externe Variable vom Typ Boolean anlegen für den Brenner (z.B. „Brenner_EIN“); diese Variable muss den EIN/AUS-Zustand des Brenners wiederspiegeln
  2. eine externe Variable vom Typ Integer anlegen für die Laufzeit (z.B. „Brenner_Laufzeit“)
  3. eine externe Variable vom Typ Integer anlegen für die Startzeit (z.B. „Brenner_Startzeit“)
  4. mit der Variablen „Brenner_EIN“ das Skript OnChange triggern

Skript:

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

Die Laufzeiterfassung mit diesem Skript ist sekundengenau !!

Gruß
HJH

Danke HJH,
elegant gelöst

Klasse, danke HJ,

wieder ein Vorschlag mit Erklärung - da lernt sich’s besser!!

Ein kleines ABER hätte ich da noch… das script läuft, wenn Brenner_Ein = False ist (zumindest bei mir!?). Sollte eigentlich umgekehrt sein, oder?
Und wenn das script alle 10 sekunden läuft, werden zuerst 10, dann 30…60…100…150…210 sekunden gezählt. Nach zwei Minuten sind es 780.
(ok- künftig soll’s alle 60s laufen, dürfte aber keine Rolle spielen)

nu?:confused:

Hallo Ralf,

wenn bei Deiner Variablen TRUE und FALSE vertauscht zugeordnet sind, dann brauchst Du die Abfrage nur zu invertieren.
Dazu musst Du vor die Variable ein „!“ setzen:

if (!$brennerstatus)                                  // Brenner schaltet ein

Wenn Du eine fortlaufende Variable für eine Anzeige im Designer haben möchtest, kannst Du folgendes Skript verwenden:

switch ($IPS_SENDER)                                     // Ursache (Absender) des Triggers ermittlen
{
  case "Variable":                                       // Brennerstatus hat sich geändert
    $brennerstatus = GetValueBoolean("Brenner_EIN");
    if (!$brennerstatus)                                 // Brenner hat eingeschaltet
      IPS_SetScriptTimer($IPS_SELF, 1);                  // ScriptTimer einschalten (auf 1 Sekunde setzen)
    else                                                 // Brenner hat wieder ausgeschaltet
      IPS_SetScriptTimer($IPS_SELF, 0);                  // ScriptTimer wieder löschen
  break;
  
  case "TimerEvent":                                     // Timer hat getriggert
    $laufzeit = GetValueInteger("Brenner_Laufzeit");     // bisherige Laufzeit
    $laufzeit++;                                         // eine Sekunde aufaddieren
    SetValueInteger("Brenner_Laufzeit", $laufzeit);      // neue Brennerlaufzeit im Unix-Timestamp abspeichern
    $laufzeit_anzeige = date("H:i:s", $laufzeit);        // Laufzeit in Stunden:Minuten:Sekunden umrechnen
    SetValueString("Brenner_Laufzeit_Anzeige", $laufzeit_anzeige); // neue Brennerlaufzeit für die Anzeige abspeichern
  break;
}

Die Variable „Brenner_Laufzeit_Anzeige“ enthält die formatierte Laufzeit als String und ist somit für die Ausgabe im Designer geeignet (z.B. in einem Label).

Das Skript wird immer dann gestartet, wenn der Brenner anläuft, bzw. wenn er stoppt, also nicht in einem festen Zeitraster. Während der Brenner läuft wird das Skript jede Sekunde gestartet und somit die Variable im Sekundentakt hochgezählt.

Damit ist gewährleistet, dass auch hier sekundengenau gezählt wird!

Gruß
HJH

PS: Nicht vergessen die String-Variable „Brenner_Laufzeit_Anzeige“ anzulegen!

Super!! Es wird immer besser.

…nur… (sorry, ich habe schon wieder ein ABER)

Es war wieder True und False vertauscht:confused:
Ok - ich hab das „!“ weggelassen. Die Frage ist nur - wie war das jetzt? Das erste script lief bei False, obwohl die Bedingung nach der if-Anweisung doch nur bei True erfüllt wird!?

Ich habe mit dem $Brennerzustand OnChange getriggert, ist das richtig?

Für mich hab ich noch was angehängt:

    SetValueString("brennerlaufanzeige", $laufzeit_anzeige); // neue Brennerlaufzeit für die Anzeige abspeichern
    //Verbrauchsberechnung
    $verbrauch = $laufzeit/1800; // = 2,0 l/h
    SetValueFloat("verbrauch", $verbrauch);
    $tankinhalt = GetValueFloat("tankinhalt"); // akt. Inhalt vorher manuell setzen!
    $tankinhalt = $tankinhalt-(2/3600);
    SetValueFloat("tankinhalt", $tankinhalt);
  break;
}


weiß nicht, ob das elegant ist aber es funzt genau so, wie ich’s wollte.
Den Komfort (Setzen von Tankinhalt und Ausgabe Statistik) muß ich mir noch überlegen.

:DD A N K E:D