Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)

Begonnen von ch.eick, 07 Oktober 2020, 16:09:12

Vorheriges Thema - Nächstes Thema

ch.eick

Guten Morgen und ein schönes Wochenende Euch allen.

Gerade, wenn man eine PV Anlage betreibt, fallen eine sehr große Menge an Daten an und zu beginn weiß man nicht immer, was man brauchen kann und möchte.
Wenn Ihr die Implementierung nach meinem Muster gemacht habt, habe ich bereits zu beginn das Logging ziemlich eingeschränkt und trotzdem ist die Datenbank gewachsen.


SELECT table_schema "DB Name",
    ->        Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB"
    ->   FROM  information_schema.tables
    ->   GROUP BY table_schema;
+--------------------+---------------+
| DB Name            | DB Size in MB |
+--------------------+---------------+
| fhem               |        4651.0 |
| information_schema |           0.0 |
+--------------------+---------------+

Bei diesem Datenvolumen habe ich bereits ziemlich aufgeräumt und werde es auch noch weiter tun.

In den Threads  vom DbRep/DbLog findet man dann auch noch etwas zur Spalte EVENT, die wohl historischer Art ist. Wenn man sich sicher ist, dass die Spalte von keinem Device in Fhem genutzt wird, kann diese gelehrt werden und im DbLog deaktiviert werden. Diesen Schritt habe ich nun auch durchgeführt und möchte ihn hier kurz beschreiben.
Wir beginnen mit rund 4.6 GB Datenbank Größe.

Vorgehensweise:

## Immer zuerst einen backup durchführen!

## Im Datenbank Device das füllen der EVENT Spalte deaktivieren
attr LogDB colEvent 0

## Danach ein paar events abwarten und nachschauen, dass die Spalte leer bleibt.
select * from history where DEVICE='PV_Anlage_1_API' and READING='Statistic_EnergyHomePvSum_Day' and TIMESTAMP >= '2020-11-20 18:00:00';
+---------------------+-----------------+---------+-------+-------------------------------+---------+------+
| TIMESTAMP           | DEVICE          | TYPE    | EVENT | READING                       | VALUE   | UNIT |
+---------------------+-----------------+---------+-------+-------------------------------+---------+------+
| 2020-11-20 18:57:04 | PV_Anlage_1_API | HTTPMOD |       | Statistic_EnergyHomePvSum_Day | 4320.29 |      |
+---------------------+-----------------+---------+-------+-------------------------------+---------+------+

## Nun wird die Spalte aus der Tabelle entfernt, oder man könnte auch jeden Eintrag mit NULL überschreiben
## Je nach Leistung des Datenbank Servers kann dies einige Zeit laufen und auch, wie bei mir zum Timeout führen. Dann einfach etwas Geduld haben und nicht panisch werden.
ALTER TABLE history DROP COLUMN EVENT;
ERROR 2006 (HY000): MySQL server has gone away
## geraume Zeit später... :-)

## Nun wird die Spalte wieder erzeugt, damit das Daten Model stimmig ist, obwohl wir ja das Befüllen von EVENT abgeschaltet haben.
ALTER TABLE history ADD COLUMN EVENT VARCHAR(512) NULL DEFAULT NULL AFTER Type;
## Auch das wird einige Zeit laufen...

## Nun kann man nachschauen, wieviel die Tabelle kleiner geworden ist
SELECT table_schema "DB Name",        Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB"   FROM  information_schema.tables   GROUP BY table_schema;
+--------------------+---------------+
| DB Name            | DB Size in MB |
+--------------------+---------------+
| fhem               |        2707.0 |
| information_schema |           0.0 |
+--------------------+---------------+

## 4651 GB - 2707 GB = 1944 GB => ~ 42 %
## Die prozentuale Größe hängt hierbei sehr stark von der Länge der reading Namen ab. Da meine Namen aufgrund der Lesbarkeit etwas länger sind ist die Ersparnis sehr groß.
## Auch ein dumpMySQL wird nun wesentlich kleiner sein und eventuell auch schneller laufen.

## Nun sollte noch ein Backup mit "optimizeTablesBeforeDump 1" erfolgen, damit die Datenbank Files optimiert werden.


Und enden mit rund 2.7 GB !!! Der Tag ist gerettet :-) , auch wenn das nur eine einmalige Aktion ist, wird diese in Zukunft das Datenbank Volumen nicht mehr so schnell wachsen lassen.

VG
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Mumpitz

Zitat von: ch.eick am 21 November 2020, 08:26:10

