Thomas hat 2 3 Scripte geschrieben, die den heutigen und gestrigen Verbrauch in eine SysVar schreiben.<br/>Ausserdem werden die Kosten aus dem entsprechenden Strompreis Eintrag in der Systemsteuerung der CCU berechnet.
[http://homematic-forum.de/forum/viewtopic.php?f=27&t=23104#p198925_http://homematic-forum.de/forum/viewtopic.php?f=27&t=23104#p198925 http://homematic-forum.de/forum/viewtopic.php?f=27&t=23104#p198925_http://homematic-forum.de/forum/viewtopic.php?f=27&t=23104#p198925]
<br/><br/><br/><br/><br/><br/><br/><br/>Es werden folgende Systemvariablen für Script 1 und Script 2 benötigt:
{| border="1" cellpadding="1" cellspacing="1"
=== '''Script 1''' darf nur einmal am Tag (um 0 Uhr zweckmässigerweise) laufen und ''ermittelt den gestrigen Verbrauch und speichert den Zählerstand''. ===
<div style="background:#eee; border:1px solid #ccc; padding:5px 10px">
:<code>!! Energy Costs Part 1 <br/>!!<br/>!! Berechnet die verbrauchten kWh seit dem letzten Aufruf + Preis<br/>!! sollte einmal tgl. um 0 Uhr laufen<br/>!! 02/15 <br/>!! (c) by thkl<br/>!!<br/>!! Benötigte SystemVariablen:<br/>!! Name : eCountYesterday Typ: Zahl Einheit kWh<br/>!! Name : eCostYesterday Typ: Zahl Einheit : EUR<br/>!! Name : eEXMemory Typ: Zeichenkette<br/>!!<br/>!! Verbrauchte Energie wird nach Scriptlauf in eCountYesterday in kWh gespeichert Kosten in eCostYesterday<br/><br/>!! serialCounter mit Seriennummer des HM Zählers füllen<br/><br/>var serialCounter = "XXXXX";<br/>var dpname = "ENERGY_COUNTER";<br/>var priceKey = "curPrice";<br/><br/>var eEXMemory = dom.GetObject("eEXMemory");<br/>var svCountYesterday = dom.GetObject("eCountYesterday");<br/>var svCostYesterday = dom.GetObject("eCostYesterday");<br/>object devEnergyDP = dom.GetObject("BidCos-RF."#serialCounter#":1."#dpname);<br/>string tmpSVal = eEXMemory.State();<br/>real devcount = devEnergyDP.State();<br/>real statelast = tmpSVal.ToFloat();<br/>real cnyday = devcount-statelast;<br/><br/>string stdout;string stderr;<br/>string cmd = "/bin/sh -c 'cat /etc/config/energyPrice|sed -r \"s/\\"//g\"'";<br/>system.Exec(cmd, &stdout, &stderr);<br/>string sep = "\n";<br/>string part;<br/>string strCur;<br/>real price;<br/><br/>foreach(part,stdout.Split(sep)) {<br/> string key = part.StrValueByIndex(":",0);<br/> string val = part.StrValueByIndex(":",1);<br/> if (key==priceKey){<br/> price = val.ToFloat();<br/> }<br/> if (key=="currency") {<br/> strCur=val;<br/> }<br/>}<br/><br/>eEXMemory.State(devcount.ToString());<br/><br/>integer kwf = 1;<br/><br/>if (priceKey=="curPrice") {<br/> kwf = 1000;<br/>}<br/><br/>real costyed = price * (cnyday/kwf);<br/>svCountYesterday.State((cnyday/kwf));<br/>svCostYesterday.State(costyed);</code><br/>
</div>
=== <br/>'''Script 2''' kann beliebig oft laufen und ermittelt den ''Vebrauch des aktuellen Tages'' ===
<div style="background:#eee; border:1px solid #ccc; padding:5px 10px">
:<code>!! Energy Costs Part 2 <br/>!!<br/>!! Berechnet die verbrauchten kWh seit dem letzten Aufruf von Script 1 also im Idealfall<br/>!! den Verbrauch seit Mitternacht<br/>!!<br/>!! kann beliebig oft laufen<br/>!! funktioniert nur in Zusammenhang mit Script 1 richtig<br/>!!<br/>!! 02/15 <br/>!! (c) by thkl<br/>!!<br/>!! Benötigte SystemVariablen:<br/>!! Name : eCountToday Typ: Zahl Einheit kWh<br/>!! Name : eCostToday Typ: Zahl Einheit: EUR<br/>!! Name : eEXMemory Typ: Zeichenkette<br/>!!<br/>!! Verbrauchte Energie wird nach Scriptlauf in eCountToday in kWh gespeichert Kosten in eCostToday<br/><br/>!! serialCounter mit Seriennummer des HM Zählers füllen<br/><br/><br/>var serialCounter = "XXXXX";<br/>var dpname = "ENERGY_COUNTER";<br/>var priceKey = "curPrice";<br/><br/>var eEXMemory = dom.GetObject("eEXMemory");<br/>var svCountToday = dom.GetObject("eCountToday");<br/>var svCostToday = dom.GetObject("eCostToday");<br/><br/>object devEnergyDP = dom.GetObject("BidCos-RF."#serialCounter#":1."#dpname);<br/>string tmpSVal = eEXMemory.State();<br/>real devcount = devEnergyDP.State();<br/>real statelast = tmpSVal.ToFloat();<br/>real cntoday = devcount-statelast;<br/><br/>string stdout;string stderr;<br/>string cmd = "/bin/sh -c 'cat /etc/config/energyPrice|sed -r \"s/\\"//g\"'";<br/>system.Exec(cmd, &stdout, &stderr);<br/>string sep = "\n";<br/>string part;<br/>string strCur;<br/>real price;<br/><br/>foreach(part,stdout.Split(sep)) {<br/> string key = part.StrValueByIndex(":",0);<br/> string val = part.StrValueByIndex(":",1);<br/> if (key==priceKey){<br/> price = val.ToFloat();<br/> }<br/> if (key=="currency") {<br/> strCur=val;<br/> }<br/>}<br/><br/>integer kwf = 1;<br/><br/>if (priceKey=="curPrice") {<br/> kwf = 1000;<br/>}<br/>real costtoday = price * (cntoday/kwf);<br/>svCountToday.State((cntoday/kwf));<br/>svCostToday.State(costtoday);</code><br/>
</div>
----
=== '''Script 3 ''' für die Berrechnung der ''jährlichen Energiekosten''. === Hier wird schon zwischen Elektro und Gas Zähler unterschieden. Auch kann optional ein CuxD Exec Device statt system.exec verwendet werden. siehe Kommentare im Script
Folgende Variablen:
<div style="background:#eee; border:1px solid #ccc; padding:5px 10px">:<code>!! Energy Costs Part 3 <br/>!!<br/>!! Berechnet die verbrauchten kWh seit der letzten Abrechnung des Energielieferanten<br/>!!<br/>!! kann beliebig oft laufen<br/>!!<br/>!! 02/15 <br/>!! (c) by thkl<br/>!!<br/>!! Benötigte SystemVariablen:<br/>!! Name : eLastInvoice Typ:Zahl -> hier den Zählerstand der letzten Energieabrechnung in kWh eintragen.<br/>!! Name : eStart Typ: Zeichenkette -> hier den aktuellen Zählerstand und den Zählerstand des Energiemessgerätes in ganzen kWh eintragen und zwar wie folgt:<br/>!! 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<br/>!! also / 1000<br/>!! Name : eUsedEnergyCost Typ: Zahl Einheit :EUR <br/>!! Name : eUsedEnergyCount Typ: Zahl Einheit :kWh<br/>!! Name : eTotalEnergyCount Typ: Zahl Einheit :kWh<br/>!! Energiekosten werden nach Scriptlauf in eUsedEnergyCost gespeichert<br/>!! Verbrauchte KwH werden nach Scriptlauf in eUsedEnergyCount gespeichert<br/>!! aktueller Stand des Stromzählers wird in eTotalEnergyCount gespeichert<br/>!! serialCounter mit Seriennummer des HM Zählers füllen<br/><br/><br/>var serialCounter = "XXXXX";<br/><br/>var dpname = "ENERGY_COUNTER";<br/>var priceKey = "curPrice";<br/><br/>var svLastInvoice = dom.GetObject("eLastInvoice");<br/>var svMemory = dom.GetObject("eStart");<br/>var svUsedEnergyCost = dom.GetObject("eUsedEnergyCost");<br/>var svUsedEnergyCount = dom.GetObject("eUsedEnergyCount");<br/>var svTotalEnergyCount = dom.GetObject("eTotalEnergyCount");<br/><br/><br/>var memory = svMemory.State();<br/>var countLastIncoice = svLastInvoice.State();<br/><br/>object devEnergyDP = dom.GetObject("BidCos-RF."#serialCounter#":1."#dpname);<br/><br/>real oec = memory.StrValueByIndex("|",0).ToFloat();<br/>real shc = memory.StrValueByIndex("|",1).ToFloat();<br/>real chc = devEnergyDP.State();<br/><br/>real cec = ((chc/1000) - shc)+oec;<br/>!!</code> <code>folgende Zeile ggf. kürzen, falls das Script nicht läuft </code><br/>:<code>real uec = cec-countLastIncoice.ToFloat();<br/>!! real uec = cec-countLastIncoice</code><br/>:<code>!!<br/>string stdout;string stderr;<br/>string cmd = "/bin/sh -c 'cat /etc/config/energyPrice|sed -r \"s/\\"//g\"'";<br/>system.Exec(cmd, &stdout, &stderr);<br/>string sep = "\n";<br/>string part;<br/>string strCur;<br/>real price;<br/><br/>foreach(part,stdout.Split(sep)) {<br/> string key = part.StrValueByIndex(":",0);<br/> string val = part.StrValueByIndex(":",1);<br/> if (key==priceKey){<br/> price = val.ToFloat();<br/> }<br/> if (key=="currency") {<br/> strCur=val;<br/> }<br/>}<br/><br/><br/>real costyear = price * (uec);<br/>svUsedEnergyCost.State(costyear);<br/>svUsedEnergyCount.State(uec);<br/>svTotalEnergyCount.State(cec);</code><br/> :<code>!! Energy Costs Part 3 <br/>!!<br/>!! Berechnet die verbrauchten kWh seit der letzten Abrechnung des Energielieferanten<br/>!!<br/>!! kann beliebig oft laufen<br/>!!<br/>!! 02/15 <br/>!! (c) by thkl<br/>!!<br/>!! Benötigte SystemVariablen:<br/>!! Name : eLastInvoice Typ:Zahl -> hier den Zählerstand der letzten Energieabrechnung in kWh eintragen.<br/>!! Name : eStart Typ: Zeichenkette -> hier den aktuellen Zählerstand und den Zählerstand des Energiemessgerätes in ganzen kWh eintragen und zwar wie folgt:<br/>!! 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<br/>!! also / 1000<br/>!! Name : eUsedEnergyCost Typ: Zahl Einheit :EUR <br/>!! Name : eUsedEnergyCount Typ: Zahl Einheit :kWh<br/>!! Name : eTotalEnergyCount Typ: Zahl Einheit :kWh<br/>!! Energiekosten werden nach Scriptlauf in eUsedEnergyCost gespeichert<br/>!! Verbrauchte KwH werden nach Scriptlauf in eUsedEnergyCount gespeichert<br/>!! aktueller Stand des Stromzählers wird in eTotalEnergyCount gespeichert</code><br/><div id="bloop_customfont" style="margin: 0px;"><div id="bloop_customfont" style="margin: 0px;"><div style="color: rgb(0, 0, 0); font-family: Helvetica, Arial;"><code>!! useAsGasCounter = 0 - E Zähler ; = 1 Gas Zähler</code></div><div style="color: rgb(0, 0, 0); font-family: Helvetica, Arial;"><code>!! cuxddevice = Seriennummer des CuxD Exec Devices. Wenn nicht vorhanden leer lassen dann wird system.exec genommen</code></div><div style="color: rgb(0, 0, 0); font-family: Helvetica, Arial;"><br/></div><div style="color: rgb(0, 0, 0); font-family: Helvetica, Arial;"><br/></div></div></div><div id="bloop_customfont" style="font-family: Helvetica, Arial; color: rgb(0, 0, 0); margin: 0px;"><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>var serialCounter = "";</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>var useAsGasCounter = 0;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>var cuxddevice = "";</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>!! ================ ab hier nichts mehr aendern</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>var dpname = "ENERGY_COUNTER";</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>if (useAsGasCounter==1) {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> dpname = "GAS_ENERGY_COUNTER";</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>}</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>var svLastInvoice = dom.GetObject("eLastInvoice");</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>var svMemory = dom.GetObject("eStart");</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>var svUsedEnergyCost = dom.GetObject("eUsedEnergyCost");</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>var svUsedEnergyCount = dom.GetObject("eUsedEnergyCount");</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>var svTotalEnergyCount = dom.GetObject("eTotalEnergyCount");</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>var memory = svMemory.State();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>var countLastIncoice = svLastInvoice.State();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>object devEnergyDP = dom.GetObject("BidCos-RF."#serialCounter#":1."#dpname);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real oec = memory.StrValueByIndex("|",0).ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real shc = memory.StrValueByIndex("|",1).ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real chc = devEnergyDP.State();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>string stdout;string stderr;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>string cmd = "/bin/sh -c 'cat /etc/config/energyPrice|sed -r \"s/\\"//g\"'";</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>if (cuxddevice!="") {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> dom.GetObject("CUxD."#cuxddevice#":1.CMD_SETS").State(cmd);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> dom.GetObject("CUxD."#cuxddevice#":1.CMD_QUERY_RET").State(1);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> stdout = dom.GetObject("CUxD."#cuxddevice#":1.CMD_RETS").State();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>} else {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> system.Exec(cmd, &stdout, &stderr);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>}</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>string sep = "\n";</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>string part;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>string strCur;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real pricekwh=0;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real condvalue=0;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real heatvalue=0;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>foreach(part,stdout.Split(sep)) {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> string key = part.StrValueByIndex(":",0);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> string val = part.StrValueByIndex(":",1);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> </code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> if (useAsGasCounter==1) {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> if (key=="gasHeatingValue"){</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> heatvalue = val.ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> }</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> if (key=="gasConditionNumber"){</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> condvalue = val.ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> }</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> if (key=="gasPrice"){</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> pricekwh = val.ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> }</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> } else {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> if (key=="curPrice"){</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> pricekwh = val.ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> }</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> }</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> if (key=="currency") {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> strCur=val;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> }</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>}</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><br/></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>if (useAsGasCounter==1) {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real cec = (chc - shc)+oec;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real uec = cec-countLastIncoice.ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real consumtion = heatvalue * condvalue * uec;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real costyear = pricekwh * consumtion;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>svUsedEnergyCost.State(costyear);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>svUsedEnergyCount.State(uec);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>svTotalEnergyCount.State(cec);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>} else {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code> real cec = ((chc/1000) - shc)+oec;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real uec = cec-countLastIncoice.ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>real costyear = pricekwh * (uec);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>svUsedEnergyCost.State(costyear);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>svUsedEnergyCount.State(uec);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>svTotalEnergyCount.State(cec);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>}</code></div><div><br/></div></div><code>!! serialCounter mit Seriennummer des HM Zählers füllen</code>
</div>
=== Script 4 setzt die CCU interne Zähl-Variable auf den aktuellen Zählerstand ===
<div style="background:#eee; border:1px solid #ccc; padding:5px 10px">
:<code> dom.GetObject("variablenname").State(dom.GetObject("BidCos-RF.SERIENNUMMER:1.ENERGY_COUNTER").State()+12345);</code><br/>
</div>