Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ This directory contains a set of Ansible scripts for deploying VOLTTRON instance
A playbook (deploy-tags.yml) is provided which will do the following for each managed node:
1. Install dependencies for VOLTTRON.
2. Download the repositories for VOLTTRON, the volttron-interface for the Normal Framework,
and voltron-pnnl-applications.
and PNNL VOLTTRON applications.
3. Clone the config generators from this repository to the managed node.
4. Install and bootstrap VOLTTRON.
5. Install dependencies for the config generators.
Expand Down
8 changes: 4 additions & 4 deletions deploy-tags.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@
- volttron.tag_based_deployment.suspend_volttron_and_get_state
- volttron.tag_based_deployment.config_generators
- role: volttron.tag_based_deployment.driver_configs
when: driver_generator is defined
when: site_info.driver is true
- role: volttron.tag_based_deployment.airside_rcx_configs
when: airside_rcx_generator is defined
when: site_info.airside is true
- role: volttron.tag_based_deployment.economizer_rcx_configs
when: economizer_rcx_generator is defined
when: site_info.economizer is true
- role: volttron.tag_based_deployment.ilc_configs
when: ilc_generator is defined
when: site_info.ilc is true
- volttron.tag_based_deployment.restore_volttron_state

- name: Setup Historian Tunnel
Expand Down
2 changes: 1 addition & 1 deletion example_configs/group_vars/collectors.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ agents_to_install:
agent_enabled: False
agent_tag: listener

tag_data:
semantic_data:
### For json data_source (comment if using db):
json:
source_path: "/path/to/file"
Expand Down
10 changes: 9 additions & 1 deletion example_configs/hosts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,17 @@ all:
- postgres
deployment_platform_config_dir: "{{ inventory_dir }}/agent_configs"
deployment_host_config_dir: "{{ inventory_dir }}/host_vars"
ssh_key_file: ~/.ssh/
ssh_key_file: ~/.ssh/id_rsa
generator_reports_dir: ~/generator_reports
generator_repository: "git+https://github.com/VOLTTRON/tag-based-config-generators@develop"
make_volttron_service: yes
use_rotating_log: yes
airside_repo_url: "git+https://github.com/VOLTTRON/volttron-airside-rcx"
airside_git_branch: "main"
economizer_repo_url: "git+https://github.com/VOLTTRON/volttron-economizer-rcx"
economizer_git_branch: "main"
ilc_repo_url: "git+https://github.com/VOLTTRON/volttron-ilc"
ilc_git_branch: "main"
volttron_repo_url: "https://github.com/davidraker/volttron.git"
volttron_git_branch: develop
# verbose_debug_tasks: yes
Original file line number Diff line number Diff line change
Expand Up @@ -4,46 +4,25 @@
src: airside_rcx_generator_config.j2
dest: "{{ host_configs_dir }}/airside_rcx_generator_config.json"

- name: Copy JSON Sources
ansible.posix.synchronize:
src: "{{ airside_rcx_generator.json.source_path }}"
dest: "{{ host_configs_dir }}"
when: site_info.data_source == 'json'

- name: Run Airside RCx Generator from JSON
- name: Run Airside RCx Generator
ansible.builtin.shell:
cmd: "{{ venv_for_ansible }}/bin/config-gen-json.airsidercx {{ host_configs_dir }}/airside_rcx_generator_config.json"
# chdir: "{{ ansible_env.HOME }}/config_generators/src/volttron/haystack/parser/airsidercx/"
register: generator_return_json
failed_when: generator_return_json.rc < 0 or generator_return_json.rc > 1
when: site_info.data_source == 'json'
cmd: "{{ venv_for_ansible }}/bin/volttron-config-gen {{ semantic_data.model_name }}
{{ semantic_data.data_store_type }} airsidercx {{ host_configs_dir }}/airside_rcx_generator_config.json"
register: generator_return
failed_when: generator_return.rc < 0 or generator_return.rc > 1

- name: Report Generator Errors from JSON
- name: Report Generator Errors
ansible.builtin.copy:
dest: airside_rcx_issues.json
content: "{{ generator_return_json.stderr }}"
when: generator_return_json.rc | default('') == 1

