nischram / E3dcGui

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

Daten per RSCP vom E3DC-S10 Speicher abfragen #42

Closed bs0001 closed 3 years ago

bs0001 commented 3 years ago

Hallo Nico,

habe hierzu eine grundsätzliche Frage. Die Daten, die per RSCP abgefragt werden, kommen über den S10E vom E3DC-Portal, oder? Diese Daten werden dann in eine MySQL-DB geschrieben, welche durch die Oberfläche (Display) dann angezeigt werden können. Die abgerufenen Daten werden aber nicht in eine Homematic Systemvariable geschrieben?

Was interessant wäre, dass ich mir Vergangenheitswerte zyklisch abrufe und diese in HM Systemvariablen speichere. Durch die Nutzung von ccu historian kommen diese dann anschließend auch dort rein und ich könnte mir die Verläufe dort auch ansehen.

Alternativ natürlich könnte ich die Werte auch per CSV aus dem E3DC-Portal per CSV speichern und in Excel verarbeiten. Hätte sie aber schon gerne in der Homematic drinnen. Dann kann ich diese mit weiteren vorhandenen Werte gleich in Diagrammen zusammenbringen.

Beispiele

Bei den Werten denke ich an Solarproduktion, Eigenstrom, Netzeinspeisung, Netzbezug, Hausverbrauch, Autarkie ...

Viele Grüße Bernd

nischram commented 3 years ago

Hallo Bernd,

die Daten die meine Applikation per RSCP abfragt, kommen vom Hauskraftwerk. Es sind die gleichen Daten die das Hauskraftwerk auch zum Portal sendet. In Meiner Applikation werden die Daten nur kurz im RAMDisk abgelegt damit die Dargestellt werden. Da man die Daten immer wieder vom Hauskraftwerk abfragen kann, Speicher ich diese nicht.

Da ich für mich keine Verwendung der Daten in der HM habe, werde ich meine Applikation nicht komplett umbauen. Aber du kannst ggf. die Übertragung zur HM selber einbauen. Ich habe auf die schnelle einen Test gemacht. Wenn du in die "E3dcGui/S10history/RscpReader.cpp" folgende Zeile einbaust: printsendHM(HM_Intervall, TAG_EMS_ISE_POWER_GRID_DB, grid_power_in); kannst du die HistoryValues direkt umleiten. Der Bereich hier im Test um Zeile 233 sieht dann so aus:

    case TAG_DB_GRID_POWER_IN: {
            float grid_power_in = protocol->getValueAsFloat32(&((*dbSum)[i]));
            printf("%s grid in: %0.1f Wh\n", sum_prefix, grid_power_in);
            writeHistory(dataGridIn, grid_power_in, writedata);
            printsendHM(HM_Intervall, TAG_EMS_ISE_POWER_GRID_DB, grid_power_in);
            sum.grid_in = grid_power_in;
            break;
        }

Natürlich muss die Variable für die ISE-ID in der "parameter.h" eingerichtet werden, ich habe auf die schnelle TAG_EMS_ISE_POWER_GRID_DB diese erstellt. Der Wert wird in Watt/Stunden (Wh) übertragen. So kannst du alle Variablen einrichten die du brauchst. Das Problem ist nur dass die "S10hitory" zwei mal genutzt wird, für Tageswerte vom aktuellem Tag und vom Vortag. Dafür müsste ggf die Abfrage für gestern abgestellt werden, indem in der "GuiMain.c" die Zeile 935 wie hier auskommentiert wird:

            }
            if(HistoryCounter == (historyDelay-15)){
    //          system("/home/pi/E3dcGui/S10history/S10history -Y &");//  > /dev/null 2>&1");
            }

Für Montats und Jahreswerte muss wesentlich mehr umgebaut werden. Da habe ich keine Idee

Besser wird es aber wohl sein wenn du die S10history für dich anpasst und separat betreibst. Ich habe die Applikation hier her: https://github.com/RalfJL/S10history

Mehr Tipps kann ich dazu nicht geben.

Gruß Nico

bs0001 commented 3 years ago

Hallo Nico,

Danke für die o.s. Implementierungsinfo! Habe wie von Dir beschrieben in der HM die Systemvariablen angelegt und die Erweiterungen in RscpReader.cpp, parameter.h und GuiMain.c vorgenommen. Tageswerte reichen mir erst mal aus.

