2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-25 09:55:38 +00:00

ch.eick: Update WP LAD9

git-svn-id: https://svn.fhem.de/fhem/trunk@28494 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
ch.eick 2024-02-08 13:52:40 +00:00
parent b6e3a6788a
commit 94960bbb46
5 changed files with 602 additions and 0 deletions

View File

@ -0,0 +1,24 @@
defmod Heizung LUXTRONIK2 192.168.178.10 300
attr Heizung DbLogExclude .*
attr Heizung DbLogInclude 2ndHeatSource1,SWTin_PV-Eigenverbrauch,ambientTemperature,averageAmbientTemperature,counterHeatQHeating,counterHeatQHotWater,counterHeatQPool,counterHeatQTotal,flowDispersion,flowTemperature,heatSourceIN,heatSourceMotor,heatingBufferTemperature,heatingSystemCircPump,heatingSystemCircPumpDeaerate,hotWaterCircPumpDeaerate,hotWaterCircPumpExtern,hotWaterTemperature,hotWaterTemperatureTarget,opStateHeatPump1,opStateHeatPump2,opStateHeatPump3,opStateHotWater,returnTemperature,returnTemperatureExtern,returnTemperatureHeating,returnTemperatureHyst,returnTemperatureSetBack,returnTemperatureTarget
attr Heizung alias Heizung
attr Heizung allowSetParameter 1
attr Heizung comment stateFormat alternative\
{sprintf("Outside:%.1f°C<br>Flow:%.1f°C<br>Return:%.1f°C(Trgt:%.1f°C)<br> Water:%.1f°C(Trgt:%.1f°C) %s",\
ReadingsVal($name,"ambientTemperature",0),\
ReadingsVal($name,"flowTemperature",0),\
ReadingsVal($name,"returnTemperature",0), ReadingsVal($name,"returnTemperatureTarget",0),\
ReadingsVal($name,"hotWaterTemperature",0), ReadingsVal($name,"hotWaterTemperatureTarget",0),\
ReadingsVal($name,"opStateHeatPump3","error") )}
attr Heizung event-on-change-reading SWTin_PV-Eigenverbrauch,ambientTemperature,averageAmbientTemperature,counterHeatQ.*,flowDispersion,flowTemperature,heatSourceIN,2ndHeatSource1,heatSourceMotor,heatingBufferTemperature,heatingSystemCircPump,heatingSystemCircPumpDeaerate,hotWaterCircPumpDeaerate,hotWaterCircPumpExtern,hotWaterTemperature.*,opStateHeatPump.*,opStateHotWater,returnTemperature,returnTemperatureExtern,returnTemperatureHeating,returnTemperatureHyst,returnTemperatureSetBack,returnTemperatureTarget,opMode.*,Verbrauch_Heizung,Verbrauch_Warmwasser
attr Heizung group Heizung
attr Heizung icon sani_earth_source_heat_pump
attr Heizung ignoreFirmwareCheck 1
attr Heizung room Heizung->System
attr Heizung sortby 01
attr Heizung userHeatpumpParameters 1136 Verbrauch_Heizung, 1137 Verbrauch_Warmwasser
attr Heizung userHeatpumpValues 36 SWTin_PV-Eigenverbrauch
attr Heizung userReadings flowDispersion:opStateHeatPump1 { ReadingsVal($name,"opStateHeatPump1","Error") eq "Wärmepumpe läuft" ? round((ReadingsVal($name,"flowTemperature",0) - ReadingsVal($name,"returnTemperature",0)),1) : round(ReadingsVal($name,"flowDispersion",0),1) },\
heatingBufferTemperature:opStateHotWater { ReadingsVal($name,"opStateHotWater","Error") ne "Aufheizen" ? ReadingsVal($name,"returnTemperature",0) : ReadingsVal($name,"heatingBufferTemperature",0) },\
Verbrauch_Gesamt:Verbrauch_.* { ReadingsVal($name,"Verbrauch_Heizung",0) + ReadingsVal($name,"Verbrauch_Warmwasser",0) }
attr Heizung verbose 0

