Anfängerprobleme: Änderungsrate einer Temperatur berechnen

Hallo Leute,

mathematisch stellt es mich nicht so vor Probleme, aber als Anfänger vor die Frage der richtigen Umsetzung…
Also: Am Warmwasservorlauf (also Richtung Verbraucher) hängt ein 1-Wire Temperatursensor (der wird auch erkannt). Nun soll in Abhängigkeit von der Temperaturänderung über die Zeit die Zirkulationspumpe eingeschaltet werden, um den Warmwassertransport zu beschleunigen.
Dazu muss ich also jeweils die Temperatur bis zur nächsten Änderung in einer Variablen zwischenspeichern (also immer den letzter Wert vor dem neuen Einlesen), somit habe ich die zwei Werte für die Y-Achse, die beiden Uhrzeiten stellen die beiden X-Werte da. Aus den zwei X1/Y1 (vorherige Einlesung) und den X2/Y2 (aktuelle Einlesung) Pärchen kann ich dann die Steigung zwischen den beiden Punkten berechnen. Ist die Steigung über einem bestimmten Schwellwert, dann wird Warmwasser abgefordert, wenn also noch nicht in Betrieb, dann soll die Zirkulationspumpe anlaufen…

Mathematisch also nicht das Problem, aber die IPS-Umsetzung bereitet mir noch arge Probleme. Leider fand ich in der Online-Hilfe bis dato nicht so das Richtige… (derzeit weiß ich nicht, wie ich wo welche Objekte (Variablen Skripte) anlegen sollte).

Würde mich freuen, wenn mir jemand auf die Sprünge helfen würde…

Joachim

Hallo Joachim,

Du erstellst ein Script und läßt es durch Änderung der Variablen triggern.

<?
IF ( $IPS_SENDER == "Variable"){
	$Differenz = $IPS_VALUE - $IPS_OLDVALUE;
	$Script = IPS_GetScript($IPS_SELF);
	$Zeit = time() - $Script['LastExecute'];
	IPS_LogMessage( $Differenz , $Zeit);

	// weitere Berrechnungen.......
}
?>

Dann hast Du in $Zeit die Differenz in sekunden und die Werteänderung in $Differenz.

Gruß

Ich mache im Prinzip das Gleiche für meine Wetterstation, hier für den Luftdruck:

  • zwei Variablen anlegen
  • Script wie unten
  • Script zyklisch triggern (damit hast Du schon mal die Zeiteinheit bzw. kannst diese beliebig wählen)

Das Script schiebt dann in jedem Zeitintervall jeweils den aktuellen Luftdruck in Variable 1 und den letzten Wert in Variable 1 in die Variable 2. Mit der if-Anweisung kannst Du dann die Differenz auswerten.


...
$History02 = GetValueInteger(10498 /*[Wetterstation\Luftdruck\History01]*/);
SetValueInteger(29548 /*[Wetterstation\Luftdruck\History02]*/, $History02);
$History01 = GetValueInteger(57297 /*[Wetterstation\Luftdruck\Luftdruck]*/);
SetValueInteger(10498 /*[Wetterstation\Luftdruck\History01]*/, $History01);
if ($History01 - $History02 >= 2)
{}


...

EDIT: Attain war schneller und dessen Lösung sieht auch um Welten professioneller aus :slight_smile:
(Meine funktioniert aber auch und die verstehe ich als PHP-Noob)

Hallo dreamy1 und Attain,

vielen Dank erst einmal für Eure Antworten. Ich versuche dem zu folgen, habe aber als Neuanfänger so meine Problem.
Offensichtlich füge ich bei „Variable“ den 1-Wire Sensor falsch ein. Kannst Du mir noch sagen wie das aussehen müsste?

Joachim

Hallo Joachim,

