<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Nur Text Zchn";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
span.NurTextZchn
        {mso-style-name:"Nur Text Zchn";
        mso-style-priority:99;
        mso-style-link:"Nur Text";
        font-family:Consolas;
        color:black;}
span.E-MailFormatvorlage19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:134378887;
        mso-list-type:hybrid;
        mso-list-template-ids:-931103790 547660150 67567619 67567621 67567617 67567619 67567621 67567617 67567619 67567621;}
@list l0:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:-;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-font-family:Calibri;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body bgcolor="white" lang="DE" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hallo Alexander,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">ich möchte nicht detailliert auf all Deine Vorschläge eingehen.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Nur ein paar Anmerkungen:<o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Es wäre unschön, hin und wieder mal ein Gerät nur dazu einzuschalten, um die Leistung zu ermitteln.<o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Insbesondere Leuchtmittel (Glühbirnen) haben keinen zum Ausgangswert linearen Stromverbrauch.<o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Aktuell wissen wir im dSS noch nicht, bei welchen Szenen welche Geräte an oder aus sind. (Es ist geplant, zukünftig diese Informationen im dSS zu
 sammeln.)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Der Stromverbrauch eines einzelnen Gerätes kann abgefragt werden. Dies hatte ich Dir in [1] mal erklärt. Prinzipiell könnte man (mit dem Wissen, in welcher
 Szene ein bestimmtes Gerät an ist) ein von Dir beschriebenes Verfahren auch selber als dS Add-On implementieren.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Schöne Grüße<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Christoph<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">[1]
</span><a href="http://forum.digitalstrom.org/pipermail/dss-developer/2012-March/000429.html">http://forum.digitalstrom.org/pipermail/dss-developer/2012-March/000429.html</a><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D;mso-fareast-language:EN-US">--<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D;mso-fareast-language:EN-US">Christoph Hofmann<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">aizo gmbh, Deutschland -
<a href="http://www.aizo.com"><span style="color:blue">http://www.aizo.com</span></a><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext">Von:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext"> dss-developer-bounces@forum.digitalstrom.org [mailto:dss-developer-bounces@forum.digitalstrom.org]
<b>Im Auftrag von </b>Alexander Betker<br>
<b>Gesendet:</b> Donnerstag, 26. Juli 2012 17:09<br>
<b>An:</b> dss-developer@forum.digitalstrom.org<br>
<b>Betreff:</b> [dss-developer] geräteorientiertes Loggen<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Hallo zusammen,<br>
<br>
momentan wird ja dSM-basiert der Stromverbrauch vom kompl. Stromkreis <br>
geloggt. Die gezielte JSON-Abfrage eines Devices gibt momentan "0" zurück.<br>
Ein permanentes Abfragen würde ja auch den Bus überlasten und der Traffic <br>
über die Stromleitung würde erhöht. <br>
<br>
Wenn also das Device weitere Variablen erhalten würde:<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">    int maxPowerConsumption;<br>
    (int minPowerConsumption;)<br>
    int standbyPowerConsumption;<br>
    int configValue;</span><o:p></o:p></p>
