Autor Thema: Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)  (Gelesen 32005 mal)

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
ZB. ist es so, dass der Plenticore auch über die AC Seite lädt (das was halt der IQ erzeugt). Hier erhalte ich dann falsche Ertragswerte. Denn der Plenticore zählt keine "Yield"-Werte, wenn die Batterie geladen wird, der IQ zählt aber immer "Yield", da es für ihn immer eine Einspeisung ist. Somit zählt der Plenticore dann beim Batterieentladen "Yield", die der IQ aber bereits gezählt hat. Also ist bei mir die "Yield"-Summe zu hoch. Ich habe somit keine korrekten Ertragswerte. Im Portal werden die Etragswerte gezählt, die wirklich vom Dach kommen. Also auch was in die Batterie geht. Da passt das, es muss also dann doch irgendwie errechenbar sein. Ob Ertrag jetzt gezählt wird, beim Laden oder Entladen der Batterie sei mal dahingestellt.

Wir haben letztens noch am Yield_NoBat als userreading gearbeitet ;-)
Statistic_Yield_Day 10582.2136888631
Statistic_Yield_Month 364870.665684594
Statistic_Yield_Total 9987915.14037154
Statistic_Yield_Year 9539125.0240609

Statistic_Yield_NoBat_Day 8194.41
Statistic_Yield_NoBat_Month 240118.95
Statistic_Yield_NoBat_Year 8210359.43

Ich denke Du solltest Dir mal ein Bild malen, was wo gezählt und gerechnet wird. Das hat mir auch geholfen, als ich die Zahlen versucht habe deckungsgleich zu bekommen.

Welche Leistung hast Du denn pro Anlage?
Hast Du EEG Umlage?

Gruß
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline killah78

  • Full Member
  • ***
  • Beiträge: 250
Also irgendwie klappt das nicht mit dem Api abfragen. Ist es denn tatsächlich der masterkey vom Etikett des Gehäuses? Das ist das einzige was ich da finde. Oder ist es das vergeben Passwort für das webinterface?
Ich bekomme jetzt immer "user locked" .

Ich denke, das ja keine andere Daten als wir aus dem Modbus bzw Api bekommen, auch ans Portal gehen. Im Portal können die Werte auf mit zwei Wechelrichtern korrekt aufsummiert werden. Daher denke ich, sollte das im FHEM auch klappen. Nur mit Modbus bekomme ich es aber nicht hin.
Aber ja, wie du sagst, erstmal Schritt für Schritt.

Sind übrigens 9,9kwp auf 3 Dachflächen bzw 4 Strings aufgeteilt.

Edit: Ok, User war tatsächlich gesperrt und musste über das Webinterface "freigeschaltet" werden. Passwort ist in dem Kontext also das Passwort "Anlagenbetreiber" aus dem Webinterface. Damit klappt jetzt auch der Datenabruf. Jetzt muss ich mir erstmal den Kopf zerbrechen zu den ganzen Zahlen die ich bekomme.

Aber es klappt erstmal. Schonmal vielen Dank. Werde bestimmt weitere Fragen haben.... :-)
« Letzte Änderung: 28 Oktober 2020, 21:24:38 von killah78 »

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
Also irgendwie klappt das nicht mit dem Api abfragen. Ist es denn tatsächlich der masterkey vom Etikett des Gehäuses? Das ist das einzige was ich da finde. Oder ist es das vergeben Passwort für das webinterface?
Ich bekomme jetzt immer "user locked" .

Edit: Ok, User war tatsächlich gesperrt und musste über das Webinterface "freigeschaltet" werden. Passwort ist in dem Kontext also das Passwort "Anlagenbetreiber" aus dem Webinterface. Damit klappt jetzt auch der Datenabruf. Jetzt muss ich mir erstmal den Kopf zerbrechen zu den ganzen Zahlen die ich bekomme.
Okay, dann wurde das Passwort also neu gesetzt. Ich habe es bei mir auf dem Standard gelassen.
Die API verwendet den selben Benutzer, wie das Web Interface :-)

