Hallo Jens
ich habe die erste Zeile Script gefunden, die einen Fehler erzeugt.
Leider muss ich zugeben, dass ich diesen Teil selbst eingefügt habe, um den Überlauf des Zählers zu kompensieren.
SysVar StromExMemory03 ist vom Typ Zahl (0...999999)
Dort versuche ich mir den Zählerstand des Energysensors zu merken, um einen Überlauf fest zu stellen.
Mit der folgenden Zeile soll der Inhalt der SysVar in die Variable oldc geschrieben werden
Das gibt einen ReGa Fehler im Log
Code: Alles auswählen
real oldc = dom.GetObject("StromExMemory03").ToFloat();
chc ist der aktuelle Stand des Zählers. Dann wird verglichen
Code: Alles auswählen
object devEnergyDP = dom.GetObject("BidCos-RF."#serialCounter#":1."#dpname);
real oec = memory.StrValueByIndex("|",0).ToFloat();
real shc = memory.StrValueByIndex("|",1).ToFloat();
real chc = devEnergyDP.State();
real oldc = dom.GetObject("StromExMemory03").ToFloat();
real stoffset = dom.GetObject("StromOffset").State();
if (chc < oldc){
chc = chc + 838860.7;
stoffset = stoffset + 838860.7;
}
dom.GetObject("StromExMemory03").State(chc);
dom.GetObject("StromOffset").State(stoffset);
Wie kann ich das besser (fehlerfrei) lösen ??
komplettes Script
Code: Alles auswählen
!! Energy Costs Part 3
!!
!! Berechnet die verbrauchten kWh/m3 seit der letzten Abrechnung des Energielieferanten
!!
!! kann beliebig oft laufen
!!
!! 02/15
!! (c) by thkl
!!
!! Benötigte SystemVariablen:
!! Name : gasLastInvoice Typ:Zahl -> hier den Zählerstand der letzten Energieabrechnung in kWh oder m3 eintragen.
!! Name : gasStart Typ: Zeichenkette -> hier den aktuellen Zählerstand und den Zählerstand des Energiemessgerätes in ganzen kWh eintragen und zwar wie folgt:
!! Zählerstand EZähler|Zählerstand HM Zähler (Beispiel 17456|5 ; wenn der Schwarze Kasten im E-Verteiler 17456 zeigt und gleichzeitig das HM Gerät 5) Achtung das HM Gerät zählt in WattStunden (alternativ natürlich die Gaszählerwerte)
!! also / 1000
!! Name : gasUsedEnergyCost Typ: Zahl Einheit :EUR
!! Name : gasUsedEnergyCount Typ: Zahl Einheit :kWh oder m3
!! Name : gasTotalEnergyCount Typ: Zahl Einheit :kWh oder m3
!! Energiekosten werden nach Scriptlauf in gasUsedEnergyCost gespeichert
!! Verbrauchte KwH werden nach Scriptlauf in gasUsedEnergyCount gespeichert
!! aktueller Stand des Stromzählers wird in gasTotalEnergyCount gespeichert
!!
!! serialCounter = "" - Hier die Seriennummer des HM Zählregrätes eintragen
!! useAsGasCounter = 0 - E Zähler ; = 1 Gas Zähler
!! cuxddevice = Seriennummer des CuxD Exec Devices. Wenn nicht vorhanden leer lassen dann wird system.exec genommen
!!
!!gasCostToday / gasCostYesterday / gasCountToday / gasCountYesterday / gasEXMemory / gasLastInvoice
!!gasStart / gasTotalEnergyCount / gasUsedEnergyCost / gasUsedEnergyCount
!! CUX2801001
!!
var serialCounter = "MEQ0705547";
var useAsGasCounter = 0;
var cuxddevice = "CUX2801001";
!! ================ ab hier nichts mehr aendern
var dpname = "ENERGY_COUNTER";
if (useAsGasCounter==1) {
dpname = "GAS_ENERGY_COUNTER";
}
var svLastInvoice = dom.GetObject("StromLastInvoice");
var svMemory = dom.GetObject("StromStart");
var svUsedEnergyCost = dom.GetObject("StromUsedEnergyCost");
var svUsedEnergyCount = dom.GetObject("StromUsedEnergyCount");
var svTotalEnergyCount = dom.GetObject("StromTotalEnergyCount");
var memory = svMemory.State();
var countLastIncoice = svLastInvoice.State();
object devEnergyDP = dom.GetObject("BidCos-RF."#serialCounter#":1."#dpname);
real oec = memory.StrValueByIndex("|",0).ToFloat();
real shc = memory.StrValueByIndex("|",1).ToFloat();
real chc = devEnergyDP.State();
real oldc = dom.GetObject("StromExMemory03").ToFloat();
real stoffset = dom.GetObject("StromOffset").State();
if (chc < oldc){
chc = chc + 838860.7;
stoffset = stoffset + 838860.7;
}
dom.GetObject("StromExMemory03").State(chc);
dom.GetObject("StromOffset").State(stoffset);
string stdout;string stderr;
string cmd = "/bin/sh -c 'cat /etc/config/energyPrice|sed -r \"s/\\"//g\"'";
if (cuxddevice!="") {
dom.GetObject("CUxD."#cuxddevice#":1.CMD_SETS").State(cmd);
dom.GetObject("CUxD."#cuxddevice#":1.CMD_QUERY_RET").State(1);
stdout = dom.GetObject("CUxD."#cuxddevice#":1.CMD_RETS").State();
} else {
system.Exec(cmd, &stdout, &stderr);
}
string sep = "\n";
string part;
string strCur;
real pricekwh=0;
real condvalue=0;
real heatvalue=0;
foreach(part,stdout.Split(sep)) {
string key = part.StrValueByIndex(":",0);
string val = part.StrValueByIndex(":",1);
if (useAsGasCounter==1) {
if (key=="gasHeatingValue"){
heatvalue = val.ToFloat();
}
if (key=="gasConditionNumber"){
condvalue = val.ToFloat();
}
if (key=="gasPrice"){
pricekwh = val.ToFloat();
}
} else {
if (key=="curPrice"){
pricekwh = val.ToFloat();
}
}
if (key=="currency") {
strCur=val;
}
}
if (useAsGasCounter==1) {
real cec = (chc - shc)+oec;
real uec = cec-countLastIncoice;
real consumtion = heatvalue * condvalue * uec;
real costyear = pricekwh * consumtion;
svUsedEnergyCost.State(costyear);
svUsedEnergyCount.State(uec);
svTotalEnergyCount.State(cec);
} else {
!! real cec = ((chc/1000) - shc)+oec;
real cec = (chc/1000) + stoffset;
real uec = cec-countLastIncoice;
real costyear = pricekwh * (uec);
svUsedEnergyCost.State(costyear);
svUsedEnergyCount.State(uec);
svTotalEnergyCount.State(cec);
}