View File

@ -0,0 +1,12 @@
defmod LWP_Counter HourCounter StromZaehler_Heizung:SMAEM1901401955_Saldo_Wirkleistung:\s-[0-9]{4}(\.[0-9]{1})*$ StromZaehler_Heizung:SMAEM1901401955_Saldo_Wirkleistung:\s-[0-9]{1,3}(\.[0-9]{1})*$
attr LWP_Counter DbLogExclude .*
attr LWP_Counter alias LWP_Counter
attr LWP_Counter comment Version 2021.01.09 11:16
attr LWP_Counter event-min-interval .*:600
attr LWP_Counter event-on-change-reading .*
attr LWP_Counter group PV Eigenverbrauch-Steuerung
attr LWP_Counter icon time_timer
attr LWP_Counter interval 5
attr LWP_Counter room Heizung->System,Strom->Photovoltaik
attr LWP_Counter sortby 413
attr LWP_Counter verbose 0

View File

@ -0,0 +1,521 @@
defmod LWP_PV_Perl DOIF ################################################################################################################\
## Eigenverbrauch einschalten: wenn PV Produktion über dem Mindestbedarf ist und die Laufzeit pro Tag noch nicht erreicht ist\
##\
01_1_Eigenverbrauch_automatisch_An\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
( [WR_1:SW_Total_PV_P_reserve] >= [$SELF:PowerLimitOn] ## Es besteht PV-Überschuss\
and [[$SELF:TimeStart]-[$SELF:TimeEnd]] ## Das Zeitfenster ist erreicht\
and get_Exec("LWP_Ein_timer") < 1 ## Der Wait Timer ist noch nicht gestartet\
and [$SELF:LWP_Status] eq "Aus" ## Die LWP ist aus\
and [LWP_Counter:pulseTimePerDay] < [$SELF:RunTimePerDay] ## Die maximale Laufzeit der LWP ist noch nicht erreicht\
and [Heizung:hotWaterTemperature] < 60 ## Das Maximum des PV-Modus ist noch nicht erreicht\
and [WR_ctl:Yield_fc0_day] < [WR_1_Speicher_1_ExternControl:SpeicherMinSOC_fc1_Limit] ## Im Herbst/Winter ist wenig zu erwarten\
)\
or [$SELF:ui_command_1] eq "01_1_Eigenverbrauch_automatisch_An" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 01_1 : LWP on waiting"};;\
\
set_Exec("LWP_Ein_timer",[$SELF:PowerLevelMinTime],'PV_Modus_Ein_LWP();;set_Reading("LWP_Status","An")');; ## Den PV-Modus verzögert einschalten\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
################################################################################################################\
## Signal für den PV-Modus der LWP einschalten.\
##\
01_2_Eigenverbrauch_manuell_An\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
[$SELF:ui_command_1] eq "01_2_Eigenverbrauch_manuell_An" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 01_2 : LWP on for manuel PV-Modus"};;\
\
PV_Modus_Ein_LWP();;\
set_Reading("LWP_Status","warten");;\
set_Exec("LWP_Man_timer",180,'set_Reading("LWP_Status","manuell")');; ## Den Status verzögert ändern\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
################################################################################################################\
## Signal für den PV-Modus der LWP abschalten.\
##\
01_3_Eigenverbrauch_manuell_Aus\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
[$SELF:ui_command_1] eq "01_3_Eigenverbrauch_manuell_Aus" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 01_3 : LWP off after manuel PV-Modus"};;\
\
del_Exec("LWP_Man_timer");;\
PV_Modus_Aus_LWP();;\
set_Reading("LWP_Status","Aus");;\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
################################################################################################################\
## Eigenverbrauch abschalten: wenn Mindestlaufzeit erreicht wurde und Maximallaufzeit pro Tag erreicht ist\
##\
02_1_Eigenverbrauch_Laufzeit_Aus\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
( [LWP_Counter:pulseTimePerDay] >= [$SELF:RunTimePerDay] ## Die Tages Laufzeit ist überschritten\
and [LWP_Counter:pulseTimeIncrement] >= [$SELF:RunTimeMin] ## Die Mindestlaufzeit ist überschritten\
and [$SELF:LWP_Status] eq "An" ## Die LWP Läuft\
)\
or [$SELF:ui_command_1] eq "02_1_Eigenverbrauch_Laufzeit_Aus" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 02_1 : LWP off Laufzeit"};;\
\
PV_Modus_Aus_LWP();;\
set_Reading("LWP_Status","Aus");;\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
################################################################################################################\
## Eigenverbrauch abschalten: wenn Mindestlaufzeit erreicht wurde und die PV Produktion unter dem Mindestbedarf ist\
##\
02_2_Eigenverbrauch_PV_Min_Aus\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
( [WR_1:SW_Total_PV_P_reserve] < 100 ## es soll noch eine Reserve bleiben\
and [LWP_Counter:pulseTimeIncrement] >= [$SELF:RunTimeMin] ## Die Mindestlaufzeit ist überschritten\
and [$SELF:LWP_Status] eq "An" ## Die LWP Läuft\
)\
or [$SELF:ui_command_1] eq "02_2_Eigenverbrauch_PV_Min_Aus" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 02_2 : LWP off PV-Min"};;\
\
PV_Modus_Aus_LWP();;\
set_Reading("LWP_Status","Aus");;\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
################################################################################################################\
## Stop, wenn es nur ein kurzer peak ist. Dieser Do Zweig setzt den wait timer vom Einschaltkommando cmd_4 wieder außer kraft,\
## wenn während der Wartezeit die PV Anlage zuwenig liefert.\
##\
03___Stop_Wait_Timer\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
( get_Exec("LWP_Ein_timer") > 0 ## läuft eine Wartezeit\
and get_Exec("LWP_Ein_timer") < 5 ## läuft die Wartezeit bald ab\
and\
(\
( [WR_1:SW_Total_PV_P_reserve] < [$SELF:PowerLimitOn] ## Ist die PV-Leistung zu niedrig?\
and [$SELF:LWP_Status] eq "Aus" ## und gibt es keine manuelle Einschaltung\
)\
or ## eventuell läuft die LWP bereits an, dann muss auch der timer gestoppt werden\
( [StromZaehler_Heizung:SMAEM1901401955_Bezug_Wirkleistung] > 300\
and [Heizung:opStateHeatPump1] eq "Wärmepumpe kommt"\
and [Heizung:opStateHeatPump3] eq "Pumpenvorlauf"\
)\
or ## eventuell läuft die LWP bereits an, dann muss auch der timer gestoppt werden\
( [StromZaehler_Heizung:SMAEM1901401955_Bezug_Wirkleistung] > 300\
and [Heizung:opStateHeatPump1] eq "Wärmepumpe läuft"\
)\
)\
)\
or [$SELF:ui_command_1] eq "03___Stop_Wait_Timer" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 03__ : Stop wait timer LWP ".get_Exec("LWP_Ein_timer")};;\
del_Exec("LWP_Ein_timer");; ## Die LWP wird nicht mehr eingeschaltet\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
################################################################################################################\
## LWP Zwangseinschalten: Sollte das Brauchwasser noch nicht aufgeheizt sein, wird um die Hysterese erhöht.\
## Dies kann passieren, wenn am Tag vorher der PV-Modus lief und dann das Wasser noch knapp über dem Mindestwert ist.\
##\
04_1_LWP_Nachheizen_WW\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
( [WR_ctl:Yield_fc0_day] < [WR_1_Speicher_1_ExternControl:SpeicherMaxSOC_fc1_Limit] ## Im Herbst/Winter ist wenig zu erwarten\
and [[$SELF:TimeEnd]] ## Am Ende der möglichen PV Steuerung\
and [Heizung:hotWaterTemperature] <= 48 ## wenn das Wasser noch nicht im Sollbereich ist\
and\
( [LWP_Counter:pulseTimePerDay] < [$SELF:RunTimePerDay] ## Die maximale Laufzeit der LWP/Tag ist noch nicht erreicht\
or [LWP_Counter:countsPerDay] eq 0) ## oder die LWP ist noch gar nicht gelaufen\
)\
or [$SELF:ui_command_1] eq "04_1_LWP_Nachheizen_WW" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 04_1 : LWP on for water heating"};;\
## Es wird die Soll Temperatur um die Hysterese angehoben \
::CommandSet(undef, "Heizung hotWaterTemperatureTarget ".(ReadingsVal("Heizung","hotWaterTemperature",48)+5));;\
## Das zurücksetzen auf den Standard von 50° erfolgt generell beim Abschalten\
set_Reading("LWP_Status","Nachheizen");;\
\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 04_1 : LWP hotWaterTemperatureTarget ".ReadingsVal("Heizung","hotWaterTemperatureTarget",0)};;\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
################################################################################################################\
## Hohe Priorität im Winter für die LWP\
## Einschalten, wenn der Pool läuft, der Speicher geladen ist und noch Überschuss da ist.\
##\
04_2_LWP_Prioritaet_An\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
( [WR_ctl:Yield_fc0_day] < [WR_1_Speicher_1_ExternControl:SpeicherMaxSOC_fc1_Limit] ## Im Herbst/Winter ist wenig zu erwarten\
and [WR_1:SW_Total_PV_P_reserve] >= 2000 ## es besteht jedoch noch eine Reserve und der\
and [shelly02:power_0] > 800 ## Pool wird gerade aufgeheizt, was im Winter auch in der Nacht passiert\
and [WR_1:Act_state_of_charge] > 60 ## Der Speicher sollte schon 60 % gefüllt sein\
and [Heizung:hotWaterTemperature] < 60 ## und die WW Temperatur noch unter 60°\
and [$SELF:LWP_Priority] eq "frei" ## Aber nur einmal am Tag\
)\
or [$SELF:ui_command_1] eq "04_2_LWP_Prioritaet_An" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 04_2 : LWP Priorität"};;\
\
PV_Modus_Ein_LWP();;\
set_Reading("LWP_Status","An");;\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
################################################################################################################\
## LWP Ende\
##\
05___LWP_Ende\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
( [StromZaehler_Heizung:SMAEM1901401955_Bezug_Wirkleistung] < 300\
and\
( [$SELF:LWP_Status] eq "An"\
or [$SELF:LWP_Status] eq "manuell"\
or [$SELF:LWP_Status] eq "Nachheizen"\
)\
and [LWP_Counter:pulseTimePerDay] >= [$SELF:RunTimeMin]\
and ([Heizung:opStateHeatPump1] ne "Wärmepumpe läuft" or [Heizung:opStateHeatPump3] eq "Luftabtauen" )\
)\
or [$SELF:ui_command_1] eq "05___LWP_Ende" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 05__ : LWP run finished"};;\
\
PV_Modus_Aus_LWP();;\
set_Reading("LWP_Status","Aus");;\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
################################################################################################################\
## Priorität für LWP wieder frei geben, damit einmal am Tag der PV-Modus verwendet werden kann\
##\
06___LWP_Prioritaet_Reset\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
[23:55]\
or [$SELF:ui_command_1] eq "06___LWP_Prioritaet_Reset" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 06__ : LWP Priorität frei"};;\
set_Reading("LWP_Priority","frei");; ## Der PV-Modus darf wieder verwendet weden\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
################################################################################################################\
## In der Überganszeit wird die Heizung kurz vor der PV-Zeit wieder ein geschaltet\
## Während des Winters kann man die Heizung bis in die Morgenstunden ganz abschalten (Accu sparen)\
##\
07_1_Heizung_An\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
[[$SELF:TimeStartHeizung]] ## Einschalten der Heizung, damit aus dem Puffer nachgeheizt wird 02:03\
or [$SELF:ui_command_1] eq "07_1_Heizung_An" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 07_1 : LWP Heizung Automatik"};;\
::CommandSet(undef, "Heizung opModeHeating Auto");; ## Die Heizungssteuerung erfolgt wieder Automatisch\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
################################################################################################################\
## Während des Winters kann man die Heizung bis in die Morgenstunden ganz abschalten (Accu sparen)\
##\
07_2_Heizung_Aus\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
[[$SELF:TimeEndHeizung]] ## Abschalten der Heizung, damit der Puffer für morgens Heizreserve hat\
or [$SELF:ui_command_1] eq "07_2_Heizung_Aus" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 07_2 : LWP Heizung aus"};;\
::CommandSet(undef, "Heizung opModeHeating Off");; ## Die Heizung wird komplett abgeschaltet\
\
if ( [WR_ctl:Yield_fc1_day] < [WR_1_Speicher_1_ExternControl:SpeicherMinSOC_fc1_Limit] ## Auch morgen ist das Wetter schlecht\
and [Heizung:averageAmbientTemperature] <= 5.6 ) { ## Die Heizgrenze ist schon ziemlich tief\
set_Reading("TimeStartHeizung",[$SELF:TimeStartHeizungWinter]);; ## Im Winter bis in die Morgenstunden den Accu sparen\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 07_2 : Parameter: ".[WR_ctl:Yield_fc1_day]." < ".[WR_1_Speicher_1_ExternControl:SpeicherMinSOC_fc1_Limit]." and ".[Heizung:averageAmbientTemperature]." <= 5.6"};;\
} else {\
set_Reading("TimeStartHeizung",[$SELF:TimeStartHeizungUebergang]);; ## Bei schönerem Wetter erst später Heizen\
}\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 07_2 : TimeStartHeizung switched to ".[$SELF:TimeStartHeizung]};;\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
\
################################################################################################################\
## Heizung im Wohnzimmer auf 19°\
##\
07_3_Heizung_WZ_19_Grad\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
[$SELF:ui_command_1] eq "07_3_Heizung_WZ_19_Grad" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 07_3 : Heizung WZ 19 Grad"};;\
::CommandSet(undef, "Thermostat_WO desired-temp 19");; ## Die Warmwasserbereitung wird ausgeschaltet\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
\
################################################################################################################\
## Heizung im Wohnzimmer auf 22°\
##\
07_4_Heizung_WZ_22_Grad\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
[$SELF:ui_command_1] eq "07_4_Heizung_WZ_22_Grad" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 07_4 : Heizung WZ 22 Grad"};;\
::CommandSet(undef, "Thermostat_WO desired-temp 22");; ## Die Warmwasserbereitung wird ausgeschaltet\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
\
################################################################################################################\
## Warmwasser Bereitung aus\
##\
07_5_Warmwasser_aus\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
[$SELF:ui_command_1] eq "07_5_Warmwasser_aus" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 07_5 : LWP Warmwasser aus"};;\
::CommandSet(undef, "Heizung opModeHotWater Off");; ## Die Warmwasserbereitung wird ausgeschaltet\
::CommandSet(undef, "n_Zirkulation inactive");; ## Zirkulation ebenfalls abschalten\
::CommandSet(undef, "Heizung statusRequest");; ## Einen aktuellen Status abholen\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
\
################################################################################################################\
## Warmwasser Bereitung auf Automatik\
##\
07_6_Warmwasser_an\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
[$SELF:ui_command_1] eq "07_6_Warmwasser_an" ## Hier wird das uiTable select ausgewertet\
) {\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 07_6 : LWP Warmwasser Automatik"};;\
::CommandSet(undef, "Heizung opModeHotWater Auto");; ## Die Warmwassersteuerung erfolgt wieder automatisch\
::CommandSet(undef, "n_Zirkulation active");; ## Zirkulation wieder einschalten\
::CommandSet(undef, "Heizung statusRequest");; ## Einen aktuellen Status abholen\
\
set_Reading("ui_command_1","---");; ## 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 [$SELF:LWP_Stromboerse] 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("LWP_TriggerLaden","An");;\
\
if ([?Heizung:opModeHeating] eq "Off") { ## Ist die Heizung abgeschaltet ?\
set_Reading("LWP_Stromborse_Heizung_before","Off");; ## Den vorherigen Zustand merken\
::CommandSet(undef, "Heizung opModeHeating Auto");; ## Die Heizungssteuerung erfolgt wieder Automatisch\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 12_1 : LWP Heizung Automatik"};;\
}\
\
PV_Modus_Ein_LWP();;\
set_Reading("LWP_Status","warten");;\
set_Exec("LWP_Man_timer",180,'set_Reading("LWP_Status","Stromboerse")');; ## Den Status verzögert ändern\
\
if (AttrVal("$SELF","verbose",0) >= 3)\
{Log 3, "$SELF 12_Stromboerse : PV-Modus Start"};;\
\
} else {\
set_Reading("LWP_TriggerLaden","Aus");;\
\
PV_Modus_Aus_LWP();;\
set_Reading("LWP_Status","Aus");;\
\
if (AttrVal("$SELF","verbose",0) >= 3)\
{Log 3, "$SELF 12_Stromboerse : PV-Modus Stop"};;\
\
if ([$SELF:LWP_Stromborse_Heizung_before] eq "Off") { ## War die Heizung vorher abgeschaltet ?\
set_Reading("LWP_Stromborse_Heizung_before","Auto");; ## Den jetzigen Zustand merken\
::CommandSet(undef, "Heizung opModeHeating Off");; ## Die Heizungssteuerung wieder abschalten\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 12_1 : LWP Heizung Off, wie zuvor"};;\
}\
\
}\
\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF 12_Stromboerse : ".[EVU_Tibber_connect:fc0_trigger]." by ".[$SELF:LWP_Stromboerse]};;\
\
set_Reading("ui_command_4","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
\
################################################################################################################\
## Definition von Sub Routinen\
subs {\
sub PV_Modus_Ein_LWP() { ## PV-Modus Einschalten\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF sub : LWP on"};;\
fhem("".ReadingsVal("$SELF","SetCmdOn",0));;\
::CommandSet(undef, "Heizung hotWaterTemperatureTarget 60.0");;\
set_Reading("LWP_Priority","verwendet");;\
}\
\
sub PV_Modus_Aus_LWP() { ## PV-Modus Ausschalten\
if (AttrVal("$SELF","verbose",0) >=3)\
{Log 3, "$SELF sub : LWP off"};;\
fhem("".ReadingsVal("$SELF","SetCmdOff",0));;\
::CommandSet(undef, "Heizung hotWaterTemperatureTarget 50.0");;\
}\
}
attr LWP_PV_Perl DbLogExclude .*
attr LWP_PV_Perl DbLogInclude state,cmd.*,Device,LWP_Status,wait_timer
attr LWP_PV_Perl alias LWP_PV_Perl
attr LWP_PV_Perl comment Version 2023.01.18 09:00
attr LWP_PV_Perl disable 0
attr LWP_PV_Perl group PV Eigenverbrauch-Steuerung
attr LWP_PV_Perl icon sani_earth_source_heat_pump
attr LWP_PV_Perl room Heizung->System,Strom->Photovoltaik
attr LWP_PV_Perl sortby 411
attr LWP_PV_Perl uiTable {\
package ui_Table;;\
$TABLE = "style='width:100%;;'";;\
\
$TD{0..10}{0} = "align='center' style='font-size:16px;;border-right-style:solid;;border-color:darkgreen;;border-right-width:2px;;width:26%'";;\
\
$TD{0..10}{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..10}{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..10}{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_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;;\
}\
\
}\
\
"$SELF"|\
::ReadingsTimestamp("Heizung","counterHeatQTotal","")."<dd>Status / LWP Status / Brauchwasser</dd>" |\
widget([$SELF:ui_command_1],"uzsuDropDown,---,01_1_Eigenverbrauch_automatisch_An,01_2_Eigenverbrauch_manuell_An,01_3_Eigenverbrauch_manuell_Aus,02_1_Eigenverbrauch_abschalten_Laufzeit,02_2_Eigenverbrauch_abschalten_PV_Min,03___Stop_Wait_Timer,04_1_LWP_Nachheizen_WW,04_2_LWP_Prioritaet_An,05___LWP_Ende,06___LWP_Prioritaet_Reset,07_1_Heizung_An,07_2_Heizung_Aus,07_3_Heizung_WZ_19_Grad,07_4_Heizung_WZ_22_Grad,07_5_Warmwasser_aus,07_6_Warmwasser_an") |\
[Heizung:opStateHeatPump1]." ".[Heizung:opStateHeatPump2]|\
[Heizung:opStateHeatPump3]|\
FUNC_Status([Heizung:hotWaterTemperature],47,"orange",[Heizung:hotWaterTemperature],"green",[Heizung:hotWaterTemperature],53,"red",[Heizung:hotWaterTemperature])." °C"\
\
|\
"Konfiguration<dd>PowerLevelMinTime, | PowerLimit On/Off | Time Start/End</dd><dd>RunTime Min/PerDay</dd>"|\
""|\
widget([$SELF:PowerLevelMinTime],"selectnumbers,60,60,900,0,lin")."<br>".widget([$SELF:RunTimeMin],"selectnumbers,300,300,7200,0,lin").widget([$SELF:RunTimePerDay],"selectnumbers,900,300,28800,0,lin")|\
widget([$SELF:PowerLimitOn],"selectnumbers,1000,250,4000,0,lin").widget([$SELF:PowerLimitOff],"selectnumbers,1000,250,4000,0,lin")|\
widget([$SELF:TimeStart],"time").widget([$SELF:TimeEnd],"time")\
\
|\
"<dd>PV-Modus / Heiz-Modus / Winter, Übergangszeit Heiz Start/Ende</dd>"|\
"PV-Modus:<br>".[$SELF:LWP_Priority]." / ".(([$SELF:LWP_Status] ne "Aus")?'<span style="color:green">'.[$SELF:LWP_Status].'</span>' : '<span style="color:black">'.[$SELF:LWP_Status].'</span>')|\
"Heizung: ".[Heizung:opModeHeating]."<br>Warmwasser: ".[Heizung:opModeHotWater]|\
widget([$SELF:TimeStartHeizungWinter],"time").widget([$SELF:TimeStartHeizungUebergang],"time")|\
[$SELF:TimeStartHeizung].widget([$SELF:TimeEndHeizung],"time")\
\
|\
"Strombörse<dd>Auswahl / Ladefenster / Trigger Status </dd>" |\
widget([$SELF:LWP_Stromboerse],"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]\
\
|"Statistiken"|"Zähler"|""|"Information"|"Wert"\
|""|"EVU"|""|"Gesamt"|sprintf("%06d kWh",[EVU_StromZaehler:Strom_Status-02])\
|""|"Heizung"|""|"LWP/KWL"|sprintf("%06d kWh",[StromZaehler_Heizung:SMAEM1901401955_Bezug_Wirkleistung_Zaehler])\
|""|"LWP"|""|"Heizung"|sprintf("%06d kWh",[Heizung:counterHeatQHeating])\
|""|"LWP"|""|"Warmwasser"|sprintf("%06d kWh",[Heizung:counterHeatQHotWater])\
|""|"LWP"|""|"Photovoltaik"|sprintf("%06d kWh",[Heizung:counterHeatQPool])\
|""|"LWP"|""|"Gesamt"|sprintf("%06d kWh",[Heizung:counterHeatQTotal])\
attr LWP_PV_Perl verbose 3
setstate LWP_PV_Perl 2024-02-07 23:55:00 LWP_Priority frei
setstate LWP_PV_Perl 2024-02-05 11:09:07 LWP_Status Aus
setstate LWP_PV_Perl 2023-12-11 14:54:21 LWP_Stromboerse Aus
setstate LWP_PV_Perl 2023-12-11 14:54:19 LWP_TriggerLaden Aus
setstate LWP_PV_Perl 2022-05-13 12:21:48 PowerLevelMinTime 600
setstate LWP_PV_Perl 2022-05-10 15:51:44 PowerLimitOff 3000
setstate LWP_PV_Perl 2022-05-10 15:50:44 PowerLimitOn 2250
setstate LWP_PV_Perl 2022-10-25 19:00:12 RunTimeMin 2400
setstate LWP_PV_Perl 2022-05-10 15:55:35 RunTimePerDay 28800
setstate LWP_PV_Perl 2022-05-10 16:23:06 SetCmdOff set shelly01 off 0
setstate LWP_PV_Perl 2022-05-10 16:23:24 SetCmdOn set shelly01 on 0
setstate LWP_PV_Perl 2022-05-10 15:50:37 TimeEnd 15:05
setstate LWP_PV_Perl 2023-02-07 13:27:25 TimeEndHeizung 18:35
setstate LWP_PV_Perl 2022-05-10 15:50:19 TimeStart 11:30
setstate LWP_PV_Perl 2024-02-07 18:35:00 TimeStartHeizung 09:50
setstate LWP_PV_Perl 2022-05-13 16:37:59 TimeStartHeizungUebergang 09:50
setstate LWP_PV_Perl 2022-12-17 16:11:07 TimeStartHeizungWinter 02:05
setstate LWP_PV_Perl 2024-02-08 09:50:00 ui_command_1 ---
setstate LWP_PV_Perl 2023-12-11 14:54:19 ui_command_4 ---

View File

@ -0,0 +1,45 @@
defmod shelly01 Shelly 192.168.178.54
attr shelly01 DbLogExclude .*
attr shelly01 DbLogInclude relay.*,power.*,energy.*
attr shelly01 alias LWP
attr shelly01 comment Version 2020.10.19 18:28
attr shelly01 event-on-change-reading relay.*,power.*,energy.*,state,network
attr shelly01 group PV Eigenverbrauch-Steuerung
attr shelly01 icon taster_ch_1
attr shelly01 mode relay
attr shelly01 model shelly1pm
attr shelly01 room Shelly,Heizung->System,Strom->Photovoltaik
attr shelly01 sortby 412
attr shelly01 stateFormat {\
my $link = ReadingsVal($name,"WebLink","none");;\
\
my $e0 = sprintf("%08.2f KWh",ReadingsVal("StromZaehler_Heizung","SMAEM1901401955_Bezug_Wirkleistung_Zaehler",0));;\
my $r0 = (ReadingsVal($name,"relay","") eq "off") ? "<span style='color:red'>off</span>":"<span style='color:green'>on</span>";;\
my $p0 = sprintf("%06.1f Watt",ReadingsVal("StromZaehler_Heizung","SMAEM1901401955_Bezug_Wirkleistung",0));;\
\
"<html><table border=2 bordercolor='darkgreen' cellspacing=0 style='width: 100%'>\
<colgroup>\
<col span='1' style='width: 30%;;'>\
<col span='1' style='width: 30%;;'>\
<col span='1' style='width: 20%;;'>\
</colgroup>\
<tr>\
<td style='text-align:left'>\
</td>\
<td style='text-align:left'>\
WebLink: $link\
</td>\
<td style='text-align:right'>\
Wärmepumpe Gesamt 0: $e0<br>\
<td style='text-align:right'>\
Relais 0: $r0 $p0<br>\
</td>\
</tr>\
</table>\
</html>"\
}
attr shelly01 timeout 8
attr shelly01 userReadings WebLink:network.* { my $ip=ReadingsVal($name,"network","na");; $ip =~ s/connected to //gs;; $ip =~ s/<[^>]*>//gs;; return("<a href='http://".$ip."/'>".$ip."</a>") },\
\
energy_Total:energy.* monotonic { ReadingsVal($name,"energy",0) }
attr shelly01 webCmd |