Solis ModbusAttr lesen und schreiben von einzelnen Bits

Begonnen von macfly, 02 Juni 2024, 17:29:30

Vorheriges Thema - Nächstes Thema

macfly

Moin zusammen,

ich möchte meine PV-Überschussladung optimieren und beim Wechselrichter die Entladung von der Batterie verhindern, wenn das Auto zwangsweise geladen werden muss.

den Solis S5-EH1P-L habe ich bereits mit diversen Registern in fhem (nur lesend), das funktioniert alles soweit, hier mal das device:

define WR_Solis ModbusAttr 1 15
attr WR_Solis DbLogInclude (1_DC_PV_W|2_AC_Produktion_W|5_DC_Batterieentladung_W|6_DC_Batterieladung_W|Battery_SOC_pct|PV_1_Power|PV_2_Power):300,stat.*:3600
attr WR_Solis dev-c-defPoll 1
attr WR_Solis dev-i-combine 8
attr WR_Solis dev-i-defPoll 1
attr WR_Solis dev-type-S16_0-expr $val/10
attr WR_Solis dev-type-S16_0-format %.1f
attr WR_Solis dev-type-S16_0-len 1
attr WR_Solis dev-type-S16_0-unpack s>
attr WR_Solis dev-type-S16_00-expr $val/100
attr WR_Solis dev-type-S16_00-format %.1f
attr WR_Solis dev-type-S16_00-len 1
attr WR_Solis dev-type-S16_00-unpack s>
attr WR_Solis dev-type-S16_1-expr $val*10
attr WR_Solis dev-type-S16_1-len 1
attr WR_Solis dev-type-S16_1-unpack s>
attr WR_Solis dev-type-S16_11-expr $val*100
attr WR_Solis dev-type-S16_11-len 1
attr WR_Solis dev-type-S16_11-unpack s>
attr WR_Solis dev-type-S32-len 2
attr WR_Solis dev-type-S32-unpack l>
attr WR_Solis dev-type-S32_00-expr $val/100
attr WR_Solis dev-type-S32_00-format %.2f
attr WR_Solis dev-type-S32_00-len 2
attr WR_Solis dev-type-S32_00-unpack l>
attr WR_Solis dev-type-S32_000-expr $val/1000
attr WR_Solis dev-type-S32_000-format %.3f
attr WR_Solis dev-type-S32_000-len 2
attr WR_Solis dev-type-S32_000-unpack l>
attr WR_Solis dev-type-U16-len 1
attr WR_Solis dev-type-U16-unpack S>
attr WR_Solis dev-type-U16_0-expr $val/10
attr WR_Solis dev-type-U16_0-format %.1f
attr WR_Solis dev-type-U16_0-len 1
attr WR_Solis dev-type-U16_0-unpack S>
attr WR_Solis dev-type-U16_00-expr $val/100
attr WR_Solis dev-type-U16_00-format %.2f
attr WR_Solis dev-type-U16_00-len 1
attr WR_Solis dev-type-U16_00-unpack S>
attr WR_Solis dev-type-U32-len 2
attr WR_Solis dev-type-U32-unpack L>
attr WR_Solis dev-type-U32_00-expr $val/100
attr WR_Solis dev-type-U32_00-format %.2f
attr WR_Solis dev-type-U32_00-len 2
attr WR_Solis dev-type-U32_00-unpack L>
attr WR_Solis dev-type-U32_111-expr $val*1000
attr WR_Solis dev-type-U32_111-len 2
attr WR_Solis dev-type-U32_111-unpack L>
attr WR_Solis group PV-Anlage
attr WR_Solis icon measure_photovoltaic_inst
attr WR_Solis obj-c33132-reading StorageControl
attr WR_Solis obj-c33132-type U16
attr WR_Solis obj-i33029-polldelay 1x
attr WR_Solis obj-i33029-reading 2_AC_Produktion_Total_kWh
attr WR_Solis obj-i33029-type U32
attr WR_Solis obj-i33049-reading DC_1_Voltage
attr WR_Solis obj-i33049-type U16_0
attr WR_Solis obj-i33050-reading DC_1_Current
attr WR_Solis obj-i33050-type U16_0
attr WR_Solis obj-i33051-reading DC_2_Voltage
attr WR_Solis obj-i33051-type U16_0
attr WR_Solis obj-i33052-reading DC_2_Current
attr WR_Solis obj-i33052-type U16_0
attr WR_Solis obj-i33057-reading PV_Power
attr WR_Solis obj-i33057-type U32
attr WR_Solis obj-i33093-reading Inverter_Temperature
attr WR_Solis obj-i33093-type S16_0
attr WR_Solis obj-i33094-reading AC_Grid_Frequency
attr WR_Solis obj-i33094-type U16_00
attr WR_Solis obj-i33095-reading Inverter_Status
attr WR_Solis obj-i33095-type U16
attr WR_Solis obj-i33116-reading Inverter_Fault_Code1
attr WR_Solis obj-i33116-type U16
attr WR_Solis obj-i33117-reading Inverter_Fault_Code2
attr WR_Solis obj-i33117-type U16
attr WR_Solis obj-i33118-reading Inverter_Fault_Code3
attr WR_Solis obj-i33118-type U16
attr WR_Solis obj-i33119-reading Inverter_Fault_Code4
attr WR_Solis obj-i33119-type U16
attr WR_Solis obj-i33120-reading Inverter_Fault_Code5
attr WR_Solis obj-i33120-type U16
attr WR_Solis obj-i33121-reading Inverter_Operation_Status
attr WR_Solis obj-i33121-type U16
attr WR_Solis obj-i33133-reading Battery_Voltage
attr WR_Solis obj-i33133-type U16_0
attr WR_Solis obj-i33134-reading Battery_Current
attr WR_Solis obj-i33134-type S16_0
attr WR_Solis obj-i33135-reading Battery_Current_Direction
attr WR_Solis obj-i33135-type U16
attr WR_Solis obj-i33137-reading AC_Backup_A_Voltage
attr WR_Solis obj-i33137-type U16_0
attr WR_Solis obj-i33138-reading AC_Backup_A_Current
attr WR_Solis obj-i33138-type U16_0
attr WR_Solis obj-i33139-reading Battery_SOC_pct
attr WR_Solis obj-i33139-type U16
attr WR_Solis obj-i33140-reading Battery_SOH_pct
attr WR_Solis obj-i33140-type U16
attr WR_Solis obj-i33147-reading AC_House_Power
attr WR_Solis obj-i33147-type U16
attr WR_Solis obj-i33148-reading AC_Backup_Power
attr WR_Solis obj-i33148-type U16
attr WR_Solis obj-i33149-reading Battery_Power
attr WR_Solis obj-i33149-type S32
attr WR_Solis obj-i33151-reading AC_Inverter_Power
attr WR_Solis obj-i33151-type S32
attr WR_Solis obj-i33157-reading AC_Inverting_Power
attr WR_Solis obj-i33157-type S16_1
attr WR_Solis obj-i33161-polldelay 20x
attr WR_Solis obj-i33161-reading 6_DC_Batterieladung_Total_kWh
attr WR_Solis obj-i33161-type U32
attr WR_Solis obj-i33165-polldelay 20x
attr WR_Solis obj-i33165-reading 5_DC_Batterieentladung_Total_kWh
attr WR_Solis obj-i33165-type U32
attr WR_Solis obj-i33169-polldelay 20x
attr WR_Solis obj-i33169-reading 7_AC_Netzbezug_Total_kWh
attr WR_Solis obj-i33169-type U32
attr WR_Solis obj-i33173-polldelay 20x
attr WR_Solis obj-i33173-reading 8_AC_Netzeinspeisung_Total_kWh
attr WR_Solis obj-i33173-type U32
attr WR_Solis obj-i33177-polldelay 20x
attr WR_Solis obj-i33177-reading AC_Load_Energy_Total_kWh
attr WR_Solis obj-i33177-type U32
attr WR_Solis obj-i33257-reading Meter_Active_A_Power
attr WR_Solis obj-i33257-type S32_000
attr WR_Solis obj-i33259-reading Meter_Active_B_Power
attr WR_Solis obj-i33259-type S32_000
attr WR_Solis obj-i33261-reading Meter_Active_C_Power
attr WR_Solis obj-i33261-type S32_000
attr WR_Solis obj-i33263-reading Meter_Total_Active_Power
attr WR_Solis obj-i33263-type S32_000
attr WR_Solis obj-i33265-reading Meter_Reactive_A_Power
attr WR_Solis obj-i33265-type S32
attr WR_Solis obj-i33267-reading Meter_Reactive_B_Power
attr WR_Solis obj-i33267-type S32
attr WR_Solis obj-i33269-reading Meter_Reactive_C_Power
attr WR_Solis obj-i33269-type S32
attr WR_Solis obj-i33271-reading Meter_Total_Reactive_Power
attr WR_Solis obj-i33271-type S32
attr WR_Solis obj-i33273-reading Meter_Apparent_A_Power
attr WR_Solis obj-i33273-type S32
attr WR_Solis obj-i33275-reading Meter_Apparent_B_Power
attr WR_Solis obj-i33275-type S32
attr WR_Solis obj-i33277-reading Meter_Apparent_C_Power
attr WR_Solis obj-i33277-type S32
attr WR_Solis obj-i33279-reading Meter_Total_Apparent_Power
attr WR_Solis obj-i33279-type S32
attr WR_Solis obj-i33281-reading Meter_PF
attr WR_Solis obj-i33281-type S16_00
attr WR_Solis obj-i33282-reading Meter_Grid_Frequency
attr WR_Solis obj-i33282-type U16_00
attr WR_Solis obj-i33283-reading Meter_Total_Active_from_Grid_Energy
attr WR_Solis obj-i33283-type U32_00
attr WR_Solis obj-i33285-reading Meter_Total_Active_to_Grid_Energy
attr WR_Solis obj-i33285-type U32_00
attr WR_Solis readingsWatcher 600,0,DC_1_Voltage,DC_2_Voltage,DC_1_Current,DC_2_Current,Battery_Power,AC_Inverter_Power,Meter_Total_Active_Power,Battery_SOC_pct,Battery_SOH_pct
attr WR_Solis room Solar
attr WR_Solis stateFormat {\
sprintf("%.0f WDC,", (ReadingsVal($name,"1_DC_PV_W",0) / 1) )  .  " " . \
sprintf("%.0f WAC,", (ReadingsVal($name,"2_AC_Produktion_W",0) / 1) )  .  " " . \
sprintf("%.0f kWh total,", (ReadingsVal($name,"2_AC_Produktion_Total_kWh",0) / 1) )  .  " " . \
sprintf("%.0f kWh heute", (ReadingsVal($name,"stat2_AC_Produktion_Total_kWhDay",0) / 1) ) \
}\