Zitat
Ich denke, das ja keine andere Daten als wir aus dem Modbus bzw Api bekommen, auch ans Portal gehen. Im Portal können die Werte auf mit zwei Wechelrichtern korrekt aufsummiert werden. Daher denke ich, sollte das im FHEM auch klappen. Nur mit Modbus bekomme ich es aber nicht hin.
Aber ja, wie du sagst, erstmal Schritt für Schritt.
Das Portal rechnet auch mit den Statistik Werten, man muss nur halt erstmal die kompletten Daten haben und dann mal drauf schauen, was das Portal daraus macht.

Zitat
Sind übrigens 9,9kwp auf 3 Dachflächen bzw 4 Strings aufgeteilt.
Okay, wenn die so weit auseinander sind. Ich habe drei Seiten an zwei Strings, wobei eine Seite mit Leistungsoptimierern aufgeteilt ist.

Zitat
Aber es klappt erstmal. Schon mal vielen Dank. Werde bestimmt weitere Fragen haben.... :-)
Frag ruhig, wenn was unklar ist. Ich habe ja auch userreadings wegen der Batterie hinzugefügt ;-) Das ist manchmal etwas verwirrend, aber ich denke das es so stimmen müsste.
Bisher hat niemand etwas gegenteiliges geschrieben.

Gruß
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
Hallo zusammen,
ich räume da so gerade meine Datenbank auf und habe folgendes festgestellt.

Bei Einträgen wie Statistic_*_[day|Month|Year] kommt es vor, dass morgens vor 01:00:00 der letzte Wert des Vortages eingetragen wird.
Dies ist bereits ein bekanntes Problem, weil der Kostal Plenticore manchmal wohl erst um 01:00 Uhr die Statistiken beendet. Kostal hat dazu noch nichts geantwortet.

Aufgefallen ist das, als ich ein DbRep erstellt habe, um den maxValue zu ermitteln.
Startet man dann die Aggregierung mit Display, werden readings angezeigt, die die besagten 00:* Uhrzeiten haben.
defmod LogDBRep_Test DbRep LogDB
attr LogDBRep_Test DbLogExclude .*
attr LogDBRep_Test aggregation day
attr LogDBRep_Test allowDeletion 0
attr LogDBRep_Test comment Version 2020.10.23 15:00\
Test für die Logdb
attr LogDBRep_Test device PV_Anlage_1_API
attr LogDBRep_Test reading Statistic_TotalConsumption_Day
attr LogDBRep_Test room Strom->Energie,System
attr LogDBRep_Test timestamp_begin current_year_begin
attr LogDBRep_Test timestamp_end previous_month_end


Ich habe dann mal SQL geschrieben, um das in kompakter Weise zu sehen
## hiermit seht Ihr den letzten Eintrag vom Vortag und den ersten des Folgetages. Eventuell müsst Ihr die Uhrzeit etwas anpassen, das kommt auf Eure 00:* Uhrzeiten an.
SELECT TIMESTAMP,DEVICE,READING,VALUE FROM history
   WHERE DEVICE='PV_Anlage_1_API' AND READING='Statistic_TotalConsumption_Day' AND
                 TIMESTAMP > '2020-01-01 00:00:00' AND
                (TIMESTAMP LIKE '% 23:%' OR TIMESTAMP LIKE '% 00:0%' OR TIMESTAMP LIKE '% 00:5%')
  ORDER BY TIMESTAMP  LIMIT 500;

## So bekommt Ihr eine Liste, um daraus ein UPDATE zu erstellen und die Einträge zum Vortag zu verschieben
SELECT TIMESTAMP,DEVICE,READING,VALUE FROM history
   WHERE DEVICE='PV_Anlage_1_API' AND READING='Statistic_TotalConsumption_Day' AND
                 (TIMESTAMP LIKE '2020-%-% 00:0%' OR TIMESTAMP LIKE '2020-%-% 00:5%')
   ORDER BY TIMESTAMP;

Bei mir waren es ca. 130 Einträge, bei denen ich dann aus der erzeugten Liste, mit Notepad++ (okay, dafür verwende ich auch Win :-) ), in updates umgeschrieben habe.
Kennt Ihr schon im Notepad++ die Tastenkombination Shift+Alt+Kursernavigation zum Markieren von Spalten? Das vereinfacht diese Bearbeitung ungemein ;-)

