{% extends "layout.html" %} {% set active_page = "pid" %} {% set help_page = ["pids", _('PID Controllers')] %} {% block title %} - {{_('PID')}}{% endblock %} {% block head %} {% endblock %} {% block body %}
{% include 'flash_messages.html' %}

{{_('PID Controllers')}}

{{_('PID controllers couple a sensor with a device connected to a relay to regulate an environmental condition. For example, this could be a heater and a temperature sensor, allowing the regulation of temperature.')}}

{{form_add_pid.hidden_tag()}}
{{form_add_pid.numberPIDs(class_='form-control', value=1, type="number")}}
{{form_add_pid.pidAddSubmit(class_='form-control btn btn-default')}}
{%- if displayOrder -%} {%- for order in displayOrder -%} {%- for each_pid in pids if each_pid.id == order -%}
{{form_mod_pid.csrf_token}} {{form_mod_pid.pid_id(value=each_pid.id)}}
{{form_mod_pid.name(class_='form-control', value=each_pid.name, **{'title':_('Name for this PID controller.')})}}
{%- if each_pid.is_activated %}
{{form_mod_pid.deactivate(class_='form-control btn btn-default')}}
{%- if each_pid.is_paused or each_pid.is_held %}
{{form_mod_pid.resume(class_='form-control btn btn-default')}}
{%- else %}
{{form_mod_pid.pause(class_='form-control btn btn-default')}}
{{form_mod_pid.hold(class_='form-control btn btn-default')}}
{%- endif -%} {%- else %}
{{form_mod_pid.activate(class_='form-control btn btn-default')}}
{%- endif -%}
{{form_mod_pid.save(class_='form-control btn btn-default')}}
{{form_mod_pid.delete(class_='form-control btn btn-default',**{'onclick':'return confirm("Are you sure you want to delete this PID controller?")'})}}
{{form_mod_pid.reorder_up(class_='form-control btn btn-default')}}
{{form_mod_pid.reorder_down(class_='form-control btn btn-default')}}
{{form_mod_pid.sensor_id.label(class_='control-label')}}
{{form_mod_pid.measurement.label(class_='control-label')}}
{{form_mod_pid.direction.label(class_='control-label')}}
{{form_mod_pid.period.label(class_='control-label')}}
{{form_mod_pid.period(class_='form-control', value=each_pid.period, **{'title':_('The duration between calculating a new PID output to power the raise and lower relays.')})}}
{{form_mod_pid.max_measure_age.label(class_='control-label')}}
{{form_mod_pid.max_measure_age(class_='form-control', value=each_pid.max_measure_age, **{'title':_('Maximum allowable sensor measurement age (to allow the PID controller to manipulate relays, the sensor measurement must have occurred in the past x seconds)')})}}
{{form_mod_pid.setpoint.label(class_='control-label')}}
{{form_mod_pid.setpoint(class_='form-control', value=each_pid.setpoint, **{'title':_('This is the desired state of a perticular environmental condition. For instance, this could be the desired temperature in Celsius.')})}}
{{form_mod_pid.k_p.label(class_='control-label')}}
{{form_mod_pid.k_p(class_='form-control', value=each_pid.p, **{'title':_('Proportional gain')})}}
{{form_mod_pid.k_i.label(class_='control-label')}}
{{form_mod_pid.k_i(class_='form-control', value=each_pid.i, **{'title':_('Integral gain')})}}
{{form_mod_pid.k_d.label(class_='control-label')}}
{{form_mod_pid.k_d(class_='form-control', value=each_pid.d, **{'title':_('Derivative gain')})}}
{{form_mod_pid.integrator_max.label(class_='control-label')}}
{{form_mod_pid.integrator_max(class_='form-control', value=each_pid.integrator_min, **{'title':_('Limit the integrator minimum, for calculating Ki_total: (Ki_total = Ki * integrator; and PID output = Kp_total + Ki_total + Kd_total)')})}}
{{form_mod_pid.integrator_min.label(class_='control-label')}}
{{form_mod_pid.integrator_min(class_='form-control', value=each_pid.integrator_max, **{'title':_('Limit the integrator maximum, for calculating Ki_total: (Ki_total = Ki * integrator; and PID output = Kp_total + Ki_total + Kd_total)')})}}
{{form_mod_pid.raise_relay_id.label(class_='control-label')}}
{{form_mod_pid.raise_min_duration.label(class_='control-label')}}
{{form_mod_pid.raise_min_duration(class_='form-control', value=each_pid.raise_min_duration, **{'title':_('The minimum duration (in seconds) required for the Raise Relay to activate. If an On duration is below this value, the Raise Relay will not turn on.')})}}
{{form_mod_pid.raise_max_duration.label(class_='control-label')}}
{{form_mod_pid.raise_max_duration(class_='form-control', value=each_pid.raise_max_duration, **{'title':_('The maximum duration (in seconds) allowed for the Raise Relay to be on for, per period. If an On duration is above this value, the Raise Relay will turn on for this set duration.')})}}
{{form_mod_pid.raise_min_off_duration.label(class_='control-label')}}
{{form_mod_pid.raise_min_off_duration(class_='form-control', value=each_pid.raise_min_off_duration, **{'title':_('This relay will remain off for at least this duration fo time.')})}}
{{form_mod_pid.lower_relay_id.label(class_='control-label')}}
{{form_mod_pid.lower_min_duration.label(class_='control-label')}}
{{form_mod_pid.lower_min_duration(class_='form-control', value=each_pid.lower_min_duration, **{'title':_('The minimum duration (in seconds) required for the Lower Relay to activate. If an On duration is below this value, the Lower Relay will not turn on.')})}}
{{form_mod_pid.lower_max_duration.label(class_='control-label')}}
{{form_mod_pid.lower_max_duration(class_='form-control', value=each_pid.lower_max_duration, **{'title':_('The maximum duration (in seconds) allowed for the Lower Relay to be on for, per period. If an ON duration is above this value, the Lower Relay will turn on for this set duration.')})}}
{{form_mod_pid.lower_min_off_duration.label(class_='control-label')}}
{{form_mod_pid.lower_min_off_duration(class_='form-control', value=each_pid.lower_min_off_duration, **{'title':_('This relay will remain off for at least this duration fo time.')})}}
{{form_mod_pid.method_id.label(class_='control-label')}}
{%- endfor -%}
{%- endfor -%} {%- endif -%}
{% endblock %}