본문 바로가기
라즈베리파이

라즈베리파이에 PyScada 설치하고 온도모니터링하기 (1) 소프트웨어설치

by 3Dnote 2020. 4. 9.
반응형
차례

 

Scada란

>Scada는 Supervisory Control And Data Acquisition의 약자로 산업 공정 또는 기반 시설 설비 등을 바탕으로 한 작업공정을 감시하고 제어하는 컴퓨터 시스템을 말한다

Scada는 이더넷이나 시리얼통신 등의 네트워크 기반의 소프트웨어로 구성되는데 일반적으로 소프트웨어의 가격이 매우 비싸서 개인 입장에서는 사실상 사용해 볼 엄두도 내지 못한다.

그러나 요즘 들어서는 오픈소스프로그램이 많이 나오다 보니 Scada 프로그램도 몇몇 오픈 소스방식으로 공개된 것이 있다. 오픈소스방식의 Scada중에서 요즘 내가 공부하려는 Python으로 된 PyScada를 선정하여 이에 대한 공부와 함께 이 글을 정리하고 작성해나가고자 한다.

 

라즈베리파이에 OS설치하기

라즈베리파이에 OS인 라즈비안을 설치하는 과정도 좀 복잡하기 하지만 대부분이 알고 있을 것이라 생각한다.  또 인터넷에 많이 내용이기도 하다.  만약 라즈베리 파이에 OS설치하는 과정에 대해 좀 더 알고 싶다면 아래 링크된 이전 글을 먼저 참고하도록 하자.

2020/04/10 - [IOT/웹서버] - 모니터없이 라즈베리파이 설치하고 원격접속하기

 

모니터없이 라즈베리파이 설치하고 원격접속하기

일년 전에 라즈베리파이를 처음 접하고 인터넷 검색을 통해 어찌 어찌 라즈베리파이에 OS를 설치하고 사용했었다. 일년 지났다고 벌써 기억이 다 지워져서 아무 생각도 안난다. 어렴픗이 기억나는 것은 PC에서 SD..

expertpro.tistory.com

 

라즈베리파이에 OS설치가 다 되었으면 라즈비안에 로그인을 해보자

초기상태의 라즈비안은  ID가 pi이고 Password는 raspberry이다

pi
raspberry

 

로그인한 후에는 라즈비안을 최신으로 업데이트한다

sudo apt-get update
sudo apt-get dist-upgrade

 

 

이제 온도센서와 통신할 1-wire 통신을 할 수 있도록 설정한다

sudo raspi-config

 

 

 

메뉴 5. Interfacing Options를 선택한다

 

테스트를 위해 1-Wire통신방식의 온도모듈을 사용할 것이기 때문에 P7. 1-Wire를 선택하여 사용하겠다고 Yes버튼을 클릭한다

사용의 편리성을 위해 SSH와 VNC도 Enable로 바꾸면 좋다

VNC에 대한 내용은 이 곳 참고.

2020/04/10 - [IOT/웹서버] - 라즈베리파이 VNC로 원격접속하기

 

오류없이 모든 작업이 완료되었으면 라즈베리파이를 재부팅한다.

 

 

PyScada 설치

PyScada 전용 사용자를 만든다

sudo -i
sudo useradd -r pyscada
sudo mkdir -p /var/www/pyscada/http
sudo chown -R pyscada:pyscada /var/www/pyscada
sudo mkdir -p /home/pyscada
sudo chown -R pyscada:pyscada /home/pyscada
sudo ln -s /var/www/pyscada/ ~/www_pyscada

 

Pyscada와 그 의존성을 설치하고 django 프로젝트를 생성한다

sudo apt-get -y install python-pip libhdf5-dev python-dev nginx gunicorn
sudo pip install cython
sudo pip install numpy
sudo export HDF5_DIR=/usr/lib/arm-linux-gnueabihf/hdf5/serial/
sudo pip install h5py
sudo pip install https://github.com/trombastic/PyScada/archive/dev/0.7.x.zip
cd /var/www/pyscada/
sudo -u pyscada django-admin startproject PyScadaServer

 

Configuration 파일 편집

sudo nano /var/www/pyscada/PyScadaServer/PyScadaServer/urls.py

 

아래와 같이 내용을 추가한다

"""PyScadaServer URL Configuration
 
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url, include
from django.contrib import admin
 
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('pyscada.hmi.urls')),
]

 

다음 파일을 편집한다.

sudo nano /var/www/pyscada/PyScadaServer/PyScadaServer/settings.py

 

아래 내용에서 SECRET_KEY만 다르고 나머지는 동일하게 수정한다

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
"""
Django settings for PyScadaServer project.
 
Generated by 'django-admin startproject' using Django 1.11.5.
 
For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/
 
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""
 
import os
 
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
 
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '8*5gy8$$e8&+cka+&a1lz!#_)s*#zooz6d!+7!f*j%z+uxx376'
 
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
 
ALLOWED_HOSTS = ['*']
 
# Application definition
 
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'pyscada',
    'pyscada.modbus',
    'pyscada.phant',
    'pyscada.visa',
    'pyscada.hmi',
    'pyscada.systemstat',
    'pyscada.export',
    'pyscada.onewire'
]
 