<p class="MsoNormal"><br>
MaxPowerConsumption ist ist der Stromverbrauch, den das Gerät bei<br>
vollem Betrieb hat und wird bei dem ersten Initialisieren <br>
durch das System ermittelt, indem, wenn ein komplett<br>
neue Hardware gefunden wird, der Verbraucher einmal eingeschaltet wird<br>
und der Stromverbrauch über den Sensor gemessen wird. Dann wird das<br>
Gerät wieder ausgeschaltet und erneut der Stromverbrauch ermittelt<br>
(Standby-Verbrauch). <br>
<br>
Diese Variablen werden in der Apartment.xml beim jeweiligen<br>
Device gespeichrt. <br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">modelpersistence.cpp<br>
<br>
void ModelPersistence::loadDevices(Node* _node) {</span><o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB"><br>
      ... // Code</span><o:p></o:p></p>
<p class="MsoPlainText" style="margin-bottom:12.0pt"><span lang="EN-GB">      int maxPowerConsumption = 0;<br>
      if (elem->hasAttribute("maxPowerConsumption"))<br>
              maxPowerConsumption = strToInt(elem->getAttribute("maxPowerConsumption"));<br>
<br>
      int minPowerConsumption = 0;<br>
      if (elem->hasAttribute("minPowerConsumption"))<br>
              minPowerConsumption = strToInt(elem->getAttribute("minPowerConsumption"));<br>
<br>
      int standbyPowerConsumption = 0;<br>
      if (elem->hasAttribute("standbyPowerConsumption"))<br>
              standbyPowerConsumption = strToInt(elem->getAttribute("standbyPowerConsumption"));</span><o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">      int configValue = 0;<br>
          if (elem->hasAttribute("configValue"))<br>
              configValue = strToInt(elem->getAttribute("configValue"));</span><o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB"><br>
    ... // weiter Code</span><o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">    newDevice->setConfigValue(configValue);<br>
                  newDevice->setStandbyPowerConsumption(standbyPowerConsumption);<br>
          newDevice->setMinPowerConsumption(minPowerConsumption);<br>
          newDevice->setMaxPowerConsumption(maxPowerConsumption);</span><o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB"><br>
    ... // weiter Code</span><o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">}</span><o:p></o:p></p>
<p class="MsoPlainText" style="margin-bottom:12.0pt"><o:p> </o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">void deviceToXML( .. )<br>
<br>
pDeviceNode->setAttribute("minPowerConsumption", intToString(_pDevice->getMinPowerConsumption()));<br>
    pDeviceNode->setAttribute("maxPowerConsumption", intToString(_pDevice->getMaxPowerConsumption()));<br>
    pDeviceNode->setAttribute("standbyPowerConsumption", intToString(_pDevice->getStandbyPowerConsumption()));<br>
    pDeviceNode->setAttribute("configValue", intToString(_pDevice->getConfigValue()));</span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-GB"><br>
...<br>
</span><br>
In der Klasse dss.cpp die Aufforderung, sollte das System mal herunter fahren,<br>
unbedingt die Apartment.xml aktualisieren<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoPlainText" style="margin-bottom:12.0pt"><span lang="EN-GB">dss.cpp</span><o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">... //Code<br>
m_State = ssTerminating;<br>
m_pModelMaintenance.get()->addModelEvent(new ModelEvent(ModelEvent::etModelDirty));<br>
<br>
std::for_each(m_Subsystems.begin(), m_Subsystems.end(), StopSubsystem);<br>
m_pEventQueue->shutdown();<br>
m_pEventInterpreter->terminate();</span><o:p></o:p></p>
<p class="MsoNormal"><br>
... <br>
<br>
Wir haben nun einmal persistent was das Gerät verbraucht im Betrieb und<br>
im StandBy, die Variable configValue die wir brauchen werden um zu wissen,<br>
ob das Gerät an oder aus oder gedimmt ist. Beim Wert 0 ist es aus, <br>
bei 255 ist es an und dazwischen ist es halt gedimmt. Wenn nun eine<br>
callScene aufgerufen wird, muss diese Variable aktualisiert werden.<br>
<br>
Die Methode getPowerConsumption würde dann so aussehen:<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">unsigned long Device::getPowerConsumption() {<br>
        if (isPresent()) {<br>
              if (configValue == 0)<br>
                    return standbyPowerConsumption;<br>
              else<br>
                    return maxPowerConsumption*(configValue/255);<br>
        }<br>
        else return 0;<br>
<br>
} // getPowerConsumption</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
Natürlich ist das jetzt nicht perfekt und geht auch nur bei Verbrauchern, die<br>
einen konstanten Stromverbrauch haben und nicht dynamisch wie etwa bei<br>
Computern die unter Vollast mehr verbrauchen als unter Office-Betrieb.<br>
Aber bei Lampen geht das (bei Leuchtmittelwechsel mit andere Wattzahl<br>
muss eine Kalibrierung durchgeführt werden) und wie gesagt bei "normalen"<br>
Geräten. In der minPowerConsumption kann man speichern, wenn<br>
ein Gerät über eine Leistungsstufe verfügt (ähnlich wie beim Ventilator<br>
mit versch. Leistungsstufen) wobei dann wahrscheinlich mehr zwischen<br>
Variablen gebraucht würden.<br>
<br>
Die Methode isOn vielleicht:<o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">bool Device::isOn() const {</span><o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">    if (isPresent()) {</span><o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">        if (configValue == 0)<br>
            return false;<br>
        else return true;<br>
    }</span><o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">    else return false;<br>
} // isOn</span><o:p></o:p></p>
<p class="MsoNormal"><br>
Soweit die Idee, nicht vollkommen da jeder Statuswechsel, der das Gerät<br>
betrifft (an, aus und dimmen) im configValue festgehalten werden muss.<br>
Aber das wäre schonmal eine große Steigerung zu jetzt, wo man nur <br>
bei Device getPowerConsumption "0" erhält.<br>
<br>
Und wir erzeugen hier keine zusätzliche Busbelastung! Es muss nur ledigleich <br>
einmal ermittelt werden, was das Gerät verbraucht.<br>
<br>
Für das geräteorientierte Loggen in <br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoPlainText" style="margin-bottom:12.0pt"><span lang="EN-GB">metering.h</span><o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">typedef std::map<boost::shared_ptr<Device>,<br>
                             boost::shared_ptr<std::string> > DeviceCachedSeriesMap;<br>
DeviceCachedSeriesMap m_DeviceCachedSeries;<br>
<br>
boost::shared_ptr<std::string> getOrCreateDeviceCachedSeries(<br>
              boost::shared_ptr<MeteringConfigChain> _pChain,<br>
              boost::shared_ptr<Device> _device );<br>
<br>
void postDeviceMeteringEvent(boost::shared_ptr<Device> _device, <br>
int _valuePower, int _valueEnergy, DateTime _sampledAt);</span><o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoNormal">nach dem Muster vom dSM. Entsprechend Änderungen in der Datei metering.cpp.<br>
<br>
In modelmaintenace.cpp :<br>
<br>
... <br>
<span lang="EN-GB" style="font-size:10.0pt">case ModelEvent::etMeteringValues:</span>
<br>
... <br>
<br>
<o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">m_pMetering->postMeteringEvent(meter, power, meter->getCachedEnergyMeterValue(), DateTime());</span><o:p></o:p></p>
<p class="MsoPlainText"><br>
// Direkt nach dem DSM<o:p></o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">for (int i=0; i < meter->getDevices().length(); i++) {<br>
                  dss_dsid_t deviceID = meter->getDevices().get(i).getDSID();<br>
                  boost::shared_ptr<Device> device = (meter->getDevices().getByDSID(deviceID)).getDevice();<br>
                  m_pMetering->postDeviceMeteringEvent(device ,<br>
        device->getPowerConsumption(), device->getEnergyMeterValue, DateTime());//
<br>
}</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
In der Apartment.xml könnte man auch geräteorientiert festhalten, was das Gerät bisher<br>
verbraucht hat, ähnlich wie beim EnergyCounter im dSM.<br>
<br>
Das Ganze ist natürlich ausbaufähig. <br>
Hin und wieder müßten Sensor-Kontrollabfragen erfolgen.<o:p></o:p></p>
</div>
</body>
</html>