attr WR_Solis userReadings PV_1_Power { ReadingsVal($name,"DC_1_Voltage",0)\
* ReadingsVal($name,"DC_1_Current",0)},\
PV_2_Power { ReadingsVal($name,"DC_2_Voltage",0)\
* ReadingsVal($name,"DC_2_Current",0)},\
Battery_Power_tablet { ReadingsVal($name,"Battery_Current_Direction",0) ==1 ? \
ReadingsVal($name,"Battery_Power",0) * -1 / 1000: \
ReadingsVal($name,"Battery_Power",0) / 1000 }\
,1_DC_PV_W     { if (ReadingsVal($name,"PV_Power",0) > 6000) {return 0;;}   else {return ReadingsVal($name,"PV_Power",0);;}}\
,2_AC_Produktion_W { if (ReadingsVal($name,"AC_Inverter_Power",0) > 6000) {return 0;;}   else {return ReadingsVal($name,"AC_Inverter_Power",0);;}}\
,5_DC_Batterieentladung_W { (ReadingsVal($name,"Battery_Current_Direction",0) >0 ) ? \
  ReadingsVal($name,"Battery_Power",0):0}\
,6_DC_Batterieladung_W { (ReadingsVal($name,"Battery_Current_Direction",0) <1 ) ? \
ReadingsVal($name,"Battery_Power",0):0}\
,5_DC_Batterieentladung_AVG_W { int(movingAverage($name,"5_DC_Batterieentladung_W",180)) }\
,6_DC_Batterieladung_AVG_W { int(movingAverage($name,"6_DC_Batterieladung_W",180)) }\
,Inverter_Status_Txt        {my %h=(0=>'Waiting',1=>'Open Operating',2=>'Soft Run',3=>'Generating',8=>'Unknown');; $h{ReadingsVal($name,"Inverter_Status",0)}}\
,transfer:(5_DC_Batterieentladung_W|6_DC_Batterieladung_W|Battery_SOC_pct).* {\
my $val=ReadingsVal("WR_Solis","5_DC_Batterieentladung_W",0);; \
    fhem("setreading Hausakku 5_DC_Batterieentladung_W $val");;\
$val=ReadingsVal("WR_Solis","6_DC_Batterieladung_W",0);; \
    fhem("setreading Hausakku 6_DC_Batterieladung_W $val");;\
$val=ReadingsVal("WR_Solis","Battery_SOC_pct",0);; \
    fhem("setreading Hausakku Battery_SOC_pct $val");;\
    fhem("setreading Hausakku state $val");;\
;;return "done"}\