Anschl. habe ich per make das gesamte Projekt nochmal generieren lassen, was auch fehlerfrei erfolgt ist. Die angelegten Systemvariablen werden aber noch nicht befüllt. Sieht man ja am Zeitstempel der Variablen in der HM. Da ist bislang noch keiner vorhanden, was ja zeigt, dass noch nichts beschrieben wird. Ich dachte, dass meine Erweiterungen automatisch durch die Hintergrundverarbeitung des Projekts von Dir befüllt werden. Demnach würde ich in den Variablen dann jeweils die bis dahin gesammelten Tageswerte sehen.

Oder muss ich einen separaten Aufruf machen?

Wäre prima, wenn Du mir hier noch einen Tipp geben könntest, woran es hängen könnte.

Besten Dank und viele Grüße Bernd

nischram commented 3 years ago

Hallo Bernd,

schwer zu sagen warum das nicht klappt. Wichtig ist dass in der parameter.h die "historyValues" aktiv sind.

Bildschirmfoto 2020-12-02 um 19 40 14

Beim kompilieren musst du drauf achten, dass die s10history auch kompiliert wird, ggf die Meldungen beachten. Wenn die Software von Hand mit "./start " gestartet wird sollte irgendwann nach einiger Zeit Einträge kommen, die etwa so aussehen:

Generating request for historical data
Start time: Wed Dec  2 00:00:00 2020
interval: 86400, Span seconds: 86399End time: Wed Dec  2 23:59:59 2020
1606938682
Day start: 1606867200 - Wed Dec  2 00:00:00 2020
Day end: 1606953599 - Wed Dec  2 23:59:59 2020
Day graph index: -1.0 
Day battery in: 32.5 Wh
Day battery out: 0.0 Wh
Day production: 656.0 Wh
Day grid in: 0.0 Wh
Day grid out: 10661.0 Wh
Day consumption: 11252.0 Wh
Day pm 0 power: 0.0 Wh
Day pm 1 power: 0.0 Wh
Day bat charge level: 7.9 %
Day bat cycle count: 0.000000 
Day consumed production: 100.0 
Day autarky: 5.252396 
Day-CSV-head: date;batin;batout;batsoc;pro;netin;netout;con
Day-CSV: 1606867200;32.50;0.00;7.90;656.00;0.00;10661.00;11252.00

Das sind die Abfragen der HistoryValues vom S10 und während der Abfrage würden dann die Daten an die HM in die Variablen gesendet.

Wenn das keine Erkenntnisse bring muss du deinen Code von der RscpReader.cpp und der MainGui.c (zumindest die Teile mit den Änderungen) hier posten.

Gruß Nico

bs0001 commented 3 years ago

Hallo Nico, Danke für die Hinweise!

In der parameter.h war der Eintrag mit der History bereits aktiv. Hatte ich zuvor gesehen und kontrolliert. image

Ich habe den automatischen Start eingerichtet. Hab ihn nun aber trotzdem auch mal mit ./start manuell gestartet. Nach ca. 5 Minuten noch kein Request mit historical data zu sehen. Es werden die zyklischen Daten ermittelt sowie der Block mit der Seriennummer.

Anbei das Ergebnis vom make: image

Hier meine Anpassungen:

RscpReader.cpp Für jede Section habe ich eine printsendHM eingefügt. Hier die erste zur Verdeutlichung. Um zu vermeiden, dass die Umrechnung "/1000" zu einem Problem führt, habe ich diese Zeilen erst mal in jeder Section auskommentiert und lasse mir die Wh übertragen. Wenn das klappt, versuche ich den Wert als kWh übertragen zu lassen. image

parameter.h Hier habe ich die ganzen neuen Systemvariablen incl. ISE# der HM eingetragen: image

GuiMain.c Hier habe ich die Ermittlung der Werte des Vortags wie von Dir beschrieben deaktiviert. image

Anschließend alles mittels make generiert. Hab ich noch was übersehen?

