Wie Laufzeit in Stunden Aufzeichnen?

Guten Abend,

ich bin am Überlegen wie ich die Betriebsstunden des Kompressors der Wärmepumpe aufzeichnen kann ( Tag/Monat/Jahr ) in Stunden.

Habe folgendes schon Vorbereitet:
Eine Boolean Variable mit True und False angelegt, hier erkenne ich wenn der Kompressor läuft ( true ) und wenn dieser
steht ( false ).

Mit einen Auslösenden Ereignis ( bei 40 Watt true bei 45 Watt false ) wird die Variable geschaltet.

Nun meine Frage ob ich auch den Faktor Zeit einbauen kann?
Sprich wenn die Variable am Tag 20 Stunden auf True ist, diese geloggt werden kann und mittels Script kann ich dann die Tages/Monats/Jahres Werte abfragen.

…du könntest zB eine zweite Variable anlegen, welche als „Timer“ dient. Wenn Dein Kompresssor auf true geht, könntest Du ein Ereignis starten lassen, welches zB jede Minute die Timer Variable um 1 hochzählt.

Gesendet von meinem SM-G935F mit Tapatalk

…und in eine dritte Variable könntest du Mitternacht den Wert des „Timers“ schreiben und diesen loggen.

Gesendet von meinem SM-G935F mit Tapatalk

versuch mal das hier.

hab ich für meine HM Geräte, läuft über Jahre gut und zählt fleißig wie oft die Flurbeleuchtung geschaltet, wieviel Strom verbraucht wurde und was es gekostet hat (Strompreis eintippen)

Das Script ist nicht von mir, hatte mal jemand ausm Forum gebaut

Das Script packst du in ein extra Verzeichnis.
Als Auslöser nimmst ein Ereignis, Variablenänderung (deine Bool) und dann dieses Script ausführen.

Ich würde meinen, dass alles automatisch erstellt wurde.

<?
$name_BetrSt = 'Betriebsdauer';
$name_Zyk = 'Schaltzyklen';
$name_Kost = 'Betriebskosten';
$name_lastOn= 'Letztmalig Geschaltet';
$name_Energie= 'Energieverbrauch';
$name_Config= 'Grunddaten';