Du legst das Script an. Fügst dem Script ein neues Ereignis hinzu. Als auslösende Variable wählst Du die 1-Wire Temperatur aus und bei der Änderung der Variablen wird das Script gestartet.
Das Script berrechnet die Differenz zwischen dem alten($IPS_OLDVALUE) und dem jetzt neuen($IPS_VALUE) Wert. Weiterhin wird die Zeit Berrechnet, die vergangen ist seit dem letzten(‚LastExecute‘) Ausführen und dem jetzigem (time()) Zeitpunkt.

Gruß

Hallo Attain,

ich konnte schon ein paar kleine Erfolge feiern - mir ist programmieren nicht fremd, aber mit dem Syntax von php - auch in Verbindung mit IPS - muss (und will) ich mich noch anfreunden.
Ich werde heute abend mal sehen, wie weit mich das bringt.
Vielen Dank für die Unterstützung!

Joachim

Ok, als PHP-Dummie möchte ich mich da mal einklinken.
Ich brauche ein Script zur Verbrauchsberechnung (Liter/Stunde, kwh/Tag etc.)
Das Script von Attain scheint mir schon das Richtige zu sein - aber mit learning by doing (besser: rumprobiering and nixlearning) komme ich nicht weiter.

Angenomme ich habe folgende Situation:
Ich habe eine Variable „verbrauch“, die mir den aufsummierten Verbrauch anzeigt. Weiterhin habe ich eine Variable „verbrauchstd“ für den Verbrauch der letzten 24 Std und eine Variable „verbrauchmon“ für die letzten 30 Tage.

Für ein aufgedröseltes Script, wo die einzelnen Befehle erklärt sind wäre ich echt dankbar. Die Systemvariablen habe ich zwar in der Doku gefunden aber ohne Beispiel kann ich damit leider nix anfangen
Vielen Dank schonmal.
Ralf

P.S. Eine Aufnahme in die Script Libary wäre super - wie z.B.Parsey’s Variablenumrechnung

Hallo Ralf,

ich mach mal ein paar Kommentare ins Script:

   <?
IF ( $IPS_SENDER == "Variable"){  
// nachfolgende Befehle ausführen wenn das Script durch eine Variable gestartet wurde

    $Differenz = $IPS_VALUE - $IPS_OLDVALUE;  
// $IPS_Value == der aktuelle Wert der Variablen
// $IPS_OLDVALUE == der vorherige Wert der Variablen

    $Script = IPS_GetScript($IPS_SELF);       
// IPS_GetScript liefert in einem Array detailierte Infos über Scripte
// $IPS_SELF == ID-Nummer dieses Scriptes

    $Zeit = time() - $Script['LastExecute']; 
// time() == aktueller Zeitstempel
// $Script['LastExecute'] == Zeitstempel , wann wurde das Script zuletzt ausgeführt

    IPS_LogMessage( $Differenz , $Zeit);
// schreibt die berrechenten Werte in  das Logfile, war nur für mich zum testen

    // weitere Berrechnungen.......
}
?> 

Hallo Attain,

so ähnlich dachte ich mir das schon - habe aber leider keine Werte rausbekommen. Ich muß also nochmal fragen:

IF ( $IPS_SENDER == "Variable"){  //nachfolgende Befehle ausführen wenn das Script durch eine Variable gestartet wurde

Das heißt, meine Variable „verbrauch“ ändert sich - script startet weil ich Ereignis: OnChange Variable verbrauch eingegeben habe. Wozu: nachfolgende Befehle ausführen wenn das script durch eine Variable gestartet wurde - wenn das schript doch schon läuft und die Befehle eh jetzt ausgeführt werden?? Und muß die Zeile bei mir heißen:$IPS_SENDER == „verbrauch“?

Was ist die: $Differenz = $IPS_VALUE - $IPS_OLDVALUE? Die Differenz zwischen zwei script-starts? Wenn mein Brenner läuft, ändert sich die Variable jede Sekunde. Was kommt dann dabei raus? Und wie konne ich da auf einen Wert pro Stunde?

    $Script = IPS_GetScript($IPS_SELF);       
// IPS_GetScript liefert in einem Array detailierte Infos über Scripte

Tut mir ja leid…aber welche Infos werden wohin geliefert und was fange ich damit an?

    $Zeit = time() - $Script['LastExecute']; 
// time() == aktueller Zeitstempel
// $Script['LastExecute'] == Zeitstempel , wann wurde das Script zuletzt ausgeführt

Ok, Zeitstempel sagt mir was. $Zeit ist die Zeit zwischen zwei Script-starts in Sekunden, oder?

IPS_LogMessage( $Differenz , $Zeit);

Wo finde ich diese LogMessage? In einer Log-Datei? Ich habe zum Testen versucht, die $Differenz und $Zeit per SetValueFloat in eine Variable zu schreiben. War aber nix.:confused:

Tja, so siehts aus, wenn mann’s nicht kann:o

Bekomme ich das hin?

Vielen Dank schonmal!

Für IPS-Funktionen empfiehlt sich immer wieder ein Blick in die Doku ;).