By the way noch folgende Fragen:

  1. Wie kann ich, wenn ich manuell mit ./start gestartet habe, den Prozess wieder beenden? Mit Strg+C kommt zwar kurz der Prompt aber anschließend macht der Dienst weiter. Ich habe mir beholfen, in dem ich ./stop in die Zwischenablage kopiert habe und wenn ich schnell genug bin, schaff ich es, den Dienst zu stoppen.

  2. Welche Bedeutung haben Day pm 0 power und Day pm 1 power? Ist das die PV-Leistung, die von Tracker 1 und 2 geliefert werden?

Viele Grüße Bernd

nischram commented 3 years ago

Hey,

das ist merkwürdig, ich kann so nichts erkennen was falsch ist. Ich habe es bei mir nochmal getestet (nur einen Wert). Der Wert für PowerGrid kommt in der HM an und in dem Auszug ist auch zu sehen das der Wert gesendet wird:

Generating request for historical data
Start time: Thu Dec  3 00:00:00 2020
interval: 86400, Span seconds: 86399End time: Thu Dec  3 23:59:59 2020
1607026470
Day start: 1606953600 - Thu Dec  3 00:00:00 2020
Day end: 1607039999 - Thu Dec  3 23:59:59 2020
Day graph index: -1.0 
Day battery in: 108.5 Wh
Day battery out: 0.0 Wh
Day production: 1128.0 Wh
Day grid in: 2.0 Wh
send to Homematic ISE_ID 38947 new Value = 2
Day grid out: 10059.0 Wh
Day consumption: 11024.0 Wh
Day pm 0 power: 0.0 Wh
Day pm 1 power: 0.0 Wh
Day bat charge level: 8.4 %
Day bat cycle count: 0.000000 
Day consumed production: 99.8 
Day autarky: 8.753624 
Day-CSV-head: date;batin;batout;batsoc;pro;netin;netout;con
Day-CSV: 1606953600;108.50;0.00;8.38;1128.00;2.00;10059.00;11024.00

Bei mir kommen die Ausgaben der S10history nach kurzer Zeit und dort sind die "send to Homematic..." Ausgaben zu sehen. Und der Wert kommt auch in der HM an.

Was mir bei der Suche aber noch aufgefallen ist das ich eine Unstimmigkeit in meinem Code habe. In der parameter.h ist der Wert #define historyAktiv 1 mit "1" gesetzt aber in der GuiMain.c mache ich die Prüfung if (historyAktiv == true){ auf "true". Bei mir scheint es zu gehen aber eventuell ist bei dir die Version auf dem Pi anders und der Vergleich schlägt fehl. Trag doch bitte mal in die an die Stelle statt "true" eine "1" ein also sollte der Bereich so aussehen:

    //HistoryValues vom S10 mit "S10history" abfragen.
        if (historyAktiv == 1){
            if(HistoryCounter == 0){
                system("/home/pi/E3dcGui/S10history/S10history -T &");// > /dev/null 2>&1");
                HistoryCounter = historyDelay;
            }
            if(HistoryCounter == (historyDelay-15)){
//              system("/home/pi/E3dcGui/S10history/S10history -Y &");//  > /dev/null 2>&1");
            }
            HistoryCounter --;
        }

Die zweite Zeile ist geändert.

Ich hoffe es klappt, sonst gehen mir die Ideen aus... Wenn das klappen sollte müssen ggf. noch andere Zeilen geändert werden, aber das Teste mal erst.

Jetzt zu den Fragen:

  1. Ja das mit dem "stop" ist nicht so einfach aber eigentlich geht es ohne Probleme, denn auch wenn du die Eingabe der einzelnen Buchstaben nicht in einen Reihe siehst kann man trotzdem den Befehl abschicken. Also der Befehl wird nicht durch die Ausgaben verändert.
  2. Nein das hat nicht mit den Treckern zu tun sonder mit den Leistungsmessern. Ich habe bei mir einen Weiteren Leistungsmesser für die Sauna, der wird mit "pm1" ausgegeben (PowerMeter) und der "pm0" ist der Leistungsmesser der im Speicher verbaut ist.

Viel Erfolg Nico

bs0001 commented 3 years ago

Hallo Nico,

Danke für die Hinweise. Leider hatte ich noch keinen Erfolg.

Habe wie beschrieben in der GuiMain.c zuerst nur den o.g., dann auch alle anderen Einträge auf == 1 geändert. Jeweils neu mit make generiert.

