Når denne endres (til 30, som du viste til) så må pid regulatoren få vite om det. Det gjør en med å lage en trigger på input_number.max_energy_usage og sette ny setpoint. Jeg har lagt med mitt skript så ser du hvordan jeg har gjort det. Der er det også tatt med andre endringer som at jeg setter utgangen til 100% ved oppstart av HA og jeg har også laget et filter på pid-utgangen for å dempe ned plutselige endringer.
Men etter at jeg laget dette er det kommet en pid-regulator i HACS. Kanskje den er lettere for deg å bruke? Da slipper du å styre med et skript.
soloam/ha-pid-controller: PID Controller to Home Assistant (github.com)
Jeg vet ikke om parametrene for p, i og d kan brukes slik som de er i skriptet, men sannsynligvis kan de det.
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.energy")
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_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 = "EH430587", current = "0")
turned_off_car_red = True
if c > 12 and turned_off_car_red == True:
easee.set_charger_dynamic_limit(charger_id = "EH430587", current = "16")
turned_off_car_red = False
if c < 70 and turned_off_car_blue == False:
easee.set_charger_dynamic_limit(charger_id = "EH3JE5CS", current = "0")
turned_off_car_blue = True
if c > 72 and turned_off_car_blue == True:
easee.set_charger_dynamic_limit(charger_id = "EH3JE5CS", current = "16")
turned_off_car_blue = 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'})