Hast Du auch das hier in 99_myUtils aufgenommen?

use Encode qw(decode encode);
use PBKDF2::Tiny qw/derive verify/;                   <<< Das fehlt Dir definitiv
use Digest::SHA qw(sha256 hmac_sha256);
use Crypt::URandom qw( urandom );
use Crypt::AuthEnc::GCM;



Das verstehe ich ebenfalls nicht ganz. Wo muss man das in der 99_myUtils eintragen? Im Wiki sind die beiden Routinen ja beschrieben welche in die 99_myUtils müssen. Dort finde ich den obigen Teil jedoch nicht. Kanns tu das etwas präzisieren?

ch.eick

Zitat von: Mumpitz am 21 November 2020, 14:02:50
Das verstehe ich ebenfalls nicht ganz. Wo muss man das in der 99_myUtils eintragen? Im Wiki sind die beiden Routinen ja beschrieben welche in die 99_myUtils müssen. Dort finde ich den obigen Teil jedoch nicht. Kannst Du das etwas präzisieren?
Das kann entweder an den Anfang der 99_myUtils, oder vor die erste Funktion, die es benutzt, was ich gemacht habe.

Mit diesen Einträgen lädt man zusätzliche Funktionen aus Perl Bibliotheken in ein Modul.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

plin

Zitat von: ch.eick am 21 November 2020, 14:05:58
Mit diesen Einträgen lädt man zusätzliche Funktionen aus Perl Bibliotheken in ein Modul.

Beispiel:
my $r = derive( 'SHA-256', $PASSWD, $bitSalt, $rounds );

derive ist keine Standard-perl-Funktion sondern wird erst durch laden der Bibliothek
use PBKDF2::Tiny qw/derive verify/;                   <<< Das fehlt Dir definitiv
verfügbar.
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

billy-boy

Zitat
Hast Du auch das hier in 99_myUtils aufgenommen?
Code: [Auswählen]
use Encode qw(decode encode);
use PBKDF2::Tiny qw/derive verify/;                   <<< Das fehlt Dir definitiv
use Digest::SHA qw(sha256 hmac_sha256);
use Crypt::URandom qw( urandom );
use Crypt::AuthEnc::GCM;

Autsch war wohl gestern schon zu spät. Steht ganz groß im Wiki.
Na ja die Tests klappen jetzt alle.
Allerdings bekomme ich keine Werte angezeigt.
Im Log steht folgendes