IPS_LogMessage - IP-Symcon :: Automatisierungssoftware wird in der Konsole unter Meldungen wiedergegeben und ist hinterher auch im Ordner /logs zu finden.

IPS_GetScript - IP-Symcon :: Automatisierungssoftware liefert, wie schon von Attain geschrieben, ein Array mit Informationen über ein Skript. Was ein Array ist steht unter PHP: Arrays - Manual, was ein Array enthält lässt sich mit print_r() herausfinden, siehe Beispiel in der Doku. Die Informationen werden hier in $Script gespeichert. Hinterher wird zur Berechnung der Zeitdifferenz $Script[‚LastExecute‘] herangezogen.

Dann solltest Du Dir noch die meiner Meinung nach wichtigste Seite der Dokumentation ansehen: Systemvariablen - IP-Symcon :: Automatisierungssoftware.
Dort steht beschrieben, welche Variablen beim Skriptaufruf bereits existieren. Hier z.B.:

  • $IPS_SELF: ID des ausgeführten Skripts
  • $IPS_SENDER: wodurch das Skript aufgerufen worden ist („Variable“ = Ausführung durch Ereignis an einer Variable)
  • $IPS_VALUE: existiert bedingt durch die Ausführung des Variablenereignisses und enthält den aktuellen Variablenwert zur Ausführung
    Die Abfrage nach $IPS_SENDER macht man, damit man sicher gehen kann, dass nur bei der Ausführung durch den bestimmten Sender der Code ausgeführt wird und nur dann dadurch bedingt Variablen existieren, so existiert $IPS_VALUE nicht für $IPS_SENDER == „RunScript“.

Hallo Ralf,