if($IPS_SENDER == "Execute")                // nur wenn bei "Ausführen"
 {
# Variablenprofile anlegen
IPS_CreateVariableProfile('BetrStd_integer',1);
IPS_CreateVariableProfile('BetrStd_sec',1);
IPS_SetVariableProfileText('BetrStd_sec','',' sec');
IPS_CreateVariableProfile('BetrStd_kW',2);
IPS_CreateVariableProfile('Zyklen',1);
IPS_SetVariableProfileText('BetrStd_kW','',' kW');
IPS_SetVariableProfileDigits('BetrStd_kW',2);
IPS_CreateVariableProfile('BetrStd_Euro',2);
IPS_SetVariableProfileText('BetrStd_Euro','',' €');
IPS_SetVariableProfileDigits('BetrStd_Euro',2);

$ParentID = IPS_GetObject($IPS_SELF);
$ParentID = $ParentID['ParentID'];
IPS_SetHidden($IPS_SELF,true);

# DummyInstancen anlegen
getId($name_BetrSt);
getId($name_Zyk);
getId($name_Kost);
getId($name_lastOn);
getId($name_Energie);
getId($name_Config);

# Summenvariablen Anlegen
$MODID_Config = getId($name_Config);
$Strompreis = CreateVariableByName($MODID_Config, "Strompreis_in_Cent_pro_kWh", 1);
$Gesamtverbrauch = CreateVariableByName($ParentID, "Gesamtstromverbrauch d. überwachten Geräte", 'kW');
$Gesamtkosten = CreateVariableByName($ParentID, "Stromkosten d. überwachten Geräte", 'Euro');

echo "Erfolgreich eingerichtet";

}

 if($IPS_SENDER == "Variable")
 {
# überwachte variable und deren parent holen
    $Variable = IPS_GetObject($IPS_VARIABLE);
    $parentID = $Variable['ParentID'];
   $VariableName= $Variable['ObjectName'];

      $Parent = IPS_GetObject($parentID);
    $ParentName =  $Parent['ObjectName'];


# !!! gewünschtes Variablennamensschema auswählen !!!
  $ObjectName = $ParentName;   # -> erhält Name der übergeordneten Instanz der überwachten Variablen
#    $ObjectName= $VariableName;  # -> erhält Name der überwachten Variablen
#  $ObjectName = $ParentName.'_'.$VariableName;  #-> Kombination aus Instanz&Variablenname

    if(($IPS_VALUE==True) OR ($IPS_VALUE <> 0)) {  # Objekt wurde eingeschaltet, ggfls anpassen

# Dummyinstancen holen
       $MODID_Zyk = getId($name_Zyk);
        $MODID_last =getId($name_lastOn);
      $MODID_Config = getId($name_Config);
# Variablen befüllen, bzw. bei erstmaligem Aufruf anlegen
      CreateVariableByName($MODID_Config, 'Leistungsaufnahme in Watt: '.$ObjectName,1); #Leistungsaufnahme

        $idSz = CreateVariableByName($MODID_Zyk, $ObjectName,'Zyklen'); #ON/OFF Zyklen
        SetValue($idSz, GetValue($idSz)+1);

         $idOn = CreateVariableByName($MODID_last, $ObjectName.'_On_Timestamp', 1); #ON_timestamp
        SetValue($idOn,time());

         $idOnString = CreateVariableByName($MODID_last, $ObjectName.'_On', 'Zeit');#timestamp letzter Einschaltzeitpunkt als String
        SetValue($idOnString, date("H:i:s",GetValue($idOn)));
    }

    else {   # Objekt wurde ausgeschaltet

      $ParentID = IPS_GetObject($IPS_SELF);
        $ParentID = $ParentID['ParentID'];
# Dummyinstancen holen
        $MODID_last = getId($name_lastOn);
      $MODID_BetrSt = getId($name_BetrSt);
      $MODID_Kosten = getId($name_Kost);
      $MODID_Energie = getId($name_Energie);
# Variablen beschreiben bzw. ber erstmaligem Aufruf anlegen
      $MODID_Config = getId($name_Config);
      $Id_Leistung = CreateVariableByName($MODID_Config, 'Leistungsaufnahme in Watt: '.$ObjectName,1); #Leistungsaufnahme
        $Leistung = GetValue($Id_Leistung);
      $Strompreis = IPS_GetVariableIDByName('Strompreis_in_Cent_pro_kWh', $MODID_Config);

        $idOn = CreateVariableByName($MODID_last, $ObjectName."_On_Timestamp", 1);#timestamp letzter Einschaltzeitpunkt
           $idOff = CreateVariableByName($MODID_last, $ObjectName.'_Off_Timestamp', 1); #ON_timestamp
        SetValue($idOff,time());
         $idOFFString = CreateVariableByName($MODID_last, $ObjectName.'_OFF', 'Zeit');#timestamp letzter Einschaltzeitpunkt als String
        SetValue($idOFFString, date("H:i:s",GetValue($idOff)));

        $idC = CreateVariableByName($MODID_BetrSt, $ObjectName."_Sekunden", 'sec');#Sekundenzähler
        SetValue($idC, GetValue($idC)+ (time() - getValue($idOn)));

       $idbh = CreateVariableByName($MODID_BetrSt, $ObjectName, 'Zeit');#Betriebsdauer als String
        SetValue($idbh, date("z \T\a\g\e  H:i:s", GetValue($idC)- 3600));

        $idW = CreateVariableByName($MODID_Energie, $ObjectName, 'kW'); # Energieverbrauch in kWh
        SetValueFloat($idW, GetValue($idC)/3600 * $Leistung/1000 );

          $idEuro = CreateVariableByName($MODID_Kosten, $ObjectName, 'Euro');  #Kosten in Euro
        SetValueFloat($idEuro, GetValueFloat($idW) *GetValue($Strompreis)/100 );
# Summenvariablen updaten
      $IdkW = IPS_GetVariableIDByName("Gesamtstromverbrauch d. überwachten Geräte",$ParentID);
      $IdKosten = IPS_GetVariableIDByName("Stromkosten d. überwachten Geräte",$ParentID);
        $all_IdVerbrauch = IPS_GetChildrenIDs($MODID_Energie);
      $all_IdKosten = IPS_GetChildrenIDs($MODID_Kosten);
        $kW = 0.0;
        foreach ($all_IdVerbrauch as &$Ids) {
            $kW = $kW+GetValueFloat($Ids);
            }
        SetValueFloat($IdkW,$kW);
      $Kosten = 0.0;
        foreach ($all_IdKosten as &$Ids) {
            $Kosten = $Kosten+GetValueFloat($Ids);
            }
        SetValueFloat($IdKosten,$Kosten);
        }
}

