APSystems EZ-1

Begonnen von rubberduck67, 15 August 2023, 11:40:39

Vorheriges Thema - Nächstes Thema

Huabafranze

Hallo,
habe den EZ1 nun auch nach der Methode von huri-kane eingebuden. Funktioniert soweit gut, nur mit dem Einstellen der maximalen Leistung stimmt irgendetwas nicht.
Angenommen ich stelle 800W ein und die Solarpanels liefern 190W. Wenn ich jetzt 200W einstelle, lässt er nur ca.125W durch.
Kurz gesagt, es werden immer weniger Watt ausgegeben als eingestellt, obwohl die Leistung der Panels ausreichend wäre.
Vielleicht kann das jemand erklären.
PS. Es ist nur ein Eingang belegt.

Grüße Franz

AlexMuc

Gerüchteweise teilen die meisten Wechselrichtung die Leistung bei einer Drosselung immer auf alle Eingänge auf, dh bei 2 Eingängen wird, wenn man die Leistung von 800 auf 400 drosselt, kommen aus beiden Eingängen maximal nur noch je 200W.
Das ist zwar Blödsinn weil als Endverbraucher interessiert einen nur, was ,, hinten raus, kommt. Wenn also wie bei dir nur ein Eingang belegt ist, dann sollte der WR so intelligent sein, das er sich aus allen Eingängen soviel holt, bis das eingestellte Limit am Ausgang erreicht wird.
Ich hab das erst vor kurzem irgendwo gelesen und dort wurde ein Wechselrichter erwähnt, der in der neuesten Version genau so arbeiten soll. Frag nicht, wo. Google findet sicher einiges dazu ;-)

Boe3eh

Hallo zusammen, wollte auch das HTTP-Modul von huri-kane anwenden, bekomme da aber keine Daten ausgelesen. Sieht hier jemand die Ursache? Finde irgendwie den Fehler nicht:

Im Log steht:
024.06.23 20:48:09 4: EZ1_inverter: UpdateTimer called from GetUpdate with cmd next sets timer to call update function in 60.0 sec at 20:49:09.038, interval 60
2024.06.23 20:48:09 5: EZ1_inverter: AddToQueue adds type update to URL http://apsystems:8050/getOutputData, no data, no headers, retry 0, initial queue len: 0
2024.06.23 20:48:09 5: EZ1_inverter: HandleSendQueue called from AddToSendQueue, qlen = 1
2024.06.23 20:48:09 5: EZ1_inverter: no separator for multiple values (Context update, unknown)
2024.06.23 20:48:09 4: EZ1_inverter: HandleSendQueue sends update with timeout 2 to http://apsystems:8050/getOutputData, No Data, No Header
2024.06.23 20:48:10 5: EZ1_inverter: ReadCallback called from __ANON__
2024.06.23 20:48:10 4: EZ1_inverter: Read callback: request type was update retry 0,
header: HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 125, body length 125
2024.06.23 20:48:10 5: EZ1_inverter: Read callback: body
{"data":{"p1":8,"e1":2.08913,"te1":2.20986,"p2":12,"e2":1.90394,"te2":2.04412},"message":"SUCCESS","deviceId":"E07000061123"}
2024.06.23 20:48:10 4: EZ1_inverter: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2024.06.23 20:48:10 5: EZ1_inverter: GetCookies is looking for Cookies
2024.06.23 20:48:10 5: EZ1_inverter: ExtractSid called, context reading, num unknown
2024.06.23 20:48:10 4: EZ1_inverter: checking for redirects, code=200, ignore=0
2024.06.23 20:48:10 4: EZ1_inverter: no redirects to handle
2024.06.23 20:48:10 5: EZ1_inverter: Read callback sets LAST_REQUEST to update
2024.06.23 20:48:10 5: EZ1_inverter: CheckAuth decided no authentication required
2024.06.23 20:48:10 5: EZ1_inverter: Read starts parsing response to update with defined readings:
2024.06.23 20:48:10 4: EZ1_inverter: Read response to update didn't match any Reading
2024.06.23 20:48:10 5: EZ1_inverter: HandleSendQueue called from ReadCallback, qlen = 0
2024.06.23 20:48:10 5: EZ1_inverter: HandleSendQueue found no usable entry in queue

