Hallo zusammen
nachdem ich mir schon viele nützliche Informationen aus dem Forum geholt habe, hier ein kleines Dankeschön.
Vieleicht ist es ja für den ein oder anderen nützlich:
Also es handelt sich um eine Variante eines Betriebsstunden u. Betriebskostenzählers.
Erfasst werden:
- Betriebsdauer
- Stromverbrauch
- Stromkosten
- Anzahl der Ein/Auschaltzyklen
- letztmalige Ein/Auschaltzeitpunkte
von beliebig vielen Geräten (Instanzen)
Es werden dann auch noch der Gesamtstromverbrauch bzw. die Gesamstromtkosten der erfassten Geräte berechnet.
Angezeigt werden die Daten für jedes Gerät einzeln gegliedert nach Kategorien.
Die jeweiligen Variablen sind für korrekte Anzeige im Webfront bereits konfiguriert.
Installation:
!!! Ich konnte nur auf meinem Rechner testen, daher bitte sicherheitshalber vorher eine Sicherungskopie eurer Konfiguration anlegen. Anwendung auf eigene Gefahr !!!
- neue Kategorie „Betriebsdatenerfassung“ (name ist beliebig) anlegen
- Script beliebigem Namens anlegen und untenstehenden Code reinkopieren
- Script 1x händisch ausführen
- dabei werden nun einige Dummy Module angelegt und Variablendefinitionenn angelegt.
-
Für jedes zu überwachende Gerät ein Ereignis „bei Variablenänderung“ der den Betriebszustand anzeigenden Statusvariable an das Script binden.
Das Script funktioniert mit Variablen vom Typ Boolen (Aus=False, Ein=True) oder Integer wobei dann der Wert 0 als Aus und jeder andere Wert als als EIN erkannt wird. -
Im Dummy Modul „Grunddaten“ liegt eine Variable „Strompreis_in_Cent_pro_kW“ diese bitte mit dem jeweils gültigen Tarif beschreiben.
-
Bei erstmaligem betätigen eines im pkt.4 zur Überwachung konfigurierten Gerätes wird im Dummy Modul „Grunddaten“ für eben dieses Gerät eine Variable mit Namen "Leistungsaufnahme_in_Watt:Gerätename angelegt.
Diese ist ebenfalls mit dem zum Gerät passenden Wert zu beschreiben.
Benützung:
In den Dummy Modulen „Betriebsdauer“, „Betriebskosten“, „Energieverbrauch“, „Schaltzyklen“ werden bei erstmaligen schalten eines Gerätes entsprechende Variablen automatisch angelegt.
Bei darauffolgenden Betätigungen füllen sich diese Variablen mit den entsprechenden Werten.
Da das Script immer nur bei betätigen eines Gerätes aktiv wird zählen die Werte nicht „live“ hoch, sondern werden erst beim Ausschalten neu berechnet. Dies ist beabsichtigt, da dadurch nur eine sehr gering Systemlast entsteht und bedenkenlos auch sehr viele Geräte überwacht werden konnen.
Weitere Hinweise:
Defaulmäßig setzen sich sie Zählvariablennamen aus dem Namen der übergeordneten Instanz und dem Namen der Statusvariable zusammen.
Wahlweise kann auch nur der Instanzname oder der Statusvariablenname verwendet werden.
Die entsprechende Stelle ist im Script markiert je nach Wunsch sind die Zeilen passend zu remarken.
So kann je nach bereits existierendem Namensschema die am besten passende Variante gewählt werden.
Die Werte allerZählvariablen können zu jedem Zeitpunkt beliebig geändert, zurückgesetzt oder auch ganz gelöscht werden. Das Script arbeitet dann mit den jeweils neuen Werten weiter, bzw. legt die Zählvariablen neu an.
Die Namen der Zählvariablen und der Instanzen dürfen aber NICHT !!! geändert werden, diese würde zu neuanlegen derselben führen.
Getestet habe ich mit Statusvariablen von FS20 und 1Wire Geräteinstanzen.
Im Webfront sieht es dann wie an den angehängten Screenshots aus.
Viel Spass
bb
und nochmals:
!!! Ich konnte nur auf meinem Rechner testen, daher bitte sicherheitshalber vorher eine Sicherungskopie eurer Konfiguration anlegen. Anwendung auf eigene Gefahr !!!
$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;
}