Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ts2_screens.py 3.94 KiB
import epics
import json
import time
import sys
import pandas
import requests
import datetime
from threading import Thread


class ts2_screensScreen(Thread):
    def __init__(self, stop_signal):
        Thread.__init__(self)
        self.stop_signal = stop_signal

    def run(self):
        pvs = [
            "CrS-TICP:Cryo-TE-31491:Val",
            "TS2-010CDL:Cryo-TE-82313:MeasValue",
            "TS2-010CDL:Cryo-TE-82360:MeasValue",
            "TS2-010CRM:Cryo-TE-068:MeasValue",
            #            "TS2-010CRM:Cryo-TE-063:MeasValue",
            "TS2-010CRM:Cryo-TE-069:MeasValue",
            "TS2-010CRM:Cryo-TE-064:MeasValue",
            "TS2-010CDL:Cryo-TE-82365:MeasValue",
            "TS2-010CDL:Cryo-TE-82314:MeasValue",
            "CrS-TICP:Cryo-TE-31492:Val",
        ]
        intervals = {"2w": 24 * 14, "1w": 24 * 7, "2d": 24 * 2, "1d": 24, "live": 1}

        epics_dict = {}
        for pv in pvs:
            epics_dict[pv] = epics.PV(pv, auto_monitor=True)

        counter = 0
        while not self.stop_signal.isSet():
            try:
                if counter % 100 == 0:
                    json_dict = {}
                    final_data = {}
                    for pv in epics_dict:
                        json_dict[pv] = {}
                        for interval in intervals:
                            start_date = (
                                datetime.datetime.now()
                                - datetime.timedelta(hours=intervals[interval])
                            ).isoformat() + "Z"
                            end_date = datetime.datetime.now().isoformat() + "Z"
                            url = "http://archiver-01.tn.esss.lu.se:17668/retrieval/data/getData.json?pv=ncount({})&from={}&to={}".format(
                                pv, start_date, end_date
                            )
                            entries = int(requests.get(url).json()[0]["data"][0]["val"])
                            url = "http://archiver-01.tn.esss.lu.se:17668/retrieval/data/getData.json?pv=nth_{}({})&from={}&to={}".format(
                                int(entries // 100), pv, start_date, end_date
                            )
                            r = requests.get(url).json()[0]["data"]
                            raw_data = pandas.DataFrame.from_dict(r)
                            final_data[interval] = raw_data
                            json_dict[pv][interval] = list(
                                zip(
                                    (final_data[interval]["secs"] * 1000).astype("int")
                                    + (final_data[interval]["nanos"] / 1e6).astype(
                                        "int"
                                    ),
                                    round(final_data[interval]["val"], 3),
                                )
                            )
                    counter = 0

                for pv in epics_dict:
                    if epics_dict[pv].connected:
                        value = epics_dict[pv].value
                        timestamp = int(epics_dict[pv].timestamp * 1000)
                        if (
                            type(value) == float
                            and timestamp != json_dict[pv]["live"][-1][0]
                        ):
                            json_dict[pv]["live"] = json_dict[pv]["live"][1:]
                            json_dict[pv]["live"].append((timestamp, round(value, 3)))

                tmp_json = json.dumps(json_dict)
                tmp_json = tmp_json.replace("NaN", "0")
                tmp_json = tmp_json.replace("Infinity", "0")
                with open("/var/www/data/ts2_screens.json", "w") as datafile:
                    datafile.write(tmp_json)
            except Exception:
                print(sys.exc_info())
                time.sleep(1)
            time.sleep(36)
            counter += 1

        for pv in epics_dict:
            epics_dict[pv].clear_auto_monitor()
            epics_dict[pv].disconnect()