nischram / E3dcGui

E3DC S10 / HomeMatic Daten abfragen, darstellen oder senden
39 stars 14 forks source link

Leistung Tracker1 und Tracker2 #30

Closed tommiSF closed 6 years ago

tommiSF commented 6 years ago

Kann man die parameter.h für die Leistungen Tracker 1und 2 als weitere Systemvariablen in der Homematic erweitern? Wenn ja, was muss noch angepasst werden? z.B. S10_EMS_POWER_TRACKER1 S10_EMS_POWER_TRACKER2

Viele Grüße

Thomas

nischram commented 6 years ago

Hallo Thomas, ich habe eine neue Version hochgeladen wo ich als Beispiel deinen Wunsch eingebaut habe. Du müsstest die "parameter.h" erweitern und die RscpMain.cpp erneuern oder anpassen.

Um neue Werte zur HM zu senden muss zum einen ein Parameter für die ISE_ID angelegt werden und zum anderen der Befehl zum senden an die entsprechende stelle in den Code eingeführt werden. Für die Tracker habe ich das jetzt mal gemacht dann kann man es als Beispiel für weitere Wünsche nutzen. In der "parameter.h" sind die Zeilen für die ISE_ID eingefügt (eigentlich egal wo):

#define TRACKER_POWER               1
#define TAG_EMS_ISE_TRACKER_1       38884
#define TAG_EMS_ISE_TRACKER_2       38885
#define TRACKER_VOLTAGE             1
#define TRACKER_CURRENT             1

Die Beispiel ISE_IDs müssen natürlich durch die korrekte ISE der HM für die Systemvariable ersetzt werden. Den Namen der Systemvariable kannst du wie oben erwähnt in der HM einrichten, aber wie die Systemvariable heißt ist eigentlich egal nur die ISE_ID ist wichtig,

Der Bereich in der Datei "RscpMain.cpp" sieht jetzt wie folgt aus:

            case TAG_PVI_DC_POWER: {
                int index = -1;
                float TAG_OUT_PVI_DC_POWER = 0;
                std::vector<SRscpValue> container = protocol->getValueAsContainer(&PVIData[i]);
                for(size_t n = 0; n < container.size(); n++) {
                    if((container[n].tag == TAG_PVI_INDEX) ) {
                        index = protocol->getValueAsUInt16(&container[n]);
                    }
                    else if((container[n].tag == TAG_PVI_VALUE)) {
                            TAG_OUT_PVI_DC_POWER = protocol->getValueAsFloat32(&container[n]);
                            if (index == 0){
                              cout << "PVI DC-Power 1 = " << TAG_OUT_PVI_DC_POWER << " \n";
                              writeRscp(PosPVIDCP1,TAG_OUT_PVI_DC_POWER);
                              printsendHM(CounterHM, TAG_EMS_ISE_TRACKER_1, TAG_OUT_PVI_DC_POWER);
                            }
                            else if (index == 1){
                              cout << "PVI DC-Power 2 = " << TAG_OUT_PVI_DC_POWER << " \n";
                              writeRscp(PosPVIDCP2,TAG_OUT_PVI_DC_POWER);
                              printsendHM(CounterHM, TAG_EMS_ISE_TRACKER_2, TAG_OUT_PVI_DC_POWER);
                            }
                    }
                }
                protocol->destroyValueData(container);
                break;
            }

Folgende Funktion übernimmt das Senden zur HM:

printsendHM(CounterHM, TAG_EMS_ISE_TRACKER_1, TAG_OUT_PVI_DC_POWER);

printsendHM() startet die Funktion, deklariert in der Rscp/RWData.cpp CounterHM ist der Zähler für den Zeitabstand für das senden zur HM TAG_EMS_ISE_TRACKER_1 ist der Parameter aus der "parameter.h" für die ISE_ID der Systemvariable TAG_OUT_PVI_DC_POWER ist der Wert der zuvor mit der RSCP Applikation vom S10 gelesen

So ich hoffe meine Erklärung ist verständlich, damit du diese ggf. auch für weitere Variablen nutzen kannst.

Viele Grüße Nico

nischram commented 6 years ago

Kleine Erweiterung in der Anleitung für HomeMatic eingefügt, somit schliße dieser Issue erst einmal.

tommiSF commented 6 years ago

Hallo Nico,

vielen Dank, die Trackerdaten werden nun an die HM gesendet.

Übrigens, die E3dcGui und E3dctoHM sind 1a, genau das hatte ich gesucht (E3DC + Grünbeck + Display). Super Arbeit!

Grüße

Thomas

Am Mo., 25. Juni 2018 um 21:44 Uhr schrieb nischram < notifications@github.com>:

Hallo Thomas, ich habe eine neue Version hochgeladen wo ich als Beispiel deinen Wunsch eingebaut habe. Du müsstest die "parameter.h" erweitern und die RscpMain.cpp erneuern oder anpassen.

Um neue Werte zur HM zu senden muss zum einen ein Parameter für die ISE_ID angelegt werden und zum anderen der Befehl zum senden an die entsprechende stelle in den Code eingeführt werden. Für die Tracker habe ich das jetzt mal gemacht dann kann man es als Beispiel für weitere Wünsche nutzen. In der "parameter.h" sind die Zeilen für die ISE_ID eingefügt (eigentlich egal wo):

define TRACKER_POWER 1

define TAG_EMS_ISE_TRACKER_1 38884

define TAG_EMS_ISE_TRACKER_2 38885

define TRACKER_VOLTAGE 1