function CreateVariableByName($id, $name, $type)
{
   global $IPS_SELF;
   $vid = @IPS_GetVariableIDByName($name, $id);
   if($vid===false) {

        $vartype = 1;
      if ($type == 'Euro/kWh') $vartype = 2;
        if ($type == 'Euro') $vartype = 2;
        if ($type == 'kW') $vartype = 2;
          if ($type == 'Zeit') $vartype = 3;



        $vid = IPS_CreateVariable($vartype);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
      IPS_SetInfo($vid, "This Variable was created by Script #$IPS_SELF");
        if ($type == 'integer') IPS_SetVariableCustomProfile ($vid, "BetrStd_integer");
          if ($type == 'sec') IPS_SetVariableCustomProfile ($vid, "BetrStd_sec");
          if ($type == 'kW') IPS_SetVariableCustomProfile ($vid, "BetrStd_kW");
      if ($type == 'Euro') IPS_SetVariableCustomProfile ($vid, "BetrStd_Euro");
        if ($type == 'Zeit') IPS_SetVariableCustomProfile ($vid, "~String");

        if (strpos($name,'Timestamp') >0) IPS_SetHidden($vid,true);
      if (strpos($name,'Sekunden') >0) IPS_SetHidden($vid,true);


    }
   return $vid;
}

function getId($name) {
   global $IPS_SELF;
   $ParentID = IPS_GetObject($IPS_SELF);
    $ParentID = $ParentID['ParentID'];

    $ID = @IPS_GetObjectIDByName($name, $ParentID);
    if ($ID == 0) {
          $dummy=IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");  #Betriebsstunden anlegen
        IPS_ApplyChanges($dummy);
        IPS_SetName($dummy,$name);
        IPS_SetParent($dummy,$ParentID);
    }

 return $ID;
}
?>

1 „Gefällt mir“

Welche WP? Mit Schnittstelle?
Die meisten führen im eigenen WP Manager ein logbuch, da heute ja ein Wärmemengezähler verbaut sein sollte (aufgrund KfW Bedingungen)…
Selbst unsere 6 Jahre stiebel loggt das weg

Gesendet von meinem Redmi Note 2 mit Tapatalk

Ich habe eine vitocal 200 S vitronic 200 mit 300er protokoll. Gibt zwar eine schnittstelle von viessmann kostet aber um die 500 euro.

Ich dachte bei Viessmann gibts so eine lowcost Selbstbau V USB sticklösung bzw. Optische lösung zum dauerhaften auslesen für kleines Geld…
Kann mich täuschen aber mein Bruder hat auch ne Viessmann WP und dazu hat er sich so ein Adapter gebastelt… - ohne 500€ auszugeben…

Die bauvorschläge nennen sich glaub openV :wink:

Hier noch ein Bild von dem Teil was mein Bruder an seiner WP hat:

Gesendet von meinem Redmi Note 2 mit Tapatalk

Hallo mrcy73,

kannst du mir das etwas genauer erklären?
Das mit dem Ereignis ist mir klar, nur wie ich die Variable dann mit der Zeit befülle nicht!

Danke!

also Du könntest es wie folgt machen:
erstes Event anlegen:
zB Laufzeit alle 5 min, Code mit dem Inhalt
setvalue($IDZV, getvalue($IDZV)+5);

wobei $IDZV deine bereits angelegte „Zeitzählvariable“ ist
Dies erhöht demnach deinen Variablenwert alle 5 Minuten um 5 :wink:

Dieses Event musst Du mit einem weiteren Event, welches auf die true/false Variable Deines Reglers reagiert, über IPS_SetEventActive aktivieren oder deaktivieren, d.h. es müsste aktiv sein, sobald Dein Regler true ist und wieder deaktiviert werden, wenn er auf false umschaltet.

Somit zählt er solange hoch, solange dein Regler true ist.
Mitternacht müsstest Du den Variablenwert von $IDZV in eine weitere Variable $IDCOPYZV kopieren und danach $IDZV wieder auf 0 setzen, damit er nach Mitternacht wieder von vorn anfängt zu zählen. Den kopierten $IDCOPYZV lässt du mitloggen und hast dann jeden Tag Mitternacht die Laufzeit deines Reglers.

Gibt sicher elegantere Lösungen, aber ich halte diese für recht einfach umzusetzen und verwende diese auch selbst.