- name: Run Airside RCx Generator from Database
ansible.builtin.shell:
cmd: "{{ venv_for_ansible }}/bin/config-gen-db.airsidercx {{ host_configs_dir }}/airside_rcx_generator_config.json"
# chdir: "{{ ansible_env.HOME }}/config_generators/src/volttron/haystack/parser/airsidercx/intellimation"
register: generator_return_db
failed_when: generator_return_db.rc < 0 or generator_return_db.rc > 1
when: site_info.data_source == 'db'

- name: Report Generator Errors from Database
ansible.builtin.copy:
dest: airside_rcx_issues.json
content: "{{ generator_return_db.stderr }}"
when: generator_return_db.rc | default('') == 1
content: "{{ generator_return.stderr }}"
when: generator_return.rc | default('') == 1

- name: Fetch Generator Error Report
ansible.builtin.fetch:
dest: "{{ generator_reports_dir }}/{{ inventory_hostname }}/airside_rcx_issues.json"
src: "{{ host_configs_dir }}/airside_rcx/errors/unmapped_device_details" # airside_rcx_issues.json
flat: yes
when: (generator_return_json.rc is defined and generator_return_json.rc == 1) or (generator_return_db.rc is defined and generator_return_db.rc == 1)
when: (generator_return.rc is defined and generator_return.rc == 1)

- name: Find Generated Files
ansible.builtin.find:
Expand All @@ -61,6 +40,15 @@
ansible.builtin.shell:
cmd: "{{ volttron_venv }}/bin/vcfg --vhome {{ volttron_home }} update-config-store --metadata-file configs/airside_rcx"

- name: Clone Airside
ansible.builtin.git:
repo: "{{ airside_repo_url | default('git+https://github.com/eclipse-volttron/volttron-airside-rcx') }}"
version: "{{ airside_git_branch | default('main') }}"
dest: volttron-airside-rcx
environment:
http_proxy: "{{ http_proxy }}"
https_proxy: "{{ https_proxy }}"