2020.11.21 22:33:26 5: PV_Anlage_1_API: get called with 01_auth_start
2020.11.21 22:33:26 5: PV_Anlage_1_API: get found option 01_auth_start in attribute get01Name
2020.11.21 22:33:26 4: PV_Anlage_1_API: get will now request 01_auth_start, no optional value
2020.11.21 22:33:26 5: PV_Anlage_1_API: AddToQueue adds type get01 to URL http://%IP-Address_Plenticore%/api/v1/auth/start, data %START%, header Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive, retry 0, initial queue len: 0
2020.11.21 22:33:26 5: PV_Anlage_1_API: HandleSendQueue called from HTTPMOD::AddToSendQueue, qlen = 1
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%START%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%FINISH%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("finish","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"))} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%SESSION%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("session","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"),ReadingsVal("$NAME","auth_token","missed"))} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_signature%), mode reading, value auth_signature input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%begin_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%end_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} input: %START%
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%START%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")} input: %START%
2020.11.21 22:33:26 3: ====Start plenticore_auth==============================
2020.11.21 22:33:26 3: auth_step         : start
2020.11.21 22:33:26 3: auth_user         : user
2020.11.21 22:33:26 3: auth_device       : PV_Anlage_1_API
2020.11.21 22:33:26 3: ====End arguments======================================
2020.11.21 22:33:26 3: auth_nonce        : R3lmNTA3QVJ4RmZ0
2020.11.21 22:33:26 3: auth_return       : {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 3: ====End output=========================================
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: match for type get01, regex (?^:%START%), mode expression, value package main; {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")}, input: %START%, result is {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%FINISH%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("finish","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"))} input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%SESSION%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("session","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"),ReadingsVal("$NAME","auth_token","missed"))} input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_signature%), mode reading, value auth_signature input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%begin_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%end_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"}
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement01Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")} input: http://%IP-Address_Plenticore%/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: match for type get01, regex (?^:%IP-Address_Plenticore%), mode expression, value package main; {ReadingsVal("PV_Anlage_1_config","IP-Address_Plenticore","")}, input: http://%IP-Address_Plenticore%/api/v1/auth/start, result is http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement02Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%START%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("start","user","$NAME")} input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement04Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%FINISH%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("finish","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"))} input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement05Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%SESSION%), mode expression, value {my $NAME="PV_Anlage_1_API"; plenticore_auth("session","user","$NAME",ReadingsVal("$NAME","auth_randomString64","missed"),ReadingsVal("$NAME","auth_nonce","missed"),ReadingsVal("$NAME","auth_salt","missed"),ReadingsVal("$NAME","auth_rounds","missed"),ReadingsVal("$NAME","auth_transactionId","missed"),ReadingsVal("$NAME","auth_token","missed"))} input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement06Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_signature%), mode reading, value auth_signature input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement07Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement08Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%begin_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as get01Replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as getReplacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace: check value as replacement09Value
2020.11.21 22:33:26 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%end_date%), mode expression, value {POSIX::strftime("%Y-%m-%d",localtime(time))} input: http://192.168.169.250/api/v1/auth/start
2020.11.21 22:33:26 4: PV_Anlage_1_API: HandleSendQueue sends get01 with timeout 7 to http://192.168.169.250/api/v1/auth/start,
data: {"nonce": "R3lmNTA3QVJ4RmZ0","username": "user"},
header: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.21 22:33:26 5: PV_Anlage_1_API: ReadCallback called from __ANON__
2020.11.21 22:33:26 4: PV_Anlage_1_API: Read callback: request type was get01 retry 0,
header: HTTP/1.1 200 OK
Server: nginx/1.15.2
Date: Sat, 21 Nov 2020 21:33:26 GMT
Content-Type: application/json
Content-Length: 169
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: max-age=0, no-cache, no-store, must-revalidate, body length 169
2020.11.21 22:33:26 5: PV_Anlage_1_API: Read callback: body
{"rounds":29000,"transactionId":"e9eae38f13a16cbae3db3342db5124d4cd65902317ed5b055e843df328b8f7f5","salt":"FU3StUbSOhvJMesZ","nonce":"R3lmNTA3QVJ4RmZ06ZIGHOZ3ykUSR0Hv"}

2020.11.21 22:33:26 4: PV_Anlage_1_API: BodyDecode found no charset header (bodyDecode was set to auto)
2020.11.21 22:33:26 4: PV_Anlage_1_API: extracted JSON values to internal
2020.11.21 22:33:26 5: PV_Anlage_1_API: GetCookies is looking for Cookies
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractSid called, context get, num 01
2020.11.21 22:33:26 4: PV_Anlage_1_API: checking for redirects, code=200, ignore=0
2020.11.21 22:33:26 4: PV_Anlage_1_API: no redirects to handle
2020.11.21 22:33:26 5: PV_Anlage_1_API: Read callback sets LAST_REQUEST to get01
2020.11.21 22:33:26 5: PV_Anlage_1_API: CheckAuth is checking buffer with ReAuthRegex (?^:"authenticated":false|"processdata":\[\]|wrong credentials|Not authorized)
2020.11.21 22:33:26 5: PV_Anlage_1_API: CheckAuth decided no authentication required
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading for context get, num 01 - no individual parse definition
2020.11.21 22:33:26 5: PV_Anlage_1_API: Read starts parsing response to get01 with defined readings: 0101,0102,0103,0104,0201,0202,03,0301,0302
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_nonce with json nonce ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading for reading0101-1 sets auth_nonce to R3lmNTA3QVJ4RmZ06ZIGHOZ3ykUSR0Hv
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading value as hex is 52336c6d4e54413351564a34526d5a30365a4947484f5a33796b555352304876
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_rounds with json rounds ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading for reading0102-1 sets auth_rounds to 29000
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading value as hex is 3239303030
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_salt with json salt ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading for reading0103-1 sets auth_salt to FU3StUbSOhvJMesZ
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading value as hex is 46553353745562534f68764a4d65735a
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_transactionId with json transactionId ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading for reading0104-1 sets auth_transactionId to e9eae38f13a16cbae3db3342db5124d4cd65902317ed5b055e843df328b8f7f5
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading value as hex is 65396561653338663133613136636261653364623333343264623531323464346364363539303233313765643562303535653834336466333238623866376635
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_signature with json signature ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_signature with json signature did not match a key directly - trying regex match to create a list
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_signature with json /^signature/ got keylist
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_signature did not match
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_token with json token ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_token with json token did not match a key directly - trying regex match to create a list
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_token with json /^token/ got keylist
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_token did not match
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_sessionId with json sessionId ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_sessionId with json sessionId did not match a key directly - trying regex match to create a list
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_sessionId with json /^sessionId/ got keylist
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading auth_sessionId did not match
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_message with json message ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_message with json message did not match a key directly - trying regex match to create a list
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_message with json /^message/ got keylist
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_message did not match
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_error with json error ...
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_error with json error did not match a key directly - trying regex match to create a list
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_error with json /^error/ got keylist
2020.11.21 22:33:26 5: PV_Anlage_1_API: ExtractReading info_error did not match
2020.11.21 22:33:26 4: PV_Anlage_1_API: Read response matched 4, unmatch 5 Reading(s)
2020.11.21 22:33:26 5: PV_Anlage_1_API: Read response to get01 matched auth_nonce auth_rounds auth_salt auth_transactionId
2020.11.21 22:33:26 5: PV_Anlage_1_API: Read response to get01 did not match auth_signature auth_token auth_sessionId info_message info_error
2020.11.21 22:33:26 5: PV_Anlage_1_API: HandleSendQueue called from HTTPMOD::ReadCallback, qlen = 0
2020.11.21 22:33:26 5: PV_Anlage_1_API: HandleSendQueue found no usable entry in queue