Denkt bitte daran, Ihr könnt ganze Spalten markieren und an anderer Stelle wieder einfügen!!!
## aus dieser Zeile
| 2020-07-31 00:05:00 | PV_Anlage_1_API | Statistic_TotalConsumption_Day | 13320 |

## wird dann
UPDATE history SET TIMESTAMP='2020-07-30 23:59:00' WHERE DEVICE='PV_Anlage_1_API' and READING='Statistic_TotalConsumption_Day' AND TIMESTAMP = '2020-07-31 00:05:00';
Und schon passen die Einträge wieder.

Das Ganze dann bitte für alle readings, die zu beginn des Tages neu anfangen hoch zu zählen.

Viele Grüße und bleibt fasziniert :-)
     Christian
« Letzte Änderung: 30 Oktober 2020, 18:26:43 von ch.eick »
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
Hallo zusammen,

im Wiki ist nun auch ein Testablauf für die Inbetriebnahme des PV_Anlage_1_API Device.
Danke für Eure Rückmeldungen, die hoffentlich alle dort zu finden sind.
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
Moin zusammen,
hat außer mir schon jemand mit Grafana angefangen?

Das erste Diagramm habe ich nun im Test auf Grafana umgesetzt.

Besonders schön ist die Stapel Funktion, bei der im Beispiel folgende Werte angegeben wurden:

- Home_own_consumption_from_PV
- Home_own_consumption_from_Bat
- Home_own_consumption_from_Grid

Verwendet man dann noch die Möglichkeit einen Bereich mit der Maus zu markieren, kann man sehr schön (Im Anhang) sehen, wie sich die Verbrauchte Leistung zusammensetzt.
« Letzte Änderung: 03 November 2020, 12:04:30 von ch.eick »
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
Für Wünsche und Ideen wäre jetzt der richtige Zeitpunkt.
Die Namen sind noch schall und Rauch, das ist nur zur Orientierung so Kryptisch :-)
Man kann natürlich auch rein zoomen oder einzelne Kurven ausblenden oder durch einen Klick nur die Kurve von Interesse anzeigen lassen.
siehe Anhang
« Letzte Änderung: 04 November 2020, 14:51:52 von ch.eick »
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
Hallo zusammen,
es scheint jetzt ja bei allen Verfolgern soweit zu laufen. Danke nochmals für die extra Motivation, es hat auch mich viel weiter gebracht :-)

Hier nochmal zum Wochenende eine Motivation für Euch. Ich habe seit wenigen Tagen die LWP auf Tagesanhebung und Nachtabsenkung eingestellt.
Jetzt wird zwischen 10:00 und 16:00 Uhr um 2° mehr geheizt und in der Zeit dazwischen 5° weniger, als die Heizkurve mit Außentemperatur es vorgibt.
Den Effekt, den ich haben wollte sind gehäufte Heizzykluen in der PV-Leistungszeit und nach Möglichkeit sehr wenige in der Nacht, im Diagramm sieht
man den einen Heizzyklus in der Nacht davor nicht. Das erste Ergebnis davon könnt Ihr im Grafana Diagramm erkennen, das grüne ist der direkte
Verbrauch und das gestapelte rote kam aus der Batterie.
Zwischen der blauen Linie und der grünen Fläche befindet sich die Leistung, die in den Speicher gegangen ist. Die gelbe Linie zeigt den rechnerischen
Ladezustand der Batterie.

Die großen Säulen mit zusätzlicher Batterieunterstützung sind die LWP.
Gegen 9:00 Uhr musste leider nochmal die abgesenkte Temperatur nachgeheizt werden, aber es gab schon PV-Leistung.
Um 10:00 Uhr ging es auf Tagesanhebung, was auch direkt mit einer langen Betriebszeit der LWP los ging.
Somit habe ich bereits drei, anstelle von nur einem Heizzyklus in der PV-Leistungs Zeit.
Gegen 13:00 Uhr nachheizen, da der Pufferspeicher dann zu kühl war und um 14:00 Uhr ist die Sperrzeit für WW rum.

Durch die Eigenverbrauchsteuerung der PV_Anlage Implementierung würde zusätzlich noch der PV-Modus der LWP aktiviert werden, sobald die Parameter passen.

