mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-25 22:09:21 +00:00
ch.eick: Next update
git-svn-id: https://svn.fhem.de/fhem/trunk@28417 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
0505aa593e
commit
1384d8d5ed
@ -0,0 +1,39 @@
|
||||
defmod Kia_connect MQTT2_DEVICE
|
||||
attr Kia_connect DbLogExclude .*
|
||||
attr Kia_connect DbLogInclude .*
|
||||
attr Kia_connect IODev MQTT2_FHEM_Server
|
||||
attr Kia_connect alias Kia_connect
|
||||
attr Kia_connect autocreate 1
|
||||
attr Kia_connect devicetopic bluelinky
|
||||
attr Kia_connect disable 0
|
||||
attr Kia_connect group PV Eigenverbrauch-Steuerung
|
||||
attr Kia_connect icon car
|
||||
attr Kia_connect readingList $DEVICETOPIC/status:.* { json2nameValue($EVENT) }\
|
||||
$DEVICETOPIC/location.* { json2nameValue($EVENT) }\
|
||||
$DEVICETOPIC/odometer:.* { json2nameValue($EVENT) }\
|
||||
$DEVICETOPIC/tripinfo:.* { json2nameValue($EVENT) }\
|
||||
$DEVICETOPIC/req_received:.* req_received\
|
||||
$DEVICETOPIC/req_active:.* req_active
|
||||
attr Kia_connect room MQTT2_DEVICE,Strom->Photovoltaik
|
||||
attr Kia_connect setList getOdometer req/$DEVICETOPIC/get_odometer get_odometer\
|
||||
getStatus req/$DEVICETOPIC/get_status get_status\
|
||||
getLocation req/$DEVICETOPIC/get_location get_location\
|
||||
getTripinfo req/$DEVICETOPIC/get_tripinfo\
|
||||
getAll req/$DEVICETOPIC/get_all get_all\
|
||||
setChargeTargetSoc req/$DEVICETOPIC/set_chargetargets\
|
||||
startCharge req/$DEVICETOPIC/start_charging start_charging\
|
||||
stopCharge req/$DEVICETOPIC/stop_charging stop_charging\
|
||||
stopClimate req/$DEVICETOPIC/stop_climate stop_climate\
|
||||
startClimate req/$DEVICETOPIC/start_climate\
|
||||
car_lock req/$DEVICETOPIC/car_lock car_lock\
|
||||
car_unlock req/$DEVICETOPIC/car_unlock car_unlock
|
||||
attr Kia_connect sortby 402
|
||||
attr Kia_connect stateFormat req_active
|
||||
attr Kia_connect userReadings atHomeStanding:location.* { ((abs(AttrVal("global","latitude",49.85) - ReadingsVal($NAME,"location_coord_lat",0)) <= 0.001) && (abs(AttrVal("global","longitude",8.49) - ReadingsVal($NAME,"location_coord_lon",0)) <= 0.001) && (ReadingsVal($NAME,"location_speed_value",1) == 0)) ? 'true' : 'false';;;; },\
|
||||
batSOC:status.* { ReadingsVal($NAME,"status_evStatus_batteryStatus",0);;;;},\
|
||||
connected:status.* { (ReadingsVal($NAME,"status_evStatus_batteryPlugin",0) != 0) ? 'true' : 'false';;;;},\
|
||||
charging:status.* { ReadingsVal($NAME,"status_evStatus_batteryCharge",'false');;;;},\
|
||||
targetSOC:status.* { ReadingsVal($NAME,"status_evStatus_reservChargeInfos_targetSOClist_2_targetSOClevel",0);;;;},\
|
||||
time2targetSOC:status.* { my $t = ReadingsVal($NAME,"status_evStatus_remainTime2_atc_value",1);;;; sprintf("%02d:%02d", $t/60%60, $t%60);;},\
|
||||
range:status.* { ReadingsVal($NAME,"status_evStatus_drvDistance_1_rangeByFuel_totalAvailableRange_value",0);;;;},\
|
||||
bat12v:status.* { ReadingsVal($NAME,"status_battery_batSoc",0);;;;}
|
@ -0,0 +1,782 @@
|
||||
defmod Kia_eNiro DOIF ################################################################################################################\
|
||||
## 1 Kia Connect Status Abfrage erfolgt mit MQTT2 ==> node-ret ==> Kia Connect\
|
||||
##\
|
||||
1_Status_getAll\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and [Kia_connect:req_active] eq "idle"\
|
||||
and\
|
||||
(\
|
||||
(\
|
||||
( [+00:15] ## alle 15 Minuten\
|
||||
and ([Kia_connect:atHomeStanding] eq "true" ## wenn das Auto zuhause ist\
|
||||
and [Kia_connect:charging] eq "true" ## und es geladen wird\
|
||||
or [WB_1:lp_1_ChargeStat] eq "loading") ## Oder es ist bereits an der WB_1_lp_1\
|
||||
or [:58] and [?07:00-20:00] ## ansonsten nur jede Stunde\
|
||||
)\
|
||||
or\
|
||||
(\
|
||||
[WB_1:lp_1_PlugStat] eq "Plugged in" ## Auto scheint da zu sein, es fehlt jedoch der Status\
|
||||
and [Kia_connect:atHomeStanding] eq "false"\
|
||||
)\
|
||||
)\
|
||||
## Es darf kein loop sein\
|
||||
and ::time_str2num(::ReadingsTimestamp("Kia_connect","req_active",0)) - ::time_str2num(::ReadingsTimestamp("Kia_connect","req_received",0)) > 5\
|
||||
and [Kia_connect:bat12v] > 40 ## aber die 12V Batterie sollte noch genügend Ladung haben\
|
||||
and [Heizung:opModeHotWater] ne "Aus" ## Wir sind nicht im Urlaub\
|
||||
)\
|
||||
or [$SELF:cmd_event] eq "set_cmd_1" ## Das reagiert auf den Aufruf mit "set <Device> cmd_*"\
|
||||
or [$SELF:ui_command_1] eq "Status_getAll" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
if( [$SELF:ui_command_1] eq "Status_getAll" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_before_1",[$SELF:ui_command_1]);;\
|
||||
}\
|
||||
\
|
||||
fhem_set("Kia_connect getAll");; ## beliebige Kommandos für diesen Block\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
2_Klima\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and [?Kia_connect:req_active] eq "idle"\
|
||||
and\
|
||||
( [$SELF:ui_command_2] eq "stopClimate" ## Hier wird das uiTable select ausgewertet\
|
||||
or [$SELF:ui_command_2] eq "startHeating"\
|
||||
or [$SELF:ui_command_2] eq "startCooling"\
|
||||
or [WB_1:lp_1_PlugStat] eq "no Plug" ## Das Auto wurde von der WallBox getrennt\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if ( [$SELF:ui_command_before_2] eq "startHeating" ## Das Auto sollte nur geheizt werden\
|
||||
and\
|
||||
(\
|
||||
( [$SELF:ui_command_2] eq "stopClimate" ## Das Heizen soll beendet werden\
|
||||
and [WB_1:lp_1_PlugStat] eq "Plugged in" \
|
||||
and [Kia_connect:atHomeStanding] eq "true"\
|
||||
)\
|
||||
or [WB_1:lp_1_PlugStat] eq "no Plug" ## Das Auto wurde von der WallBox getrennt\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
fhem_set("WB_1 Lademodus Stop");; ## Die Wallbox wieder abschalte\
|
||||
if (AttrVal("$SELF","verbose",0) >= 3)\
|
||||
{Log 3, "$SELF 02_Klima : Lademodus Stop"};;\
|
||||
}\
|
||||
\
|
||||
\
|
||||
set_Reading("ui_command_before_2",[$SELF:ui_command_2]);; ## Die jetzige Auswahl merken\
|
||||
\
|
||||
if ([$SELF:ui_command_2] eq "startHeating") { ## Das Auto soll geheizt werden\
|
||||
my $airTemp_value = [Kia_connect:status_airTemp_value_target_Winter];;\
|
||||
\
|
||||
if ( [WB_1:lp_1_PlugStat] eq "Plugged in" ## Ist ein Auto angeschlossen\
|
||||
and [Kia_connect:atHomeStanding] eq "true") { ## Ist es unser Auto\
|
||||
fhem_set("WB_1 Lademodus SofortLaden");; ## Es ist besser für's Heizen die Wallbox zu aktivieren\
|
||||
if (AttrVal("$SELF","verbose",0) >= 3)\
|
||||
{Log 3, "$SELF 02_Klima : Lademodus SofortLaden"};;\
|
||||
}\
|
||||
\
|
||||
fhem_set('Kia_connect startClimate {"defrost": true, "windscreenHeating": true, "temperature": '.$airTemp_value.' , "unit": "C"}');;\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 02_Klima : startHeating $airTemp_value"};;\
|
||||
}\
|
||||
if ([$SELF:ui_command_2] eq "startCooling") { ## Das Auto soll gekühlt werden\
|
||||
my $airTemp_value = [Kia_connect:status_airTemp_value_target_Sommer];;\
|
||||
\
|
||||
if ( [WB_1:lp_1_PlugStat] eq "Plugged in" ## Ist ein Auto angeschlossen\
|
||||
and [Kia_connect:atHomeStanding] eq "true") { ## Ist es unser Auto\
|
||||
fhem_set("WB_1 Lademodus NurPV");; ## Im Sommer nur mit PV Überschuss kühlen\
|
||||
if (AttrVal("$SELF","verbose",0) >= 3)\
|
||||
{Log 3, "$SELF 02_Klima : Lademodus NurPV"};;\
|
||||
}\
|
||||
\
|
||||
fhem_set('Kia_connect startClimate {"defrost": false, "windscreenHeating": false, "temperature": '.$airTemp_value.' , "unit": "C"}');;\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 02_Klima : startCooling $airTemp_value"};;\
|
||||
}\
|
||||
if ([$SELF:ui_command_2] eq "stopClimate") { ## Die Klimatisierung manuell beenden\
|
||||
fhem_set("Kia_connect ".[$SELF:ui_command_2]);; ## Die Wallbox wurde bereits weiter oben abgeschaltet\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 02_Klima : stopClimate"};;\
|
||||
}\
|
||||
fhem_set("Abfall update");; ## Den Kalender für weitere Klimatisierungen abfragen\
|
||||
\
|
||||
set_Exec("wait_Status",20,'fhem_set("Kia_connect getAll")');; ## Starte Status Abfrage etwas verzögert\
|
||||
\
|
||||
set_Reading("ui_command_2","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
3_Laden\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and [Kia_connect:req_active] eq "idle"\
|
||||
and\
|
||||
( [$SELF:ui_command_3] eq "setChargeTargetSoc" ## Hier wird das uiTable select ausgewertet\
|
||||
or [$SELF:ui_command_3] eq "startCharge"\
|
||||
or [$SELF:ui_command_3] eq "stopCharge"\
|
||||
)\
|
||||
) {\
|
||||
set_Reading("ui_command_before_3",[$SELF:ui_command_3]);;\
|
||||
\
|
||||
if ([$SELF:ui_command_3] eq "setChargeTargetSoc") {\
|
||||
my $targetSOClist_1_targetSOClevel = [Kia_connect:status_evStatus_reservChargeInfos_targetSOClist_1_targetSOClevel_target];;\
|
||||
my $targetSOClist_2_targetSOClevel = [Kia_connect:status_evStatus_reservChargeInfos_targetSOClist_2_targetSOClevel_target];;\
|
||||
fhem_set("Kia_connect setChargeTargetSoc {\"fast\": ".$targetSOClist_1_targetSOClevel.", \"slow\": ".$targetSOClist_2_targetSOClevel."}");;\
|
||||
} else {\
|
||||
fhem_set("Kia_connect ".[$SELF:ui_command_3]);; ## beliebige Kommandos für diesen Block\
|
||||
}\
|
||||
set_Exec("wait_Status",5,'fhem_set("Kia_connect getAll")');; ## Starte Status Abfrage etwas verzögert\
|
||||
set_Reading("ui_command_3","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
4_Klima_timer_heizen\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
( [[Abfall_Abfuhr:Kiaheizen_connect_time]] ## Prüfe den Kalender Eintrag\
|
||||
and [Abfall_Abfuhr:Kiaheizen_connect_date] eq $ymd ## ist es heute?\
|
||||
)\
|
||||
or\
|
||||
( [$SELF:ui_timer_mode] eq "heizen" ## Timer zum Heizen aktiv?\
|
||||
and [[$SELF:ui_timer_Start]] ## ist es soweit?\
|
||||
)\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 04_Klima_timer : startHeating"};;\
|
||||
set_Reading("ui_timer_mode","Aus");; ## Schalte die Timer Funktion ab\
|
||||
set_Reading("ui_command_2","startHeating");; ## Es soll geheizt werden\
|
||||
fhem_set("$SELF 2_Klima");; ## Aktiviere das Heizen\
|
||||
\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
5_Klima_timer_kuehlen\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
( [[Abfall_Abfuhr:Kiakuehlen_connect_time]] ## Prüfe den Kalender Eintrag\
|
||||
and [Abfall_Abfuhr:Kiakuehlen_connect_date] eq $ymd ## ist es heute?\
|
||||
)\
|
||||
or\
|
||||
( [$SELF:ui_timer_mode] eq "kuehlen" ## Timer zum Kühler aktiv?\
|
||||
and [[$SELF:ui_timer_Start]] ## ist es soweit?\
|
||||
)\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 05_Klima_timer : startCooling"};;\
|
||||
set_Reading("ui_timer_mode","Aus");; ## Schalte die Timer Funktion ab\
|
||||
set_Reading("ui_command_2","startCooling");; ## Es soll gekühlt werden\
|
||||
fhem_set("$SELF 2_Klima");; ## Aktiviere das Kühlen\
|
||||
\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
6_Auf_Zu\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and [Kia_connect:req_active] eq "idle"\
|
||||
and\
|
||||
( [$SELF:ui_command_1] eq "car_lock" ## Hier wird das uiTable select ausgewertet\
|
||||
or [$SELF:ui_command_1] eq "car_unlock"\
|
||||
)\
|
||||
) {\
|
||||
set_Reading("ui_command_before_1",[$SELF:ui_command_1]);;\
|
||||
\
|
||||
fhem_set("Kia_connect ".[$SELF:ui_command_1]);;\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 06_Auf_Zu : ".[$SELF:ui_command_1]};;\
|
||||
\
|
||||
set_Exec("wait_Status",20,'fhem_set("Kia_connect getAll")');; ## Starte Status Abfrage etwas verzögert\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
7_WB_1_lp_1\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
( [$SELF:ui_command_4] eq "SofortLaden" ## Hier wird das uiTable select ausgewertet\
|
||||
or [$SELF:ui_command_4] eq "MinPV"\
|
||||
or [$SELF:ui_command_4] eq "NurPV"\
|
||||
or [$SELF:ui_command_4] eq "Stop"\
|
||||
or [$SELF:ui_command_4] eq "Standby"\
|
||||
or [$SELF:ui_command_4] eq "Vorrang_EV"\
|
||||
or [$SELF:ui_command_4] eq "Vorrang_Bat"\
|
||||
or [$SELF:WB_1_lp_1_current_soll]\
|
||||
)\
|
||||
and [$SELF:ui_command_4] ne "12_WB_1_lp_1_Sofortladen_ende_limit"\
|
||||
and [$SELF:ui_command_4] ne "12_WB_1_Backup"\
|
||||
and [$SELF:ui_command_4] ne "10_70_beachten"\
|
||||
and [$SELF:ui_command_4] ne "10_70_beachten_ende"\
|
||||
and [$SELF:ui_command_4] ne "11_Ladebasis_berechnen"\
|
||||
and [$SELF:ui_command_4] ne "12_Stromboerse"\
|
||||
\
|
||||
) {\
|
||||
set_Reading("ui_command_before_4",[?$SELF:ui_command_4]);;\
|
||||
\
|
||||
## Die Ladebegrenzung für's SofortLaden wurde geändert\
|
||||
if ( [?$SELF:ui_command_4] eq "---" or [?$SELF:ui_command_4] eq "SofortLaden") {\
|
||||
fhem_set("WB_1 lp_1_current ".[?$SELF:WB_1_lp_1_current_soll]);; ## setze den neuen Sollwert\
|
||||
set_Reading("ui_command_before_4","Ladebegrenzung");;\
|
||||
set_Reading("ui_command_4","SofortLaden");; ## starte als nächstes das SofortLaden\
|
||||
# if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
# {Log 3, "$SELF 07_WB_1_lp_1 : lp_1_current ".[?$SELF:WB_1_lp_1_current_soll]};;\
|
||||
}\
|
||||
if ([?$SELF:ui_command_4] eq "NurPV" or [?$SELF:ui_command_4] eq "Stop") {\
|
||||
set_Reading("WB_1_lp_1_current_soll","32");; ## reset des Leistungsbegrenzung\
|
||||
fhem_set("WB_1 lp_1_current ".[?$SELF:WB_1_lp_1_current_soll]);; ## setze den neuen Sollwert\
|
||||
# if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
# {Log 3, "$SELF 07_WB_1_lp_1 : lp_1_current ".[?$SELF:WB_1_lp_1_current_soll]};;\
|
||||
}\
|
||||
if ([?$SELF:ui_command_4] eq "Vorrang_Bat" or [?$SELF:ui_command_4] eq "Vorrang_EV") {\
|
||||
if ([$SELF:ui_command_4] eq "Vorrang_EV") {\
|
||||
fhem_set("WB_1 priorityModeEVBattery 1");;\
|
||||
} else {\
|
||||
fhem_set("WB_1 priorityModeEVBattery 0");;\
|
||||
}\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 07_WB_1_lp_1 : ".[?$SELF:ui_command_4]};;\
|
||||
} else {\
|
||||
fhem_set("WB_1 Lademodus ".[?$SELF:ui_command_4]);;\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 07_WB_1_lp_1 : Lademodus ".[?$SELF:ui_command_4]};;\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_4","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
12_WB_1_lp_1_Sofortladen_ende_limit\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
( ( [WB_1:ChargeMode] eq "SofortLaden" ## LP1 ist im Sofortladen und Limitiert\
|
||||
and [$SELF:WB_1_lp_1_current_soll] < 32\
|
||||
and [WR_1:Total_Active_P_EM] > 500 ## Hier beginnt der Netzbezug\
|
||||
)\
|
||||
or [$SELF:ui_command_4] eq "12_WB_1_lp_1_Sofortladen_ende_limit"\
|
||||
)\
|
||||
) {\
|
||||
fhem_set("WB_1 Lademodus NurPV");; ## Das limitierte SofortLaden beenden und mit NurPV weiter laden\
|
||||
set_Reading("WB_1_lp_1_current_soll","32");; ## reset der Ladebegrenzung, damit es nicht vergessen wird\
|
||||
fhem_set("WB_1 lp_1_current ".[$SELF:WB_1_lp_1_current_soll]);; ## setze den neuen Sollwert\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 12_WB_1_lp_1 : Lademodus NurPV"};;\
|
||||
\
|
||||
set_Reading("ui_command_4","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
9_WB_1_Zaehler_Statistiken\
|
||||
{if( !([$SELF:state] eq "off") and ## DOIF enabled\
|
||||
[00:01]\
|
||||
) {\
|
||||
fhem("setreading WB_1 lp_1_kWhCounter_init_Day ".[WB_1:lp_1_kWhCounter]);;\
|
||||
fhem("setreading WB_1 lp_2_kWhCounter_init_Day ".[WB_1:lp_2_kWhCounter]);;\
|
||||
\
|
||||
if ($mday eq 1)\
|
||||
{\
|
||||
fhem("setreading WB_1 lp_1_kWhCounter_init_Month ".[WB_1:lp_1_kWhCounter]);;\
|
||||
fhem("setreading WB_1 lp_2_kWhCounter_init_Month ".[WB_1:lp_2_kWhCounter]);;\
|
||||
\
|
||||
if ($yday eq 0)\
|
||||
{\
|
||||
fhem("setreading WB_1 lp_1_kWhCounter_init_Year ".[WB_1:lp_1_kWhCounter]);;\
|
||||
fhem("setreading WB_1 lp_2_kWhCounter_init_Year ".[WB_1:lp_2_kWhCounter]);;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
10_70_beachten\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
( [$SELF:ui_70_basis] eq "70%_An" ## Es soll im Mittagshoch geladen werden\
|
||||
and [[WR_ctl:Yield_fc0_middayhigh_start]-[WR_ctl:Yield_fc0_middayhigh_stop]] ## Innerhalb diese Zeitraums\
|
||||
and\
|
||||
( \
|
||||
[WB_1:ChargeMode] eq "Stop" ## Noch ist kein Lademodus definiert\
|
||||
and [WB_1:lp_1_PlugStat] eq "Plugged in" ## Das Auto ist verbunden\
|
||||
\
|
||||
or\
|
||||
(\
|
||||
[WB_1:ChargeMode] eq "NurPV" ## Noch ist kein Lademodus definiert\
|
||||
and\
|
||||
( [WB_1:lp_1_ChargeStat] eq "loading" ## Das Auto ist verbunden\
|
||||
or [WB_1:lp_1_PlugStat] eq "Plugged in"\
|
||||
)\
|
||||
and ## Wenn ein stark Verbraucher läuft\
|
||||
( [StromZaehler_Heizung:SMAEM1901401955_Bezug_Wirkleistung] ## LWWP\
|
||||
or [shelly02:power_0] ## Pool \
|
||||
or [shelly05:power_0] ## Brunnen\
|
||||
or [shelly03:power] ## Waschmaschine\
|
||||
)\
|
||||
)\
|
||||
)\
|
||||
and [$SELF:ui_command_4] eq "---" \
|
||||
)\
|
||||
or\
|
||||
[$SELF:ui_command_4] eq "10_70_beachten" ## 70 % beachten neu berechnen\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
my $Starkverbraucher = ::round(\
|
||||
ReadingsVal("StromZaehler_Heizung","SMAEM1901401955_Bezug_Wirkleistung",0)\
|
||||
+ ReadingsVal("shelly02","power_0",0)\
|
||||
+ ReadingsVal("shelly05","power_0",0)\
|
||||
+ ReadingsVal("shelly03","power",0) ,0) ;;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 70 % berechnen : Starkverbraucher $Starkverbraucher"};;\
|
||||
\
|
||||
if ($Starkverbraucher < 200) {\
|
||||
$Starkverbraucher = 0;;\
|
||||
Log 3, "$SELF 70 % berechnen : Starkverbraucher $Starkverbraucher";;\
|
||||
} ;;\
|
||||
\
|
||||
my $tmp = ::round( ([?$SELF:WB_1_nurpv70dynw_soll] - $Starkverbraucher ) /100 ,0) *100 ;;\
|
||||
\
|
||||
if ($tmp < [?$SELF:WB_1_nurpv70dynw_soll]) {\
|
||||
# $tmp = [?$SELF:WB_1_nurpv70dynw_soll];;\
|
||||
if (AttrVal("$SELF","verbose",4) >= 0)\
|
||||
{Log 3, "$SELF 70 % berechnen : Starkverbraucher laufen, dynamische Basis reduziert auf $tmp"};;\
|
||||
} ;;\
|
||||
\
|
||||
set_Reading("WB_1_nurpv70dynw",$tmp);; ## Momentanen Wert merken\
|
||||
fhem("set WB_1 nurpv70dynw ".$tmp);; ## 70% Basis in der WB setzen\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0) {\
|
||||
Log 3, "$SELF 70 % berechnen : basis ".[?$SELF:WB_1_nurpv70dynw_soll]." dynw $tmp";;\
|
||||
};;\
|
||||
\
|
||||
if ( ReadingsVal("$SELF","ui_70_basis","") eq "70%_An" ## Soll 70%_beachten verwendet werden?\
|
||||
and\
|
||||
( ReadingsVal("WB_1","bool70PVDynStatus",0) eq "0" ## 70% beachten ist aus\
|
||||
or ReadingsVal("WB_1","nurpv70dynact",0) eq "0" ) ## 70% Konfiguration ist nicht aktiv\
|
||||
) {\
|
||||
\
|
||||
fhem("set WB_1 nurpv70dynact 1");; ## 70% beachten in der Konfiguration aktivieren\
|
||||
fhem("set WB_1 NurPV70Status 1");; ## 70% beachten einschalten\
|
||||
fhem("set WB_1 Lademodus NurPV");; ## Das wird nur im PV Laden Modus verwendet\
|
||||
fhem_set("WB_1 priorityModeEVBattery 1");; ## Das EV soll vor dem Speicher bevorzugt werden\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 70 % berechnen : aktiviert"};;\
|
||||
} ;;\
|
||||
\
|
||||
if ([?$SELF:ui_command_4] eq "10_70_beachten")\
|
||||
{set_Reading("ui_command_4","---")};; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
\
|
||||
10_70_beachten_auto\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
( [$SELF:ui_70_basis] eq "70%_Aus" ## Es soll im Mittagshoch geladen werden\
|
||||
and [WR_ctl:Yield_fc0_middayhigh] == 1 ## Es gibt noch ein Mittagshoch\
|
||||
and [WB_1:ChargeMode] eq "Stop" ## Noch ist kein Lademodus definiert\
|
||||
and [WB_1:lp_1_PlugStat] eq "Plugged in" ## Das Auto ist verbunden\
|
||||
## and ::round((time - ::time_str2num(::ReadingsTimestamp("$SELF","ui_70_basis",""))) /3600 ,0) > 12 ## gestern war es auch aktiviert\
|
||||
and time +2 < ## und jetzt sind noch 2 h möglich\
|
||||
::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[WR_ctl:Yield_fc0_middayhigh_stop].":00")\
|
||||
and [$SELF:ui_command_4] eq "---" \
|
||||
)\
|
||||
or\
|
||||
[$SELF:ui_command_4] eq "10_70_beachten_auto" ## 70 % beachten nochmal aktivieren\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 70%_beachten_auto : automatische Aktivierung";;\
|
||||
Log 3, "$SELF 70%_beachten_auto : bisher ".[$SELF:ui_70_basis];;\
|
||||
Log 3, "$SELF 70%_beachten_auto : letzter Lauf vor ".::round((time - ::time_str2num(::ReadingsTimestamp("$SELF","ui_70_basis",""))) /3600 ,0)." h";;\
|
||||
Log 3, "$SELF 70%_beachten_auto : bleibt noch auf ".[WB_1:ChargeMode];;\
|
||||
};;\
|
||||
## set_Reading("ui_70_basis","70%_An");; ## Die 70% Regelung aktivieren\
|
||||
fhem("setreading $SELF ui_70_basis 70%_An");;\
|
||||
\
|
||||
if ([?$SELF:ui_command_4] eq "10_70_beachten_auto")\
|
||||
{set_Reading("ui_command_4","---")};; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
\
|
||||
10_70_beachten_ende\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
( [$SELF:ui_70_basis] eq "70%_An" ## Es soll im Mittagshoch geladen werden\
|
||||
and\
|
||||
[[WR_ctl:Yield_fc0_middayhigh_stop]-00:00] ## Die Ladezeit ist rum, oder nicht gesetzt\
|
||||
and [$SELF:ui_command_4] eq "---" \
|
||||
)\
|
||||
or\
|
||||
[$SELF:ui_command_4] eq "10_70_beachten_ende" ## 70 % beachten manuell beenden\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF 70%_beachten_ende : deaktiviert";;\
|
||||
Log 3, "$SELF 70%_beachten_ende : ".[$SELF:ui_70_basis];;\
|
||||
Log 3, "$SELF 70%_beachten_ende : ".[WR_ctl:Yield_fc0_middayhigh];;\
|
||||
Log 3, "$SELF 70%_beachten_ende : ".[WR_ctl:Yield_fc0_middayhigh_stop];;\
|
||||
Log 3, "$SELF 70%_beachten_ende : ".[WB_1:ChargeMode];;\
|
||||
Log 3, "$SELF 70%_beachten_ende : ".[WB_1:lp_1_ChargeStat];;\
|
||||
Log 3, "$SELF 70%_beachten_ende : ".[$SELF:ui_command_4];;\
|
||||
};;\
|
||||
set_Reading("ui_70_basis","70%_Aus");; ## Den Button zurück setzen\
|
||||
\
|
||||
if ([?$SELF:ui_command_4] eq "10_70_beachten_ende") { ## wenn es manuell umgeschaltet wurde\
|
||||
fhem("set WB_1 Lademodus NurPV") ## auf NurPV zurückfallen\
|
||||
}\
|
||||
else { ## geschiet es automatisch, ist die Ladezeit abgelaufen\
|
||||
fhem("set WB_1 Lademodus Stop") ## dann auf Stop gehen (und bis morgen warten)\
|
||||
};;\
|
||||
fhem("set WB_1 NurPV70Status 0");; ## 70% beachten abschalten\
|
||||
fhem_set("WB_1 priorityModeEVBattery 0");; ## Wieder den Hausspeicher bevorzugen\
|
||||
\
|
||||
if ([?$SELF:ui_command_4] eq "10_70_beachten_ende")\
|
||||
{set_Reading("ui_command_4","---")};; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
11_Ladebasis_berechnen\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
[06:00] ## jeden Morgen einmal berechnen\
|
||||
or\
|
||||
[$SELF:ui_70_basis] eq "70%_Aus" ## oder wenn es abgeschaltet wurde\
|
||||
)\
|
||||
or\
|
||||
[$SELF:ui_command_4] eq "11_Ladebasis_berechnen" ## \
|
||||
) {\
|
||||
\
|
||||
if (time < ::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?WR_ctl:Yield_fc0_middayhigh_start].":00") ) {\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0) {Log 3, "$SELF Ladebasis_berechnen : Ladezeit noch nicht erreicht"}\
|
||||
} else {\
|
||||
if (time < ::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?WR_ctl:Yield_fc0_middayhigh_stop].":00") ) {\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0) {Log 3, "$SELF Ladebasis_berechnen : Ladezeit läuft"}\
|
||||
} else {\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0) {Log 3, "$SELF Ladebasis_berechnen : Ladezeit beendet"}\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
if ( [?$SELF:ui_70_basis] eq "70%_An"\
|
||||
and [?$SELF:ui_command_4] ne "11_Ladebasis_berechnen") { ## Nicht beenden, wenn es manuell geprüft wird\
|
||||
fhem("set WB_1 NurPV70Status 0");; ## Das 70%_beachten erstmal stoppen\
|
||||
set_Reading("ui_70_basis","70%_Aus");; ## Den Button zurück setzen\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF Ladebasis_berechnen : deaktiviert"};;\
|
||||
}\
|
||||
\
|
||||
## Wieviel kWh würden ins E-Auto rein gehen\
|
||||
my $delta_wh = ::round( (64 * ([?Kia_connect:targetSOC] - [?Kia_connect:batSOC]) / 100 *1000 *[?$SELF:WB_1_nurpv70dynw_Faktor]) , 0) ;;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF Ladebasis_berechnen : delta_wh $delta_wh"};;\
|
||||
\
|
||||
if ([?WR_ctl:Yield_fc0_middayhigh] == 1) {\
|
||||
## Wieviele Stunden ist das Mittagshoch\
|
||||
my $Mittagshoch_h = ( ::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?WR_ctl:Yield_fc0_middayhigh_stop].":00")\
|
||||
- ::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?WR_ctl:Yield_fc0_middayhigh_start].":00")) / 3600 ;;\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF Ladebasis_berechnen : Mittagshoch_h $Mittagshoch_h"};;\
|
||||
## Wie wäre die durchschnittliche Ladeleistung\
|
||||
my $charge_Power_wh = ::round( $delta_wh / $Mittagshoch_h ,0);; ## Ca. Leistung pro Stunde als Mittelwert\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF Ladebasis_berechnen : charge_Power_wh $charge_Power_wh"};;\
|
||||
\
|
||||
my $fc_Power_wh = 0;;\
|
||||
my $start = substr([?WR_ctl:Yield_fc0_middayhigh_start],0,2);; ## Start Stunde als Zähler\
|
||||
\
|
||||
for (my $i = $start;; $i < $start+$Mittagshoch_h;; $i++) {\
|
||||
$fc_Power_wh += ReadingsVal("WR_ctl","Yield_fc0_".sprintf("%02d",$i),0);; ## Summe der Prognose Leistungen\
|
||||
}\
|
||||
\
|
||||
Log 3, "$SELF Ladebasis_berechnen : fc_Power_wh $fc_Power_wh";; ## Leistungsprognose\
|
||||
my $base_70 = ::round(($fc_Power_wh/$Mittagshoch_h - $charge_Power_wh) /100 ,0) *100;; ## Nur volle 100 Watt\
|
||||
\
|
||||
if ( $base_70 > 10000 ) {\
|
||||
$base_70 = ::round((9000 - $charge_Power_wh) /100 ,0) *100;;\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF Ladebasis_berechnen : Der Forecast Übersteigt die maximale 70% Regelung"};;\
|
||||
}\
|
||||
\
|
||||
if ($base_70 < 2000) { ## das ist das openWB minimum\
|
||||
# $base_70 = [?$SELF:WB_1_nurpv70dynw_soll];;\
|
||||
$base_70 = 2000;;\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF Ladebasis_berechnen : Das Auto kann an diesem Tag nicht mit 70% Regelung voll geladen werden"};;\
|
||||
}\
|
||||
\
|
||||
set_Reading("WB_1_nurpv70dynw_soll",$base_70);; ## 70 % Basis für die Wallbox\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF Ladebasis_berechnen : 70% Basis $base_70"};;\
|
||||
}\
|
||||
\
|
||||
if ([?$SELF:ui_command_4] eq "11_Ladebasis_berechnen")\
|
||||
{set_Reading("ui_command_4","---")};; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 12 Stromboerse\
|
||||
##\
|
||||
12_Stromboerse\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(( [WR_ctl:Yield_fc0_day] < [WR_1_Speicher_1_ExternControl:SpeicherMinSOC_fc1_Limit] ## Im Herbst/Winter ist wenig zu erwarten\
|
||||
and [WB_1:lp_1_PlugStat] eq "Plugged in" \
|
||||
# and [Kia_connect:atHomeStanding] eq "true" ## wenn das Auto zuhause ist\
|
||||
\
|
||||
and [$SELF:SpeicherStromboerse] eq "Tibber" ## Soll Tibber verwendet werden?\
|
||||
and [EVU_Tibber_connect:fc0_trigger] ## Wurde der Trigger geändert\
|
||||
)\
|
||||
or [$SELF:ui_command_4] eq "12_Stromboerse" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if ([?EVU_Tibber_connect:fc0_trigger] eq "on") {\
|
||||
set_Reading("SpeicherTriggerLaden","An");;\
|
||||
\
|
||||
fhem_set("WB_1 Lademodus SofortLaden");;\
|
||||
if (AttrVal("$SELF","verbose",0) >= 3)\
|
||||
{Log 3, "$SELF 12_Stromboerse : Lademodus SofortLaden"};;\
|
||||
\
|
||||
} else {\
|
||||
set_Reading("SpeicherTriggerLaden","Aus");;\
|
||||
\
|
||||
fhem_set("WB_1 Lademodus Stop");;\
|
||||
if (AttrVal("$SELF","verbose",0) >= 3)\
|
||||
{Log 3, "$SELF 12_Stromboerse : Lademodus Stop"};;\
|
||||
\
|
||||
}\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF 12_Stromboerse : ".[EVU_Tibber_connect:fc0_trigger]." by ".[$SELF:SpeicherStromboerse]};;\
|
||||
\
|
||||
set_Reading("ui_command_4","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 13 WB_1_Backup\
|
||||
##\
|
||||
13_WB_1_Backup\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
( [02:30]\
|
||||
and $mday == 1 ## \
|
||||
)\
|
||||
or\
|
||||
[$SELF:ui_command_4] eq "13_WB_1_Backup" ## \
|
||||
) {\
|
||||
fhem("setreading $SELF backup running");;\
|
||||
my $openwbBackupURL = AttrVal("$SELF", "openWB_lp1_Url", "http://openwb") . "/openWB/web/settings/backup.php";;\
|
||||
::HttpUtils_NonblockingGet( { \
|
||||
url=>$openwbBackupURL, timeout=>120, callback=>sub() {\
|
||||
my ($hash, $err, $ret) = @_;;\
|
||||
if ($err || ($ret !~ "Backup-Datei backup.tar.gz erfolgreich erstellt.")) {\
|
||||
fhem("setreading $SELF backup error creating backup: $err $ret");;\
|
||||
} else {\
|
||||
fhem("setreading $SELF backup downloading");; \
|
||||
my $openwbDownloadURL = AttrVal("$SELF", "openWB_lp1_Url", "http://openwb") . "/openWB/web/backup/backup.tar.gz";;\
|
||||
my $BackupDir = AttrVal("$SELF", "openWB_BackupDir", "././www");;\
|
||||
::HttpUtils_NonblockingGet({ \
|
||||
url=>$openwbDownloadURL, timeout=>120, callback=>sub() {\
|
||||
my ($hash, $err, $data) = @_;;\
|
||||
my $filename = "$BackupDir/".sprintf("%d%02d%02d",$year,$month,$mday)."_openwb_lp1_backup.tar.gz";;\
|
||||
if(open(FH, ">$filename")) {\
|
||||
print FH $data;;\
|
||||
close(FH);; \
|
||||
fhem("setreading $SELF backup $filename");;\
|
||||
} else {\
|
||||
fhem("setreading $SELF backup error downloading $filename");;\
|
||||
}\
|
||||
} # End URL=>\
|
||||
});; # End HttpUtils_NonblockingGet\
|
||||
}\
|
||||
} # End URL=>\
|
||||
});; # End HttpUtils_NonblockingGet\
|
||||
\
|
||||
if ([?$SELF:ui_command_4] eq "12_WB_1_Backup")\
|
||||
{set_Reading("ui_command_4","---")};; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
|
||||
attr Kia_eNiro userattr openWB_lp1_Url openWB_lp2_Url openWB_BackupDir
|
||||
attr Kia_eNiro DbLogExclude .*
|
||||
attr Kia_eNiro disable 0
|
||||
attr Kia_eNiro group PV Eigenverbrauch-Steuerung
|
||||
attr Kia_eNiro icon car
|
||||
attr Kia_eNiro openWB_BackupDir ./backup
|
||||
attr Kia_eNiro openWB_lp1_Url http://192.168.178.61
|
||||
attr Kia_eNiro openWB_lp2_Url http://192.168.178.62
|
||||
attr Kia_eNiro room 2_PV_Steuerung,Strom->Photovoltaik
|
||||
attr Kia_eNiro sortby 401
|
||||
attr Kia_eNiro uiTable {\
|
||||
package ui_Table;;\
|
||||
## $TR{0} = "style='color:yellow;;text-align:left;;font-weight:bold;;font-size:18px'";; ## Reihe 0 für Überschrift\
|
||||
$TABLE = "style='width:100%;;'";;\
|
||||
\
|
||||
$TD{0..9}{0} = "align='center' style='font-size:16px;;border-right-style:solid;;border-color:darkgreen;;border-right-width:2px;;width:26%'";;\
|
||||
\
|
||||
$TD{0..9}{1} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:36%;;font-weight:bold;;'";;\
|
||||
$TD{0..9}{2..4} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:8%;;text-align:center;;'";;\
|
||||
$TD{0..9}{5} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:2px;;width:8%;;text-align:center;;'";;\
|
||||
\
|
||||
sub FUNC_batt {\
|
||||
my($val)=@_;;\
|
||||
my $ret="position:absolute;;left:".(90*$val/100)."px;;width:90px;;height:20px;;background:linear-gradient( to right,#F8F8E0 ".(90-(90*$val/100))."px,rgba(0,0,0,0) ".(90-(90*$val/100))."px);;";;\
|
||||
return $ret;;\
|
||||
}\
|
||||
sub FUNC_Status {\
|
||||
my($value, $min, $colorMin, $statusMin, $colorMiddel, $statusMiddle, $max, $colorMax, $statusMax)=@_;;\
|
||||
my $ret = ($value < $min)? '<span style="color:'.$colorMin.'">'.$statusMin.'</span>' : ($value > $max)? '<span style="color:'.$colorMax.'">'.$statusMax.'</span>' : '<span style="color:'.$colorMiddel.'">'.$statusMiddle.'</span>';;\
|
||||
return $ret;;\
|
||||
}\
|
||||
sub FUNC_Status_Laden {\
|
||||
my($car)=@_;;\
|
||||
my $charge = (::ReadingsVal($car,"charging","false") eq "true");;\
|
||||
my $athome = (::ReadingsVal($car,"atHomeStanding","false") eq "true");;\
|
||||
my $chargeathome = ($charge && $athome);;\
|
||||
my $connectedathome = ($athome && ::ReadingsVal($car,"connected","false") eq "true");;\
|
||||
\
|
||||
my $ret = ($chargeathome ? "lädt zu Hause" : ($connectedathome ? "angeschlossen zu Hause" : ($athome ? "zu Hause" : ($charge ? "Lädt auswärts" : "unterwegs"))));;\
|
||||
return $ret;;\
|
||||
}\
|
||||
sub FUNC_tire {\
|
||||
my($car)=@_;;\
|
||||
my $ret = '<span style="color:green">Reifendruck okay</span>';;\
|
||||
\
|
||||
if (::ReadingsVal($car,"status_tirePressureLamp_tirePressureLampAll","1") != 0) {\
|
||||
my $VL = (::ReadingsVal($car,"status_tirePressureLamp_tirePressureLampFL","1") eq "0")?0:1;;\
|
||||
my $HL = (::ReadingsVal($car,"status_tirePressureLamp_tirePressureLampRL","1") eq "0")?0:1;;\
|
||||
my $VR = (::ReadingsVal($car,"status_tirePressureLamp_tirePressureLampFR","1") eq "0")?0:1;;\
|
||||
my $HR = (::ReadingsVal($car,"status_tirePressureLamp_tirePressureLampRR","1") eq "0")?0:1;;\
|
||||
$ret = '<span style="color:red">Reifen Störung<br>';;\
|
||||
if ($VL == 1){$ret.=' /VL'};;\
|
||||
if ($VR == 1){$ret.=' /VR'};;\
|
||||
if ($HL == 1){$ret.=' /HL'};;\
|
||||
if ($HR == 1){$ret.=' /HR'};;\
|
||||
$ret = $ret.'</span>';;\
|
||||
}\
|
||||
return $ret;;\
|
||||
}\
|
||||
sub FUNC_door {\
|
||||
my($car)=@_;;\
|
||||
my $ret = '<span style="color:green">Türen okay<br></span>';;\
|
||||
\
|
||||
if (::ReadingsVal($car,"status_doorLock","false") ne "true") {\
|
||||
my $VL = (::ReadingsVal($car,"status_doorOpen_frontLeft",1) == 0)?0:1;;\
|
||||
my $HL = (::ReadingsVal($car,"status_doorOpen_backLeft",1) == 0)?0:1;;\
|
||||
my $VR = (::ReadingsVal($car,"status_doorOpen_frontRight",1) == 0)?0:1;;\
|
||||
my $HR = (::ReadingsVal($car,"status_doorOpen_backRight",1) == 0)?0:1;;\
|
||||
$ret = '<span style="color:red">Tür offen<br>';;\
|
||||
if ($VL == 1){$ret.=' /VL'};;\
|
||||
if ($VR == 1){$ret.=' /VR'};;\
|
||||
if ($HL == 1){$ret.=' /HL'};;\
|
||||
if ($HR == 1){$ret.=' /HR'};;\
|
||||
$ret = $ret.'</span>';;\
|
||||
}\
|
||||
if (::ReadingsVal($car,"status_trunkOpen","true") eq "true") {\
|
||||
$ret.='<span style="color:red"> Kofferraum offen</span>';;\
|
||||
}\
|
||||
if (::ReadingsVal($car,"status_hoodOpen","true") eq "true") {\
|
||||
$ret.='<span style="color:red"> Motorhaube offen</span>';;\
|
||||
}\
|
||||
return $ret;;\
|
||||
}\
|
||||
\
|
||||
}\
|
||||
\
|
||||
"$SELF"|\
|
||||
"Kommando ".::ReadingsTimestamp("Kia_connect","status_time","")."<dd>Auswahl / Kommunikation / Tacho / Info Status</dd>"|\
|
||||
widget([$SELF:ui_command_1],"uzsuDropDown,---,Status_getAll,car_lock,car_unlock")|\
|
||||
(([Kia_connect:req_active] eq "idle")?'<span style="color:green">idle</span>' : '<span style="color:red">'.[Kia_connect:req_active].'</span>')|\
|
||||
(([Kia_connect:odometer_value] > [$SELF:ui_Inspektion] - 2000)?'<span style="color:red">Inspektion <br>'. ::round([Kia_connect:odometer_value],0).' km</span>' : ::round([Kia_connect:odometer_value],0)." km")|\
|
||||
FUNC_Status_Laden("Kia_connect")\
|
||||
\
|
||||
|\
|
||||
"Strombörse<dd>Auswahl / Ladefenster / Trigger Status </dd>" |\
|
||||
widget([$SELF:SpeicherStromboerse],"uzsuDropDown,Aus,Tibber") | \
|
||||
"<span style=font-weight:bold>Trigger fc0</span><br><br>".Format("trigger_0")|\
|
||||
"<span style=font-weight:bold>Trigger fc1</span><br><br>".Format("trigger_1")|\
|
||||
[EVU_Tibber_connect:fc0_trigger] \
|
||||
\
|
||||
|\
|
||||
"Accu<dd>Steuerung / Target Soc / Accu Status</dd>"|\
|
||||
widget([$SELF:ui_command_3],"uzsuDropDown,---,setChargeTargetSoc,stopCharge,startCharge")|\
|
||||
widget([Kia_connect:status_evStatus_reservChargeInfos_targetSOClist_2_targetSOClevel_target],"selectnumbers,50,10,100,0,lin")." % AC<br>".widget([Kia_connect:status_evStatus_reservChargeInfos_targetSOClist_1_targetSOClevel_target],"selectnumbers,50,10,100,0,lin")." % DC"|\
|
||||
""|\
|
||||
FUNC_Status([Kia_connect:range],150,"red",[Kia_connect:range],"orange",[Kia_connect:range],250,"green",[Kia_connect:range])." km"."<div style='border-width:2px;;border-style:solid;;border-color:gray;;position:relative;;width:90px;;height:20px;;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);;'>".STY(" ",FUNC_batt([Kia_connect:batSOC])).STY(::round([Kia_connect:batSOC],0)."%","font-size:16px;;position:absolute;;top:2px;;left:30px")."</div>"\
|
||||
\
|
||||
|"Komfort<dd>Timer / Klima / Reifen / Türen / Accu Status 12V</dd>"|\
|
||||
widget([$SELF:ui_timer_mode],"uzsuDropDown,Aus,heizen,kuehlen").widget([$SELF:ui_timer_Start],"time")|\
|
||||
((::ReadingsVal("Abfall_Abfuhr","Kiaheizen_days",0) != 0)?"Klimatisierung<br>".[Abfall_Abfuhr:Kiaheizen_connect_date]." ".[Abfall_Abfuhr:Kiaheizen_connect_time]:(([$SELF:ui_timer_mode] ne "Aus")?"Klimatisierung<br>".[$SELF:timer_04_c04]:""))|\
|
||||
(FUNC_tire("Kia_connect")."<br>".FUNC_door("Kia_connect"))|\
|
||||
"12 V<div style='border-width:2px;;border-style:solid;;border-color:gray;;position:relative;;width:90px;;height:20px;;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);;'>".STY(" ",FUNC_batt([Kia_connect:bat12v])).STY(::round([Kia_connect:bat12v],0)."%","font-size:16px;;position:absolute;;top:2px;;left:30px")."</div>"\
|
||||
\
|
||||
|"<dd> Auswahl / Temperatur / Klima Status / Temperatur innen</dd>"|\
|
||||
widget([$SELF:ui_command_2],"uzsuDropDown,---,stopClimate,startHeating,startCooling")|\
|
||||
"Heat".widget([Kia_connect:status_airTemp_value_target_Winter],"selectnumbers,20,1,27,0,lin")."°C<br>Cool".widget([Kia_connect:status_airTemp_value_target_Sommer],"selectnumbers,16,1,25,0,lin")."°C"|\
|
||||
(([Kia_connect:status_airCtrlOn] eq "true")?'<span style="color:red">Klima läuft</span>':'<span style="color:green">Klima aus</span>')."<br>".(([Kia_connect:status_defrost] eq "true")?'Defrost ein':'Defrost aus')|\
|
||||
"Aktuell<br>".[Kia_connect:status_airTemp_value]."°C"\
|
||||
\
|
||||
"<a href='http://".::ReadingsVal("WB_1","IpAddress","0.0.0.0")."/openWB/'>Link: WB_1_lp1</a>"|\
|
||||
"WallBox <dd>Lademodus / Lade Limits / Info Status / Leistung & Ladezeit</dd>"|\
|
||||
[WB_1:ChargeMode]."<br>". widget([$SELF:ui_command_4],"uzsuDropDown,---,SofortLaden,MinPV,NurPV,Stop,Standby,Vorrang_EV,Vorrang_Bat,10_70_beachten,10_70_beachten_auto,10_70_beachten_ende,11_Ladebasis_berechnen,12_WB_1_lp_1_Sofortladen_ende_limit,12_Stromboerse,13_WB_1_Backup"). widget([$SELF:ui_70_basis],"uzsuToggle,70%_Aus,70%_An")|\
|
||||
"SofortLaden<br>limit".widget([$SELF:WB_1_lp_1_current_soll],"selectnumbers,6,1,32,0,lin")."A<br>70%_fkt ".widget([$SELF:WB_1_nurpv70dynw_Faktor],"select,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5")."<br>".(([WR_ctl:Yield_fc0_middayhigh] == 0)? "Heute kein 70% Laden möglich":([$SELF:e_Kia_eNiro_PV_ui_command_4] eq "Stop" and [$SELF:ui_70_basis] eq "70%_An")?"70%_Base ".[$SELF:WB_1_nurpv70dynw_soll]." W<br>".[?WR_ctl:Yield_fc0_middayhigh_start]." - ".[?WR_ctl:Yield_fc0_middayhigh_stop]:([$SELF:ui_70_basis] eq "70%_An")?"70%_Base ".[$SELF:WB_1_nurpv70dynw_soll]."<br>sofort - ".[?WR_ctl:Yield_fc0_middayhigh_stop]:"70% Laden<br>heute - ".[?WR_ctl:Yield_fc0_middayhigh_stop])|\
|
||||
[WB_1:lp_1_PlugStat]." ".[WB_1:lp_1_ChargeStat]|\
|
||||
[WB_1:lp_1_countPhasesInUse]."P ".[WB_1:lp_1_AConfigured]."A<br>".[WB_1:lp_1_W]." W<br>".[WB_1:lp_1_TimeRemaining]\
|
||||
\
|
||||
|\
|
||||
"Statistik <dd>Ladeleistung inklusive externe Ladung</dd>"|\
|
||||
""|\
|
||||
"heute/letztes<br>".sprintf("%5.2f / %5.2f",::ReadingsVal("WB_1","lp_1_kWhDailyCharged",0),::ReadingsVal("WB_1","lp_1_kWhChargedSincePlugged",0))|\
|
||||
"Monat/Vormonat<br>".sprintf("%03d / %03d",::round(::ReadingsVal("WB_1","lp_1_kWhCounter_Month",0)+::ReadingsVal("WB_0","Kia_eNiro_kWhCounter_Month",0),0),::ReadingsVal("LogDBRep_Statistic_previous_Month","WB_1_lp_1_kWhCounter_Month",0)+::ReadingsVal("LogDBRep_Statistic_previous_Month","WB_0_Kia_eNiro_kWhCounter_Month",0))|\
|
||||
"Jahr/Vorjahr<br>".sprintf("%04d / %04d",::ReadingsVal("WB_1","lp_1_kWhCounter_Year",0)+::ReadingsVal("WB_0","Kia_eNiro_kWhCounter_Year",0),::ReadingsVal("LogDBRep_Statistic_previous_Year","WB_1_lp_1_kWhCounter_Year",0)+::ReadingsVal("LogDBRep_Statistic_previous_Year","WB_0_Kia_eNiro_kWhCounter_Year",0))
|
||||
attr Kia_eNiro verbose 3
|
||||
|
||||
setstate Kia_eNiro 2024-01-15 18:37:57 SpeicherStromboerse Aus
|
||||
setstate Kia_eNiro 2024-01-15 18:37:24 SpeicherTriggerLaden Aus
|
||||
setstate Kia_eNiro 2024-01-19 16:29:55 WB_1_lp_1_current_soll 32
|
||||
setstate Kia_eNiro 2023-09-25 15:57:51 WB_1_nurpv70dynw 1100
|
||||
setstate Kia_eNiro 2023-09-11 17:03:42 WB_1_nurpv70dynw_Faktor 1
|
||||
setstate Kia_eNiro 2023-10-01 06:00:00 WB_1_nurpv70dynw_soll 8700
|
||||
setstate Kia_eNiro 2022-03-22 13:28:12 WR_1_Speicher_1_ExternControl_smart_laden_before ---
|
||||
setstate Kia_eNiro 2023-09-25 16:00:00 ui_70_basis 70%_Aus
|
||||
setstate Kia_eNiro 2023-08-14 11:40:13 ui_Inspektion 41500
|
||||
setstate Kia_eNiro 2024-01-24 15:58:00 ui_command_1 ---
|
||||
setstate Kia_eNiro 2024-01-20 09:38:30 ui_command_2 ---
|
||||
setstate Kia_eNiro 2024-01-19 16:29:40 ui_command_3 ---
|
||||
setstate Kia_eNiro 2024-01-19 19:55:43 ui_command_4 ---
|
||||
setstate Kia_eNiro 2024-01-20 20:12:20 ui_command_before_1 ---
|
||||
setstate Kia_eNiro 2024-01-20 09:38:30 ui_command_before_2 ---
|
||||
setstate Kia_eNiro 2024-01-19 16:29:40 ui_command_before_3 ---
|
||||
setstate Kia_eNiro 2024-01-19 19:55:43 ui_command_before_4 ---
|
||||
setstate Kia_eNiro 2024-01-17 12:15:42 ui_timer_Start 12:50
|
||||
setstate Kia_eNiro 2024-01-17 17:49:46 ui_timer_mode Aus
|
@ -0,0 +1,413 @@
|
||||
defmod WB_0 DOIF ################################################################################################################\
|
||||
## 1_add fügt einen neuen Eintrag in die Datenbank ein\
|
||||
##\
|
||||
1_add\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
([$SELF:ui_command_1] eq "add" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
my $logdbrep = "LogDBRep_WB_0_SQL";;\
|
||||
my $BEV = ::ReadingsVal("$SELF","BEV","---");;\
|
||||
my $TIMESTAMP = ::ReadingsVal("$SELF","BEV_DateTime","0000-00-00 00:00").":00";;\
|
||||
$TIMESTAMP =~ s/_/ /;;\
|
||||
my $year = substr($TIMESTAMP,0,4);;\
|
||||
my $month = substr($TIMESTAMP,5,2);;\
|
||||
# print("$year.$month \n");;\
|
||||
my $TYPE = ::ReadingsVal("$SELF","BEV_TYPE","none");;\
|
||||
my $READING = $BEV."_kWhActualCharged";;\
|
||||
my $VALUE = ::ReadingsVal("$SELF","BEV_kWhActualCharged","0");;\
|
||||
my $ret = 0;;\
|
||||
\
|
||||
if ($TYPE eq "kostenfrei") {\
|
||||
set_Reading("BEV_kWhActualCost","0") ;;\
|
||||
}\
|
||||
\
|
||||
if( $BEV ne "---"\
|
||||
and $TIMESTAMP ne "00-00-00 00:00:00"\
|
||||
and ($VALUE ne "0" or $TYPE eq "kostenfrei")\
|
||||
) {\
|
||||
\
|
||||
## Eintragen der Ladeleistung\
|
||||
# print("1 $TIMESTAMP $SELF $TYPE $READING $VALUE \n");;\
|
||||
$ret = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
|
||||
VALUES('".$TIMESTAMP."','$SELF','".$TYPE."','".$READING."','".$VALUE."')\
|
||||
ON DUPLICATE KEY UPDATE\
|
||||
TYPE='".$TYPE."',\
|
||||
VALUE='".$VALUE."';;") ;;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3 and $ret > 1) {\
|
||||
Log 3, "$SELF 1_1 : ".$ret;;\
|
||||
}\
|
||||
\
|
||||
## Eintragen der Ladekosten\
|
||||
$READING = $BEV."_kWhActualCost";;\
|
||||
$VALUE = ::ReadingsVal("$SELF","BEV_kWhActualCost","0");;\
|
||||
# print("2 $TIMESTAMP $SELF $TYPE $READING $VALUE \n");;\
|
||||
\
|
||||
$ret = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
|
||||
VALUES('".$TIMESTAMP."','$SELF','".$TYPE."','".$READING."','".$VALUE."')\
|
||||
ON DUPLICATE KEY UPDATE\
|
||||
TYPE='".$TYPE."',\
|
||||
VALUE='".$VALUE."';;") ;;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3 and $ret > 1) {\
|
||||
Log 3, "$SELF 1_2 : ".$ret;;\
|
||||
}\
|
||||
\
|
||||
## Berechnung des Monats Wertes\
|
||||
$READING = $BEV."_kWhCounter_Month";;\
|
||||
# print("3 $TIMESTAMP $SELF $TYPE $READING $VALUE \n");;\
|
||||
$ret = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
|
||||
SELECT TIMESTAMP,DEVICE,TYPE,READING,VALUE\
|
||||
FROM\
|
||||
(SELECT\
|
||||
concat(last_day('".$TIMESTAMP."'), ' 23:59:00') AS TIMESTAMP,\
|
||||
DEVICE,\
|
||||
'manuell' AS TYPE,\
|
||||
'".$READING."' AS READING,\
|
||||
sum(VALUE) AS VALUE\
|
||||
FROM history\
|
||||
WHERE DEVICE='$SELF'\
|
||||
AND READING = '".$BEV."_kWhActualCharged'\
|
||||
AND YEAR(TIMESTAMP) = YEAR('".$TIMESTAMP."')\
|
||||
AND MONTH(TIMESTAMP) = MONTH('".$TIMESTAMP."')\
|
||||
) t1\
|
||||
ON DUPLICATE KEY UPDATE\
|
||||
VALUE = t1.VALUE ;;") ;;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3 and $ret > 2) {\
|
||||
Log 3, "$SELF 1_3 : ".$ret;;\
|
||||
}\
|
||||
\
|
||||
## Setzen des Monats Wertes als reading\
|
||||
# print("4 $TIMESTAMP $SELF $TYPE $READING $VALUE \n");;\
|
||||
$ret = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
SELECT VALUE FROM history\
|
||||
WHERE DEVICE='$SELF'\
|
||||
AND READING='".$READING."'\
|
||||
AND YEAR(TIMESTAMP) = YEAR(curdate())\
|
||||
AND MONTH(TIMESTAMP) = MONTH(curdate()) ;;") ;;\
|
||||
set_Reading($READING,$ret) ;;\
|
||||
\
|
||||
## Berechnung des Jahres Wertes\
|
||||
$READING = $BEV."_kWhCounter_Year";;\
|
||||
$ret = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
|
||||
SELECT TIMESTAMP,DEVICE,TYPE,READING,VALUE\
|
||||
FROM\
|
||||
(SELECT\
|
||||
concat(last_day('".$TIMESTAMP."'), ' 23:59:00') AS TIMESTAMP,\
|
||||
DEVICE,\
|
||||
'manuell' AS TYPE,\
|
||||
'".$READING."' AS READING,\
|
||||
sum(VALUE) AS VALUE\
|
||||
FROM history\
|
||||
WHERE DEVICE='$SELF'\
|
||||
AND READING = '".$BEV."_kWhActualCharged'\
|
||||
AND YEAR(TIMESTAMP) = YEAR('".$TIMESTAMP."')\
|
||||
AND MONTH(TIMESTAMP) <= MONTH('".$TIMESTAMP."')\
|
||||
) t1\
|
||||
ON DUPLICATE KEY UPDATE\
|
||||
VALUE = t1.VALUE ;;") ;;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3 and $ret > 2) {\
|
||||
Log 3, "$SELF 1_4 : ".$ret;;\
|
||||
}\
|
||||
\
|
||||
## Setzen des Jahres Wertes als reading\
|
||||
# print("5 $TIMESTAMP $SELF $TYPE $READING $VALUE \n");;\
|
||||
$ret = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
SELECT VALUE FROM history\
|
||||
WHERE DEVICE='$SELF'\
|
||||
AND READING='".$READING."'\
|
||||
AND MONTH(TIMESTAMP) <= MONTH(curdate())\
|
||||
ORDER BY TIMESTAMP DESC\
|
||||
LIMIT 1 ;;") ;;\
|
||||
set_Reading($READING,$ret) ;;\
|
||||
\
|
||||
## Anzeigen der bisherigen Einträge\
|
||||
my $report = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
SELECT TIMESTAMP,DEVICE,TYPE,READING,VALUE FROM history\
|
||||
WHERE DEVICE = '$SELF'\
|
||||
AND TYPE != 'manuell'\
|
||||
AND TIMESTAMP>DATE_ADD('".$TIMESTAMP."',INTERVAL -1 MONTH)\
|
||||
AND TIMESTAMP<DATE_ADD('".$TIMESTAMP."',INTERVAL +1 MONTH)\
|
||||
ORDER BY TIMESTAMP DESC, READING;;") ;;\
|
||||
if ($report ne "1") {\
|
||||
$report =~ s/\n/<br>/g;;\
|
||||
$report =~ s/\|/ \| /g;;\
|
||||
set_Reading("BEV_last",$report);;\
|
||||
}\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF 1_5 : add line ".$TIMESTAMP." $SELF Kia_eNiro_kWhCounter*";;\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
2_delete\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
([$SELF:ui_command_1] eq "delete" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
my $logdbrep = "LogDBRep_WB_0_SQL";;\
|
||||
my $BEV = ::ReadingsVal("$SELF","BEV","---");;\
|
||||
my $TIMESTAMP = ::ReadingsVal("$SELF","BEV_DateTime","0000-00-00 00:00").":00";;\
|
||||
$TIMESTAMP =~ s/_/ /;;\
|
||||
my $TYPE = ::ReadingsVal("$SELF","BEV_TYPE","none");;\
|
||||
my $READING = $BEV."_kWhActual%";;\
|
||||
my $ret = 0;;\
|
||||
if( $BEV ne "---"\
|
||||
and $TYPE ne "none"\
|
||||
and $TIMESTAMP ne "00-00-00 00:00:00"\
|
||||
) {\
|
||||
\
|
||||
## Löschen der Ladeleistung\
|
||||
$ret = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
DELETE FROM history\
|
||||
WHERE TIMESTAMP = '".$TIMESTAMP."'\
|
||||
AND DEVICE = '$SELF'\
|
||||
AND TYPE = '".$TYPE."'\
|
||||
AND READING LIKE '".$READING."';;") ;;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3 and $ret > 2) {\
|
||||
Log 3, "$SELF 2_1 : ".$ret;;\
|
||||
}\
|
||||
\
|
||||
## Berechnung des Monats Wertes\
|
||||
$READING = $BEV."_kWhCounter_Month";;\
|
||||
$ret = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
|
||||
SELECT TIMESTAMP,DEVICE,TYPE,READING,VALUE\
|
||||
FROM\
|
||||
(SELECT\
|
||||
concat(last_day('".$TIMESTAMP."'), ' 23:59:00') AS TIMESTAMP,\
|
||||
'$SELF' AS DEVICE,\
|
||||
'manuell' AS TYPE,\
|
||||
'".$READING."' AS READING,\
|
||||
sum(VALUE) AS VALUE\
|
||||
FROM\
|
||||
(SELECT VALUE\
|
||||
FROM history\
|
||||
WHERE DEVICE='$SELF'\
|
||||
AND READING = '".$BEV."_kWhActualCharged'\
|
||||
AND YEAR(TIMESTAMP) = YEAR('".$TIMESTAMP."')\
|
||||
AND MONTH(TIMESTAMP) = MONTH('".$TIMESTAMP."')\
|
||||
UNION\
|
||||
SELECT 0 AS VALUE\
|
||||
) t1\
|
||||
) t2\
|
||||
ON DUPLICATE KEY UPDATE\
|
||||
VALUE = t2.VALUE ;;") ;;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3 and $ret > 2) {\
|
||||
Log 3, "$SELF 2_2 : ".$ret;;\
|
||||
}\
|
||||
\
|
||||
## Setzen des Monats Wertes als reading\
|
||||
$ret = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
SELECT VALUE FROM history\
|
||||
WHERE DEVICE='$SELF'\
|
||||
AND READING='".$READING."'\
|
||||
AND MONTH(TIMESTAMP) = MONTH('".$TIMESTAMP."') ;;") ;;\
|
||||
set_Reading($READING,$ret) ;;\
|
||||
\
|
||||
## Berechnung des Jahres Wertes\
|
||||
$READING = $BEV."_kWhCounter_Year";;\
|
||||
$ret = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
|
||||
SELECT TIMESTAMP,DEVICE,TYPE,READING,VALUE\
|
||||
FROM\
|
||||
(SELECT\
|
||||
concat(last_day('".$TIMESTAMP."'), ' 23:59:00') AS TIMESTAMP,\
|
||||
DEVICE,\
|
||||
'manuell' AS TYPE,\
|
||||
'".$READING."' AS READING,\
|
||||
sum(VALUE) AS VALUE\
|
||||
FROM history\
|
||||
WHERE DEVICE='$SELF'\
|
||||
AND READING = '".$BEV."_kWhActualCharged'\
|
||||
AND YEAR(TIMESTAMP) = YEAR('".$TIMESTAMP."')\
|
||||
AND MONTH(TIMESTAMP) <= MONTH('".$TIMESTAMP."')\
|
||||
) t1\
|
||||
ON DUPLICATE KEY UPDATE\
|
||||
VALUE = t1.VALUE ;;") ;;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3 and $ret > 2) {\
|
||||
Log 3, "$SELF 2_3 : ".$ret;;\
|
||||
}\
|
||||
\
|
||||
## Setzen des Jahres Wertes als reading\
|
||||
$ret = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
SELECT VALUE FROM history\
|
||||
WHERE DEVICE='$SELF'\
|
||||
AND READING='".$READING."'\
|
||||
AND MONTH(TIMESTAMP) <= MONTH(curdate())\
|
||||
ORDER BY TIMESTAMP DESC\
|
||||
LIMIT 1 ;;") ;;\
|
||||
set_Reading($READING,$ret) ;;\
|
||||
\
|
||||
## Anzeigen der bisherigen Einträge\
|
||||
my $report = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
SELECT TIMESTAMP,DEVICE,TYPE,READING,VALUE FROM history\
|
||||
WHERE DEVICE = '$SELF'\
|
||||
AND TYPE != 'manuell'\
|
||||
AND TIMESTAMP>DATE_ADD('".$TIMESTAMP."',INTERVAL -1 MONTH)\
|
||||
AND TIMESTAMP<DATE_ADD('".$TIMESTAMP."',INTERVAL +1 MONTH)\
|
||||
ORDER BY TIMESTAMP DESC, READING;;") ;;\
|
||||
if ($report ne "1" and $report ne "") {\
|
||||
$report =~ s/\n/<br>/g;;\
|
||||
$report =~ s/\|/ \| /g;;\
|
||||
set_Reading("BEV_last",$report);;\
|
||||
} else {\
|
||||
set_Reading("BEV_last","---");;\
|
||||
}\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF 2_5 : delete line ".$TIMESTAMP." $SELF ".$BEV."_kWhActualCharged";;\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 3_report erzeugt eine Liste von 30 Einträgen vor dem angegebenen Datum\
|
||||
##\
|
||||
3_report\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
([$SELF:ui_command_1] eq "report" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
my $logdbrep = "LogDBRep_WB_0_SQL";;\
|
||||
my $BEV = ::ReadingsVal("$SELF","BEV","---");;\
|
||||
my $TIMESTAMP = ::ReadingsVal("$SELF","BEV_DateTime","0000-00-00 00:00").":00";;\
|
||||
$TIMESTAMP =~ s/_/ /;;\
|
||||
my $ret = 0;;\
|
||||
if( $BEV ne "---"\
|
||||
and $TIMESTAMP ne "00-00-00 00:00:00"\
|
||||
) {\
|
||||
\
|
||||
my $report = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
SELECT TIMESTAMP,DEVICE,TYPE,READING,VALUE FROM history\
|
||||
WHERE DEVICE = '$SELF'\
|
||||
AND TIMESTAMP < LAST_DAY('".$TIMESTAMP."') + INTERVAL 1 DAY\
|
||||
ORDER BY TIMESTAMP DESC, READING\
|
||||
LIMIT 24;;") ;;\
|
||||
if ($report ne "1") {\
|
||||
$report =~ s/\n/<br>/g;;\
|
||||
## $report =~ s/\|/	;/g;;\
|
||||
## $report = "<pre>".$report."</pre>";;\
|
||||
$report =~ s/\|/ \| /g;;\
|
||||
set_Reading("BEV_last",$report);;\
|
||||
}\
|
||||
\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 3_report erzeugt eine Liste von 30 Einträgen vor dem angegebenen Datum\
|
||||
##\
|
||||
3_report_clear\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
([$SELF:ui_command_1] eq "report_clear" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
set_Reading("BEV_last","Kein Report abgerufen");;\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}
|
||||
attr WB_0 DbLogExclude .*
|
||||
attr WB_0 disable 0
|
||||
attr WB_0 group PV Eigenverbrauch-Steuerung
|
||||
attr WB_0 icon car
|
||||
attr WB_0 room Strom->Photovoltaik
|
||||
attr WB_0 sortby 404
|
||||
attr WB_0 uiTable {\
|
||||
package ui_Table;;\
|
||||
## $TR{0} = "style='color:yellow;;text-align:left;;font-weight:bold;;font-size:18px'";; ## Reihe 0 für Überschrift\
|
||||
$TABLE = "style='width:100%;;'";;\
|
||||
\
|
||||
$TD{0..3}{0} = "align='center' style='font-size:16px;;border-right-style:solid;;border-color:darkgreen;;border-right-width:2px;;width:26%'";;\
|
||||
\
|
||||
$TD{0..3}{1} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:36%;;font-weight:bold;;'";;\
|
||||
$TD{0..3}{2..4} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:8%;;text-align:center;;'";;\
|
||||
$TD{0..3}{5} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:2px;;width:8%;;text-align:center;;'";;\
|
||||
\
|
||||
$TD{4}{0} = "align='center' style='font-size:16px;;border-right-style:solid;;border-color:darkgreen;;border-right-width:2px;;width:26%'";;\
|
||||
$TD{4}{1} = "style='border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-bottom-width:2px;;border-right-width:1px;;width:69%;;font-weight:bold;;'";;\
|
||||
\
|
||||
}\
|
||||
\
|
||||
"$SELF"|"" |""|""|""|""\
|
||||
\
|
||||
"" |\
|
||||
widget([$SELF:BEV_DateTime],"datetime,step:15,inline:true,format:Y-m-d_H:i") |\
|
||||
widget([$SELF:BEV],"uzsuDropDown,---,Kia_eNiro,Gast")."<br>".widget([$SELF:BEV_TYPE],"uzsuDropDown,---,Karte_1,privat,kostenfrei") | widget([$SELF:BEV_kWhActualCharged],"selectnumbers,0,1,100,0,lin")."kWh" |\
|
||||
widget([$SELF:BEV_kWhActualCost],"selectnumbers,0,0.1,100,2,lin")."Eur" |\
|
||||
widget([$SELF:ui_command_1],"uzsuDropDown,---,add,delete,report,report_clear")\
|
||||
\
|
||||
"" |\
|
||||
[$SELF:BEV_DateTime].":00" |\
|
||||
[$SELF:BEV] |\
|
||||
[$SELF:BEV_kWhActualCharged]." kWh" |\
|
||||
[$SELF:BEV_kWhActualCost]." Eur" |\
|
||||
[$SELF:BEV_TYPE]\
|
||||
\
|
||||
|"Statistik Ladeleistung<dd>lp_1<br>lp_2</dd>"|\
|
||||
"<br>Kia_eNiro<br>Gast"|\
|
||||
|\
|
||||
"Monat/Vormonat<br>".sprintf("%03d / %03d",::ReadingsVal("$SELF","Kia_eNiro_kWhCounter_Month",0),::ReadingsVal("LogDBRep_Statistic_previous_Month","$SELF_Kia_eNiro_kWhCounter_Month",0))."<br>".sprintf("%03d / %03d",::ReadingsVal("$SELF","Gast_kWhCounter_Month",0),::ReadingsVal("LogDBRep_Statistic_previous_Month","$SELF_Gast_kWhCounter_Month",0))|\
|
||||
"Jahr/Vorjahr<br>".sprintf("%04d / %04d",::ReadingsVal("$SELF","Kia_eNiro_kWhCounter_Year",0),::ReadingsVal("LogDBRep_Statistic_previous_Year","$SELF_Kia_eNiro_kWhCounter_Year",0))."<br>".sprintf("%04d / %04d",::ReadingsVal("$SELF","Gast_kWhCounter_Year",0),::ReadingsVal("LogDBRep_Statistic_previous_Year","$SELF_Gast_kWhCounter_Year",0))<\
|
||||
\
|
||||
""|\
|
||||
[$SELF:BEV_last]
|
||||
attr WB_0 userReadings BEV_last:BEV_DateTime|BEV_TYPE|BEV.* {\
|
||||
my $logdbrep = "LogDBRep_WB_0_SQL";;\
|
||||
my $BEV = ::ReadingsVal("$NAME","BEV","---");;\
|
||||
my $TYPE = ::ReadingsVal("$NAME","BEV_TYPE","---");;\
|
||||
my $TIMESTAMP = ::ReadingsVal("$NAME","BEV_DateTime","0000-00-00 00:00").":00";;\
|
||||
$TIMESTAMP =~ s/_/ /;;\
|
||||
my $report = ::CommandGet(undef, $logdbrep." sqlCmdBlocking\
|
||||
SELECT TIMESTAMP,DEVICE,TYPE,READING,VALUE FROM history\
|
||||
WHERE DEVICE = '$NAME'\
|
||||
AND TYPE = '".$TYPE."'\
|
||||
AND READING LIKE '".$BEV."%'\
|
||||
AND TIMESTAMP='".$TIMESTAMP."';;") ;;\
|
||||
if ($report ne "") {\
|
||||
$report =~ s/\n/<br>/g;;\
|
||||
$report =~ s/\|/ \| /g;;\
|
||||
} else {\
|
||||
$report = "---";;\
|
||||
};;\
|
||||
$report;;\
|
||||
}
|
||||
attr WB_0 verbose 3
|
||||
|
||||
setstate WB_0 2023-01-20 19:25:31 BEV Kia_eNiro
|
||||
setstate WB_0 2024-01-12 17:40:57 BEV_DateTime 2024-01-12_19:00
|
||||
setstate WB_0 2023-12-15 19:33:25 BEV_TYPE privat
|
||||
setstate WB_0 2023-12-31 09:59:36 BEV_kWhActualCharged 40
|
||||
setstate WB_0 2023-12-31 10:00:53 BEV_kWhActualCost 27.70
|
||||
setstate WB_0 2024-01-12 17:40:57 BEV_last ---
|
||||
setstate WB_0 2024-01-01 11:39:15 ui_command_1 ---
|
@ -0,0 +1,263 @@
|
||||
defmod WB_1 MQTT2_DEVICE WB_1_MQTT2
|
||||
attr WB_1 DbLogExclude .*
|
||||
attr WB_1 DbLogInclude lp_.*_.*,.*AllChargePoints.*,ChargeMode
|
||||
attr WB_1 IODev WB_1_MQTT2
|
||||
attr WB_1 alias WB_1
|
||||
attr WB_1 autocreate 0
|
||||
attr WB_1 comment Die openWB besteht aus zwei Ladepunkten.
|
||||
attr WB_1 devicetopic openWB
|
||||
attr WB_1 disable 0
|
||||
attr WB_1 event-on-change-reading lp_.*_.*,.*AllChargePoints.*,ChargeMode,bool70.*
|
||||
attr WB_1 event-on-update-reading lp_2_kWhChargedSincePlugged_RFID
|
||||
attr WB_1 group PV Eigenverbrauch-Steuerung
|
||||
attr WB_1 icon fuel
|
||||
attr WB_1 readingList $DEVICETOPIC/global/WHouseConsumption:.* WHouseConsumption\
|
||||
$DEVICETOPIC/global/WAllChargePoints:.* WAllChargePoints\
|
||||
$DEVICETOPIC/global/ChargeMode:.* {my %h=(0=>'SofortLaden',1=>'MinPV',2=>'NurPV',3=>'Stop',4=>'Standby');; return {ChargeMode=>$h{$EVENT}}}\
|
||||
\
|
||||
$DEVICETOPIC/global/awattar/boolAwattarEnabled:.* boolAwattarEnabled\
|
||||
$DEVICETOPIC/global/awattar/ActualPriceForCharging:.* ActualPriceForCharging\
|
||||
$DEVICETOPIC/global/awattar/MaxPriceForCharging:.* MaxPriceForCharging\
|
||||
$DEVICETOPIC/global/boolRse:.* boolRse\
|
||||
$DEVICETOPIC/global/DailyYieldAllChargePointsKwh:.* DailyYieldAllChargePointsKwh\
|
||||
$DEVICETOPIC/global/rfidConfigured:.* rfidConfigured\
|
||||
$DEVICETOPIC/global/kWhCounterAllChargePoints:.* kWhCounterAllChargePoints\
|
||||
$DEVICETOPIC/global/strLastmanagementActive:.* strLastmanagementActive\
|
||||
$DEVICETOPIC/global/ETProvider/modulePath:.* modulePath\
|
||||
$DEVICETOPIC/global/cpuTemp:.* cpuTemp\
|
||||
\
|
||||
$DEVICETOPIC/system/Uptime:.* Uptime\
|
||||
$DEVICETOPIC/system/Date:.* Date\
|
||||
$DEVICETOPIC/system/Timestamp:.* Timestamp\
|
||||
$DEVICETOPIC/system/Version:.* Version\
|
||||
$DEVICETOPIC/system/IpAddress:.* IpAddress\
|
||||
$DEVICETOPIC/system/lastRfId:.* lastRfId\
|
||||
$DEVICETOPIC/system/updateInProgress:.* updateInProgress\
|
||||
$DEVICETOPIC/system/ConfiguredChargePoints:.* ConfiguredChargePoints\
|
||||
$DEVICETOPIC/system/lastlivevalues:.* lastlivevalues\
|
||||
$DEVICETOPIC/system/randomSleep:.* randomSleep\
|
||||
$DEVICETOPIC/system/wizzardDone:.* wizzardDone\
|
||||
$DEVICETOPIC/system/priceForKWh:.* priceForKWh\
|
||||
$DEVICETOPIC/system/reloadDisplay:.* reloadDisplay\
|
||||
\
|
||||
$DEVICETOPIC/evu/ASchieflast:.* ASchieflast\
|
||||
\
|
||||
$DEVICETOPIC/lp/1/P%Soc:.* lp_1_Pct_Soc\
|
||||
$DEVICETOPIC/lp/1/%Soc:.* lp_1_current_Soc\
|
||||
$DEVICETOPIC/lp/1/\x25Soc:.* lp_1__Soc\
|
||||
\
|
||||
$DEVICETOPIC/lp/1/countPhasesInUse:.* lp_1_countPhasesInUse\
|
||||
$DEVICETOPIC/lp/1/ChargePointEnabled:.* lp_1_ChargePointEnabled\
|
||||
$DEVICETOPIC/lp/1/ChargeStatus:.* lp_1_ChargeStatus\
|
||||
\
|
||||
$DEVICETOPIC/lp/1/kWhDailyCharged:.* lp_1_kWhDailyCharged\
|
||||
$DEVICETOPIC/lp/1/kWhCounter:.* lp_1_kWhCounter\
|
||||
$DEVICETOPIC/lp/1/kWhActualCharged:.* lp_1_kWhActualCharged\
|
||||
$DEVICETOPIC/lp/1/kWhChargedSincePlugged:.* lp_1_kWhChargedSincePlugged\
|
||||
$DEVICETOPIC/lp/1/energyConsumptionPer100km:.* lp_1_energyConsumptionPer100km\
|
||||
$DEVICETOPIC/lp/1/kmCharged:.* lp_1_kmCharged\
|
||||
\
|
||||
$DEVICETOPIC/lp/1/strChargePointName:.* lp_1_strChargePointName\
|
||||
$DEVICETOPIC/lp/1/TimeRemaining:.* lp_1_TimeRemaining\
|
||||
\
|
||||
$DEVICETOPIC/lp/1/PfPhase2:.* lp_1_PfPhase2\
|
||||
$DEVICETOPIC/lp/1/PfPhase3:.* lp_1_PfPhase3\
|
||||
$DEVICETOPIC/lp/1/PfPhase1:.* lp_1_PfPhase1\
|
||||
$DEVICETOPIC/lp/1/W:.* lp_1_W\
|
||||
\
|
||||
$DEVICETOPIC/lp/1/boolPlugStat:.* {my %h=(0=>'no Plug',1=>'Plugged in');; return {lp_1_PlugStat=>$h{$EVENT}}}\
|
||||
$DEVICETOPIC/lp/1/boolChargeStat:.* {my %h=(0=>'not loading',1=>'loading');; return {lp_1_ChargeStat=>$h{$EVENT}}}\
|
||||
$DEVICETOPIC/lp/1/AConfigured:.* lp_1_AConfigured\
|
||||
\
|
||||
$DEVICETOPIC/lp/1/boolChargePointConfigured:.* lp_1_boolChargePointConfigured\
|
||||
$DEVICETOPIC/lp/1/boolSocConfigured:.* lp_1_boolSocConfigured\
|
||||
$DEVICETOPIC/lp/1/boolDirectModeChargekWh:.* lp_1_boolDirectModeChargekWh\
|
||||
$DEVICETOPIC/lp/1/boolDirectChargeModeSoc:.* lp_1_boolDirectChargeModeSoc\
|
||||
$DEVICETOPIC/lp/1/boolFinishAtTimeChargeActive:.* lp_1_boolFinishAtTimeChargeActive\
|
||||
$DEVICETOPIC/lp/1/boolChargeAtNight:.* lp_1_boolChargeAtNight\
|
||||
$DEVICETOPIC/lp/1/boolSocManual:.* lp_1_boolSocManual\
|
||||
\
|
||||
$DEVICETOPIC/lp/1/AutolockStatus:.* lp_1_AutolockStatus\
|
||||
$DEVICETOPIC/lp/1/AutolockConfigured:.* lp_1_AutolockConfigured\
|
||||
\
|
||||
$DEVICETOPIC/lp/1/lastRfId:.* lp_1_lastRfId\
|
||||
$DEVICETOPIC/lp/1/pluggedladungakt:.* lp_1_pluggedladungakt\
|
||||
$DEVICETOPIC/lp/1/plugStartkWh:.* lp_1_plugStartkWh\
|
||||
$DEVICETOPIC/lp/1/MeterSerialNumber:.* lp_1_MeterSerialNumber\
|
||||
\
|
||||
\
|
||||
$DEVICETOPIC/lp/2/P%Soc:.* lp_2_Pct_Soc\
|
||||
$DEVICETOPIC/lp/2/%Soc:.* lp_2_current_Soc\
|
||||
$DEVICETOPIC/lp/2/\x25Soc:.* lp_2__Soc\
|
||||
\
|
||||
$DEVICETOPIC/lp/2/countPhasesInUse:.* lp_2_countPhasesInUse\
|
||||
$DEVICETOPIC/lp/2/ChargePointEnabled:.* lp_2_ChargePointEnabled\
|
||||
$DEVICETOPIC/lp/2/ChargeStatus:.* lp_2_ChargeStatus\
|
||||
\
|
||||
$DEVICETOPIC/lp/2/kWhDailyCharged:.* lp_2_kWhDailyCharged\
|
||||
$DEVICETOPIC/lp/2/kWhCounter:.* lp_2_kWhCounter\
|
||||
$DEVICETOPIC/lp/2/kWhActualCharged:.* lp_2_kWhActualCharged\
|
||||
$DEVICETOPIC/lp/2/kWhChargedSincePlugged:.* lp_2_kWhChargedSincePlugged\
|
||||
$DEVICETOPIC/lp/2/energyConsumptionPer100km:.* lp_2_energyConsumptionPer100km\
|
||||
$DEVICETOPIC/lp/2/kmCharged:.* lp_2_kmCharged\
|
||||
\
|
||||
$DEVICETOPIC/lp/2/strChargePointName:.* lp_2_strChargePointName\
|
||||
$DEVICETOPIC/lp/2/TimeRemaining:.* lp_2_TimeRemaining\
|
||||
\
|
||||
$DEVICETOPIC/lp/2/W:.* lp_2_W\
|
||||
\
|
||||
$DEVICETOPIC/lp/2/boolPlugStat:.* {my %h=(0=>'no Plug',1=>'Plugged in');; return {lp_2_PlugStat=>$h{$EVENT}}}\
|
||||
$DEVICETOPIC/lp/2/boolChargeStat:.* {my %h=(0=>'not loading',1=>'loading');; return {lp_2_ChargeStat=>$h{$EVENT}}}\
|
||||
$DEVICETOPIC/lp/2/AConfigured:.* lp_2_AConfigured\
|
||||
\
|
||||
$DEVICETOPIC/lp/2/boolChargePointConfigured:.* lp_2_boolChargePointConfigured\
|
||||
$DEVICETOPIC/lp/2/boolSocConfigured:.* lp_2_boolSocConfigured\
|
||||
$DEVICETOPIC/lp/2/boolDirectModeChargekWh:.* lp_2_boolDirectModeChargekWh\
|
||||
$DEVICETOPIC/lp/2/boolDirectChargeModeSoc:.* lp_2_boolDirectChargeModeSoc\
|
||||
$DEVICETOPIC/lp/2/boolFinishAtTimeChargeActive:.* lp_2_boolFinishAtTimeChargeActive\
|
||||
$DEVICETOPIC/lp/2/boolChargeAtNight:.* lp_2_boolChargeAtNight\
|
||||
$DEVICETOPIC/lp/2/boolSocManual:.* lp_2_boolSocManual\
|
||||
\
|
||||
$DEVICETOPIC/lp/2/AutolockStatus:.* lp_2_AutolockStatus\
|
||||
$DEVICETOPIC/lp/2/AutolockConfigured:.* lp_2_AutolockConfigured\
|
||||
\
|
||||
$DEVICETOPIC/lp/2/lastRfId:.* lp_2_lastRfId\
|
||||
$DEVICETOPIC/lp/2/pluggedladungakt:.* lp_2_pluggedladungakt\
|
||||
$DEVICETOPIC/lp/2/plugStartkWh:.* lp_2_plugStartkWh\
|
||||
$DEVICETOPIC/lp/2/MeterSerialNumber:.* lp_2_MeterSerialNumber\
|
||||
\
|
||||
\
|
||||
$DEVICETOPIC/boolChargeAtNight_direct:.* boolChargeAtNight_direct\
|
||||
$DEVICETOPIC/boolChargeAtNight_nurpv:.* boolChargeAtNight_nurpv\
|
||||
$DEVICETOPIC/boolChargeAtNight_minpv:.* boolChargeAtNight_minpv\
|
||||
$DEVICETOPIC/boolDisplayHouseConsumption:.* boolDisplayHouseConsumption\
|
||||
$DEVICETOPIC/boolDisplayDailyCharged:.* boolDisplayDailyCharged\
|
||||
$DEVICETOPIC/boolEvuSmoothedActive:.* boolEvuSmoothedActive\
|
||||
$DEVICETOPIC/pv/bool70PVDynActive:.* bool70PVDynActive\
|
||||
$DEVICETOPIC/pv/W70PVDyn:.* W70PVDyn\
|
||||
$DEVICETOPIC/pv/bool70PVDynStatus:.* bool70PVDynStatus\
|
||||
$DEVICETOPIC/pv/CounterTillStartPvCharging:.* CounterTillStartPvCharging\
|
||||
$DEVICETOPIC/pv/W:.* W\
|
||||
$DEVICETOPIC/config/get/pv/nurpv70dynact:.* nurpv70dynact\
|
||||
$DEVICETOPIC/config/get/pv/nurpv70dynw:.* nurpv70dynw\
|
||||
\
|
||||
$DEVICETOPIC/config/get/pv/priorityModeEVBattery:.* priorityModeEVBattery\
|
||||
$DEVICETOPIC/config/get/pv/lp/1/minSocAlwaysToChargeTo:.* lp_1_minSocAlwaysToChargeTo\
|
||||
$DEVICETOPIC/config/get/pv/lp/1/maxSoc:.* lp_1_maxSoc\
|
||||
$DEVICETOPIC/config/get/pv/lp/1/minSocAlwaysToChargeToCurrent:.* lp_1_minSocAlwaysToChargeToCurrent\
|
||||
$DEVICETOPIC/config/get/pv/lp/1/maxSocToChargeTo:.* lp_1_maxSocToChargeTo\
|
||||
$DEVICETOPIC/config/get/pv/lp/1/minCurrent:.* lp_1_minCurrent\
|
||||
$DEVICETOPIC/config/get/pv/lp/1/socLimitation:.* lp_1_socLimitation\
|
||||
$DEVICETOPIC/config/get/pv/lp/2/minCurrent:.* lp_2_minCurrent\
|
||||
$DEVICETOPIC/config/get/pv/lp/2/maxSoc:.* lp_2_maxSoc\
|
||||
$DEVICETOPIC/config/get/pv/lp/2/socLimitation:.* lp_2_socLimitation\
|
||||
$DEVICETOPIC/config/get/pv/socStopChargeAtMinPv:.* socStopChargeAtMinPv\
|
||||
$DEVICETOPIC/config/get/pv/regulationPoint:.* regulationPoint\
|
||||
$DEVICETOPIC/config/get/pv/minBatteryDischargeSocAtBattPriority:.* minBatteryDischargeSocAtBattPriority\
|
||||
$DEVICETOPIC/config/get/pv/minBatteryChargePowerAtEvPriority:.* minBatteryChargePowerAtEvPriority\
|
||||
$DEVICETOPIC/config/get/pv/minFeedinPowerBeforeStart:.* minFeedinPowerBeforeStart\
|
||||
$DEVICETOPIC/config/get/pv/boolAdaptiveCharging:.* boolAdaptiveCharging\
|
||||
$DEVICETOPIC/config/get/pv/adaptiveChargingFactor:.* adaptiveChargingFactor\
|
||||
$DEVICETOPIC/config/get/pv/batteryDischargePowerAtBattPriority:.* batteryDischargePowerAtBattPriority\
|
||||
$DEVICETOPIC/config/get/pv/boolShowPriorityIconInTheme:.* boolShowPriorityIconInTheme\
|
||||
$DEVICETOPIC/config/get/pv/maxPowerConsumptionBeforeStop:.* maxPowerConsumptionBeforeStop\
|
||||
$DEVICETOPIC/config/get/pv/stopDelay:.* stopDelay\
|
||||
$DEVICETOPIC/config/get/pv/chargeSubmode:.* chargeSubmode\
|
||||
$DEVICETOPIC/config/get/pv/minCurrentMinPv:.* minCurrentMinPv\
|
||||
$DEVICETOPIC/config/get/pv/socStartChargeAtMinPv:.* socStartChargeAtMinPv\
|
||||
$DEVICETOPIC/config/get/pv/startDelay:.* startDelay\
|
||||
$DEVICETOPIC/config/get/sofort/lp/2/energyToCharge:.* lp_2_energyToCharge\
|
||||
$DEVICETOPIC/config/get/sofort/lp/2/chargeLimitation:.* lp_2_chargeLimitation\
|
||||
$DEVICETOPIC/config/get/sofort/lp/2/socToChargeTo:.* lp_2_socToChargeTo\
|
||||
$DEVICETOPIC/config/get/sofort/lp/2/current:.* lp_2_current\
|
||||
\
|
||||
$DEVICETOPIC/config/get/sofort/lp/1/socToChargeTo:.* lp_1_socToChargeTo\
|
||||
\
|
||||
$DEVICETOPIC/config/get/sofort/lp/1/energyToCharge:.* lp_1_energyToCharge\
|
||||
$DEVICETOPIC/config/get/sofort/lp/1/chargeLimitation:.* lp_1_chargeLimitation\
|
||||
$DEVICETOPIC/config/get/sofort/lp/1/current:.* lp_1_current\
|
||||
$DEVICETOPIC/config/get/global/minEVSECurrentAllowed:.* minEVSECurrentAllowed\
|
||||
$DEVICETOPIC/config/get/global/maxEVSECurrentAllowed:.* maxEVSECurrentAllowed\
|
||||
$DEVICETOPIC/config/get/global/dataProtectionAcknoledged:.* dataProtectionAcknoledged\
|
||||
$DEVICETOPIC/config/get/global/slaveMode:.* slaveMode\
|
||||
$DEVICETOPIC/config/get/u1p3p/standbyPhases:.* standbyPhases\
|
||||
$DEVICETOPIC/config/get/u1p3p/sofortPhases:.* sofortPhases\
|
||||
$DEVICETOPIC/config/get/u1p3p/nachtPhases:.* nachtPhases\
|
||||
$DEVICETOPIC/config/get/u1p3p/minundpvPhases:.* minundpvPhases\
|
||||
$DEVICETOPIC/config/get/u1p3p/nurpvPhases:.* nurpvPhases\
|
||||
$DEVICETOPIC/config/get/u1p3p/isConfigured:.* isConfigured\
|
||||
$DEVICETOPIC/boolChargeAtNight_standby:.* boolChargeAtNight_standby\
|
||||
$DEVICETOPIC/set/system/reloadDisplay:.* reloadDisplay\
|
||||
$DEVICETOPIC/set/system/topicSender:.* topicSender\
|
||||
$DEVICETOPIC/set/lp/2/ChargePointEnabled:.* lp_2_ChargePointEnabled\
|
||||
\
|
||||
|
||||
attr WB_1 room 2_PV_Steuerung,MQTT2_DEVICE,Strom->Photovoltaik
|
||||
attr WB_1 setList Lademodus:SofortLaden,MinPV,NurPV,Stop,Standby { my %h=(SofortLaden=>'0','MinPV'=>'1',NurPV=>'2',Stop=>'3',Standby=>'4');;qq($DEVICETOPIC/set/ChargeMode $h{$EVTPART1}) }\
|
||||
DirectChargeSubMode:Aus,kWh_Laden,SoC_Laden { my %h=(Aus=>'0',kWh_Laden=>'1',SoC_Laden=>'2');;qq($DEVICETOPIC/set/lp1/DirectChargeSubMode $h{$EVTPART1}) }\
|
||||
lp_1_socToChargeTo:50,60,70,80,90,100 { qq($DEVICETOPIC/config/set/sofort/lp/1/socToChargeTo $EVTPART1) }\
|
||||
priorityModeEVBattery:0,1 { qq($DEVICETOPIC/config/set/pv/priorityModeEVBattery $EVTPART1) }\
|
||||
\
|
||||
nurpv70dynact:0,1 { qq($DEVICETOPIC/config/set/pv/nurpv70dynact $EVTPART1) }\
|
||||
nurpv70dynw { qq($DEVICETOPIC/config/set/pv/nurpv70dynw $EVTPART1) }\
|
||||
\
|
||||
NurPV70Status:0,1 { qq($DEVICETOPIC/set/pv/NurPV70Status $EVTPART1) }\
|
||||
\
|
||||
lp_1_current:10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 { qq($DEVICETOPIC/config/set/sofort/lp/1/current $EVTPART1) }\
|
||||
lp_2_current:10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 { qq($DEVICETOPIC/config/set/sofort/lp/2/current $EVTPART1) }
|
||||
attr WB_1 sortby 403
|
||||
attr WB_1 stateFormat {\
|
||||
my $MonthBefore='LogDBRep_Statistic_previous_Month';;\
|
||||
my $YearBefore='LogDBRep_Statistic_previous_Year';;\
|
||||
my $DUMMY = "";;\
|
||||
my $date = POSIX::strftime("%Y-%m-%d",localtime(time_str2num(ReadingsTimestamp($name, "lastlivevalues",0))));;\
|
||||
\
|
||||
my $ChargeMode = ReadingsVal($name,"ChargeMode","n/a");;\
|
||||
$ChargeMode = ($ChargeMode eq "SofortLaden")? "<span style='color:red'>SofortLaden</span>" : ($ChargeMode eq "MinPV")? "<span style='color:orange'>Min+PV</span>" : ($ChargeMode eq "NurPV")? "<span style='color:green'>NurPV</span>" : $ChargeMode;;\
|
||||
\
|
||||
my $lp_1_Name = ReadingsVal($name,"lp_1_strChargePointName","n/a");;\
|
||||
my $lp_1_Power = ReadingsVal($name,"lp_1_W",0)." W";;\
|
||||
my $lp_1_Power_1 = ReadingsVal($name,"lp_1_countPhasesInUse",0)."P ".ReadingsVal($name,"lp_1_AConfigured",0)."A";;\
|
||||
my $lp_1_Status_1 = ReadingsVal($name,"lp_1_PlugStat","n/a")."<br>".ReadingsVal($name,"lp_1_ChargeStat","n/a");;\
|
||||
my $lp_1_Status_2 = ReadingsVal($name,"lp_1_TimeRemaining","n/a");;\
|
||||
\
|
||||
my $lp_1_Power_d = sprintf("%5.2f / %5.2f",ReadingsVal($name,"lp_1_kWhDailyCharged",0),ReadingsVal($name,"lp_1_kWhChargedSincePlugged",0));;\
|
||||
my $lp_1_Power_m = sprintf("%03d / %03d",ReadingsVal($name,"lp_1_kWhCounter_Month",0),ReadingsVal($MonthBefore,$name."_lp_1_kWhCounter_Month",0));;\
|
||||
my $lp_1_Power_j = sprintf("%04d / %04d",ReadingsVal($name,"lp_1_kWhCounter_Year",0),ReadingsVal($YearBefore,$name."_lp_1_kWhCounter_Year",0));;\
|
||||
my $lp_1_Power_t = round(ReadingsVal($name,"lp_1_kWhCounter",0),0);;\
|
||||
\
|
||||
my $lp_2_Name = ReadingsVal($name,"lp_2_strChargePointName","n/a");;\
|
||||
my $lp_2_Power = ReadingsVal($name,"lp_2_W",0)." W";;\
|
||||
my $lp_2_Power_1 = ReadingsVal($name,"lp_2_countPhasesInUse",0)."P ".ReadingsVal($name,"lp_2_AConfigured",0)."A";;\
|
||||
my $lp_2_Status_1 = ReadingsVal($name,"lp_2_PlugStat","n/a")."<br>".ReadingsVal($name,"lp_2_ChargeStat","n/a");;\
|
||||
my $lp_2_Status_2 = "<br>".ReadingsVal($name,"lp_2_TimeRemaining","n/a");;\
|
||||
\
|
||||
my $lp_2_Power_d = sprintf("%5.2f / %5.2f",ReadingsVal($name,"lp_2_kWhDailyCharged",0),ReadingsVal($name,"lp_2_kWhChargedSincePlugged",0));;\
|
||||
my $lp_2_Power_m = sprintf("%03d / %03d",ReadingsVal($name,"lp_2_kWhCounter_Month",0),ReadingsVal($MonthBefore,$name."_lp_2_kWhCounter_Month",0));;\
|
||||
my $lp_2_Power_j = sprintf("%04d / %04d",ReadingsVal($name,"lp_2_kWhCounter_Year",0),ReadingsVal($YearBefore,$name."_lp_2_kWhCounter_Year",0));;\
|
||||
my $lp_2_Power_t = round(ReadingsVal($name,"lp_2_kWhCounter",0),0);;\
|
||||
\
|
||||
"<html><table border=2 bordercolor='darkgreen' cellspacing=0 style='width: 100%'>\
|
||||
<colgroup>\
|
||||
<col span='1' style='width: 52%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
</colgroup>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Wallbox</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold;;text-align:center'>$ChargeMode</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold;;text-align:center'>Status</td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'>Restladezeit</td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'>Leistung</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> ; ;".$lp_1_Name."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_1_Status_1."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_1_Status_2."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_1_Power_1."<br>".$lp_1_Power."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> ; ;".$lp_2_Name."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$DUMMY."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_2_Status_1."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_2_Status_2."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_2_Power_1."<br>".$lp_2_Power."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Statistik vom $date im kWh</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold;;text-align:center'>aktuell</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold;;text-align:center'>Heute / letztes</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold;;text-align:center'>Monat/Vormonat</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold;;text-align:center'>Jahr/Vorjahr</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> ; ;".$lp_1_Name."<td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_1_Power."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_1_Power_d."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_1_Power_m."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_1_Power_j."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> ; ;".$lp_2_Name."<td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_2_Power."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_2_Power_d."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_2_Power_m."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$lp_2_Power_j."</td></tr>\
|
||||
</table>\
|
||||
</html>"\
|
||||
}
|
||||
attr WB_1 userReadings lp_1_kWhCounter_Month:lp_1_kWhCounter.* { round(ReadingsVal("$NAME","lp_1_kWhCounter",0) - ReadingsVal("$NAME","lp_1_kWhCounter_init_Month",0),0) },\
|
||||
lp_1_kWhCounter_Year:lp_1_kWhCounter.* { round(ReadingsVal("$NAME","lp_1_kWhCounter",0) - ReadingsVal("$NAME","lp_1_kWhCounter_init_Year",0),0) },\
|
||||
\
|
||||
lp_2_kWhCounter_Month:lp_2_kWhCounter.* { round(ReadingsVal("$NAME","lp_2_kWhCounter",0) - ReadingsVal("$NAME","lp_2_kWhCounter_init_Month",0),0) },\
|
||||
lp_2_kWhCounter_Year:lp_2_kWhCounter.* { round(ReadingsVal("$NAME","lp_2_kWhCounter",0) - ReadingsVal("$NAME","lp_2_kWhCounter_init_Year",0),0) },\
|
||||
\
|
||||
lp_2_kWhChargedSincePlugged_RFID:lp_2_PlugStat.* { (ReadingsVal("$NAME","lp_2_PlugStat",'NULL') eq 'Plugged in')?'Wer lädt gerade?':'NULL' }
|
@ -0,0 +1,181 @@
|
||||
defmod WR_0_KSEM ModbusAttr 1 60 192.168.178.17:502 TCP
|
||||
attr WR_0_KSEM DbLogExclude .*
|
||||
attr WR_0_KSEM DbLogInclude Active_energy.*
|
||||
attr WR_0_KSEM alias WR_0_KSEM
|
||||
attr WR_0_KSEM comment Version 2021.04.07 12:00\
|
||||
Der KSEM ermittelt nicht alle Werte, welche in der SunSpec spezifiziert sind.\
|
||||
Alle nicht unterstützen Werte sind mit 0x8000 gekennzeichnet.\
|
||||
Für die nicht unterstützten Zählerstände wird die 0x800000000 ausgegeben.\
|
||||
\
|
||||
Der Summenstrom M_AC_Current (sum of active phases) kann aber durch den Endanwender selber\
|
||||
berechnet werden aus der Summe der Einzelwerte (Phase A AC current, Phase B AC current Phase C AC current)\
|
||||
\
|
||||
Die einzelnen Spannungen zwischen den Phasen können nicht gemessen werden und werden deshalb nicht ausgegeben.
|
||||
attr WR_0_KSEM dev-h-defPoll 1
|
||||
attr WR_0_KSEM dev-type-INT16-len 1
|
||||
attr WR_0_KSEM dev-type-INT16-unpack s>
|
||||
attr WR_0_KSEM dev-type-INT16_Current-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_Current_SF",0))
|
||||
attr WR_0_KSEM dev-type-INT16_Current-format %.2f
|
||||
attr WR_0_KSEM dev-type-INT16_Current-len 1
|
||||
attr WR_0_KSEM dev-type-INT16_Current-unpack s>
|
||||
attr WR_0_KSEM dev-type-INT16_Freq-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_Freq_SF",0))
|
||||
attr WR_0_KSEM dev-type-INT16_Freq-format %.2f
|
||||
attr WR_0_KSEM dev-type-INT16_Freq-len 1
|
||||
attr WR_0_KSEM dev-type-INT16_Freq-unpack s>
|
||||
attr WR_0_KSEM dev-type-INT16_PF-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_PF_SF",0))
|
||||
attr WR_0_KSEM dev-type-INT16_PF-format %.2f
|
||||
attr WR_0_KSEM dev-type-INT16_PF-len 1
|
||||
attr WR_0_KSEM dev-type-INT16_PF-unpack s>
|
||||
attr WR_0_KSEM dev-type-INT16_Power-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_Power_SF",0))
|
||||
attr WR_0_KSEM dev-type-INT16_Power-format %.2f
|
||||
attr WR_0_KSEM dev-type-INT16_Power-len 1
|
||||
attr WR_0_KSEM dev-type-INT16_Power-unpack s>
|
||||
attr WR_0_KSEM dev-type-INT16_VA-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_VA_SF",0))
|
||||
attr WR_0_KSEM dev-type-INT16_VA-format %.2f
|
||||
attr WR_0_KSEM dev-type-INT16_VA-len 1
|
||||
attr WR_0_KSEM dev-type-INT16_VA-unpack s>
|
||||
attr WR_0_KSEM dev-type-INT16_VAR-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_VAR_SF",0))
|
||||
attr WR_0_KSEM dev-type-INT16_VAR-format %.2f
|
||||
attr WR_0_KSEM dev-type-INT16_VAR-len 1
|
||||
attr WR_0_KSEM dev-type-INT16_VAR-unpack s>
|
||||
attr WR_0_KSEM dev-type-INT16_Voltage-expr $val * (10 ** ReadingsNum("$name" ,"M_AC_Voltage_SF",0))
|
||||
attr WR_0_KSEM dev-type-INT16_Voltage-format %.2f
|
||||
attr WR_0_KSEM dev-type-INT16_Voltage-len 1
|
||||
attr WR_0_KSEM dev-type-INT16_Voltage-unpack s>
|
||||
attr WR_0_KSEM dev-type-STR32-expr $val =~ s/[\00]+//gr
|
||||
attr WR_0_KSEM dev-type-STR32-format %s
|
||||
attr WR_0_KSEM dev-type-STR32-len 16
|
||||
attr WR_0_KSEM dev-type-STR32-unpack a*
|
||||
attr WR_0_KSEM dev-type-UINT16-format %s
|
||||
attr WR_0_KSEM dev-type-UINT16-len 1
|
||||
attr WR_0_KSEM dev-type-UINT32-format %s
|
||||
attr WR_0_KSEM dev-type-UINT32-len 2
|
||||
attr WR_0_KSEM dev-type-UINT64-expr $val/10000
|
||||
attr WR_0_KSEM dev-type-UINT64-format %s
|
||||
attr WR_0_KSEM dev-type-UINT64-len 4
|
||||
attr WR_0_KSEM dev-type-UINT64-unpack Q>
|
||||
attr WR_0_KSEM disable 0
|
||||
attr WR_0_KSEM event-on-change-reading Active_energy.*,M_AC_Current_.*,M_AC_Power
|
||||
attr WR_0_KSEM group PV Eigenverbrauch
|
||||
attr WR_0_KSEM icon measure_power
|
||||
attr WR_0_KSEM obj-h40072-reading M_AC_Current_A
|
||||
attr WR_0_KSEM obj-h40072-type INT16_Current
|
||||
attr WR_0_KSEM obj-h40073-reading M_AC_Current_B
|
||||
attr WR_0_KSEM obj-h40073-type INT16_Current
|
||||
attr WR_0_KSEM obj-h40074-reading M_AC_Current_C
|
||||
attr WR_0_KSEM obj-h40074-type INT16_Current
|
||||
attr WR_0_KSEM obj-h40075-reading M_AC_Current_SF
|
||||
attr WR_0_KSEM obj-h40075-type INT16
|
||||
attr WR_0_KSEM obj-h40077-reading M_AC_Voltage_AN
|
||||
attr WR_0_KSEM obj-h40077-type INT16_Voltage
|
||||
attr WR_0_KSEM obj-h40078-reading M_AC_Voltage_BN
|
||||
attr WR_0_KSEM obj-h40078-type INT16_Voltage
|
||||
attr WR_0_KSEM obj-h40079-reading M_AC_Voltage_CN
|
||||
attr WR_0_KSEM obj-h40079-type INT16_Voltage
|
||||
attr WR_0_KSEM obj-h40084-reading M_AC_Voltage_SF
|
||||
attr WR_0_KSEM obj-h40084-type INT16
|
||||
attr WR_0_KSEM obj-h40085-reading M_AC_Freq
|
||||
attr WR_0_KSEM obj-h40085-type INT16_Freq
|
||||
attr WR_0_KSEM obj-h40086-reading M_AC_Freq_SF
|
||||
attr WR_0_KSEM obj-h40086-type INT16
|
||||
attr WR_0_KSEM obj-h40087-format %.0f
|
||||
attr WR_0_KSEM obj-h40087-reading M_AC_Power
|
||||
attr WR_0_KSEM obj-h40087-type INT16_Power
|
||||
attr WR_0_KSEM obj-h40088-reading M_AC_Power_A
|
||||
attr WR_0_KSEM obj-h40088-type INT16_Power
|
||||
attr WR_0_KSEM obj-h40089-reading M_AC_Power_B
|
||||
attr WR_0_KSEM obj-h40089-type INT16_Power
|
||||
attr WR_0_KSEM obj-h40090-reading M_AC_Power_C
|
||||
attr WR_0_KSEM obj-h40090-type INT16_Power
|
||||
attr WR_0_KSEM obj-h40091-reading M_AC_Power_SF
|
||||
attr WR_0_KSEM obj-h40091-type INT16
|
||||
attr WR_0_KSEM obj-h40092-reading M_AC_VA
|
||||
attr WR_0_KSEM obj-h40092-type INT16_VA
|
||||
attr WR_0_KSEM obj-h40093-reading M_AC_VA_A
|
||||
attr WR_0_KSEM obj-h40093-type INT16_VA
|
||||
attr WR_0_KSEM obj-h40094-reading M_AC_VA_B
|
||||
attr WR_0_KSEM obj-h40094-type INT16_VA
|
||||
attr WR_0_KSEM obj-h40095-reading M_AC_VA_C
|
||||
attr WR_0_KSEM obj-h40095-type INT16_VA
|
||||
attr WR_0_KSEM obj-h40096-reading M_AC_VA_SF
|
||||
attr WR_0_KSEM obj-h40096-type INT16
|
||||
attr WR_0_KSEM obj-h40097-reading M_AC_VAR
|
||||
attr WR_0_KSEM obj-h40097-type INT16_VAR
|
||||
attr WR_0_KSEM obj-h40098-reading M_AC_VAR_A
|
||||
attr WR_0_KSEM obj-h40098-type INT16_VAR
|
||||
attr WR_0_KSEM obj-h40099-reading M_AC_VAR_B
|
||||
attr WR_0_KSEM obj-h40099-type INT16_VAR
|
||||
attr WR_0_KSEM obj-h40100-reading M_AC_VAR_C
|
||||
attr WR_0_KSEM obj-h40100-type INT16_VAR
|
||||
attr WR_0_KSEM obj-h40101-reading M_AC_VAR_SF
|
||||
attr WR_0_KSEM obj-h40101-type INT16
|
||||
attr WR_0_KSEM obj-h40102-reading M_AC_PF
|
||||
attr WR_0_KSEM obj-h40102-type INT16_PF
|
||||
attr WR_0_KSEM obj-h40103-reading M_AC_PF_A
|
||||
attr WR_0_KSEM obj-h40103-type INT16_PF
|
||||
attr WR_0_KSEM obj-h40104-reading M_AC_PF_B
|
||||
attr WR_0_KSEM obj-h40104-type INT16_PF
|
||||
attr WR_0_KSEM obj-h40105-reading M_AC_PF_C
|
||||
attr WR_0_KSEM obj-h40105-type INT16_PF
|
||||
attr WR_0_KSEM obj-h40106-reading M_AC_PF_SF
|
||||
attr WR_0_KSEM obj-h40106-type INT16
|
||||
attr WR_0_KSEM obj-h40108-reading M_Exported
|
||||
attr WR_0_KSEM obj-h40108-type UINT32
|
||||
attr WR_0_KSEM obj-h40110-reading M_Exported_A
|
||||
attr WR_0_KSEM obj-h40110-type UINT32
|
||||
attr WR_0_KSEM obj-h40112-reading M_Exported_B
|
||||
attr WR_0_KSEM obj-h40112-type UINT32
|
||||
attr WR_0_KSEM obj-h40114-reading M_Exported_C
|
||||
attr WR_0_KSEM obj-h40114-type UINT32
|
||||
attr WR_0_KSEM obj-h40116-reading M_Imported
|
||||
attr WR_0_KSEM obj-h40116-type UINT32
|
||||
attr WR_0_KSEM obj-h40118-reading M_Imported_A
|
||||
attr WR_0_KSEM obj-h40118-type UINT32
|
||||
attr WR_0_KSEM obj-h40120-reading M_Imported_B
|
||||
attr WR_0_KSEM obj-h40120-type UINT32
|
||||
attr WR_0_KSEM obj-h40122-reading M_Imported_C
|
||||
attr WR_0_KSEM obj-h40122-type UINT32
|
||||
attr WR_0_KSEM obj-h40125-reading M_Exported_VA
|
||||
attr WR_0_KSEM obj-h40125-type UINT32
|
||||
attr WR_0_KSEM obj-h40127-reading M_Exported_VA_A
|
||||
attr WR_0_KSEM obj-h40127-type UINT32
|
||||
attr WR_0_KSEM obj-h40129-reading M_Exported_VA_B
|
||||
attr WR_0_KSEM obj-h40129-type UINT32
|
||||
attr WR_0_KSEM obj-h40131-reading M_Exported_VA_C
|
||||
attr WR_0_KSEM obj-h40131-type UINT32
|
||||
attr WR_0_KSEM obj-h40133-reading M_Imported_VA
|
||||
attr WR_0_KSEM obj-h40133-type UINT32
|
||||
attr WR_0_KSEM obj-h40135-reading M_Imported_VA_A
|
||||
attr WR_0_KSEM obj-h40135-type UINT32
|
||||
attr WR_0_KSEM obj-h40137-reading M_Imported_VA_B
|
||||
attr WR_0_KSEM obj-h40137-type UINT32
|
||||
attr WR_0_KSEM obj-h40139-reading M_Imported_VA_C
|
||||
attr WR_0_KSEM obj-h40139-type UINT32
|
||||
attr WR_0_KSEM obj-h40982-reading Home_consumption
|
||||
attr WR_0_KSEM obj-h40982-type INT32
|
||||
attr WR_0_KSEM obj-h512-format %.0f
|
||||
attr WR_0_KSEM obj-h512-reading Active_energy+
|
||||
attr WR_0_KSEM obj-h512-type UINT64
|
||||
attr WR_0_KSEM obj-h516-format %.0f
|
||||
attr WR_0_KSEM obj-h516-reading Active_energy-
|
||||
attr WR_0_KSEM obj-h516-type UINT64
|
||||
attr WR_0_KSEM obj-h8192-reading ManufacturerID
|
||||
attr WR_0_KSEM obj-h8192-type UINT16
|
||||
attr WR_0_KSEM obj-h8193-reading ProductID
|
||||
attr WR_0_KSEM obj-h8193-type UINT16
|
||||
attr WR_0_KSEM obj-h8194-reading ProductVersion
|
||||
attr WR_0_KSEM obj-h8194-type UINT16
|
||||
attr WR_0_KSEM obj-h8195-reading FirmwareVersion
|
||||
attr WR_0_KSEM obj-h8195-type UINT16
|
||||
attr WR_0_KSEM obj-h8196-reading VendorName
|
||||
attr WR_0_KSEM obj-h8196-type STR32
|
||||
attr WR_0_KSEM obj-h8212-reading Productname
|
||||
attr WR_0_KSEM obj-h8212-type STR32
|
||||
attr WR_0_KSEM obj-h8228-reading SerialNumber
|
||||
attr WR_0_KSEM obj-h8228-type STR32
|
||||
attr WR_0_KSEM obj-h8244-reading MeasuringInterval
|
||||
attr WR_0_KSEM obj-h8244-type UINT16
|
||||
attr WR_0_KSEM room Strom->Photovoltaik
|
||||
attr WR_0_KSEM sortby 140
|
||||
attr WR_0_KSEM userReadings M_AC_Current:M_AC_Current_.* { ReadingsVal($NAME,"M_AC_Current_A",0) + ReadingsVal($NAME,"M_AC_Current_B",0) + ReadingsVal($NAME,"M_AC_Current_C",0) }
|
||||
attr WR_0_KSEM verbose 0
|
353
fhem/contrib/ch.eick/Photovoltaik/Wechselrichter/RAW_WR_1.txt
Normal file
353
fhem/contrib/ch.eick/Photovoltaik/Wechselrichter/RAW_WR_1.txt
Normal file
@ -0,0 +1,353 @@
|
||||
defmod WR_1 ModbusAttr 71 60 192.168.178.18:1502 TCP
|
||||
attr WR_1 userattr obj-h208-format obj-h512-len obj-h515-len
|
||||
attr WR_1 DbLogExclude .*
|
||||
attr WR_1 DbLogInclude Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Battery_MaxChargePowerLimitAbs,Battery_.*SOC,P_DC1,P_DC2,Total_.*,Solar_Calculation,Solar_Calculation_fc0_4h,Solar_Calculation_fc0_day,Solar_Calculation_fc0_rest,Solar_Correction.*,Solar_Cloud,Solar_East_Covered,Solar_Rain,Solar_SolarRadiation,Solar_Temp,Solar_WR_.*,Solar_middayhigh.*,SW_.*,P_limit_from_EVU.*
|
||||
attr WR_1 alias WR_1
|
||||
attr WR_1 alignTime 00:00
|
||||
attr WR_1 comment Version 2022.12.30 10:00\
|
||||
Kostal Plenticore 10 Plus mit BYD Speicher
|
||||
attr WR_1 dev-h-combine 8
|
||||
attr WR_1 dev-h-defFormat %.2f
|
||||
attr WR_1 dev-h-defLen 2
|
||||
attr WR_1 dev-h-defPoll 1
|
||||
attr WR_1 dev-h-defRevRegs 1
|
||||
attr WR_1 dev-h-defUnpack f>
|
||||
attr WR_1 dev-type-STR-format %s
|
||||
attr WR_1 dev-type-STR-len 8
|
||||
attr WR_1 dev-type-STR-revRegs 0
|
||||
attr WR_1 dev-type-STR-unpack a*
|
||||
attr WR_1 disable 0
|
||||
attr WR_1 event-on-change-reading Act_state_of_charge,Actual_Battery_charge_-minus_or_discharge_-plus_I,Actual_Battery_charge_-minus_or_discharge_-plus_P,Actual_Battery_charge_usable_P,Battery_Total.*,Battery_charge.*,Battery_gross.*,Battery_temperature,Battery_MaxChargePowerLimitAbs,Battery_.*SOC,Home_own_consumption.*,P_DC1,P_DC2,Solar_.*,Total_.*,SW_.*,.*_yield,Inverter_state.*,Inverter_Generation_P_Actual.*,Solar_Calculation_fc.*_day
|
||||
attr WR_1 event-on-update-reading P_limit_from_EVU.*
|
||||
attr WR_1 group PV Eigenverbrauch
|
||||
attr WR_1 icon sani_solar
|
||||
attr WR_1 obj-h100-reading Total_DC_P
|
||||
attr WR_1 obj-h1024-len 1
|
||||
attr WR_1 obj-h1024-reading Battery_Charge_AC_P_Setpoint
|
||||
attr WR_1 obj-h1024-set 1
|
||||
attr WR_1 obj-h1024-unpack n
|
||||
attr WR_1 obj-h1025-len 1
|
||||
attr WR_1 obj-h1025-reading Battery_P_ScaleFactor
|
||||
attr WR_1 obj-h1025-unpack n
|
||||
attr WR_1 obj-h1026-reading Battery_Charge_AC_P_SetpointAbs
|
||||
attr WR_1 obj-h1026-set 1
|
||||
attr WR_1 obj-h1028-reading Battery_Charge_DC_I_SetpointRel
|
||||
attr WR_1 obj-h1028-set 1
|
||||
attr WR_1 obj-h1030-reading Battery_Charge_AC_P_SetpointRel
|
||||
attr WR_1 obj-h1030-set 1
|
||||
attr WR_1 obj-h1032-reading Battery_Charge_DC_I_SetpointAbs
|
||||
attr WR_1 obj-h1032-set 1
|
||||
attr WR_1 obj-h1034-reading Battery_Charge_DC_P_SetpointAbs
|
||||
attr WR_1 obj-h1034-set 1
|
||||
attr WR_1 obj-h1036-reading Battery_Charge_DC_P_SetpointRel
|
||||
attr WR_1 obj-h1036-set 1
|
||||
attr WR_1 obj-h1038-reading Battery_MaxChargePowerLimitAbs
|
||||
attr WR_1 obj-h1038-set 1
|
||||
attr WR_1 obj-h104-format %s
|
||||
attr WR_1 obj-h104-map 0:Normal,8:Ruhe1,16:Ruhe2,32:Ausgleichsladung,64:Tiefentladeschutz,256:externe Batteriesteuerung
|
||||
attr WR_1 obj-h104-reading State_of_EM
|
||||
attr WR_1 obj-h104-revRegs 0
|
||||
attr WR_1 obj-h104-unpack N
|
||||
attr WR_1 obj-h1040-reading Battery_MaxDischargePowerLimitAbs
|
||||
attr WR_1 obj-h1040-set 1
|
||||
attr WR_1 obj-h1042-reading Battery_MinSOC
|
||||
attr WR_1 obj-h1042-set 1
|
||||
attr WR_1 obj-h1044-reading Battery_MaxSOC
|
||||
attr WR_1 obj-h1044-set 1
|
||||
attr WR_1 obj-h1046-reading Battery_Total_DC_ChargeEnergy_DCsideToBattery
|
||||
attr WR_1 obj-h1048-reading Battery_Total_DC_DischargeEnergy_DCsideFromBattery
|
||||
attr WR_1 obj-h1050-reading Battery_Total_AC_ChargeEnergy_ACsideToBattery
|
||||
attr WR_1 obj-h1052-reading Battery_Total_AC_DischargeEnergy_BatteryToGrid
|
||||
attr WR_1 obj-h1054-reading Battery_Total_AC_ChargeEnergy_gridToBattery
|
||||
attr WR_1 obj-h1056-reading Total_DC_PV_Energy_sumOfAllPVInputs
|
||||
attr WR_1 obj-h1058-reading Total_DC_Energy_From_PV1
|
||||
attr WR_1 obj-h106-reading Home_own_consumption_from_Battery
|
||||
attr WR_1 obj-h1060-reading Total_DC_Energy_From_PV2
|
||||
attr WR_1 obj-h1062-reading Total_DC_Energy_From_PV3
|
||||
attr WR_1 obj-h1064-reading Total_AC_Energy_ACsideToGrid
|
||||
attr WR_1 obj-h1066-reading Total_DC_P_sumOfAllPVInputs
|
||||
attr WR_1 obj-h1068-reading Battery_work_capacity
|
||||
attr WR_1 obj-h1070-reading Battery_serial_number
|
||||
attr WR_1 obj-h1072-reading Battery_Reserved_1072
|
||||
attr WR_1 obj-h1074-reading Battery_Reserved_1074
|
||||
attr WR_1 obj-h1076-reading Battery_Maximum_ChargePLimit_read-outFromBattery
|
||||
attr WR_1 obj-h1078-reading Battery_Maximum_DischargePLimit_read-outFromBattery
|
||||
attr WR_1 obj-h108-reading Home_own_consumption_from_grid
|
||||
attr WR_1 obj-h1080-reading Battery_management_mode
|
||||
attr WR_1 obj-h1080-set 1
|
||||
attr WR_1 obj-h1081-reading Battery_Reserved_1081
|
||||
attr WR_1 obj-h1082-reading Installed_sensor_type
|
||||
attr WR_1 obj-h110-reading Total_home_consumption_Battery
|
||||
attr WR_1 obj-h112-reading Total_home_consumption_Grid
|
||||
attr WR_1 obj-h114-reading Total_home_consumption_PV
|
||||
attr WR_1 obj-h116-reading Home_own_consumption_from_PV
|
||||
attr WR_1 obj-h118-reading Total_home_consumption
|
||||
attr WR_1 obj-h120-reading Isolation_resistance
|
||||
attr WR_1 obj-h122-reading P_limit_from_EVU
|
||||
attr WR_1 obj-h124-reading Total_home_consumption_rate
|
||||
attr WR_1 obj-h14-reading Inverter_serial_number
|
||||
attr WR_1 obj-h14-type STR
|
||||
attr WR_1 obj-h144-reading Worktime
|
||||
attr WR_1 obj-h150-reading Actual_cos_phi
|
||||
attr WR_1 obj-h152-reading Grid_frequency
|
||||
attr WR_1 obj-h154-reading I_L1
|
||||
attr WR_1 obj-h156-reading Active_P_L1
|
||||
attr WR_1 obj-h158-reading U_L1
|
||||
attr WR_1 obj-h160-reading I_L2
|
||||
attr WR_1 obj-h162-reading Active_P_L2
|
||||
attr WR_1 obj-h164-reading U_L2
|
||||
attr WR_1 obj-h166-reading I_L3
|
||||
attr WR_1 obj-h168-reading Active_P_L3
|
||||
attr WR_1 obj-h170-reading U_L3
|
||||
attr WR_1 obj-h172-reading Total_AC_Active_P
|
||||
attr WR_1 obj-h174-reading Total_AC_Reactive_P
|
||||
attr WR_1 obj-h178-reading Total_AC_Apparent_P
|
||||
attr WR_1 obj-h190-reading Battery_charge_current
|
||||
attr WR_1 obj-h194-format %.0f
|
||||
attr WR_1 obj-h194-reading Number_of_Battery_cycles
|
||||
attr WR_1 obj-h200-reading Actual_Battery_charge_-minus_or_discharge_-plus_I
|
||||
attr WR_1 obj-h202-reading PSSB_fuse_state
|
||||
attr WR_1 obj-h208-reading Battery_ready_flag
|
||||
attr WR_1 obj-h210-reading Act_state_of_charge
|
||||
attr WR_1 obj-h212-reading Battery_state
|
||||
attr WR_1 obj-h214-reading Battery_temperature
|
||||
attr WR_1 obj-h216-reading Battery_voltage
|
||||
attr WR_1 obj-h218-reading Cos_phi_EM
|
||||
attr WR_1 obj-h220-reading Frequency_EM
|
||||
attr WR_1 obj-h222-reading I_L1_EM
|
||||
attr WR_1 obj-h224-reading Active_P_L1_EM
|
||||
attr WR_1 obj-h226-reading Reactive_P_L1_EM
|
||||
attr WR_1 obj-h228-reading Apparent_P_L1_EM
|
||||
attr WR_1 obj-h230-reading U_L1_EM
|
||||
attr WR_1 obj-h232-reading I_L2_EM
|
||||
attr WR_1 obj-h234-reading Active_P_L2_EM
|
||||
attr WR_1 obj-h236-reading Reactive_P_L2_EM
|
||||
attr WR_1 obj-h238-reading Apparent_P_L2_EM
|
||||
attr WR_1 obj-h240-reading U_L2_EM
|
||||
attr WR_1 obj-h242-reading I_L3_EM
|
||||
attr WR_1 obj-h244-reading Active_P_L3_EM
|
||||
attr WR_1 obj-h246-reading Reactive_P_L3_EM
|
||||
attr WR_1 obj-h248-reading Apparent_P_L3_EM
|
||||
attr WR_1 obj-h250-reading U_L3_EM
|
||||
attr WR_1 obj-h252-reading Total_Active_P_EM
|
||||
attr WR_1 obj-h254-reading Total_Reactive_P_EM
|
||||
attr WR_1 obj-h256-reading Total_Apparent_P_EM
|
||||
attr WR_1 obj-h258-reading I_DC1
|
||||
attr WR_1 obj-h260-reading P_DC1
|
||||
attr WR_1 obj-h266-reading U_DC1
|
||||
attr WR_1 obj-h268-reading I_DC2
|
||||
attr WR_1 obj-h270-reading P_DC2
|
||||
attr WR_1 obj-h276-reading U_DC2
|
||||
attr WR_1 obj-h278-reading I_DC3
|
||||
attr WR_1 obj-h280-reading P_DC3
|
||||
attr WR_1 obj-h286-reading U_DC3
|
||||
attr WR_1 obj-h320-reading Total_yield
|
||||
attr WR_1 obj-h322-reading Daily_yield
|
||||
attr WR_1 obj-h324-reading Yearly_yield
|
||||
attr WR_1 obj-h326-reading Monthly_yield
|
||||
attr WR_1 obj-h38-reading Software-Version_Maincontroller_MC
|
||||
attr WR_1 obj-h38-type STR
|
||||
attr WR_1 obj-h384-len 16
|
||||
attr WR_1 obj-h384-reading Inverter_network_name
|
||||
attr WR_1 obj-h384-type STR
|
||||
attr WR_1 obj-h4-format %.0f
|
||||
attr WR_1 obj-h4-len 1
|
||||
attr WR_1 obj-h4-reading MODBUS_Unit-ID
|
||||
attr WR_1 obj-h4-revRegs 1
|
||||
attr WR_1 obj-h4-unpack N
|
||||
attr WR_1 obj-h420-reading IP-address
|
||||
attr WR_1 obj-h420-type STR
|
||||
attr WR_1 obj-h428-reading IP-subnetmask
|
||||
attr WR_1 obj-h428-type STR
|
||||
attr WR_1 obj-h436-reading IP-gateway
|
||||
attr WR_1 obj-h436-type STR
|
||||
attr WR_1 obj-h446-reading IP-DNS1
|
||||
attr WR_1 obj-h446-type STR
|
||||
attr WR_1 obj-h454-reading IP-DNS2
|
||||
attr WR_1 obj-h454-type STR
|
||||
attr WR_1 obj-h46-reading Software-Version_IO-Controller_IOC
|
||||
attr WR_1 obj-h46-type STR
|
||||
attr WR_1 obj-h5-format %.0f
|
||||
attr WR_1 obj-h5-len 1
|
||||
attr WR_1 obj-h5-reading MODBUS_Byte_Order_Note
|
||||
attr WR_1 obj-h5-revRegs 1
|
||||
attr WR_1 obj-h5-unpack N
|
||||
attr WR_1 obj-h512-format %s
|
||||
attr WR_1 obj-h512-reading Battery_gross_capacity
|
||||
attr WR_1 obj-h512-unpack N
|
||||
attr WR_1 obj-h514-len 1
|
||||
attr WR_1 obj-h514-reading Battery_Actual_SOC
|
||||
attr WR_1 obj-h514-unpack n
|
||||
attr WR_1 obj-h515-format %s
|
||||
attr WR_1 obj-h515-reading Battery_Maincontroller_MC
|
||||
attr WR_1 obj-h515-unpack N
|
||||
attr WR_1 obj-h517-reading Battery_Manufacturer
|
||||
attr WR_1 obj-h517-type STR
|
||||
attr WR_1 obj-h525-format %s
|
||||
attr WR_1 obj-h525-reading Battery_Model_ID
|
||||
attr WR_1 obj-h525-unpack N
|
||||
attr WR_1 obj-h527-format %s
|
||||
attr WR_1 obj-h527-reading Battery_Serial_Number
|
||||
attr WR_1 obj-h527-unpack N
|
||||
attr WR_1 obj-h529-len 4
|
||||
attr WR_1 obj-h529-reading Work_Capacity
|
||||
attr WR_1 obj-h529-unpack N
|
||||
attr WR_1 obj-h531-format %.0f
|
||||
attr WR_1 obj-h531-reading Inverter_Max_P
|
||||
attr WR_1 obj-h531-unpack N
|
||||
attr WR_1 obj-h56-format %.0f
|
||||
attr WR_1 obj-h56-reading Inverter_state
|
||||
attr WR_1 obj-h56-unpack N
|
||||
attr WR_1 obj-h575-reading Inverter_Generation_P_Actual
|
||||
attr WR_1 obj-h575-unpack N
|
||||
attr WR_1 obj-h577-reading Generation_Energy
|
||||
attr WR_1 obj-h577-unpack N
|
||||
attr WR_1 obj-h578-reading Total_energy
|
||||
attr WR_1 obj-h582-reading Actual_Battery_charge-discharge_P
|
||||
attr WR_1 obj-h586-format %s
|
||||
attr WR_1 obj-h586-reading Battery_Firmware
|
||||
attr WR_1 obj-h586-unpack N
|
||||
attr WR_1 obj-h6-reading Inverter_Article_number
|
||||
attr WR_1 obj-h6-type STR
|
||||
attr WR_1 obj-h768-len 32
|
||||
attr WR_1 obj-h768-reading Productname
|
||||
attr WR_1 obj-h768-type STR
|
||||
attr WR_1 obj-h800-len 32
|
||||
attr WR_1 obj-h800-reading Power_class
|
||||
attr WR_1 obj-h800-type STR
|
||||
attr WR_1 room Strom->Photovoltaik
|
||||
attr WR_1 sortby 111
|
||||
attr WR_1 stateFormat {\
|
||||
if (AttrVal("$name","verbose",0) >=3) {\
|
||||
my $DUMMY = "";;\
|
||||
\
|
||||
my $Power = ReadingsVal($name,"Actual_Battery_charge_-minus_or_discharge_-plus_P",0);;\
|
||||
my $StatusSpeicher = ($Power < -10) ? "<span style='color:green'>Laden</span>" : ($Power > 15)? "<span style='color:red'>Entladen</span>" : "<span style='color:orange'>Standby</span>";;\
|
||||
$StatusSpeicher = $StatusSpeicher."<br>".ReadingsVal($name,"State_of_EM","n/a");;\
|
||||
$Power = $Power." W";;\
|
||||
\
|
||||
\
|
||||
my $Battery_temperature = sprintf("%.1f °C",ReadingsVal($name,"Battery_temperature",0));;\
|
||||
$Battery_temperature = ((ReadingsVal("WR_1_API","DigitalOutputs_ConfigurationFlags",0) == 9) ? "<span style='color:green'>Lüfter An </span><br>" : "<br>").$Battery_temperature;;\
|
||||
\
|
||||
my $Actual_Battery_charge_usable_P = sprintf("%d Wh",ReadingsVal($name,"Actual_Battery_charge_usable_P",0));;\
|
||||
\
|
||||
my $Act_state_of_charge = sprintf("%d %%",ReadingsVal($name,"Act_state_of_charge","0"));;\
|
||||
my $SW_Total_DC_P_sumOfAllPVInputs = sprintf("%d W",ReadingsVal($name,"SW_Total_DC_P_sumOfAllPVInputs","0"));;\
|
||||
my $SW_Total_PV_P_reserve = sprintf("%d W",ReadingsVal($name,"SW_Total_PV_P_reserve","0"));;\
|
||||
\
|
||||
my $SW_Home_own_consumption_from_PV = sprintf("%d",ReadingsVal($name,"SW_Home_own_consumption_from_PV",0));;\
|
||||
$SW_Home_own_consumption_from_PV = ($SW_Home_own_consumption_from_PV >= 0) ? $SW_Home_own_consumption_from_PV." W" : "0 W";;\
|
||||
my $SW_Home_own_consumption_from_Battery = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption_from_Battery",0));;\
|
||||
my $SW_Home_own_consumption_from_grid = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption_from_grid",0));;\
|
||||
my $SW_Home_own_consumption = sprintf("%d W",ReadingsVal($name,"SW_Home_own_consumption",0));;\
|
||||
\
|
||||
my $Total_Active_P_EM = sprintf("%d",ReadingsVal($name,"Total_Active_P_EM",0));;\
|
||||
my $StatusNetz = ($Total_Active_P_EM < -10) ? "<span style='color:green'>Einspeisen</span>" : ($Total_Active_P_EM > 15)? "<span style='color:red'>Netzbezug</span>" : "<span style='color:orange'>Standby</span>";;\
|
||||
$Total_Active_P_EM = $Total_Active_P_EM." W";;\
|
||||
\
|
||||
my $SW_Yield_Daily = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Daily",0)/1000 ,0));;\
|
||||
my $SW_Yield_Monthly = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Monthly",0)/1000 ,0));;\
|
||||
my $SW_Yield_Yearly = sprintf("%d kWh",round(ReadingsVal($name,"SW_Yield_Yearly",0)/1000 ,0));;\
|
||||
my $SW_Yield_Total = sprintf("%d MWh",round(ReadingsVal($name,"SW_Yield_Total",0)/1000/1000 ,0));;\
|
||||
\
|
||||
my $Solar_Calculation_fc0_4h = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_4h",0)/1000 ,0));;\
|
||||
my $Solar_Calculation_fc0_day = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_day",0)/1000 ,0));;\
|
||||
my $Solar_Calculation_fc0_rest = sprintf("%d kWh",round(ReadingsVal($name,"Solar_Calculation_fc0_rest",0)/1000 ,0));;\
|
||||
\
|
||||
"<html><table border=2 bordercolor='darkgreen' cellspacing=0 style='width: 100%'>\
|
||||
<colgroup>\
|
||||
<col span='1' style='width: 52%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
</colgroup>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> </td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td><td style='padding-right:5px;;padding-left:5px;;text-align:center;;font-weight:bold'></td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Wechselrichter / KSEM<dd>Max DC / PV Reserve / Netz Leistung</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Total_DC_P_sumOfAllPVInputs."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Total_PV_P_reserve."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$StatusNetz."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Total_Active_P_EM."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Leistung<dd>von PV / von Batterie / vom Netz / ins Haus</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_PV."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_Battery."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption_from_grid."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Home_own_consumption."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Ertrag<dd>Tag / Monat / Jahr / Total</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Daily."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Monthly."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Yearly."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$SW_Yield_Total."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Prognose<dd>Tag / 4 Stunden / Resttag</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_day."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_4h."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Solar_Calculation_fc0_rest."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$DUMMY."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Speicher<dd>Temperatur / nutzbare Ladung / Status / Leistung / akt. SOC</dd></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Battery_temperature."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'><br>".$Actual_Battery_charge_usable_P."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$StatusSpeicher."<br></td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$Power."<br>".$Act_state_of_charge."</td></tr>\
|
||||
</table>\
|
||||
</html>"\
|
||||
}\
|
||||
}
|
||||
attr WR_1 userReadings Total_PV_P_reserve:Total_DC_P.* {my $reserve = ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0) * 0.90 - ReadingsVal($NAME,"Home_own_consumption_from_PV",0);;;; ($reserve lt 0)? 0 : round($reserve,0) },\
|
||||
\
|
||||
Actual_Battery_charge_-minus_or_discharge_-plus_P:[Battery_voltage|Actual_Battery_charge_-minus_or_discharge_-plus_I].* {round((ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_I",0)*ReadingsVal($NAME,"Battery_voltage",0)),0)},\
|
||||
\
|
||||
Total_DC_P_Max:[Total_DC_P_sumOfAllPVInputs|Actual_Battery_charge_-minus_or_discharge_-plus_P].* { my $Bat_P = ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_P",0);;;; ($Bat_P gt 0)? round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0) + $Bat_P,0) : round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0),0) },\
|
||||
\
|
||||
Actual_Battery_charge_usable_P:[Act_state_of_charge|Battery_MinSOC].* {my $x = (ReadingsVal($NAME,"Battery_work_capacity",0)*(ReadingsVal($NAME,"Act_state_of_charge",0)-ReadingsVal($NAME,"Battery_MinSOC",0))/100);;;; ($x lt 0)? 0 : round($x,0) },\
|
||||
\
|
||||
SW_Inverter_Generation_P_Actual:Inverter_Generation_P_Actual.* {round(ReadingsVal($NAME,"Inverter_Generation_P_Actual",0)+ReadingsVal("WR_2","Inverter_Generation_P_Actual",0),0) },\
|
||||
\
|
||||
SW_Home_own_consumption:[Total_Active_P_EM:|Total_AC_Active_P:].* {round(ReadingsVal($NAME,"Total_Active_P_EM",0)+ReadingsVal($NAME,"Total_AC_Active_P",0)+ReadingsVal("WR_2","Total_AC_Active_P",0),0)},\
|
||||
SW_Total_AC_Active_P:Total_AC_Active_P:.* {round(ReadingsVal($NAME,"Total_AC_Active_P",0)+ReadingsVal("WR_2","Total_AC_Active_P",0),0)},\
|
||||
\
|
||||
\
|
||||
SW_Total_DC_P:Total_DC_P:.* {round(ReadingsVal($NAME,"Total_DC_P",0)+ReadingsVal("WR_2","Total_DC_P",0),0) },\
|
||||
\
|
||||
SW_Total_DC_P_sumOfAllPVInputs:Total_DC_P_sumOfAllPVInputs.* {round(ReadingsVal($NAME,"Total_DC_P_sumOfAllPVInputs",0)+ReadingsVal("WR_2","Total_DC_P_sumOfAllPVInputs",0),0) },\
|
||||
\
|
||||
SW_Total_PV_P_reserve:SW_Total_DC_P_sumOfAllPVInputs.* {my $reserve = ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0) * 0.90 - ReadingsVal($NAME,"SW_Home_own_consumption",0);;;; ($reserve lt 0)? 0 : round($reserve,0) },\
|
||||
\
|
||||
SW_Total_DC_P_Max:SW_Total_DC_P_sumOfAllPVInputs.* { my $Bat_out = (ReadingsVal($NAME,"Actual_Battery_charge_-minus_or_discharge_-plus_I",0)*ReadingsVal($NAME,"Battery_voltage",0));;;; ($Bat_out gt 0)? round(ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0) + $Bat_out,0) : round(ReadingsVal($NAME,"SW_Total_DC_P_sumOfAllPVInputs",0),0) },\
|
||||
\
|
||||
SW_Yield_Daily:Daily_yield.* { round(ReadingsVal($NAME,"Daily_yield",0)+ReadingsVal("WR_2","Daily_yield",0),0) },\
|
||||
SW_Yield_Monthly:Monthly_yield.* { round(ReadingsVal($NAME,"Monthly_yield",0)+ReadingsVal("WR_2","Monthly_yield",0),0) },\
|
||||
SW_Yield_Yearly:Yearly_yield.* { round(ReadingsVal($NAME,"Yearly_yield",0)+ReadingsVal("WR_2","Yearly_yield",0),0) },\
|
||||
SW_Yield_Total:Total_yield.* monotonic { round(ReadingsVal($NAME,"Total_yield",0)+ReadingsVal("WR_2","Total_yield",0),0) },\
|
||||
\
|
||||
SW_Home_own_consumption_from_PV:[Total_Active_P_EM|SW_Home_own_consumption:|Home_own_consumption_from_grid|Home_own_consumption_from_Battery].* { (ReadingsVal($NAME,"Total_Active_P_EM",0) ge 0) ? ReadingsVal($NAME,"SW_Home_own_consumption",0) - ReadingsVal($NAME,"Home_own_consumption_from_grid",0) - ReadingsVal($NAME,"Home_own_consumption_from_Battery",0) : ReadingsVal($NAME,"SW_Home_own_consumption",0) - ReadingsVal($NAME,"Home_own_consumption_from_Battery",0);;;; },\
|
||||
\
|
||||
SW_Home_own_consumption_from_Battery:[SW_Home_own_consumption_from_PV|Home_own_consumption_from_Battery].* { ReadingsVal($NAME,"Home_own_consumption_from_Battery",0) },\
|
||||
SW_Home_own_consumption_from_grid:[SW_Home_own_consumption_from_PV|Home_own_consumption_from_grid].* { ReadingsVal($NAME,"Home_own_consumption_from_grid",0) },\
|
||||
\
|
||||
\
|
||||
SW_Battery_Total_AC_ChargeEnergy_ACsideToBattery:Battery_Total_AC_ChargeEnergy_ACsideToBattery.* monotonic { round(ReadingsVal($NAME,"Battery_Total_AC_ChargeEnergy_ACsideToBattery",0),0) },\
|
||||
SW_Battery_Total_AC_ChargeEnergy_gridToBattery:Battery_Total_AC_ChargeEnergy_gridToBattery.* monotonic { round(ReadingsVal($NAME,"Battery_Total_AC_ChargeEnergy_gridToBattery",0),0) },\
|
||||
SW_Battery_Total_AC_DischargeEnergy_BatteryToGrid:Battery_Total_AC_DischargeEnergy_BatteryToGrid.* monotonic { round(ReadingsVal($NAME,"Battery_Total_AC_DischargeEnergy_BatteryToGrid",0),0) },\
|
||||
SW_Battery_Total_DC_ChargeEnergy_DCsideToBattery:Battery_Total_DC_ChargeEnergy_DCsideToBattery.* monotonic { round(ReadingsVal($NAME,"Battery_Total_DC_ChargeEnergy_DCsideToBattery",0),0) },\
|
||||
SW_Battery_Total_DC_DischargeEnergy_DCsideFromBattery:Battery_Total_DC_DischargeEnergy_DCsideFromBattery.* monotonic { round(ReadingsVal($NAME,"Battery_Total_DC_DischargeEnergy_DCsideFromBattery",0),0) },\
|
||||
\
|
||||
SW_Total_AC_Energy_ACsideToGrid:Total_AC_Energy_ACsideToGrid.* monotonic { round(ReadingsVal($NAME,"Total_AC_Energy_ACsideToGrid",0)+ReadingsVal("WR_2","Total_AC_Energy_ACsideToGrid",0),0) },\
|
||||
\
|
||||
SW_Total_DC_Energy_From_PV1:Total_DC_Energy_From_PV1.* monotonic { round(ReadingsVal($NAME,"Total_DC_Energy_From_PV1",0),0) },\
|
||||
SW_Total_DC_Energy_From_PV2:Total_DC_Energy_From_PV2.* monotonic { round(ReadingsVal($NAME,"Total_DC_Energy_From_PV2",0),0) },\
|
||||
SW_Total_DC_Energy_From_PV3:Total_DC_Energy_From_PV3.* monotonic { round(ReadingsVal($NAME,"Total_DC_Energy_From_PV3",0),0) },\
|
||||
SW_Total_DC_Energy_From_PV4:Total_DC_Energy_From_PV1.* monotonic { round(ReadingsVal("WR_2","Total_DC_Energy_From_PV1",0),0) },\
|
||||
SW_Total_DC_Energy_From_PV5:Total_DC_Energy_From_PV2.* monotonic { round(ReadingsVal("WR_2","Total_DC_Energy_From_PV2",0),0) },\
|
||||
SW_Total_DC_Energy_From_PV6:Total_DC_Energy_From_PV3.* monotonic { round(ReadingsVal("WR_2","Total_DC_Energy_From_PV3",0),0) },\
|
||||
SW_Total_DC_PV_Energy_sumOfAllPVInputs:Total_DC_PV_Energy_sumOfAllPVInputs.* monotonic { round(ReadingsVal($NAME,"Total_DC_PV_Energy_sumOfAllPVInputs",0)+ReadingsVal("WR_2","Total_DC_PV_Energy_sumOfAllPVInputs",0),0) },\
|
||||
SW_Total_home_consumption_Battery:Total_home_consumption_Battery.* monotonic { round(ReadingsVal($NAME,"Total_home_consumption_Battery",0),0) },\
|
||||
SW_Total_home_consumption_Grid:Total_home_consumption_Grid.* monotonic { round(ReadingsVal($NAME,"Total_home_consumption_Grid",0),0) },\
|
||||
SW_Total_home_consumption_PV:Total_home_consumption_PV.* monotonic { round(ReadingsVal($NAME,"Total_home_consumption_PV",0),0) },\
|
||||
\
|
||||
string_1_covered_snow:SW_Total_DC_Energy_From_PV1.* {\
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);;;; $year += 1900;;;; $mon += 1 ;;;;\
|
||||
(($mon <= 2 or $mon >= 11) and\
|
||||
($hour >= 9 and $hour <= 16) and\
|
||||
ReadingsVal($NAME,"P_DC1","10000") < 100 and\
|
||||
ReadingsVal("Heizung","ambientTemperature",100) < 10)? "Schnee" : "frei";;;; },\
|
||||
string_2_covered_snow:SW_Total_DC_Energy_From_PV2.* {\
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);;;; $year += 1900;;;; $mon += 1 ;;;;\
|
||||
(($mon <= 2 or $mon >= 11) and\
|
||||
($hour >= 9 and $hour <= 16) and\
|
||||
ReadingsVal($NAME,"P_DC2","10000") < 100 and\
|
||||
ReadingsVal("Heizung","ambientTemperature",100) < 10)? "Schnee" : "frei";;;; },\
|
||||
string_4_covered_snow:SW_Total_DC_Energy_From_PV4.* {\
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);;;; $year += 1900;;;; $mon += 1 ;;;;\
|
||||
(($mon <= 2 or $mon >= 11) and\
|
||||
($hour >= 9 and $hour <= 16) and\
|
||||
ReadingsVal("WR_2","P_DC1","10000") < 200 and\
|
||||
ReadingsVal("Heizung","ambientTemperature",100) < 10)? "Schnee" : "frei";;;; },\
|
||||
string_5_covered_snow:SW_Total_DC_Energy_From_PV5.* {\
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);;;; $year += 1900;;;; $mon += 1 ;;;;\
|
||||
(($mon <= 2 or $mon >= 11) and\
|
||||
($hour >= 9 and $hour <= 16) and\
|
||||
ReadingsVal("WR_2","P_DC2","10000") < 100 and\
|
||||
ReadingsVal("Heizung","ambientTemperature",100) < 10)? "Schnee" : "frei";;;; }\
|
||||
|
||||
attr WR_1 verbose 0
|
@ -0,0 +1,854 @@
|
||||
defmod WR_1_API HTTPMOD http://%IP-WR%/api/v1/auth/me 0
|
||||
attr WR_1_API userattr get25-1Name get25JSON get25Regex
|
||||
attr WR_1_API DbLogExclude .*
|
||||
attr WR_1_API DbLogInclude Statistic_Autarky.*,Statistic_Energy.*,Statistic_Own.*,Statistic_Total.*,Statistic_Yield.*,SW_.*
|
||||
attr WR_1_API authRetries 1
|
||||
attr WR_1_API comment Version 2022.03.29 09:00\
|
||||
Passworte für die Abfrage des WR_1_API werden im storeKeyValue abgelegt:\
|
||||
{KeyValue("[read|store]","PW_<Device Name>_<Benutzer Name>","<passwort>")}\
|
||||
{KeyValue("store","PW_WR_1_API_user","<passwort>")}
|
||||
attr WR_1_API disable 0
|
||||
attr WR_1_API dontRequeueAfterAuth 0
|
||||
attr WR_1_API enableControlSet 0
|
||||
attr WR_1_API enableCookies 1
|
||||
attr WR_1_API event-on-change-reading Battery_.*,DigitalOutputs_ConfigurationFlags
|
||||
attr WR_1_API event-on-update-reading auth_.*,Statistic_Autarky.*,Statistic_EnergyFeedIn.*,Statistic_EnergyHome.*,Statistic_EnergyPv[1|2].*,Statistic_.*Consumption.*,Statistic_Energy.*_Total,Statistic_Yield.*,SW_.*
|
||||
attr WR_1_API get01Data %START%
|
||||
attr WR_1_API get01Name 01_auth_start
|
||||
attr WR_1_API get01URL http://%IP-WR%/api/v1/auth/start
|
||||
attr WR_1_API get02Data %FINISH%
|
||||
attr WR_1_API get02Name 02_auth_finish
|
||||
attr WR_1_API get02URL http://%IP-WR%/api/v1/auth/finish
|
||||
attr WR_1_API get03Data %SESSION%
|
||||
attr WR_1_API get03Name 03_auth_create_session
|
||||
attr WR_1_API get03URL http://%IP-WR%/api/v1/auth/create_session
|
||||
attr WR_1_API get04-1Name auth_me_active
|
||||
attr WR_1_API get04-2Name auth_me_locked
|
||||
attr WR_1_API get04-3Name auth_me_authenticated
|
||||
attr WR_1_API get04-4Name auth_me_anonymous
|
||||
attr WR_1_API get04-5Name auth_me_role
|
||||
attr WR_1_API get04-6Name auth_me_permissions
|
||||
attr WR_1_API get04Header authorization: Session %auth_sessionId%
|
||||
attr WR_1_API get04JSON .
|
||||
attr WR_1_API get04Name 04_auth_me
|
||||
attr WR_1_API get04URL http://%IP-WR%/api/v1/auth/me
|
||||
attr WR_1_API get05-1Name info_api_version
|
||||
attr WR_1_API get05-2Name info_hostname
|
||||
attr WR_1_API get05-3Name info_name
|
||||
attr WR_1_API get05-4Name info_sw_version
|
||||
attr WR_1_API get05JSON .
|
||||
attr WR_1_API get05Name 05_info_version
|
||||
attr WR_1_API get05URL http://%IP-WR%/api/v1/info/version
|
||||
attr WR_1_API get20-10Format %.2f
|
||||
attr WR_1_API get20-10Name Statistic_EnergyChargeGrid_Month
|
||||
attr WR_1_API get20-11Format %.2f
|
||||
attr WR_1_API get20-11Name Statistic_EnergyChargeGrid_Total
|
||||
attr WR_1_API get20-12Format %.2f
|
||||
attr WR_1_API get20-12Name Statistic_EnergyChargeGrid_Year
|
||||
attr WR_1_API get20-13Format %.2f
|
||||
attr WR_1_API get20-13Name Statistic_EnergyChargeInvIn_Day
|
||||
attr WR_1_API get20-14Format %.2f
|
||||
attr WR_1_API get20-14Name Statistic_EnergyChargeInvIn_Month
|
||||
attr WR_1_API get20-15Format %.2f
|
||||
attr WR_1_API get20-15Name Statistic_EnergyChargeInvIn_Total
|
||||
attr WR_1_API get20-16Format %.2f
|
||||
attr WR_1_API get20-16Name Statistic_EnergyChargeInvIn_Year
|
||||
attr WR_1_API get20-17Format %.2f
|
||||
attr WR_1_API get20-17Name Statistic_EnergyChargePv_Day
|
||||
attr WR_1_API get20-18Format %.2f
|
||||
attr WR_1_API get20-18Name Statistic_EnergyChargePv_Month
|
||||
attr WR_1_API get20-19Format %.2f
|
||||
attr WR_1_API get20-19Name Statistic_EnergyChargePv_Total
|
||||
attr WR_1_API get20-1Format %.2f
|
||||
attr WR_1_API get20-1Name Statistic_Autarky_Day
|
||||
attr WR_1_API get20-20Format %.2f
|
||||
attr WR_1_API get20-20Name Statistic_EnergyChargePv_Year
|
||||
attr WR_1_API get20-21Format %.2f
|
||||
attr WR_1_API get20-21Name Statistic_EnergyDischarge_Day
|
||||
attr WR_1_API get20-22Format %.2f
|
||||
attr WR_1_API get20-22Name Statistic_EnergyDischarge_Month
|
||||
attr WR_1_API get20-23Format %.2f
|
||||
attr WR_1_API get20-23Name Statistic_EnergyDischarge_Total
|
||||
attr WR_1_API get20-24Format %.2f
|
||||
attr WR_1_API get20-24Name Statistic_EnergyDischarge_Year
|
||||
attr WR_1_API get20-25Format %.2f
|
||||
attr WR_1_API get20-25Name Statistic_EnergyDischargeGrid_Day
|
||||
attr WR_1_API get20-26Format %.2f
|
||||
attr WR_1_API get20-26Name Statistic_EnergyDischargeGrid_Month
|
||||
attr WR_1_API get20-27Format %.2f
|
||||
attr WR_1_API get20-27Name Statistic_EnergyDischargeGrid_Total
|
||||
attr WR_1_API get20-28Format %.2f
|
||||
attr WR_1_API get20-28Name Statistic_EnergyDischargeGrid_Year
|
||||
attr WR_1_API get20-29Format %.2f
|
||||
attr WR_1_API get20-29Name Statistic_EnergyHome_Day
|
||||
attr WR_1_API get20-2Format %.2f
|
||||
attr WR_1_API get20-2Name Statistic_Autarky_Month
|
||||
attr WR_1_API get20-30Format %.2f
|
||||
attr WR_1_API get20-30Name Statistic_EnergyHome_Month
|
||||
attr WR_1_API get20-31Format %.2f
|
||||
attr WR_1_API get20-31Name Statistic_EnergyHome_Total
|
||||
attr WR_1_API get20-32Format %.2f
|
||||
attr WR_1_API get20-32Name Statistic_EnergyHome_Year
|
||||
attr WR_1_API get20-33Format %.2f
|
||||
attr WR_1_API get20-33Name Statistic_EnergyHomeBat_Day
|
||||
attr WR_1_API get20-34Format %.2f
|
||||
attr WR_1_API get20-34Name Statistic_EnergyHomeBat_Month
|
||||
attr WR_1_API get20-35Format %.2f
|
||||
attr WR_1_API get20-35Name Statistic_EnergyHomeBat_Total
|
||||
attr WR_1_API get20-36Format %.2f
|
||||
attr WR_1_API get20-36Name Statistic_EnergyHomeBat_Year
|
||||
attr WR_1_API get20-37Format %.2f
|
||||
attr WR_1_API get20-37Name Statistic_EnergyHomeGrid_Day
|
||||
attr WR_1_API get20-38Format %.2f
|
||||
attr WR_1_API get20-38Name Statistic_EnergyHomeGrid_Month
|
||||
attr WR_1_API get20-39Format %.2f
|
||||
attr WR_1_API get20-39Name Statistic_EnergyHomeGrid_Total
|
||||
attr WR_1_API get20-3Format %.2f
|
||||
attr WR_1_API get20-3Name Statistic_Autarky_Total
|
||||
attr WR_1_API get20-40Format %.2f
|
||||
attr WR_1_API get20-40Name Statistic_EnergyHomeGrid_Year
|
||||
attr WR_1_API get20-41Format %.2f
|
||||
attr WR_1_API get20-41Name Statistic_EnergyHomeOwn_Total
|
||||
attr WR_1_API get20-42Format %.2f
|
||||
attr WR_1_API get20-42Name Statistic_EnergyHomePv_Day
|
||||
attr WR_1_API get20-43Format %.2f
|
||||
attr WR_1_API get20-43Name Statistic_EnergyHomePv_Month
|
||||
attr WR_1_API get20-44Format %.2f
|
||||
attr WR_1_API get20-44Name Statistic_EnergyHomePv_Total
|
||||
attr WR_1_API get20-45Format %.2f
|
||||
attr WR_1_API get20-45Name Statistic_EnergyHomePv_Year
|
||||
attr WR_1_API get20-46Format %.2f
|
||||
attr WR_1_API get20-46Name Statistic_EnergyPv1_Day
|
||||
attr WR_1_API get20-47Format %.2f
|
||||
attr WR_1_API get20-47Name Statistic_EnergyPv1_Month
|
||||
attr WR_1_API get20-48Format %.2f
|
||||
attr WR_1_API get20-48Name Statistic_EnergyPv1_Total
|
||||
attr WR_1_API get20-49Format %.2f
|
||||
attr WR_1_API get20-49Name Statistic_EnergyPv1_Year
|
||||
attr WR_1_API get20-4Format %.2f
|
||||
attr WR_1_API get20-4Name Statistic_Autarky_Year
|
||||
attr WR_1_API get20-50Format %.2f
|
||||
attr WR_1_API get20-50Name Statistic_EnergyPv2_Day
|
||||
attr WR_1_API get20-51Format %.2f
|
||||
attr WR_1_API get20-51Name Statistic_EnergyPv2_Month
|
||||
attr WR_1_API get20-52Format %.2f
|
||||
attr WR_1_API get20-52Name Statistic_EnergyPv2_Total
|
||||
attr WR_1_API get20-53Format %.2f
|
||||
attr WR_1_API get20-53Name Statistic_EnergyPv2_Year
|
||||
attr WR_1_API get20-54Format %.2f
|
||||
attr WR_1_API get20-54Name Statistic_EnergyPv3_Day
|
||||
attr WR_1_API get20-55Format %.2f
|
||||
attr WR_1_API get20-55Name Statistic_EnergyPv3_Month
|
||||
attr WR_1_API get20-56Format %.2f
|
||||
attr WR_1_API get20-56Name Statistic_EnergyPv3_Total
|
||||
attr WR_1_API get20-57Format %.2f
|
||||
attr WR_1_API get20-57Name Statistic_EnergyPv3_Year
|
||||
attr WR_1_API get20-58Format %.2f
|
||||
attr WR_1_API get20-58Name Statistic_OwnConsumptionRate_Day
|
||||
attr WR_1_API get20-59Format %.2f
|
||||
attr WR_1_API get20-59Name Statistic_OwnConsumptionRate_Month
|
||||
attr WR_1_API get20-5Format %.2f
|
||||
attr WR_1_API get20-5Name Statistic_CO2Saving_Day
|
||||
attr WR_1_API get20-60Format %.2f
|
||||
attr WR_1_API get20-60Name Statistic_OwnConsumptionRate_Total
|
||||
attr WR_1_API get20-61Format %.2f
|
||||
attr WR_1_API get20-61Name Statistic_OwnConsumptionRate_Year
|
||||
attr WR_1_API get20-62Format %.2f
|
||||
attr WR_1_API get20-62Name Statistic_Yield_Day
|
||||
attr WR_1_API get20-63Format %.2f
|
||||
attr WR_1_API get20-63Name Statistic_Yield_Month
|
||||
attr WR_1_API get20-64Format %.2f
|
||||
attr WR_1_API get20-64Name Statistic_Yield_Total
|
||||
attr WR_1_API get20-65Format %.2f
|
||||
attr WR_1_API get20-65Name Statistic_Yield_Year
|
||||
attr WR_1_API get20-6Format %.2f
|
||||
attr WR_1_API get20-6Name Statistic_CO2Saving_Month
|
||||
attr WR_1_API get20-7Format %.2f
|
||||
attr WR_1_API get20-7Name Statistic_CO2Saving_Total
|
||||
attr WR_1_API get20-8Format %.2f
|
||||
attr WR_1_API get20-8Name Statistic_CO2Saving_Year
|
||||
attr WR_1_API get20-9Format %.2f
|
||||
attr WR_1_API get20-9Name Statistic_EnergyChargeGrid_Day
|
||||
attr WR_1_API get20Header authorization: Session %auth_sessionId%
|
||||
attr WR_1_API get20JSON 01_processdata_.._value
|
||||
attr WR_1_API get20Name 20_Statistic_EnergyFlow
|
||||
attr WR_1_API get20URL http://%IP-WR%/api/v1/processdata/scb:statistic:EnergyFlow
|
||||
attr WR_1_API get21-1Name Battery_Info_Cycles
|
||||
attr WR_1_API get21-2Name Battery_Info_FullChargeCap_E
|
||||
attr WR_1_API get21-3Name Battery_Info_SoC
|
||||
attr WR_1_API get21-4Format %d
|
||||
attr WR_1_API get21-4Name Battery_Info_WorkCapacity
|
||||
attr WR_1_API get21Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API get21Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API get21JSON .._processdata_.._value
|
||||
attr WR_1_API get21Name 21_Battery_Information
|
||||
attr WR_1_API get21URL http://%IP-WR%/api/v1/processdata/devices:local:battery/Cycles,FullChargeCap_E,SoC,WorkCapacity
|
||||
attr WR_1_API get22-1Name Battery_InternControl_DynamicSoc_Enable
|
||||
attr WR_1_API get22-2Name Battery_Control
|
||||
attr WR_1_API get22-3Format %d
|
||||
attr WR_1_API get22-3Name Battery_InternControl_MinHomeConsumption
|
||||
attr WR_1_API get22-4Name Battery_InternControl_MinSoc
|
||||
attr WR_1_API get22-5Name Battery_InternControl_SmartBatteryControl_Enable
|
||||
attr WR_1_API get22-6Name Battery_InternControl_Strategy
|
||||
attr WR_1_API get22-7Name Battery_InternControl_Type
|
||||
attr WR_1_API get22Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API get22Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API get22JSON .._value
|
||||
attr WR_1_API get22Name 22_Battery_InternControl
|
||||
attr WR_1_API get22URL http://%IP-WR%/api/v1/settings/devices:local/Battery:ExternControl,Battery:Type,Battery:MinHomeComsumption,Battery:Strategy,Battery:MinSoc,Battery:SmartBatteryControl:Enable,Battery:DynamicSoc:Enable,Battery:Type
|
||||
attr WR_1_API get23-10Format %d
|
||||
attr WR_1_API get23-10Name Battery_ExternControl_MaxChargePowerAbs
|
||||
attr WR_1_API get23-11Format %d
|
||||
attr WR_1_API get23-11Name Battery_ExternControl_MaxDischargePowerAbs
|
||||
attr WR_1_API get23-12Format %d
|
||||
attr WR_1_API get23-12Name Battery_ExternControl_MaxSocRel
|
||||
attr WR_1_API get23-13Format %d
|
||||
attr WR_1_API get23-13Name Battery_ExternControl_MinSocRel
|
||||
attr WR_1_API get23-1Name Battery_ComMonitor_Enable
|
||||
attr WR_1_API get23-2Format %d
|
||||
attr WR_1_API get23-2Name Battery_ComMonitor_Time
|
||||
attr WR_1_API get23-3Name Battery_Control
|
||||
attr WR_1_API get23-4Format %.2f
|
||||
attr WR_1_API get23-4Name Battery_ExternControl_AcPowerAbs
|
||||
attr WR_1_API get23-5Format %.2f
|
||||
attr WR_1_API get23-5Name Battery_ExternControl_AcPowerRel
|
||||
attr WR_1_API get23-6Format %.2f
|
||||
attr WR_1_API get23-6Name Battery_ExternControl_DcCurrentAbs
|
||||
attr WR_1_API get23-7Format %.2f
|
||||
attr WR_1_API get23-7Name Battery_ExternControl_DcCurrentRel
|
||||
attr WR_1_API get23-8Format %.2f
|
||||
attr WR_1_API get23-8Name Battery_ExternControl_DcPowerAbs
|
||||
attr WR_1_API get23-9Format %.2f
|
||||
attr WR_1_API get23-9Name Battery_ExternControl_DcPowerRel
|
||||
attr WR_1_API get23Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API get23Header02 Content-type: application/json, Accept: application/json, Connection: keep-alive
|
||||
attr WR_1_API get23JSON .._value
|
||||
attr WR_1_API get23Name 23_Battery_ExternControl
|
||||
attr WR_1_API get23URL http://%IP-WR%/api/v1/settings/devices:local/Battery:ComMonitor:Enable,Battery:ComMonitor:Time,Battery:ExternControl,Battery:ExternControl:AcPowerAbs,Battery:ExternControl:AcPowerRel,Battery:ExternControl:DcCurrentAbs,Battery:ExternControl:DcCurrentRel,Battery:ExternControl:DcPowerAbs,Battery:ExternControl:DcPowerRel,Battery:ExternControl:MaxChargePowerAbs,Battery:ExternControl:MaxDischargePowerAbs,Battery:ExternControl:MaxSocRel,Battery:ExternControl:MinSocRel
|
||||
attr WR_1_API get24-1Name Battery_TimeControl_5
|
||||
attr WR_1_API get24-1OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
|
||||
attr WR_1_API get24-2Name Battery_TimeControl_1
|
||||
attr WR_1_API get24-2OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
|
||||
attr WR_1_API get24-3Name Battery_TimeControl_6
|
||||
attr WR_1_API get24-3OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
|
||||
attr WR_1_API get24-4Name Battery_TimeControl_0
|
||||
attr WR_1_API get24-4OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
|
||||
attr WR_1_API get24-5Name Battery_TimeControl_4
|
||||
attr WR_1_API get24-5OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
|
||||
attr WR_1_API get24-6Name Battery_TimeControl_2
|
||||
attr WR_1_API get24-6OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
|
||||
attr WR_1_API get24-7Name Battery_TimeControl_3
|
||||
attr WR_1_API get24-7OExpr my @x = ( $val =~ m/.{4}/g );; my $x = $x[0];;for(my $i = 1;;$i < @x;;$i++) { $x = $x." ".$x[$i]};; $x
|
||||
attr WR_1_API get24-8Name Battery_TimeControl
|
||||
attr WR_1_API get24Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API get24Header02 Content-type: application/json, Accept: application/json, Connection: keep-alive
|
||||
attr WR_1_API get24JSON .._value
|
||||
attr WR_1_API get24Name 24_Battery_TimeControl
|
||||
attr WR_1_API get24URL http://%IP-WR%/api/v1/settings/devices:local/Battery:TimeControl:Enable,Battery:TimeControl:ConfMon,Battery:TimeControl:ConfTue,Battery:TimeControl:ConfWed,Battery:TimeControl:ConfThu,Battery:TimeControl:ConfFri,Battery:TimeControl:ConfSat,Battery:TimeControl:ConfSun
|
||||
attr WR_1_API get25Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API get25Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API get25Name 25_Battery_EM_State
|
||||
attr WR_1_API get25URL http://%IP-WR%/api/v1/processdata/devices:local/EM_State
|
||||
attr WR_1_API get40-1Name EnergyMgmt_AcStorage
|
||||
attr WR_1_API get40-2Name Generator_ShadowMgmt
|
||||
attr WR_1_API get40Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API get40Header02 Content-type: application/json, Accept: application/json, Connection: keep-alive
|
||||
attr WR_1_API get40JSON .._value
|
||||
attr WR_1_API get40Name 40_Generator_und_EnergieMgmt
|
||||
attr WR_1_API get40URL http://%IP-WR%/api/v1/settings/devices:local/Generator:ShadowMgmt:Enable,EnergyMgmt:AcStorage
|
||||
attr WR_1_API get41-1Name DigitalOutputs_ConfigurationFlags
|
||||
attr WR_1_API get41-2Name DigitalOutputs_DelayTime
|
||||
attr WR_1_API get41-3Name DigitalOutputs_PowerMode_OffPowerThreshold
|
||||
attr WR_1_API get41-4Name DigitalOutputs_PowerMode_OnPowerThreshold
|
||||
attr WR_1_API get41-5Name DigitalOutputs_SwitchOffDuration
|
||||
attr WR_1_API get41-6Name DigitalOutputs_TimeMode_MaxNoOfSwitchingCyclesPerDay
|
||||
attr WR_1_API get41-7Name DigitalOutputs_TimeMode_PowerThreshold
|
||||
attr WR_1_API get41-8Name DigitalOutputs_TimeMode_RunTime
|
||||
attr WR_1_API get41-9Name DigitalOutputs_TimeMode_StableTime
|
||||
attr WR_1_API get41Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API get41Header02 Content-type: application/json, Accept: application/json, Connection: keep-alive
|
||||
attr WR_1_API get41JSON .._value
|
||||
attr WR_1_API get41Name 41_DigitalOutputs
|
||||
attr WR_1_API get41URL http://%IP-WR%/api/v1/settings/devices:local/DigitalOutputs:Customer:ConfigurationFlags,DigitalOutputs:Customer:DelayTime,DigitalOutputs:Customer:PowerMode:OffPowerThreshold,DigitalOutputs:Customer:PowerMode:OnPowerThreshold,DigitalOutputs:Customer:SwitchOffDuration,DigitalOutputs:Customer:TimeMode:MaxNoOfSwitchingCyclesPerDay,DigitalOutputs:Customer:TimeMode:PowerThreshold,DigitalOutputs:Customer:TimeMode:RunTime,DigitalOutputs:Customer:TimeMode:StableTime
|
||||
attr WR_1_API get51Name 51_modules_list
|
||||
attr WR_1_API get51URL http://%IP-WR%/api/v1/modules
|
||||
attr WR_1_API get59Data {"end":"%end_date%","begin":"%begin_date%"}
|
||||
attr WR_1_API get59Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API get59Header02 Content-type: application/json, Accept: application/json, Connection: keep-alive
|
||||
attr WR_1_API get59Name 59_logdata_download
|
||||
attr WR_1_API get59URL http://%IP-WR%/api/v1/logdata/download
|
||||
attr WR_1_API get60Header authorization: Session %auth_sessionId%
|
||||
attr WR_1_API get60Name 60_update_status
|
||||
attr WR_1_API get60URL http://%IP-WR%/api/v1/update/status
|
||||
attr WR_1_API getHeader01 Accept-Encoding: gzip,deflate
|
||||
attr WR_1_API getHeader02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API group PV Eigenverbrauch
|
||||
attr WR_1_API icon sani_solar
|
||||
attr WR_1_API reAuthRegex "authenticated":false|"processdata":\[\]|wrong credentials|Not authorized
|
||||
attr WR_1_API reading0101JSON nonce
|
||||
attr WR_1_API reading0101Name auth_nonce
|
||||
attr WR_1_API reading0102JSON rounds
|
||||
attr WR_1_API reading0102Name auth_rounds
|
||||
attr WR_1_API reading0103JSON salt
|
||||
attr WR_1_API reading0103Name auth_salt
|
||||
attr WR_1_API reading0104JSON transactionId
|
||||
attr WR_1_API reading0104Name auth_transactionId
|
||||
attr WR_1_API reading0201JSON signature
|
||||
attr WR_1_API reading0201Name auth_signature
|
||||
attr WR_1_API reading0202JSON token
|
||||
attr WR_1_API reading0202Name auth_token
|
||||
attr WR_1_API reading0301JSON message
|
||||
attr WR_1_API reading0301Name info_message
|
||||
attr WR_1_API reading0302JSON error
|
||||
attr WR_1_API reading0302Name info_error
|
||||
attr WR_1_API reading03JSON sessionId
|
||||
attr WR_1_API reading03Name auth_sessionId
|
||||
attr WR_1_API reading25Name Battery_EM_State
|
||||
attr WR_1_API reading25OMap 0:Normal,8:Ruhe1,16:Ruhe2,32:Ausgleichsladung,64:Tiefentladeschutz,256:externe Batteriesteuerung
|
||||
attr WR_1_API reading25Regex EM_State.*value":(\d+)
|
||||
attr WR_1_API reading40Name Generator_ShadowMgmt
|
||||
attr WR_1_API reading40Regex Generator:ShadowMgmt.*value":"(\d+)
|
||||
attr WR_1_API replacement01Mode text
|
||||
attr WR_1_API replacement01Regex %IP-WR%
|
||||
attr WR_1_API replacement01Value 192.168.178.18
|
||||
attr WR_1_API replacement02Mode expression
|
||||
attr WR_1_API replacement02Regex %START%
|
||||
attr WR_1_API replacement02Value {my $NAME="WR_1_API";; plenticore_auth("start","user","$NAME")}
|
||||
attr WR_1_API replacement04Mode expression
|
||||
attr WR_1_API replacement04Regex %FINISH%
|
||||
attr WR_1_API replacement04Value {my $NAME="WR_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"))}
|
||||
attr WR_1_API replacement05Mode expression
|
||||
attr WR_1_API replacement05Regex %SESSION%
|
||||
attr WR_1_API replacement05Value {my $NAME="WR_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"))}
|
||||
attr WR_1_API replacement06Mode reading
|
||||
attr WR_1_API replacement06Regex %auth_signature%
|
||||
attr WR_1_API replacement06Value auth_signature
|
||||
attr WR_1_API replacement07Mode reading
|
||||
attr WR_1_API replacement07Regex %auth_sessionId%
|
||||
attr WR_1_API replacement07Value auth_sessionId
|
||||
attr WR_1_API replacement08Mode expression
|
||||
attr WR_1_API replacement08Regex %begin_date%
|
||||
attr WR_1_API replacement08Value {POSIX::strftime("%Y-%m-%d",localtime(time))}
|
||||
attr WR_1_API replacement09Mode expression
|
||||
attr WR_1_API replacement09Regex %end_date%
|
||||
attr WR_1_API replacement09Value {POSIX::strftime("%Y-%m-%d",localtime(time))}
|
||||
attr WR_1_API room Strom->Photovoltaik
|
||||
attr WR_1_API set06Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set06Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set06Method POST
|
||||
attr WR_1_API set06Name 06_auth_logout
|
||||
attr WR_1_API set06NoArg 1
|
||||
attr WR_1_API set06URL http://%IP-WR%/api/v1/auth/logout
|
||||
attr WR_1_API set2201Data [{"moduleid":"devices:local","settings":[{"id":"Battery:DynamicSoc:Enable","value":"$val"}]}]
|
||||
attr WR_1_API set2201FollowGet 22_Battery_InternControl
|
||||
attr WR_1_API set2201Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2201Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2201Hint 0,1
|
||||
attr WR_1_API set2201Method PUT
|
||||
attr WR_1_API set2201Name 22_01_Battery_DynamicSoc_Enable
|
||||
attr WR_1_API set2201URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2203Data [{"moduleid":"devices:local","settings":[{"id":"Battery:MinHomeComsumption","value":"$val"}]}]
|
||||
attr WR_1_API set2203FollowGet 22_Battery_InternControl
|
||||
attr WR_1_API set2203Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2203Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2203Hint slider,50,50,8000
|
||||
attr WR_1_API set2203Method PUT
|
||||
attr WR_1_API set2203Name 22_03_Battery_MinHomeConsumption
|
||||
attr WR_1_API set2203URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2204Data [{"moduleid":"devices:local","settings":[{"id":"Battery:MinSoc","value":"$val"}]}]
|
||||
attr WR_1_API set2204FollowGet 22_Battery_InternControl
|
||||
attr WR_1_API set2204Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2204Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2204Hint slider,5,5,100
|
||||
attr WR_1_API set2204Method PUT
|
||||
attr WR_1_API set2204Name 22_04_Battery_MinSoc
|
||||
attr WR_1_API set2204URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2205Data [{"moduleid":"devices:local","settings":[{"id":"Battery:SmartBatteryControl:Enable","value":"$val"}]}]
|
||||
attr WR_1_API set2205FollowGet 22_Battery_InternControl
|
||||
attr WR_1_API set2205Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2205Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2205Hint 0,1
|
||||
attr WR_1_API set2205Method PUT
|
||||
attr WR_1_API set2205Name 22_05_Battery_SmartBatteryControl_Enable
|
||||
attr WR_1_API set2205URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2206Data [{"moduleid":"devices:local","settings":[{"id":"Battery:Strategy","value":"$val"}]}]
|
||||
attr WR_1_API set2206FollowGet 22_Battery_InternControl
|
||||
attr WR_1_API set2206Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2206Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2206Hint 1,2
|
||||
attr WR_1_API set2206Method PUT
|
||||
attr WR_1_API set2206Name 22_06_Battery_Strategy
|
||||
attr WR_1_API set2206URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2207Data [{"moduleid":"devices:local","settings":[{"id":"Battery:Type","value":"$val"}]}]
|
||||
attr WR_1_API set2207FollowGet 22_Battery_InternControl
|
||||
attr WR_1_API set2207Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2207Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2207Hint 0,4
|
||||
attr WR_1_API set2207Method PUT
|
||||
attr WR_1_API set2207Name 22_07_Battery_Type
|
||||
attr WR_1_API set2207URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2300Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl","value":"$val"}]}]
|
||||
attr WR_1_API set2300FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2300Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2300Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2300Hint 0,1,2
|
||||
attr WR_1_API set2300Method PUT
|
||||
attr WR_1_API set2300Name 23_00_Battery_ExternControl
|
||||
attr WR_1_API set2300URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2301Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:AcPowerAbs","value":"$val"}]}]
|
||||
attr WR_1_API set2301FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2301Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2301Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2301Method PUT
|
||||
attr WR_1_API set2301Name 23_01_Battery_ExternControl_AcPowerAbs
|
||||
attr WR_1_API set2301URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2302Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:AcPowerRel","value":"$val"}]}]
|
||||
attr WR_1_API set2302FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2302Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2302Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2302Method PUT
|
||||
attr WR_1_API set2302Name 23_02_Battery_ExternControl_AcPowerRel
|
||||
attr WR_1_API set2302URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2303Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcCurrentAbs","value":"$val"}]}]
|
||||
attr WR_1_API set2303FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2303Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2303Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2303Method PUT
|
||||
attr WR_1_API set2303Name 23_03_Battery_ExternControl_DcCurrentAbs
|
||||
attr WR_1_API set2303URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2304Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcCurrentRel","value":"$val"}]}]
|
||||
attr WR_1_API set2304FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2304Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2304Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2304Method PUT
|
||||
attr WR_1_API set2304Name 23_04_Battery_ExternControl_DcCurrentRel
|
||||
attr WR_1_API set2304URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2305Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcPowerAbs","value":"$val"}]}]
|
||||
attr WR_1_API set2305FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2305Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2305Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2305Method PUT
|
||||
attr WR_1_API set2305Name 23_05_Battery_ExternControl_DcPowerAbs
|
||||
attr WR_1_API set2305URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2306Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:DcPowerRel","value":"$val"}]}]
|
||||
attr WR_1_API set2306FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2306Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2306Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2306Method PUT
|
||||
attr WR_1_API set2306Name 23_06_Battery_ExternControl_DcPowerRel
|
||||
attr WR_1_API set2306URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2307Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MaxChargePowerAbs","value":"$val"}]}]
|
||||
attr WR_1_API set2307FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2307Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2307Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2307Method PUT
|
||||
attr WR_1_API set2307Name 23_07_Battery_ExternControl_MaxChargePowerAbs
|
||||
attr WR_1_API set2307URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2308Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MaxDischargePowerAbs","value":"$val"}]}]
|
||||
attr WR_1_API set2308FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2308Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2308Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2308Method PUT
|
||||
attr WR_1_API set2308Name 23_08_Battery_ExternControl_MaxDischargePowerAbs
|
||||
attr WR_1_API set2308URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2309Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MaxSocRel","value":"$val"}]}]
|
||||
attr WR_1_API set2309FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2309Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2309Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2309Hint slider,30,5,100
|
||||
attr WR_1_API set2309Method PUT
|
||||
attr WR_1_API set2309Name 23_09_Battery_ExternControl_MaxSocRel
|
||||
attr WR_1_API set2309URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2310Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ExternControl:MinSocRel","value":"$val"}]}]
|
||||
attr WR_1_API set2310FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2310Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2310Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2310Hint slider,0,5,100
|
||||
attr WR_1_API set2310Method PUT
|
||||
attr WR_1_API set2310Name 23_10_Battery_ExternControl_MinSocRel
|
||||
attr WR_1_API set2310URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2311Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ComMonitor:Enable","value":"$val"}]}]
|
||||
attr WR_1_API set2311FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2311Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2311Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2311Hint 0,1
|
||||
attr WR_1_API set2311Method PUT
|
||||
attr WR_1_API set2311Name 23_11_Battery_ComMonitor_Enable
|
||||
attr WR_1_API set2311URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2312Data [{"moduleid":"devices:local","settings":[{"id":"Battery:ComMonitor:Time","value":"$val"}]}]
|
||||
attr WR_1_API set2312FollowGet 23_Battery_ExternControl
|
||||
attr WR_1_API set2312Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2312Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2312Hint slider,0,10,600
|
||||
attr WR_1_API set2312Method PUT
|
||||
attr WR_1_API set2312Name 23_12_Battery_ComMonitor_Time
|
||||
attr WR_1_API set2312URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2400Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:Enable","value":"$val"}]}]
|
||||
attr WR_1_API set2400FollowGet 24_Battery_TimeControl
|
||||
attr WR_1_API set2400Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2400Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2400Hint 0,1
|
||||
attr WR_1_API set2400Method PUT
|
||||
attr WR_1_API set2400Name 24_00_Battery_TimeControl
|
||||
attr WR_1_API set2400URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2401Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfSun","value":"$val"}]}]
|
||||
attr WR_1_API set2401FollowGet 24_Battery_TimeControl
|
||||
attr WR_1_API set2401Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2401Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2401Hint 0,1,2,Battery_TimeControl_0_So
|
||||
attr WR_1_API set2401IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
|
||||
attr WR_1_API set2401Method PUT
|
||||
attr WR_1_API set2401Name 24__0_Battery_TimeControl_So
|
||||
attr WR_1_API set2401URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2402Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfMon","value":"$val"}]}]
|
||||
attr WR_1_API set2402FollowGet 24_Battery_TimeControl
|
||||
attr WR_1_API set2402Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2402Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2402Hint 0,1,2,Battery_TimeControl_1_Mo
|
||||
attr WR_1_API set2402IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
|
||||
attr WR_1_API set2402Method PUT
|
||||
attr WR_1_API set2402Name 24__1_Battery_TimeControl_Mo
|
||||
attr WR_1_API set2402URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2403Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfTue","value":"$val"}]}]
|
||||
attr WR_1_API set2403FollowGet 24_Battery_TimeControl
|
||||
attr WR_1_API set2403Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2403Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2403Hint 0,1,2,Battery_TimeControl_2_Di
|
||||
attr WR_1_API set2403IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
|
||||
attr WR_1_API set2403Method PUT
|
||||
attr WR_1_API set2403Name 24__2_Battery_TimeControl_Di
|
||||
attr WR_1_API set2403TextArg 1
|
||||
attr WR_1_API set2403URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2404Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfWed","value":"$val"}]}]
|
||||
attr WR_1_API set2404FollowGet 24_Battery_TimeControl
|
||||
attr WR_1_API set2404Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2404Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2404Hint 0,1,2,Battery_TimeControl_3_Mi
|
||||
attr WR_1_API set2404IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
|
||||
attr WR_1_API set2404Method PUT
|
||||
attr WR_1_API set2404Name 24__3_Battery_TimeControl_Mi
|
||||
attr WR_1_API set2404TextArg 1
|
||||
attr WR_1_API set2404URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2405Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfThu","value":"$val"}]}]
|
||||
attr WR_1_API set2405FollowGet 24_Battery_TimeControl
|
||||
attr WR_1_API set2405Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2405Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2405Hint 0,1,2,Battery_TimeControl_4_Do
|
||||
attr WR_1_API set2405IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
|
||||
attr WR_1_API set2405Method PUT
|
||||
attr WR_1_API set2405Name 24__4_Battery_TimeControl_Do
|
||||
attr WR_1_API set2405URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2406Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfFri","value":"$val"}]}]
|
||||
attr WR_1_API set2406FollowGet 24_Battery_TimeControl
|
||||
attr WR_1_API set2406Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2406Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2406Hint 0,1,2,Battery_TimeControl_5_Fr
|
||||
attr WR_1_API set2406IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
|
||||
attr WR_1_API set2406Method PUT
|
||||
attr WR_1_API set2406Name 24__5_Battery_TimeControl_Fr
|
||||
attr WR_1_API set2406URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set2407Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfSat","value":"$val"}]}]
|
||||
attr WR_1_API set2407Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set2407Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set2407Hint 0,1,2,Battery_TimeControl_6_Sa
|
||||
attr WR_1_API set2407IExpr my $x = ReadingsVal($name,$val,"null");; $x=~s/\s//gs;; ($val =~ /^-?\d+$/)? $val x96 : ($x =~ /^-?\d+$/)? $x : 0 x96
|
||||
attr WR_1_API set2407Method PUT
|
||||
attr WR_1_API set2407Name 24__6_Battery_TimeControl_Sa
|
||||
attr WR_1_API set2407URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set4002Data [{"moduleid":"devices:local","settings":[{"id":"Generator:ShadowMgmt:Enable","value":"$val"}]}]
|
||||
attr WR_1_API set4002FollowGet 40_Generator_und_EnergieMgmt
|
||||
attr WR_1_API set4002Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set4002Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set4002Hint slider,0,1,3
|
||||
attr WR_1_API set4002Method PUT
|
||||
attr WR_1_API set4002Name 40_02_Generator_ShadowMgmt
|
||||
attr WR_1_API set4002URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set4101Data [{"moduleid":"devices:local","settings":[{"id":"DigitalOutputs:Customer:ConfigurationFlags","value":"$val"},{"id":"DigitalOutputs:Customer:DelayTime","value":"5"},{"id":"DigitalOutputs:Customer:PowerMode:OnPowerThreshold","value":"100000"},{"id":"DigitalOutputs:Customer:TimeMode:MaxNoOfSwitchingCyclesPerDay","value":"24"},{"id":"DigitalOutputs:Customer:TimeMode:PowerThreshold","value":"1"},{"id":"DigitalOutputs:Customer:TimeMode:RunTime","value":"1440"},{"id":"DigitalOutputs:Customer:TimeMode:StableTime","value":"1"}]}]
|
||||
attr WR_1_API set4101FollowGet 41_DigitalOutputs
|
||||
attr WR_1_API set4101Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set4101Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set4101Hint 0,9,13,14
|
||||
attr WR_1_API set4101Method PUT
|
||||
attr WR_1_API set4101Name 41_01_DigitalOutputs
|
||||
attr WR_1_API set4101URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_1_API set50-10Name Event_02_code
|
||||
attr WR_1_API set50-11Name Event_02_description
|
||||
attr WR_1_API set50-12Name Event_02_end_time
|
||||
attr WR_1_API set50-13Name Event_02_group
|
||||
attr WR_1_API set50-14Name Event_02_is_active
|
||||
attr WR_1_API set50-15Name Event_02_long_description
|
||||
attr WR_1_API set50-16Name Event_02_start_time
|
||||
attr WR_1_API set50-17Name Event_03_category
|
||||
attr WR_1_API set50-18Name Event_03_code
|
||||
attr WR_1_API set50-19Name Event_03_description
|
||||
attr WR_1_API set50-1Name Event_01_category
|
||||
attr WR_1_API set50-20Name Event_03_end_time
|
||||
attr WR_1_API set50-21Name Event_03_group
|
||||
attr WR_1_API set50-22Name Event_03_is_active
|
||||
attr WR_1_API set50-23Name Event_03_long_description
|
||||
attr WR_1_API set50-24Name Event_03_start_time
|
||||
attr WR_1_API set50-25Name Event_04_category
|
||||
attr WR_1_API set50-26Name Event_04_code
|
||||
attr WR_1_API set50-27Name Event_04_description
|
||||
attr WR_1_API set50-28Name Event_04_end_time
|
||||
attr WR_1_API set50-29Name Event_04_group
|
||||
attr WR_1_API set50-2Name Event_01_code
|
||||
attr WR_1_API set50-30Name Event_04_is_active
|
||||
attr WR_1_API set50-31Name Event_04_long_description
|
||||
attr WR_1_API set50-32Name Event_04_start_time
|
||||
attr WR_1_API set50-33Name Event_05_category
|
||||
attr WR_1_API set50-34Name Event_05_code
|
||||
attr WR_1_API set50-35Name Event_05_description
|
||||
attr WR_1_API set50-36Name Event_05_end_time
|
||||
attr WR_1_API set50-37Name Event_05_group
|
||||
attr WR_1_API set50-38Name Event_05_is_active
|
||||
attr WR_1_API set50-39Name Event_05_long_description
|
||||
attr WR_1_API set50-3Name Event_01_description
|
||||
attr WR_1_API set50-40Name Event_05_start_time
|
||||
attr WR_1_API set50-4Name Event_01_end_time
|
||||
attr WR_1_API set50-5Name Event_01_group
|
||||
attr WR_1_API set50-6Name Event_01_is_active
|
||||
attr WR_1_API set50-7Name Event_01_long_description
|
||||
attr WR_1_API set50-8Name Event_01_start_time
|
||||
attr WR_1_API set50-9Name Event_02_category
|
||||
attr WR_1_API set50Data {"max":5,"language":"$val"}
|
||||
attr WR_1_API set50Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set50Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set50Hint en-gb,de-de
|
||||
attr WR_1_API set50JSON .
|
||||
attr WR_1_API set50Name 50_events_latest_5
|
||||
attr WR_1_API set50ParseResponse 1
|
||||
attr WR_1_API set50TextArg 1
|
||||
attr WR_1_API set50URL http://%IP-WR%/api/v1/events/latest
|
||||
attr WR_1_API set6001Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_1_API set6001Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_1_API set6001Method POST
|
||||
attr WR_1_API set6001Name 60_01_Reset_Wechselrichter
|
||||
attr WR_1_API set6001NoArg 1
|
||||
attr WR_1_API set6001URL http://%IP-WR%/api/v1/system/reboot
|
||||
attr WR_1_API showBody 1
|
||||
attr WR_1_API showError 1
|
||||
attr WR_1_API sid01Data %START%
|
||||
attr WR_1_API sid01ParseResponse 1
|
||||
attr WR_1_API sid01URL http://%IP-WR%/api/v1/auth/start
|
||||
attr WR_1_API sid02Data %FINISH%
|
||||
attr WR_1_API sid02ParseResponse 1
|
||||
attr WR_1_API sid02URL http://%IP-WR%/api/v1/auth/finish
|
||||
attr WR_1_API sid03Data %SESSION%
|
||||
attr WR_1_API sid03ParseResponse 1
|
||||
attr WR_1_API sid03URL http://%IP-WR%/api/v1/auth/create_session
|
||||
attr WR_1_API sidHeader01 Accept-Encoding: gzip,deflate
|
||||
attr WR_1_API sidHeader02 Content-type: application/json, Accept: application/json, Connection: keep-alive
|
||||
attr WR_1_API sortby 112
|
||||
attr WR_1_API stateFormat {\
|
||||
if (AttrVal("$name","verbose",0) >=3) {\
|
||||
my $calcVal = 0;;\
|
||||
my $WR = "WR_1";;\
|
||||
my $YearBefore = "LogDBRep_Statistic_previous_Year";;\
|
||||
my $YearPrevious = ReadingsTimestamp("$YearBefore","SW_Statistic_Yield_Year","null");;\
|
||||
$YearPrevious = ($YearPrevious ne "null") ? POSIX::strftime("%Y",localtime(time_str2num(ReadingsTimestamp("$YearBefore","SW_Statistic_Yield_Year","null")))) : "null";;\
|
||||
\
|
||||
my $QuarterBefore = "LogDBRep_Statistic_previous_Quarter";;\
|
||||
my $QuarterPrevious = "null";;\
|
||||
foreach my $i (1,2,3,4) {if (ReadingsVal("$QuarterBefore","Q".$i,0) eq "previous"){ $QuarterPrevious = "Q".$i }};;\
|
||||
\
|
||||
my $pvt = sprintf("%04d W",ReadingsVal($WR,"SW_Total_AC_Active_P",0) );;\
|
||||
my $pvtd = sprintf("%04d",ReadingsVal("$name","SW_Statistic_Yield_Day",0)/1000 );;\
|
||||
my $pvtm = sprintf("%04d",ReadingsVal("$name","SW_Statistic_Yield_Month",0)/1000 );;\
|
||||
$pvtm .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_SW_Statistic_Yield",0) ) : "";;\
|
||||
my $pvty = sprintf("%05d",ReadingsVal("$name","SW_Statistic_Yield_Year",0)/1000 );;\
|
||||
$pvty .= ($YearPrevious ne "null") ? sprintf(" / %05d", ReadingsVal("$YearBefore","SW_Statistic_Yield_Year",0) ) : "";;\
|
||||
\
|
||||
my $pv = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0)+ReadingsVal($WR,"SW_Home_own_consumption_from_PV",0) );;\
|
||||
my $pvd = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Day",0)/1000 );;\
|
||||
my $pvm = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Month",0)/1000 );;\
|
||||
$pvm .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_SW_Statistic_EnergyHomePv",0) ) : "";;\
|
||||
my $pvy = sprintf("%05d",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Year",0)/1000 );;\
|
||||
$pvy .= ($YearPrevious ne "null") ? sprintf(" / %05d", ReadingsVal("$YearBefore","SW_Statistic_EnergyHomePv_Year",0) ) : "";;\
|
||||
\
|
||||
my $gfi = sprintf("%04d W",(ReadingsVal($WR,"Total_Active_P_EM",0)<=0 ? abs(round(ReadingsVal($WR,"Total_Active_P_EM",0),0)): 0) );;\
|
||||
my $gfid = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Day",0)/1000 );;\
|
||||
my $gfim = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Month",0)/1000 );;\
|
||||
$gfim .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_SW_Statistic_EnergyHomeFeedInGrid",0) ) : "";;\
|
||||
my $gfiy = sprintf("%05d",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Year",0)/1000 );;\
|
||||
$gfiy .= ($YearPrevious ne "null") ? sprintf(" / %05d", ReadingsVal("$YearBefore","SW_Statistic_EnergyHomeFeedInGrid_Year",0) ) : "";;\
|
||||
\
|
||||
my $eb = sprintf("%04d W",(ReadingsVal($WR,"Total_Active_P_EM",0)>=0 ? round(ReadingsVal($WR,"Total_Active_P_EM",0),0) : 0) );;\
|
||||
my $ebd = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Day",0)/1000 );;\
|
||||
my $ebm = sprintf("%04d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Month",0)/1000 );;\
|
||||
$ebm .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_SW_Statistic_EnergyHomeGrid",0) ) : "";;\
|
||||
my $eby = sprintf("%05d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Year",0)/1000 );;\
|
||||
$eby .= ($YearPrevious ne "null") ? sprintf(" / %05d", ReadingsVal("$YearBefore","SW_Statistic_EnergyHomeGrid_Year",0) ) : "";;\
|
||||
\
|
||||
my $pvb = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0));;\
|
||||
my $pvbd = sprintf("%04d",ReadingsVal("$name","Statistic_EnergyHomeBat_Day",0)/1000 );;\
|
||||
my $pvbm = sprintf("%04d",ReadingsVal("$name","Statistic_EnergyHomeBat_Month",0)/1000 );;\
|
||||
$pvbm .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_Statistic_EnergyHomeBat",0) ) : "";;\
|
||||
my $pvby = sprintf("%05d",ReadingsVal("$name","Statistic_EnergyHomeBat_Year",0)/1000 );;\
|
||||
$pvby .= ($YearPrevious ne "null") ? sprintf(" / %05d", ReadingsVal("$YearBefore","Statistic_EnergyHomeBat_Year",0) ) : "";;\
|
||||
\
|
||||
my $et = sprintf("%04d W",(ReadingsVal($WR,"SW_Home_own_consumption_from_PV",0)+ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0)+ReadingsVal($WR,"SW_Home_own_consumption_from_grid",0)) );;\
|
||||
my $etd = sprintf("%04d",ReadingsVal("$name","SW_Statistic_TotalConsumption_Day",0)/1000 );;\
|
||||
my $etm = sprintf("%04d",ReadingsVal("$name","SW_Statistic_TotalConsumption_Month",0)/1000 );;\
|
||||
$etm .= ($QuarterPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$QuarterBefore",$QuarterPrevious."_SW_Statistic_TotalConsumption",0) ) : "";;\
|
||||
my $ety = sprintf("%05d",ReadingsVal("$name","SW_Statistic_TotalConsumption_Year",0)/1000 );;\
|
||||
$ety .= ($YearPrevious ne "null") ? sprintf(" / %05d", ReadingsVal("$YearBefore","SW_Statistic_TotalConsumption_Year",0) ) : "";;\
|
||||
\
|
||||
my $valA = ReadingsVal($WR, "SW_Total_AC_Active_P",0)-ReadingsVal($WR, "SW_Home_own_consumption_from_grid",0);;\
|
||||
$calcVal = ($valA > 0) ? round($valA /($valA + ReadingsVal($WR, "SW_Home_own_consumption_from_grid",""))*100 ,0) : 0;;\
|
||||
my $aq = sprintf("%4d %%",(($calcVal > 100) ? 100 : $calcVal) );;\
|
||||
\
|
||||
my $aqd = sprintf("%3d %%",ReadingsVal("$name","SW_Statistic_Autarky_Day",0) );;\
|
||||
my $aqm = sprintf("%3d %%",ReadingsVal("$name","SW_Statistic_Autarky_Month",0) );;\
|
||||
my $aqy = sprintf("%3d %%",ReadingsVal("$name","SW_Statistic_Autarky_Year",0) );;\
|
||||
$aqy .= ($YearPrevious ne "null") ? sprintf(" / %3d %%", ReadingsVal("$YearBefore","SW_Statistic_Autarky_Year",0) ) : "";;\
|
||||
\
|
||||
my $valS = ReadingsVal($WR,"SW_Total_AC_Active_P",0);;\
|
||||
$calcVal = ($valS > 0) ? round((ReadingsVal($WR,"SW_Home_own_consumption_from_PV",0) + ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0)) / $valS * 100 ,0) : 0;;\
|
||||
my $sq = sprintf("%4d %%",(($calcVal > 100) ? 100 : $calcVal) );;\
|
||||
\
|
||||
my $sqd = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_OwnConsumptionRate_Day",0) );;\
|
||||
my $sqm = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_OwnConsumptionRate_Month",0) );;\
|
||||
my $sqy = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_OwnConsumptionRate_Year",0) );;\
|
||||
$sqy .= ($YearPrevious ne "null") ? sprintf(" / %3d %%", ReadingsVal("$YearBefore","SW_Statistic_OwnConsumptionRate_Year",0) ) : "";;\
|
||||
\
|
||||
my $date = POSIX::strftime("%Y-%m-%d",localtime(time_str2num(ReadingsTimestamp($name, "auth_me_authenticated",0))));;\
|
||||
my $md = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "auth_me_authenticated",0))));;\
|
||||
my $cd = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Day",0))));;\
|
||||
my $cm = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Month",0))));;\
|
||||
$cm .= ($QuarterPrevious ne "null") ? " / ".POSIX::strftime("%d.%m",localtime(time_str2num(ReadingsTimestamp("$QuarterBefore","$QuarterPrevious",0) ))) : "";;\
|
||||
my $cy = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Year",0))));;\
|
||||
$cy .= ($YearPrevious ne "null") ? " / ".$YearPrevious : "";;\
|
||||
\
|
||||
"<html><table border=2 bordercolor='darkgreen' cellspacing=0 style='width: 100%'>\
|
||||
<colgroup>\
|
||||
<col span='1' style='width: 52%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
<col span='1' style='width: 12%;;'>\
|
||||
</colgroup>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Statistik vom $date in kWh</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold;;text-align:center'>aktuell</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold;;text-align:center'>Heute</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold;;text-align:center'>Monat".(($QuarterPrevious ne "null") ? " / ".$QuarterPrevious : "")."</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold;;text-align:center'>Jahr".(($YearPrevious ne "0") ? " / Vorjahr" : "")."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Erzeugung PV-Total</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pvt."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pvtd."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pvtm."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pvty."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Bezug von PV</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pv."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pvd."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pvm."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pvy."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Bezug von Batterie</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pvb."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pvbd."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pvbm."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$pvby."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Bezug ins Haus (Energieverbrauch)</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$et."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$etd."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$etm."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$ety."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Bezug vom Netz</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$eb."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$ebd."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$ebm."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$eby."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Einspeisung ins Netz</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$gfi."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$gfid."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$gfim."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$gfiy."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Autarkiequote</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$aq."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$aqd."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$aqm."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$aqy."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Eigenverbrauchsquote</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$sq."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$sqd."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$sqm."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$sqy."</td></tr>\
|
||||
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Berechnet um</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$md."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$cd."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$cm."</td><td style='padding-right:5px;;padding-left:5px;;text-align:center'>".$cy."</td></tr>\
|
||||
</table></html>"\
|
||||
}\
|
||||
}\
|
||||
|
||||
attr WR_1_API timeout 7
|
||||
attr WR_1_API userReadings Statistic_EnergyHomePvSum_Day:Statistic_EnergyHomePv_Day.* {round( (ReadingsVal("$NAME","Statistic_EnergyHomeBat_Day", "0")+ReadingsVal("$NAME","Statistic_EnergyHomePv_Day", "0")) ,2)},\
|
||||
\
|
||||
Statistic_EnergyHomePvSum_Month:Statistic_EnergyHomePv_Month.* {round( (ReadingsVal("$NAME","Statistic_EnergyHomeBat_Month", "0")+ReadingsVal("$NAME","Statistic_EnergyHomePv_Month", "0")) ,2)},\
|
||||
\
|
||||
Statistic_EnergyHomePvSum_Year:Statistic_EnergyHomePv_Year.* {round( (ReadingsVal("$NAME","Statistic_EnergyHomeBat_Year", "0")+ReadingsVal("$NAME","Statistic_EnergyHomePv_Year", "0")) ,2)},\
|
||||
\
|
||||
\
|
||||
Statistic_EnergyFeedInGrid_Day:Statistic_Yield_Day.* {round((ReadingsVal("$NAME","Statistic_Yield_Day", "")-ReadingsVal("$NAME","Statistic_EnergyHomeBat_Day", "0")-ReadingsVal("$NAME","Statistic_EnergyHomePv_Day", "0")),2)},\
|
||||
\
|
||||
Statistic_EnergyFeedInGrid_Month:Statistic_Yield_Month.* {round((ReadingsVal("$NAME","Statistic_Yield_Month", "")-ReadingsVal("$NAME","Statistic_EnergyHomeBat_Month", "0")-ReadingsVal("$NAME","Statistic_EnergyHomePv_Month", "0")),2)},\
|
||||
\
|
||||
Statistic_EnergyFeedInGrid_Year:Statistic_Yield_Year.* {round((ReadingsVal("$NAME","Statistic_Yield_Year", "")-ReadingsVal("$NAME","Statistic_EnergyHomeBat_Year", "0")-ReadingsVal("$NAME","Statistic_EnergyHomePv_Year", "0")),2)},\
|
||||
\
|
||||
\
|
||||
Statistic_TotalConsumption_Day:Statistic_EnergyHomePv_Day.* { round((ReadingsVal("$NAME","Statistic_EnergyHomePv_Day","0")+ReadingsVal("$NAME","Statistic_EnergyHomeBat_Day","0")+ReadingsVal("$NAME","Statistic_EnergyHomeGrid_Day","0") ) ,2) },\
|
||||
\
|
||||
Statistic_TotalConsumption_Month:Statistic_EnergyHomePv_Month.* { round((ReadingsVal("$NAME","Statistic_EnergyHomePv_Month","0")+ReadingsVal("$NAME","Statistic_EnergyHomeBat_Month","0")+ReadingsVal("$NAME","Statistic_EnergyHomeGrid_Month","0") ) ,2) },\
|
||||
\
|
||||
Statistic_TotalConsumption_Year:Statistic_EnergyHomePv_Year.* { round( (ReadingsVal("$NAME","Statistic_EnergyHomePv_Year","0")+ReadingsVal("$NAME","Statistic_EnergyHomeBat_Year","0")+ReadingsVal("$NAME","Statistic_EnergyHomeGrid_Year","0") ),2) },\
|
||||
\
|
||||
\
|
||||
Statistic_Yield_NoBat_Day:Statistic_Yield_Day.* { round((ReadingsVal("$NAME","Statistic_Yield_Day",0)-ReadingsVal("$NAME","Statistic_EnergyHomeBat_Day",0)),0) },\
|
||||
Statistic_Yield_NoBat_Month:Statistic_Yield_Month.* { round((ReadingsVal("$NAME","Statistic_Yield_Month",0)-ReadingsVal("$NAME","Statistic_EnergyHomeBat_Month",0)),0) },\
|
||||
Statistic_Yield_NoBat_Year:Statistic_Yield_Year.* { round((ReadingsVal("$NAME","Statistic_Yield_Year",0)-ReadingsVal("$NAME","Statistic_EnergyHomeBat_Year",0)),0) },\
|
||||
\
|
||||
\
|
||||
SW_Statistic_EnergyPv1_Day:Statistic_EnergyPv1_Day.* { round(ReadingsVal("$NAME","Statistic_EnergyPv1_Day",0),0)},\
|
||||
SW_Statistic_EnergyPv1_Month:Statistic_EnergyPv1_Month.* { round(ReadingsVal("$NAME","Statistic_EnergyPv1_Month",0),0)},\
|
||||
SW_Statistic_EnergyPv1_Total:Statistic_EnergyPv1_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyPv1_Total",0),0)},\
|
||||
SW_Statistic_EnergyPv1_Year:Statistic_EnergyPv1_Year.* { round(ReadingsVal("$NAME","Statistic_EnergyPv1_Year",0),0)},\
|
||||
SW_Statistic_EnergyPv2_Day:Statistic_EnergyPv2_Day.* { round(ReadingsVal("$NAME","Statistic_EnergyPv2_Day",0),0)},\
|
||||
SW_Statistic_EnergyPv2_Month:Statistic_EnergyPv2_Month.* { round(ReadingsVal("$NAME","Statistic_EnergyPv2_Month",0),0)},\
|
||||
SW_Statistic_EnergyPv2_Total:Statistic_EnergyPv2_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyPv2_Total",0),0)},\
|
||||
SW_Statistic_EnergyPv2_Year:Statistic_EnergyPv2_Year.* { round(ReadingsVal("$NAME","Statistic_EnergyPv2_Year",0),0)},\
|
||||
SW_Statistic_EnergyPv3_Day:Statistic_EnergyPv3_Day.* { round(ReadingsVal("$NAME","Statistic_EnergyPv3_Day",0),0)},\
|
||||
SW_Statistic_EnergyPv3_Month:Statistic_EnergyPv3_Month.* { round(ReadingsVal("$NAME","Statistic_EnergyPv3_Month",0),0)},\
|
||||
SW_Statistic_EnergyPv3_Total:Statistic_EnergyPv3_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyPv3_Total",0),0)},\
|
||||
SW_Statistic_EnergyPv3_Year:Statistic_EnergyPv3_Year.* { round(ReadingsVal("$NAME","Statistic_EnergyPv3_Year",0),0)},\
|
||||
\
|
||||
SW_Statistic_EnergyPv4_Day:Statistic_EnergyPv1_Day.* { round(ReadingsVal("WR_2_API","Statistic_EnergyPv1_Day",0),0)},\
|
||||
SW_Statistic_EnergyPv4_Month:Statistic_EnergyPv1_Month.* { round(ReadingsVal("WR_2_API","Statistic_EnergyPv1_Month",0),0)},\
|
||||
SW_Statistic_EnergyPv4_Total:Statistic_EnergyPv1_Total.* monotonic { round(ReadingsVal("WR_2_API","Statistic_EnergyPv1_Total",0),0)},\
|
||||
SW_Statistic_EnergyPv4_Year:Statistic_EnergyPv1_Year.* { round(ReadingsVal("WR_2_API","Statistic_EnergyPv1_Year",0),0)},\
|
||||
SW_Statistic_EnergyPv5_Day:Statistic_EnergyPv2_Day.* { round(ReadingsVal("WR_2_API","Statistic_EnergyPv2_Day",0),0)},\
|
||||
SW_Statistic_EnergyPv5_Month:Statistic_EnergyPv2_Month.* { round(ReadingsVal("WR_2_API","Statistic_EnergyPv2_Month",0),0)},\
|
||||
SW_Statistic_EnergyPv5_Total:Statistic_EnergyPv2_Total.* monotonic { round(ReadingsVal("WR_2_API","Statistic_EnergyPv2_Total",0),0)},\
|
||||
SW_Statistic_EnergyPv5_Year:Statistic_EnergyPv2_Year.* { round(ReadingsVal("WR_2_API","Statistic_EnergyPv2_Year",0),0)},\
|
||||
SW_Statistic_EnergyPv6_Day:Statistic_EnergyPv3_Day.* { round(ReadingsVal("WR_2_API","Statistic_EnergyPv3_Day",0),0)},\
|
||||
SW_Statistic_EnergyPv6_Month:Statistic_EnergyPv3_Month.* { round(ReadingsVal("WR_2_API","Statistic_EnergyPv3_Month",0),0)},\
|
||||
SW_Statistic_EnergyPv6_Total:Statistic_EnergyPv3_Total.* monotonic { round(ReadingsVal("WR_2_API","Statistic_EnergyPv3_Total",0),0)},\
|
||||
SW_Statistic_EnergyPv6_Year:Statistic_EnergyPv3_Year.* { round(ReadingsVal("WR_2_API","Statistic_EnergyPv3_Year",0),0)},\
|
||||
\
|
||||
SW_Statistic_Yield_Day:Statistic_Yield_Day.* { round(ReadingsVal("$NAME","Statistic_Yield_Day",0)+ReadingsVal("WR_2_API","Statistic_Yield_Day",0),0)},\
|
||||
SW_Statistic_Yield_Month:Statistic_Yield_Month.* { round(ReadingsVal("$NAME","Statistic_Yield_Month",0)+ReadingsVal("WR_2_API","Statistic_Yield_Month",0),0)},\
|
||||
SW_Statistic_Yield_Total:Statistic_Yield_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_Yield_Total",0)+ReadingsVal("WR_2_API","Statistic_Yield_Total",0),0)},\
|
||||
SW_Statistic_Yield_Year:Statistic_Yield_Year.* { round(ReadingsVal("$NAME","Statistic_Yield_Year",0)+ReadingsVal("WR_2_API","Statistic_Yield_Year",0),0)},\
|
||||
\
|
||||
SW_Statistic_Yield_NoBat_Day:Statistic_Yield_Day.* { round((ReadingsVal("$NAME","SW_Statistic_Yield_Day",0)-ReadingsVal("$NAME","Statistic_EnergyHomeBat_Day",0)),0)},\
|
||||
SW_Statistic_Yield_NoBat_Month:Statistic_Yield_Month.* { round((ReadingsVal("$NAME","SW_Statistic_Yield_Month",0)-ReadingsVal("$NAME","Statistic_EnergyHomeBat_Month",0)),0)},\
|
||||
SW_Statistic_Yield_NoBat_Year:Statistic_Yield_Year.* { round((ReadingsVal("$NAME","SW_Statistic_Yield_Year",0)-ReadingsVal("$NAME","Statistic_EnergyHomeBat_Year",0)),0)},\
|
||||
\
|
||||
SW_Statistic_EnergyHomeFeedInGrid_Day:SW_Statistic_Yield_Day.* { (ReadingsVal("WR_0_KSEM","Active_energy-",0) - ReadingsVal("$NAME","SW_Meter_init_FeedInGrid_Day",0)) * 1000 },\
|
||||
SW_Statistic_EnergyHomeFeedInGrid_Month:SW_Statistic_Yield_Month.* { (ReadingsVal("WR_0_KSEM","Active_energy-",0) - ReadingsVal("$NAME","SW_Meter_init_FeedInGrid_Month",0)) * 1000 },\
|
||||
SW_Statistic_EnergyHomeFeedInGrid_Year:SW_Statistic_Yield_Year.* { (ReadingsVal("WR_0_KSEM","Active_energy-",0) - ReadingsVal("$NAME","SW_Meter_init_FeedInGrid_Year",0)) * 1000 },\
|
||||
\
|
||||
SW_Statistic_EnergyHomeGrid_Day:SW_Statistic_Yield_Day.* { (ReadingsVal("WR_0_KSEM","Active_energy+",0) - ReadingsVal("$NAME","SW_Meter_init_Grid_Day",0)) * 1000 },\
|
||||
SW_Statistic_EnergyHomeGrid_Month:SW_Statistic_Yield_Month.* { (ReadingsVal("WR_0_KSEM","Active_energy+",0) - ReadingsVal("$NAME","SW_Meter_init_Grid_Month",0)) * 1000 },\
|
||||
SW_Statistic_EnergyHomeGrid_Year:SW_Statistic_Yield_Year.* { (ReadingsVal("WR_0_KSEM","Active_energy+",0) - ReadingsVal("$NAME","SW_Meter_init_Grid_Year",0)) * 1000 },\
|
||||
\
|
||||
SW_Statistic_EnergyHomePv_Day:SW_Statistic_EnergyHomeFeedInGrid_Day.* { round(ReadingsVal("$NAME","SW_Statistic_Yield_Day",0) - ReadingsVal("$NAME","SW_Statistic_EnergyHomeFeedInGrid_Day",0) - ReadingsVal("$NAME","Statistic_EnergyHomeBat_Day",0),0) },\
|
||||
SW_Statistic_EnergyHomePv_Month:SW_Statistic_EnergyHomeFeedInGrid_Month.* { round(ReadingsVal("$NAME","SW_Statistic_Yield_Month",0) - ReadingsVal("$NAME","SW_Statistic_EnergyHomeFeedInGrid_Month",0) - ReadingsVal("$NAME","Statistic_EnergyHomeBat_Month",0),0) },\
|
||||
SW_Statistic_EnergyHomePv_Year:SW_Statistic_EnergyHomeFeedInGrid_Year.* { round(ReadingsVal("$NAME","SW_Statistic_Yield_Year",0) - ReadingsVal("$NAME","SW_Statistic_EnergyHomeFeedInGrid_Year",0) - ReadingsVal("$NAME","Statistic_EnergyHomeBat_Year",0),0) },\
|
||||
\
|
||||
SW_Statistic_EnergyHomePvSum_Day:SW_Statistic_EnergyHomeFeedInGrid_Day.* { round(ReadingsVal("$NAME","SW_Statistic_Yield_Day",0) - ReadingsVal("$NAME","SW_Statistic_EnergyHomeFeedInGrid_Day",0),0) },\
|
||||
SW_Statistic_EnergyHomePvSum_Month:SW_Statistic_EnergyHomeFeedInGrid_Month.* { round(ReadingsVal("$NAME","SW_Statistic_Yield_Month",0) - ReadingsVal("$NAME","SW_Statistic_EnergyHomeFeedInGrid_Month",0),0) },\
|
||||
SW_Statistic_EnergyHomePvSum_Year:SW_Statistic_EnergyHomeFeedInGrid_Year.* { round(ReadingsVal("$NAME","SW_Statistic_Yield_Year",0) - ReadingsVal("$NAME","SW_Statistic_EnergyHomeFeedInGrid_Year",0),0) },\
|
||||
\
|
||||
SW_Statistic_EnergyHome_Day:SW_Statistic_EnergyHomeFeedInGrid_Day.* { ReadingsVal("$NAME","SW_Statistic_Yield_Day",0) + ReadingsVal("$NAME","SW_Statistic_EnergyHomeGrid_Day",0) - ReadingsVal("$NAME","SW_Statistic_EnergyHomeFeedInGrid_Day" ,0) },\
|
||||
SW_Statistic_EnergyHome_Month:SW_Statistic_EnergyHomeFeedInGrid_Month.* { ReadingsVal("$NAME","SW_Statistic_Yield_Month",0) + ReadingsVal("$NAME","SW_Statistic_EnergyHomeGrid_Month",0) - ReadingsVal("$NAME","SW_Statistic_EnergyHomeFeedInGrid_Month",0) },\
|
||||
SW_Statistic_EnergyHome_Year:SW_Statistic_EnergyHomeFeedInGrid_Year.* { ReadingsVal("$NAME","SW_Statistic_Yield_Year",0) + ReadingsVal("$NAME","SW_Statistic_EnergyHomeGrid_Year",0) - ReadingsVal("$NAME","SW_Statistic_EnergyHomeFeedInGrid_Year",0) },\
|
||||
\
|
||||
SW_Statistic_TotalConsumption_Day:SW_Statistic_EnergyHomePv_Day.* { round( (ReadingsVal("$NAME","SW_Statistic_EnergyHomePv_Day",0)+ReadingsVal("$NAME","Statistic_EnergyHomeBat_Day",0)+ReadingsVal("$NAME","SW_Statistic_EnergyHomeGrid_Day",0) ) ,0) },\
|
||||
SW_Statistic_TotalConsumption_Month:SW_Statistic_EnergyHomePv_Month.* { round( (ReadingsVal("$NAME","SW_Statistic_EnergyHomePv_Month",0)+ReadingsVal("$NAME","Statistic_EnergyHomeBat_Month",0) +ReadingsVal("$NAME","SW_Statistic_EnergyHomeGrid_Month",0) ),0) },\
|
||||
SW_Statistic_TotalConsumption_Year:SW_Statistic_EnergyHomePv_Year.* { round( (ReadingsVal("$NAME","SW_Statistic_EnergyHomePv_Year",0)+ReadingsVal("$NAME","Statistic_EnergyHomeBat_Year",0) +ReadingsVal("$NAME","SW_Statistic_EnergyHomeGrid_Year",0) ),0) },\
|
||||
\
|
||||
SW_Statistic_Autarky_Day:SW_Statistic_EnergyHomePvSum_Day.* { my $SW_Statistic_EnergyHome_Day = ReadingsVal("$NAME","SW_Statistic_EnergyHome_Day",0) ;;;; ($SW_Statistic_EnergyHome_Day eq 0)? 0 : round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePvSum_Day",0) / $SW_Statistic_EnergyHome_Day *100,0) },\
|
||||
\
|
||||
SW_Statistic_Autarky_Month:SW_Statistic_EnergyHomePvSum_Month.* { round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePvSum_Month",0) / ReadingsVal("$NAME","SW_Statistic_EnergyHome_Month",0) *100,0) },\
|
||||
SW_Statistic_Autarky_Year:SW_Statistic_EnergyHomePvSum_Year.* { round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePvSum_Year",0) / ReadingsVal("$NAME","SW_Statistic_EnergyHome_Year",0) *100,0) },\
|
||||
\
|
||||
SW_Statistic_OwnConsumptionRate_Day:SW_Statistic_EnergyHomePvSum_Day.* {my $SW_Statistic_Yield_Day = ReadingsVal("$NAME","SW_Statistic_Yield_Day",0) ;;;; ($SW_Statistic_Yield_Day eq 0)? 0 : round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePvSum_Day" ,0) / $SW_Statistic_Yield_Day*100,0) },\
|
||||
SW_Statistic_OwnConsumptionRate_Month:SW_Statistic_EnergyHomePvSum_Month.* {my $SW_Statistic_Yield_Month = ReadingsVal("$NAME","SW_Statistic_Yield_Month",0) ;;;; ($SW_Statistic_Yield_Month eq 0)? 0 : round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePvSum_Month" ,0) / $SW_Statistic_Yield_Month*100,0) },\
|
||||
SW_Statistic_OwnConsumptionRate_Year:SW_Statistic_EnergyHomePvSum_Year.* {my $SW_Statistic_Yield_Year = ReadingsVal("$NAME","SW_Statistic_Yield_Year",0) ;;;; ($SW_Statistic_Yield_Year eq 0)? 0 : round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePvSum_Year" ,0) / $SW_Statistic_Yield_Year*100,0) },\
|
||||
\
|
||||
SW_Statistic_EnergyChargeGrid_Total:Statistic_EnergyChargeGrid_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyChargeGrid_Total",0),0)},\
|
||||
SW_Statistic_EnergyChargeInvIn_Total:Statistic_EnergyChargeInvIn_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyChargeInvIn_Total",0),0)},\
|
||||
SW_Statistic_EnergyChargePv_Total:Statistic_EnergyChargePv_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyChargePv_Total",0),0)},\
|
||||
SW_Statistic_EnergyDischargeGrid_Total:Statistic_EnergyDischargeGrid_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyDischargeGrid_Total",0),0)},\
|
||||
SW_Statistic_EnergyDischarge_Total:Statistic_EnergyDischarge_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyDischarge_Total",0),0)},\
|
||||
SW_Statistic_EnergyHomeBat_Total:Statistic_EnergyHomeBat_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyHomeBat_Total",0),0)},\
|
||||
SW_Statistic_EnergyHomeGrid_Total:Statistic_EnergyHomeGrid_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyHomeGrid_Total",0),0)},\
|
||||
SW_Statistic_EnergyHomeOwn_Total:Statistic_EnergyHomeOwn_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyHomeOwn_Total",0),0)},\
|
||||
SW_Statistic_EnergyHomePv_Total:Statistic_EnergyHomePv_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyHomePv_Total",0),0)},\
|
||||
SW_Statistic_EnergyHome_Total:Statistic_EnergyHome_Total.* monotonic { round(ReadingsVal("$NAME","Statistic_EnergyHome_Total",0),0)},\
|
||||
\
|
||||
SW_Statistic_Autarky_Total:SW_Statistic_EnergyHomePv_Total.* { round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePv_Total",0) / ReadingsVal("$NAME","SW_Statistic_EnergyHome_Total",0) *100,0) },\
|
||||
\
|
||||
SW_Statistic_OwnConsumptionRate_Total:SW_Statistic_EnergyHomePv_Total.* {my $SW_Statistic_Yield_Total = ReadingsVal("$NAME","SW_Statistic_Yield_Total",0) ;;;; ($SW_Statistic_Yield_Total eq 0)? 0 : round(ReadingsVal("$NAME","SW_Statistic_EnergyHomePv_Total" ,0) / $SW_Statistic_Yield_Total*100,0) }
|
||||
attr WR_1_API verbose 0
|
@ -0,0 +1,985 @@
|
||||
defmod WR_1_Speicher_1_ExternControl DOIF ################################################################################################################\
|
||||
## 1 Speicher Status vom WR_1_Speicher_1 aktualisieren.\
|
||||
## Dies geschieht über das WR_1_API Device, da der Speicher direkt am Wechselrichter angeschlossen ist.\
|
||||
##\
|
||||
1_Status_WR_1_Speicher_1\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
( [:52] ## jede Stunde\
|
||||
\
|
||||
or [$SELF:ui_command_1] eq "Status_Speicher" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if( [?$SELF:ui_command_1] eq "Status_Speicher" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
}\
|
||||
\
|
||||
::CommandGet(undef, "WR_1_API 21_Battery_Information");;\
|
||||
::CommandGet(undef, "WR_1_API 22_Battery_InternControl");;\
|
||||
::CommandGet(undef, "WR_1_API 23_Battery_ExternControl");;\
|
||||
::CommandGet(undef, "WR_1_API 25_Battery_EM_State");;\
|
||||
|
||||
if (AttrVal("$SELF","verbose",0) >=4) {\
|
||||
Log 3, "$SELF cmd_1 : Speicher Status abfrage"\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 2 Wenn die Ladung im Herbst/Winter unter MinSoc geht allen PV Überschuss in die Batterie laden\
|
||||
##\
|
||||
## Im Winter kann der MinSoc, durch den WR Eigenverbrauch, unterschritten werden, deshalb wird vorher auf\
|
||||
## smarte_laden umgeschaltet, bis die Batterie wieder einen hohen Soc erreicht hat. Siehe cmd_3 laden_beendet\
|
||||
##\
|
||||
2_smart_Laden_start_Automatik\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
( [WR_ctl:Yield_fc0_day] < [$SELF:SpeicherMinSOC_fc1_Limit] ## Im Herbst/Winter ist wenig zu erwarten\
|
||||
and [WR_1:Act_state_of_charge] <= [WR_1_API:Battery_InternControl_MinSoc] ## Achtung der Speicherstand wird zu niedrig\
|
||||
and [WR_1_API:Battery_InternControl_MinHomeConsumption] <= 100 ## Der Speicher steht auf Entladen\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "smart_Laden_start" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if( [?$SELF:ui_command_1] eq "smart_Laden_start" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
\
|
||||
::CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 30000");; ## Speicher für Entladung sperren\
|
||||
set_Reading("SpeicherExternTrigger","gesperrt");; ## Externe Trigger verriegeln \
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_2.1: smart_laden aktiviert";;\
|
||||
Log 3, "$SELF cmd_2.1: SpeicherExternTrigger, Entlademodus gesperrt";;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
2_smart_Laden_start_WB\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and ( [WB_1:lp_1_ChargeStat] eq "loading" ## Ein Fahrzeug wird gerade geladen\
|
||||
or [WB_1:lp_2_ChargeStat] eq "loading" )\
|
||||
and [$SELF:SpeicherWB_buffer] eq "Aus" ## Der Speicher darf nicht zum Laden verwendet werden\
|
||||
or\
|
||||
[$SELF:ui_command_1] eq "smart_Laden_starten_WB" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
\
|
||||
if( [?$SELF:ui_command_1] eq "smart_Laden_starten_WB" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
\
|
||||
if( [?$SELF:WB_smart_laden_before] eq "---" ) {\
|
||||
if([?$SELF:SpeicherExternTrigger] eq "gesperrt" and\
|
||||
[?WR_1_API:Battery_InternControl_MinHomeConsumption] eq "30000" ) {\
|
||||
set_Reading("WB_smart_laden_before","aktiv");; ## Externe Trigger verriegeln \
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF cmd_2.2: WallBox smart_laden_before aktiv"};;\
|
||||
} else {\
|
||||
fhem("setreading $SELF WB_smart_laden_before inaktiv");; ## Den vorherigen Zustand merken\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF cmd_2.2: WallBox smart_laden_before inaktiv"};;\
|
||||
}\
|
||||
} else {\
|
||||
if (AttrVal("$SELF","verbose",0) >= 0)\
|
||||
{Log 3, "$SELF cmd_2.2: WallBox es wird gerade geladen"};; ## Der vorherige Zustand war schon bekannt\
|
||||
}\
|
||||
\
|
||||
::CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 30000");; ## Speicher für Entladung sperren\
|
||||
set_Reading("SpeicherExternTrigger","gesperrt");; ## Externe Trigger verriegeln \
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_2.2: smart_laden aktiviert";;\
|
||||
Log 3, "$SELF cmd_2.2: SpeicherExternTrigger, Entlademodus gesperrt";;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 3 Beim erreichen von 90% Soc die Entladung wieder frei geben\
|
||||
## \
|
||||
3_smart_Laden_beenden_Automatik\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
[$SELF:SpeicherEntladung] eq "Automatik" ## Nur für den Automatik Modus\
|
||||
and\
|
||||
[$SELF:WB_smart_laden_before] eq "---" ## Es wird gerade kein Fahrzeug geladen\
|
||||
and\
|
||||
(\
|
||||
(\
|
||||
[WR_1_API:Battery_InternControl_MinHomeConsumption] > 100 ## Das Speicher Entladen ist geperrt\
|
||||
and\
|
||||
[WR_1:Act_state_of_charge] >= 80 ## Der Speicher ist bereits 80% voll\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "smart_Laden_beenden" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if( [?$SELF:ui_command_1] eq "smart_Laden_beenden" ) { ## Hier wurde manuell aktiviert\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_3.1: Batterie wird mit ".[?$SELF:SpeicherEntladung]." Steuerung gesteuert";;\
|
||||
Log 3, "$SELF cmd_3.1: Batterie auf ".[?WR_1:Act_state_of_charge]." %, Entlademodus freigegeben"};;\
|
||||
::CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 50");;\
|
||||
set_Reading("SpeicherExternTrigger","none");; ## den externen Trigger wieder freigeben\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
3_smart_Laden_beenden_WB\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
(\
|
||||
[WB_1:lp_1_ChargeStat] ne "loading" ## Es wird gerade kein Fahrzeug geladen\
|
||||
and\
|
||||
[WB_1:lp_2_ChargeStat] ne "loading"\
|
||||
and\
|
||||
[$SELF:WB_smart_laden_before] eq "inaktiv" ## Vorher war es nicht aktiv\
|
||||
)\
|
||||
or [$SELF:SpeicherWB_buffer] eq "An" ## Der Speicher darf zum Laden verwendet werden\
|
||||
or [$SELF:ui_command_1] eq "smart_Laden_beenden_WB" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if( [?$SELF:ui_command_1] eq "smart_Laden_beenden_WB" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
\
|
||||
set_Reading("WB_smart_laden_before","---");; ## den Merker wieder zurück setzen\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_3.2: Wallbox smart_laden beenden";;\
|
||||
Log 3, "$SELF cmd_3.2: Batterie wird mit ".[?$SELF:SpeicherEntladung]." Steuerung gesteuert";;\
|
||||
Log 3, "$SELF cmd_3.2: Batterie auf ".[?WR_1:Act_state_of_charge]." %, Entlademodus freigegeben"};;\
|
||||
::CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 50");;\
|
||||
\
|
||||
if ( ( [?WB_1:lp_1_ChargeStat] eq "loading" ## Es wird ein Auto geladen\
|
||||
or [?WB_1:lp_2_ChargeStat] eq "loading")\
|
||||
and [?$SELF:SpeicherWB_buffer] eq "An") {\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_3.2: MaxSOC Limitierung wegen Wallboxnutzung abgeschaltet";;}\
|
||||
}\
|
||||
\
|
||||
set_Reading("SpeicherExternTrigger","none");; ## den externen Trigger wieder freigeben\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 3 Wenn vor dem WB_1 laden das smart_Laden aktiv gewesen ist geht es zurück in den Zustand\
|
||||
## \
|
||||
3_smart_Laden_umschalten_WB\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
[WB_1:lp_1_ChargeStat] ne "loading" ## Es wird gerade kein Fahrzeug geladen\
|
||||
and\
|
||||
[WB_1:lp_2_ChargeStat] ne "loading" \
|
||||
and\
|
||||
[$SELF:WB_smart_laden_before] eq "aktiv" ## Vorher war es nicht aktiv\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if( [?$SELF:ui_command_1] eq "smart_Laden_umschalten_WB" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
\
|
||||
set_Reading("WB_smart_laden_before","---");; ## den Merker wieder zurück setzen\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_3.3: Batterie wird mit ".[?$SELF:SpeicherEntladung]." Steuerung gesteuert";;\
|
||||
Log 3, "$SELF cmd_3.3: WB_1 laden beendet, reaktivieren des smart_Laden"};;\
|
||||
::CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 30000");;\
|
||||
set_Reading("SpeicherExternTrigger","gesperrt");; ## Externe Trigger verriegeln \
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_3.3: smart_laden aktiviert";;\
|
||||
Log 3, "$SELF cmd_3.3: SpeicherExternTrigger, Entlademodus gesperrt";;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 3 Bei Zeitsteuerung und guter Prognose bei 40% wieder frei geben\
|
||||
## \
|
||||
3_smart_Laden_beenden_Zeit\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and [$SELF:SpeicherEntladung] eq "Zeit" ## Nur für den Zeit Modus\
|
||||
and [[$SELF:SpeicherZeitStart]-[$SELF:SpeicherZeitEnde]] ## Zeitfenster aktiv ist\
|
||||
and [$SELF:WB_smart_laden_before] eq "---" ## Es wird gerade kein Fahrzeug geladen\
|
||||
and\
|
||||
(\
|
||||
[WR_1_API:Battery_InternControl_MinHomeConsumption] > 100\
|
||||
and\
|
||||
(\
|
||||
[WR_1:Act_state_of_charge] >= 40 ## und einem Stand von Soc 40%\
|
||||
and\
|
||||
([WR_ctl:Yield_fc0_day] > [$SELF:SpeicherMinSOC_fc1_Limit] ## wenn es heute oder \
|
||||
or [WR_ctl:Yield_fc1_day] > [$SELF:SpeicherMinSOC_fc1_Limit]) ## morgen viel Leistung gibt\
|
||||
)\
|
||||
\
|
||||
or [$SELF:ui_command_1] eq "smart_Laden_beenden_zeit" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if( [?$SELF:ui_command_1] eq "smart_Laden_beenden" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_3.3: Batterie wird mit ".[?$SELF:SpeicherEntladung]." Steuerung gesteuert";;\
|
||||
Log 3, "$SELF cmd_3.3: Batterie auf ".[?WR_1:Act_state_of_charge]." %, SpeicherExternTrigger, freigegeben";;\
|
||||
Log 3, "$SELF cmd_3.3: Die Leistungsprognose von ".[?$SELF:SpeicherMinSOC_fc1_Limit]." wird überschritten"};;\
|
||||
set_Reading("SpeicherExternTrigger","frei");; ## Trigger freigeben\
|
||||
set_Reading("SpeicherTrigger","entladen");; ## Signalisiere entladen im stateFormat\
|
||||
::CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 50");; ## Speicher für Entladung freigeben\
|
||||
\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 4 Freigabe der Batterie mit externem Trigger oder bei Zeitsteuerung\
|
||||
## z.B. ([07:00-16:00]\
|
||||
4_Trigger\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
( [$SELF:SpeicherExternTrigger] eq "frei" ## Verriegelung, wenn zwangsgeladen werden muss\
|
||||
and [WR_1_API:Battery_InternControl_MinHomeConsumption] > 100\
|
||||
and\
|
||||
( [$SELF:SpeicherEntladung] eq "Trigger" ## Triggersteuerung\
|
||||
and [$SELF:SpeicherTrigger] eq "entladen" ## also Speicherentladung freigeben\
|
||||
or \
|
||||
[$SELF:SpeicherEntladung] eq "Zeit" ## oder bei Zeitsteuerung wenn das\
|
||||
and [[$SELF:SpeicherZeitStart]-[$SELF:SpeicherZeitEnde]] ## Zeitfenster aktiv ist\
|
||||
)\
|
||||
)\
|
||||
\
|
||||
or [$SELF:ui_command_1] eq "Trigger" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if( [?$SELF:ui_command_1] eq "Trigger" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
::CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 50");; ## Speicher für Entladung freigeben\
|
||||
set_Reading("SpeicherTrigger","entladen");; ## Signalisiere entladen im stateFormat\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_4 : SpeicherExternTrigger, Entlademodus freigegeben"};;\
|
||||
\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 5 Sperren der Batterie mit externem Trigger oder bei Zeitsteuerung\
|
||||
## z.B. [16:00-07:00]\
|
||||
5_Trigger_sperren\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
( [$SELF:SpeicherExternTrigger] eq "frei" ## Verriegelung, wenn zwangsgeladen werden muss\
|
||||
and [WR_1_API:Battery_InternControl_MinHomeConsumption] <= 100\
|
||||
and\
|
||||
( [$SELF:SpeicherEntladung] eq "Trigger" ## Triggersteuerung\
|
||||
and [$SELF:SpeicherTrigger] eq "entladen" ## also Speicherentladung freigeben\
|
||||
or \
|
||||
[$SELF:SpeicherEntladung] eq "Zeit" ## oder bei Zeitsteuerung wenn das\
|
||||
and [[$SELF:SpeicherZeitEnde]-[$SELF:SpeicherZeitStart]] ## Zeitfenster verlassen wurde\
|
||||
)\
|
||||
)\
|
||||
\
|
||||
or [$SELF:ui_command_1] eq "Trigger_sperren" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
::CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 30000");;## Speicher für Entladung sperren\
|
||||
set_Reading("SpeicherTrigger","gesperrt");; ## Signalisiere gesperrt im stateFormat\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_5 : SpeicherExternTrigger, Entlademodus gesperrt (Tarif oder Trigger)"};;\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 6 Wiederhole alle 180s die Kommandos der ExternControl Steuerung\
|
||||
##\
|
||||
6_Kommando_Wiederholung\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
((\
|
||||
[WR_1_API:Battery_Control] > 0 and ## Wenn die ExternControl am WR konfiguriert ist\
|
||||
[$SELF:SpeicherCmdRepeatActive] eq "An" and ## Wenn die ExternControl Aktiviert ist\
|
||||
[$SELF:SpeicherCmdRepeatRunning] eq "An" and ## Wenn es ExternControl Kommandos zum Senden gibt\
|
||||
[ {sunrise_abs("HORIZON=+5.0",0,"6:00","08:35")} ## Innerhalb der Photovoltaik Zeit\
|
||||
- {sunset_abs("HORIZON=+8.0",0,"15:00","21:00")} ] and\
|
||||
[+([WR_1_API:Battery_ComMonitor_Time]-30)] ## Den Befehl nach eingestellter Zeit wiederholen\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "Kommando_Wiederholung" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if( [?$SELF:ui_command_1] eq "Kommando_Wiederholung" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
}\
|
||||
\
|
||||
my $MaxChargePowerTime = 0;;\
|
||||
my $MaxChargePowerAbs_midday = 0;;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=4) { ## Hier können noch Testmeldungen hin\
|
||||
Log 3, "$SELF cmd_Test : SpeicherMiddayControlRunning ".[?$SELF:SpeicherMiddayControlRunning];;\
|
||||
Log 3, "$SELF cmd_Test : Yield_fc0_middayhigh_start ".[?WR_ctl:Yield_fc0_middayhigh_start];;\
|
||||
Log 3, "$SELF cmd_Test : Yield_fc0_middayhigh_stop ".[?WR_ctl:Yield_fc0_middayhigh_stop];;\
|
||||
}\
|
||||
\
|
||||
if ([?$SELF:SpeicherMiddayControlRunning] eq "An" ) { ## Wurde ein Mittagshoch ermittelt und aktiviert?\
|
||||
\
|
||||
if ( [?WR_1:Act_state_of_charge] >= [?WR_1_API:Battery_InternControl_MinSoc] *3 ) {\
|
||||
if ( time < ::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?$SELF:SpeicherMidday_NotBefore].":00") ) {\
|
||||
::CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 0");; ## nicht vor z.B. 09:00 Uhr starten. Ladung auf 0 Watt setzen\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) { ## Es wird nur langsam geladen und MaxSOC limitiert.\
|
||||
Log 3, "$SELF cmd_6 : SpeicherMiddayControl vor ".[?$SELF:SpeicherMidday_NotBefore]." Uhr noch nicht laden";;\
|
||||
}\
|
||||
} else { ## Ist noch Vormittag?\
|
||||
if ( time < ::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?WR_ctl:Yield_fc0_middayhigh_start].":00") ) {\
|
||||
::CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs ".[?$SELF:SpeicherMidday_MaxChargePowerAbs_morning]);;\
|
||||
set_Exec("wait_ExternControl",4,'::CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel ".'.[?$SELF:SpeicherMidday_MaxSOC].')');;\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) { ## Es wird nur langsam geladen und MaxSOC limitiert.\
|
||||
Log 3, "$SELF cmd_6 : SpeicherMiddayControl vor ".[?WR_ctl:Yield_fc0_middayhigh_start]." limitieren";;\
|
||||
Log 3, "$SELF cmd_6 : Battery_ExternControl_MaxChargePowerAbs auf ".[?$SELF:SpeicherMidday_MaxChargePowerAbs_morning]." limitiert";;\
|
||||
Log 3, "$SELF cmd_6 : Battery_ExternControl_MaxSOC auf ".[?$SELF:SpeicherMidday_MaxSOC]." % limitiert";;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
} else {\
|
||||
Log 3, "$SELF cmd_6 : Battery_InternControl_MinSoc auf ".([?WR_1_API:Battery_InternControl_MinSoc] *3)." % laden";;\
|
||||
}\
|
||||
\
|
||||
if (::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?WR_ctl:Yield_fc0_middayhigh_start].":00") <= time and ## Es ist Mittag\
|
||||
time <= ::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?WR_ctl:Yield_fc0_middayhigh_stop].":00") ) {\
|
||||
\
|
||||
my $wait = POSIX::strftime("%H:%M",localtime(::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?WR_ctl:Yield_fc0_middayhigh_start].":00")+3600 ));;\
|
||||
$wait = POSIX::strftime("%H:%M",localtime(::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?WR_ctl:Yield_fc0_middayhigh_start].":00") ));;\
|
||||
\
|
||||
if ([?$SELF:SpeicherMaxSOCControlRunning] eq "An" and ## Somit bleibt weniger Platz im Speicher und es ist\
|
||||
time < ::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".$wait.":00") ) { ## besser nicht zu früh beginnen.\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_6 : SpeicherMiddayControlActive laden wegen MaxSoc von ".[?WR_ctl:Yield_fc0_middayhigh_start]." auf ".$wait." Uhr verschoben"};;\
|
||||
## Das wurde auskommentiert, damit das BEV mehr 70% Laden kann\
|
||||
## fhem("setreading WR_ctl Yield_fc0_middayhigh_start ".$wait);;\
|
||||
## ::CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 0");;\
|
||||
\
|
||||
} else { ## auch jetzt nicht mit voller Leistung laden\
|
||||
\
|
||||
if ([?$SELF:SpeicherMidday_MaxChargePowerAbs_midday] == 0) { ## dynamische Leistungsermittlung oder vorgewählter Wert\
|
||||
$MaxChargePowerTime = ::round((::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?WR_ctl:Yield_fc0_middayhigh_stop].":00") - time) / 3600 , 2);; ## Mittags Ladezeit bestimmen\
|
||||
\
|
||||
my $MaxChargePowerLimit = (1 - ::round($MaxChargePowerTime,2) * [?$SELF:SpeicherMidday_MaxChargePowerSteigung]);; ## Zu Beginn etwas langsamer anfangen, empirisch ermittelt\
|
||||
\
|
||||
$MaxChargePowerAbs_midday = ::round( [?WR_1:Battery_work_capacity] * ([?$SELF:SpeicherMaxSOC_Actual] - [?WR_1:Act_state_of_charge]) / 100 * $MaxChargePowerLimit, 0);;\
|
||||
\
|
||||
## Log 3, "$SELF cmd_6 : Test ".$MaxChargePowerTime." ".$MaxChargePowerLimit." ".$MaxChargePowerAbs_midday." vorher ".::round( [?WR_1:Battery_work_capacity] * ([?$SELF:SpeicherMaxSOC_Actual] - [?WR_1:Act_state_of_charge]) / 100 * (1 - ::round($MaxChargePowerTime,2) * [?$SELF:SpeicherMidday_MaxChargePowerSteigung]), 0);;\
|
||||
\
|
||||
if ($MaxChargePowerAbs_midday < 500) { $MaxChargePowerAbs_midday = 500 };;## Nicht unter 1000\
|
||||
Log 3, "$SELF cmd_6 : Mittags $MaxChargePowerTime h mit $MaxChargePowerAbs_midday W laden";;\
|
||||
} else {\
|
||||
$MaxChargePowerAbs_midday = [?$SELF:SpeicherMidday_MaxChargePowerAbs_midday];; ## Nimm den vorgewählten Wert\
|
||||
};;\
|
||||
\
|
||||
::CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs $MaxChargePowerAbs_midday");;\
|
||||
set_Exec("wait_ExternControl",4,'::CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel ".'.[?$SELF:SpeicherMaxSOC_Actual].')');;\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF cmd_6 : SpeicherMiddayControlActive laden von ".[?WR_ctl:Yield_fc0_middayhigh_start]." bis ".[?WR_ctl:Yield_fc0_middayhigh_stop]." freigegeben";;\
|
||||
Log 3, "$SELF cmd_6 : Battery_ExternControl_MaxChargePowerAbs auf $MaxChargePowerAbs_midday limitiert";;\
|
||||
Log 3, "$SELF cmd_6 : Battery_ExternControl_MaxSocRel ".[?$SELF:SpeicherMaxSOC_Actual]." % halten"\
|
||||
};;\
|
||||
};;\
|
||||
};;\
|
||||
\
|
||||
if (time > ::time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." ".[?WR_ctl:Yield_fc0_middayhigh_stop].":00") ) { ## Es ist Nachmittag und die\
|
||||
set_Reading("SpeicherMiddayControlRunning","Aus");; ## Mittagssteuerung wird abgeschaltet\
|
||||
::CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel ".[?$SELF:SpeicherMaxSOC_Actual]);;\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF cmd_6 : Battery_ExternControl_MaxSocRel ".[?$SELF:SpeicherMaxSOC_Actual]." % halten";;\
|
||||
Log 3, "$SELF cmd_6 : SpeicherMiddayControl nach ".[?WR_ctl:Yield_fc0_middayhigh_stop]." beendet";;\
|
||||
};;\
|
||||
};;\
|
||||
};;\
|
||||
\
|
||||
if (ReadingsVal("$SELF","SpeicherMaxSOCControlRunning","") eq "An" and ## Nur MaxSOC soll begrenzt werden\
|
||||
[$SELF:SpeicherMaxSOC_Actual] <= 100 and \
|
||||
ReadingsVal("$SELF","SpeicherMiddayControlRunning","") eq "Aus") { ## sobald die Mittagssteuerung fertig ist\
|
||||
if ([?WR_1:SW_Home_own_consumption_from_Battery] > 500) { ## Sollte der Speicher bereits jetzt verwendet werden ist es besser\
|
||||
set_Reading("SpeicherMaxSOCControlRunning","Aus");; ## die MaxSOC Begrenzung zu stoppen\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_6 : SpeicherMaxSOCControl wegen Speicher Nutzung am Nachmittag beendet"};;\
|
||||
} else {\
|
||||
::CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel ".[?$SELF:SpeicherMaxSOC_Actual]);;\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_6 : Battery_ExternControl_MaxSocRel ".[?$SELF:SpeicherMaxSOC_Actual]." % halten"};;\
|
||||
};;\
|
||||
};;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=4)\
|
||||
{Log 3, "$SELF cmd_6 : ExternControl Kommando Wiederholung erledigt"};;\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 7 Bestimmung eines möglichen SOC für den nächsten Morgen und\
|
||||
## Vorbereitung für ein Leistungshoch am Mittag\
|
||||
##\
|
||||
7_SOC_Calculation\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
(\
|
||||
([WR_1_API:Battery_Control] > 0 and ## Ist die ExternControl am WR aktiviert\
|
||||
([$SELF:SpeicherMaxSOCControlActive] eq "An" or ## Ist MaxSOC Limit konfiguriert\
|
||||
[$SELF:SpeicherMiddayControlActive] eq "An" ) and ## Ist Midday Kontrolle konfiguriert\
|
||||
[$SELF:SpeicherMaxSOC_MinSOC_Time] eq "NULL" and ## Wurde ein minimum SOC bereits ermittelt\
|
||||
[{sunrise_abs("HORIZON=+4.0",0,"5:50","08:35")} - 10:00 ] and\
|
||||
[WR_1:SW_Home_own_consumption_from_PV] == [WR_1:SW_Home_own_consumption] ## Die PV Leistung reicht für's Haus\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "SOC_Calculation" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
if( [?$SELF:ui_command_1] eq "SOC_Calculation" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
}\
|
||||
\
|
||||
my $MinSOC_Time = "gefunden";; ## Nur einmal am Tag bearbeiten\
|
||||
my $MinSOC_MinSOC = ::round([?WR_1:Act_state_of_charge],0);; ## Festgestellter MinSOC am Morgen Magic ???\
|
||||
set_Reading("SpeicherMaxSOC_MinSOC_Time",$MinSOC_Time);;\
|
||||
set_Reading("SpeicherMaxSOC_MinSOC_MinSOC",$MinSOC_MinSOC);;\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) { ## merken und melden\
|
||||
Log 3, "$SELF cmd_7 : SpeicherMaxSOC_MinSOC_Time ".$MinSOC_Time." ".$MinSOC_MinSOC." %";;\
|
||||
};;\
|
||||
\
|
||||
#############\
|
||||
\
|
||||
if ([?$SELF:SpeicherMaxSOCControlActive] eq "An" and\
|
||||
[?WR_1_API:Battery_InternControl_MinHomeConsumption] < 100 and ## Der Speicher darf nicht im smart_laden sein\
|
||||
[?Pool_Counter:countsPerDay] == 0 and ## Achtung der Pool und auch die LWP\
|
||||
[?LWP_Counter:countsPerDay] == 0 ) { ## sollten nicht mehr früh morgens laufen\
|
||||
\
|
||||
my $SpeicherSOCMinimum = [?WR_1_API:Battery_InternControl_MinSoc]*3;; ## 3x MinSOC als reserve vorsehen\
|
||||
my $SpeicherSOCDayBefore = ::round(ReadingsVal("$SELF","SpeicherMaxSOC_DayBefore", 100),0);; ## wie voll war er gestern noch?\
|
||||
my $SpeicherSOCNew = 0;;\
|
||||
my $SpeicherSOCDelta = 0;;\
|
||||
\
|
||||
if ([?WR_ctl:Yield_fc1_day] > [?$SELF:SpeicherMaxSOC_fc1_Limit] and\
|
||||
$MinSOC_MinSOC > $SpeicherSOCMinimum ) { ## Ist der Speicher voller als er müsste?\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3){\
|
||||
Log 3, "$SELF cmd_7 : SpeicherMaxSOC_DayBefore ".$SpeicherSOCDayBefore." %";;\
|
||||
Log 3, "$SELF cmd_7 : Leistung Prognose ".[?WR_ctl:Yield_fc1_day]." wh > Schwellwert ".[?$SELF:SpeicherMaxSOC_fc1_Limit]." wh";;\
|
||||
Log 3, "$SELF cmd_7 : Speicherladung aktuell $MinSOC_MinSOC % > Minimum $SpeicherSOCMinimum %";;\
|
||||
};;\
|
||||
$SpeicherSOCDelta = $MinSOC_MinSOC - $SpeicherSOCMinimum;; ## Was wäre noch übrig?\
|
||||
if ($SpeicherSOCDelta <= 10) { ## Das lohnt sich nicht\
|
||||
$SpeicherSOCNew = $SpeicherSOCDayBefore;; ## den Wert von gestern einfach beibehalten\
|
||||
set_Reading("SpeicherMaxSOC_Actual",$SpeicherSOCDayBefore);;\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_7 : SpeicherMaxSOC_DayBefore ".$SpeicherSOCDayBefore." % gesichert"};;\
|
||||
} else {\
|
||||
$SpeicherSOCNew = ::round(($SpeicherSOCDayBefore+$SpeicherSOCDayBefore-$SpeicherSOCDelta)/2 ,0);; ## um den Durchschnitt verringern\
|
||||
set_Reading("SpeicherMaxSOC_Actual",$SpeicherSOCNew);; ## Das soll heute in den Speicher\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_7 : SpeicherMaxSOC_DayBefore ".$SpeicherSOCNew." % neu berechnet und gesichert"};;\
|
||||
};;\
|
||||
\
|
||||
if ($SpeicherSOCNew > 0) { ## Es gibt einen neuen MaxSoc\
|
||||
set_Reading("SpeicherMaxSOCControlRunning","An");; ## Senden starten\
|
||||
set_Reading("SpeicherCmdRepeatRunning","An");; ## Wiederholung starten\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_7 : SpeicherMaxSOC_Actual ".$SpeicherSOCNew." % geplant"};;\
|
||||
} else { ## MaxSoc wird nicht begrenzt\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_7 : SpeicherMaxSOC_Actual wird nicht begrenzt"};;\
|
||||
};;\
|
||||
\
|
||||
} else { ## MaxSoc wird nicht begrenzt\
|
||||
if ($MinSOC_MinSOC < $SpeicherSOCMinimum ) { ## MaxSoc leicht erhöhen, da er etwas zu niedrig war\
|
||||
$SpeicherSOCNew = ::round($SpeicherSOCDayBefore+$SpeicherSOCMinimum-$MinSOC_MinSOC ,0);;\
|
||||
$SpeicherSOCDelta = ::round($SpeicherSOCMinimum-$MinSOC_MinSOC ,0);;\
|
||||
set_Reading("SpeicherMaxSOC_DayBefore",$SpeicherSOCNew);;\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_7 : SpeicherMaxSOC_DayBefore wurde um ".$SpeicherSOCDelta." erhöht"};;\
|
||||
}\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_7 : SpeicherMaxSOC_Actual wird nicht begrenzt, da die Prognose für morgen zu schlecht ist"};;\
|
||||
};;\
|
||||
};;\
|
||||
\
|
||||
if ([?$SELF:SpeicherMiddayControlActive] eq "An" and ## Soll für mittags noch Platz gehalten werden?\
|
||||
[?WR_ctl:Yield_fc0_middayhigh] == 1 ) { \
|
||||
\
|
||||
set_Reading("SpeicherMiddayControlRunning","An");; ## Die Mittagskontrolle aktivieren\
|
||||
set_Reading("SpeicherCmdRepeatRunning","An");;\
|
||||
if (AttrVal("$SELF","verbose",0) >=3){ ## (die Uhrzeiten wurden bereits durch Solar_forecast() im WR_1 Device eingetragen)\
|
||||
Log 3, "$SELF cmd_7 : Batterie SpeicherMiddayControlRunning vorbereitet";;\
|
||||
Log 3, "$SELF cmd_7 : Batterie Yield_fc0_middayhigh_start ".ReadingsVal("WR_ctl","Yield_fc0_middayhigh_start", "00:00")." gesetzt";;\
|
||||
Log 3, "$SELF cmd_7 : Batterie Yield_fc0_middayhigh_stop ".ReadingsVal("WR_ctl","Yield_fc0_middayhigh_stop ", "00:00")." gesetzt";;\
|
||||
};;\
|
||||
} else { ## Kein Mittagshoch\
|
||||
Log 3, "$SELF cmd_7 : SpeicherMiddayControl es wird kein Middayhigh geben";;\
|
||||
};;\
|
||||
\
|
||||
#############\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 8 Reset der ExternControl Kommandos\
|
||||
##\
|
||||
8_Reset\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
[{sunset_abs("HORIZON=+8.0",0,"16:00","21:00")}] ## hier sollte das Ende der PV-Zeit sein\
|
||||
or [$SELF:ui_command_1] eq "Reset" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
if( [$SELF:ui_command_1] eq "Reset" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[$SELF:ui_command_1]);;\
|
||||
}\
|
||||
\
|
||||
set_Reading("SpeicherCmdRepeatRunning","Aus");; ## Stop das regelmäßige senden der Kommandos\
|
||||
\
|
||||
set_Reading("SpeicherMaxSOCControlRunning","Aus");; ## Max SOC Steuerung zurücksetzen\
|
||||
set_Reading("SpeicherMaxSOC_Actual","100");; ## SpeicherMaxSOC_Actual auf Default\
|
||||
set_Reading("SpeicherMaxSOC_DayBefore",[?WR_1:Act_state_of_charge]);; ## Den vor Tages Wert merken\
|
||||
set_Reading("SpeicherMaxSOC_MinSOC_Time","NULL");; ## Die MinSOC Time löschen\
|
||||
\
|
||||
set_Reading("SpeicherMiddayControlRunning","Aus");; ## Midday Steuerung zurücksetzen\
|
||||
\
|
||||
fhem("setreading WR_ctl Yield_fc0_middayhigh 0");;\
|
||||
fhem("setreading WR_ctl Yield_fc0_middayhigh_start 00:00");;\
|
||||
fhem("setreading WR_ctl Yield_fc0_middayhigh_stop 00:00");;\
|
||||
\
|
||||
fhem("setreading WR_ctl Yield_fc1_middayhigh 0");;\
|
||||
fhem("setreading WR_ctl Yield_fc1_middayhigh_start 00:00");;\
|
||||
fhem("setreading WR_ctl Yield_fc1_middayhigh_stop 00:00");;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_8 : ExternControl zurückgesetzt"};;\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 9 Umschaltung des MinSOC wenn zu wenig Leistung erwartet wird, das ist dann im Herbst/Winter\
|
||||
##\
|
||||
9_MinSOC_Winter\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
([WR_ctl:Yield_fc1_day] < [$SELF:SpeicherMinSOC_fc1_Limit] and ## Wenn morgen das Minimum an Leistung nicht erreicht wird\
|
||||
[WR_1_API:Battery_InternControl_MinSoc] < [$SELF:SpeicherMinSOC_Winter] and ## und der MinSoc unter der Winter Wert eingestellt ist\
|
||||
([$SELF:SpeicherMaxSOC_MinSOC_Time] eq "gefunden" or\
|
||||
[$SELF:SpeicherMaxSOC_MinSOC_Time] eq "NULL" and [10:01])\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "Winter" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
if( [?$SELF:ui_command_1] eq "Winter" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
}\
|
||||
\
|
||||
::CommandSet(undef, "WR_1_API 22_04_Battery_MinSoc ".[?$SELF:SpeicherMinSOC_Winter]);; ## Den MinSOC anheben, um eine eventuelle\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_9 : Batterie MinSoc auf Winterbetrieb"};; ## Notladung zu verhindern\
|
||||
set_Reading("SpeicherCmdRepeatRunning","Aus");; ## Stop das regelmäßige senden der Kommandos\
|
||||
set_Reading("SpeicherMaxSOCControlRunning","Aus");; ## Im Winter Betrieb keine MaxSOC Begrenzung\
|
||||
set_Reading("SpeicherMiddayControlRunning","Aus");; ## und keine Midday Steuerung\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_9 : MaxSOC Begrenzung und Midday Steuerung im Winterbetrieb deaktiviert"};;\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 10 Umschaltung des MinSoc wenn viel Leistung erwartet wir, das wäre dann Frühling/Sommer\
|
||||
##\
|
||||
10_MinSOC_Sommer\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
([WR_ctl:Yield_fc1_day] > [$SELF:SpeicherMinSOC_fc1_Limit] and ## sobald viel Ladung erwartet wird und der MinSoc noch\
|
||||
[WR_1_API:Battery_InternControl_MinSoc] > [$SELF:SpeicherMinSOC_Sommer] and ## noch im Winter Modus ist\
|
||||
[10:09] \
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "Sommer" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
if( [?$SELF:ui_command_1] eq "Sommer" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
}\
|
||||
\
|
||||
::CommandSet(undef, "WR_1_API 22_04_Battery_MinSoc ".[?$SELF:SpeicherMinSOC_Sommer]);; ## den MinSOC auf Sommerbetrieb herabsetzen, es kann\
|
||||
if (AttrVal("$SELF","verbose",0) >=3)\
|
||||
{Log 3, "$SELF cmd_10 : Batterie MinSoc auf Sommerbetrieb"};; ## wieder mehr Leistung genutzt werden\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 11 Der Speicher ist voll geladen. Hier wird das ständige nachladen auf 100 % vermieden.\
|
||||
##\
|
||||
11_Speicher_voll\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
( [WR_ctl:Yield_fc0_day] > [$SELF:SpeicherMaxSOC_fc1_Limit] and ## 1) sobald viel Leistung erwartet wird und der Speicher voll ist\
|
||||
[WR_1:Act_state_of_charge] == 100 and ## den MaxSOC wieder reduzieren, damit nicht immer nachgeladen wird\
|
||||
[$SELF:SpeicherMaxSOC_Actual] ne 95 ## \
|
||||
or\
|
||||
([$SELF:SpeicherMaxSOC_Actual] == 95 and ## 2) oder das Nachladen gestoppt wurde\
|
||||
[WR_1:Act_state_of_charge] <= 98 and ## und der SOC unte 98 % gefallen ist\
|
||||
[{sunset_abs("HORIZON=+8.0",-7200,"15:00","21:00")}]) ## zwei Stunden vor Sonnenuntergang eventuell wieder nachladen\
|
||||
) and [$SELF:ui_command_1] eq "---"\
|
||||
or [$SELF:ui_command_1] eq "Speicher_voll" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
if( [?$SELF:ui_command_1] eq "Speicher_voll" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
}\
|
||||
\
|
||||
if ([?WR_1:Act_state_of_charge] <= 98) {\
|
||||
set_Reading("SpeicherMaxSOC_Actual","100");; ## Eventuell noch mal nachladen\
|
||||
set_Reading("SpeicherMaxSOCControlRunning","Aus");;\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF cmd_11 : Battery_ExternControl_MaxSocRel auf 100 % nachladen";;\
|
||||
};;\
|
||||
} else {\
|
||||
set_Reading("SpeicherMaxSOC_Actual","95");;\
|
||||
set_Reading("SpeicherCmdRepeatRunning","An");; ## Start regelmäßiges senden der Kommandos\
|
||||
set_Reading("SpeicherMaxSOCControlRunning","An");; ## MaxSOC Begrenzung weil Speicher bereits 100 % hat\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF cmd_11 : Battery_ExternControl_MaxSocRel auf 95 % reduziert";;\
|
||||
};;\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 12 WR_1_Speicher_1 DC_Power_Abs setzen z.B. zur Zwangsentladung\
|
||||
## dies muss manuell wiederholt werden. Danach hängt es vom WR ab, wie er die Speichersteuerung fortsetzt.\
|
||||
12_DC_Power_Abs \
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
[$SELF:ui_command_1] eq "DC_Power_Abs" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
if( [?$SELF:ui_command_1] eq "DC_Power_Abs" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
}\
|
||||
\
|
||||
::CommandSet(undef, "WR_1_API 23_05_Battery_ExternControl_DcPowerAbs ".[?$SELF:SpeicherDcPowerAbs]);;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF cmd_12 : Battery_ExternControl_DcPowerAbs auf ".[?$SELF:SpeicherDcPowerAbs]." gesetzt";;\
|
||||
};;\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 6 Wiederhole alle 180s die Kommandos der ExternControl Steuerung\
|
||||
##\
|
||||
16_Stop_Standby_Entladung\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
((\
|
||||
[WR_1_API:Battery_Control] > 0 and ## Wenn die ExternControl am WR konfiguriert ist\
|
||||
[$SELF:SpeicherCmdRepeatActive] eq "An" and ## Wenn die ExternControl Aktiviert ist\
|
||||
[$SELF:SpeicherExternTrigger] eq "gesperrt" and ## Das smart_Laden\
|
||||
[WR_1_API:Battery_InternControl_MinHomeConsumption] == 30000 and ## aktiviert wurde\
|
||||
[WR_1:Total_Active_P_EM] > 0 and ## Es wird nicht ins Netz eingespeist\
|
||||
[$SELF:SpeicherDcPowerAbs] == 5000 and ## Es wird anderweitig kein Wert vorgegeben <<< ist nicht mehr aktiv\
|
||||
[+([WR_1_API:Battery_ComMonitor_Time]-30)] ## Den Befehl nach eingestellter Zeit wiederholen\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "Stop_Standby_Entladung" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if( [?$SELF:ui_command_1] eq "Stop_Standby_Entladung" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
}\
|
||||
\
|
||||
::CommandSet(undef, "WR_1_API 23_05_Battery_ExternControl_DcPowerAbs -10");;\
|
||||
set_Exec("16_Battery_EM_State",30,'::CommandGet(undef, "WR_1_API 25_Battery_EM_State")');;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=4) {\
|
||||
Log 3, "$SELF cmd_16 : Battery_ExternControl_DcPowerAbs auf -10 gesetzt";;\
|
||||
};;\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 17 Wiederhole alle 180s das Kommando für die DcPowerAbs Steuerung\
|
||||
##\
|
||||
17_Kommando_Wiederholung_DcPowerAbs\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
((\
|
||||
[$SELF:SpeicherTriggerLaden] eq "An" ## Ist der Trigger für das Zwangsladen aktiv?\
|
||||
and [$SELF:SpeicherDcPowerAbs] ne 0 ## Wurde eine Lade/Entlade Leistung eingestellt?\
|
||||
and ( [+58] ## Den Befehl nach eingestellter Zeit wiederholen\
|
||||
or [$SELF:SpeicherDcPowerAbs]\
|
||||
)\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "Kommando_Wiederholung_DcPowerAbs" ## Hier wird das uiTable select ausgewertet\
|
||||
or [$SELF:SpeicherTriggerLaden] eq "Aus" ## Hier wird die externe Steuerung beendet\
|
||||
and [$SELF:SpeicherDcPowerAbs] ne 0\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if( [?$SELF:ui_command_1] eq "Kommando_Wiederholung_DcPowerAbs" ) { ## Hier wurde manuell eingeschaltet\
|
||||
set_Reading("ui_command_1_before",[?$SELF:ui_command_1]);;\
|
||||
}\
|
||||
if([?$SELF:SpeicherTriggerLaden] eq "An") {\
|
||||
set_Exec("17_Battery_EM_State",30,'::CommandGet(undef, "WR_1_API 25_Battery_EM_State")');;\
|
||||
} else {\
|
||||
set_Reading("SpeicherDcPowerAbs",0);;\
|
||||
\
|
||||
set_Exec("17_Battery_ComMonitor_Time",90,'::CommandSet(undef, "WR_1_API 23_12_Battery_ComMonitor_Time '.[?WR_1_API:Battery_ComMonitor_Time].'")');;\
|
||||
::CommandSet(undef, "WR_1_API 23_12_Battery_ComMonitor_Time 60");;\
|
||||
\
|
||||
set_Exec("17_Battery_EM_State",90,'::CommandGet(undef, "WR_1_API 25_Battery_EM_State");;Log 3, "$SELF cmd_17 : 25_Battery_EM_State abgerufen"');;\
|
||||
}\
|
||||
\
|
||||
::CommandSet(undef, "WR_1_API 23_05_Battery_ExternControl_DcPowerAbs [?$SELF:SpeicherDcPowerAbs]");;\
|
||||
set_Exec("17_Repeat_CMD",13,'::CommandSet(undef, "WR_1_API 23_05_Battery_ExternControl_DcPowerAbs '.[?$SELF:SpeicherDcPowerAbs].'")');;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF cmd_17 : Battery_ExternControl_DcPowerAbs auf ".[?$SELF:SpeicherDcPowerAbs]." gesetzt";;\
|
||||
};;\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 18 SpeicherStromboerse\
|
||||
##\
|
||||
18_SpeicherStromboerse\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
((\
|
||||
[$SELF:SpeicherStromboerse] eq "Tibber" ## Soll Tibber verwendet werden?\
|
||||
and [EVU_Tibber_connect:fc0_trigger] ## Wurde der Trigger geändert\
|
||||
\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "SpeicherStromboerse" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
if ([?EVU_Tibber_connect:fc0_trigger] eq "on") {\
|
||||
set_Reading("SpeicherDcPowerAbs",[?$SELF:SpeicherStromboerseDcPowerAbs]);;\
|
||||
fhem("setreading $SELF SpeicherTriggerLaden An");;\
|
||||
} else {\
|
||||
fhem("setreading $SELF SpeicherTriggerLaden Aus");;\
|
||||
fhem("setreading $SELF SpeicherDcPowerAbs 0");;\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}
|
||||
attr WR_1_Speicher_1_ExternControl DbLogExclude .*
|
||||
attr WR_1_Speicher_1_ExternControl alias WR_1_Speicher_1_ExternControl
|
||||
attr WR_1_Speicher_1_ExternControl comment Version 2023.06.21 14:00\
|
||||
\
|
||||
Hier können externe Trigger für die Ladung und Entladung Der Batterie gesetzt werden.\
|
||||
Die Zeiten können z.B. durch den WeekDayTimer entsprechend an einen Stromtarif angepasst werden.\
|
||||
Das reading SpeicherEntladung Automatik/Zeit/SpeicherTrigger ermöglicht es die Zeitsteuerung zu überschreiben.\
|
||||
\
|
||||
ExternTrigger\
|
||||
Das reading dient dem Freigeben und Sperren der externen Trigger, z.B. um im Herbst/Winter das smart_laden zu steuern.\
|
||||
Es verriegelt somit die Zeitsteuerung oder den SpeicherTrigger.\
|
||||
\
|
||||
SpeicherEntladung:Automatik,Zeit,SpeicherTrigger \
|
||||
Automatik - Der Speicher wird vom Wechselrichter gesteuert, oder über die eigene ExternControl der API\
|
||||
Zeit - Das Laden und Entladen wird mit den Zeitwerten beeinflusst\
|
||||
SpeicherTrigger - beeinflusst das Laden und Entladen direkt ohne die Zeitsteuerung\
|
||||
\
|
||||
SpeicherTrigger:entladen,gesperrt\
|
||||
Dieser Trigger kann durch ander Logik gesetzt werden.\
|
||||
Auch hier wäre eine Zeitsteuerung denkbar, die entladen/gesperrt entsprechend umschaltet.\
|
||||
\
|
||||
SpeicherZeitStart/SpeicherZeitEnde\
|
||||
Die Zeitangaben können manuell fest gesetzt werden, oder über zusätzliche Timer täglich neu überschrieben werden.\
|
||||
Eine gültige Zeit und entsprechendes Timeing obliegt dem Anwender.\
|
||||
Zwischen Start und Ende wird der Speicher zum Entladen freigegeben und zwischen Ende und Start gesperrt.\
|
||||
\
|
||||
Speicher*ControlActive\
|
||||
Das jeweilige reading aktiviert diese Teilkomponente für die Steuerung.\
|
||||
Ein jeweiliges Speicher*ControlRunning signalisiert, ob gerade die Bedingungen erfüllt sind.\
|
||||
\
|
||||
SpeicherCmdRepeatActive\
|
||||
Es muss im WR die externe Speicher Steuerung aktiviert sein.\
|
||||
Möchte man trotzdem die Sendung der ExternControl Kommandos stoppen, obwohl die Bedingungen erfüllt sind,\
|
||||
kann man dieses reading zum Deaktivieren auf 0 setzen.\
|
||||
\
|
||||
SpeicherMiddayControl\
|
||||
Über die Solar_forecast() Funktion wird ein Middayhigh ermittelt, wenn der WR nur 70% einspeisen darf.\
|
||||
\
|
||||
SpeicherMaxSOCControl\
|
||||
Es wird versucht den Speicher am Abend nicht zu 100% zu laden, aber morgens noch mit 3* MinSOC aus der Nacht zu kommen.\
|
||||
\
|
||||
SpeicherMinSOC\
|
||||
Dies gehört zur Basis Steuerung und schaltet den MinSOC von Sommer auf Winter Betrieb,\
|
||||
um eine Notladung aus dem Netz zu vermeiden.
|
||||
attr WR_1_Speicher_1_ExternControl disable 0
|
||||
attr WR_1_Speicher_1_ExternControl group PV Eigenverbrauch
|
||||
attr WR_1_Speicher_1_ExternControl icon measure_battery_100
|
||||
attr WR_1_Speicher_1_ExternControl readingList SpeicherExternTrigger SpeicherCmdRepeatActive SpeicherZeitStart SpeicherZeitEnde SpeicherEntladung SpeicherTrigger SpeicherMiddayControlActive SpeicherMidday_Inverter_Max_Power SpeicherMidday_MaxChargePowerAbs_morning SpeicherMidday_MaxChargePowerAbs_midday SpeicherMidday_MaxChargePowerSteigung SpeicherMidday_MaxSOC SpeicherMidday_NotBefore SpeicherMinSOC_Sommer SpeicherMinSOC_Winter SpeicherMinSOC_fc1_Limit SpeicherMaxSOCControlActive SpeicherMaxSOC_Actual SpeicherMaxSOC_DayBefore SpeicherMaxSOC_fc1_Limit
|
||||
attr WR_1_Speicher_1_ExternControl room 2_PV_Steuerung,Strom->Photovoltaik
|
||||
attr WR_1_Speicher_1_ExternControl setList SpeicherExternTrigger:frei,gesperrt SpeicherCmdRepeatActive:0,1 SpeicherZeitStart:time SpeicherZeitEnde:time SpeicherEntladung:Automatik,Zeit,Trigger SpeicherTrigger:entladen,gesperrt,none SpeicherMiddayControlActive:0,1 SpeicherMidday_Inverter_Max_Power:slider,3000,500,20000 SpeicherMidday_MaxChargePowerAbs_morning:slider,0,50,1000 SpeicherMidday_MaxChargePowerAbs_midday:slider,0,100,4700 SpeicherMidday_MaxChargePowerSteigung SpeicherMidday_MaxSOC:slider,20,5,50 SpeicherMidday_NotBefore:time SpeicherMinSOC_Sommer:slider,5,1,20 SpeicherMinSOC_Winter:slider,5,1,20 SpeicherMinSOC_fc1_Limit:slider,7000,500,17000 SpeicherMaxSOCControlActive:0,1 SpeicherMaxSOC_Actual:slider,60,5,100 SpeicherMaxSOC_DayBefore:slider,15,5,100 SpeicherMaxSOC_fc1_Limit:slider,10000,2000,50000
|
||||
attr WR_1_Speicher_1_ExternControl sortby 122
|
||||
attr WR_1_Speicher_1_ExternControl uiTable {\
|
||||
package ui_Table;;\
|
||||
## $TR{0} = "style='color:yellow;;text-align:left;;font-weight:bold;;font-size:18px'";; ## Reihe 0 für Überschrift\
|
||||
$TABLE = "style='width:100%;;'";;\
|
||||
\
|
||||
$TD{0..9}{0} = "align='center' style='font-size:16px;;border-right-style:solid;;border-color:darkgreen;;border-right-width:2px;;width:26%'";;\
|
||||
\
|
||||
$TD{0..9}{1} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:36%;;font-weight:bold;;'";;\
|
||||
$TD{0..9}{2..4} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:8%;;text-align:center;;'";;\
|
||||
$TD{0..9}{5} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:2px;;width:8%;;text-align:center;;'";;\
|
||||
\
|
||||
sub FUNC_batt {\
|
||||
my($val)=@_;;\
|
||||
my $ret="position:absolute;;left:".(90*$val/100)."px;;width:90px;;height:20px;;background:linear-gradient( to right,#F8F8E0 ".(90-(90*$val/100))."px,rgba(0,0,0,0) ".(90-(90*$val/100))."px);;";;\
|
||||
return $ret;;\
|
||||
}\
|
||||
sub FUNC_Status {\
|
||||
my($value, $min, $colorMin, $statusMin, $colorMiddel, $statusMiddle, $max, $colorMax, $statusMax)=@_;;\
|
||||
my $ret = ($value < $min)? '<span style="color:'.$colorMin.'">'.$statusMin.'</span>' : ($value > $max)? '<span style="color:'.$colorMax.'">'.$statusMax.'</span>' : '<span style="color:'.$colorMiddel.'">'.$statusMiddle.'</span>';;\
|
||||
return $ret;;\
|
||||
}\
|
||||
\
|
||||
sub Device {\
|
||||
return "EVU_Tibber_connect";;\
|
||||
}\
|
||||
\
|
||||
sub Format {\
|
||||
my($i)=@_;;\
|
||||
\
|
||||
if ($i eq "trigger_0") {\
|
||||
return ( ::ReadingsVal(Device(),"fc_min",0) > ::ReadingsVal(Device(),"fc_trigger_price",0)\
|
||||
or ::ReadingsVal(Device(),"fc0_trigger_start","") eq "null" ) ?\
|
||||
"<span style='color:red'>Heute kein Trigger <br>mehr unter ".\
|
||||
::ReadingsVal(Device(),"fc_trigger_price","null")." ct</span>" :\
|
||||
"<span style='color:green'>Trigger von<br>".\
|
||||
::ReadingsVal(Device(),"fc0_trigger_start","00:00")." bis ".::ReadingsVal(Device(),"fc0_trigger_stop","00:00")."<br>unter ".\
|
||||
::ReadingsVal(Device(),"fc_trigger_price","null")." ct</span>" ;;\
|
||||
} elsif ($i eq "trigger_1") {\
|
||||
return ( ::ReadingsVal(Device(),"fc_min",0) > ::ReadingsVal(Device(),"fc_trigger_price",0)\
|
||||
or ::ReadingsVal(Device(),"fc1_trigger_start","") eq "null" ) ?\
|
||||
"<span style='color:red'>Morgen kein Trigger <br>mehr unter ".\
|
||||
::ReadingsVal(Device(),"fc_trigger_price","null")." ct</span>" :\
|
||||
"<span style='color:green'>Morgen ein Trigger von<br>".\
|
||||
::ReadingsVal(Device(),"fc1_trigger_start","00:00")." bis ".::ReadingsVal(Device(),"fc1_trigger_stop","00:00")."<br>unter ".\
|
||||
::ReadingsVal(Device(),"fc_trigger_price","null")." ct</span>" ;;\
|
||||
}\
|
||||
return "null";;\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
#########################################################\
|
||||
## "Spalte 0"|"Spalte 1"|"Spalte 2"|"Spalte 3"|"Spalte 4"|"Spalte 5"\
|
||||
\
|
||||
"$SELF"|"Kommando<dd>Auswahl / DcPowerAbs / Status</dd>" | widget([$SELF:ui_command_1],"uzsuDropDown,---,Status_Speicher,smart_Laden_start,smart_Laden_beenden,smart_Laden_starten_WB,smart_Laden_beenden_WB,Kommando_Wiederholung,SOC_Calculation,Reset,DC_Power_Abs,Sommer,Winter,Speicher_voll,14_Luefter_ein,15_Luefter_aus,Status_WR_1_Speicher_1_BYD") | widget([$SELF:SpeicherDcPowerAbs],"selectnumbers,-4500,250,4500,0,lin")."W".widget([$SELF:SpeicherTriggerLaden],"uzsuDropDown,An,Aus,manuell") |[WR_1_API:Battery_EM_State]|([$SELF:SpeicherExternTrigger] eq "gesperrt" and [WR_1_API:Battery_InternControl_MinHomeConsumption] == 30000)?'<span style="color:red">smart_Laden aktiv</span>':""\
|
||||
\
|
||||
|"Speicher<dd>Steuerung</dd>" | widget([$SELF:SpeicherEntladung],"uzsuDropDown,Automatik,Trigger,Zeit") |"WB Laden ".widget([$SELF:SpeicherWB_buffer],"uzsuToggle,Aus,An")|\
|
||||
FUNC_Status([WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],-10,"green","Laden","orange","Standby",15,"red","Entladen")."<br>".FUNC_Status([WR_1:Act_state_of_charge],15,"red","Speicher SOC","orange","Speicher SOC",49,"green","Speicher SOC")|\
|
||||
\
|
||||
FUNC_Status([WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],-10,"green",[WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],"orange",[WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P],15,"red",[WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P])." W"."<div style='border-width:2px;;border-style:solid;;border-color:gray;;position:relative;;width:90px;;height:20px;;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);;'>".STY(" ",FUNC_batt([WR_1:Act_state_of_charge])).STY(::round([WR_1:Act_state_of_charge],0)."%","font-size:16px;;position:absolute;;top:2px;;left:30px")."</div>"\
|
||||
\
|
||||
\
|
||||
|"Trigger<dd>Status / ExternTrigger / Start / Ende</dd>" | widget([$SELF:SpeicherTrigger],"uzsuDropDown,entladen,gesperrt,none") | widget([$SELF:SpeicherExternTrigger],"uzsuDropDown,frei,gesperrt,none") | widget([$SELF:SpeicherZeitStart],"time") | widget([$SELF:SpeicherZeitEnde],"time")\
|
||||
\
|
||||
|"Strombörse<dd>Auswahl/Ladeleistung / Ladefenster fc0/fc1 / Trigger Status </dd>" | widget([$SELF:SpeicherStromboerse],"uzsuDropDown,Aus,Tibber")."<br>".widget([$SELF:SpeicherStromboerseDcPowerAbs],"selectnumbers,-4500,250,0,0,lin")."W" | \
|
||||
"<span style=font-weight:bold>Trigger fc0</span><br><br>".Format("trigger_0")|\
|
||||
"<span style=font-weight:bold>Trigger fc1</span><br><br>".Format("trigger_1")|\
|
||||
[EVU_Tibber_connect:fc0_trigger] \
|
||||
\
|
||||
|"Kommando Wiederholung<dd>aktiviert / läuft</dd>" | widget([$SELF:SpeicherCmdRepeatActive],"uzsuToggle,Aus,An") | widget([$SELF:SpeicherCmdRepeatRunning],"uzsuToggle,Aus,An") |""|""\
|
||||
\
|
||||
|"MaxSOC Kontrolle<dd>aktiviert / läuft</dd>" | widget([$SELF:SpeicherMaxSOCControlActive],"uzsuToggle,Aus,An") | widget([$SELF:SpeicherMaxSOCControlRunning],"uzsuToggle,Aus,An") |""|""\
|
||||
\
|
||||
|"MaxSOC Limit<dd>fc1_Limit / Minimum SOC Zeit / gestern / geplant</dd>" |\
|
||||
FUNC_Status([WR_ctl:Yield_fc1_day],[$SELF:SpeicherMaxSOC_fc1_Limit],"red","<",0,0,([$SELF:SpeicherMaxSOC_fc1_Limit]-1),"green",">="). widget([$SELF:SpeicherMaxSOC_fc1_Limit],"selectnumbers,2000,1000,40000,0,lin") | ([$SELF:SpeicherMaxSOC_MinSOC_Time] eq "gefunden")?(POSIX::strftime("%H:%M",::localtime(::time_str2num(::ReadingsTimestamp("$SELF","SpeicherMaxSOC_MinSOC_MinSOC",""))))." ".[$SELF:SpeicherMaxSOC_MinSOC_MinSOC]." %"):"wartet" |\
|
||||
"<div style='border-width:2px;;border-style:solid;;border-color:gray;;position:relative;;width:90px;;height:20px;;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);;'>".STY(" ",FUNC_batt([$SELF:SpeicherMaxSOC_DayBefore])).STY("gestern","font-size:12px;;position:absolute;;top:3px;;left:25px")."</div>".widget([$SELF:SpeicherMaxSOC_DayBefore],"selectnumbers,5,1,100,0,lin")."%" |\
|
||||
"<div style='border-width:2px;;border-style:solid;;border-color:gray;;position:relative;;width:90px;;height:20px;;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);;'>".STY(" ",FUNC_batt([$SELF:SpeicherMaxSOC_Actual])).STY("geplant","font-size:12px;;position:absolute;;top:3px;;left:25px")."</div>".widget([$SELF:SpeicherMaxSOC_Actual],"selectnumbers,5,1,100,0,lin")."%"\
|
||||
\
|
||||
|"Mittags Kontrolle<dd>aktiviert / läuft</dd>" | widget([$SELF:SpeicherMiddayControlActive],"uzsuToggle,Aus,An") | widget([$SELF:SpeicherMiddayControlRunning],"uzsuToggle,Aus,An")|""|""\
|
||||
\
|
||||
|"Mittags Limits<dd>Inverter_Max_Power / Laden nicht vor / Start /Stop<br>MaxSOC morgens / Power morgens / Power mittags</dd>" | widget([$SELF:SpeicherMidday_Inverter_Max_Power],"selectnumbers,1000,250,15000,0,lin")."W<br>".widget([$SELF:SpeicherMidday_MaxSOC],"selectnumbers,5,1,100,0,lin")."%" | widget([$SELF:SpeicherMidday_NotBefore],"time").widget([$SELF:SpeicherMidday_MaxChargePowerAbs_morning],"selectnumbers,0,50,1000,0,lin")."W" | widget([WR_ctl:Yield_fc0_middayhigh_start],"time").widget([$SELF:SpeicherMidday_MaxChargePowerAbs_midday],"selectnumbers,0,100,4700,0,lin")."W" | widget([WR_ctl:Yield_fc0_middayhigh_stop],"time").([$SELF:SpeicherMidday_MaxChargePowerAbs_midday] == 0)?"dynamisch":""\
|
||||
\
|
||||
|"MinSOC Steuerung<dd>fc1_Limit / Winter | Sommer /aktuell</dd>"|\
|
||||
FUNC_Status([WR_ctl:Yield_fc1_day],[$SELF:SpeicherMinSOC_fc1_Limit],"red","<",0,0,([$SELF:SpeicherMinSOC_fc1_Limit]-1),"green",">=").widget([$SELF:SpeicherMinSOC_fc1_Limit],"selectnumbers,2000,1000,40000,0,lin")."wh" |\
|
||||
widget([$SELF:SpeicherMinSOC_Winter],"selectnumbers,10,1,30,0,lin").widget([$SELF:SpeicherMinSOC_Sommer],"selectnumbers,5,1,10,0,lin")."%" |""|[WR_1_API:Battery_InternControl_MinSoc]." %"
|
||||
attr WR_1_Speicher_1_ExternControl verbose 3
|
||||
|
||||
setstate WR_1_Speicher_1_ExternControl 2023-02-28 10:09:32 SpeicherCmdRepeatActive An
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-24 16:00:00 SpeicherCmdRepeatRunning Aus
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-19 11:21:57 SpeicherDcPowerAbs 0
|
||||
setstate WR_1_Speicher_1_ExternControl 2022-12-18 11:28:13 SpeicherEntladung Automatik
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-24 11:37:02 SpeicherExternTrigger none
|
||||
setstate WR_1_Speicher_1_ExternControl 2023-02-28 10:09:31 SpeicherMaxSOCControlActive An
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-24 16:00:00 SpeicherMaxSOCControlRunning Aus
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-24 16:00:00 SpeicherMaxSOC_Actual 100
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-24 16:00:00 SpeicherMaxSOC_DayBefore 93.00
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-24 09:13:02 SpeicherMaxSOC_MinSOC_MinSOC 67
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-24 16:00:00 SpeicherMaxSOC_MinSOC_Time NULL
|
||||
setstate WR_1_Speicher_1_ExternControl 2021-12-03 10:38:43 SpeicherMaxSOC_fc1_Limit 30000
|
||||
setstate WR_1_Speicher_1_ExternControl 2023-02-28 10:09:29 SpeicherMiddayControlActive An
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-24 16:00:00 SpeicherMiddayControlRunning Aus
|
||||
setstate WR_1_Speicher_1_ExternControl 2023-06-15 12:35:46 SpeicherMidday_Inverter_Max_Power 9000
|
||||
setstate WR_1_Speicher_1_ExternControl 2022-08-07 14:40:51 SpeicherMidday_MaxChargePowerAbs_midday 0
|
||||
setstate WR_1_Speicher_1_ExternControl 2023-02-07 13:24:17 SpeicherMidday_MaxChargePowerAbs_morning 450
|
||||
setstate WR_1_Speicher_1_ExternControl 2022-08-24 14:43:16 SpeicherMidday_MaxChargePowerSteigung 0.25
|
||||
setstate WR_1_Speicher_1_ExternControl 2021-12-03 10:39:28 SpeicherMidday_MaxSOC 30
|
||||
setstate WR_1_Speicher_1_ExternControl 2022-03-03 09:21:27 SpeicherMidday_NotBefore 09:00
|
||||
setstate WR_1_Speicher_1_ExternControl 2022-02-28 18:45:27 SpeicherMinSOC_Sommer 5
|
||||
setstate WR_1_Speicher_1_ExternControl 2023-10-25 14:26:37 SpeicherMinSOC_Winter 10
|
||||
setstate WR_1_Speicher_1_ExternControl 2022-12-19 18:27:53 SpeicherMinSOC_fc1_Limit 16000
|
||||
setstate WR_1_Speicher_1_ExternControl 2023-12-09 07:45:25 SpeicherStromboerse Aus
|
||||
setstate WR_1_Speicher_1_ExternControl 2023-12-08 12:51:40 SpeicherStromboerseDcPowerAbs -4500
|
||||
setstate WR_1_Speicher_1_ExternControl 2022-12-14 07:00:00 SpeicherTrigger entladen
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-19 11:21:57 SpeicherTriggerLaden Aus
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-09 17:23:01 SpeicherWB_buffer Aus
|
||||
setstate WR_1_Speicher_1_ExternControl 2022-12-13 16:51:11 SpeicherZeitEnde 17:00
|
||||
setstate WR_1_Speicher_1_ExternControl 2023-01-09 11:44:35 SpeicherZeitStart 07:00
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-22 05:30:39 WB_smart_laden_before ---
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-24 16:00:00 ui_command_1 ---
|
||||
setstate WR_1_Speicher_1_ExternControl 2024-01-20 09:28:57 ui_command_1_before ---
|
109
fhem/contrib/ch.eick/Photovoltaik/Wechselrichter/RAW_WR_2.txt
Normal file
109
fhem/contrib/ch.eick/Photovoltaik/Wechselrichter/RAW_WR_2.txt
Normal file
@ -0,0 +1,109 @@
|
||||
defmod WR_2 ModbusAttr 71 60 192.168.178.19:1502 TCP
|
||||
attr WR_2 DbLogExclude .*
|
||||
attr WR_2 DbLogInclude P_DC1,P_DC2,P_DC3,Total_.*,P_limit_from_EVU.*
|
||||
attr WR_2 alias WR_2
|
||||
attr WR_2 alignTime 00:00
|
||||
attr WR_2 comment Version 2021.06.02 14:00\
|
||||
Kostal Plenticore Plus 7
|
||||
attr WR_2 dev-h-combine 8
|
||||
attr WR_2 dev-h-defFormat %.2f
|
||||
attr WR_2 dev-h-defLen 2
|
||||
attr WR_2 dev-h-defPoll 1
|
||||
attr WR_2 dev-h-defRevRegs 1
|
||||
attr WR_2 dev-h-defUnpack f>
|
||||
attr WR_2 dev-type-STR-format %s
|
||||
attr WR_2 dev-type-STR-len 8
|
||||
attr WR_2 dev-type-STR-revRegs 0
|
||||
attr WR_2 dev-type-STR-unpack a*
|
||||
attr WR_2 disable 0
|
||||
attr WR_2 event-on-change-reading P_DC1,P_DC2,P_DC3,Total_.*,Inverter_state.*,Inverter_Generation_P_Actual.*,P_limit_from_EVU.*
|
||||
attr WR_2 group PV Eigenverbrauch
|
||||
attr WR_2 icon sani_solar
|
||||
attr WR_2 obj-h100-reading Total_DC_P
|
||||
attr WR_2 obj-h1056-reading Total_DC_PV_Energy_sumOfAllPVInputs
|
||||
attr WR_2 obj-h1058-reading Total_DC_Energy_From_PV1
|
||||
attr WR_2 obj-h1060-reading Total_DC_Energy_From_PV2
|
||||
attr WR_2 obj-h1062-reading Total_DC_Energy_From_PV3
|
||||
attr WR_2 obj-h1064-reading Total_AC_Energy_ACsideToGrid
|
||||
attr WR_2 obj-h1066-reading Total_DC_P_sumOfAllPVInputs
|
||||
attr WR_2 obj-h120-reading Isolation_resistance
|
||||
attr WR_2 obj-h122-reading P_limit_from_EVU
|
||||
attr WR_2 obj-h14-reading Inverter_serial_number
|
||||
attr WR_2 obj-h14-type STR
|
||||
attr WR_2 obj-h144-reading Worktime
|
||||
attr WR_2 obj-h150-reading Actual_cos_phi
|
||||
attr WR_2 obj-h152-reading Grid_frequency
|
||||
attr WR_2 obj-h154-reading I_L1
|
||||
attr WR_2 obj-h156-reading Active_P_L1
|
||||
attr WR_2 obj-h158-reading U_L1
|
||||
attr WR_2 obj-h160-reading I_L2
|
||||
attr WR_2 obj-h162-reading Active_P_L2
|
||||
attr WR_2 obj-h164-reading U_L2
|
||||
attr WR_2 obj-h166-reading I_L3
|
||||
attr WR_2 obj-h168-reading Active_P_L3
|
||||
attr WR_2 obj-h170-reading U_L3
|
||||
attr WR_2 obj-h172-reading Total_AC_Active_P
|
||||
attr WR_2 obj-h174-reading Total_AC_Reactive_P
|
||||
attr WR_2 obj-h178-reading Total_AC_Apparent_P
|
||||
attr WR_2 obj-h202-reading PSSB_fuse_state
|
||||
attr WR_2 obj-h254-reading Total_Reactive_P_EM
|
||||
attr WR_2 obj-h258-reading I_DC1
|
||||
attr WR_2 obj-h260-reading P_DC1
|
||||
attr WR_2 obj-h266-reading U_DC1
|
||||
attr WR_2 obj-h268-reading I_DC2
|
||||
attr WR_2 obj-h270-reading P_DC2
|
||||
attr WR_2 obj-h276-reading U_DC2
|
||||
attr WR_2 obj-h278-reading I_DC3
|
||||
attr WR_2 obj-h280-reading P_DC3
|
||||
attr WR_2 obj-h286-reading U_DC3
|
||||
attr WR_2 obj-h320-reading Total_yield
|
||||
attr WR_2 obj-h322-reading Daily_yield
|
||||
attr WR_2 obj-h324-reading Yearly_yield
|
||||
attr WR_2 obj-h326-reading Monthly_yield
|
||||
attr WR_2 obj-h38-reading Software-Version_Maincontroller_MC
|
||||
attr WR_2 obj-h38-type STR
|
||||
attr WR_2 obj-h384-len 16
|
||||
attr WR_2 obj-h384-reading Inverter_network_name
|
||||
attr WR_2 obj-h384-type STR
|
||||
attr WR_2 obj-h420-reading IP-address
|
||||
attr WR_2 obj-h420-type STR
|
||||
attr WR_2 obj-h428-reading IP-subnetmask
|
||||
attr WR_2 obj-h428-type STR
|
||||
attr WR_2 obj-h436-reading IP-gateway
|
||||
attr WR_2 obj-h436-type STR
|
||||
attr WR_2 obj-h446-reading IP-DNS1
|
||||
attr WR_2 obj-h446-type STR
|
||||
attr WR_2 obj-h454-reading IP-DNS2
|
||||
attr WR_2 obj-h454-type STR
|
||||
attr WR_2 obj-h46-reading Software-Version_IO-Controller_IOC
|
||||
attr WR_2 obj-h46-type STR
|
||||
attr WR_2 obj-h529-len 4
|
||||
attr WR_2 obj-h529-reading Work_Capacity
|
||||
attr WR_2 obj-h529-unpack N
|
||||
attr WR_2 obj-h531-format %.0f
|
||||
attr WR_2 obj-h531-reading Inverter_Max_P
|
||||
attr WR_2 obj-h531-unpack N
|
||||
attr WR_2 obj-h535-revRegs 0
|
||||
attr WR_2 obj-h535-unpack n
|
||||
attr WR_2 obj-h551-revRegs 0
|
||||
attr WR_2 obj-h559-revRegs 0
|
||||
attr WR_2 obj-h56-format %.0f
|
||||
attr WR_2 obj-h56-reading Inverter_state
|
||||
attr WR_2 obj-h56-unpack N
|
||||
attr WR_2 obj-h575-reading Inverter_Generation_P_Actual
|
||||
attr WR_2 obj-h575-unpack N
|
||||
attr WR_2 obj-h577-len 2
|
||||
attr WR_2 obj-h577-reading Generation_Energy
|
||||
attr WR_2 obj-h577-unpack N
|
||||
attr WR_2 obj-h578-reading Total_energy
|
||||
attr WR_2 obj-h6-reading Inverter_Article_number
|
||||
attr WR_2 obj-h6-type STR
|
||||
attr WR_2 obj-h768-len 32
|
||||
attr WR_2 obj-h768-reading Productname
|
||||
attr WR_2 obj-h768-type STR
|
||||
attr WR_2 obj-h800-len 32
|
||||
attr WR_2 obj-h800-reading Power_class
|
||||
attr WR_2 obj-h800-type STR
|
||||
attr WR_2 room Strom->Photovoltaik
|
||||
attr WR_2 sortby 211
|
||||
attr WR_2 verbose 0
|
@ -0,0 +1,328 @@
|
||||
defmod WR_2_API HTTPMOD http://%IP-WR%/api/v1/auth/me 0
|
||||
attr WR_2_API DbLogExclude .*
|
||||
attr WR_2_API DbLogInclude Statistic_EnergyPv[1|2|3].*,Statistic_Yield.*
|
||||
attr WR_2_API authRetries 1
|
||||
attr WR_2_API comment Version 2021.04.27 16:00\
|
||||
Passworte für die Abfrage des WR_2_API werden im storeKeyValue abgelegt:\
|
||||
{KeyValue("[read|store]","PW_<Device Name>_<Benutzer Name>","<passwort>")}\
|
||||
{KeyValue("store","PW_WR_2_API_user","<passwort>")}
|
||||
attr WR_2_API disable 0
|
||||
attr WR_2_API dontRequeueAfterAuth 0
|
||||
attr WR_2_API enableControlSet 0
|
||||
attr WR_2_API enableCookies 1
|
||||
attr WR_2_API event-on-update-reading auth_.*,Statistic_EnergyPv[1|2|3].*,Statistic_Yield.*
|
||||
attr WR_2_API get01Data %START%
|
||||
attr WR_2_API get01Name 01_auth_start
|
||||
attr WR_2_API get01URL http://%IP-WR%/api/v1/auth/start
|
||||
attr WR_2_API get02Data %FINISH%
|
||||
attr WR_2_API get02Name 02_auth_finish
|
||||
attr WR_2_API get02URL http://%IP-WR%/api/v1/auth/finish
|
||||
attr WR_2_API get03Data %SESSION%
|
||||
attr WR_2_API get03Name 03_auth_create_session
|
||||
attr WR_2_API get03URL http://%IP-WR%/api/v1/auth/create_session
|
||||
attr WR_2_API get04-1Name auth_me_active
|
||||
attr WR_2_API get04-2Name auth_me_locked
|
||||
attr WR_2_API get04-3Name auth_me_authenticated
|
||||
attr WR_2_API get04-4Name auth_me_anonymous
|
||||
attr WR_2_API get04-5Name auth_me_role
|
||||
attr WR_2_API get04-6Name auth_me_permissions
|
||||
attr WR_2_API get04Header authorization: Session %auth_sessionId%
|
||||
attr WR_2_API get04JSON .
|
||||
attr WR_2_API get04Name 04_auth_me
|
||||
attr WR_2_API get04URL http://%IP-WR%/api/v1/auth/me
|
||||
attr WR_2_API get05-1Name info_api_version
|
||||
attr WR_2_API get05-2Name info_hostname
|
||||
attr WR_2_API get05-3Name info_name
|
||||
attr WR_2_API get05-4Name info_sw_version
|
||||
attr WR_2_API get05JSON .
|
||||
attr WR_2_API get05Name 05_info_version
|
||||
attr WR_2_API get05URL http://%IP-WR%/api/v1/info/version
|
||||
attr WR_2_API get20-10Format %.2f
|
||||
attr WR_2_API get20-10Name Statistic_EnergyChargeGrid_Month
|
||||
attr WR_2_API get20-11Format %.2f
|
||||
attr WR_2_API get20-11Name Statistic_EnergyChargeGrid_Total
|
||||
attr WR_2_API get20-12Format %.2f
|
||||
attr WR_2_API get20-12Name Statistic_EnergyChargeGrid_Year
|
||||
attr WR_2_API get20-13Format %.2f
|
||||
attr WR_2_API get20-13Name Statistic_EnergyChargeInvIn_Day
|
||||
attr WR_2_API get20-14Format %.2f
|
||||
attr WR_2_API get20-14Name Statistic_EnergyChargeInvIn_Month
|
||||
attr WR_2_API get20-15Format %.2f
|
||||
attr WR_2_API get20-15Name Statistic_EnergyChargeInvIn_Total
|
||||
attr WR_2_API get20-16Format %.2f
|
||||
attr WR_2_API get20-16Name Statistic_EnergyChargeInvIn_Year
|
||||
attr WR_2_API get20-17Format %.2f
|
||||
attr WR_2_API get20-17Name Statistic_EnergyChargePv_Day
|
||||
attr WR_2_API get20-18Format %.2f
|
||||
attr WR_2_API get20-18Name Statistic_EnergyChargePv_Month
|
||||
attr WR_2_API get20-19Format %.2f
|
||||
attr WR_2_API get20-19Name Statistic_EnergyChargePv_Total
|
||||
attr WR_2_API get20-1Format %.2f
|
||||
attr WR_2_API get20-1Name Statistic_Autarky_Day
|
||||
attr WR_2_API get20-20Format %.2f
|
||||
attr WR_2_API get20-20Name Statistic_EnergyChargePv_Year
|
||||
attr WR_2_API get20-21Format %.2f
|
||||
attr WR_2_API get20-21Name Statistic_EnergyDischarge_Day
|
||||
attr WR_2_API get20-22Format %.2f
|
||||
attr WR_2_API get20-22Name Statistic_EnergyDischarge_Month
|
||||
attr WR_2_API get20-23Format %.2f
|
||||
attr WR_2_API get20-23Name Statistic_EnergyDischarge_Total
|
||||
attr WR_2_API get20-24Format %.2f
|
||||
attr WR_2_API get20-24Name Statistic_EnergyDischarge_Year
|
||||
attr WR_2_API get20-25Format %.2f
|
||||
attr WR_2_API get20-25Name Statistic_EnergyDischargeGrid_Day
|
||||
attr WR_2_API get20-26Format %.2f
|
||||
attr WR_2_API get20-26Name Statistic_EnergyDischargeGrid_Month
|
||||
attr WR_2_API get20-27Format %.2f
|
||||
attr WR_2_API get20-27Name Statistic_EnergyDischargeGrid_Total
|
||||
attr WR_2_API get20-28Format %.2f
|
||||
attr WR_2_API get20-28Name Statistic_EnergyDischargeGrid_Year
|
||||
attr WR_2_API get20-29Format %.2f
|
||||
attr WR_2_API get20-29Name Statistic_EnergyHome_Day
|
||||
attr WR_2_API get20-2Format %.2f
|
||||
attr WR_2_API get20-2Name Statistic_Autarky_Month
|
||||
attr WR_2_API get20-30Format %.2f
|
||||
attr WR_2_API get20-30Name Statistic_EnergyHome_Month
|
||||
attr WR_2_API get20-31Format %.2f
|
||||
attr WR_2_API get20-31Name Statistic_EnergyHome_Total
|
||||
attr WR_2_API get20-32Format %.2f
|
||||
attr WR_2_API get20-32Name Statistic_EnergyHome_Year
|
||||
attr WR_2_API get20-33Format %.2f
|
||||
attr WR_2_API get20-33Name Statistic_EnergyHomeBat_Day
|
||||
attr WR_2_API get20-34Format %.2f
|
||||
attr WR_2_API get20-34Name Statistic_EnergyHomeBat_Month
|
||||
attr WR_2_API get20-35Format %.2f
|
||||
attr WR_2_API get20-35Name Statistic_EnergyHomeBat_Total
|
||||
attr WR_2_API get20-36Format %.2f
|
||||
attr WR_2_API get20-36Name Statistic_EnergyHomeBat_Year
|
||||
attr WR_2_API get20-37Format %.2f
|
||||
attr WR_2_API get20-37Name Statistic_EnergyHomeGrid_Day
|
||||
attr WR_2_API get20-38Format %.2f
|
||||
attr WR_2_API get20-38Name Statistic_EnergyHomeGrid_Month
|
||||
attr WR_2_API get20-39Format %.2f
|
||||
attr WR_2_API get20-39Name Statistic_EnergyHomeGrid_Total
|
||||
attr WR_2_API get20-3Format %.2f
|
||||
attr WR_2_API get20-3Name Statistic_Autarky_Total
|
||||
attr WR_2_API get20-40Format %.2f
|
||||
attr WR_2_API get20-40Name Statistic_EnergyHomeGrid_Year
|
||||
attr WR_2_API get20-41Format %.2f
|
||||
attr WR_2_API get20-41Name Statistic_EnergyHomeOwn_Total
|
||||
attr WR_2_API get20-42Format %.2f
|
||||
attr WR_2_API get20-42Name Statistic_EnergyHomePv_Day
|
||||
attr WR_2_API get20-43Format %.2f
|
||||
attr WR_2_API get20-43Name Statistic_EnergyHomePv_Month
|
||||
attr WR_2_API get20-44Format %.2f
|
||||
attr WR_2_API get20-44Name Statistic_EnergyHomePv_Total
|
||||
attr WR_2_API get20-45Format %.2f
|
||||
attr WR_2_API get20-45Name Statistic_EnergyHomePv_Year
|
||||
attr WR_2_API get20-46Format %.2f
|
||||
attr WR_2_API get20-46Name Statistic_EnergyPv1_Day
|
||||
attr WR_2_API get20-47Format %.2f
|
||||
attr WR_2_API get20-47Name Statistic_EnergyPv1_Month
|
||||
attr WR_2_API get20-48Format %.2f
|
||||
attr WR_2_API get20-48Name Statistic_EnergyPv1_Total
|
||||
attr WR_2_API get20-49Format %.2f
|
||||
attr WR_2_API get20-49Name Statistic_EnergyPv1_Year
|
||||
attr WR_2_API get20-4Format %.2f
|
||||
attr WR_2_API get20-4Name Statistic_Autarky_Year
|
||||
attr WR_2_API get20-50Format %.2f
|
||||
attr WR_2_API get20-50Name Statistic_EnergyPv2_Day
|
||||
attr WR_2_API get20-51Format %.2f
|
||||
attr WR_2_API get20-51Name Statistic_EnergyPv2_Month
|
||||
attr WR_2_API get20-52Format %.2f
|
||||
attr WR_2_API get20-52Name Statistic_EnergyPv2_Total
|
||||
attr WR_2_API get20-53Format %.2f
|
||||
attr WR_2_API get20-53Name Statistic_EnergyPv2_Year
|
||||
attr WR_2_API get20-54Format %.2f
|
||||
attr WR_2_API get20-54Name Statistic_EnergyPv3_Day
|
||||
attr WR_2_API get20-55Format %.2f
|
||||
attr WR_2_API get20-55Name Statistic_EnergyPv3_Month
|
||||
attr WR_2_API get20-56Format %.2f
|
||||
attr WR_2_API get20-56Name Statistic_EnergyPv3_Total
|
||||
attr WR_2_API get20-57Format %.2f
|
||||
attr WR_2_API get20-57Name Statistic_EnergyPv3_Year
|
||||
attr WR_2_API get20-58Format %.2f
|
||||
attr WR_2_API get20-58Name Statistic_OwnConsumptionRate_Day
|
||||
attr WR_2_API get20-59Format %.2f
|
||||
attr WR_2_API get20-59Name Statistic_OwnConsumptionRate_Month
|
||||
attr WR_2_API get20-5Format %.2f
|
||||
attr WR_2_API get20-5Name Statistic_CO2Saving_Day
|
||||
attr WR_2_API get20-60Format %.2f
|
||||
attr WR_2_API get20-60Name Statistic_OwnConsumptionRate_Total
|
||||
attr WR_2_API get20-61Format %.2f
|
||||
attr WR_2_API get20-61Name Statistic_OwnConsumptionRate_Year
|
||||
attr WR_2_API get20-62Format %.2f
|
||||
attr WR_2_API get20-62Name Statistic_Yield_Day
|
||||
attr WR_2_API get20-63Format %.2f
|
||||
attr WR_2_API get20-63Name Statistic_Yield_Month
|
||||
attr WR_2_API get20-64Format %.2f
|
||||
attr WR_2_API get20-64Name Statistic_Yield_Total
|
||||
attr WR_2_API get20-65Format %.2f
|
||||
attr WR_2_API get20-65Name Statistic_Yield_Year
|
||||
attr WR_2_API get20-6Format %.2f
|
||||
attr WR_2_API get20-6Name Statistic_CO2Saving_Month
|
||||
attr WR_2_API get20-7Format %.2f
|
||||
attr WR_2_API get20-7Name Statistic_CO2Saving_Total
|
||||
attr WR_2_API get20-8Format %.2f
|
||||
attr WR_2_API get20-8Name Statistic_CO2Saving_Year
|
||||
attr WR_2_API get20-9Format %.2f
|
||||
attr WR_2_API get20-9Name Statistic_EnergyChargeGrid_Day
|
||||
attr WR_2_API get20Header authorization: Session %auth_sessionId%
|
||||
attr WR_2_API get20JSON 01_processdata_.._value
|
||||
attr WR_2_API get20Name 20_Statistic_EnergyFlow
|
||||
attr WR_2_API get20URL http://%IP-WR%/api/v1/processdata/scb:statistic:EnergyFlow
|
||||
attr WR_2_API get40Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_2_API get40Header02 Content-type: application/json, Accept: application/json, Connection: keep-alive
|
||||
attr WR_2_API get40Name 40_Generator_ShadowMgmt
|
||||
attr WR_2_API get40URL http://%IP-WR%/api/v1/settings/devices:local/Generator:ShadowMgmt:Enable
|
||||
attr WR_2_API get59Data {"end":"%end_date%","begin":"%begin_date%"}
|
||||
attr WR_2_API get59Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_2_API get59Header02 Content-type: application/json, Accept: application/json, Connection: keep-alive
|
||||
attr WR_2_API get59Name 59_logdata_download
|
||||
attr WR_2_API get59URL http://%IP-WR%/api/v1/logdata/download
|
||||
attr WR_2_API get60Header authorization: Session %auth_sessionId%
|
||||
attr WR_2_API get60Name 60_update_status
|
||||
attr WR_2_API get60URL http://%IP-WR%/api/v1/update/status
|
||||
attr WR_2_API getHeader01 Accept-Encoding: gzip,deflate
|
||||
attr WR_2_API getHeader02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_2_API group PV Eigenverbrauch
|
||||
attr WR_2_API icon sani_solar
|
||||
attr WR_2_API reAuthRegex "authenticated":false|"processdata":\[\]|wrong credentials|Not authorized
|
||||
attr WR_2_API reading0101JSON nonce
|
||||
attr WR_2_API reading0101Name auth_nonce
|
||||
attr WR_2_API reading0102JSON rounds
|
||||
attr WR_2_API reading0102Name auth_rounds
|
||||
attr WR_2_API reading0103JSON salt
|
||||
attr WR_2_API reading0103Name auth_salt
|
||||
attr WR_2_API reading0104JSON transactionId
|
||||
attr WR_2_API reading0104Name auth_transactionId
|
||||
attr WR_2_API reading0201JSON signature
|
||||
attr WR_2_API reading0201Name auth_signature
|
||||
attr WR_2_API reading0202JSON token
|
||||
attr WR_2_API reading0202Name auth_token
|
||||
attr WR_2_API reading0301JSON message
|
||||
attr WR_2_API reading0301Name info_message
|
||||
attr WR_2_API reading0302JSON error
|
||||
attr WR_2_API reading0302Name info_error
|
||||
attr WR_2_API reading03JSON sessionId
|
||||
attr WR_2_API reading03Name auth_sessionId
|
||||
attr WR_2_API reading40Name Generator_ShadowMgmt
|
||||
attr WR_2_API reading40Regex Generator:ShadowMgmt.*value":"(\d+)
|
||||
attr WR_2_API replacement01Mode text
|
||||
attr WR_2_API replacement01Regex %IP-WR%
|
||||
attr WR_2_API replacement01Value 192.168.178.19
|
||||
attr WR_2_API replacement02Mode expression
|
||||
attr WR_2_API replacement02Regex %START%
|
||||
attr WR_2_API replacement02Value {my $NAME="WR_2_API";; plenticore_auth("start","user","$NAME")}
|
||||
attr WR_2_API replacement04Mode expression
|
||||
attr WR_2_API replacement04Regex %FINISH%
|
||||
attr WR_2_API replacement04Value {my $NAME="WR_2_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"))}
|
||||
attr WR_2_API replacement05Mode expression
|
||||
attr WR_2_API replacement05Regex %SESSION%
|
||||
attr WR_2_API replacement05Value {my $NAME="WR_2_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"))}
|
||||
attr WR_2_API replacement06Mode reading
|
||||
attr WR_2_API replacement06Regex %auth_signature%
|
||||
attr WR_2_API replacement06Value auth_signature
|
||||
attr WR_2_API replacement07Mode reading
|
||||
attr WR_2_API replacement07Regex %auth_sessionId%
|
||||
attr WR_2_API replacement07Value auth_sessionId
|
||||
attr WR_2_API replacement08Mode expression
|
||||
attr WR_2_API replacement08Regex %begin_date%
|
||||
attr WR_2_API replacement08Value {POSIX::strftime("%Y-%m-%d",localtime(time))}
|
||||
attr WR_2_API replacement09Mode expression
|
||||
attr WR_2_API replacement09Regex %end_date%
|
||||
attr WR_2_API replacement09Value {POSIX::strftime("%Y-%m-%d",localtime(time))}
|
||||
attr WR_2_API room Strom->Photovoltaik
|
||||
attr WR_2_API set06Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_2_API set06Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_2_API set06Method POST
|
||||
attr WR_2_API set06Name 06_auth_logout
|
||||
attr WR_2_API set06NoArg 1
|
||||
attr WR_2_API set06URL http://%IP-WR%/api/v1/auth/logout
|
||||
attr WR_2_API set4002Data [{"moduleid":"devices:local","settings":[{"id":"Generator:ShadowMgmt:Enable","value":"$val"}]}]
|
||||
attr WR_2_API set4002FollowGet 40_Generator_ShadowMgmt
|
||||
attr WR_2_API set4002Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_2_API set4002Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_2_API set4002Hint slider,0,1,3
|
||||
attr WR_2_API set4002Method PUT
|
||||
attr WR_2_API set4002Name 40_02_Generator_ShadowMgmt
|
||||
attr WR_2_API set4002URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_2_API set4101Data [{"moduleid":"devices:local","settings":[{"id":"DigitalOutputs:Customer:ConfigurationFlags","value":"$val"},{"id":"DigitalOutputs:Customer:DelayTime","value":"5"},{"id":"DigitalOutputs:Customer:PowerMode:OnPowerThreshold","value":"100000"},{"id":"DigitalOutputs:Customer:TimeMode:MaxNoOfSwitchingCyclesPerDay","value":"24"},{"id":"DigitalOutputs:Customer:TimeMode:PowerThreshold","value":"1"},{"id":"DigitalOutputs:Customer:TimeMode:RunTime","value":"1440"},{"id":"DigitalOutputs:Customer:TimeMode:StableTime","value":"1"}]}]
|
||||
attr WR_2_API set4101FollowGet 41_DigitalOutputs
|
||||
attr WR_2_API set4101Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_2_API set4101Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_2_API set4101Hint 0,9,13,14
|
||||
attr WR_2_API set4101Method PUT
|
||||
attr WR_2_API set4101Name 41_01_DigitalOutputs
|
||||
attr WR_2_API set4101URL http://%IP-WR%/api/v1/settings
|
||||
attr WR_2_API set50-10Name Event_02_code
|
||||
attr WR_2_API set50-11Name Event_02_description
|
||||
attr WR_2_API set50-12Name Event_02_end_time
|
||||
attr WR_2_API set50-13Name Event_02_group
|
||||
attr WR_2_API set50-14Name Event_02_is_active
|
||||
attr WR_2_API set50-15Name Event_02_long_description
|
||||
attr WR_2_API set50-16Name Event_02_start_time
|
||||
attr WR_2_API set50-17Name Event_03_category
|
||||
attr WR_2_API set50-18Name Event_03_code
|
||||
attr WR_2_API set50-19Name Event_03_description
|
||||
attr WR_2_API set50-1Name Event_01_category
|
||||
attr WR_2_API set50-20Name Event_03_end_time
|
||||
attr WR_2_API set50-21Name Event_03_group
|
||||
attr WR_2_API set50-22Name Event_03_is_active
|
||||
attr WR_2_API set50-23Name Event_03_long_description
|
||||
attr WR_2_API set50-24Name Event_03_start_time
|
||||
attr WR_2_API set50-25Name Event_04_category
|
||||
attr WR_2_API set50-26Name Event_04_code
|
||||
attr WR_2_API set50-27Name Event_04_description
|
||||
attr WR_2_API set50-28Name Event_04_end_time
|
||||
attr WR_2_API set50-29Name Event_04_group
|
||||
attr WR_2_API set50-2Name Event_01_code
|
||||
attr WR_2_API set50-30Name Event_04_is_active
|
||||
attr WR_2_API set50-31Name Event_04_long_description
|
||||
attr WR_2_API set50-32Name Event_04_start_time
|
||||
attr WR_2_API set50-33Name Event_05_category
|
||||
attr WR_2_API set50-34Name Event_05_code
|
||||
attr WR_2_API set50-35Name Event_05_description
|
||||
attr WR_2_API set50-36Name Event_05_end_time
|
||||
attr WR_2_API set50-37Name Event_05_group
|
||||
attr WR_2_API set50-38Name Event_05_is_active
|
||||
attr WR_2_API set50-39Name Event_05_long_description
|
||||
attr WR_2_API set50-3Name Event_01_description
|
||||
attr WR_2_API set50-40Name Event_05_start_time
|
||||
attr WR_2_API set50-4Name Event_01_end_time
|
||||
attr WR_2_API set50-5Name Event_01_group
|
||||
attr WR_2_API set50-6Name Event_01_is_active
|
||||
attr WR_2_API set50-7Name Event_01_long_description
|
||||
attr WR_2_API set50-8Name Event_01_start_time
|
||||
attr WR_2_API set50-9Name Event_02_category
|
||||
attr WR_2_API set50Data {"max":5,"language":"$val"}
|
||||
attr WR_2_API set50Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_2_API set50Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_2_API set50Hint en-gb,de-de
|
||||
attr WR_2_API set50JSON .
|
||||
attr WR_2_API set50Name 50_events_latest_5
|
||||
attr WR_2_API set50ParseResponse 1
|
||||
attr WR_2_API set50TextArg 1
|
||||
attr WR_2_API set50URL http://%IP-WR%/api/v1/events/latest
|
||||
attr WR_2_API set6001Header01 authorization: Session %auth_sessionId%
|
||||
attr WR_2_API set6001Header02 Content-type:application/json, Accept:application/json, Connection:keep-alive
|
||||
attr WR_2_API set6001Method POST
|
||||
attr WR_2_API set6001Name 60_01_Reset_Wechselrichter
|
||||
attr WR_2_API set6001NoArg 1
|
||||
attr WR_2_API set6001URL http://%IP-WR%/api/v1/system/reboot
|
||||
attr WR_2_API showBody 1
|
||||
attr WR_2_API showError 1
|
||||
attr WR_2_API sid01Data %START%
|
||||
attr WR_2_API sid01ParseResponse 1
|
||||
attr WR_2_API sid01URL http://%IP-WR%/api/v1/auth/start
|
||||
attr WR_2_API sid02Data %FINISH%
|
||||
attr WR_2_API sid02ParseResponse 1
|
||||
attr WR_2_API sid02URL http://%IP-WR%/api/v1/auth/finish
|
||||
attr WR_2_API sid03Data %SESSION%
|
||||
attr WR_2_API sid03ParseResponse 1
|
||||
attr WR_2_API sid03URL http://%IP-WR%/api/v1/auth/create_session
|
||||
attr WR_2_API sidHeader01 Accept-Encoding: gzip,deflate
|
||||
attr WR_2_API sidHeader02 Content-type: application/json, Accept: application/json, Connection: keep-alive
|
||||
attr WR_2_API sortby 212
|
||||
attr WR_2_API timeout 7
|
||||
attr WR_2_API verbose 0
|
@ -0,0 +1,49 @@
|
||||
defmod WR_3 ModbusAttr 71 slave 192.168.178.40:1502 TCP
|
||||
attr WR_3 DbLogExclude .*
|
||||
attr WR_3 comment Version 2022.10.27 09:00\
|
||||
Fremder WR am KSEM
|
||||
attr WR_3 dev-h-combine 20
|
||||
attr WR_3 dev-h-defFormat %.2f
|
||||
attr WR_3 dev-h-defLen 2
|
||||
attr WR_3 dev-h-defRevRegs 1
|
||||
attr WR_3 dev-h-defUnpack f>
|
||||
attr WR_3 dev-type-STR-format %s
|
||||
attr WR_3 dev-type-STR-len 8
|
||||
attr WR_3 dev-type-STR-revRegs 0
|
||||
attr WR_3 dev-type-STR-unpack a*
|
||||
attr WR_3 disable 1
|
||||
attr WR_3 group PV Eigenverbrauch
|
||||
attr WR_3 icon sani_solar
|
||||
attr WR_3 obj-h1066-reading Total_DC_P_sumOfAllPVInputs
|
||||
attr WR_3 obj-h14-reading Inverter_serial_number
|
||||
attr WR_3 obj-h14-type STR
|
||||
attr WR_3 obj-h154-reading I_L1
|
||||
attr WR_3 obj-h156-reading Active_P_L1
|
||||
attr WR_3 obj-h158-reading U_L1
|
||||
attr WR_3 obj-h160-reading I_L2
|
||||
attr WR_3 obj-h162-reading Active_P_L2
|
||||
attr WR_3 obj-h164-reading U_L2
|
||||
attr WR_3 obj-h166-reading I_L3
|
||||
attr WR_3 obj-h168-reading Active_P_L3
|
||||
attr WR_3 obj-h170-reading U_L3
|
||||
attr WR_3 obj-h172-reading Total_AC_Active_P
|
||||
attr WR_3 obj-h172-set 1
|
||||
attr WR_3 obj-h38-reading Software-Version_Maincontroller_MC
|
||||
attr WR_3 obj-h38-type STR
|
||||
attr WR_3 obj-h46-reading Software-Version_IO-Controller_IOC
|
||||
attr WR_3 obj-h46-type STR
|
||||
attr WR_3 obj-h514-len 1
|
||||
attr WR_3 obj-h514-reading Battery_Actual_SOC
|
||||
attr WR_3 obj-h56-format %.0f
|
||||
attr WR_3 obj-h56-reading Inverter_state
|
||||
attr WR_3 obj-h56-unpack N
|
||||
attr WR_3 obj-h582-reading Actual_Battery_charge-discharge_P
|
||||
attr WR_3 obj-h6-reading Inverter_Article_number
|
||||
attr WR_3 obj-h6-type STR
|
||||
attr WR_3 obj-h768-len 32
|
||||
attr WR_3 obj-h768-reading Productname
|
||||
attr WR_3 obj-h768-type STR
|
||||
attr WR_3 propagateVerbose 1
|
||||
attr WR_3 room Strom->Photovoltaik
|
||||
attr WR_3 sortby 311
|
||||
attr WR_3 verbose 0
|
495
fhem/contrib/ch.eick/Photovoltaik/Wechselrichter/RAW_WR_ctl.txt
Normal file
495
fhem/contrib/ch.eick/Photovoltaik/Wechselrichter/RAW_WR_ctl.txt
Normal file
@ -0,0 +1,495 @@
|
||||
defmod WR_ctl DOIF ################################################################################################################\
|
||||
## 1 Scheduling für das Abholen der Wechselrichter Statistiken\
|
||||
## Umschaltung des Schattenmanagements\
|
||||
##\
|
||||
20_Statistic_EnergyFlow\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
( [:57] ## Kurz vor jeder vollen Stunde\
|
||||
)\
|
||||
or [$SELF:ui_command_2] eq "20_Statistic_EnergyFlow" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
\
|
||||
::CommandGet(undef, "WR_2_API 20_Statistic_EnergyFlow");; ## Zuerst WR_2 und anschließend\
|
||||
set_Exec("wait_Statistic",2,'::CommandGet(undef, "WR_1_API 20_Statistic_EnergyFlow")');; ## WR_1, damit die Schwarm Werte stimmen\
|
||||
\
|
||||
## Schattenmanagement \
|
||||
if ($hour == 9) {\
|
||||
::CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 0");; ## Komplett aus\
|
||||
}\
|
||||
if ($hour == 16) {\
|
||||
::CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 2");; ## Im Westen unten einschalten\
|
||||
}\
|
||||
if ($hour == 21) {\
|
||||
::CommandSet(undef, "WR_1_API 40_02_Generator_ShadowMgmt 1");; ## Schattenmanagement für den Osten vorbereiten\
|
||||
}\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF cmd_1 : Abfrage der Statistiken";;\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_2","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 2 Start der KI Prognose\
|
||||
## Der Reading Name und das Device werden in LogDBRep_PV_KI_Prognose im executeAfterProc eingestellt\
|
||||
## "/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_1_ctl Yield_fc"\
|
||||
##\
|
||||
2_KI_Prognose\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
ReadingsVal("LogDBRep_PV_KI_Prognose","PV_KI_Prognose","null") eq "done" ## Die Prognose darf nicht gerade laufen !!!\
|
||||
and\
|
||||
(\
|
||||
([05:00-22:00] and [:03] ## In der PV-Zeit jede Stunde aktualisieren\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "2_KI_Prognose" ## Hier wird das uiTable select ausgewertet\
|
||||
)\
|
||||
) {\
|
||||
\
|
||||
::CommandSet(undef, "LogDBRep_PV_KI_Prognose sqlCmd call dwd_load(curdate(),'none')");;\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF 2_KI_Prognose : Start KI Prognose";;\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 2 Erstellen des Diagramms im uiTable\
|
||||
3_WR_ctl_Diagramm\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and [$SELF:Yield_fc0_06] ## Wenn die Prognose aktualisiert wurde\
|
||||
or [$SELF:ui_command_1] eq "3_WR_ctl_Diagramm" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
\
|
||||
my (@out) = ("") x 2;; ## Es wird für jedes Diagramm ein Array benötigt\
|
||||
my $timestamp;;\
|
||||
\
|
||||
for (my $j=0;;$j<=1;;$j++){ ## loop fc0 und fc1\
|
||||
for (my $i=5;;$i<=21;;$i++){ ## loop für die PV-Zeit\
|
||||
$timestamp = sprintf("%s_%02d:00:00", POSIX::strftime("%Y-%m-%d",localtime(time)), $i);;\
|
||||
$out[$j] .= $timestamp." ".::round(::ReadingsVal("$SELF",sprintf("Yield_fc%d_%02d",$j, $i),0)/1000,2)."\n";;\
|
||||
} # End $i\
|
||||
} # End $j\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF 3_WR_ctl_Diagramm : Werte für das Diagramm";;\
|
||||
print($out[0]."\n\n");;\
|
||||
print($out[1]."\n");;\
|
||||
}\
|
||||
## Yield_fc*_current dient nur als Trigger für die card Diagramme, damit diese im uiTable aktualisiert werden.\
|
||||
::DOIF_modify_card_data("$SELF","$SELF","Yield_fc0_current","bar1day",0,$out[0]);; ## Der fc1 wird verschoben, da card nicht\
|
||||
::DOIF_modify_card_data("$SELF","$SELF","Yield_fc1_current","bar1day",-86400,$out[1]);; ## den nächsten Tag anzeigen kann\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 4 WR_1_API setzen der init Werte für die Berechnung des Hausverbrauches. Bei Fehlern in der Verbrauchsanzeige\
|
||||
## muss man die ersten Werte des Tages gegen 00:01 aus der DB setzen. \
|
||||
4_WR_1_API_init_Werte\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
[00:01]\
|
||||
or [$SELF:ui_command_2] eq "4_WR_1_API_init_Werte" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
if ($hour > 0) {\
|
||||
## Achtung, der init Wert muss auf den ersten Wert des Tages korrigiert werden, dieser ist in der DB\
|
||||
\
|
||||
## Korrektur der Tages Werte\
|
||||
my $Active_energy = ::CommandGet(undef, "LogDBRep_$SELF_SQL sqlCmdBlocking\
|
||||
SELECT VALUE FROM history\
|
||||
WHERE DEVICE='WR_0_KSEM'\
|
||||
AND READING='Active_energy-'\
|
||||
AND TIMESTAMP > curdate() - interval 1 month\
|
||||
AND TIMESTAMP <= concat(curdate(),' 00:01')\
|
||||
ORDER BY TIMESTAMP desc\
|
||||
LIMIT 1;;") ;;\
|
||||
fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Day $Active_energy");;\
|
||||
\
|
||||
$Active_energy = ::CommandGet(undef, "LogDBRep_$SELF_SQL sqlCmdBlocking\
|
||||
SELECT VALUE FROM history\
|
||||
WHERE DEVICE='WR_0_KSEM'\
|
||||
AND READING='Active_energy+'\
|
||||
AND TIMESTAMP > curdate() - interval 1 month\
|
||||
AND TIMESTAMP <= concat(curdate(),' 00:01')\
|
||||
ORDER BY TIMESTAMP desc\
|
||||
LIMIT 1;;") ;;\
|
||||
fhem("setreading WR_1_API SW_Meter_init_Grid_Day $Active_energy");;\
|
||||
\
|
||||
## Korrektur der Monats Werte\
|
||||
$Active_energy = ::CommandGet(undef, "LogDBRep_$SELF_SQL sqlCmdBlocking\
|
||||
SELECT VALUE FROM history\
|
||||
WHERE DEVICE='WR_0_KSEM'\
|
||||
AND READING='Active_energy-'\
|
||||
AND TIMESTAMP > curdate() - interval 1 month\
|
||||
AND TIMESTAMP <= subdate(curdate(), (day(curdate())-1))\
|
||||
ORDER BY TIMESTAMP desc\
|
||||
LIMIT 1;;") ;;\
|
||||
fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Month $Active_energy");;\
|
||||
\
|
||||
$Active_energy = ::CommandGet(undef, "LogDBRep_$SELF_SQL sqlCmdBlocking\
|
||||
SELECT VALUE FROM history\
|
||||
WHERE DEVICE='WR_0_KSEM'\
|
||||
AND READING='Active_energy+'\
|
||||
AND TIMESTAMP > curdate() - interval 1 month\
|
||||
AND TIMESTAMP <= LAST_DAY(SUBDATE(curdate(), INTERVAL 1 MONTH))\
|
||||
ORDER BY TIMESTAMP desc\
|
||||
LIMIT 1;;") ;;\
|
||||
fhem("setreading WR_1_API SW_Meter_init_Grid_Month $Active_energy");;\
|
||||
\
|
||||
::CommandGet(undef, "WR_2_API 20_Statistic_EnergyFlow");; ## Zuerst WR_2 und anschließend\
|
||||
::CommandGet(undef, "WR_1_API 20_Statistic_EnergyFlow");; ## WR_1, damit die Schwarm Werte stimmen\
|
||||
\
|
||||
} else {\
|
||||
fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Day ".[?WR_0_KSEM:Active_energy-]);;\
|
||||
fhem("setreading WR_1_API SW_Meter_init_Grid_Day ".[?WR_0_KSEM:Active_energy+]);;\
|
||||
}\
|
||||
\
|
||||
if ($mday eq 1) {\
|
||||
fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Month ".[?WR_0_KSEM:Active_energy-]);;\
|
||||
fhem("setreading WR_1_API SW_Meter_init_Grid_Month ".[?WR_0_KSEM:Active_energy+]);;\
|
||||
\
|
||||
if ($yday eq 0) {\
|
||||
fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Year ".[?WR_0_KSEM:Active_energy-]);;\
|
||||
fhem("setreading WR_1_API SW_Meter_init_Grid_Year ".[?WR_0_KSEM:Active_energy+]);;\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF 4_WR_1_API_init_Werte : init Werte gesetzt";;\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_2","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
|
||||
attr WR_ctl DbLogExclude .*
|
||||
attr WR_ctl DbLogInclude Yield_fc0_day,Yield_fc0_middayhigh.*
|
||||
attr WR_ctl comment Version 2023.06.21 12:00 \
|
||||
\
|
||||
Die readings Yield_fc* werden direkt vom KI Prognose Skript in die Datenbank geschrieben und müssen hier nicht extra gelogged werden.
|
||||
attr WR_ctl disable 0
|
||||
attr WR_ctl group PV Eigenverbrauch
|
||||
attr WR_ctl icon sani_solar
|
||||
attr WR_ctl room 2_PV_Steuerung,Strom->Photovoltaik
|
||||
attr WR_ctl sortby 11
|
||||
attr WR_ctl uiState {\
|
||||
package ui_Table;;\
|
||||
$TABLE = "style='width:100%;;'";;\
|
||||
\
|
||||
$TD{0..6}{0} = "style='border-top-style:solid;;border-bottom-style:solid;;border-left-style:solid;;border-left-width:2px;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:36%;;font-weight:bold;;'";;\
|
||||
$TD{0..6}{1..4} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:8%;;text-align:center;;'";;\
|
||||
$TD{0..6}{5} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:2px;;width:8%;;text-align:center;;'";;\
|
||||
\
|
||||
}\
|
||||
\
|
||||
"KI Prognose Kommando Auswahl<dd>Mittags Limit Inverter_Max_Power / KI Status</dd>"|\
|
||||
widget([$SELF:ui_command_1],"uzsuDropDown,---,2_KI_Prognose,3_WR_ctl_Diagramm") |\
|
||||
""|\
|
||||
""|\
|
||||
"MySQL ".[LogDBRep_PV_KI_Prognose:state]."<br> KI ".([LogDBRep_PV_KI_Prognose:state] ne "done") ? "waiting" : [LogDBRep_PV_KI_Prognose:PV_KI_Prognose]\
|
||||
\
|
||||
"Statistiken"|\
|
||||
Yield(0)|\
|
||||
Yield('Tag')|\
|
||||
Yield('4h')|\
|
||||
Yield('Rest')\
|
||||
\
|
||||
card([$SELF:Yield_fc0_current:bar1day],undef,undef,0,17,90,0,"fc0 kWh",undef,"2","130,,,,,,220").card([$SELF:Yield_fc1_current:bar1day],undef,undef,0,17,90,0,"fc1 kWh",undef,"2","130,,,,,,220")|\
|
||||
"<span style=font-weight:bold>nächste 3h</span><br><br>".Yield(1)."<br>".Yield(2)."<br>".Yield(3)|\
|
||||
"<span style=font-weight:bold>Vor- / Nachmittag</span><br><br>".Yield('Vormittag')."<br>".Yield('Nachmittag')|\
|
||||
"<span style=font-weight:bold>Maximum</span><br><br><br>".Yield("max")."<br>".Yield("max_time")|\
|
||||
"<span style=font-weight:bold>Mittagshoch</span><br><br><br>fc0 ".[$SELF:Yield_fc0_middayhigh_start]." - ".[$SELF:Yield_fc0_middayhigh_stop]."<br>fc1 ".[$SELF:Yield_fc1_middayhigh_start]." - ".[$SELF:Yield_fc1_middayhigh_stop]\
|
||||
\
|
||||
"WR_1 / KSEM<dd> / PV Reserve / Netz Leistung</dd>"|\
|
||||
""|\
|
||||
sprintf("%d W",[WR_1:SW_Total_PV_P_reserve])|\
|
||||
(::ReadingsVal("WR_1","Total_Active_P_EM",0) < -10) ? "<span style='color:green'>Einspeisen</span>" : (::ReadingsVal("WR_1","Total_Active_P_EM",0) > 15)? "<span style='color:red'>Netzbezug</span>" : "<span style='color:orange'>Standby</span>"|\
|
||||
sprintf("%d W",[WR_1:Total_Active_P_EM])\
|
||||
\
|
||||
"Ertrag aktuell<dd> / Tag / Monat / Jahr</dd>"|\
|
||||
""|\
|
||||
sprintf("%d kWh",::round([WR_1:SW_Yield_Daily]/1000 ,0))|\
|
||||
sprintf("%d kWh",::round([WR_1:SW_Yield_Monthly]/1000 ,0))|\
|
||||
sprintf("%d kWh",::round([WR_1:SW_Yield_Yearly]/1000 ,0))\
|
||||
\
|
||||
"Speicher<dd>Temperatur / nutzbare Ladung / Status / Leistung / akt. SOC</dd>"|\
|
||||
(::ReadingsVal("WR_1_API","DigitalOutputs_ConfigurationFlags",0) == 9) ? "<span style='color:green'>Lüfter An </span><br>" : "<br>".sprintf("%.1f °C",::ReadingsVal("WR_1","Battery_temperature",0))|\
|
||||
sprintf("%d Wh",::ReadingsVal("WR_1","Actual_Battery_charge_usable_P",0))|\
|
||||
Status_Speicher()|\
|
||||
[WR_1:Actual_Battery_charge_-minus_or_discharge_-plus_P]." W<br>".sprintf("%d %%",[WR_1:Act_state_of_charge])\
|
||||
\
|
||||
"WR_1_API<dd>Kommando Auswahl</dd>"|\
|
||||
widget([$SELF:ui_command_2],"uzsuDropDown,---,20_Statistic_EnergyFlow,4_WR_1_API_init_Werte") |\
|
||||
""|\
|
||||
""|\
|
||||
""
|
||||
attr WR_ctl uiTable {\
|
||||
package ui_Table;;\
|
||||
$TABLE = "style='width:100%;;'";;\
|
||||
\
|
||||
$TD{0..18}{0} = "style='border-top-style:solid;;border-bottom-style:solid;;border-left-style:solid;;border-left-width:2px;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:36%;;font-weight:bold;;'";;\
|
||||
$TD{0..18}{1..5} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:8%;;text-align:center;;'";;\
|
||||
$TD{0..18}{6} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:2px;;width:8%;;text-align:center;;'";;\
|
||||
\
|
||||
sub FUNC_Status {\
|
||||
my($value, $min, $colorMin, $statusMin, $colorMiddel, $statusMiddle, $max, $colorMax, $statusMax)=@_;;\
|
||||
my $ret = ($value < $min)? '<span style="color:'.$colorMin.'">'.$statusMin.'</span>' : ($value > $max)? '<span style="color:'.$colorMax.'">'.$statusMax.'</span>' : '<span style="color:'.$colorMiddel.'">'.$statusMiddle.'</span>';;\
|
||||
return $ret;;\
|
||||
}\
|
||||
\
|
||||
sub Status_Speicher {\
|
||||
if (::ReadingsVal("WR_1","Actual_Battery_charge_-minus_or_discharge_-plus_P",0) < -10) {\
|
||||
return "<span style='color:green'>Laden</span><br>".::ReadingsVal("WR_1","State_of_EM","n/a")\
|
||||
} elsif (::ReadingsVal("WR_1","Actual_Battery_charge_-minus_or_discharge_-plus_P",0) > 15) {\
|
||||
return "<span style='color:red'>Entladen</span><br>".::ReadingsVal("WR_1","State_of_EM","n/a")\
|
||||
} else {\
|
||||
return "<span style='color:orange'>Standby</span>"."<br>".::ReadingsVal("WR_1","State_of_EM","n/a")\
|
||||
}\
|
||||
}\
|
||||
sub Yield {\
|
||||
my($i)=@_;;\
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;;\
|
||||
\
|
||||
if ($i eq "4h") {\
|
||||
return sprintf("%05d 4h",::ReadingsVal("$SELF","Yield_fc0_4h",0));;\
|
||||
} elsif ($i eq "Tag") {\
|
||||
return sprintf("%05d Tag",::ReadingsVal("$SELF","Yield_fc0_day",0));;\
|
||||
} elsif ($i eq "Rest") {\
|
||||
return sprintf("%05d Rest",::ReadingsVal("$SELF","Yield_fc0_rest",0));;\
|
||||
} elsif ($i eq "max") {\
|
||||
return sprintf("%05d Wh",::ReadingsVal("$SELF","Yield_fc0_max",0));;\
|
||||
} elsif ($i eq "max_time") {\
|
||||
return ::ReadingsVal("$SELF","Yield_fc0_max_time","null");;\
|
||||
} elsif ($i eq "Vormittag") {\
|
||||
return sprintf("%05d Wh",::ReadingsVal("$SELF","Yield_fc0_morning",0));;\
|
||||
} elsif ($i eq "Nachmittag") {\
|
||||
return sprintf("%05d Wh",::ReadingsVal("$SELF","Yield_fc0_afternoon",0));;\
|
||||
}\
|
||||
my $j = $i + $hour;;\
|
||||
if ($j > 23) {\
|
||||
if ($j == 24) {$j = 0}\
|
||||
elsif ($j == 25) {$j = 1}\
|
||||
elsif ($j == 26) {$j = 2}\
|
||||
}\
|
||||
return sprintf("%02d : %05d Wh",$j,::ReadingsVal("$SELF","Yield_fc0_".sprintf("%02d",$j),0));;\
|
||||
}\
|
||||
\
|
||||
sub WR_ctl_Format {\
|
||||
my($period,$device,$reading)=@_;;\
|
||||
my $value = 0;;\
|
||||
\
|
||||
my $DayBefore = "LogDBRep_Statistic_previous_Day";;\
|
||||
my $DayPrevious = ::ReadingsTimestamp("$DayBefore",$device."_".$reading."_Day","null");;\
|
||||
$DayPrevious = ($DayPrevious ne "null") ? POSIX::strftime("%Y",localtime(::time_str2num(::ReadingsTimestamp("$DayBefore",$device."_".$reading."_Day","null")))) : "null";;\
|
||||
\
|
||||
if ($period eq "_Dx") {\
|
||||
if ($DayPrevious ne "null") {\
|
||||
return " / gestern";;\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
my $MonthBefore = "LogDBRep_Statistic_previous_Month";;\
|
||||
my $MonthPrevious = ::ReadingsTimestamp("$MonthBefore",$device."_".$reading."_Month","null");;\
|
||||
$MonthPrevious = ($MonthPrevious ne "null") ? POSIX::strftime("%Y",localtime(::time_str2num(::ReadingsTimestamp("$MonthBefore",$device."_".$reading."_Month","null")))) : "null";;\
|
||||
\
|
||||
if ($period eq "_Mx") {\
|
||||
if ($MonthPrevious ne "null") {\
|
||||
return " / Vormonat";;\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
my $QuarterBefore = "LogDBRep_Statistic_previous_Quarter";;\
|
||||
my $QuarterPrevious = "null";;\
|
||||
if ($period eq "_Qx" or $period eq "_Quarter" or $period eq "time_Quarter") {\
|
||||
foreach my $loop (1,2,3,4) {\
|
||||
if (::ReadingsVal("$QuarterBefore","Q".$loop,0) eq "previous") { \
|
||||
$QuarterPrevious = "Q".$loop \
|
||||
}\
|
||||
}\
|
||||
if ($period eq "_Qx") {\
|
||||
return $QuarterPrevious;;\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
my $YearBefore = "LogDBRep_Statistic_previous_Year";;\
|
||||
my $YearPrevious = ::ReadingsTimestamp($YearBefore,$reading."_Year","null");;\
|
||||
$YearPrevious = ($YearPrevious ne "null") ? POSIX::strftime("%Y",localtime(::time_str2num(::ReadingsTimestamp("$YearBefore",$reading."_Year","null")))) : "null";;\
|
||||
\
|
||||
if ($period eq "_Yx") {\
|
||||
if ($YearPrevious ne "null") {\
|
||||
return " / Vorjahr";;\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
if ($period eq "_Year") {\
|
||||
$YearPrevious = ::ReadingsTimestamp($YearBefore,$reading.$period,"null");;\
|
||||
$YearPrevious = ($YearPrevious ne "null") ? POSIX::strftime("%Y",localtime(::time_str2num(::ReadingsTimestamp($YearBefore,$reading.$period,"null")))) : "null";;\
|
||||
}\
|
||||
\
|
||||
if ($period eq "actual" and $reading eq "Autarky") {\
|
||||
my $valA = ::ReadingsVal($device, "SW_Total_AC_Active_P",0) - ::ReadingsVal($device, "SW_Home_own_consumption_from_grid",0);;\
|
||||
my $calcVal = ($valA > 0) ? ::round($valA /($valA + ::ReadingsVal($device, "SW_Home_own_consumption_from_grid",0))*100 ,0) : 0;;\
|
||||
return sprintf("%3d %%",(($calcVal > 100) ? 100 : $calcVal) );;\
|
||||
}\
|
||||
\
|
||||
if ($period eq "actual" and $reading eq "OwnConsumptionRate") {\
|
||||
my $valS = ::ReadingsVal($device,"SW_Total_AC_Active_P",0);;\
|
||||
my $calcVal = ($valS > 0) ? ::round((::ReadingsVal($device,"SW_Home_own_consumption_from_PV",0) +\
|
||||
::ReadingsVal($device,"SW_Home_own_consumption_from_Battery",0)) / $valS * 100 ,0) : 0;;\
|
||||
return sprintf("%3d %%",(($calcVal > 100) ? 100 : $calcVal) );;\
|
||||
}\
|
||||
\
|
||||
if ($period eq "time_Day" and $reading eq "SW_Statistic_Autarky") {\
|
||||
return POSIX::strftime("%H:%M",localtime(::time_str2num(::ReadingsTimestamp($device, $reading."_Day",0))))\
|
||||
}\
|
||||
\
|
||||
if ($period eq "time_Month" and $reading eq "SW_Statistic_Autarky") {\
|
||||
return POSIX::strftime("%H:%M",localtime(::time_str2num(::ReadingsTimestamp($device, $reading."_Month",0))));;\
|
||||
}\
|
||||
\
|
||||
if ($period eq "time_Quarter") {\
|
||||
if ($QuarterPrevious ne "null") {\
|
||||
return POSIX::strftime("%Y-%m-%d",localtime(::time_str2num(::ReadingsTimestamp($QuarterBefore, $QuarterPrevious,0))));;\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
if ($period eq "time_Year" and $reading eq "SW_Statistic_Autarky") {\
|
||||
my $cy = POSIX::strftime("%H:%M",localtime(::time_str2num(::ReadingsTimestamp($device, $reading."_Year",0))));;\
|
||||
$cy .= ($YearPrevious ne "null") ? " / ".$YearPrevious : "";;\
|
||||
return $cy;;\
|
||||
}\
|
||||
\
|
||||
if ($period eq "Autarky_Year" or $period eq "OwnConsumptionRate_Year") {\
|
||||
$value = sprintf("%3d %%",::ReadingsVal($device,$reading."_Year",0));;\
|
||||
$value .= ($YearPrevious ne "null") ? sprintf(" / %3d %%", ::ReadingsVal($YearBefore,$reading."_Year",0) ) : "";;\
|
||||
return $value;;\
|
||||
} elsif ($period eq "_Day") {\
|
||||
if ($reading eq "SW_Statistic_Autarky" or $reading eq "SW_Statistic_OwnConsumptionRate") {\
|
||||
$value = sprintf("%3d %%",::ReadingsVal($device,$reading.$period,0) );;\
|
||||
$value .= ($DayPrevious ne "null") ? sprintf(" / %3d %%", ::ReadingsVal($DayBefore,$device."_".$reading.$period,0) ) : "";;\
|
||||
} else {\
|
||||
$value = sprintf("%04d",::ReadingsVal($device,$reading.$period,0)/1000);;\
|
||||
$value .= ($DayPrevious ne "null") ? sprintf(" / %04d", ::ReadingsVal($DayBefore,$device."_".$reading.$period,0) ) : "";;\
|
||||
}\
|
||||
return $value;;\
|
||||
} elsif ($period eq "_Month") {\
|
||||
if ($reading eq "SW_Statistic_Autarky" or $reading eq "SW_Statistic_OwnConsumptionRate") {\
|
||||
$value = sprintf("%3d %%",::ReadingsVal($device,$reading.$period,0) );;\
|
||||
$value .= ($MonthPrevious ne "null") ? sprintf(" / %3d %%", ::ReadingsVal($MonthBefore,$device."_".$reading.$period,0) ) : "";;\
|
||||
} else {\
|
||||
$value = sprintf("%04d",::ReadingsVal($device,$reading.$period,0)/1000);;\
|
||||
$value .= ($MonthPrevious ne "null") ? sprintf(" / %04d", ::ReadingsVal($MonthBefore,$device."_".$reading.$period,0) ) : "";;\
|
||||
}\
|
||||
return $value;;\
|
||||
} elsif ($period eq "_Quarter") {\
|
||||
$value = ($QuarterPrevious ne "null") ? sprintf("%04d", ::ReadingsVal($QuarterBefore,$QuarterPrevious."_".$reading,0) ) : "";;\
|
||||
return $value;;\
|
||||
} elsif ($period eq "_Year") {\
|
||||
$value = sprintf("%05d",::ReadingsVal($device,$reading.$period,0)/1000);;\
|
||||
$value .= ($YearPrevious ne "null") ? sprintf(" / %05d", ::ReadingsVal($YearBefore,$reading.$period,0) ) : "";;\
|
||||
return $value;;\
|
||||
}\
|
||||
return " / null";;\
|
||||
}\
|
||||
\
|
||||
}\
|
||||
\
|
||||
\
|
||||
"Statistiken ".::POSIX::strftime("%Y-%m-%d",localtime(::time_str2num(::ReadingsTimestamp("WR_1_API", "auth_me_authenticated",0))))." in kWh"|\
|
||||
"<span style=font-weight:bold>aktuell</span>"|\
|
||||
"<span style=font-weight:bold>heute".WR_ctl_Format("_Dx","WR_1_API","SW_Statistic_Yield")."</span>"|\
|
||||
|\
|
||||
"<span style=font-weight:bold>Monat".WR_ctl_Format("_Mx","WR_1_API","SW_Statistic_Yield")."</span>"|\
|
||||
"<span style=font-weight:bold>".WR_ctl_Format("_Qx","none","none")."</span>"|\
|
||||
"<span style=font-weight:bold>Jahr".WR_ctl_Format("_Yx","none","SW_Statistic_Yield")."</span>"\
|
||||
\
|
||||
"Erzeugung PV-Total"|\
|
||||
sprintf("%04d W",[WR_1:SW_Total_AC_Active_P])|\
|
||||
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_Yield")|\
|
||||
|\
|
||||
WR_ctl_Format("_Month","WR_1_API","SW_Statistic_Yield")|\
|
||||
WR_ctl_Format("_Quarter","WR_1_API","SW_Statistic_Yield")|\
|
||||
WR_ctl_Format("_Year","WR_1_API","SW_Statistic_Yield")\
|
||||
\
|
||||
"Bezug von PV"|\
|
||||
sprintf("%04d W",[WR_1:SW_Home_own_consumption_from_Battery]+[WR_1:SW_Home_own_consumption_from_PV])|\
|
||||
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_EnergyHomePv")|\
|
||||
|\
|
||||
WR_ctl_Format("_Month","WR_1_API","SW_Statistic_EnergyHomePv")|\
|
||||
WR_ctl_Format("_Quarter","WR_1_API","SW_Statistic_EnergyHomePv")|\
|
||||
WR_ctl_Format("_Year","WR_1_API","SW_Statistic_EnergyHomePv")\
|
||||
\
|
||||
"Bezug von Batterie"|\
|
||||
sprintf("%04d W",[WR_1:SW_Home_own_consumption_from_Battery])|\
|
||||
WR_ctl_Format("_Day","WR_1_API","Statistic_EnergyHomeBat")|\
|
||||
|\
|
||||
WR_ctl_Format("_Month","WR_1_API","Statistic_EnergyHomeBat")|\
|
||||
WR_ctl_Format("_Quarter","WR_1_API","Statistic_EnergyHomeBat")|\
|
||||
WR_ctl_Format("_Year","WR_1_API","Statistic_EnergyHomeBat")\
|
||||
\
|
||||
"Bezug vom Netz"|\
|
||||
sprintf("%04d W",([WR_1:Total_Active_P_EM] >= 0 ? ::round(::ReadingsVal("WR_1","Total_Active_P_EM",0),0) : 0) )|\
|
||||
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_EnergyHomeGrid")|\
|
||||
|\
|
||||
WR_ctl_Format("_Month","WR_1_API","SW_Statistic_EnergyHomeGrid")|\
|
||||
WR_ctl_Format("_Quarter","WR_1_API","SW_Statistic_EnergyHomeGrid")|\
|
||||
WR_ctl_Format("_Year","WR_1_API","SW_Statistic_EnergyHomeGrid")\
|
||||
\
|
||||
"Bezug ins Haus (Energieverbrauch)"|\
|
||||
sprintf("%04d W",[WR_1:SW_Home_own_consumption_from_PV]+[WR_1:SW_Home_own_consumption_from_Battery]+[WR_1:SW_Home_own_consumption_from_grid])|\
|
||||
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_TotalConsumption")|\
|
||||
|\
|
||||
WR_ctl_Format("_Month","WR_1_API","SW_Statistic_TotalConsumption")|\
|
||||
WR_ctl_Format("_Quarter","WR_1_API","SW_Statistic_TotalConsumption")|\
|
||||
WR_ctl_Format("_Year","WR_1_API","SW_Statistic_TotalConsumption")\
|
||||
\
|
||||
"Einspeisung ins Netz"|\
|
||||
sprintf("%04d W",([WR_1:Total_Active_P_EM] <= 0 ? abs(::round(::ReadingsVal("WR_1","Total_Active_P_EM",0),0)) : 0) )|\
|
||||
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_EnergyHomeFeedInGrid")|\
|
||||
|\
|
||||
WR_ctl_Format("_Month","WR_1_API","SW_Statistic_EnergyHomeFeedInGrid")|\
|
||||
WR_ctl_Format("_Quarter","WR_1_API","SW_Statistic_EnergyHomeFeedInGrid")|\
|
||||
WR_ctl_Format("_Year","WR_1_API","SW_Statistic_EnergyHomeFeedInGrid")\
|
||||
\
|
||||
"Autarkiequote"|\
|
||||
WR_ctl_Format("actual","WR_1","Autarky")|\
|
||||
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_Autarky")|\
|
||||
|\
|
||||
WR_ctl_Format("_Month","WR_1_API","SW_Statistic_Autarky")|\
|
||||
|\
|
||||
WR_ctl_Format("Autarky_Year","WR_1_API","SW_Statistic_Autarky")\
|
||||
\
|
||||
"Eigenverbrauchsquote"|\
|
||||
WR_ctl_Format("actual","WR_1","OwnConsumptionRate")|\
|
||||
WR_ctl_Format("_Day","WR_1_API","SW_Statistic_OwnConsumptionRate")|\
|
||||
|\
|
||||
WR_ctl_Format("_Month","WR_1_API","SW_Statistic_OwnConsumptionRate")|\
|
||||
|\
|
||||
WR_ctl_Format("OwnConsumptionRate_Year","WR_1_API","SW_Statistic_OwnConsumptionRate")\
|
||||
\
|
||||
"Berechnet um"|\
|
||||
|\
|
||||
WR_ctl_Format("time_Day","WR_1_API","SW_Statistic_Autarky")|\
|
||||
|\
|
||||
WR_ctl_Format("time_Month","WR_1_API","SW_Statistic_Autarky")|\
|
||||
WR_ctl_Format("time_Quarter","WR_1_API","")|\
|
||||
WR_ctl_Format("time_Year","WR_1_API","SW_Statistic_Autarky")\
|
||||
|
||||
attr WR_ctl userReadings Yield_fc0_current:Yield_fc0_18.* { my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;; ::ReadingsVal("$NAME","Yield_fc0_".sprintf("%02d",$hour),0)/1000 },\
|
||||
Yield_fc1_current:Yield_fc1_18.* { my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;; ::ReadingsVal("$NAME","Yield_fc1_".sprintf("%02d",$hour),0)/1000 }
|
||||
attr WR_ctl verbose 3
|
||||
|
||||
setstate WR_ctl 2023-06-21 11:33:15 SpeicherMidday_Inverter_Max_Power 9000
|
||||
setstate WR_ctl 2024-01-24 16:03:00 ui_command_1 ---
|
||||
setstate WR_ctl 2024-01-24 15:57:00 ui_command_2 ---
|
264
fhem/contrib/ch.eick/Strombörse/EVU_Tibber/RAW_EVU_Tibber.txt
Normal file
264
fhem/contrib/ch.eick/Strombörse/EVU_Tibber/RAW_EVU_Tibber.txt
Normal file
@ -0,0 +1,264 @@
|
||||
defmod EVU_Tibber DOIF ## Startup Befehle für den WebSocket vom EVU_Tibber_connect\
|
||||
init\
|
||||
{ \
|
||||
Log(0, "$SELF 0 init : ▶️ EVU_Tibber init");;\
|
||||
fhem("setreading EVU_Tibber_connect ws_cmd connect");; \
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF 0 WebSocket : ▶️ EVU_Tibber_connect start Websocket";;\
|
||||
}\
|
||||
Log(0, "$SELF 0 init : 🏁 EVU_Tibber init done");;\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## EVU_Tibber_connect start/stop WebSocket\
|
||||
EVU_Tibber_connect_ws\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
# or [$SELF:ui_command_2] ## Hier wird das uiTable select ausgewertet\
|
||||
and [$SELF:ui_command_2] ne "---"\
|
||||
) {\
|
||||
\
|
||||
fhem("setreading EVU_Tibber_connect ws_cmd ".[?$SELF:ui_command_2]);; \
|
||||
\
|
||||
set_Reading("ui_command_2","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 1 Scheduling für das Abholen von Tibber Daten\
|
||||
1_EVU_Tibber_PriceInfo\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
( [:03] ## Kurz nach jeder vollen Stunde\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "1_EVU_Tibber_PriceInfo" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
\
|
||||
::CommandGet(undef, "EVU_Tibber_connect 01_priceInfo");; ## Preis für die aktuelle Stunde\
|
||||
::CommandGet(undef, "EVU_Tibber_connect 03_consumption_hour");; ## Kosten der letzen drei Stunden\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF 1 PriceInfo : Abfrage von Tibber";;\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 2 Scheduling für das Abholen der Tibber Preise\
|
||||
2_EVU_Tibber_PriceAll\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
([00:03] or [14:03] ## Ab 14:00 Uhr gibt es die Preise für den nächsten Tag\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "2_EVU_Tibber_PriceAll" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
\
|
||||
::CommandGet(undef, "EVU_Tibber_connect 02_priceAll");;\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF 2 priceAll : Abfrage von Tibber für den nächsten Tag";;\
|
||||
}\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
################################################################################################################\
|
||||
## 2 Erstellen des Diagramms im uiTable\
|
||||
3_EVU_Tibber_Diagramm\
|
||||
{if( !([$SELF:state] eq "off") ## DOIF enabled\
|
||||
and\
|
||||
( [00:05] or [14:05] ## Kurz nach Mitternacht\
|
||||
)\
|
||||
or [$SELF:ui_command_1] eq "3_EVU_Tibber_Diagramm" ## Hier wird das uiTable select ausgewertet\
|
||||
) {\
|
||||
\
|
||||
my (@out) = ("") x 2;;\
|
||||
my $timestamp;;\
|
||||
\
|
||||
for (my $j=0;;$j<=1;;$j++){\
|
||||
\
|
||||
if (ReadingsVal("EVU_Tibber_connect",sprintf("fc%d_00_startsAt",$j),"null") eq "null") { ## Der nächste Tag ist noch nicht da\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF 3 Diagramm : Tibber Daten für fc".$j." sind noch nicht da";;\
|
||||
}\
|
||||
\
|
||||
$timestamp = POSIX::strftime("%Y-%m-%d",localtime(time+86400));; ## Setze das Datum auf morgen\
|
||||
for (my $k=0;;$k<=24;;$k++) {\
|
||||
$out[$j] .= sprintf("%s_%02d:00:00 0.0\n", $timestamp, $k);; ## Die Daten mit 0 ergänzen\
|
||||
}\
|
||||
$j = 2;; ## Aus der Schleife springen\
|
||||
\
|
||||
} else {\
|
||||
\
|
||||
for (my $i=0;;$i<=23;;$i++){\
|
||||
$timestamp = ReadingsVal("EVU_Tibber_connect",sprintf("fc%d_%02d_startsAt",$j,$i),"");;\
|
||||
$timestamp =~ s/ /_/g;;\
|
||||
$out[$j] .=$timestamp." ".::round(ReadingsVal("EVU_Tibber_connect",sprintf("fc%d_%02d_total",$j, $i),0)*100,1)."\n";;\
|
||||
} # End $i\
|
||||
\
|
||||
} # End if\
|
||||
} # End $j\
|
||||
\
|
||||
if (AttrVal("$SELF","verbose",0) >=3) {\
|
||||
Log 3, "$SELF 3 Diagramm : Werte für das Diagramm";;\
|
||||
print($out[0]);;\
|
||||
print($out[1]);;\
|
||||
}\
|
||||
## Die readings current_price und current_level dienen hier nur als Trigger Events, und müssen für\
|
||||
## jedes Diagramm unterschiedlich sein, die Daten werden über $out[] bereit gestellt !!\
|
||||
::DOIF_modify_card_data("EVU_Tibber","EVU_Tibber_connect","current_price","bar1day",0,$out[0]);;\
|
||||
::DOIF_modify_card_data("EVU_Tibber","EVU_Tibber_connect","current_level","bar1day",-86400,$out[1]);;\
|
||||
## Mit der Abfrage 03_consumption_hour werden die Trigger erneut ausgelöst\
|
||||
::CommandGet(undef, "EVU_Tibber_connect 01_priceInfo");; ## Kosten der letzen drei Stunden\
|
||||
## fhem("get EVU_Tibber_connect 01_priceInfo");; ## Kosten der letzen drei Stunden\
|
||||
\
|
||||
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
|
||||
## kann das Kommando nicht sofort wiederholt werden\
|
||||
}\
|
||||
}\
|
||||
|
||||
attr EVU_Tibber DbLogExclude .*
|
||||
attr EVU_Tibber comment Version 2023.12.06 13:00 \
|
||||
Dieses Device benötigt EVU_Tibber_connect als Verbindung zu Tibber.
|
||||
attr EVU_Tibber disable 0
|
||||
attr EVU_Tibber group PV Steuerung EVU
|
||||
attr EVU_Tibber icon stromzaehler_icon
|
||||
attr EVU_Tibber room Strom->Boerse
|
||||
attr EVU_Tibber sortby 315
|
||||
attr EVU_Tibber uiState {\
|
||||
package ui_Table;;\
|
||||
$TABLE = "style='width:100%;;'";;\
|
||||
\
|
||||
$TD{0..6}{0} = "style='border-top-style:solid;;border-bottom-style:solid;;border-left-style:solid;;border-left-width:2px;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:36%;;font-weight:bold;;'";;\
|
||||
$TD{0..6}{1..4} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:8%;;text-align:center;;'";;\
|
||||
$TD{0..6}{5} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:2px;;width:8%;;text-align:center;;'";;\
|
||||
\
|
||||
}\
|
||||
\
|
||||
"Kommando<dd>Auswahl</dd>" |widget([$SELF:ui_command_1],"uzsuDropDown,---,1_EVU_Tibber_PriceInfo,2_EVU_Tibber_PriceAll,3_EVU_Tibber_Diagramm") |"LiveMessurement <br>".widget([$SELF:ui_command_2],"uzsuDropDown,---,connect,disconnect")|""|[EVU_Tibber_connect:ws_cmd]\
|
||||
\
|
||||
"Strompreis<br>".card([EVU_Tibber_connect:current_price:bar1day],undef,undef,0,60,90,0,"fc0 ".::ReadingsVal(Device(),"current_currency",""),undef,"1","130,,,,,,220").card([EVU_Tibber_connect:current_level:bar1day],undef,undef,0,60,90,0,"fc1 ".::ReadingsVal(Device(),"current_currency",""),undef,"1","130,,,,,,220")|\
|
||||
"<span style=font-weight:bold>nächste 3h</span><br><br>".Price(1)."<br>".Price(2)."<br>".Price(3)|"<span style=font-weight:bold>Statistik fc0</span><br><br>".::ReadingsVal(Device(),"fc_min",0)." min<br>".::ReadingsVal(Device(),"fc_avg",0)." avg<br>".::ReadingsVal(Device(),"fc_med",0)." med<br>".::ReadingsVal(Device(),"fc_max",0)." max"|\
|
||||
"<span style=font-weight:bold>Trigger fc0</span><br>Basis ".widget([EVU_Tibber_connect:compensation_grid],"selectnumbers,0,0.1,12,1,lin")."<br>".Format("trigger_0")|\
|
||||
"<span style=font-weight:bold>Trigger fc1</span><br><br>".Format("trigger_1")
|
||||
attr EVU_Tibber uiTable {\
|
||||
package ui_Table;;\
|
||||
$TABLE = "style='width:100%;;'";;\
|
||||
\
|
||||
$TD{0..18}{0} = "style='border-top-style:solid;;border-bottom-style:solid;;border-left-style:solid;;border-left-width:2px;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:36%;;font-weight:bold;;'";;\
|
||||
$TD{0..18}{1..5} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:8%;;text-align:center;;'";;\
|
||||
$TD{0..18}{6} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:2px;;width:8%;;text-align:center;;'";;\
|
||||
\
|
||||
sub FUNC_Status {\
|
||||
my($value, $min, $colorMin, $statusMin, $colorMiddel, $statusMiddle, $max, $colorMax, $statusMax)=@_;;\
|
||||
my $ret = ($value < $min)? '<span style="color:'.$colorMin.'">'.$statusMin.'</span>' : ($value > $max)? '<span style="color:'.$colorMax.'">'.$statusMax.'</span>' : '<span style="color:'.$colorMiddel.'">'.$statusMiddle.'</span>';;\
|
||||
return $ret;;\
|
||||
}\
|
||||
\
|
||||
sub Device {\
|
||||
return "$SELF"."_connect";;\
|
||||
}\
|
||||
\
|
||||
sub Cost {\
|
||||
my($i)=@_;;\
|
||||
my $currency = (::ReadingsVal(Device(),"current_currency","") eq "EUR")? " €" : "";;\
|
||||
\
|
||||
return ::ReadingsVal(Device(),"total_cost_".$i,0).$currency;;\
|
||||
}\
|
||||
\
|
||||
sub Price {\
|
||||
my($i)=@_;;\
|
||||
my $j;;\
|
||||
my $value;;\
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;;\
|
||||
\
|
||||
if ($i == 0) {\
|
||||
$value = ::ReadingsVal(Device(),"current_price",0);;\
|
||||
$value = ( ::ReadingsVal(Device(),"fc0_trigger","off") eq "on" ) ?\
|
||||
"<span style='color:green'>".$value."</span>" :\
|
||||
"<span style='color:red'>".$value."</span>" ;;\
|
||||
$value .= " ct/kWh";;\
|
||||
} else {\
|
||||
$j = $i+$hour;;\
|
||||
if ($j < 24) {\
|
||||
$value = ::round(::ReadingsVal(Device(),"fc0_".sprintf("%02d",$j)."_total",0)*100,1);;\
|
||||
} else {\
|
||||
$j = $j - 24;;\
|
||||
$value = ::round(::ReadingsVal(Device(),"fc1_".sprintf("%02d",$j)."_total",0)*100,1);;\
|
||||
}\
|
||||
$value = ( ::ReadingsVal(Device(),"fc_trigger_price","0") > $value ) ?\
|
||||
"<span style='color:green'>".$value."</span>" :\
|
||||
"<span style='color:red'>".$value."</span>" ;;\
|
||||
$value = sprintf("%02d",$j)." : ".$value ;;\
|
||||
}\
|
||||
return $value;;\
|
||||
}\
|
||||
\
|
||||
sub Format {\
|
||||
my($i)=@_;;\
|
||||
\
|
||||
my $MonthBefore = "LogDBRep_Statistic_previous_Month";;\
|
||||
my $MonthPrevious = ::ReadingsTimestamp("$MonthBefore",Device()."_nodes_consumption_month","null");;\
|
||||
$MonthPrevious = ($MonthPrevious ne "null") ? POSIX::strftime("%Y",localtime(::time_str2num(::ReadingsTimestamp("$MonthBefore",Device()."_nodes_consumption_month","null")))) : "null";;\
|
||||
\
|
||||
my $YearBefore = "LogDBRep_Statistic_previous_Year";;\
|
||||
my $YearPrevious = ::ReadingsTimestamp("$YearBefore",Device()."_nodes_consumption_year","null");;\
|
||||
$YearPrevious = ($YearPrevious ne "null") ? POSIX::strftime("%Y",localtime(::time_str2num(::ReadingsTimestamp("$YearBefore",Device()."_nodes_consumption_year","null")))) : "null";;\
|
||||
\
|
||||
if ($i eq "day") {\
|
||||
return sprintf("%04d",::ReadingsVal(Device(),"nodes_consumption_day",0));;\
|
||||
} elsif ($i eq "month") {\
|
||||
my $evu_em = sprintf("%04d",::ReadingsVal(Device(),"nodes_consumption_month",0));;\
|
||||
$evu_em .= ($MonthPrevious ne "null") ? sprintf(" / %04d", ::ReadingsVal("$MonthBefore",Device()."_nodes_consumption_month",0) ) : "";;\
|
||||
return $evu_em;;\
|
||||
} elsif ($i eq "year") {\
|
||||
my $evu_ey = sprintf("%04d",::ReadingsVal(Device(),"nodes_consumption_year",0));;\
|
||||
$evu_ey .= ($YearPrevious ne "null") ? sprintf(" / %04d", ::ReadingsVal("$YearBefore",Device()."_nodes_consumption_month",0) ) : "";;\
|
||||
return $evu_ey;;\
|
||||
} elsif ($i eq "trigger_0") {\
|
||||
return ((::ReadingsVal(Device(),"fc0_trigger_start","") eq "null" ) ?\
|
||||
"<span style='color:red'>Heute kein Trigger <br>mehr unter ".\
|
||||
::ReadingsVal(Device(),"fc_trigger_price","null")." ct</span>" :\
|
||||
"<span style='color:green'>Trigger von<br>".\
|
||||
::ReadingsVal(Device(),"fc0_trigger_start","00:00")." bis ".::ReadingsVal(Device(),"fc0_trigger_stop","00:00")."<br>unter ".\
|
||||
::ReadingsVal(Device(),"fc_trigger_price","null")." ct</span>" );;\
|
||||
} elsif ($i eq "trigger_1") {\
|
||||
if (::ReadingsVal(Device(),"fc1_00_startsAt","null") ne "null") {\
|
||||
return ((::ReadingsVal(Device(),"fc1_trigger_start","null") eq "null" ) ?\
|
||||
"<span style='color:red'>Morgen kein Trigger <br>mehr unter ".\
|
||||
::ReadingsVal(Device(),"fc_trigger_price","null")." ct</span>" :\
|
||||
"<span style='color:green'>Morgen ein Trigger von<br>".\
|
||||
::ReadingsVal(Device(),"fc1_trigger_start","00:00")." bis ".::ReadingsVal(Device(),"fc1_trigger_stop","00:00")."<br>unter ".\
|
||||
::ReadingsVal(Device(),"fc_trigger_price","null")." ct</span>" );;\
|
||||
} else {\
|
||||
return "Morgen noch kein Trigger vorhanden";;\
|
||||
}\
|
||||
}\
|
||||
return "null";;\
|
||||
}\
|
||||
\
|
||||
}\
|
||||
\
|
||||
"Statistiken ".::ReadingsVal(Device(),"current_date",0)." in kWh"|"<span style=font-weight:bold>aktuell</span>"|"<span style=font-weight:bold>heute</span>"|"<span style=font-weight:bold>Monat</span>"|"<span style=font-weight:bold>Jahr</span>"\
|
||||
\
|
||||
"Strom<dd>Preis / Kosten</dd>"|Price(0)|Cost("day")|Cost("month")|Cost("year")\
|
||||
\
|
||||
## Wenn man das liveMessurment von Tibber verwendet\
|
||||
"Bezug vom Netz"|\
|
||||
sprintf("%04d W",([EVU_Tibber_connect:payload_data_liveMeasurement_power] >= 0 ? ::ReadingsVal("EVU_Tibber_connect","payload_data_liveMeasurement_power",0) : 0))|\
|
||||
Format("day")|Format("month")|Format("year")\
|
||||
\
|
||||
"Einspeisung ins Netz"|\
|
||||
sprintf("%04d W",([EVU_Tibber_connect:payload_data_liveMeasurement_powerProduction] >= 0 ? ::ReadingsVal("EVU_Tibber_connect","payload_data_liveMeasurement_powerProduction",0) : 0))|\
|
||||
""|""|""\
|
||||
\
|
||||
## Wenn man einen eigenes SmartMeter verwendet\
|
||||
## "Bezug vom Netz"|sprintf("%04d W",([WR_0_KSEM:M_AC_Power] >= 0 ? ::round(::ReadingsVal("WR_0_KSEM","M_AC_Power",0),0) : 0) )|Format("day")|Format("month")|Format("year")\
|
||||
## "Einspeisung ins Netz"|sprintf("%04d W",([WR_0_KSEM:M_AC_Power] <= 0 ? abs(::round(::ReadingsVal("WR_0_KSEM","M_AC_Power",0),0)) : 0) )|""|""|""
|
||||
attr EVU_Tibber verbose 3
|
||||
|
||||
setstate EVU_Tibber 2024-01-23 10:03:00 ui_command_1 ---
|
||||
setstate EVU_Tibber 2024-01-20 17:40:53 ui_command_2 ---
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,5 @@
|
||||
defmod LogDBRep_EVU_Tibber_connect_SQL DbRep LogDB
|
||||
attr LogDBRep_EVU_Tibber_connect_SQL DbLogExclude .*
|
||||
attr LogDBRep_EVU_Tibber_connect_SQL room System
|
||||
attr LogDBRep_EVU_Tibber_connect_SQL sqlCmdHistoryLength 5
|
||||
attr LogDBRep_EVU_Tibber_connect_SQL timeout 20
|
191
fhem/contrib/ch.eick/Strombörse/EVU_aWATTar/RAW_EVU_aWATTar.txt
Normal file
191
fhem/contrib/ch.eick/Strombörse/EVU_aWATTar/RAW_EVU_aWATTar.txt
Normal file
@ -0,0 +1,191 @@
|
||||
defmod EVU_aWATTar_connect HTTPMOD https://api.awattar.de/v1/marketdata/current.yaml 0
|
||||
attr EVU_aWATTar_connect DbLogExclude .*
|
||||
attr EVU_aWATTar_connect comment Version 2024.01.23 13:00\
|
||||
\
|
||||
Achtung, momentan werden nur die Börsenpreise ohne die fix Kosten dargestellt.\
|
||||
\
|
||||
https://api.awattar.de/v1/marketdata
|
||||
attr EVU_aWATTar_connect enableControlSet 1
|
||||
attr EVU_aWATTar_connect get01-15Name fc_max
|
||||
attr EVU_aWATTar_connect get01-15OExpr round(($val+$val*0.03+1.785)*1.19,2)
|
||||
attr EVU_aWATTar_connect get01-1Name current_date
|
||||
attr EVU_aWATTar_connect get01-22Name fc_med
|
||||
attr EVU_aWATTar_connect get01-22OExpr round(($val+$val*0.03+1.785)*1.19,2)
|
||||
attr EVU_aWATTar_connect get01-29Name fc_avg
|
||||
attr EVU_aWATTar_connect get01-29OExpr round(($val+$val*0.03+1.785)*1.19,2)
|
||||
attr EVU_aWATTar_connect get01-36Name current_price
|
||||
attr EVU_aWATTar_connect get01-36OExpr round(($val+$val*0.03+1.785)*1.19,2)
|
||||
attr EVU_aWATTar_connect get01-8Name fc_min
|
||||
attr EVU_aWATTar_connect get01-8OExpr round(($val+$val*0.03+1.785)*1.19,2)
|
||||
attr EVU_aWATTar_connect get01Name 01_priceInfo
|
||||
attr EVU_aWATTar_connect get01RegOpt g
|
||||
attr EVU_aWATTar_connect get01Regex date_now: (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})|price_low: ([0-9]+[0-9\.]+)|price_high: ([0-9]+[0-9\.]+)|price_median: ([0-9]+[0-9\.]+)|price_average: ([0-9]+[0-9\.]+)|price_current: ([0-9]+[0-9\.]+)
|
||||
attr EVU_aWATTar_connect get01URL https://api.awattar.de/v1/marketdata/current.yaml
|
||||
attr EVU_aWATTar_connect get02-10Name fc0_09_total
|
||||
attr EVU_aWATTar_connect get02-10OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-11Name fc0_10_total
|
||||
attr EVU_aWATTar_connect get02-11OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-12Name fc0_11_total
|
||||
attr EVU_aWATTar_connect get02-12OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-13Name fc0_12_total
|
||||
attr EVU_aWATTar_connect get02-13OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-14Name fc0_13_total
|
||||
attr EVU_aWATTar_connect get02-14OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-15Name fc0_14_total
|
||||
attr EVU_aWATTar_connect get02-15OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-16Name fc0_15_total
|
||||
attr EVU_aWATTar_connect get02-16OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-17Name fc0_16_total
|
||||
attr EVU_aWATTar_connect get02-17OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-18Name fc0_17_total
|
||||
attr EVU_aWATTar_connect get02-18OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-19Name fc0_18_total
|
||||
attr EVU_aWATTar_connect get02-19OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-1Name fc0_00_total
|
||||
attr EVU_aWATTar_connect get02-1OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-20Name fc0_19_total
|
||||
attr EVU_aWATTar_connect get02-20OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-21Name fc0_20_total
|
||||
attr EVU_aWATTar_connect get02-21OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-22Name fc0_21_total
|
||||
attr EVU_aWATTar_connect get02-22OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-23Name fc0_22_total
|
||||
attr EVU_aWATTar_connect get02-23OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-24Name fc0_23_total
|
||||
attr EVU_aWATTar_connect get02-24OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-2Name fc0_01_total
|
||||
attr EVU_aWATTar_connect get02-2OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-3Name fc0_02_total
|
||||
attr EVU_aWATTar_connect get02-3OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-4Name fc0_03_total
|
||||
attr EVU_aWATTar_connect get02-4OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-5Name fc0_04_total
|
||||
attr EVU_aWATTar_connect get02-5OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-6Name fc0_05_total
|
||||
attr EVU_aWATTar_connect get02-6OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-7Name fc0_06_total
|
||||
attr EVU_aWATTar_connect get02-7OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-8Name fc0_07_total
|
||||
attr EVU_aWATTar_connect get02-8OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02-9Name fc0_08_total
|
||||
attr EVU_aWATTar_connect get02-9OExpr round(($val+$val*0.03+1.785)*1.19/100,4)
|
||||
attr EVU_aWATTar_connect get02FollowGet 01_priceInfo
|
||||
attr EVU_aWATTar_connect get02Name 02_priceDay
|
||||
attr EVU_aWATTar_connect get02RegOpt g
|
||||
attr EVU_aWATTar_connect get02Regex (?<=abs_[0-9]{2}_amount: )([0-9]+[0-9\.]+)
|
||||
attr EVU_aWATTar_connect get02URL https://api.awattar.de/v1/marketdata/current.yaml
|
||||
attr EVU_aWATTar_connect get03-1Name fc3_00_startsAt
|
||||
attr EVU_aWATTar_connect get03-1OExpr POSIX::strftime("%Y-%m-%d %H:%M:%S",localtime(substr($val,0,10)))
|
||||
attr EVU_aWATTar_connect get03-4Name fc3_00_total
|
||||
attr EVU_aWATTar_connect get03-4OExpr round($val/1000,4)
|
||||
attr EVU_aWATTar_connect get03Name 02_priceAll
|
||||
attr EVU_aWATTar_connect get03RegOpt g
|
||||
attr EVU_aWATTar_connect get03Regex "start_timestamp": (\d{10})|"marketprice": (\d*\.\d*)
|
||||
attr EVU_aWATTar_connect get03URL https://api.awattar.de/v1/marketdata?start=1701990000000&end=1702159200000
|
||||
attr EVU_aWATTar_connect group PV Steuerung EVU
|
||||
attr EVU_aWATTar_connect icon sani_pump
|
||||
attr EVU_aWATTar_connect room Strom->Boerse
|
||||
attr EVU_aWATTar_connect sortby 213
|
||||
attr EVU_aWATTar_connect userReadings fc_trigger_price:fc_avg.* {\
|
||||
## fc_trigger_price:[fc_avg|compensation_grid].* {\\
|
||||
my $fc_avg = ReadingsVal("$NAME","fc_avg",0);;\
|
||||
my $fc_min = ReadingsVal("$NAME","fc_min",0);;\
|
||||
\
|
||||
# Berechnung eines Default Schwellwertes als täglicher Niedrigpreis\
|
||||
my $price_level = round( ($fc_avg - $fc_min)/2 + $fc_min , 1);;\
|
||||
\
|
||||
# Abschätzung von Wirtschaftlichkeit beim Speicher Laden, falls Tibber zu teuer wird\
|
||||
if ( ReadingsVal("$NAME","compensation_grid",0) != 0 ) {\
|
||||
my $price_level_battery = round( ($fc_avg - ReadingsVal("$NAME","compensation_grid",0)) *0.85 , 1) ;;\
|
||||
if ( $price_level > $price_level_battery ) {\
|
||||
$price_level = $price_level_battery;;\
|
||||
}\
|
||||
}\
|
||||
$price_level;;\
|
||||
},\
|
||||
\
|
||||
fc0_trigger_start:fc_trigger_price.* {\
|
||||
my $fc_trigger_price = ReadingsVal("$NAME","fc_trigger_price",0) /100;;\
|
||||
\
|
||||
# Ermitteln des nächsten Trigger Fensters\
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;;\
|
||||
my $fc_total = 0;;\
|
||||
\
|
||||
for (my $loop_hour = $hour;; $loop_hour <= 23;; $loop_hour++) {\
|
||||
$fc_total = ReadingsVal("$NAME","fc0_".sprintf("%02d",$loop_hour)."_total",0);;\
|
||||
if ( $fc_total < $fc_trigger_price ) {\
|
||||
return(sprintf("%02d:00",$loop_hour)) ;;\
|
||||
}\
|
||||
} # end for loop_hour\
|
||||
\
|
||||
return("null");;\
|
||||
},\
|
||||
\
|
||||
fc0_trigger_stop:fc0_trigger_start.* {\
|
||||
my $fc = 0;;\
|
||||
my $loop_hour = 0;;\
|
||||
my $fc_trigger_price = ReadingsVal("$NAME","fc_trigger_price",0) /100;;\
|
||||
\
|
||||
# Ermitteln des nächsten Trigger Fensters\
|
||||
my $fc_trigger_start = ReadingsVal("$NAME","fc0_trigger_start","null");;\
|
||||
my $fc_trigger_stop = $fc_trigger_start;;\
|
||||
\
|
||||
if ( $fc_trigger_start ne "null" ) {\
|
||||
$fc_trigger_start =~ /(\d\d):/;; $fc_trigger_start = $1 ;;\
|
||||
my $fc_total = 0;;\
|
||||
\
|
||||
for ($loop_hour = $fc_trigger_start;; $loop_hour <= 23;; $loop_hour++) {\
|
||||
$fc_total = ReadingsVal("$NAME","fc".$fc."_".sprintf("%02d",$loop_hour)."_total",0);;\
|
||||
if ( $fc_total < $fc_trigger_price ) {\
|
||||
$fc_trigger_stop = sprintf("%02d:00",$loop_hour) ;;\
|
||||
} else {\
|
||||
return(sprintf("%02d:00",$loop_hour));;\
|
||||
}\
|
||||
\
|
||||
# wechsel zum nächsten Tag\
|
||||
if ( $loop_hour == 23 and $fc == 0 ) {\
|
||||
$fc = 1;;\
|
||||
$loop_hour = -1;;\
|
||||
}\
|
||||
\
|
||||
} # end for loop_hour\
|
||||
}\
|
||||
\
|
||||
return($fc_trigger_stop);;\
|
||||
},\
|
||||
\
|
||||
fc0_trigger:fc0_trigger_stop.* {\
|
||||
\
|
||||
# Setzen des Triggers für die aktuelle Stunde\
|
||||
if ( ReadingsVal("$NAME","current_price",100) < ReadingsVal("$NAME","fc_trigger_price",0) ) {\
|
||||
return("on")\
|
||||
} else {\
|
||||
return("off")\
|
||||
}\
|
||||
},\
|
||||
\
|
||||
fc_DbLog:fc0_00_total.* {\
|
||||
my ($timestamp,$date,$hour,$value,$loop_fc_next) = 5x0;;\
|
||||
\
|
||||
for (my $loop_fc = 0;; $loop_fc <= 1;; $loop_fc++) {\
|
||||
$loop_fc_next = $loop_fc +1;;\
|
||||
$date = ReadingsVal("$NAME","current_date","null");;\
|
||||
if ($date ne "null") {\
|
||||
$date =~ /([\d+-]+)/;; $date = $1 ;;\
|
||||
for (my $loop_hour = 0;; $loop_hour <= 23;; $loop_hour++) {\
|
||||
$hour = sprintf("%02d",$loop_hour);;\
|
||||
$timestamp = $date." ".$hour.":00:00";;\
|
||||
$value = ReadingsVal("$NAME","fc".$loop_fc."_".$hour."_total","null");;\
|
||||
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
|
||||
INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
|
||||
VALUES('".$timestamp."','$NAME','Tibber','fc".$loop_fc."_total','".$value."')\
|
||||
ON DUPLICATE KEY UPDATE\
|
||||
VALUE='".$value."';;") ;;\
|
||||
}\
|
||||
} else {\
|
||||
fhem("deletereading $NAME fc1_.*");;\
|
||||
}\
|
||||
}\
|
||||
ReadingsVal("$NAME","current_date","null");;\
|
||||
}
|
||||
attr EVU_aWATTar_connect verbose 0
|
@ -0,0 +1,5 @@
|
||||
defmod LogDBRep_EVU_aWATTar_connect_SQL DbRep LogDB
|
||||
attr LogDBRep_EVU_aWATTar_connect_SQL DbLogExclude .*
|
||||
attr LogDBRep_EVU_aWATTar_connect_SQL room System
|
||||
attr LogDBRep_EVU_aWATTar_connect_SQL sqlCmdHistoryLength 5
|
||||
attr LogDBRep_EVU_aWATTar_connect_SQL timeout 20
|
Loading…
x
Reference in New Issue
Block a user