define TRACKER_CURRENT 1

Die Beispiel ISE_IDs müssen natürlich durch die korrekte ISE der HM für die Systemvariable ersetzt werden. Den Namen der Systemvariable kannst du wie oben erwähnt in der HM einrichten, aber wie die Systemvariable heißt ist eigentlich egal nur die ISE_ID ist wichtig,

Der Bereich in der Datei "RscpMain.cpp" sieht jetzt wie folgt aus:

        case TAG_PVI_DC_POWER: {
            int index = -1;
            float TAG_OUT_PVI_DC_POWER = 0;
            std::vector<SRscpValue> container = protocol->getValueAsContainer(&PVIData[i]);
            for(size_t n = 0; n < container.size(); n++) {
                if((container[n].tag == TAG_PVI_INDEX) ) {
                    index = protocol->getValueAsUInt16(&container[n]);
                }
                else if((container[n].tag == TAG_PVI_VALUE)) {
                        TAG_OUT_PVI_DC_POWER = protocol->getValueAsFloat32(&container[n]);
                        if (index == 0){
                          cout << "PVI DC-Power 1 = " << TAG_OUT_PVI_DC_POWER << " \n";
                          writeRscp(PosPVIDCP1,TAG_OUT_PVI_DC_POWER);
                          printsendHM(CounterHM, TAG_EMS_ISE_TRACKER_1, TAG_OUT_PVI_DC_POWER);
                        }
                        else if (index == 1){
                          cout << "PVI DC-Power 2 = " << TAG_OUT_PVI_DC_POWER << " \n";
                          writeRscp(PosPVIDCP2,TAG_OUT_PVI_DC_POWER);
                          printsendHM(CounterHM, TAG_EMS_ISE_TRACKER_2, TAG_OUT_PVI_DC_POWER);
                        }
                }
            }
            protocol->destroyValueData(container);
            break;
        }

Folgende Funktion übernimmt das Senden zur HM:

printsendHM(CounterHM, TAG_EMS_ISE_TRACKER_1, TAG_OUT_PVI_DC_POWER);

printsendHM() startet die Funktion, deklariert in der Rscp/RWData.cpp CounterHM ist der Zähler für den Zeitabstand für das senden zur HM TAG_EMS_ISE_TRACKER_1 ist der Parameter aus der "parameter.h" für die ISE_ID der Systemvariable TAG_OUT_PVI_DC_POWER ist der Wert der zuvor mit der RSCP Applikation vom S10 gelesen

So ich hoffe meine Erklärung ist verständlich, damit du diese ggf. auch für weitere Variablen nutzen kannst.

Viele Grüße Nico

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/nischram/E3dcGui/issues/30#issuecomment-400071848, or mute the thread https://github.com/notifications/unsubscribe-auth/Amrj4eQtB8aZve0iQAZL7PnZCgVshQpkks5uAT2kgaJpZM4U1ov- .

bs0001 commented 4 years ago

Hallo, gibt es eine Empfehlung, wie oft man die Daten von der S10E zur Homematic schicken lassen sollte? In der S10E werden diese ja sekündlich aktualisiert. Ziel sollte es schon sein, so viele Details wie möglich zu erhalten. Viele Grüße Bernd

nischram commented 4 years ago

Hallo Bernd,

kleiner wie jede Sekunde geht nicht in meiner RSCP Applikation. Wenn du die Daten speichern willst ist 1x je Sekunde eine Riesen Datenmenge. Wenn die Daten in die Homematic übertragen werden sollen, kommt die API nicht mit einer Übertragung von 1x je Sekunde zurecht, hier würde ich nicht häufiger übertragen als alle 15 Sekunden. Gruß Nico

bs0001 commented 4 years ago

Hallo Nico,vielen Dank für die schnelle Antwort! Welche Häufigkeit hast Du gewählt? Ich habe mir noch nicht alles angesehen.Werden über die Schnittstelle die Vergangenheitswerte aus dem E3DC Portal genommen oder erfolgt die Aggregierung auf Basis der erfassten täglich kumulierten Werte um kurz vor 24h?Dann hab ich noch eine Frage zu den negativen Werten. Wieso kann die CCU hier nicht mit umgehen? Hab gestern mal einen Test gemacht und zumindest größer und kleiner Funktionen haben im Skript bei negativen Werten funktioniert. Mir wäre eine Variable für beides lieber. Die Variablen muss ich alle händisch anlegen oder hast Du das auch in ein Skript verpackt? Sehr cooles Projekt übrigens!! Viele Grüße Bernd 

nischram commented 4 years ago

Hallo,

Ich frage für das Display jede Sekunde die Werte ab. An die Homematic sende ich aktuell alle 30 Sekunden. In der HM habe ich keine Darstellung oder kein Logging, für die Spülmaschine oder Waschmaschine reicht es alle 30 Sekunden zu berechnen ob die loslaufen dürfen. Die Leistungskurve die ich im Display anzeige ist nur eine 15 Minuten-Mittelwertbildung aus den Sekundenwerten als durchlaufende Grafik. Im Hauptschirm vom Display die "Vergangenheitswerte" sind die HistoryValues die ich vom System abfrage. Hierfür haben in der Software nichts eingebaut um die Werte zur HM zu übertragen. Die HistoryValues sind die Daten die vom System gespeichert werden und dann auch zum Portal übertragen werden.

Da du zwei Anfragen gestellt hast habe ich dir natürlich auch in zwei Mal geantwortet ;-) Issue #37

Viele Grüße Nico