Her er den. Merk at jeg har en VVB jeg kan sette effekten trinnløst på og det blir brukt i koden nedenfor. Så ta det som et eksempel. Du må gjøre endringer uansett.
Om pid regulatoren på hacs er brukbar, kan jeg ikke svare på. Men den er kanskje verd et forsøk?
Jeg har hatt min i drift i mai og maks forbruk da ble 4,823kWh som er bra. Som du ser så regulerer jeg etter 0,2kWh under 5kWh så 4,8kWh er målet. Den 15. mai ble all varme slått på i huset etter en ferie. Da ble det 10 timer sammenhengende regulering under 100% for å ligge under 4,8kWh. Litt svingninger ble det de første 40 minuttene, men deretter fungerte det veldig stabilt.
I hele mai har det vært 4 tilfeller der regulatoren har gått ned til ca 0% og slått av all varme. Det er 2 biler som skal lades så jeg innser at 5kWh/h blir for vanskelig for meg når behovet for oppvarming øker. I mai har det vært lett. Hvis en ser vekk i fra 15. mai så ville jeg vært under grensen uten å gjøre noe som helst. Alle disse "dippene" en ser i kurven nedenfor er i starten på en time der det estimerte forbruket er mest usikkert. Jeg kunne unngått nesten alle av de hvis en ikke regulerte ned de første 5 minuttene på hver time. Så kanskje det blir neste endring - noe som setter settpunkt til 10kWh i starten på hver time. Samtidig er det heller ingen heft med at varmekablene settes på lav temperatur i noen minutter.......
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.energy")
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_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 == False:
easee.set_charger_circuit_dynamic_limit(charger_id = "EH430587", currentP1 = "0")
turned_off_car = True
if c > 30 and turned_off_car == True:
easee.set_charger_circuit_dynamic_limit(charger_id = "EH430587", currentP1 = "16")
turned_off_car = False
if c < 2 and turned_off_all == False:
esphome.terrassevarmer_pause()
switch.heru_electric_heater_connected.turn_off()
persistent_notification.create(title = "Strøm", message = "Effektbegrensing slo av alt.")
turned_off_all = True
if c > 5 and turned_off_all == True:
esphome.terrassevarmer_resume()
switch.heru_electric_heater_connected.turn_on()
turned_off_all = False
@state_trigger("input_select.nettleie_pristrinn")
def setpoint(value=None):
pid.setpoint = float(value) - 0.2
@state_trigger("input_number.consumption_lasthour")
def hourly_usage(value=None):
if float(value) >= float(input_select.nettleie_pristrinn):
script.turn_on(entity_id = "script.send_melding", variables = {'message': 'Strømforbruk var større enn grense', 'title': 'Strøm', 'channel': 'Info'})