Zitat

Zitat
Desweiteren habe ich mal eine Frage zur Einrichtung der PV_Anlage_1_API.
Warum steht im stateFormat nur "PV_Anlage_1" anstatt $name (also PV_Anlage_1_API)?

Da ich diese Abfrage nicht disabled hatte wurden mir die Werte angezeigt.
Damit werden aus dem PV_Anlage_1 Device die aktuellen Werte ergänzt., um sie den Statistischen Werten gegenüber zu stellen.


Was nützen diese Werte wenn das Device PV_Anlage_1 später deinstaliert werden. Es handelt sich ja um die mit Python abgefragten Werte.

Fragen über Fragen.
Ich hoffe ich nerve nicht.

Rainer

ch.eick

Alles wird gut :-)
Zitat
Was nützen diese Werte wenn das Device PV_Anlage_1 später deinstaliert werden. Es handelt sich ja um die mit Python abgefragten Werte.
Das ist auch nicht richtig. Das PV_Anlage_1 fragt den Wr über ModBus/TCP ab und bekommt die Momentanwerte, sowie auch einige wenige Statistiken und Batterie Informationen.
Das PV_Anlage_1_API holt die Statistiken und alle Settings über die API Schnittstelle ab. Weiterhin werden dort auf Einstellungen verändert.
Für den betrieb bleiben beide Devices aktiv.

Das Python wurde vorher für die Anmeldung des PV_Anlage_1_API verwendet und ist jetzt vollständig zu Perl migriert worden.
In einigen Wochen nehme ich das aus dem Wiki, sobald frühere Einsteigen umgestiegen sind.


Dein Log sieht schon mal toll aus :-) , jedoch bedeutet 01_auth_start nicht, das Du das ganze ankurbelst wie ein altes Auto und dann geht der Rest alleine.

Ruf einfach mal 20_Statistic_EnergyFlow auf, den dann sollte die Anmeldung komplett durchlaufen und auch Werte liefern. Ich denk als Einsteiger ist man von der Menge an Information im Wiki einfach etwas überfordert.
Ablaufbeschreibung_PV_Anlage_1_API

VG
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ujaudio

Hallo Christian,

du bist ja überaus fleißig und sehr gründlich mit deinen Beiträgen inkl. Wiki. Da werde ich einiges für mich herausholen können, auch wenn ich eine andere Anlage habe (SMA Tripower 6000 und Varta Engion Family). DIe beiden Geräte habe ich schon in FHEM eingebunden, somit kann ich loslegen, den Eigenverbrauch zu optimieren. Meine Sicht der Dinge: Die erste Herausforderung ist, dass der Energiespeicher nur eine sehr begrenzte Menge Energie speichern kann und auch nur begrenzt Leistung abgeben kann. Die zweite Herausforderung ist, dass die Zukunftswerte der PV-Anlage unbekannt und kaum abschätzbar sind. Die dritte Herausforderung ist, dass ich nicht alle Energieverbraucher komplett in FHEM abbilden kann. Das Ganze ist also bestenfalls ein "qualifizierter Blick" in die Glaskugel.