Habe zudem auch testweise mit beiden Varianten (also == true und == 1) in der parameter.h mit GUI auf 1 gesetzt. Hat aber auch nichts gebracht. Lässt sich vielleicht an einer geeigneten Stelle mal eine Nachrichtenzeile ausgeben, so dass man schauen kann, ob er an die gewünschten Stellen kommt?

Könnte ich eigentlich auch in der parameter.h den Wert für historyAktiv statt auf 1 auf true setzen? Dann müsste in der GuiMain.c nichts geändert werden.

Ich habe zur Sicherheit auch noch rekursiv dem E3dcGui-Verzeichnis die Berechtigung 0755 gesetzt. Somit sollte es auch ausgeschlossen sein, dass es an Zugriffsberechtigungen hängt. Im RamDisk-Verzeichnis werden ja bereits Daten reingeschrieben. Daran kann es also auch nicht hängen.

Ich hoffe, Du hast noch eine Idee.

Das mit der Eingabe ./stop hat übrigens funktioniert. Einfach nicht hinschauen und eingeben. :-)

Was die PowerMeter angeht, sowas habe ich derzeit nicht. Aber Danke für die Auflösung. Habe etwas rumgesucht, aber nichts verständliches gefunden. Von daher benötige ich diese derzeit erst mal nicht. Vielleicht mal, falls ich einen Heizstab für den Warmwasserspeicher installiere, was aber auch nicht so einfach ist, da kein 1,5 Zoll Anschluss vorhanden ist.

Viele Grüße Bernd

nischram commented 3 years ago

Hi,

Du Fragst:

Könnte ich eigentlich auch in der parameter.h den Wert für historyAktiv statt auf 1 auf true setzen? Dann müsste in der GuiMain.c nichts geändert werden.

Ja das geht auch. Wird aber wohl nichts ändern wenn das mit der "1" nicht geklappt hat. Ich werde aber eine Korrektur in der GuiMain dafür veröffentlichen damit, andere nicht an die parameter.h müssen oder sich mit einer Kopie die Einstellungen speichern können.

Das mit der Eingabe ./stop hat übrigens funktioniert. Einfach nicht hinschauen und eingeben. :-)

Ja so ist es!

Du könntest die S10history mal alleine durchlaufen lassen so sehen wir ob es am gesamten Code liegt oder nur an dem einen Teil. Gestartet wird es mit diesem Befehl: S10history/S10history -T Du musst aber im E3dcGui Ordner sein. Das Ergebnis sieht dann so aus:

Bildschirmfoto 2020-12-03 um 22 17 38

(Bei mir fehlt jetzt das senden hatte ich schon wieder rausgenommen)

PS: kann mal einer die Sonne einschalten, denn 1,1kWh Produktion sind etwas wenig 😕

VG Nico

bs0001 commented 3 years ago

Hallo Nico,

Danke für den Tipp! Der war echt gut! Mit S10history/S10history -T wurde das History-Script ausgeführt und hat auch in alle Variablen geschrieben.

Nun stellt sich nur die Frage, warum es nicht automatisch zyklisch gestartet wird. Wenn Du einen Tipp hast, was ich ausprobieren könnte, sag mir bescheid. Vielleicht auch irgendwelche Ausgaben an Stellen machen, damit man sieht, ob er an den Stellen vorbei kommt.

So sieht das ganze bei mir aus: image

Dann hab ich noch eine Frage wegen den Werten in kWh. Mir werden nur Ganzzahlen zurückgegeben, obwohl die Wh-Werte ungerade sind. Ich habe auch zusätzlich mal noch den Berechnungswert als float konvertieren lassen. Sollte er ohnehin auch vorher schon gewesen sein. Beispiel: printsendHM(HM_Intervall, TAG_EMS_ISE_DB_GRID_POWER_IN, float(grid_power_in/1000)); Wie müsste ich den fettgedruckten Teil schreiben, damit nicht einfach nur eine Ganzzahl sondern eine Dezimalzahl übermittelt wird?

Heute wird die Montage meiner Anlage fertig. Nächste Woche muss sie dann nur noch am S10 verkabelt werden, dann kann es losgehen. :-)

