[ { "id": "'1745383146738'", "automation": "- id: '1745383146738'\n alias: Demand Following\n description: ''\n triggers:\n - trigger: state\n entity_id:\n - sensor.power_demand_mw\n - trigger: state\n entity_id:\n - sensor.total_power_output_mw\n conditions:\n - condition: numeric_state\n entity_id: sensor.power_demand_mw\n above: 0\n - condition: numeric_state\n entity_id: sensor.total_power_output_mw\n above: 0\n actions:\n - variables:\n loop: '{{ states(''input_select.loop'')|string }}'\n flow_ratio: '{{ (states(''sensor.COOLANT_SEC_CIRCULATION_PUMP''+loop+''SPEED'')\n | int / 100 * states(''sensor.coolant_sec_circulation_pump''+loop+''capacity'')\n | int) / (states(''sensor.COOLANT_CORE_CIRCULATION_PUMP''+loop+''SPEED'')\n | int / 100 * states(''sensor.coolant_core_circulation_pump''+loop+''capacity'')\n | int) }}'\n - if:\n - condition: or\n conditions:\n - condition: numeric_state\n entity_id: sensor.total_power_output_mw\n below: sensor.demand_lowerlimit\n - condition: numeric_state\n entity_id: sensor.total_power_output_mw\n above: sensor.demand_upperlimit\n alias: Power Output not within Demand Limits\n then:\n - alias: Adjust Primary-only or Steam Valve and all pumps\n if:\n - condition: numeric_state\n entity_id: sensor.demand_delta\n above: -6\n below: 6\n - alias: Sec/Pri Flow Ratio is within bounds\n condition: template\n value_template: \"{{ (states('sensor.demand_delta') | int > 0 and flow_ratio\\\n \\ >= 3.0) or \\n(states('sensor.demand_delta') | int < 0 and flow_ratio <=\\\n \\ 4.0) }}\"\n enabled: true\n then:\n - action: rest_command.nucleares_webserver_set\n data:\n var: COOLANT_CORE_CIRCULATION_PUMP{{loop}}ORDERED_SPEED\n val: '{{ states(''sensor.coolant_core_circulation_pump''+loop+''speed'')\n | int + (states(''sensor.demand_delta'') | int | abs) / (states(''sensor.demand_delta'')\n | int) }}'\n alias: Adjust Primary Pump Speed +/- 1\n - delay:\n hours: 0\n minutes: 0\n seconds: '{{ 3 / states(''sensor.game_sim_speed'') | int }}'\n milliseconds: 0\n alias: Wait for (3 / simspeed) seconds\n - alias: NOTIFICATION\n action: persistent_notification.create\n data:\n message: 'Demand: {{ states(''sensor.power_demand_mw'') }}
Output:\n {{ states(''sensor.total_power_output_mw'') | float }}
Delta = {{\n states(''sensor.demand_delta'') | round(2) }}

Loop: {{loop}}\n ==> PRIMARY PUMP speed adjustment
Primary = {{ states(''sensor.COOLANT_CORE_CIRCULATION_PUMP''+loop+''SPEED'')\n | int }}% -> {{ states(''sensor.COOLANT_CORE_CIRCULATION_PUMP''+loop+''SPEED'')\n | int / 100 * states(''sensor.coolant_core_circulation_pump''+loop+''capacity'')\n | int }} L/m of {{ states(''sensor.coolant_core_circulation_pump''+loop+''capacity'')\n | int }} L/m
Secondary = {{ states(''sensor.COOLANT_SEC_CIRCULATION_PUMP''+loop+''SPEED'')\n | int }}% -> {{ states(''sensor.COOLANT_SEC_CIRCULATION_PUMP''+loop+''SPEED'')\n | int / 100 * states(''sensor.coolant_sec_circulation_pump''+loop+''capacity'')\n | int }} L/m of {{ states(''sensor.coolant_sec_circulation_pump''+loop+''capacity'')\n | int }} L/m
MSCV = {{ states(''sensor.mscv''+loop+''opening_actual'')\n }}% {{ states(''sensor.mscv''+loop+''opening_actual'') | int * 100\n }} L/m
Flow Ratio = {{ flow_ratio | round(3) }}
New Primary\n Pump speed: {{ max(states(''sensor.coolant_core_circulation_pump''+loop+''speed'')\n | int + states(''sensor.demand_delta'') | int,6) }}%'\n notification_id: PrimaryPump\n enabled: true\n else:\n - variables:\n target_mscv: '{{ max(min(states(''sensor.mscv''+loop+''opening_actual'')\n | int + (states(''sensor.demand_delta'') | int / 6) | int,40),2) }}'\n alias: target MSCV = current mscv + (demand_delta / 6)\n - alias: Match Secondary Pump Speed to Target MSCV\n action: rest_command.nucleares_webserver_set\n data:\n var: COOLANT_SEC_CIRCULATION_PUMP{{loop}}ORDERED_SPEED\n val: '{{ (target_mscv | int * 1000 / states(''sensor.coolant_sec_circulation_pump''+loop+''capacity'')\n | int) | round(1) }}'\n - alias: Match Primary Pump Speed to Target MSCV\n action: rest_command.nucleares_webserver_set\n data:\n var: COOLANT_CORE_CIRCULATION_PUMP{{loop}}ORDERED_SPEED\n val: '{{ (target_mscv | int * 300 / states(''sensor.coolant_core_circulation_pump''+loop+''capacity'')\n | int) | round(1) }}'\n - alias: If MSCV not at Target, adjust MSCV +/- 1\n if:\n - condition: template\n value_template: '{{ states(''sensor.mscv''+loop+''opening_actual'') | int\n != target_mscv }}'\n alias: Is MSCV not at Target?\n then:\n - action: rest_command.nucleares_webserver_set\n data:\n var: MSCV{{loop}}OPENING_ORDERED\n val: '{{ states(''sensor.mscv''+loop+''opening_actual'') | int + (states(''sensor.demand_delta'')\n | int | abs) / (states(''sensor.demand_delta'') | int) }}'\n alias: Adjust Main Steam Control Valve +/- 1\n - alias: NOTIFICATION\n action: persistent_notification.create\n data:\n message: \"Demand: {{ states('sensor.power_demand_mw') }}
Output: {{\\\n \\ states('sensor.total_power_output_mw') }}
Delta = {{ states('sensor.demand_delta')\\\n \\ | round(2) }}

Loop: {{loop}} ==> STEAM VALVE adjustment
MSCV\\\n \\ = {{ target_mscv }}
New Primary = {{\\n (target_mscv | int * 300\\\n \\ / states('sensor.coolant_core_circulation_pump'+loop+'capacity') |\\n\\\n int) | int }}
New Secondary = {{ (target_mscv | int * 1000 / states('sensor.coolant_sec_circulation_pump'+loop+'capacity')\\\n \\ | int) | int }}
Ratio:{{flow_ratio | round(4)}}\"\n notification_id: SteamValve\n enabled: true\n - delay:\n hours: 0\n minutes: 0\n seconds: '{{ 10 / states(''sensor.game_sim_speed'') | int }}'\n milliseconds: 0\n alias: Wait for (10 / simspeed) seconds\n - delay:\n hours: 0\n minutes: 0\n seconds: 1\n milliseconds: 0\n mode: single", "config": [ { "name": "power demand mw sensor", "room": null, "type": "sensor", "id": { "entity_id": "sensor.power_demand_mw", "device_id": null } }, { "name": "total power output mw sensor", "room": null, "type": "sensor", "id": { "entity_id": "sensor.total_power_output_mw", "device_id": null } }, { "name": "loop input select", "room": null, "type": "input_select", "id": { "entity_id": "input_select.loop", "device_id": null } }, { "name": "demand lowerlimit sensor", "room": null, "type": "sensor", "id": { "entity_id": "sensor.demand_lowerlimit", "device_id": null } }, { "name": "demand upperlimit sensor", "room": null, "type": "sensor", "id": { "entity_id": "sensor.demand_upperlimit", "device_id": null } }, { "name": "demand delta sensor", "room": null, "type": "sensor", "id": { "entity_id": "sensor.demand_delta", "device_id": null } }, { "name": "game sim speed sensor", "room": null, "type": "sensor", "id": { "entity_id": "sensor.game_sim_speed", "device_id": null } }, { "name": "nucleares webserver set rest command", "room": null, "type": "rest_command", "id": { "entity_id": "rest_command.nucleares_webserver_set", "device_id": null } }, { "name": "persistent notification create service", "room": null, "type": "persistent_notification", "id": { "entity_id": "persistent_notification.create", "device_id": null } }, { "name": "Coolant Core Circulation Pump", "room": null, "type": "sensor", "id": { "entity_id": "sensor.coolant_core_circulation_pump", "device_id": null } }, { "name": "Coolant Secondary Circulation Pump", "room": null, "type": "sensor", "id": { "entity_id": "sensor.coolant_sec_circulation_pump", "device_id": null } }, { "name": "Main Steam Control Valve", "room": null, "type": "sensor", "id": { "entity_id": "sensor.mscv", "device_id": null } } ] }, { "id": "'1746027130216'", "automation": "- id: '1746027130216'\n alias: Core Target Temp\n description: ''\n triggers:\n - trigger: state\n entity_id:\n - sensor.core_state_criticality\n - sensor.core_temp\n - sensor.rods_pos_actual\n for:\n hours: 0\n minutes: 0\n seconds: 5\n conditions:\n - condition: numeric_state\n entity_id: sensor.core_state_criticality\n above: -5\n below: 5\n actions:\n - variables:\n tgt_reactivity: '{{ min(((states(''input_number.target_core_temp'') | float\n - states(''sensor.core_temp'') | float) / states(''input_number.target_core_temp'')\n | float) | round(3) * 10 | float,2) }}'\n - alias: Target ROD Position different than Actual Position\n if:\n - condition: template\n value_template: \"{{ (states('sensor.rods_pos_actual') | float + max(states('sensor.core_state_criticality')\\\n \\ | float - tgt_reactivity,-2)) \\n | float | round(1) != states('sensor.rods_pos_actual')\\\n \\ | float | round(1) }}\\n\"\n then:\n - action: notify.persistent_notification\n metadata: {}\n data:\n message: \"SET RODS to {{(states('sensor.rods_pos_actual') | float + max(states('sensor.core_state_criticality')\\\n \\ | float - tgt_reactivity,-2)) \\n | float | round(2) }}\"\n data:\n notification_id: rods\n - action: rest_command.nucleares_webserver_set\n data:\n var: RODS_ALL_POS_ORDERED\n val: '{{ states(''sensor.rods_pos_actual'') | float + max(states(''sensor.core_state_criticality'')\n | float - tgt_reactivity,-2) }}'\n alias: Adjust Control Rods\n - delay:\n hours: 0\n minutes: 0\n seconds: '{{ (states(''sensor.core_temp'') | int - states(''input_number.target_core_temp'')\n | int) | abs / 10 / states(''sensor.game_sim_speed'') | int + 1 }}'\n milliseconds: 0\n mode: single", "config": [ { "name": "game sim speed sensor", "room": null, "type": "sensor", "id": { "entity_id": "sensor.game_sim_speed", "device_id": null } }, { "name": "core state criticality sensor", "room": null, "type": "sensor", "id": { "entity_id": "sensor.core_state_criticality", "device_id": null } }, { "name": "core temp sensor", "room": null, "type": "sensor", "id": { "entity_id": "sensor.core_temp", "device_id": null } }, { "name": "rods pos actual sensor", "room": null, "type": "sensor", "id": { "entity_id": "sensor.rods_pos_actual", "device_id": null } }, { "name": "target core temp input number", "room": null, "type": "input_number", "id": { "entity_id": "input_number.target_core_temp", "device_id": null } }, { "name": "nucleares webserver set rest command", "room": null, "type": "rest_command", "id": { "entity_id": "rest_command.nucleares_webserver_set", "device_id": null } }, { "name": "persistent notification notify service", "room": null, "type": "persistent_notification", "id": { "entity_id": "notify.persistent_notification", "device_id": null } } ] }, { "id": "'1746249037975'", "automation": "- id: '1746249037975'\n alias: Hourly Timestamp\n description: ''\n triggers:\n - trigger: template\n value_template: '{{ states(''sensor.time'').split(\":\")[1] | int == 0 }}'\n enabled: true\n conditions: []\n actions:\n - action: input_number.set_value\n metadata: {}\n data:\n value: 10000\n target:\n entity_id:\n - input_number.timestamp\n - action: input_number.set_value\n metadata: {}\n data:\n value: 0\n target:\n entity_id:\n - input_number.timestamp\n mode: single", "config": [ { "name": "time sensor", "room": null, "type": "sensor", "id": { "entity_id": "sensor.time", "device_id": null } }, { "name": "timestamp input number", "room": null, "type": "input_number", "id": { "entity_id": "input_number.timestamp", "device_id": null } }, { "name": "input number set value service", "room": null, "type": "input_number", "id": { "entity_id": "input_number.set_value", "device_id": null } } ] } ]