0 Replies Latest reply on Dec 15, 2014 4:12 AM by TrentTelfer

    Python & PI Code

    TrentTelfer

      I am absolutely shocked that PI doesn't have a python library or R library for data analysis, but that is another discussion altogether. I figured that since it took me a while to figure out how to retrieve data that I should probably share my script so others don't have to go through the pain. This script worked for me with python 2.7.6 and pywin32.

      import time
      from datetime import datetime, timedelta
      from win32com.client import Dispatch
      
      
      def get_pi_avg_data(database, start_time, end_time, pi_tag, interval):
          """
          :param database: DNS name of database as string object.
          :param start_time: Start time of interval as a datetime object.
          :param end_time: End time of interval as a datetime object.
          :param pi_tag: Tag name in PI database as a string object.
          :param interval: Interval of data required as a string object, i.e., 1d (one day), 1h (o                     ne hour).
          :return: Returns a list object as [date(datetime), value(float), quality(float)]
          """
          td_max = timedelta(minutes=15)
          pisdk = Dispatch('PISDK.PISDK')
          my_server = pisdk.Servers(database)
          con = Dispatch('PISDKDlg.Connections')
          con.Login(my_server,
                    '',
                    '',
                    1,
                    0)
          pi_time_start = Dispatch('PITimeServer.PITimeFormat')
          pi_time_end = Dispatch('PITimeServer.PITimeFormat')
          pi_time_start.InputString = start_time.strftime('%m-%d-%Y %H:%M:%S')
          pi_time_end.InputString = end_time.strftime('%m-%d-%Y %H:%M:%S')
          sample_asynch_status = Dispatch('PISDKCommon.PIAsynchStatus')
          sample_point = my_server.PIPoints[pi_tag]
          sample_values = sample_point.Data.Summaries2(pi_time_start,
                                                       pi_time_end,
                                                       interval,
                                                       5,
                                                       0,
                                                       sample_asynch_status)
      
          t0 = datetime.now()
          while True:
              try:
                  valsum = sample_values("Average").Value  # retrieve the value
                  break  # it will get out of infinite loop when there is no error
              except:  # it failed because server needs more time
                  td = datetime.now() - t0
                  if td > td_max:
                      print "It is taking so long to get PI data ! Exiting now ...."
                      exit(1)
                  time.sleep(3)
      
          i = 1
          temp_data = []
          while i < valsum.Count+1:
              dt = datetime.utcfromtimestamp(int(valsum(i).TimeStamp))
              avg_value = valsum(i).Value
              quality = valsum(i).ValueAttributes('Percentgood').Value
              temp_data.append(dt, avg_value, quality)
              i += 1
      
          return temp_data
      

      Credit: http://nquintos.blogspot.ca/2011/01/using-python-to-access-osi-softs-pi.html