Viele Grüße Bernd

nischram commented 3 years ago

Hallo Bernd,

sehr schön, das ist ja schon mal ein Erfolg. Da das jetzt läuft kann es nur an der GuiMain.c liegen. Eventuell funktioniert bei dir der Pfad nicht der in der GuiMain.c angegeben ist. Diesen könntest du auch noch testen. Gib mal im Hauptverzeichnis des Pi (also direkt nach dem einloggen) diesen Befehl ein: /home/pi/E3dcGui/S10history/S10history -T Wenn's nicht funktioniert dann gib mal den Befehl ein um den Pfad auszugeben: bwd Wenn du nicht /home/pi ausgegeben bekommst musst du den Pfad entsprechend anpassen.

Du könntest aber auch einfach den Pfad in der GuiMain.c anpassen und das mal testen, also ändern auf den Pfad der beim letzten Test funktioniert hat. So sollte der Teil aussehen:

    //HistoryValues vom S10 mit "S10history" abfragen.
        if (historyAktiv == 1){
            if(HistoryCounter == 0){
                system("S10history/S10history -T &");// > /dev/null 2>&1");
                HistoryCounter = historyDelay;
            }
            if(HistoryCounter == (historyDelay-15)){
//              system("/home/pi/E3dcGui/S10history/S10history -Y &");//  > /dev/null 2>&1");
            }
            HistoryCounter --;
        }

Und wenn das alles nicht hilft, kannst du tatsächlich etwas in die GuiMain.c einbauend mit Ausgaben kommen. Dafür reicht z.B. folgendes: printf("Testpunkt 1 \n"); Je nach dem wo du es einbaust kommt die Ausgabe jede Sekunde oder wenn du es in die if-Schleife packst kommt es nur wenn die Schleife durchläuft, so würde ich es so einbauen:

    //HistoryValues vom S10 mit "S10history" abfragen.
        if (historyAktiv == 1){
            if(HistoryCounter == 0){
                printf("Testpunkt 1 \n");
                system("S10history/S10history -T &");// > /dev/null 2>&1");
                HistoryCounter = historyDelay;
            }

So und wenn alles irgendwie nicht klappt, könntest du darauf verzichten es mit der E3dcGui auszuführen und du baust den Befehl (letzten Beitrag) in die Crontab ein und startest es von dort alle x Minuten.

Jetzt zu dem Thema kWh: Die "printsendHM" Funktion die ich angelegt habe, ist als Integer angelegt und so wird nur die Ganzzahl übertragen. Der Umbau auf float ist kein großen Problem, du musst zwei Dateien anpassen. Rscp/RWData.cpp und Rscp/RWData.h Ich habe die Änderungen hochgeladen so brauchst du die Dateien nur austauschen. Wenn du es selber ändern willst sieht es so aus, RWData.h vorher:

void printsendHM(int CounterHM, int id, int value);

Nachher:

void printsendHM(int CounterHM, int id, float value);

RWData.cpp vorher:

void printsendHM(int CounterHM, int id, int value)
{
  if(Homematic_E3DC == 1){
    if(CounterHM == HM_Intervall){
      char batch[128];
      memset(batch, 0x00, sizeof(batch));
      snprintf(batch, sizeof(batch), "curl -s \"http://%s/config/xmlapi/statechange.cgi?ise_id=%i&new_value=%i\" > /dev/null 2>&1",HM_IP , id, value);
      printf("send to Homematic ISE_ID %i new Value = %i\n",id, value);
      system(batch);
    }
  }
}

Nachher:

void printsendHM(int CounterHM, int id, float value)
{
  if(Homematic_E3DC == 1){
    if(CounterHM == HM_Intervall){
      char batch[128];
      memset(batch, 0x00, sizeof(batch));
      snprintf(batch, sizeof(batch), "curl -s \"http://%s/config/xmlapi/statechange.cgi?ise_id=%i&new_value=%.3f\" > /dev/null 2>&1",HM_IP , id, value);
      printf("send to Homematic ISE_ID %i new Value = %i\n",id, value);
      system(batch);
    }
  }
}

So sollte dein printsendHM(HM_Intervall, TAG_EMS_ISE_DB_GRID_POWER_IN, float(grid_power_in/1000)); funktionieren.

So Versuch es mal weiter... Gruß Nico

bs0001 commented 3 years ago

Hallo Nico,

ich habe mir nun wie folgt weitergeholfen:

Ganzzahlproblematik: Habe es nach wie vor noch nicht hinbekommen. Habe folgendes ausprobiert:: printsendHM(HM_Intervall, TAG_EMS_ISE_DB_BAT_POWER_IN, (float)bat_power_in/1000); printsendHM(HM_Intervall, TAG_EMS_ISE_DB_BAT_POWER_IN, bat_power_in/(float)1000); printsendHM(HM_Intervall, TAG_EMS_ISE_DB_BAT_POWER_IN, (float)bat_power_in/1000,0); Leider wird immer nur eine Ganzzahl übertragen.

Was die automatische Ausführung der history angeht, hoffe ich, hast Du noch eine Idee. Ich habe es aktuell so gelöst, dass ich den von Dir genannten Aufruf "S10history/S10history -T" alle 5 Minuten in der crontab ausführen lasse. Das hat funktioniert.

Meine Anlage ist nun soweit aufgebaut und nun muss nur noch hoffentlich kommende Woche, die DC-Kabel und Erdkabel an den S10 angeschlossen werden. Dann kann es losgehen. Hoffentlich mit ordentlich Sonne. App-Technisch habe ich auch schon einiges vorbereitet, incl. der automatischen Speicherung von Lifetime-Values je Monat. So kann ich mich auch automatisch per Mail oder telegram informieren lassen, wenn die Anlage bei Sonnenpeaks nicht die gewünschte Leistung bringt. Das könnte dann darauf hindeuten, dass irgendwas nicht in Ordnung ist.

Grüße Bernd

nischram commented 3 years ago

Hey, unsere Antworten haben sich überschnitten. Für dein Ganzzahlproblem habe ich was geschrieben und auch geändert.

Mit den Crontab hatten wir die gleiche Idee... Aber du kannst ja weiter suchen woran es liegt.

Na ja das mit der Sonne im Winter ist ja so eine Sache, das Wetter kann zwar zu diese Jahreszeit ganz schön sein aber die Erträge sind trotzdem nicht so riesig. Aber das Frühjahr kommt bestimmt 😉

VG Nico

bs0001 commented 3 years ago

Hallo Nico,

Danke! Ja, Erfolg ist echt schon :-)

