HM-ES-TX-WM/Strom-Script01: Unterschied zwischen den Versionen

Aus Wikimatic
Wechseln zu: Navigation, Suche
K
Zeile 1: Zeile 1:
Thomas hat 2 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.
+
Thomas hat 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]
 
[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]
Zeile 10: Zeile 10:
  
  
<br/><br/><br/><br/><br/>Es werden folgende Systemvariablen für Script 1 und Script 2 benötigt:
+
<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"
 
{| border="1" cellpadding="1" cellspacing="1"
Zeile 34: Zeile 34:
  
 
=== '''Script 1''' darf nur einmal am Tag (um 0 Uhr zweckmässigerweise) laufen und ''ermittelt den gestrigen Verbrauch und speichert den Zählerstand''. ===
 
=== '''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">
+
<div style="background:#eee; border:1px solid #ccc; padding:5px 10px">
 
:<code>!! Energy Costs Part 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br/>!!<br/>!! Berechnet die verbrauchten kWh seit dem letzten Aufruf + Preis<br/>!! sollte einmal tgl. um 0 Uhr laufen<br/>!! 02/15&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br/>!! (c) by thkl<br/>!!<br/>!! Benötigte SystemVariablen:<br/>!! Name&nbsp;: eCountYesterday Typ: Zahl Einheit kWh<br/>!! Name&nbsp;: eCostYesterday Typ: Zahl Einheit&nbsp;: EUR<br/>!! Name&nbsp;: 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/>&nbsp; string key = part.StrValueByIndex(":",0);<br/>&nbsp; string val = part.StrValueByIndex(":",1);<br/>&nbsp; if (key==priceKey){<br/>&nbsp; &nbsp; price = val.ToFloat();<br/>&nbsp; }<br/>&nbsp; if (key=="currency") {<br/>&nbsp; &nbsp; strCur=val;<br/>&nbsp; }<br/>}<br/><br/>eEXMemory.State(devcount.ToString());<br/><br/>integer kwf = 1;<br/><br/>if (priceKey=="curPrice") {<br/>&nbsp; kwf = 1000;<br/>}<br/><br/>real costyed = price * (cnyday/kwf);<br/>svCountYesterday.State((cnyday/kwf));<br/>svCostYesterday.State(costyed);</code><br/>
 
:<code>!! Energy Costs Part 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br/>!!<br/>!! Berechnet die verbrauchten kWh seit dem letzten Aufruf + Preis<br/>!! sollte einmal tgl. um 0 Uhr laufen<br/>!! 02/15&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br/>!! (c) by thkl<br/>!!<br/>!! Benötigte SystemVariablen:<br/>!! Name&nbsp;: eCountYesterday Typ: Zahl Einheit kWh<br/>!! Name&nbsp;: eCostYesterday Typ: Zahl Einheit&nbsp;: EUR<br/>!! Name&nbsp;: 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/>&nbsp; string key = part.StrValueByIndex(":",0);<br/>&nbsp; string val = part.StrValueByIndex(":",1);<br/>&nbsp; if (key==priceKey){<br/>&nbsp; &nbsp; price = val.ToFloat();<br/>&nbsp; }<br/>&nbsp; if (key=="currency") {<br/>&nbsp; &nbsp; strCur=val;<br/>&nbsp; }<br/>}<br/><br/>eEXMemory.State(devcount.ToString());<br/><br/>integer kwf = 1;<br/><br/>if (priceKey=="curPrice") {<br/>&nbsp; kwf = 1000;<br/>}<br/><br/>real costyed = price * (cnyday/kwf);<br/>svCountYesterday.State((cnyday/kwf));<br/>svCostYesterday.State(costyed);</code><br/>
 
</div>
 
</div>
Zeile 42: Zeile 42:
  
 
=== <br/>'''Script 2''' kann beliebig oft laufen und ermittelt den ''Vebrauch des aktuellen Tages''&nbsp; ===
 
=== <br/>'''Script 2''' kann beliebig oft laufen und ermittelt den ''Vebrauch des aktuellen Tages''&nbsp; ===
<div style="background:#eee; border:1px solid #ccc; padding:5px 10px">
+
<div style="background:#eee; border:1px solid #ccc; padding:5px 10px">
 
:<code>!! Energy Costs Part 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<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&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br/>!! (c) by thkl<br/>!!<br/>!! Benötigte SystemVariablen:<br/>!! Name&nbsp;: eCountToday Typ: Zahl Einheit kWh<br/>!! Name&nbsp;: eCostToday Typ: Zahl Einheit: EUR<br/>!! Name&nbsp;: 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/>&nbsp; string key = part.StrValueByIndex(":",0);<br/>&nbsp; string val = part.StrValueByIndex(":",1);<br/>&nbsp; if (key==priceKey){<br/>&nbsp; &nbsp; price = val.ToFloat();<br/>&nbsp; }<br/>&nbsp; if (key=="currency") {<br/>&nbsp; &nbsp; strCur=val;<br/>&nbsp; }<br/>}<br/><br/>integer kwf = 1;<br/><br/>if (priceKey=="curPrice") {<br/>&nbsp; kwf = 1000;<br/>}<br/>real costtoday = price * (cntoday/kwf);<br/>svCountToday.State((cntoday/kwf));<br/>svCostToday.State(costtoday);</code><br/>
 
:<code>!! Energy Costs Part 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<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&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br/>!! (c) by thkl<br/>!!<br/>!! Benötigte SystemVariablen:<br/>!! Name&nbsp;: eCountToday Typ: Zahl Einheit kWh<br/>!! Name&nbsp;: eCostToday Typ: Zahl Einheit: EUR<br/>!! Name&nbsp;: 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/>&nbsp; string key = part.StrValueByIndex(":",0);<br/>&nbsp; string val = part.StrValueByIndex(":",1);<br/>&nbsp; if (key==priceKey){<br/>&nbsp; &nbsp; price = val.ToFloat();<br/>&nbsp; }<br/>&nbsp; if (key=="currency") {<br/>&nbsp; &nbsp; strCur=val;<br/>&nbsp; }<br/>}<br/><br/>integer kwf = 1;<br/><br/>if (priceKey=="curPrice") {<br/>&nbsp; kwf = 1000;<br/>}<br/>real costtoday = price * (cntoday/kwf);<br/>svCountToday.State((cntoday/kwf));<br/>svCostToday.State(costtoday);</code><br/>
 
</div>
 
</div>
Zeile 49: Zeile 49:
 
----
 
----
  
=== '''Script 3&nbsp;''' für die Berrechnung der&nbsp; ''jährlichen Energiekosten''. ===
+
=== '''Script 3&nbsp;''' für die Berrechnung der&nbsp; ''jährlichen Energiekosten''.&nbsp; ===
 +
 
 +
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:
 
Folgende Variablen:
Zeile 81: Zeile 83:
  
 
&nbsp;
 
&nbsp;
<div style="background:#eee; border:1px solid #ccc; padding:5px 10px">
+
<div style="background:#eee; border:1px solid #ccc; padding:5px 10px">
:<code>!! Energy Costs Part 3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br/>!!<br/>!! Berechnet die verbrauchten kWh seit der letzten Abrechnung des Energielieferanten<br/>!!<br/>!! kann beliebig oft laufen<br/>!!<br/>!! 02/15&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br/>!! (c) by thkl<br/>!!<br/>!! Benötigte SystemVariablen:<br/>!! Name&nbsp;: eLastInvoice Typ:Zahl -> hier den Zählerstand der letzten Energieabrechnung in kWh eintragen.<br/>!! Name&nbsp;: 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&nbsp;; 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&nbsp;: eUsedEnergyCost Typ: Zahl Einheit&nbsp;:EUR&nbsp;<br/>!! Name&nbsp;: eUsedEnergyCount Typ: Zahl Einheit&nbsp;:kWh<br/>!! Name&nbsp;: eTotalEnergyCount Typ: Zahl Einheit&nbsp;: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>!! Energy Costs Part 3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br/>!!<br/>!! Berechnet die verbrauchten kWh seit der letzten Abrechnung des Energielieferanten<br/>!!<br/>!! kann beliebig oft laufen<br/>!!<br/>!! 02/15&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br/>!! (c) by thkl<br/>!!<br/>!! Benötigte SystemVariablen:<br/>!! Name&nbsp;: eLastInvoice Typ:Zahl -> hier den Zählerstand der letzten Energieabrechnung in kWh eintragen.<br/>!! Name&nbsp;: 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&nbsp;; 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&nbsp;: eUsedEnergyCost Typ: Zahl Einheit&nbsp;:EUR&nbsp;<br/>!! Name&nbsp;: eUsedEnergyCount Typ: Zahl Einheit&nbsp;:kWh<br/>!! Name&nbsp;: eTotalEnergyCount Typ: Zahl Einheit&nbsp;: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&nbsp;; = 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>&nbsp; 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>&nbsp; dom.GetObject("CUxD."#cuxddevice#":1.CMD_SETS").State(cmd);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; dom.GetObject("CUxD."#cuxddevice#":1.CMD_QUERY_RET").State(1);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; 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>&nbsp; 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>&nbsp; string key = part.StrValueByIndex(":",0);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; string val = part.StrValueByIndex(":",1);</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp;&nbsp;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; if (useAsGasCounter==1) {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; if (key=="gasHeatingValue"){</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; &nbsp; heatvalue = val.ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; }</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; if (key=="gasConditionNumber"){</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; &nbsp; condvalue = val.ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; }</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; if (key=="gasPrice"){</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; &nbsp; pricekwh = val.ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; }</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; } else {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; &nbsp; if (key=="curPrice"){</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; &nbsp; pricekwh = val.ToFloat();</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; }</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; }</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>&nbsp; if (key=="currency") {</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; &nbsp; strCur=val;</code></div><div id="bloop_customfont" style="line-height: 19.5px; margin: 0px;"><code>&nbsp; }</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>&nbsp; &nbsp; &nbsp; &nbsp; 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>
:<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/>&nbsp; string key = part.StrValueByIndex(":",0);<br/>&nbsp; string val = part.StrValueByIndex(":",1);<br/>&nbsp; if (key==priceKey){<br/>&nbsp; &nbsp; price = val.ToFloat();<br/>&nbsp; }<br/>&nbsp; if (key=="currency") {<br/>&nbsp; &nbsp; strCur=val;<br/>&nbsp; }<br/>}<br/><br/><br/>real costyear = price * (uec);<br/>svUsedEnergyCost.State(costyear);<br/>svUsedEnergyCount.State(uec);<br/>svTotalEnergyCount.State(cec);</code><br/>
+
 
+
&nbsp;
+
 
</div>
 
</div>
 
&nbsp;
 
&nbsp;
Zeile 93: Zeile 91:
  
 
=== Script 4&nbsp; setzt die CCU interne Zähl-Variable auf den aktuellen Zählerstand ===
 
=== Script 4&nbsp; setzt die CCU interne Zähl-Variable auf den aktuellen Zählerstand ===
<div style="background:#eee; border:1px solid #ccc; padding:5px 10px">
+
<div style="background:#eee; border:1px solid #ccc; padding:5px 10px">
 
:<code>&nbsp; dom.GetObject("variablenname").State(dom.GetObject("BidCos-RF.SERIENNUMMER:1.ENERGY_COUNTER").State()+12345);</code><br/>
 
:<code>&nbsp; dom.GetObject("variablenname").State(dom.GetObject("BidCos-RF.SERIENNUMMER:1.ENERGY_COUNTER").State()+12345);</code><br/>
 
</div>
 
</div>

Version vom 12. Februar 2015, 20:25 Uhr

Thomas hat 3 Scripte geschrieben, die den heutigen und gestrigen Verbrauch in eine SysVar schreiben.
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












Es werden folgende Systemvariablen für Script 1 und Script 2 benötigt:

eCountToday
Zahl Einheit kWh
eCountYesterday
Zahl Einheit kWh
eCostToday
Zahl Einheit: EUR
eCostYesterday
Zahl Einheit: EUR
eEXMemory
Zeichenkette Einheit : WH (Einheit is egal is nur Show)
var serialCounter
"XXXXX"; in jedem der Scripts mit der Seriennummer des eigenen Aktors füllen.

Script 1 darf nur einmal am Tag (um 0 Uhr zweckmässigerweise) laufen und ermittelt den gestrigen Verbrauch und speichert den Zählerstand.

!! Energy Costs Part 1                                                       
!!
!! Berechnet die verbrauchten kWh seit dem letzten Aufruf + Preis
!! sollte einmal tgl. um 0 Uhr laufen
!! 02/15                                                 
!! (c) by thkl
!!
!! Benötigte SystemVariablen:
!! Name : eCountYesterday Typ: Zahl Einheit kWh
!! Name : eCostYesterday Typ: Zahl Einheit : EUR
!! Name : eEXMemory Typ: Zeichenkette
!!
!! Verbrauchte Energie wird nach Scriptlauf in eCountYesterday in kWh gespeichert Kosten in eCostYesterday

!! serialCounter mit Seriennummer des HM Zählers füllen

var serialCounter = "XXXXX";
var dpname = "ENERGY_COUNTER";
var priceKey = "curPrice";

var eEXMemory = dom.GetObject("eEXMemory");
var svCountYesterday = dom.GetObject("eCountYesterday");
var svCostYesterday = dom.GetObject("eCostYesterday");
object devEnergyDP = dom.GetObject("BidCos-RF."#serialCounter#":1."#dpname);
string tmpSVal = eEXMemory.State();
real devcount = devEnergyDP.State();
real statelast = tmpSVal.ToFloat();
real cnyday = devcount-statelast;

string stdout;string stderr;
string cmd = "/bin/sh -c 'cat /etc/config/energyPrice|sed -r \"s/\\"//g\"'";
system.Exec(cmd, &stdout, &stderr);
string sep = "\n";
string part;
string strCur;
real price;

foreach(part,stdout.Split(sep)) {
  string key = part.StrValueByIndex(":",0);
  string val = part.StrValueByIndex(":",1);
  if (key==priceKey){
    price = val.ToFloat();
  }
  if (key=="currency") {
    strCur=val;
  }
}

eEXMemory.State(devcount.ToString());

integer kwf = 1;

if (priceKey=="curPrice") {
  kwf = 1000;
}

real costyed = price * (cnyday/kwf);
svCountYesterday.State((cnyday/kwf));
svCostYesterday.State(costyed);

 



Script 2 kann beliebig oft laufen und ermittelt den Vebrauch des aktuellen Tages 

!! Energy Costs Part 2                                                       
!!
!! Berechnet die verbrauchten kWh seit dem letzten Aufruf von Script 1 also im Idealfall
!! den Verbrauch seit Mitternacht
!!
!! kann beliebig oft laufen
!! funktioniert nur in Zusammenhang mit Script 1 richtig
!!
!! 02/15                                                 
!! (c) by thkl
!!
!! Benötigte SystemVariablen:
!! Name : eCountToday Typ: Zahl Einheit kWh
!! Name : eCostToday Typ: Zahl Einheit: EUR
!! Name : eEXMemory Typ: Zeichenkette
!!
!! Verbrauchte Energie wird nach Scriptlauf in eCountToday in kWh gespeichert Kosten in eCostToday

!! serialCounter mit Seriennummer des HM Zählers füllen


var serialCounter = "XXXXX";
var dpname = "ENERGY_COUNTER";
var priceKey = "curPrice";

var eEXMemory = dom.GetObject("eEXMemory");
var svCountToday = dom.GetObject("eCountToday");
var svCostToday = dom.GetObject("eCostToday");

object devEnergyDP = dom.GetObject("BidCos-RF."#serialCounter#":1."#dpname);
string tmpSVal = eEXMemory.State();
real devcount = devEnergyDP.State();
real statelast = tmpSVal.ToFloat();
real cntoday = devcount-statelast;

string stdout;string stderr;
string cmd = "/bin/sh -c 'cat /etc/config/energyPrice|sed -r \"s/\\"//g\"'";
system.Exec(cmd, &stdout, &stderr);
string sep = "\n";
string part;
string strCur;
real price;

foreach(part,stdout.Split(sep)) {
  string key = part.StrValueByIndex(":",0);
  string val = part.StrValueByIndex(":",1);
  if (key==priceKey){
    price = val.ToFloat();
  }
  if (key=="currency") {
    strCur=val;
  }
}

integer kwf = 1;

if (priceKey=="curPrice") {
  kwf = 1000;
}
real costtoday = price * (cntoday/kwf);
svCountToday.State((cntoday/kwf));
svCostToday.State(costtoday);

 


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:

eLastInvoice
Zahl -> hier den Zählerstand der letzten Energieabrechnung in kWh eintragen
eStart
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 also / 1000
eUsedEnergyCost
Zahl Einheit :EUR
eUsedEnergyCount
Zahl Einheit :kWh
eTotalEnergyCount
Zahl Einheit :kWh

Die Variable eStart dient der Differenzrechnung um bei jedem Scriptaufruf auf den aktuellen Zählerstand des richtigen EZählers berechnen zu können
var serialCounter
"XXXXX"; -> hier wieder Seriennummer anpassen

 

!! Energy Costs Part 3                                                       
!!
!! Berechnet die verbrauchten kWh seit der letzten Abrechnung des Energielieferanten
!!
!! kann beliebig oft laufen
!!
!! 02/15                                                 
!! (c) by thkl
!!
!! Benötigte SystemVariablen:
!! Name : eLastInvoice Typ:Zahl -> hier den Zählerstand der letzten Energieabrechnung in kWh eintragen.
!! Name : eStart 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
!! also / 1000
!! Name : eUsedEnergyCost Typ: Zahl Einheit :EUR 
!! Name : eUsedEnergyCount Typ: Zahl Einheit :kWh
!! Name : eTotalEnergyCount Typ: Zahl Einheit :kWh
!! Energiekosten werden nach Scriptlauf in eUsedEnergyCost gespeichert
!! Verbrauchte KwH werden nach Scriptlauf in eUsedEnergyCount gespeichert
!! aktueller Stand des Stromzählers wird in eTotalEnergyCount gespeichert

!! 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


var serialCounter = "";
var useAsGasCounter = 0;
var cuxddevice = "";

!! ================ ab hier nichts mehr aendern

var dpname = "ENERGY_COUNTER";
if (useAsGasCounter==1) {
  dpname = "GAS_ENERGY_COUNTER";
}

var svLastInvoice = dom.GetObject("eLastInvoice");
var svMemory = dom.GetObject("eStart");
var svUsedEnergyCost = dom.GetObject("eUsedEnergyCost");
var svUsedEnergyCount = dom.GetObject("eUsedEnergyCount");
var svTotalEnergyCount = dom.GetObject("eTotalEnergyCount");


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();

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.ToFloat();
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 uec = cec-countLastIncoice.ToFloat();
real costyear = pricekwh * (uec);
svUsedEnergyCost.State(costyear);
svUsedEnergyCount.State(uec);
svTotalEnergyCount.State(cec);
}

!! serialCounter mit Seriennummer des HM Zählers füllen

 


Script 4  setzt die CCU interne Zähl-Variable auf den aktuellen Zählerstand

  dom.GetObject("variablenname").State(dom.GetObject("BidCos-RF.SERIENNUMMER:1.ENERGY_COUNTER").State()+12345);

Wobei 12345 der Stand des richtigen Zählers bei 0 Stellung des HM Zählers ist. Bei Bedarf kann man natürlich den HM Zähler durch Batterie raus wieder auf 0 setzen.

.