es geht um die Adresse 33132, lt. Doku "Storage control switching value" vom Datentyp U16, hier die Definition der einzelnen Bits:
Du darfst diesen Dateianhang nicht ansehen.

Ich habe das jetzt definiert mit

attr WR_Solis dev-c-defPoll 1
attr WR_Solis obj-c33132-reading StorageControl
attr WR_Solis obj-c33132-type U16
, aber da tut sich nichts. Mir ist auch noch nicht klar, wie ich die einzelnen Bits einzeln setzen kann. Hier im Forum wird immer wieder auf Coils verwiesen, aber eigentlich werden die hier nur mit WAGOs verwendet, das trifft bei mir (imho) nicht zu. Hat da jemand einen Tipp für mich, wie ich diese Bits auslese und vor allem wieder setzen kann?

liebe Grüße,
Friedhelm


macfly

mit diesen Settings bekomme ich immerhin die bit-darstellung hin:

attr WR_Solis obj-i33132-reading StorageControl-i
attr WR_Solis obj-i33132-type U16
attr WR_Solis obj-i33132-unpack B*

Aktuell ist der WR (lt. Display) auf "Max self consumption" und auf "allow charging from Grid" eingestellt, also bit0 und bit5, das macht dezimal 33, also 100001, und obige einstellung zeigt 0000000000100001 an. Daraus könnte ich via userreadings die einzelnen True/False Readings machen, aber wie setze ich die Werte?