Trotzdem werde ich mich damit beschäftigen, ich sehe das Ganze mehr als Hobby. Dennoch hier mal die Frage: wie stark konntest du die Eigenverbrauchsquote mit deiner Applikation denn erhöhen?

Einen lieben Gruß
Jürgen
Einen lieben Gruß
Jürgen

ch.eick

Zitat von: ujaudio am 01 Dezember 2020, 10:39:40
Trotzdem werde ich mich damit beschäftigen, ich sehe das Ganze mehr als Hobby. Dennoch hier mal die Frage: wie stark konntest du die Eigenverbrauchsquote mit deiner Applikation denn erhöhen?
Hallo Jürgen,
herzlich willkommen im Club :-)
Leider kann ich Dir nicht sagen wie die Quote gewesen wäre, ohne etwas zu tun, da ich schon 3/4 Jahr vor Lieferung des WR das Grundgerüst angelegt habe.
Die Jahres Werte sind wie folgt

74 % Autarkiequote   <<< bevor der Winter kam hatte ich da auch schon mal 80 %, was mein persönliches Ziel aus dem Bauch raus gewesen ist :-)
47 % Eigenverbrauchsquote   <<< das liegt am Sommer, weil man da nicht alles verbrauchen kann was vom Dach kommt.


Ich könnte Dir auch gerne bei der Integration behilflich sein.
Am einfachsten wäre es jedoch, wenn Du vorher Deine Devices auf die hier verwendeten Namen änderst, da Du ansonsten sehr viel anpassen musst. Es wird auch schwierig die passenden readings
bei SMA zu finden, da der Plenticore sehr viele Statistiken und vorberechnete Werte liefert.
Weiterhin wäre zu beachten, das der Speicher beim Plenticore als String im DC Bereich angeschlossen und die Varta Engion Family auf der AC Seite betrieben wird.
Die Prinzipien kannst Du aber alle adaptieren, jedoch solltest Du mir dann eine PN schicken, damit dieser Thread hier nicht zu sehr abweicht.

Gruß
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

kanenas

Servus Zusammen,

Ich war auf der Suche nach dem vorletzten update des Plenticore und bin auf das Photovoltaik-forum (https://www.photovoltaikforum.com/thread/141431-gemessene-kapazit%C3%A4t-der-byd-b-box-hv/?pageNo=1) gelandet.
Es geht um die Kapazität von BYD Batterien und die reale/gemessene Effektivität.

Dank Christian bin ich hier gelandet und freue mich über die Zusammenarbeit.

LG
Dio
Jessie@Raspi(v3)+SSD, CUL-MAX, CUL-433, CUL-FS20, JeeLink-PCA301, JeeLink-JLLaCrosse, HM-MOD-UART, HUEBridge(v2), ESPEasy, Tasmota, Plenticore 7 mit BYD 11,5

ch.eick

Zitat von: kanenas am 04 Dezember 2020, 06:37:10
Es geht um die Kapazität von BYD Batterien und die reale/gemessene Effektivität.
Und es gibt noch eine Variante, von kanenas, den BYD HV (nicht HVS) direkt abzufrage, was ich dann ins Wiki mit einbauen werde.

defmod BYD HTTPMOD http://installer:password@192.168.xxx.xxx/asp/StatisticInformation.asp 900

attr BYD userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex
attr BYD enableControlSet 1
attr BYD event-on-change-reading Difference_Charge_Energy:0.1,Total_Charge_Energy:0.1,Total_Discharge_Energy:0.1,Efficiency:0.05
attr BYD icon measure_battery_100
attr BYD reading01Name Total_Charge_Energy
attr BYD reading01Regex (?s)Total Charge Energy.*?">([\d.]+[\d]+)
attr BYD reading02Name Total_Discharge_Energy
attr BYD reading02Regex (?s)Total Discharge Energy.*?([\d.]+[\d]+)
attr BYD reading03Name Total_Cycle_Counts
attr BYD reading03Regex (?s)Total Cycle Counts.*?([\d.]+[\d]+)
attr BYD stateFormat {sprintf("Charge: %.0f kWh - Efficiency: %.1f %%", ReadingsVal($name,"Total_Charge_Energy","0"), ReadingsVal($name,"Efficiency","2"))}
attr BYD userReadings Difference_Charge_Energy {ReadingsVal($name,"Total_Charge_Energy",0) - ReadingsVal($name,"Total_Discharge_Energy",0);;;;},\
Efficiency {((ReadingsVal($name,"Total_Discharge_Energy",0)+((ReadingsVal("Kostal","Battery_charge_state",0)/100)*11)) / ReadingsVal($name,"Total_Charge_Energy",0))*100;;;;}

Der Unterschied zum BYD_Status Device ist die Anmeldung mit den login Daten in der URL, was mal mit replacement key noch etwas verschleiern könnte und die userreadings.
Das passt jedoch noch nicht in die hier bisher verteilte gesamt Konfiguration.

Gruß
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Hey Team :-)
ich habe da mal wieder etwas eingebaut.