huri-kane

Hi Boe3eh,

was ich aus dem Log sehe ist, dass Du auf jeden Fall Daten vom Wechselrichter bekommst. Zu dem Zeitpunkt hattest Du in Summe noch 8+12=20W Leistung - ist OK für die Abendstunden ;) (das ist die Zeile mit den JSON-Daten nach "EZ1_inverter: Read callback: body")
Ich stecke zugegebenermaßen nicht wirklich im HTTPMOD-Modul drin aber aus dem Bauch heraus würde ich mutmaßen, dass selbiges die gelesenen Daten nicht zu den Readings verarbeitet - das suggeriert zumindest die Meldung "Read response to update didn't match any Reading". Kannst Du mal ein listing deines FHEM-Devices vom Wechselrichter posten ("list EZ1_inverter" entweder auf der Telnet-Konsole oder oben in der Web-UI-Zeile ausführen)? Möglicherweise passt da was nicht in deiner Device-Konfiguration.

Boe3eh

#34
Hallo huri-kane, danke für die schnelle Antwort, hier das Ergebnis von "list EZ1_inverter"
Internals:
   BUSY       0
   CFGFN     
   DEF        http://apsystems:8050/getOutputData 60 attr EZ1_inverter get1JSON data_maxPower attr EZ1_inverter get1Name MaxPower attr EZ1_inverter get1Poll 1 attr EZ1_inverter get1URL http://apsystems:8050/getMaxPower attr EZ1_inverter get2Name OutputData attr EZ1_inverter get2Poll 1 attr EZ1_inverter get2URL http://apsystems:8050/getOutputData attr EZ1_inverter get3Name Alarm attr EZ1_inverter get3Poll 1 attr EZ1_inverter get3URL http://apsystems:8050/getAlarm attr EZ1_inverter get4Name Disabled attr EZ1_inverter get4Poll 1 attr EZ1_inverter get4URL http://apsystems:8050/getOnOff attr EZ1_inverter get5Name DeviceInfo attr EZ1_inverter get5Poll 1 attr EZ1_inverter get5PollDelay 3600 attr EZ1_inverter get5URL http://apsystems:8050/getDeviceInfo attr EZ1_inverter icon measure_photovoltaic_inst attr EZ1_inverter reading101JSON data_maxPower attr EZ1_inverter reading101Name MaxPower attr EZ1_inverter reading201JSON data_e1 attr EZ1_inverter reading201Name e1 attr EZ1_inverter reading202JSON data_e2 attr EZ1_inverter reading202Name e2 attr EZ1_inverter reading203JSON data_te1 attr EZ1_inverter reading203Name te1 attr EZ1_inverter reading204JSON data_te2 attr EZ1_inverter reading204Name te2 attr EZ1_inverter reading205JSON data_p1 attr EZ1_inverter reading205Name p1 attr EZ1_inverter reading206JSON data_p2 attr EZ1_inverter reading206Name p2 attr EZ1_inverter reading301JSON data_og attr EZ1_inverter reading301Name alarm_off_grid attr EZ1_inverter reading302JSON data_oe attr EZ1_inverter reading302Name alarm_output_fault attr EZ1_inverter reading303JSON data_isce1 attr EZ1_inverter reading303Name alarm_dc1_short attr EZ1_inverter reading304JSON data_isce2 attr EZ1_inverter reading304Name alarm_dc2_short attr EZ1_inverter reading401JSON data_status attr EZ1_inverter reading401Name disabled attr EZ1_inverter reading501JSON data_deviceId attr EZ1_inverter reading501Name deviceId attr EZ1_inverter reading502JSON data_devVer attr EZ1_inverter reading502Name deviceVersion attr EZ1_inverter reading503JSON data_ssid attr EZ1_inverter reading503Name SSID attr EZ1_inverter set1Hint slider,30,10,800 attr EZ1_inverter set1JSON data_maxPower attr EZ1_inverter set1Name MaxPower attr EZ1_inverter set1ParseResponse 1 attr EZ1_inverter set1URL http://apsystems:8050/setMaxPower?p=$val attr EZ1_inverter set4Hint 0,1 attr EZ1_inverter set4Name Disabled attr EZ1_inverter set4ParseResponse 1 attr EZ1_inverter set4URL http://apsystems:8050/setOnOff?status=$val attr EZ1_inverter stateFormat {\   sprintf("%.2fkWh / %.2fkWh / %.0fW",\           ReadingsVal($name, "total_energy", 0),\           ReadingsVal($name, "total_energy_today", 0),\           ReadingsVal($name, "total_power", 0));\ } attr EZ1_inverter userReadings total_power:p.* { ReadingsVal($name, "p1", 0) + ReadingsVal($name, "p2", 0) },\ total_energy_today:e.* { ReadingsVal($name, "e1", 0) + ReadingsVal($name, "e2", 0) },\ total_energy:te.* { ReadingsVal($name, "te1", 0) + ReadingsVal($name, "te2", 0) },\ energy_today:e.* monotonic { ReadingsVal($name, "e1", 0) + ReadingsVal($name, "e2", 0) },\ energy_month:te.* monotonic { ReadingsVal($name, "te1", 0) + ReadingsVal($name, "te2", 0) }
   FUUID      667aff60-f33f-d16c-e764-c8eb9a33e64d8465
   Interval   60
   MainURL    http://apsystems:8050/getOutputData
   ModuleVersion 4.2.0 - 11.8.2023
   NAME       EZ1_inverter
   NOTIFYDEV  global
   NR         417
   NTFY_ORDER 50-EZ1_inverter
   STATE      ???
   TYPE       HTTPMOD
   value     
   HttpUtils:
     NAME      
     addr       http://apsystems:8050
     auth       0
     data      
     displayurl http://apsystems:8050/getOutputData
     header    
     host       apsystems
     httpversion 1.0
     ignoreredirects 1
     loglevel   4
     path       /getOutputData
     protocol   http
     redirects  0
     timeout    2
     url        http://apsystems:8050/getOutputData
     sslargs:
   QUEUE:
   READINGS:
   REQUEST:
     context    reading
     data      
     header    
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        http://apsystems:8050/getOutputData
Attributes:
   room       PV-Anlage
   verbose    5
