Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Prediktiv reduksjon av strømbruk - Effektariff nivå


kjetilsn

Anbefalte innlegg

Takk for svar @stigvi. Beklager spørsmål som sikkert er rare, men jeg finner ikke disse sensorene noen plass etterpå. Jeg ser dere får dem opp i visning i lovelace kort, det får ikke jeg siden de ikke finnes. 

 

from simple_pid import PID

pid = PID(40.0, 0.4, 2500.0, setpoint=float(input_select.nettleie_pristrinn) - 0.2)
pid.set_auto_mode(False)
pid.sample_time = 1.9
pid.output_limits = (0, 100)
pid.proportional_on_measurement = False
pid.set_auto_mode(True, last_output=100.0)
last_c = 100.0
turned_off_all = False
turned_off_car_red = False
turned_off_car_blue = False

@state_trigger("sensor.aidon_active_power_import")
def new_state():
    global pid
    global last_c
    global turned_off_all
    global turned_off_car_red
    global turned_off_car_blue
    
    c = (0.9 * last_c) + (0.1 * pid(float(sensor.estimated_fast_hourly_consumption_filtered)))
    #p, i, d = pid.components
    #state.set("sensor.regulator_p", round(p,1))
    #state.set("sensor.regulator_i", round(i,1))
    #state.set("sensor.regulator_d", round(d,1))
    
    if round(last_c, 0) != round(c, 0):
        sensor.regulator_energy_usage = round(c, 0)
        
        v = max(5 * round(c, 0) - 400, 0.0)
        number.effekt_varmtvannsbereder.set_value(round(v,1))

    last_c = c

    if c < 10 and turned_off_car_red == False:
        easee.set_charger_dynamic_limit(charger_id = "EH32498", current = "0")
        turned_off_car_red = True

    if c > 12 and turned_off_car_red == True:
        easee.set_charger_dynamic_limit(charger_id = "EH32498", current = "20")
        turned_off_car_red = False

    if c < 70 and turned_off_all == False:
        switch.bryter_varmvannsbereder.turn_off()
        switch.turn_off(entity_id="switch.heavy_duty_switch")
        turned_off_all = True

    if c > 72 and turned_off_all == True:
        switch.bryter_varmvannsbereder.turn_on()
        switch.turn_on(entity_id="switch.heavy_duty_switch")
        turned_off_all = False

    if c < 2 and turned_off_all == False:
        climate.turn_off(entity_id="climate.thermostat_38",entity_id="climate.thermostat_41",entity_id="climate.thermostat_35,entity_id="climate.gang",entity_id="climate.stue_vindu",entity_id="climate.loftstue_2021",entity_id="climate.hovedsoverom")
        turned_off_all = True

    if c > 5 and turned_off_all == True:
        climate.turn_on(entity_id="climate.thermostat_38",entity_id="climate.thermostat_41",entity_id="climate.thermostat_35",entity_id="climate.gang",entity_id="climate.stue_vindu",entity_id="climate.loftstue_2021",entity_id="climate.hovedsoverom")
        turned_off_all = False
    
@state_trigger("input_select.nettleie_pristrinn")
def setpoint(value=None):
    pid.setpoint = float(value) - 0.2

 

Min kode ser nå slik ut, men jeg er faktisk usikker på om den virker. Mye mulig dette er for avansert for meg, men syns løsningen din var for god til å passere. Lastet ned PID i hacks også, men opplevde det enda vanskeligere å forstå. 

Jeg har ikke Tibber, men egen AMS leser.

 

Endret av selvesteha
Lenke til kommentar
Del på andre sider

Her er det en # på linjen og alt bak dette tegnet vil bli tolket som en kommentar. Du må ta vekk # i starten på hver av linjene

 

#p, i, d = pid.components
#state.set("sensor.regulator_p", round(p,1))
#state.set("sensor.regulator_i", round(i,1))
#state.set("sensor.regulator_d", round(d,1))
Lenke til kommentar
Del på andre sider

Det er noen logiske feil i det du har laget.

Når c < 70 vil to brytere slås av samtidig som turned_off_all settes til true. Hvis c fortsetter å synke i verdi til mindre enn 2 så skjer det ingenting med de climate du prøver å skru av fordi turned_off_all er true og ikke false.

Du må heller splitte det opp i en turned_off_vvb og turned_off_climate.

Men når det gjelder vvb så trenger du ikke noen turned_off_all eller turned_off_vvb. Du kan heller teste på om vvb allerede er avslått eller påslatt ved å sjekke state på switch.heavy_duty_switch

Dette, switch.turn_off(entity_id="switch.heavy_duty_switch"), kan du godt skrive som du har gjort. Men en litt mer lesbar variant er å skrive det som switch.heavy_duty_switch.turn_off(). Smak og behag, helt klart.......

  • Like 1
Lenke til kommentar
Del på andre sider

Takk @stigvi. Da tror jeg du har fått meg i riktig rettning. Jeg begynner å forstå noe av sammenhengen her, det kan jo også hjelpe :)