MIDDLEWARE = [
    '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 = 'PyScadaServer.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 = 'PyScadaServer.wsgi.application'
 
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
 
# Password validation
# https://docs.djangoproject.com/en/1.11/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/1.11/topics/i18n/
 
LANGUAGE_CODE = 'en-us'
 
TIME_ZONE = 'UTC'
 
USE_I18N = True
 
USE_L10N = True
 
USE_TZ = True
 
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
 
STATIC_URL = '/static/'
 
STATIC_ROOT = '/var/www/pyscada/http/static/'
 
MEDIA_URL = '/media/'
 
MEDIA_ROOT = '/var/www/pyscada/http/media/'
 
# PyScada settings
# https://github.com/trombastic/PyScada
 
# email settings
DEFAULT_FROM_EMAIL = 'example@host.com'
EMAIL_HOST = 'mail.host.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'pyscada@host.com'
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PREFIX = 'PREFIX' # Mail subject will be "PREFIX subjecttext"
 
# meta informations about the plant site
PYSCADA_META = {
        'name':'A SHORT NAME',
        'description':'A SHORT DESCRIPTION',
}
 
# export properties
#
PYSCADA_EXPORT = {
        'file_prefix':'PREFIX_',
        'output_folder':'~/measurement_data_dumps',
}

 

 

PyScada 설치 설정

cd /var/www/pyscada/PyScadaServer
sudo -u pyscada python manage.py migrate
sudo -u pyscada python manage.py collectstatic
sudo -u pyscada python manage.py loaddata color
sudo -u pyscada python manage.py loaddata units

 

위 과정에서 오류가 발생하는 곳이 있으니 소스코드 하나를 수정해야 한다
아마도 Python의 버전차이에서 오는 오류가 아닌가 생각된다

cd /var/www/pyscada/PyScadaServer/PyScadaServer/
sudo nano urls.py

 

이번에는 PyScada에서 사용할 관리자를 생성해보자

sudo -u pyscada python manage.py createsuperuser

 

이 과정에서 나중에 로그인할때 사용할 관리자 이름과 암호, 이메일을 입력해야한다

 

이번에는 ngix를 설정해보도록 하자
ngix는 Apache와 같은 웹서버 프로그램이다

sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/nginx_sample.conf -O /etc/nginx/sites-available/pyscada.conf
sudo nano /etc/nginx/sites-available/pyscada.conf

 

내용는 아래와 같이 수정하되 Servername과 IP address는 자신의 상황에 맞게 수정한다.

# pyscada.conf
 
# the upstream component nginx needs to connect to
upstream app_server {
        server unix:/tmp/gunicorn.sock fail_timeout=0; # for a file socket
        #server 127.0.0.1:8000 fail_timeout=0; # for a file socket
}
 
# configuration of the server
server {
 
        listen 80 default;     # the port your site will be served on
        server_name 192.168.1.14;      # substitute your machine's IP address or                                                                                                                                                              FQDN
        charset utf-8;
        keepalive_timeout 5;
        client_max_body_size 75M;   # max upload size, adjust to taste
 
        # Django media
        location /media  {
                alias /var/www/pyscada/http/media;  # your Django project's medi                                                                                                                                                             a files - amend as required
        }
 
        location /static {
                alias /var/www/pyscada/http/static; # your Django project's stat                                                                                                                                                             ic files - amend as required
        }
        location / {
            # checks for static file, if not found proxy to app
            try_files $uri @proxy_to_app;
        }
 
        location @proxy_to_app {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
 
            proxy_pass   http://app_server;
        }
}

 

 

PyScada nginx사이트를 활성화하고 디폴트값을 제거와 부팅시 nginx 서비스 시작과 nginx  재시작을 한다.

sudo ln -s /etc/nginx/sites-available/pyscada.conf /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo systemctl enable nginx.service
sudo systemctl restart nginx

 

PyScada의 기타 시스템 서비스들을 다운받아서 활성화시킨다

sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/pyscada_daq.service -O /lib/systemd/system/pyscada_daq.service
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/pyscada_event.service -O /lib/systemd/system/pyscada_event.service
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/pyscada_mail.service -O /lib/systemd/system/pyscada_mail.service
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/pyscada_export.service -O /lib/systemd/system/pyscada_export.service
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/gunicorn.socket -O /lib/systemd/system/gunicorn.socket
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/gunicorn.service -O /lib/systemd/system/gunicorn.service
# enable the services
sudo systemctl enable gunicorn
sudo systemctl enable pyscada_daq
sudo systemctl enable pyscada_event
sudo systemctl enable pyscada_mail
sudo systemctl enable pyscada_export

 

** 여기서 몇가지 서비스들에서 오류 발생했슴 (service not exist.)

 

/lib/systemd/system/pyscada_daq.service
/lib/systemd/system/pyscada_event.service
/lib/systemd/system/pyscada_mail.service
/lib/systemd/system/pyscada_export.service
/lib/systemd/system/gunicorn.service

 

 

아래와 같이 파일을 열어서 내용을 약간 편집한다

sudo nano /lib/systemd/system/pyscada_daq.service
sudo nano /lib/systemd/system/pyscada_event.service
sudo nano /lib/systemd/system/pyscada_mail.service
sudo nano /lib/systemd/system/pyscada_export.service
sudo nano /lib/systemd/system/gunicorn.service

 

replace all the %u with pyscada or the username you intend to use

 

 

 

반응형