Fehlt mir eventuell eine HttpUtils-Datei? Wo würde die leigen müssen?

huri-kane

Ob Dateien fehlen lässt sich hier nicht erkennen, allerdings ist deine Device-Definition etwas "daneben". Wie hast du das angelegt? Ich frage deshalb, weil beim "DEF" Internal viel zu viel steht. Das Kommando für die Device-Definition lautet ja
define EZ1_inverter HTTPMOD http://apsystems:8050/getOutputData 60
Das heißt das "DEF" Internal solle nur
http://apsystems:8050/getOutputData 60enthalten. Die ganzen "attr" Anhängsel dahinter sollten eigentlich einzelne Attribute des Device' sein und müssten entsprechend im Listing in einem separaten Abschnitt "Attributes" auftauchen. Das wird auch der Grund sein, warum HTTPMOD keine Zuordnung findet - es gibt einfach keine reading*JSON-Attribute.

Wenn du den Text aus meinem initialen Post per copy&paste ins FHEM übernehmen möchtest musst Du jede Zeile einzeln ein die Kommando-Zeile der WebUI kopieren und ausführen (dort werden die Zeilenumbrüche nicht als neues Kommando verarbeitet!). Den kompletten Block kannst Du nur im Telnet-Zugang kopieren: Dort entspricht ein Zeilenumbruch einem "Enter"-Tastendruck und damit der Befehlsausführung. Bevor Du aber in dem vorhandenen Device änderst empfehle ich selbiges lieber vorher zu löschen und neu anzulegen.

