commit 2144a97a10824bcba331fbe18d6f1c0cf93aab68 Author: Tyrel Souza Date: Tue Jul 25 17:34:44 2023 -0400 initial commit - insecure security_key diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..962457f --- /dev/null +++ b/.gitignore @@ -0,0 +1,288 @@ +# Created by https://www.toptal.com/developers/gitignore/api/tags,python,django +# Edit at https://www.toptal.com/developers/gitignore?templates=tags,python,django + +### Django ### +*.log +*.pot +*.pyc +__pycache__/ +local_settings.py +db.sqlite3 +db.sqlite3-journal +media + +# If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ +# in your Git repository. Update and uncomment the following line accordingly. +# /staticfiles/ + +### Django.Python Stack ### +# Byte-compiled / optimized / DLL files +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo + +# Django stuff: + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python ### +# Byte-compiled / optimized / DLL files + +# C extensions + +# Distribution / packaging + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. + +# Installer logs + +# Unit test / coverage reports + +# Translations + +# Django stuff: + +# Flask stuff: + +# Scrapy stuff: + +# Sphinx documentation + +# PyBuilder + +# Jupyter Notebook + +# IPython + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm + +# Celery stuff + +# SageMath parsed files + +# Environments + +# Spyder project settings + +# Rope project settings + +# mkdocs documentation + +# mypy + +# Pyre type checker + +# pytype static type analyzer + +# Cython debug symbols + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +### Tags ### +# Ignore tags created by etags, ctags, gtags (GNU global) and cscope +TAGS +.TAGS +!TAGS/ +tags +.tags +!tags/ +gtags.files +GTAGS +GRTAGS +GPATH +GSYMS +cscope.files +cscope.out +cscope.in.out +cscope.po.out +tags.lock +tags.temp + + +# End of https://www.toptal.com/developers/gitignore/api/tags,python,django + diff --git a/benchtopdevices/benchtopdevices/__init__.py b/benchtopdevices/benchtopdevices/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/benchtopdevices/benchtopdevices/asgi.py b/benchtopdevices/benchtopdevices/asgi.py new file mode 100644 index 0000000..4c792cb --- /dev/null +++ b/benchtopdevices/benchtopdevices/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for benchtopdevices project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'benchtopdevices.settings') + +application = get_asgi_application() diff --git a/benchtopdevices/benchtopdevices/settings.py b/benchtopdevices/benchtopdevices/settings.py new file mode 100644 index 0000000..b3b3a7a --- /dev/null +++ b/benchtopdevices/benchtopdevices/settings.py @@ -0,0 +1,134 @@ +""" +Django settings for benchtopdevices project. + +Generated by 'django-admin startproject' using Django 4.2.3. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.2/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-=$1$b*-dgj6+@&-=yl*xsw@if=t%em(u_-i_^p4+-k0^nsg=--' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'debug_toolbar', + 'sheets' +] + +MIDDLEWARE = [ + 'debug_toolbar.middleware.DebugToolbarMiddleware', + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + +] + +ROOT_URLCONF = 'benchtopdevices.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'benchtopdevices.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'America/New_York' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.2/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +INTERNAL_IPS = [ + # ... + "127.0.0.1", + # ... +] + diff --git a/benchtopdevices/benchtopdevices/urls.py b/benchtopdevices/benchtopdevices/urls.py new file mode 100644 index 0000000..ee7396a --- /dev/null +++ b/benchtopdevices/benchtopdevices/urls.py @@ -0,0 +1,24 @@ +""" +URL configuration for benchtopdevices project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path('', include('sheets.urls')), + path('admin/', admin.site.urls), + path("__debug__/", include("debug_toolbar.urls")), +] diff --git a/benchtopdevices/benchtopdevices/wsgi.py b/benchtopdevices/benchtopdevices/wsgi.py new file mode 100644 index 0000000..efbb0b8 --- /dev/null +++ b/benchtopdevices/benchtopdevices/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for benchtopdevices project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'benchtopdevices.settings') + +application = get_wsgi_application() diff --git a/benchtopdevices/manage.py b/benchtopdevices/manage.py new file mode 100755 index 0000000..978849e --- /dev/null +++ b/benchtopdevices/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'benchtopdevices.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/benchtopdevices/sheets/__init__.py b/benchtopdevices/sheets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/benchtopdevices/sheets/admin.py b/benchtopdevices/sheets/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/benchtopdevices/sheets/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/benchtopdevices/sheets/apps.py b/benchtopdevices/sheets/apps.py new file mode 100644 index 0000000..757cee8 --- /dev/null +++ b/benchtopdevices/sheets/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class SheetsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'sheets' diff --git a/benchtopdevices/sheets/forms.py b/benchtopdevices/sheets/forms.py new file mode 100644 index 0000000..7c29523 --- /dev/null +++ b/benchtopdevices/sheets/forms.py @@ -0,0 +1,26 @@ +from django import forms +from django.db import models +from django.utils.translation import gettext_lazy as _ + + +class UploadFileForm(forms.Form): + instrument = forms.CharField() + customer_name = forms.CharField() + customer_address = forms.CharField() + control_number = forms.CharField() + serial_number = forms.CharField() + accuracy = forms.FloatField(initial=0.05, widget=forms.NumberInput(attrs={'step': 0.01})) + barometric_pressure = forms.FloatField(widget=forms.NumberInput(attrs={'step': 0.01, 'max': 1100, 'min': 800})) + temperature = forms.FloatField(widget=forms.NumberInput(attrs={'step': 0.01, 'max': 1000.0, 'min': -459.67})) + humidity = forms.FloatField(widget=forms.NumberInput(attrs={'step': 0.01, 'max': 100.0, 'min': 0.0})) + + CHOICES = [ + ('TV', _('Transducer Verify')), + ('HC', _('Hardware Calibration')) + ] + + report_type = forms.ChoiceField( + widget=forms.RadioSelect, + choices=CHOICES, + ) + file = forms.FileField() \ No newline at end of file diff --git a/benchtopdevices/sheets/migrations/__init__.py b/benchtopdevices/sheets/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/benchtopdevices/sheets/models.py b/benchtopdevices/sheets/models.py new file mode 100644 index 0000000..f64c9bc --- /dev/null +++ b/benchtopdevices/sheets/models.py @@ -0,0 +1,12 @@ +from django.db import models + +# Create your models here. + +class Configuration(models.Model): + sertial = models.CharField(max_length = 200) + description = models.TextField() + calibration_date = models.DateField() + calibration_due_date = models.DateField() + + def __str__(self): + return f"{self.serial} {self.description}" \ No newline at end of file diff --git a/benchtopdevices/sheets/parsers/__init__.py b/benchtopdevices/sheets/parsers/__init__.py new file mode 100644 index 0000000..f6b2660 --- /dev/null +++ b/benchtopdevices/sheets/parsers/__init__.py @@ -0,0 +1,2 @@ +from .hardware import parse_hardware_calibration +from .transducer import parse_transducer \ No newline at end of file diff --git a/benchtopdevices/sheets/parsers/hardware.py b/benchtopdevices/sheets/parsers/hardware.py new file mode 100644 index 0000000..f015f9f --- /dev/null +++ b/benchtopdevices/sheets/parsers/hardware.py @@ -0,0 +1,68 @@ +import re + + +def parse_instrument_info(text): + instrument_info = {} + # Regex pattern for key-value pairs in the instrument info section + for line in text.split("\n")[2:]: + if line: + key, value = re.sub(r"\s\s+", "`", line.strip()).split("`") + instrument_info[key.strip()] = value.strip() + return instrument_info + + +def parse_ports(text): + text = f"{text}\n\n" # ensure extra newline to match on + pattern = r"(Test Port \d)" + matches = re.split(pattern, text)[1:] + m = dict(list(zip(matches[0::2], matches[1::2]))) + calibration_data = {} + for port, calibration in m.items(): + calibration_data[port] = parse_calibration_data(calibration) + return calibration_data + + +KEEP = { + "Mass Flow Trans": ("Instrument Flow", "Master Reading"), + "Pressure Transducer": ("Instrument Pressure", "Master Value"), +} + + +def parse_calibration_data(text): + # Regex pattern for each block in the calibration data section per Port + pattern = r"(Mass Flow Trans|Pressure Transducer)\n(.+?)\n\n" + matches = re.findall(pattern, text, re.DOTALL) + calibration_data = {} + for block_title, block_content in matches: + lines = block_content.strip().split("\n") + lines.pop(0) # Go away ======= + device_name = lines.pop(0).strip().split(None, 1)[-1].strip() + device_data = {"name": device_name} + for line in lines: + key, value = re.sub(r"\s\s+", "`", line.strip()).split("`") + # Only keep the fields we want + for start in KEEP[block_title]: + key = key.strip() + if key.startswith(start): + device_data[key] = value.strip() + calibration_data[block_title] = device_data + return calibration_data + + +def parse_hardware_calibration(content): + # Split the content into instrument info and calibration data sections + info_section, calibration_section = content.split( + "|| Hardware Calibration Report ||" + ) + + instrument_info = parse_instrument_info(info_section) + calibration_data = parse_ports(calibration_section) + + return {"instrument": instrument_info, "calibration": calibration_data} + + +if __name__ == "__main__": + file_path = "./hardware_calibration.txt" # Replace with the actual file path + with open(file_path, "r") as file: + content = file.read() + data = parse_file(file_path) diff --git a/benchtopdevices/sheets/parsers/transducer.py b/benchtopdevices/sheets/parsers/transducer.py new file mode 100644 index 0000000..1464b9d --- /dev/null +++ b/benchtopdevices/sheets/parsers/transducer.py @@ -0,0 +1,77 @@ +from decimal import * + +import re + + +def parse_transducer(content): + getcontext().prec = 3 + transducer_data = [] + + # Split the content into sections based on the blank line + sections = content.strip().split("\n\n") + + for section in sections: + # Split each section into lines + lines = section.strip().split("\n") + lines = [ + line.strip() + for line in lines + if not line.startswith("==") and line != "|| Transducer Verify Report ||" + ] + lines.pop(0) + + # Extract the Transducer number and Transducer type + transducer_line = lines.pop(0).strip() + _, transducer_name, part_number = transducer_line.split(None, 2) + + # Get part number and values + value = None + transducer_type = None + if part_number != "Custom": + value = part_number.split()[-1] + part_number = part_number.split()[1] + if value.endswith("SCCM"): + transducer_type = "Flow" + if value.endswith("PSIA"): + transducer_type = "Pressure" + + # Create a dictionary to store the data for each transducer + transducer_info = { + "Part Number": part_number, + "Value": value, + "Transducer Name": transducer_name, + "Transducer Type": transducer_type, + "Setpoint Pressure": [], + "Instrument Pressure": [], + "Master Value": [], + "Instrument Flow": [], + "Verify Date": "", + "Verify Time": "", + } + + # Extract other information for the transducer + for line in lines: + key, value = re.sub(r"\s\s+", ",", line.strip()).split(",") + if "Verify Date" in key: + transducer_info["Verify Date"] = value + continue + elif "Verify Time" in key: + transducer_info["Verify Time"] = value + continue + + # Toss anything else where it belongs + v = Decimal(value.split(" ")[0]) + key = re.match(r"(.*)\W(\d)", key)[1] + if key in transducer_info: + transducer_info[key].append(Decimal(value.split()[0])) + + transducer_data.append(transducer_info) + + return transducer_data + + +if __name__ == "__main__": + file_path = "./transducer_verify.txt" + with open(file_path, "r") as file: + content = file.read() + parsed_data = parse_transducer(file_path) diff --git a/benchtopdevices/sheets/templates/sheets/index.html b/benchtopdevices/sheets/templates/sheets/index.html new file mode 100644 index 0000000..e69de29 diff --git a/benchtopdevices/sheets/templates/sheets/upload.html b/benchtopdevices/sheets/templates/sheets/upload.html new file mode 100644 index 0000000..136a4f8 --- /dev/null +++ b/benchtopdevices/sheets/templates/sheets/upload.html @@ -0,0 +1,7 @@ +
+ {% csrf_token %} + + {{ form.as_table }} +
+ +
diff --git a/benchtopdevices/sheets/tests.py b/benchtopdevices/sheets/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/benchtopdevices/sheets/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/benchtopdevices/sheets/urls.py b/benchtopdevices/sheets/urls.py new file mode 100644 index 0000000..2f71730 --- /dev/null +++ b/benchtopdevices/sheets/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('', views.upload_file, name = 'upload') +] \ No newline at end of file diff --git a/benchtopdevices/sheets/views.py b/benchtopdevices/sheets/views.py new file mode 100644 index 0000000..44114a1 --- /dev/null +++ b/benchtopdevices/sheets/views.py @@ -0,0 +1,18 @@ +from django.http import HttpResponseRedirect +from django.shortcuts import render +from .forms import UploadFileForm +from .parsers import parse_transducer, parse_hardware_calibration + + + +def upload_file(request): + if request.method == "POST": + breakpoint() + f = UploadFileForm(request.POST, request.FILES) + if f.is_valid(): + data = f.clean() + content = request.FILES['file'].read() + return HttpResponseRedirect("/success/url/") + else: + form = UploadFileForm() + return render(request, "sheets/upload.html", {"form": form}) \ No newline at end of file diff --git a/hardware_calibration.txt b/hardware_calibration.txt new file mode 100644 index 0000000..e5e656a --- /dev/null +++ b/hardware_calibration.txt @@ -0,0 +1,538 @@ +|| Instrument Info || + +Instrument Name Chassis2 Adult +Serial Number BBP1736 +Time 11:31:39 +Date 07/12/2022 + + +|| Hardware Calibration Report || + +Hardware 0 +=============================================================== + Test Port 1 + =========================================================== + + + Mass Flow Trans + =========================================================== + Transducer Custom + Input AIN 2 + Setpoint Pressure 1 25.000 psig + Setpoint Pressure 2 25.000 psig + Setpoint Pressure 3 25.000 psig + Setpoint Pressure 4 25.000 psig + Setpoint Pressure 5 25.000 psig + Setpoint Pressure 6 25.000 psig + Analog Value 1 8688254 cnts + Analog Value 2 9864771 cnts + Analog Value 3 11053088 cnts + Analog Value 4 12185889 cnts + Analog Value 5 13357767 cnts + Analog Value 6 14524278 cnts + Master Value 1 0.041 sccm + Master Value 2 4.059 sccm + Master Value 3 8.150 sccm + Master Value 4 11.980 sccm + Master Value 5 15.995 sccm + Master Value 6 19.985 sccm + Linearity 0.129 % + Last Cal Date 12/07/2020 + Last Cal Time 10:35:20 + Xdcr Filter Code Median + Xdcr Typ Residual 108.000 + Xdcr Zero LL 0.000 cnts + Xdcr Zero HL 0.000 cnts + Xdcr Zero Lwin 0.000 + Xdcr Zero Hwin 0.000 + Xdcr Analog Min 0.000 cnts + Xdcr Analog Max 0.000 cnts + Xdcr Base Min 0.000 + Xdcr Base Max 0.000 + Setpoint Pressure 1 5.800 psig + Setpoint Pressure 2 5.800 psig + Setpoint Pressure 3 5.800 psig + Setpoint Pressure 4 5.800 psig + Setpoint Pressure 5 5.800 psig + Setpoint Pressure 6 5.800 psig + Instrument Pressure 1 5.824 psig + Instrument Pressure 2 5.822 psig + Instrument Pressure 3 5.820 psig + Instrument Pressure 4 5.818 psig + Instrument Pressure 5 5.816 psig + Instrument Pressure 6 5.815 psig + Instrument Flow 1 0.038 sccm + Instrument Flow 2 4.075 sccm + Instrument Flow 3 8.151 sccm + Instrument Flow 4 12.124 sccm + Instrument Flow 5 16.213 sccm + Instrument Flow 6 20.165 sccm + Master Value 1 0.000 sccm + Master Value 2 4.000 sccm + Master Value 3 8.000 sccm + Master Value 4 12.000 sccm + Master Value 5 16.000 sccm + Master Value 6 20.000 sccm + Master Reading 1 0.000 sccm + Master Reading 2 4.000 sccm + Master Reading 3 8.000 sccm + Master Reading 4 12.000 sccm + Master Reading 5 16.000 sccm + Master Reading 6 20.000 sccm + Verify Date 07/12/2022 + Verify Time 10:54:56 + + + Pressure Transducer + =========================================================== + Transducer CTS D34-441 45PSIA + Input AIN 1 + Setpoint Pressure 1 0.000 psig + Setpoint Pressure 2 6.000 psig + Setpoint Pressure 3 12.000 psig + Setpoint Pressure 4 18.000 psig + Setpoint Pressure 5 24.000 psig + Setpoint Pressure 6 30.000 psig + Analog Value 1 10087020 cnts + Analog Value 2 10810568 cnts + Analog Value 3 11532365 cnts + Analog Value 4 12252414 cnts + Analog Value 5 12970722 cnts + Analog Value 6 13687182 cnts + Master Value 1 0.001 psig + Master Value 2 6.001 psig + Master Value 3 12.001 psig + Master Value 4 18.001 psig + Master Value 5 24.001 psig + Master Value 6 30.001 psig + XDCR Analog ATM 10086749 + Atm Pressure -0.000 bar + Linearity 0.082 % + Last Cal Date 12/07/2020 + Last Cal Time 09:03:38 + Xdcr Filter Code Med, J-Filter + Xdcr Typ Residual 80.000 + Xdcr Zero LL 9654557.000 cnts + Xdcr Zero HL 10485333.000 cnts + Xdcr Zero Lwin -2.501 psig + Xdcr Zero Hwin 2.499 psig + Xdcr Analog Min 5699952.000 cnts + Xdcr Analog Max 15110248.000 cnts + Xdcr Base Min -4294967.000 + Xdcr Base Max 8589935.000 + Setpoint Pressure 1 0.000 psig + Setpoint Pressure 2 6.000 psig + Setpoint Pressure 3 12.000 psig + Setpoint Pressure 4 18.000 psig + Setpoint Pressure 5 24.000 psig + Setpoint Pressure 6 30.000 psig + Instrument Pressure 1 0.000 psig + Instrument Pressure 2 6.000 psig + Instrument Pressure 3 11.999 psig + Instrument Pressure 4 17.998 psig + Instrument Pressure 5 23.997 psig + Instrument Pressure 6 29.997 psig + Master Value 1 0.000 psig + Master Value 2 6.000 psig + Master Value 3 12.000 psig + Master Value 4 18.000 psig + Master Value 5 24.000 psig + Master Value 6 30.000 psig + Verify Date 07/12/2022 + Verify Time 08:14:59 + + + Test Port 2 + =========================================================== + + + Mass Flow Trans + =========================================================== + Transducer Custom + Input AIN 4 + Setpoint Pressure 1 25.000 psig + Setpoint Pressure 2 25.000 psig + Setpoint Pressure 3 25.000 psig + Setpoint Pressure 4 25.000 psig + Setpoint Pressure 5 25.000 psig + Setpoint Pressure 6 25.000 psig + Analog Value 1 8689552 cnts + Analog Value 2 9914953 cnts + Analog Value 3 11057751 cnts + Analog Value 4 12214973 cnts + Analog Value 5 13397425 cnts + Analog Value 6 14516985 cnts + Master Value 1 0.054 sccm + Master Value 2 4.255 sccm + Master Value 3 8.124 sccm + Master Value 4 12.146 sccm + Master Value 5 16.159 sccm + Master Value 6 19.993 sccm + Linearity 0.166 % + Last Cal Date 12/07/2020 + Last Cal Time 10:50:52 + Xdcr Filter Code Median + Xdcr Typ Residual 83.000 + Xdcr Zero LL 0.000 cnts + Xdcr Zero HL 0.000 cnts + Xdcr Zero Lwin 0.000 + Xdcr Zero Hwin 0.000 + Xdcr Analog Min 0.000 cnts + Xdcr Analog Max 0.000 cnts + Xdcr Base Min 0.000 + Xdcr Base Max 0.000 + Setpoint Pressure 1 5.800 psig + Setpoint Pressure 2 5.800 psig + Setpoint Pressure 3 5.800 psig + Setpoint Pressure 4 5.800 psig + Setpoint Pressure 5 5.800 psig + Setpoint Pressure 6 5.800 psig + Instrument Pressure 1 5.780 psig + Instrument Pressure 2 5.779 psig + Instrument Pressure 3 5.808 psig + Instrument Pressure 4 5.809 psig + Instrument Pressure 5 5.807 psig + Instrument Pressure 6 5.807 psig + Instrument Flow 1 0.049 sccm + Instrument Flow 2 4.122 sccm + Instrument Flow 3 8.171 sccm + Instrument Flow 4 12.220 sccm + Instrument Flow 5 16.204 sccm + Instrument Flow 6 20.221 sccm + Master Value 1 0.000 sccm + Master Value 2 4.000 sccm + Master Value 3 8.000 sccm + Master Value 4 12.000 sccm + Master Value 5 16.000 sccm + Master Value 6 20.000 sccm + Master Reading 1 0.000 sccm + Master Reading 2 4.000 sccm + Master Reading 3 8.000 sccm + Master Reading 4 12.000 sccm + Master Reading 5 16.000 sccm + Master Reading 6 20.000 sccm + Verify Date 07/12/2022 + Verify Time 11:01:54 + + + Pressure Transducer + =========================================================== + Transducer CTS D34-441 45PSIA + Input AIN 3 + Setpoint Pressure 1 0.000 psig + Setpoint Pressure 2 6.000 psig + Setpoint Pressure 3 12.000 psig + Setpoint Pressure 4 18.000 psig + Setpoint Pressure 5 24.000 psig + Setpoint Pressure 6 30.000 psig + Analog Value 1 10050243 cnts + Analog Value 2 10763409 cnts + Analog Value 3 11474665 cnts + Analog Value 4 12184422 cnts + Analog Value 5 12892174 cnts + Analog Value 6 13598393 cnts + Master Value 1 0.001 psig + Master Value 2 6.001 psig + Master Value 3 12.001 psig + Master Value 4 18.001 psig + Master Value 5 24.001 psig + Master Value 6 30.001 psig + XDCR Analog ATM 10050055 + Atm Pressure -0.000 bar + Linearity 0.082 % + Last Cal Date 12/07/2020 + Last Cal Time 09:11:34 + Xdcr Filter Code Med, J-Filter + Xdcr Typ Residual 59.000 + Xdcr Zero LL 9654557.000 cnts + Xdcr Zero HL 10485333.000 cnts + Xdcr Zero Lwin -2.501 psig + Xdcr Zero Hwin 2.499 psig + Xdcr Analog Min 5699952.000 cnts + Xdcr Analog Max 15110248.000 cnts + Xdcr Base Min -4294967.000 + Xdcr Base Max 8589935.000 + Setpoint Pressure 1 0.000 psig + Setpoint Pressure 2 6.000 psig + Setpoint Pressure 3 12.000 psig + Setpoint Pressure 4 18.000 psig + Setpoint Pressure 5 24.000 psig + Setpoint Pressure 6 30.000 psig + Instrument Pressure 1 -0.000 psig + Instrument Pressure 2 5.999 psig + Instrument Pressure 3 12.000 psig + Instrument Pressure 4 17.998 psig + Instrument Pressure 5 23.999 psig + Instrument Pressure 6 29.999 psig + Master Value 1 0.000 psig + Master Value 2 6.000 psig + Master Value 3 12.000 psig + Master Value 4 18.000 psig + Master Value 5 24.000 psig + Master Value 6 30.000 psig + Verify Date 07/12/2022 + Verify Time 08:21:53 + + + Test Port 3 + =========================================================== + + + Mass Flow Trans + =========================================================== + Transducer Custom + Input AIN 6 + Setpoint Pressure 1 25.000 psig + Setpoint Pressure 2 25.000 psig + Setpoint Pressure 3 25.000 psig + Setpoint Pressure 4 25.000 psig + Setpoint Pressure 5 25.000 psig + Setpoint Pressure 6 25.000 psig + Analog Value 1 8686103 cnts + Analog Value 2 9889340 cnts + Analog Value 3 11072089 cnts + Analog Value 4 12249269 cnts + Analog Value 5 13397809 cnts + Analog Value 6 14502802 cnts + Master Value 1 0.007 sccm + Master Value 2 4.155 sccm + Master Value 3 8.207 sccm + Master Value 4 12.206 sccm + Master Value 5 16.165 sccm + Master Value 6 19.942 sccm + Linearity 0.096 % + Last Cal Date 12/07/2020 + Last Cal Time 14:29:53 + Xdcr Filter Code Median + Xdcr Typ Residual 722632.000 + Xdcr Zero LL 0.000 cnts + Xdcr Zero HL 0.000 cnts + Xdcr Zero Lwin 0.000 + Xdcr Zero Hwin 0.000 + Xdcr Analog Min 0.000 cnts + Xdcr Analog Max 0.000 cnts + Xdcr Base Min 0.000 + Xdcr Base Max 0.000 + Setpoint Pressure 1 5.800 psig + Setpoint Pressure 2 5.800 psig + Setpoint Pressure 3 5.800 psig + Setpoint Pressure 4 5.800 psig + Setpoint Pressure 5 5.800 psig + Setpoint Pressure 6 5.800 psig + Instrument Pressure 1 5.892 psig + Instrument Pressure 2 5.889 psig + Instrument Pressure 3 5.887 psig + Instrument Pressure 4 5.884 psig + Instrument Pressure 5 5.883 psig + Instrument Pressure 6 5.881 psig + Instrument Flow 1 0.005 sccm + Instrument Flow 2 4.091 sccm + Instrument Flow 3 8.123 sccm + Instrument Flow 4 12.135 sccm + Instrument Flow 5 16.175 sccm + Instrument Flow 6 20.202 sccm + Master Value 1 0.000 sccm + Master Value 2 4.000 sccm + Master Value 3 8.000 sccm + Master Value 4 12.000 sccm + Master Value 5 16.000 sccm + Master Value 6 20.000 sccm + Master Reading 1 0.000 sccm + Master Reading 2 4.000 sccm + Master Reading 3 8.000 sccm + Master Reading 4 12.000 sccm + Master Reading 5 16.000 sccm + Master Reading 6 20.000 sccm + Verify Date 07/12/2022 + Verify Time 11:18:36 + + + Pressure Transducer + =========================================================== + Transducer CTS D34-441 45PSIA + Input AIN 5 + Setpoint Pressure 1 0.000 psig + Setpoint Pressure 2 6.000 psig + Setpoint Pressure 3 12.000 psig + Setpoint Pressure 4 18.000 psig + Setpoint Pressure 5 24.000 psig + Setpoint Pressure 6 30.000 psig + Analog Value 1 10008894 cnts + Analog Value 2 10714413 cnts + Analog Value 3 11418030 cnts + Analog Value 4 12120292 cnts + Analog Value 5 12820552 cnts + Analog Value 6 13519203 cnts + Master Value 1 0.000 psig + Master Value 2 6.000 psig + Master Value 3 12.000 psig + Master Value 4 18.000 psig + Master Value 5 24.000 psig + Master Value 6 30.000 psig + XDCR Analog ATM 10008874 + Atm Pressure -0.000 bar + Linearity 0.081 % + Last Cal Date 07/12/2022 + Last Cal Time 09:09:57 + Xdcr Filter Code Med, J-Filter + Xdcr Typ Residual 121.000 + Xdcr Zero LL 9654557.000 cnts + Xdcr Zero HL 10485333.000 cnts + Xdcr Zero Lwin -2.500 psig + Xdcr Zero Hwin 2.500 psig + Xdcr Analog Min 5699952.000 cnts + Xdcr Analog Max 15110248.000 cnts + Xdcr Base Min -4294967.000 + Xdcr Base Max 8589935.000 + Setpoint Pressure 1 0.000 psig + Setpoint Pressure 2 6.000 psig + Setpoint Pressure 3 12.000 psig + Setpoint Pressure 4 18.000 psig + Setpoint Pressure 5 24.000 psig + Setpoint Pressure 6 30.000 psig + Instrument Pressure 1 -0.000 psig + Instrument Pressure 2 6.000 psig + Instrument Pressure 3 12.002 psig + Instrument Pressure 4 18.000 psig + Instrument Pressure 5 24.002 psig + Instrument Pressure 6 30.001 psig + Master Value 1 0.000 psig + Master Value 2 6.000 psig + Master Value 3 12.000 psig + Master Value 4 18.000 psig + Master Value 5 24.000 psig + Master Value 6 30.000 psig + Verify Date 07/12/2022 + Verify Time 09:13:02 + + + Test Port 4 + =========================================================== + + + Mass Flow Trans + =========================================================== + Transducer Custom + Input AIN 8 + Setpoint Pressure 1 25.000 psig + Setpoint Pressure 2 25.000 psig + Setpoint Pressure 3 25.000 psig + Setpoint Pressure 4 25.000 psig + Setpoint Pressure 5 25.000 psig + Setpoint Pressure 6 25.000 psig + Analog Value 1 8684522 cnts + Analog Value 2 9881552 cnts + Analog Value 3 11081720 cnts + Analog Value 4 12240018 cnts + Analog Value 5 13413541 cnts + Analog Value 6 14535797 cnts + Master Value 1 0.000 sccm + Master Value 2 4.090 sccm + Master Value 3 8.134 sccm + Master Value 4 12.132 sccm + Master Value 5 16.121 sccm + Master Value 6 19.984 sccm + Linearity 0.194 % + Last Cal Date 12/07/2020 + Last Cal Time 11:27:27 + Xdcr Filter Code Median + Xdcr Typ Residual 13.000 + Xdcr Zero LL 0.000 cnts + Xdcr Zero HL 0.000 cnts + Xdcr Zero Lwin 0.000 + Xdcr Zero Hwin 0.000 + Xdcr Analog Min 0.000 cnts + Xdcr Analog Max 0.000 cnts + Xdcr Base Min 0.000 + Xdcr Base Max 0.000 + Setpoint Pressure 1 5.800 psig + Setpoint Pressure 2 5.800 psig + Setpoint Pressure 3 5.800 psig + Setpoint Pressure 4 5.800 psig + Setpoint Pressure 5 5.800 psig + Setpoint Pressure 6 5.800 psig + Instrument Pressure 1 5.835 psig + Instrument Pressure 2 5.837 psig + Instrument Pressure 3 5.839 psig + Instrument Pressure 4 5.841 psig + Instrument Pressure 5 5.841 psig + Instrument Pressure 6 5.841 psig + Instrument Flow 1 -0.002 sccm + Instrument Flow 2 4.051 sccm + Instrument Flow 3 7.989 sccm + Instrument Flow 4 12.073 sccm + Instrument Flow 5 16.013 sccm + Instrument Flow 6 20.043 sccm + Master Value 1 0.000 sccm + Master Value 2 4.000 sccm + Master Value 3 8.000 sccm + Master Value 4 12.000 sccm + Master Value 5 16.000 sccm + Master Value 6 20.000 sccm + Master Reading 1 0.000 sccm + Master Reading 2 4.000 sccm + Master Reading 3 8.000 sccm + Master Reading 4 12.000 sccm + Master Reading 5 16.000 sccm + Master Reading 6 20.000 sccm + Verify Date 07/12/2022 + Verify Time 11:26:40 + + + Pressure Transducer + =========================================================== + Transducer CTS D34-441 45PSIA + Input AIN 7 + Setpoint Pressure 1 0.000 psig + Setpoint Pressure 2 6.000 psig + Setpoint Pressure 3 12.000 psig + Setpoint Pressure 4 18.000 psig + Setpoint Pressure 5 24.000 psig + Setpoint Pressure 6 30.000 psig + Analog Value 1 10046563 cnts + Analog Value 2 10762536 cnts + Analog Value 3 11476853 cnts + Analog Value 4 12189519 cnts + Analog Value 5 12900160 cnts + Analog Value 6 13609169 cnts + Master Value 1 0.000 psig + Master Value 2 6.000 psig + Master Value 3 12.000 psig + Master Value 4 18.000 psig + Master Value 5 24.000 psig + Master Value 6 30.000 psig + XDCR Analog ATM 10046626 + Atm Pressure 0.000 bar + Linearity 0.083 % + Last Cal Date 07/12/2022 + Last Cal Time 08:57:20 + Xdcr Filter Code Med, J-Filter + Xdcr Typ Residual 138.000 + Xdcr Zero LL 9654557.000 cnts + Xdcr Zero HL 10485333.000 cnts + Xdcr Zero Lwin -2.499 psig + Xdcr Zero Hwin 2.501 psig + Xdcr Analog Min 5699952.000 cnts + Xdcr Analog Max 15110248.000 cnts + Xdcr Base Min -4294967.000 + Xdcr Base Max 8589935.000 + Setpoint Pressure 1 0.000 psig + Setpoint Pressure 2 6.000 psig + Setpoint Pressure 3 12.000 psig + Setpoint Pressure 4 18.000 psig + Setpoint Pressure 5 24.000 psig + Setpoint Pressure 6 30.000 psig + Instrument Pressure 1 -0.000 psig + Instrument Pressure 2 5.999 psig + Instrument Pressure 3 11.999 psig + Instrument Pressure 4 17.998 psig + Instrument Pressure 5 23.997 psig + Instrument Pressure 6 29.997 psig + Master Value 1 0.000 psig + Master Value 2 6.000 psig + Master Value 3 12.000 psig + Master Value 4 18.000 psig + Master Value 5 24.000 psig + Master Value 6 30.000 psig + Verify Date 07/12/2022 + Verify Time 09:04:54 diff --git a/notes.txt b/notes.txt new file mode 100644 index 0000000..865ae6f --- /dev/null +++ b/notes.txt @@ -0,0 +1,45 @@ +TRANSDUCER\d - array of TRANSDUCERS +- Instrument Pressure \d # As Found +- Master Value \d # Gauge Reading Set Point +- Note: IP1 = MV1 + +Once selected, prompt for "As Found", "As Left", or "Both" +- If as left, proppt for as found file. etc etc. +- If both, continue on with logic. + +If Transducer Name contains "CUSTOM" - prompt for the name in an input box (change to Type) +Part Number: "CTS A12-221" Value "250CCM" + +Data to always enter in +- Instrument +- Customer Name +- Customer Address +- Control Number +- Serial Number +- Accuracy (once, but applies to the full List) +- Barometric Pressure +- Temperature +- Humidity + + +Auto Data +- Date [Verify Date] +- Part Number "middle number from Part Name/Type variable" + + +Calculations: etc +- High Limit/ Low Limit eg: (SPAN*1.0005 + column) (SPAN*0.9995 - column) +- Delta = abs(gauge reading) - abs(asleft|asfound) +- PSIA - PRESSURE +- SCCM - FLOW +- TRANSDUCER1 Will ALWAYS be pressure + +CONFIG: +- Mensor Numbers etc + - Cal device, cal serial, Cal cal date, cal due date + + +# HARDWARE CALIBRATION + - "Mass Flow Trans" look at `Instrument Flow` and `Master Reading` + - "Pressure Transducer" `Instrument Pressure` and `Master Value` +- Always take the SECOND `Master Value` diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d6d7fa6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +django +psycopg2 +django-debug-toolbar \ No newline at end of file diff --git a/transducer_verify.txt b/transducer_verify.txt new file mode 100644 index 0000000..596e282 --- /dev/null +++ b/transducer_verify.txt @@ -0,0 +1,85 @@ +|| Transducer Verify Report || +TRANSDUCER1 +=============================================================== +Transducer 1 CTS D34-442 115PSIA +Setpoint Pressure 1 0.000 psig +Setpoint Pressure 2 20.000 psig +Setpoint Pressure 3 40.000 psig +Setpoint Pressure 4 60.000 psig +Setpoint Pressure 5 80.000 psig +Setpoint Pressure 6 100.000 psig +Instrument Pressure 1 0.000 psig +Instrument Pressure 2 20.002 psig +Instrument Pressure 3 39.997 psig +Instrument Pressure 4 60.010 psig +Instrument Pressure 5 80.001 psig +Instrument Pressure 6 100.002 psig +Master Value 1 0.000 psig +Master Value 2 20.000 psig +Master Value 3 40.000 psig +Master Value 4 60.000 psig +Master Value 5 80.000 psig +Master Value 6 100.000 psig +Verify Date 07/20/22 +Verify Time 11:20:26 + +TRANSDUCER2 +=============================================================== +Transducer 2 CTS A12-221 250SCCM +Setpoint Pressure 1 20.000 psig +Setpoint Pressure 2 20.000 psig +Setpoint Pressure 3 20.000 psig +Setpoint Pressure 4 20.000 psig +Setpoint Pressure 5 20.000 psig +Setpoint Pressure 6 20.000 psig +Setpoint Pressure 7 20.000 psig +Setpoint Pressure 8 20.000 psig +Setpoint Pressure 9 20.000 psig +Setpoint Pressure 10 20.000 psig +Setpoint Pressure 11 20.000 psig +Instrument Pressure 1 20.154 psig +Instrument Pressure 2 20.153 psig +Instrument Pressure 3 20.152 psig +Instrument Pressure 4 20.150 psig +Instrument Pressure 5 20.148 psig +Instrument Pressure 6 20.145 psig +Instrument Pressure 7 20.144 psig +Instrument Pressure 8 20.141 psig +Instrument Pressure 9 20.139 psig +Instrument Pressure 10 20.138 psig +Instrument Pressure 11 20.136 psig +Instrument Flow 1 -0.082 sccm +Instrument Flow 2 24.802 sccm +Instrument Flow 3 49.664 sccm +Instrument Flow 4 74.836 sccm +Instrument Flow 5 99.416 sccm +Instrument Flow 6 125.289 sccm +Instrument Flow 7 150.205 sccm +Instrument Flow 8 175.290 sccm +Instrument Flow 9 200.165 sccm +Instrument Flow 10 224.748 sccm +Instrument Flow 11 249.825 sccm +Master Reading 1 0.000 sccm +Master Reading 2 25.000 sccm +Master Reading 3 50.000 sccm +Master Reading 4 75.000 sccm +Master Reading 5 100.000 sccm +Master Reading 6 125.000 sccm +Master Reading 7 150.000 sccm +Master Reading 8 175.000 sccm +Master Reading 9 200.000 sccm +Master Reading 10 225.000 sccm +Master Reading 11 250.000 sccm +Master Value 1 0.000 sccm +Master Value 2 25.000 sccm +Master Value 3 50.000 sccm +Master Value 4 75.000 sccm +Master Value 5 100.000 sccm +Master Value 6 125.000 sccm +Master Value 7 150.000 sccm +Master Value 8 175.000 sccm +Master Value 9 200.000 sccm +Master Value 10 225.000 sccm +Master Value 11 250.000 sccm +Verify Date 07/15/21 +Verify Time 14:55:10