from simple_pid import PID

pid = PID(40.0, 0.4, 2500.0, setpoint=float(input_select.nettleie_pristrinn) - 0.2)
pid.set_auto_mode(False)
pid.sample_time = 1.9
pid.output_limits = (0, 100)
pid.proportional_on_measurement = False
pid.set_auto_mode(True, last_output=100.0)
last_c = 100.0
turned_off_all = False
turned_off_vvb = False
turned_off_climate = False
turned_off_car_red = False
sensor.regulator_energy_usage = 100.0

@state_trigger("sensor.aidon_active_power_import")
def new_state():
    global pid
    global last_c
    global turned_off_all
    global turned_off_vvb
    global turned_off_climate
    global turned_off_car_red
    
    c = (0.9 * last_c) + (0.1 * pid(float(sensor.estimated_hourly_consumption)))
    p, i, d = pid.components
    state.set("sensor.regulator_p", round(p,1))
    state.set("sensor.regulator_i", round(i,1))
    state.set("sensor.regulator_d", round(d,1))
    
    if round(last_c, 0) != round(c, 0):
        sensor.regulator_energy_usage = round(c, 0)
        
        v = max(5 * round(c, 0) - 400, 0.0)
        number.effekt_varmtvannsbereder.set_value(round(v,1))

    last_c = c

    if c < 10 and turned_off_car_red == False:
        easee.set_charger_dynamic_limit(charger_id = "EH32498", current = "0")
        turned_off_car_red = True

    if c > 12 and turned_off_car_red == True:
        easee.set_charger_dynamic_limit(charger_id = "EH32498", current = "20")
        turned_off_car_red = False

    if c < 70 and turned_off_vvb == False:
        switch.bryter_varmvannsbereder.turn_off()
        switch.turn_off(entity_id="switch.heavy_duty_switch")
        turned_off_vvb = True

    if c > 72 and turned_off_vvb == True:
        switch.bryter_varmvannsbereder.turn_on()
        switch.turn_on(entity_id="switch.heavy_duty_switch")
        turned_off_vvb = False

    if c < 2 and turned_off_climate == False:
        climate.turn_off(entity_id="climate.thermostat_38",entity_id="climate.thermostat_41",entity_id="climate.thermostat_35,entity_id="climate.gang",entity_id="climate.stue_vindu",entity_id="climate.loftstue_2021",entity_id="climate.hovedsoverom")
        turned_off_climate = True

    if c > 5 and turned_off_climate == True:
        climate.turn_on(entity_id="climate.thermostat_38",entity_id="climate.thermostat_41",entity_id="climate.thermostat_35",entity_id="climate.gang",entity_id="climate.stue_vindu",entity_id="climate.loftstue_2021",entity_id="climate.hovedsoverom")
        turned_off_climate = False
    
@state_trigger("input_select.nettleie_pristrinn")
def setpoint(value=None):
    pid.setpoint = float(value) - 0.2

 

Lenke til kommentar
Del på andre sider

Det enkleste er at HA oppretter sensoren. Alternativt kan du la pyscript opprette sensoren når pyscript kjører.

 

template:
    - sensor:
        - name: "Regulator energy usage"
          unit_of_measurement: "%"
          state_class: "measurement"
          device_class: "power_factor"
          state: "{{100}}"

 

Sensorene sensor.regulator_p, sensor.regulator_i, sensor.regulator_d trenger du bare hvis du skal tune pid regulatoren. Jeg ville bare ha brukt @stigvi sine verdier.

  • Like 1
Lenke til kommentar
Del på andre sider

haraldov skrev (4 minutter siden):

Det enkleste er at HA oppretter sensoren. Alternativt kan du la pyscript opprette sensoren når pyscript kjører.

 

template:
    - sensor:
        - name: "Regulator energy usage"
          unit_of_measurement: "%"
          state_class: "measurement"
          device_class: "power_factor"
          state: "{{100}}"

 

Sensorene sensor.regulator_p, sensor.regulator_i, sensor.regulator_d trenger du bare hvis du skal tune pid regulatoren. Jeg ville bare ha brukt @stigvi sine verdier.

Takk for svar @haraldov Det ser ut til å fungere

Lenke til kommentar
Del på andre sider

Jeg har forenklet scriptet til stigvi da jeg er nybegynner i pyscript og Python. Jeg bruker HA automasjoner til å stoppe strømlaster (VVB, varmekabler og elbillader) når sensor.regulator_energy_usage er mindre enn 100 %. Dette blir gjort i prioritert rekkefølge.

from simple_pid import PID

pid = PID(40.0, 0.4, 2500.0, setpoint=float(input_select.nettleie_pristrinn) - 0.2)
pid.set_auto_mode(False)
pid.sample_time = 1.9
pid.output_limits = (0, 100)
pid.proportional_on_measurement = False
pid.set_auto_mode(True, last_output=100.0)
last_c = 100.0
turned_off_all = False
turned_off_car = False

@state_trigger("sensor.accumulated_consumption_current_hour_toraldasen_32")
def new_state():
    global pid
    global last_c
    global turned_off_all
    global turned_off_car
    
    c = (0.9 * last_c) + (0.1 * pid(float(sensor.estimated_consumption_current_hour_toraldasen_32)))
    
    if round(last_c, 0) != round(c, 0):
        sensor.regulator_energy_usage = round(c, 0)

    last_c = c
    
@state_trigger("input_select.nettleie_pristrinn")
def setpoint(value=None):
    pid.setpoint = float(value) - 0.2

 

Bruker Tibber sine sensorer for beregnet og nåværende strømforbruk per time istedenfor ams2mqtt sensorene. 

 

  • Like 2
Lenke til kommentar
Del på andre sider

selvesteha skrev (1 time siden):

Ja, jeg har kopiert litt fra deg også. Jeg har ikke Tibber, så jeg sliter litt med å finne ut hvordan jeg kan opprette sensor for beregnet strømforbruk den neste timen.  Den jeg har ser ikke riktig ut.

Det skulle være grei skuring. Hva er det du har nå?

Lenke til kommentar
Del på andre sider

stigvi skrev (20 timer siden):

Det skulle være grei skuring. Hva er det du har nå?

Jeg har prøvd meg på en oppskrift jeg fant med intergration og utility meters. Men noe var galt da den viste alt for mye. Jeg slettet dem, men finner ikke tilbake til den oppskriften. Jeg har AHMSAN, og får ut sensor med forbruk. Men jeg mangler altså nå den beregnet strømforbruk den neste timen. 

Lenke til kommentar
Del på andre sider

Jeg bruker 

 

‘’

- platform: integration 

  source: sensor.kaifa_import # watt sensor

  name: hour_total_kwh

  method: left

  unit_prefix: k

  round: 3

  ‘’

 

Døgnmaksene jeg lagrer stemmer 100% med det som vises på bkk.no (nettleverandør) 

  • Like 1
Lenke til kommentar
Del på andre sider

Kim123 skrev (33 minutter siden):

Jeg bruker 

 

‘’

- platform: integration 

  source: sensor.kaifa_import # watt sensor

  name: hour_total_kwh

  method: left

  unit_prefix: k

  round: 3

  ‘’

 

Døgnmaksene jeg lagrer stemmer 100% med det som vises på bkk.no (nettleverandør) 

Takk, prøver den. Det vil jo være svært mye enklere enn jeg trodde.

Lenke til kommentar
Del på andre sider

stigvi skrev (9 timer siden):

Den har det, altså forbruk i inneværende time.

Ja, men jeg får ikke disse tallene til å stemme med det jeg ser dere bruker. Se mine sensorer fra AMSHAN måler

 

Sensorer

Active power export (Q2+Q3)
0 W
Akkumulert strømforbruk
110 409,86 kWh
Akkumulert strømproduksjon
0,0 kWh
Cumulative hourly reactive export energy (R-) (Q3+Q4)
5 795,27 kVArh
Cumulative hourly reactive import energy (R+) (Q1+Q2)
6 985,43 kVArh
Current phase L1
6,0 A
Current phase L2
3,6 A
Current phase L3
22,1 A
Phase L1 voltage
234,6 V
Phase L2 voltage
234,5 V
Phase L3 voltage
234,8 V
Reactive power export (Q3+Q4)
769 var
Reactive power import (Q1+Q2)
0 var
Strømforbruk
 
Lenke til kommentar
Del på andre sider

selvesteha skrev (2 minutter siden):

Ja, men jeg får ikke disse tallene til å stemme med det jeg ser dere bruker. Se mine sensorer fra AMSHAN måler

 

Sensorer

Active power export (Q2+Q3)
0 W
Akkumulert strømforbruk
110 409,86 kWh
Akkumulert strømproduksjon
0,0 kWh
Cumulative hourly reactive export energy (R-) (Q3+Q4)
5 795,27 kVArh
Cumulative hourly reactive import energy (R+) (Q1+Q2)
6 985,43 kVArh
Current phase L1
6,0 A
Current phase L2
3,6 A
Current phase L3
22,1 A
Phase L1 voltage
234,6 V
Phase L2 voltage
234,5 V
Phase L3 voltage
234,8 V
Reactive power export (Q3+Q4)
769 var
Reactive power import (Q1+Q2)
0 var
Strømforbruk
 



Har du tatt med en sensor med state_topic som dette?

state_topic: "power/realtime/import/hour"

Lenke til kommentar
Del på andre sider

Kim123 skrev (1 time siden):

Ser du mangler effekt sensoren. Hvilken måler har du? 

 

Anbefaler forøvrig MQTT Explorer, kan da logge deg på mqtt serveren og se på topicer

Jeg har brukt AMSHAN oppskriften med en Tibber Pulse måler. 

stigvi skrev (2 timer siden):



Har du tatt med en sensor med state_topic som dette?

state_topic: "power/realtime/import/hour"

Nei, jeg har ikke funnet noen slik sensor.

Lenke til kommentar
Del på andre sider

selvesteha skrev (41 minutter siden):

Jeg har brukt AMSHAN oppskriften med en Tibber Pulse måler. 

Nei, jeg har ikke funnet noen slik sensor.

Ok, min feil. Jeg trodde du brukte denne: gskjold/AmsToMqttBridge: ESP8266 and ESP32 compatible firmware to read, interpret and publish data to MQTT from AMS electrical meters, both DLMS and DSMR is supported (github.com)

Lenke til kommentar
Del på andre sider

selvesteha skrev (1 time siden):

Hei igjen. Jeg opplever at Regulator Energy Usage står på 100% hele tiden. Kan det stemme? Jeg ville tro den måtte justere seg noe, men kan det ha med at jeg til enhver tid holder meg godt innenfor kapasitetsleddet? 

Hvis du er godt innenfor så er den på 100%, ja

  • Like 1
Lenke til kommentar
Del på andre sider

stigvi skrev (På 21.12.2022 den 18.16):

Du må kikke på de sensorene som er "input". Endrer de seg som forventet?

Ja, både energi og estimert neste timen sensor fungerer nå. Men den står konsekvent på 100%, og jeg ser at den ikke reduserer noen av tingene for å holde kapasiteten under valgt input. Er det noe jeg kan ha gått glipp av rundt scriptet? Finnes det noen mulighet til å sjekke at scriptet fungerer som det skal?

Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.