Hier mal als Vergleich das Listing von meinem Device:
Internals:
   BUSY       0
   DEF        http://apsystems:8050/getOutputData 60
   FUUID      6595722a-f33f-8d27-351b-cb16bcbc8f95dee3
   Interval   60
   MainURL    http://apsystems:8050/getOutputData
   ModuleVersion 4.1.12 - 19.4.2022
   NAME       EZ1_inverter
   NOTIFYDEV  global
   NR         170
   NTFY_ORDER 50-EZ1_inverter
   STATE      661.97kWh / 0.69kWh / 375W
   TYPE       HTTPMOD
   eventCount 63064
   value     
   Helper:
    [...] (entfernt da automatisch angelegt)
Attributes:
   alias      Stromerzeugung
   get1JSON   data_maxPower
   get1Name   MaxPower
   get1Poll   1
   get1URL    http://apsystems:8050/getMaxPower
   get2Name   OutputData
   get2Poll   1
   get2URL    http://apsystems:8050/getOutputData
   get3Name   Alarm
   get3Poll   1
   get3URL    http://apsystems:8050/getAlarm
   get4Name   Disabled
   get4Poll   1
   get4URL    http://apsystems:8050/getOnOff
   get5Name   DeviceInfo
   get5Poll   1
   get5PollDelay 3600
   get5URL    http://apsystems:8050/getDeviceInfo
   group      Home State
   icon       measure_photovoltaic_inst
   reading101JSON data_maxPower
   reading101Name MaxPower
   reading201JSON data_e1
   reading201Name e1
   reading202JSON data_e2
   reading202Name e2
   reading203JSON data_te1
   reading203Name te1
   reading204JSON data_te2
   reading204Name te2
   reading205JSON data_p1
   reading205Name p1
   reading206JSON data_p2
   reading206Name p2
   reading301JSON data_og
   reading301Name alarm_off_grid
   reading302JSON data_oe
   reading302Name alarm_output_fault
   reading303JSON data_isce1
   reading303Name alarm_dc1_short
   reading304JSON data_isce2
   reading304Name alarm_dc2_short
   reading401JSON data_status
   reading401Name disabled
   reading501JSON data_deviceId
   reading501Name deviceId
   reading502JSON data_devVer
   reading502Name deviceVersion
   reading503JSON data_ssid
   reading503Name SSID
   room       Balkonkraftwerk,Status
   set1Hint   slider,30,10,800
   set1JSON   data_maxPower
   set1Name   MaxPower
   set1ParseResponse 1
   set1URL    http://apsystems:8050/setMaxPower?p=$val
   set4Hint   0,1
   set4Name   Disabled
   set4ParseResponse 1
   set4URL    http://apsystems:8050/setOnOff?status=$val
   stateFormat {
  sprintf("%.2fkWh / %.2fkWh / %.0fW",
          ReadingsVal($name, "total_energy", 0),
          ReadingsVal($name, "total_energy_today", 0),
          ReadingsVal($name, "total_power", 0));
}

   userReadings total_power:p.* { ReadingsVal($name, "p1", 0) + ReadingsVal($name, "p2", 0) },
total_energy_today:e.* { ReadingsVal($name, "e1", 0) + ReadingsVal($name, "e2", 0) },
total_energy:te.* { ReadingsVal($name, "te1", 0) + ReadingsVal($name, "te2", 0) },
energy_today:e.* monotonic { ReadingsVal($name, "e1", 0) + ReadingsVal($name, "e2", 0) },
energy_month:te.* monotonic { ReadingsVal($name, "te1", 0) + ReadingsVal($name, "te2", 0) }

Grüße
André

Boe3eh