Gruß
Marc

…und, hinbekommen?

Morgen,
leider noch nicht.
Was genau ist die Zeitzählvariable? Bzw. ist das eine Integer Variable? Ich finde kein Profil das ich der Variable sage das diese eine Zeitzählvariable ist?

Denk ich da falsch?

ja, denkst Du :wink:
Ich habe die Variable einfach so genannt, ist ne Integer oder Float, wenn Du halt ne Kommastelle mit verarbeiten willst
Kuck mal, so:

10712 läuft alle 5min und addiert einfach zu 39263 immer 5 dazu (eben für 5 min)
In deinem Beispiel wäre dann die 27189 das Ereignis, was 10712 aktiviert oder deaktiviert, damit der Zähler tatsächlich auch nur läuft, wenn dein Regler auf true ist.
28512 kopiert um Mitternacht den Wert in 45601 und setzt 39263 wieder auf null, damit der Zähler wieder am nächsten Tag von vorn losgeht. Ich habe bei mir noch nen Zwischenschritt mit Minuten drin, den könnte man sicher auch wegsparen, wenn man den nicht gesondert ausweisen will.

Wie gesagt, geht sicher galanter zu lösen, aber für meine Zwecke reichts. :rolleyes:

Danke!
Nun ich hab das Problem das auch wenn die Variable auf „False“ steht, auch in 5 Minuten Takt gezählt wird? Obwohl ich beim Ereignis nur wenn „True“ sollte er zählen :confused:

na, da bist Du doch schon ein Stück weiter :wink:
Das Problemchen hatte ich schon mal weiter oben erläutert:

Dieses Event musst Du mit einem weiteren Event, welches auf die true/false Variable Deines Reglers reagiert, über IPS_SetEventActive aktivieren oder deaktivieren, d.h. es müsste aktiv sein, sobald Dein Regler true ist und wieder deaktiviert werden, wenn er auf false umschaltet.

also du legst unter Deiner true/false Variable ein Event an, welches auf Variablenänderung derselben reagiert.

dann schreibst Du hinten im Ereignis als Code rein

if (getvalue(IdDeinRegler)==true){
IPS_SetEventActive(IdDeinZählEreignis,true);
}
else {
IPS_SetEventActive(IdDeinZählEreignis,false);
}

und schon fertig :rolleyes:
Damit schaltest Du Dein „Zählereignis“ immer ein wenn Regler auf true und sonst aus.

Sollte so gehen.

Gruß
Marc

Ergänzung:

Nun ich hab das Problem das auch wenn die Variable auf „False“ steht, auch in 5 Minuten Takt gezählt wird? Obwohl ich beim Ereignis nur wenn „True“ sollte er zählen

Alternativ würde es natürlich auch so gehen, wenn ich das richtig interpretiere, dann läuft dein Skript halt immer und zählt nur hoch, wenn deine Regler-Variable true ist.

Danke, soweit geschafft.

Ereignis.JPG

Als Aktion muss ich dann sagen „Quellcode“ ausführen?
Doch ich kann kein „Ziel“ wählen? Hier hätte ich als Ziel das Ereignis ausgewählt das alle 5 Minuten die Variable befüllt-geht jedoch nicht?

…also bei mir ist da einfach „Variable ändern“ ausgewählt und dann als Variable die übergeordnete.
So funktionierts bei mir zumindest

Marc

Naja, früher unter 3.4 hat man mal … Duration gehabt / hat man noch … :D:D:D:D:D

Auswertung auf geloggte Variable: wielange AN? - Seite 2

…hab doch schon weiter oben gemeint, das es sicher noch eine elegantere Lösung gibt, schwups, da ist sie … Also Michl, kannst auch gerne die verwenden, man lernt halt nie aus :slight_smile:

Gesendet von meinem SM-G935F mit Tapatalk

@michl
…bist Du draus schlau geworden?
Ich hab mir alles mal genau angesehen und konnte trotzdem daraus nicht so recht entnehmen, wie man aus einer geloggten an/aus-Variable die AN-Zeiten dazwischen genau ermittelt.
Hab deshalb mal noch ein neues und kurzes Skript gebaut.
Wenns Dich noch interessiert, einfach nochmal melden.

Gruß
Marc

Hallo Marc,

ich bin immer noch Intressiert an der Auswertung :slight_smile: Gerne nehm ich dein Angebot an!