- name: Setup Agent Installs
set_fact:
agents_to_install: "{{
Expand All @@ -69,7 +57,7 @@
loop: "{{ airside_rcx_config_set.results | map(attribute='content') | map('b64decode') | map('from_json') }}"
vars:
config_dict:
agent_source: '{{ ansible_env.HOME }}/volttron-pnnl-applications/EnergyEfficiency/AirsideRCxAgent/'
agent_source: '{{ ansible_env.HOME }}/volttron-airside-rcx'
agent_state: 'present'
agent_enabled: True
agent_priority: 50
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
{
"metadata": {
{% if site_info.data_source == "json" %}
"equip_json": "{{ host_configs_dir }}/generator_json_sources/{{ airside_rcx_generator.json.equipment_file }}",
"points_json": "{{ host_configs_dir }}/generator_json_sources/{{ airside_rcx_generator.json.points_file }}"
{% if semantic_data.data_store_type == "file" and semantic_data.model_name == "haystack3_intellimation" %}
"equip_json": "{{ host_configs_dir }}/generator_file_sources/{{ semantic_data.file.equipment_file }}",
"points_json": "{{ host_configs_dir }}/generator_file_sources/{{ semantic_data.file.points_file }}"
{% endif %}

{% if site_info.data_source == "db" %}
{% if semantic_data.data_store_type == "file" and semantic_data.model_name == "edo" %}
"points_csv": "{{ host_configs_dir }}/generator_file_sources/{{ semantic_data.file.points_file }}"
{% endif %}
{% if semantic_data.data_store_type == "db" %}
"connection_params": {
"dbname": "{{ tag_data.database.name }}",
"host": "{{ tag_data.database.host }}",
"port": {{ tag_data.database.port }},
"user": "{{ tag_data.database.user }}",
"password": "{{ tag_data.database.password }}"
"dbname": "{{ semantic_data.database.name }}",
"host": "{{ semantic_data.database.host }}",
"port": {{ semantic_data.database.port }},
"user": "{{ semantic_data.database.user }}",
"password": "{{ semantic_data.database.password }}"
},
"equip_table": "{{ tag_data.database.equipment_table }}",
"point_table": "{{ tag_data.database.point_table }}"
"equip_table": "{{ semantic_data.database.equipment_table }}",
"point_table": "{{ semantic_data.database.point_table }}"
{% endif %}
}

Expand All @@ -40,12 +42,12 @@
{% endif %}

# Optional campus. If not provided will be parsed from site_id else will be empty. defaults to empty
{% if airside_rcx_generator.campus is defined %}
,"campus": "{{ airside_rcx_generator.campus }}"
{% if site_info.campus is defined %}
,"campus": "{{ site_info.campus }}"
{% endif %}

# Optional building or site name. If not provided parsed from site_id if site_id is provided. defaults to empty
{% if airside_rcx_generator.building is defined %}
,"building": "{{ airside_rcx_generator.building }}"
{% if site_info.building is defined %}
,"building": "{{ site_info.building }}"
{% endif %}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
---
- name: Clone VOLTTRON PNNL Applications
ansible.builtin.git:
repo: https://github.com/volttron/volttron-pnnl-applications
dest: volttron-pnnl-applications
environment:
http_proxy: "{{ http_proxy }}"
https_proxy: "{{ https_proxy }}"

- name: Install Config Generators
ansible.builtin.pip:
name: "{{ generator_repository }}"

- name: Install Neo4j
ansible.builtin.pip:
name: neo4j
when: semantic_data.data_store_type == 'neo4j'

- name: Copy File Sources
ansible.posix.synchronize:
src: "{{ semantic_data.file.source_path }}"
dest: "{{ host_configs_dir }}"
when: semantic_data.data_store_type == 'file'
Original file line number Diff line number Diff line change
Expand Up @@ -4,59 +4,38 @@
src: driver_generator_config.j2
dest: "{{ host_configs_dir }}/driver_generator_config.json"

- name: Copy JSON Sources
ansible.posix.synchronize:
src: "{{ driver_generator.json.source_path }}"
dest: "{{ host_configs_dir }}"
when: site_info.data_source == 'json'

- name: Run Driver Generator from JSON
ansible.builtin.shell:
cmd: "{{ venv_for_ansible }}/bin/config-gen-json.driver {{ host_configs_dir }}/driver_generator_config.json"
#chdir: "{{ ansible_env.HOME }}/config_generators/src/volttron/haystack/parser/driver/"
register: generator_return_json
failed_when: generator_return_json.rc < 0 or generator_return_json.rc > 1
when: site_info.data_source == 'json'

- name: Report Generator Errors from JSON
ansible.builtin.copy:
dest: driver_issues.json
content: "{{ generator_return_json.stderr }}"
when: generator_return_json.rc | default('') == 1

- name: Run Driver Generator from Database
- name: Run Driver Generator
ansible.builtin.shell:
cmd: "{{ venv_for_ansible }}/bin/config-gen-db.driver {{ host_configs_dir }}/driver_generator_config.json"
#chdir: "{{ ansible_env.HOME }}/config_generators/src/volttron/haystack/parser/driver/intellimation"
register: generator_return_db
failed_when: generator_return_db.rc < 0 or generator_return_db.rc > 1
when: site_info.data_source == 'db'
cmd: "{{ venv_for_ansible }}/bin/volttron-config-gen {{ semantic_data.model_name }}
{{ semantic_data.data_store_type }} driver {{ host_configs_dir }}/driver_generator_config.json"
register: generator_return
failed_when: generator_return.rc < 0 or generator_return.rc > 1

- name: Report Generator Errors from Database
- name: Report Generator Errors
ansible.builtin.copy:
dest: driver_issues.json
content: "{{ generator_return_db.stderr }}"
when: generator_return_db.rc | default('') == 1
content: "{{ generator_return.stderr }}"
when: generator_return.rc | default('') == 1

- name: Fetch Generator Error Report
ansible.builtin.fetch:
dest: "{{ generator_reports_dir }}/{{ inventory_hostname }}/driver_issues.json"
src: "{{ host_configs_dir }}/drivers/unmapped_device_details" # driver_issues.json
src: "{{ host_configs_dir }}/drivers/errors/unmapped_device_details" # driver_issues.json
flat: yes
when: (generator_return_json.rc is defined and generator_return_json.rc == 1) or (generator_return_db is defined and generator_return_db == 1)
when: (generator_return.rc is defined and generator_return.rc == 1)

- name: Find Generated Files
ansible.builtin.find:
paths: "{{ host_configs_dir }}/drivers/configs"
excludes: "unmapped_device_details"
excludes: ["unmapped_device_details", "*.csv"]
register: driver_configs

- name: Install Config Set
ansible.builtin.shell:
cmd: "{{ volttron_venv }}/bin/vcfg --vhome {{ volttron_home }} update-config-store --metadata-file {{ item.path }}"
loop: "{{ driver_configs.files }}"

- name: Setup Agent Install
- name: Setup Driver Agent Install
set_fact:
agents_to_install: "{{
agents_to_install | default({}) | combine({ agent_vip : config_dict })
Expand All @@ -72,3 +51,29 @@
skip_requirements: False
force_install: False
agent_vip: "{{ driver_generator.driver_vip | default('platform.driver') }}"


- name: Generate BACnet Proxy Agent Config
ansible.builtin.template:
src: bacnet_proxy_config.j2
dest: "{{ host_configs_dir }}/bacnet_proxy.json"
when: driver.device.type == "bacnet"

- name: Setup BACnet Proxy Agent Install
set_fact:
agents_to_install: "{{
agents_to_install | default({}) | combine({ agent_vip : config_dict })
}}"
vars:
config_dict:
agent_source: '{{ ansible_env.HOME }}/volttron/services/core/BACnetProxy'
agent_state: 'present'
agent_enabled: True
agent_priority: 50
agent_running: true
agent_tag: 'proxy'
skip_requirements: False
force_install: False
agent_config: "{{ host_configs_dir }}/bacnet_proxy.json"
agent_vip: "{{ driver_generator.bacnet_proxy_vip | default('platform.bacnet_proxy') }}"
when: driver.device.type == "bacnet"
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{% set ip = hostvars[inventory_hostname]['ansible_default_ipv4']['address'] %}
{% set octets = ip.split('.') %}
{
"device_address": "{{ ip }}",
"max_apdu_length": 1024,
"object_id": {{ octets[2] + octets[3] }},
"object_name": "Volttron BACnet driver",
"vendor_id": 5,
"segmentation_supported": "segmentedBoth"
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
{
"metadata": {
{% if site_info.data_source == "json" %}
"equip_json": "{{ host_configs_dir }}/generator_json_sources/{{ driver_generator.json.equipment_file }}",
"points_json": "{{ host_configs_dir }}/generator_json_sources/{{ driver_generator.json.points_file }}"
{% if semantic_data.data_store_type == "file" and semantic_data.model_name == "haystack3_intellimation" %}
"equip_json": "{{ host_configs_dir }}/generator_file_sources/{{ semantic_data.file.equipment_file }}",
"points_json": "{{ host_configs_dir }}/generator_file_sources/{{ semantic_data.file.points_file }}"
{% endif %}

{% if site_info.data_source == "db" %}
{% if semantic_data.data_store_type == "file" and semantic_data.model_name == "edo" %}
"points_csv": "{{ host_configs_dir }}/generator_file_sources/{{ semantic_data.file.points_file }}"
{% endif %}
{% if semantic_data.data_store_type == "db" %}
"connection_params": {
"dbname": "{{ tag_data.database.name }}",
"host": "{{ tag_data.database.host }}",
"port": {{ tag_data.database.port }},
"user": "{{ tag_data.database.user }}",
"password": "{{ tag_data.database.password }}"
"dbname": "{{ semantic_data.database.name }}",
"host": "{{ semantic_data.database.host }}",
"port": {{ semantic_data.database.port }},
"user": "{{ semantic_data.database.user }}",
"password": "{{ semantic_data.database.password }}"
},
"equip_table": "{{ tag_data.database.equipment_table }}",
"point_table": "{{ tag_data.database.point_table }}"
"equip_table": "{{ semantic_data.database.equipment_table }}",
"point_table": "{{ semantic_data.database.point_table }}"
{% endif %}
{% if semantic_data.data_store_type == "neo4j" %}
"connection_params": {
"uri": "{{ semantic_data.neo4j.uri }}",
"user": "{{ semantic_data.neo4j.user }}",
"password": "{{ semantic_data.neo4j.password }}"
}
{% endif %}
}

Expand All @@ -35,13 +44,13 @@
{% endif %}

# Optional campus. If not provided will be parsed from site_id else will be empty. defaults to empty
{% if driver_generator.campus is defined %}
,"campus": "{{ driver_generator.campus }}"
{% if site_info.campus is defined %}
,"campus": "{{ site_info.campus }}"
{% endif %}

# Optional building or site name. If not provided parsed from site_id if site_id is provided. defaults to empty
{% if driver_generator.building is defined %}
,"building": "{{ driver_generator.building }}"
{% if site_info.building is defined %}
,"building": "{{ site_info.building }}"
{% endif %}

# optional driver topic_prefix.
Expand Down
Loading