macfly

Achso, noch ein Nachtrag:

aus der Doku zu den Function Codes:
Du darfst diesen Dateianhang nicht ansehen.

und zu den Registern:
Du darfst diesen Dateianhang nicht ansehen.

und die Adresse 33132 ist beschrieben unter:
Du darfst diesen Dateianhang nicht ansehen.

und sieht so aus:
Du darfst diesen Dateianhang nicht ansehen.

Der referenzierte Anhang 7 ist im ersten Post.

macfly

Ich bin ein bisschen weiter:

Offensichtlich hatte ich eine alte Version der Doku, in einer neueren Version werden noch folgende Register genannt:
Du darfst diesen Dateianhang nicht ansehen.
Du darfst diesen Dateianhang nicht ansehen.

Damit, und mit folgender Definition:
attr WR_Solis obj-h43110-reading StorageControl
attr WR_Solis obj-h43110-set 1
attr WR_Solis obj-h43110-type U16
attr WR_Solis obj-h43110-unpack B*

bekomme ich als Reading die Bitdarstellung des Registers (die ich am Display des Wechselrichters verifizieren konnte) und kann diesen Wert via set-befehl auch ändern:
Du darfst diesen Dateianhang nicht ansehen.
Du darfst diesen Dateianhang nicht ansehen. 

Als Reading kann ich diese Bits ja einfach als userreadings generieren, aber wie kann ich die Werte denn wohl einzeln setzen? Muss ich mir dafür ein dummy generieren, der per notify überwacht wird, oder wie macht man sowas am besten?