Das Problem ist, das man in der Console auf ausführen klickt und dann viele Fehlermeldungen angezeigt werden. Diese müssen dann erst durch das Forum erklärt werden ;). Das wollte ich damit verhindern.
Die Zeile ändert sich auch bei Dir nicht, sie bleibt auf:
IF ( $IPS_SENDER == „Variable“){

Wenn ein Script durch eine Werteänderung einer Variablen getriggert wird, hat dies Variable natürlich einen Wert. Dieser wird durch IPS automatisch im Script in eine Variable geschrieben → $IPS_VALUE. Diese Variable, die das Script getriggert hat, hatte vor der Werteänderung einen anderen Wert. Dieser steht in $IPS_OLDVALUE.

Da empfehle ich Dir die Doku. IPS_GetScript - IP-Symcon :: Automatisierungssoftware

// verbrauch pro Stunde
$VerbrauchProStunde = $Differenz * 60 *60 / $Zeit;

hey danke für die Antworten!

@Horst:

Für IPS-Funktionen empfiehlt sich immer wieder ein Blick in die Doku
da empfehle ich einen Blick in meine Frage:
Die Systemvariablen habe ich zwar in der Doku gefunden aber ohne Beispiel kann ich damit leider nix anfangen
:slight_smile:

Erklärt doch mal wie ein Lichtschalter funktioniert: Das ist ein Schalter wo das Licht angeht, wenn man draufdrückt.

So verstehe ich die Doku. Daß ein Strom fließt, wenn am Schalter der Kontakt geschlossen wird, steht da nicht.
Ok, off Topic…

Also das Ergebnis nach weiteren zwei Stunden rumprobiering:
Das Script wird wohl gestartet, wenn mein Brenner true ist. Aber jegliche Werte wie Differenz, Zeit, Verbrauch oder sonstwas bleiben mir verborgen. print_r() hat auch nix ergeben - oder nur im Nirvana, wo ich nicht hinsehe. Bei den Meldungen steht übrigens auch nichts. Nun gehe ich halt einigermaßen frustriert ins Bett. Vielleicht hat ja einer den entscheidenden Tipp:confused:
Übrigens - das Brennerscript ist übrigens dieses (HJH):

switch ($IPS_SENDER)                                // Ursache (Absender) des Triggers ermittlen
{
  case "Variable":                                  // Brennerstatus hat sich geändert
    $brennerstatus = GetValueBoolean("ToggleButton");
    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("brennerlaufzeit"); // bisherige Laufzeit
    $laufzeit++;                                    // eine Sekunde aufaddieren
    SetValueInteger("brennerlaufzeit", $laufzeit);  // neue Brennerlaufzeit im Unix-Timestamp abspeichern
    $laufzeit_anzeige = gmdate("H:i:s", $laufzeit); // Laufzeit in Stunden:Minuten:Sekunden umrechnen
    SetValueString("brennerlaufanzeige", $laufzeit_anzeige); // neue Brennerlaufzeit für die Anzeige abspeichern
    //Verbrauchsberechnung
    $verbrauch = $laufzeit/1521.5554; // = 2,0 kg/h, 2,366l/h =in 1521sek 1liter
    SetValueFloat("verbrauch", $verbrauch);
    $tankinhalt = GetValueFloat("tankinhalt");
    $tankinhalt = $tankinhalt-(2.366/3600);
    SetValueFloat("tankinhalt", $tankinhalt);
  break;

Der Satz von mir war auf die Fragen zu IPS_GetScript und IPS_LogMessage bezogen, deshalb habe ich auch IPS-Funktionen und nicht Systemvariablen dazu geschrieben.

print_r ist echo für Arrays und gibt sämtliche Schlüssel und Werte eines Arrays rekursiv aus. Bei direkter Ausführung im Skripteditor landet das ganze in der Skriptausgabe, ansonsten im Meldungs-Fenster. Wenn dort zu viel los ist, übersieht man das schon mal.

Wo ich Deinen Code sehe fällt mir auf, wo die Unklarheit liegt: Du willst anhand von festen Zeitabständen den Verbrauch berechnen. Diese Abstände kommen bei Dir durch Skriptausführungen im Sekundentakt durch Timer zu Stande. Dann steht in $IPS_SENDER „TimerEvent“ und nicht „Variable“, d.h. das musst Du beim case ändern.

Weiterhin solltest Du beachten, dass gmdate zur Datumsformatierung dient und daher alle vollen 24 Stunden wieder bei 00:00:00 anfängt. Um das zu vermeiden solltest Du die Zeitanzeite selbst formatieren: Zur Zerlegung der Gesamtsekunden in Stunden, Minuten und Sekunden eignet sich der Modulo-Operator (%). Mit Division und Abrunden (floor) kommt man dann zu

$laufzeit_anzeige = floor($laufzeit / 3600).":".floor(($laufzeit % 3600) / 60).":".($laufzeit % 60));

Zum Anzeigen führender Nullen eignet sich PHP: sprintf - Manual. Damit wird das ganze zu

$laufzeit_anzeige = sprintf("%02d:%02d:%02d", floor($laufzeit / 3600), floor(($laufzeit % 3600) / 60), ($laufzeit % 60));

tsts… selbst auf Beiträge um 01:00 bekommt man Antwort um 03:00…:smiley:
danke lieber Horst, ich werde die Tage weiter probieren. Frohe Weihnachten!