Viele Grüße und bleibt interessiert.
     Christian
« Letzte Änderung: 06 November 2020, 16:10:09 von ch.eick »
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline plin

  • Developer
  • Sr. Member
  • ****
  • Beiträge: 809
    • FHEM-Landschaft von plin
Hi Christian,

ich bin weiterhin am Thema dran und sammle noch, da mein KSEM noch nicht installiert ist. Ich habe die ersten Grafana-Dashboards erstellt und merke jetzt was mir wo noch fehlt. Ist halt ein iterativer Prozess...

Auch beim Forecast habe ich noch Verbesserungspotential. Aktuell nutze ich noch dwdforecast von kilianknoll. Mein Plenticore Plus sowie meine Heckert Module sind aber nicht in der pvlib-db. Mein Dach hat eine absolute Süd-West-Ausrichtung. Ab einem Azimuth von -41 Grad geht die Post ab. Das scheint berücksichtigt zu sein. Dummerweise wohne ich im Hang und merke, dass um die Jahreszeit die Sonne tief steht und ab einer Altitude von 14.568 die Abschattung beginnt. Das ist ein Faktor der im dwdforecast nicht eingegeben werden kann. Außerdem schießt mein Ertrag oftmals über die dwdforecast-Progonse hinaus.

Es gibt also noch viel zu tun.

VG Peter

P.S. Ich habe ein Thema zu NILM aufgemacht. Bin mal gespannt, ob jemand dazu etwas sagen kann.
FHEM1 (Main) Raspi3b 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

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
Zitat
ich bin weiterhin am Thema dran und sammle noch, da mein KSEM noch nicht installiert ist. Ich habe die ersten Grafana-Dashboards erstellt und merke jetzt was mir wo noch fehlt. Ist halt ein iterativer Prozess...
Stütz Dich doch einfach auf meine gesammelten Werke, da sind 1,5 Jahre Erfahrung drin und die Lösung von Kilian und mir ist auch drin aufgegangen ;-)

Hast Du schon das Button Problem gelöst, um einen Verbrauche vom Grafana heraus einzuschalten? Da komme ich nicht weiter.
Diagramme und on/off war nicht so schwierig.


Zitat
Auch beim Forecast habe ich noch Verbesserungspotential. Aktuell nutze ich noch dwdforecast von kilianknoll.
Das kannst Du recht simpel nach meiner Anleitung direkt in Fhem integrieren. Das DWD Modul liefert bereits Rad1h Werte.

[/quote]
Mein Dach hat eine absolute Süd-West-Ausrichtung. Ab einem Azimuth von -41 Grad geht die Post ab. Das scheint berücksichtigt zu sein. Dummerweise wohne ich im Hang und merke, dass um die Jahreszeit die Sonne tief steht und ab einer Altitude von 14.568 die Abschattung beginnt.
Das ist ein Faktor der im dwdforecast nicht eingegeben werden kann. Außerdem schießt mein Ertrag oftmals über die dwdforecast-Progonse hinaus.
Zitat
Das kannst Du auch bei meiner Umsetzung anpassen. Ich habe mit Kilian zusammen gefachsimpelt, bis ich die Lösung auf Fhem optimiert habe und er die pvlib eingeführt hat.
Die Besonderheit der Module kannst Du auf die Nennleistung und den Temperaturkoeffizienten runter brechen.
Für die Sonnenstände könntest Du mit einfachen Mitteln in der Solar_plain Funktion weitere Einschränkungen vornehmen.
Ein generelles zu hoch/niedrig der Werte stellst Du über den fixen Faktor in der PV_Anlage_1_config ein.
Regen und Wolken mit den anderen Anpassungskurven alla "Heizungskurve".
Das Ergebnis findest Du für heute im Anhang.

Über Prognose und NILM wurde bereits häufiger philosophiert und Prognose war dort schon weit vorne. Ich habe es nun bereits implementiert und bin sehr zufrieden.
Du musst auch berücksichtigen, wieviel geeignete Verbraucher Du hast, wo es sich lohnt sie zu verschieben.
Ich habe da den Pool mit einer Zeitverschiebung für Herbst/Winter und die LWP, die bei hoher Leistung im PV-Modus schon eher starten darf.