Zuerst mal das Verzeichnisthema:

Hauptverzeichnis des Pi (also direkt nach dem einloggen) diesen Befehl ein: /home/pi/E3dcGui/S10history/S10history -T --> Funktioniert, History wird aufgerufen. Wenn's nicht funktioniert dann gib mal den Befehl ein um den Pfad auszugeben: bwd --> pwd ja, funktioniert und gibt mir "/home/pi" aus.

Soll ich die weiteren Steps ausprobieren in GuiMain.c mit dem print Testpunkt?

VG Bernd

nischram commented 3 years ago

Oh verdammt, jetzt gerade kommt mir die Idee wo das Problem liegt! Du verwendest glaube ich gar kein Display, sondern nur den Pi. So ist die Lösung ganz einfach... Ohne Display wird die GuiMain gar nicht angesprochen und dann kannst du ändern was du willst es wird nie aufgerufen! Ich nutze das Display so habe ich dieses einfache Problem nicht bedacht! ☹️

So bleibt dir nur die Variante mit der Crontab! Aber die Idee hattest du ja auch schon.

Dann hoffe ich das wenigstens das mit den kWh auf anhieb klappt!

Gruß

bs0001 commented 3 years ago

Ganzzahlthematik

Super für die Überarbeitung. Leider funktioniert es noch nicht. Habe mir Deine beiden Dateien von vor ca. 30 Minuten gezogen, auf den Raspi kopiert und die Berechtigungen geprüft. Anschl. meine Aufrufe angepasst in dieser Form: printsendHM(HM_Intervall, TAG_EMS_ISE_DB_GRID_POWER_IN, float(grid_power_in/1000));

Beim make kommen nun zahlreiche Fehler hoch (Auszug, alles krieg ich nicht drauf): image

Hoffentlich nur eine Kleinigkeit.