Hallo André,
vielen Dank für die entscheidenden Hinweise. Da ist wirklich was beim kopieren schief gelaufen.
Kaum macht man´s richtig... ;D  ;D  ;D
Internals:
   BUSY       0
   CFGFN     
   DEF        http://192.168.0.239:8050/getOutputData 60
   FUUID      667c443c-f33f-d16c-ac57-aebad2cd615084a0
   Interval   60
   MainURL    http://192.168.0.239:8050/getOutputData
   ModuleVersion 4.2.0 - 11.8.2023
   NAME       EZ1_inverter
   NOTIFYDEV  global
   NR         418
   NTFY_ORDER 50-EZ1_inverter
   STATE      18.62kWh / 4.74kWh / 94W
   TYPE       HTTPMOD
   eventCount 182
   value     
   HttpUtils:
     NAME      
     addr       http://192.168.0.239:8050
     auth       0
     buf       
     code       200
     conn      
     data      
     displayurl http://192.168.0.239:8050/getOnOff
     header    
     host       192.168.0.239
     httpheader HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 69
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    8050
     hu_portSfx :8050
     ignoreredirects 1
     loglevel   4
     path       /getOnOff
     protocol   http
     redirects  0
     timeout    2
     url        http://192.168.0.239:8050/getOnOff
     sslargs:
   QUEUE:
   READINGS:
     2024-06-26 19:17:33   MaxPower        800
     2024-06-26 19:17:35   alarm_dc1_short 0
     2024-06-26 19:17:35   alarm_dc2_short 0
     2024-06-26 19:17:35   alarm_off_grid  0
     2024-06-26 19:17:35   alarm_output_fault 0
     2024-06-26 18:42:29   data_e1         2.34926
     2024-06-26 18:43:28   data_te2        9.44186
     2024-06-26 19:17:36   disabled        0
     2024-06-26 19:17:34   e1              2.37682
     2024-06-26 19:17:34   e2              2.36145
     2024-06-26 19:17:34   energy_month    18.62209
     2024-06-26 19:17:34   energy_today    4.73827
     2024-06-26 19:17:34   p1              36
     2024-06-26 19:17:34   p2              58
     2024-06-26 19:17:34   te1             9.11817
     2024-06-26 19:17:34   te2             9.50392
     2024-06-26 19:17:34   total_energy    18.62209
     2024-06-26 19:17:34   total_energy_today 4.73827
     2024-06-26 19:17:34   total_power     94
Ärgert mich, dass mir das nicht selber aufgefallen ist. Manchmal sieht man eben den Wald vor lauter Bäumen nicht  :)
Viele sonnige Grüße
René

huri-kane

Dafür ist das Forum doch auch da: Als Wegweiser zum Wald ;). Freut mich, dass es geklappt hat.

Reepa

Ich alles soweit aber bei dem code weiß ich nicht wie ich es machen soll da klappt eine Zeile nach der anderen nicht. Kann mir hier jemand helfen?

define EZ1_inverter_tag at *00:00:00 {\
  my $NAME = "EZ1_inverter";;\
  my $total_energy = ReadingsVal($NAME, "total_energy", 0);;\
  my $energy_today = ReadingsVal($NAME, "energy_today", 0);;\
  fhem("setreading $NAME energy_today 0");;\
  fhem("setreading $NAME energy_yesterday $energy_today");;\
  fhem("setreading $NAME total_energy_yesterday $total_energy");;\
  if ( (strftime("%d", localtime(time()) ) ) eq "01")  # 1. des Monats\
  {\
    my $energy_month = ReadingsVal($NAME, "energy_month", 0);;\
    fhem("setreading $NAME energy_month 0");;\
    fhem("setreading $NAME energy_lastmonth $energy_month");;\
    fhem("setreading $NAME total_energy_lastmonth $total_energy");;\
  }\
}

huri-kane

Da gibt es zwei Möglichkeiten:

  • Variante 1
    Du verbindest dich per Telnet zum FHEM server (sofern aktiviert, "telnet localhost 7072") und fügst den Abschnitt per copy&paste ein.
  • Variante 2
    Du legst das "at" Device in der Web-Oberfläche erst einmal ohne Inhalt an:
    define ET1_inverter_tag at *00:00:00 { }
    Im Anschluss editierst Du das "DEF" Internal und fügst den Block zwischen die geschweiften Klammern - ersetze dann allerdings das ";;\" mit ";" bzw. lösche die "\".

Grüße
André