Die bunten Linien unter der Prognose Kurve sind die Einzelprognosen der drei Seitenausrichtung.

Viele Grüße
     Christian
« Letzte Änderung: 07 November 2020, 18:10:42 von ch.eick »
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
Hallo zusammen,
in einem anderen Thread wurde die Komplexität angesprochen, was ich hier nochmal wiederholen möchte.

Zitat
PV_Anlage ist aktuell ein Sammlung von verschiedenen Elementen und Programmiersprachen. Da könnte man ein schönes Modul draus machen ...

Also, die Basis ist FHEM mit folgenden Standard Modulen:
HTTPMOD
MODBUS
DOIF
DUMMY
HourCounter
readingsGroup
DbLog
DbRep

Zähler (nicht unbedingt notwendig)
SMAEM (bei mir für den Starkverbraucher LWP)
KSEM über MODBUS (nicht notwendig beim Plenticore)
Lesekopf für den EVU
Shelly (intern)

Diagramme:
SVG Muster (wird nicht mehr weiter entwickelt)
Grafana (jetzt neu)

Für den Forecast:
ASTRO
DWD_OpenData
wunderground über HTTPMOD (nur für Radiation in der Nachbarschaft, zum Vergleich)

Verbraucher Anschluss bei mir:
Shelly mit Leistungsmessern

Eventueller Code ist das in Fhem verwendete Perl, was direkt in den einzelnen Devices sichtbar ist. Weiterhin gibt es zwei Funktionen in der myUtils, ebenfalls in Perl.

Momentan existieren zwei Python Skripte, für die Berechnung von Anmelde Keys zum Plenticore, mit einem extra Thread im Forum für eine eventuelle Migration zu Perl. Leider scheint es niemanden im Forum zu geben, der dafür Zeit investieren könnte.

Bei der Umsetzung dieser Lösung wurde bewusst auf die standard Module von Fhem gesetzt, um nicht wieder ein neues Modul zu erstellen, für das es eventuell keine Unterstützung gibt.
Somit kann auch ohne Maintainer zu jeder einzelnen Komponente im Forum Hilfe gefunden werden.
Ich sehe es eher als kritisch an daraus ein Modul zu erstellen, da dafür der Ersteller auch Service leisten sollte. Der modulare Aufbau ermöglicht es dem Endanwender seine Gerätschaften flexibel anzubinden.
Die Vielzahl von Modulen kommt dadurch zu stande, dass ja jedes einzelne Gerät Konfiguriert werden muss und jeder Hersteller eine andere Schnittstelle hat. Das alles müsste in einem Modul versteckt und
supported werden.

Die wenigsten werden Shellys für die Ansteuerung haben und könnten dann z.B. einfach durch austausch von
SetCmdOff set shelly02 off 0
SetCmdOn set shelly02 on 0
das eigene Endgerät ansteuern.

Falls jedoch jemand bereit wäre das ganze in ein Modul zu gießen, bin ich auf jeden Fall unterstützend dabei.

Viele Grüße
     Christian
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
Bei mir sieht es durchwachsen aus. Mein Prod-FHEM hat Probleme. In meiner Dev-Instanz habe ich die PV_Anlage_1_API gelöscht und neu eingerichtet. Nach kurzer Zeit ging es, die auth-Readings wurden gesetzt, es erschienen Werte in der Status-Tabelle.
"update all" der Prod-Instanz => keine Änderung
"update all" der Dev-Instanz => jetzt geht's auch da nicht mehr
Achtung, die letzten Versionen vom HTTPMOD scheinen nicht 100% okay zu sein, weshalb ich keinen Update gemacht habe!
Momentan habe ich FVERSION 98_HTTPMOD.pm:0.228400/2020-09-24 , die könnte ich Dir nochmal schicken.


Zitat
Der Knackpunkt scheint die Erzeugung des auth_randomString64  zu sein. Im Log erscheint folgende Meldung