bs0001 commented 3 years ago

Ganzzahlthema

Hab nun nochmal die alten Dateien genommen und manuell wie oben beschrieben geändert. Daraufhin hat der make funktioniert :-)

Wieviel Nachkommastellen müssten kommen? Ich bekomme nun in meiner Variable 15,70 kWh angezeigt. Im E3DC-Portal sind es 15,77 kWh.

Das ist das Ergebnis aus dem S10History-Aufruf: image

Echt schon toll, dass es funktioniert :-) 👍

bs0001 commented 3 years ago

Ohh, war wohl Zufall! Jetzt sind 15,86 übertragen worden. Perfekt!

nischram commented 3 years ago

Hey,

was beim ersten kopieren nicht geklappt hat kann ich nicht sagen aber zum Beispiel das sieht danach aus als würde es mit dem kopieren zu tun haben und der Inhalt der Datei wurde verändert.

Bildschirmfoto 2020-12-04 um 23 34 50

Gut das du dein screen mitgeschickt hast so habe ich gesehen das ich noch bei der Ausgabe übersehen habe das es auch auf float geändert werden muss.

Bildschirmfoto 2020-12-04 um 23 37 44

ich muss die printf Ausgabe noch so anpassen:

void printsendHM(int CounterHM, int id, float value)
{
  if(Homematic_E3DC == 1){
    if(CounterHM == HM_Intervall){
      char batch[128];
      memset(batch, 0x00, sizeof(batch));
      snprintf(batch, sizeof(batch), "curl -s \"http://%s/config/xmlapi/statechange.cgi?ise_id=%i&new_value=%.3f\" > /dev/null 2>&1",HM_IP , id, value);
      printf("send to Homematic ISE_ID %i new Value = %.3f\n",id, value);
      system(batch);
    }
  }
}

ich lade die Datei neu hoch.

Die Differenzen zwischen Portal und System kommen von den unterschiedlichen Uploadzeiten. Ich übertrage drei Nachkommastellen mit %.3f aber ich glaube die HM kann nur 2 verwalten. Das sollte aber auch reichen 😉 VG Nico

bs0001 commented 3 years ago

Perfekt! Probiere ich morgen aus.

Viele Grüße Bernd

bs0001 commented 3 years ago

Hi Nico,

ich konnte es nachvollziehen. Wenn ich im Browser die beiden Dateien auf die NAS downloade und anschl. mit WinSCP auf den Raspi schiebe, dann passiert genau die o.g. Fehlermeldung. Habe mir nun Dein gesamtes Paket als ZIP-Datei auf die NAS geladen, die beiden besagten Dateien entpackt und auf den Raspi per winSCP gespielt und dann hat der make funktioniert.

Beim Kompilieren (make) ist mir noch folgendes aufgefallen: image Hat aber trotzdem funktioniert. Die Berechtigungen sind für das gesamte Verzeichnis und Dateien komplett identisch.

Echt cooles Projekt von Dir, dass das alles so funktioniert!!

Lässt sich der "/home/pi/E3dcGui/S10history/S10history -T" auch per bash-Script ausführen? Bin leider "noch" nicht so Linux-affin. Damit könnte ich dann aus meiner Applikation unabhängig vom Cron-Job zu jederzeit die Werte aktualisieren.

VG Bernd

nischram commented 3 years ago

Hey, Ok das mit dem Download ist eine interessante Info.

Die Meldung beim "make" ist keine richtige Fehlermeldung. Die Meldung zeigt nur das die Datei RscpMain nicht gefunden wurde. Vor jedem Schritt im make wird die entsprechende Datei gelöscht, wenn der Kompiliervorgang fehl schlägt, dann ist die Datei beim nächsten make nicht vorhanden.

Meine Applikation hat nicht mit einem Cronjob zu tun, sie wird nur mit einem Cronjob gestartet wenn der Pi bootet. Der Befehl den du oben nennst kannst du so wie er ist in einen Cronjob nutzen und z.B. alle 15 Minuten startet, dafür ist keine Bash-Script nötig. Eventuell musst du einmal gesondert um 23:59 starten, damit die letzten Werte des Tages übertragen werden oder du musst mit "-Y" die Werte vom Vortag holen.

Gruß Nico