Diese Änderung erstellt ein neues get und fragt den Batterie Status ab, das OMap zeigt es dann im Klartext an.

attr PV_Anlage_1_API get25Header01 authorization: Session %auth_sessionId%
attr PV_Anlage_1_API get25Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
attr PV_Anlage_1_API get25Name 25_Battery_EM_State
attr PV_Anlage_1_API get25URL http://%IP-Address_Plenticore%/api/v1/processdata/devices:local/EM_State


attr PV_Anlage_1_API reading25Name Battery_EM_State
attr PV_Anlage_1_API reading25OMap 0:Normal,8:Ruhe1,16:Ruhe2,32:Ausgleichsladung,64:Tiefentladeschutz
attr PV_Anlage_1_API reading25Regex EM_State.*value":(\d+)


Wer das dann auch ins DbLog haben möchte, muss es regelmäßig im PV_Schedule mit einbauen. Im event-on-change-reading ist es bereits in der Maske "Battery_.*" mit drin.
Ein mal pro Stunde wäre sicherlich schon häufig.

VG
  Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Eine schöne neue Woche Euch allen.

Wir haben wieder zwei neue interessierte in der Runde und da ist mir noch was aufgefallen.

Im PV_Anlage_1_config könnt Ihr noch folgendes reading setzen:

setreading PV_Anlage_1_config forecast_factor 1

Das ist ein generischer Faktor, der in die Prognose mit eingeht und direkt eine Dämpfung oder Erhöhung der Prognosewerte bewirkt. Der Default ist 1.
Sollte also Eure Prognose immer zu hoch/niedrig sein ist das die richtige Stelle.
Möchtet Ihr z.B. je nach Jahreszeit oder Monat  den Faktor anders setzen, dann macht man das in meinem Konstrukt im PV_Schedule Device mit einem DOELSEIF.

Aus unserer Erfahrung passt die Prognose im Sommer ja ziemlich gut, jedoch fehlen im Herbst/Winter die Einflüsse von Niesel, Nebel und Schnee oder in den Bergen, wo im Winter die Sonne nicht rein kommt.

VG
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Hallo zusammen, sorry Bernd.

Ich habe noch kleinere Aktualisierungen in folgenden devices gemacht:

PV_Anlage_1_API
BYD_Status
PV_Anlage_1_config <<< setstate forecast_factor , also nur bei der ersten Übernahme der Defaults
PV_Scheduling

Die Änderungen beziehen sich auf die hier im Thread bereits angekündigten Dinge.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Nabäääänd,

der Fehlerteufel hat sich eingeschlichen. Beim Regen Forecast kommt die Regenwarscheinlichkeit R600 nur alle sechs Stunden, für den Zeitraum der Stunden davor.

Ich habe das mit folgenden Zeilen in der Funktion Solar_forecast() nun berücksichtigt. Sehen konnte man es an Regentagen, da alle sechs Stunden eine Delle in der Kurve :-)

          $Solar_Rain = 0;
          for (my $r600 = $i+5; $r600 >= $i; $r600--) {
            $Solar_Rain        += ReadingsVal($wetter,"fc".$fc."_".($r600+$timeshift)."_R600" ,0);
          };

Die Position des Codes seht Ihr dann wie immer im Wiki, oder Ihr tauscht die ganze Funktion einfach aus.
Danach ein "reload 99_myUtils" und den fc0 und fc1 im PV_Schedule einmal aufrufen.

Gruß
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Mumpitz

Guten Morgen zusammen

Ich wollte mal bei euch nachfragen wie sich die Batterie im Moment verhält. Ich habe die Implementierung genau so vorgenommen. Unteranderem wird dabei ja die Batterie zuerst auf 90% geladen bevor sie wieder entladen wird. Im Moment steht sie seit Tagen auf ca. 54%. Die Batterie befindet sich dabei im Normal Modus. Ist das bei euch auch so oder ist sie bei euch im Ruhemodus?
Gruss aus der Schweiz