2020.11.08 12:02:46 5: PV_Anlage_1_API: get called with 01_/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: get found option 01_/auth/start in attribute get01Name
2020.11.08 12:02:46 4: PV_Anlage_1_API: get will now request 01_/auth/start, no optional value
2020.11.08 12:02:46 5: PV_Anlage_1_API: AddToQueue adds type get01 to URL http://%IP-Address_Plenticore%/api/v1/auth/start, data {"nonce": "%randomString64%","username": "user"}, header Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive, retry 0, initial queue len: 0
2020.11.08 12:02:46 5: PV_Anlage_1_API: HandleSendQueue called from HTTPMOD::AddToSendQueue, qlen = 1
2020.11.08 12:02:46 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.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_transactionId%), mode reading, value auth_transactionId input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_proof%), mode reading, value auth_proof input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%randomString64%), mode expression, value {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;} input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_randomString64%), mode reading, value auth_randomString64 input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_token%), mode reading, value auth_token input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 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.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_authtag%), mode reading, value auth_authtag input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_payload%), mode reading, value auth_payload input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_iv%), mode reading, value auth_iv input: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 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.08 12:02:46 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.08 12:02:46 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.08 12:02:46 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: {"nonce": "%randomString64%","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_transactionId%), mode reading, value auth_transactionId input: {"nonce": "%randomString64%","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_proof%), mode reading, value auth_proof input: {"nonce": "%randomString64%","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%randomString64%), mode expression, value {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;} input: {"nonce": "%randomString64%","username": "user"}
2020.11.08 12:02:46 3: PV_Anlage_1_API: Replacement 04 with expression {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;} (s/(?^:%randomString64%)/{my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;}/gee) created warning: Use of uninitialized value in substitution iterator at ./FHEM/98_HTTPMOD.pm line 877.

2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace: match for type get01, regex (?^:%randomString64%), mode expression, value {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;}, input: {"nonce": "%randomString64%","username": "user"}, result is {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_randomString64%), mode reading, value auth_randomString64 input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_token%), mode reading, value auth_token input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_signature%), mode reading, value auth_signature input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_authtag%), mode reading, value auth_authtag input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_payload%), mode reading, value auth_payload input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_iv%), mode reading, value auth_iv input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: {"nonce": "","username": "user"}
2020.11.08 12:02:46 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": "","username": "user"}
2020.11.08 12:02:46 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": "","username": "user"}
2020.11.08 12:02:46 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.08 12:02:46 5: PV_Anlage_1_API: Replace: match 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, result is http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_transactionId%), mode reading, value auth_transactionId input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_proof%), mode reading, value auth_proof input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%randomString64%), mode expression, value {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;} input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_randomString64%), mode reading, value auth_randomString64 input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_token%), mode reading, value auth_token input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_signature%), mode reading, value auth_signature input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_authtag%), mode reading, value auth_authtag input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_payload%), mode reading, value auth_payload input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_iv%), mode reading, value auth_iv input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_sessionId%), mode reading, value auth_sessionId input: http://192.168.3.71/api/v1/auth/start
2020.11.08 12:02:46 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.3.71/api/v1/auth/start
2020.11.08 12:02:46 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.3.71/api/v1/auth/start
2020.11.08 12:02:46 4: PV_Anlage_1_API: HandleSendQueue sends get01 with timeout 7 to http://192.168.3.71/api/v1/auth/start,
data: {"nonce": "","username": "user"},
header: Accept-Encoding: gzip,deflate
Content-type:application/json, Accept:application/json, Connection:keep-alive
2020.11.08 12:02:46 5: PV_Anlage_1_API: ReadCallback called from __ANON__
2020.11.08 12:02:46 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: Sun, 08 Nov 2020 11:02:46 GMT
Content-Type: application/json
Content-Length: 154
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: max-age=0, no-cache, no-store, must-revalidate, body length 154
2020.11.08 12:02:46 5: PV_Anlage_1_API: Read callback: body
{"nonce":"zDrc7AMVkr8JWEJH","salt":"v89J\/Ggdnq0GW8mh","rounds":29000,"transactionId":"6310d6d61e9e201bf2f1e739a358426f3abaea4a69339df5a520fdf80d862d30"}

Das hier sieht komisch aus...
ndomString64 ".$r);; $r;;}/gee) Woher kommt das "/gee)" ist das ein Copy/Paste Fehler?
Durch den Fehler wird an dieser Stelle das Replacement nicht gemacht.
2020.11.08 12:02:46 5: PV_Anlage_1_API: Replace called for type get01, regex (?^:%auth_randomString64%), mode reading, value auth_randomString64 input: {"nonce": "","username": "user"}

>>>> {"nonce": "","username": "user"}
>>>> da müsste z.B.  {"nonce": "I4G54dSPVX3YPPQ9","username": "user"} stehen.


>>>> in der Kommandozeile kannst Du auch folgendes Testen

{my $NAME = "PV_Anlage_1_API";; my @chars=('a'..'z','A'..'Z','0'..'9');; my $r;; foreach(1..16) {$r.=$chars[rand @chars];;};; fhem("setreading ".$NAME." test_auth_randomString64 ".$r);; $r;;}
>>>> Auf dem Bildschirm kommt 5sUrso8HnWoDXLzd
>>>> Und im PV_Anlage_1 kommt ein neues raeding
>>>> test_auth_randomString64 5sUrso8HnWoDXLzd
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline plin

  • Developer
  • Sr. Member
  • ****
  • Beiträge: 809
    • FHEM-Landschaft von plin
Das hier sieht komisch aus...
ndomString64 ".$r);; $r;;}/gee) Woher kommt das "/gee)" ist das ein Copy/Paste Fehler?
Durch den Fehler wird an dieser Stelle das Replacement nicht gemacht.
Das /gee habe ich gesehen aber nicht hinterfragt (habe die '}' übersehen und gedacht das wäre der Ersatzcode).

Ich habe das replacement04Value noch mal alleine übernommen und nun klappt's.

Vielleicht ist der Fehler beim Upload passiert. Ich hatte die raw-Defintion in ein separates File kopiert und via telnet hochgeladen. Bisher hatte ich damit noch keine Probleme. Aber es gibt für alles ein erste Mal.

Als nächstes brauche ich jetzt noch die DWD_Forecast-Daten. Bisher hole ich mir Regen und Bewölkung aus den Proplanata-Daten, die DWD-Daten sind aber granularer.

Ciao
Peter

UPDATE (damit man's schnell im Kontext findet):
98_HTTPMOD.pm:            $match = eval {$string =~ s/$regex/$value/gee};
98_HTTPMOD.pm:                Log3 $name, 3, "$name: Replace: invalid regex / expression: /$regex/$value/gee - $@";
Der Fehler liegt also im 98_HTTPMOD.pm und wird im entsprechenden Forum gemeldet.
https://forum.fhem.de/index.php/topic,45176.msg1100077.html#msg1100077
« Letzte Änderung: 10 November 2020, 15:59:50 von plin »
FHEM1 (Main) Raspi3b 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

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
Das "/gee" habe ich gesehen aber nicht hinterfragt (habe die '}' übersehen und gedacht das wäre der Ersatzcode).
Ich habe das replacement04Value noch mal alleine übernommen und nun klappt's.
Vielleicht ist der Fehler beim Upload passiert. Ich hatte die raw-Defintion in ein separates File kopiert und via telnet hochgeladen. Bisher hatte ich damit noch keine Probleme. Aber es gibt für alles ein erste Mal.
Kann passieren ;-) Okay, dann läuft es wenigstens.

Zitat
Als nächstes brauche ich jetzt noch die DWD_Forecast-Daten. Bisher hole ich mir Regen und Bewölkung aus den Proplanata-Daten, die DWD-Daten sind aber granularer.
Das ist ja bereits im Wiki dokumentiert. Da habe ich Krukis Python Skript einfach durch das DWD_Opendata Modul ersetzt. Aber Vorsicht beim Kopieren :-) :-)
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline ch.eick

  • Hero Member
  • *****
  • Beiträge: 1920
Das ist von plin:

Zitat
Ich glaube die HttpUtils_NonblockingGet  müssen in einem FHEM-Modul ausgeführt werden. Jedenfalls braucht man $hash für die Antwort. Mit dem Wissen kann ich einen neuen Versuch starten. Was erforderlich ist ist in meinen python-Skipten drin. Ich hoffe es so aufbauen zu können, dass man es als function in die 99_myUtils.pm übernehmen kann.
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

 

decade-submarginal