diff --git a/devices/toolkit/archiver.py b/devices/toolkit/archiver.py index 1b48f3a1642b15eb9599737d75f4fbe1ea050a8c..942fcf2e219ad389d97a3250db4630d9da6cd8ec 100644 --- a/devices/toolkit/archiver.py +++ b/devices/toolkit/archiver.py @@ -112,8 +112,6 @@ def get_attribute_value_by_hours(attribute_fqname: str, hours: float = 1.0): join(Attribute,Attribute.att_conf_id==base_class.att_conf_id).\ filter(and_(Attribute.att_conf_id == attr_id,base_class.data_time >= time_delta_db, \ base_class.data_time <= time_now_db)).order_by(base_class.data_time).all() - #timestamp = [item[0].strftime("%Y-%m-%d %X:%f") for item in result] - #value = [item[1] for item in result] return result def get_attribute_value_by_interval(attribute_fqname: str, start_time: datetime, stop_time: datetime): @@ -132,6 +130,4 @@ def get_attribute_value_by_interval(attribute_fqname: str, start_time: datetime, join(Attribute,Attribute.att_conf_id==base_class.att_conf_id).\ filter(and_(Attribute.att_conf_id == attr_id,base_class.data_time >= str(start_time), \ base_class.data_time <= str(stop_time))).order_by(base_class.data_time).all() - #timestamp = [item[0].strftime("%Y-%m-%d %X:%f") for item in result] - #value = [item[1] for item in result] return result diff --git a/devices/toolkit/archiver_base.py b/devices/toolkit/archiver_base.py index 4815591e4fb9c3988dd327ee79e9ba6e7717ce95..d927d4315c31a30fe66db57676f97a6a37ad0706 100644 --- a/devices/toolkit/archiver_base.py +++ b/devices/toolkit/archiver_base.py @@ -1,17 +1,18 @@ #! /usr/bin/env python3 +from sqlalchemy.dialects.mysql.types import INTEGER from sqlalchemy.orm import declarative_base from sqlalchemy import Column, Integer, String -from sqlalchemy.dialects.mysql import DOUBLE,TIMESTAMP +from sqlalchemy.dialects.mysql import DOUBLE,TIMESTAMP,BLOB, FLOAT, BIGINT from sqlalchemy.sql.expression import table #Declarative system used to define classes mapped to relational DB tables Base = declarative_base() class Attribute(Base): - ''' + """ Class that represents a Tango Attribute mapped to table 'att_conf' - ''' + """ __tablename__ = 'att_conf' __table_args__ = {'extend_existing': True} @@ -31,9 +32,9 @@ class Attribute(Base): % (self.att_name,self.att_conf_data_type_id,self.att_ttl,self.facility,self.domain,self.family,self.member,self.name) class DataType(Base): - ''' + """ Class that represents a Tango Data Type mapped to table 'att_conf_data_type' - ''' + """ __tablename__ = 'att_conf_data_type' __table_args__ = {'extend_existing': True} @@ -44,28 +45,322 @@ class DataType(Base): return "<DataType(type='%s')>" \ % (self.data_type) -class Scalar_Double_RO(Base): - ''' - Class that represents a Tango Scalar Read-Only Value mapped to table 'att_scalar_devdouble_ro' - ''' - __tablename__ = 'att_scalar_devdouble_ro' - __table_args__ = {'extend_existing': True} - # Primary key is not defined for this kind of tables, but SQLAlchemy requires a mandatory +class Scalar(Base): + """ + Abstract class that represents Super-class of Scalar mapper classes + """ + __abstract__ = True + # Primary key is not defined for tables which store values, but SQLAlchemy requires a mandatory # primary key definition. Anyway, this definition is on Python-side and does not compromise # DBMS architecture - att_conf_id = Column(Integer, primary_key=True) data_time = Column(TIMESTAMP) recv_time = Column(TIMESTAMP) insert_time = Column(TIMESTAMP, primary_key=True) - value_r = Column(DOUBLE, primary_key=True) quality = Column(Integer) att_error_desc_id = Column(Integer) +class Scalar_Boolean(Scalar): + """ + Abstract class that represents Parent class of Scalar Boolean mapper classes + """ + __abstract__ = True + value_r = Column(Integer) + +class Scalar_Boolean_RO(Scalar_Boolean): + """ + Class that represents a Tango Scalar Read-Only Value mapped to table 'att_scalar_devdouble_ro' + """ + __tablename__ = 'att_scalar_devboolean_ro' + __table_args__ = {'extend_existing': True} + + def __repr__(self): + return "<Scalar_Boolean_RO(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.quality,self.att_error_desc_id) + +class Scalar_Boolean_RW(Scalar_Boolean): + """ + Class that represents a Tango Scalar Read-Write Value mapped to table 'att_scalar_devdouble_rw' + """ + __tablename__ = 'att_scalar_devboolean_rw' + __table_args__ = {'extend_existing': True} + value_w = Column(Integer) + + def __repr__(self): + return "<Scalar_Boolean_RW(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',value_w='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.value_w,self.quality,self.att_error_desc_id) + +class Scalar_Double(Scalar): + """ + Abstract class that represents Parent class of Scalar Double mapper classes + """ + __abstract__ = True + value_r = Column(DOUBLE) + +class Scalar_Double_RO(Scalar_Double): + """ + Class that represents a Tango Scalar Read-Only Value mapped to table 'att_scalar_devdouble_ro' + """ + __tablename__ = 'att_scalar_devdouble_ro' + __table_args__ = {'extend_existing': True} + def __repr__(self): return "<Scalar_Double_RO(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',quality='%s',att_error_desc_id='%s')>" \ % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.quality,self.att_error_desc_id) +class Scalar_Double_RW(Scalar_Double): + """ + Class that represents a Tango Scalar Read-Write Value mapped to table 'att_scalar_devdouble_rw' + """ + __tablename__ = 'att_scalar_devdouble_rw' + __table_args__ = {'extend_existing': True} + value_w = Column(DOUBLE) + + def __repr__(self): + return "<Scalar_Double_RW(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',value_w='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.value_w,self.quality,self.att_error_desc_id) + +class Scalar_Encoded(Scalar): + """ + Abstract class that represents Parent class of Scalar Encoded mapper classes + """ + __abstract__ = True + value_r = Column(BLOB) + +class Scalar_Encoded_RO(Scalar_Encoded): + """ + Class that represents a Tango Scalar Read-Only Value mapped to table 'att_scalar_devencoded_ro' + """ + __tablename__ = 'att_scalar_devencoded_ro' + __table_args__ = {'extend_existing': True} + + def __repr__(self): + return "<Scalar_Encoded_RO(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.quality,self.att_error_desc_id) + +class Scalar_Encoded_RW(Scalar_Encoded): + """ + Class that represents a Tango Scalar Read-Write Value mapped to table 'att_scalar_devencoded_rw' + """ + __tablename__ = 'att_scalar_devencoded_rw' + __table_args__ = {'extend_existing': True} + value_w = Column(BLOB) + + def __repr__(self): + return "<Scalar_Encoded_RW(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',value_w='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.value_w,self.quality,self.att_error_desc_id) + +class Scalar_Enum(Scalar): + """ + Abstract class that represents Parent class of Scalar Enum mapper classes + """ + __abstract__ = True + value_r = Column(Integer) + +class Scalar_Enum_RO(Scalar_Enum): + """ + Class that represents a Tango Scalar Read-Only Value mapped to table 'att_scalar_devenum_ro' + """ + __tablename__ = 'att_scalar_devenum_ro' + __table_args__ = {'extend_existing': True} + + def __repr__(self): + return "<Scalar_Enum_RO(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.quality,self.att_error_desc_id) + +class Scalar_Enum_RW(Scalar_Enum): + """ + Class that represents a Tango Scalar Read-Write Value mapped to table 'att_scalar_devenum_rw' + """ + __tablename__ = 'att_scalar_devenum_rw' + __table_args__ = {'extend_existing': True} + value_w = Column(Integer) + + def __repr__(self): + return "<Scalar_Enum_RW(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',value_w='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.value_w,self.quality,self.att_error_desc_id) + +class Scalar_Float(Scalar): + """ + Abstract class that represents Parent class of Scalar Float mapper classes + """ + __abstract__ = True + value_r = Column(FLOAT) + +class Scalar_Float_RO(Scalar_Float): + """ + Class that represents a Tango Scalar Read-Only Value mapped to table 'att_scalar_devfloat_ro' + """ + __tablename__ = 'att_scalar_devfloat_ro' + __table_args__ = {'extend_existing': True} + + def __repr__(self): + return "<Scalar_Float_RO(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.quality,self.att_error_desc_id) + +class Scalar_Float_RW(Scalar_Float): + """ + Class that represents a Tango Scalar Read-Write Value mapped to table 'att_scalar_devfloat_rw' + """ + __tablename__ = 'att_scalar_devfloat_rw' + __table_args__ = {'extend_existing': True} + value_w = Column(FLOAT) + + def __repr__(self): + return "<Scalar_Float_RW(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',value_w='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.value_w,self.quality,self.att_error_desc_id) + +class Scalar_Long64(Scalar): + """ + Abstract class that represents Parent class of Scalar Long64 mapper classes + """ + __abstract__ = True + value_r = Column(BIGINT) + +class Scalar_Long64_RO(Scalar_Long64): + """ + Class that represents a Tango Scalar Read-Only Value mapped to table 'att_scalar_devlong64_ro' + """ + __tablename__ = 'att_scalar_devlong64_ro' + __table_args__ = {'extend_existing': True} + + def __repr__(self): + return "<Scalar_Long64_RO(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.quality,self.att_error_desc_id) + +class Scalar_Long64_RW(Scalar_Long64): + """ + Class that represents a Tango Scalar Read-Write Value mapped to table 'att_scalar_devlong64_rw' + """ + __tablename__ = 'att_scalar_devlong64_rw' + __table_args__ = {'extend_existing': True} + value_w = Column(BIGINT) + + def __repr__(self): + return "<Scalar_Long64_RW(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',value_w='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.value_w,self.quality,self.att_error_desc_id) + +class Scalar_Long(Scalar): + """ + Abstract class that represents Parent class of Scalar Long mapper classes + """ + __abstract__ = True + value_r = Column(INTEGER) + +class Scalar_Long_RO(Scalar_Long): + """ + Class that represents a Tango Scalar Read-Only Value mapped to table 'att_scalar_devlong_ro' + """ + __tablename__ = 'att_scalar_devlong_ro' + __table_args__ = {'extend_existing': True} + + def __repr__(self): + return "<Scalar_Long_RO(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.quality,self.att_error_desc_id) + +class Scalar_Long_RW(Scalar_Long): + """ + Class that represents a Tango Scalar Read-Write Value mapped to table 'att_scalar_devlong_rw' + """ + __tablename__ = 'att_scalar_devlong_rw' + __table_args__ = {'extend_existing': True} + value_w = Column(INTEGER) + + def __repr__(self): + return "<Scalar_Long_RW(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',value_w='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.value_w,self.quality,self.att_error_desc_id) + +class Scalar_Short(Scalar): + """ + Abstract class that represents Parent class of Scalar Short mapper classes + """ + __abstract__ = True + value_r = Column(Integer) + +class Scalar_Short_RO(Scalar_Short): + """ + Class that represents a Tango Scalar Read-Only Value mapped to table 'att_scalar_devshort_ro' + """ + __tablename__ = 'att_scalar_devshort_ro' + __table_args__ = {'extend_existing': True} + + def __repr__(self): + return "<Scalar_Short_RO(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.quality,self.att_error_desc_id) + +class Scalar_Short_RW(Scalar_Short): + """ + Class that represents a Tango Scalar Read-Write Value mapped to table 'att_scalar_devshort_rw' + """ + __tablename__ = 'att_scalar_devshort_rw' + __table_args__ = {'extend_existing': True} + value_w = Column(Integer) + + def __repr__(self): + return "<Scalar_Short_RW(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',value_w='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.value_w,self.quality,self.att_error_desc_id) + +class Scalar_State(Scalar): + """ + Abstract class that represents Parent class of Scalar State mapper classes + """ + __abstract__ = True + value_r = Column(Integer) + +class Scalar_State_RO(Scalar_State): + """ + Class that represents a Tango Scalar Read-Only Value mapped to table 'att_scalar_devstate_ro' + """ + __tablename__ = 'att_scalar_devstate_ro' + __table_args__ = {'extend_existing': True} + + def __repr__(self): + return "<Scalar_State_RO(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.quality,self.att_error_desc_id) + +class Scalar_State_RW(Scalar_State): + """ + Class that represents a Tango Scalar Read-Write Value mapped to table 'att_scalar_devstate_rw' + """ + __tablename__ = 'att_scalar_devstate_rw' + __table_args__ = {'extend_existing': True} + value_w = Column(Integer) + + def __repr__(self): + return "<Scalar_State_RW(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',value_w='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.value_w,self.quality,self.att_error_desc_id) + +class Scalar_String(Scalar): + """ + Abstract class that represents Parent class of Scalar String mapper classes + """ + __abstract__ = True + value_r = Column(String) + +class Scalar_String_RO(Scalar_String): + """ + Class that represents a Tango Scalar Read-Only Value mapped to table 'att_scalar_devstring_ro' + """ + __tablename__ = 'att_scalar_devstring_ro' + __table_args__ = {'extend_existing': True} + + def __repr__(self): + return "<Scalar_String_RO(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.quality,self.att_error_desc_id) + +class Scalar_String_RW(Scalar_String): + """ + Class that represents a Tango Scalar Read-Write Value mapped to table 'att_scalar_devstring_rw' + """ + __tablename__ = 'att_scalar_devstring_rw' + __table_args__ = {'extend_existing': True} + value_w = Column(String) + + def __repr__(self): + return "<Scalar_String_RW(att_conf_id='%s',data_time='%s',recv_time='%s',insert_time='%s',value_r='%s',value_w='%s',quality='%s',att_error_desc_id='%s')>" \ + % (self.att_conf_id,self.data_time,self.recv_time,self.insert_time,self.value_r,self.value_w,self.quality,self.att_error_desc_id) + + def get_class_by_tablename(tablename: str): """ Returns class reference mapped to a table. diff --git a/jupyter-notebooks/archiving_test_v2.ipynb b/jupyter-notebooks/archiving_test_v2.ipynb index dd6101f97e192d3d56ee4ed9e5aa145a1d4fa6d2..3e61e9273cd34a0695ad3d8772eb124e2e2b25c6 100644 --- a/jupyter-notebooks/archiving_test_v2.ipynb +++ b/jupyter-notebooks/archiving_test_v2.ipynb @@ -9,17 +9,28 @@ "source": [ "import sys\n", "sys.path.append('/hosthome/tango/devices')\n", - "from util.archiver import *\n", - "from util.archiver_base import *\n", + "from toolkit.archiver import *\n", + "from toolkit.archiver_base import *\n", "import mysql.connector" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "57834b5e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['rnd1', 'rnd2', 'rnd3', 'rnd4', 'rnd5', 'rnd6', 'rnd7', 'rnd8', 'rnd9', 'rnd10', 'rnd11', 'rnd12', 'rnd13', 'rnd14', 'rnd15', 'rnd16', 'rnd17', 'rnd18', 'rnd19', 'rnd20', 'State', 'Status']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "dev_rand = DeviceProxy(\"LTS/RandomData/1\")\n", "dev_rand.get_attribute_list()" @@ -27,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "6816f78f", "metadata": {}, "outputs": [], @@ -37,50 +48,62 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "7bda559b", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[<Attribute(fullname='tango://databaseds:10000/lts/randomdata/1/rnd1',data_type ='37',ttl='0',facility ='tango://databaseds:10000',domain ='lts',family ='randomdata',member ='1',name ='rnd1')>,\n", + " <Attribute(fullname='tango://databaseds:10000/lts/randomdata/1/rnd3',data_type ='37',ttl='0',facility ='tango://databaseds:10000',domain ='lts',family ='randomdata',member ='1',name ='rnd3')>]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "get_all_archived_attributes()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "f0ef38a4", "metadata": {}, "outputs": [], "source": [ - "add_attribute_to_archiver('lts/randomdata/1/rnd7',3000,1000)" + "attr_fullname = 'lts/randomdata/1/rnd5'\n", + "add_attribute_to_archiver(attr_fullname,1000,1000)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "7d0746e7", "metadata": {}, "outputs": [], "source": [ - "remove_attribute_from_archiver('lts/randomdata/1/rnd7')" + "remove_attribute_from_archiver(attr_fullname)" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "id": "129a75c6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[<Attribute(fullname='tango://databaseds:10000/lts/randomdata/1/rnd2',data_type ='37',ttl='0',facility ='tango://databaseds:10000',domain ='lts',family ='randomdata',member ='1',name ='rnd2')>,\n", + "[<Attribute(fullname='tango://databaseds:10000/lts/randomdata/1/rnd1',data_type ='37',ttl='0',facility ='tango://databaseds:10000',domain ='lts',family ='randomdata',member ='1',name ='rnd1')>,\n", " <Attribute(fullname='tango://databaseds:10000/lts/randomdata/1/rnd3',data_type ='37',ttl='0',facility ='tango://databaseds:10000',domain ='lts',family ='randomdata',member ='1',name ='rnd3')>,\n", - " <Attribute(fullname='tango://databaseds:10000/lts/randomdata/1/rnd15',data_type ='37',ttl='0',facility ='tango://databaseds:10000',domain ='lts',family ='randomdata',member ='1',name ='rnd15')>,\n", - " <Attribute(fullname='tango://databaseds:10000/lts/randomdata/1/rnd7',data_type ='37',ttl='0',facility ='tango://databaseds:10000',domain ='lts',family ='randomdata',member ='1',name ='rnd7')>]" + " <Attribute(fullname='tango://databaseds:10000/lts/randomdata/1/rnd5',data_type ='37',ttl='0',facility ='tango://databaseds:10000',domain ='lts',family ='randomdata',member ='1',name ='rnd5')>]" ] }, - "execution_count": 2, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -91,29 +114,29 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "id": "5f9865ee", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "4" + "3" ] }, - "execution_count": 3, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "main_att = 'lts/randomdata/1/rnd7'\n", + "main_att = 'lts/randomdata/1/rnd5'\n", "get_attribute_id(main_att)" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 9, "id": "2a3707a3", "metadata": {}, "outputs": [ @@ -123,7 +146,7 @@ "'scalar_devdouble_ro'" ] }, - "execution_count": 4, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -134,29 +157,27 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "id": "18100623", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[<Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:21.892781',recv_time='2021-06-23 15:00:23.040862',insert_time='2021-06-23 15:00:23.042065',value_r='0.9263038657',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:24.909897',recv_time='2021-06-23 15:00:24.911329',insert_time='2021-06-23 15:00:24.912696',value_r='0.6869173892',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:27.909636',recv_time='2021-06-23 15:00:27.910767',insert_time='2021-06-23 15:00:27.912330',value_r='0.1070759253',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:30.909940',recv_time='2021-06-23 15:00:30.911529',insert_time='2021-06-23 15:00:30.913542',value_r='0.2699634793',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:33.910365',recv_time='2021-06-23 15:00:33.910897',insert_time='2021-06-23 15:00:33.911735',value_r='0.8323236082',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:36.910232',recv_time='2021-06-23 15:00:36.911389',insert_time='2021-06-23 15:00:36.912912',value_r='0.7979368397',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:39.909182',recv_time='2021-06-23 15:00:39.909785',insert_time='2021-06-23 15:00:39.910372',value_r='0.2178505902',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:42.909868',recv_time='2021-06-23 15:00:42.911390',insert_time='2021-06-23 15:00:42.913124',value_r='0.6949464171',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:45.909946',recv_time='2021-06-23 15:00:45.911036',insert_time='2021-06-23 15:00:45.912787',value_r='0.1093199257',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:48.909615',recv_time='2021-06-23 15:00:48.910722',insert_time='2021-06-23 15:00:48.912259',value_r='0.9768430390',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:51.909200',recv_time='2021-06-23 15:00:51.910290',insert_time='2021-06-23 15:00:51.911793',value_r='0.8888621550',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:54.909296',recv_time='2021-06-23 15:00:54.910679',insert_time='2021-06-23 15:00:54.912332',value_r='0.3799629383',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='4',data_time='2021-06-23 15:00:57.909804',recv_time='2021-06-23 15:00:57.910850',insert_time='2021-06-23 15:00:57.912311',value_r='0.7681945847',quality='2',att_error_desc_id='None')>]" + "[<Scalar_Double_RO(att_conf_id='3',data_time='2021-06-25 15:24:07.119788',recv_time='2021-06-25 15:24:07.930917',insert_time='2021-06-25 15:24:07.932652',value_r='0.2033680434',quality='2',att_error_desc_id='None')>,\n", + " <Scalar_Double_RO(att_conf_id='3',data_time='2021-06-25 15:24:08.120465',recv_time='2021-06-25 15:24:08.124548',insert_time='2021-06-25 15:24:08.127058',value_r='0.9330212368',quality='2',att_error_desc_id='None')>,\n", + " <Scalar_Double_RO(att_conf_id='3',data_time='2021-06-25 15:24:09.120343',recv_time='2021-06-25 15:24:09.123946',insert_time='2021-06-25 15:24:09.126367',value_r='0.1619766261',quality='2',att_error_desc_id='None')>,\n", + " <Scalar_Double_RO(att_conf_id='3',data_time='2021-06-25 15:24:10.120398',recv_time='2021-06-25 15:24:10.123090',insert_time='2021-06-25 15:24:10.125112',value_r='0.1600708165',quality='2',att_error_desc_id='None')>,\n", + " <Scalar_Double_RO(att_conf_id='3',data_time='2021-06-25 15:24:11.120518',recv_time='2021-06-25 15:24:11.123866',insert_time='2021-06-25 15:24:11.125772',value_r='0.1953627874',quality='2',att_error_desc_id='None')>,\n", + " <Scalar_Double_RO(att_conf_id='3',data_time='2021-06-25 15:24:12.120626',recv_time='2021-06-25 15:24:12.123934',insert_time='2021-06-25 15:24:12.126119',value_r='0.4233485985',quality='2',att_error_desc_id='None')>,\n", + " <Scalar_Double_RO(att_conf_id='3',data_time='2021-06-25 15:24:13.120682',recv_time='2021-06-25 15:24:13.123542',insert_time='2021-06-25 15:24:13.125435',value_r='0.1744663070',quality='2',att_error_desc_id='None')>,\n", + " <Scalar_Double_RO(att_conf_id='3',data_time='2021-06-25 15:24:14.120714',recv_time='2021-06-25 15:24:14.123980',insert_time='2021-06-25 15:24:14.126306',value_r='0.9820536486',quality='2',att_error_desc_id='None')>,\n", + " <Scalar_Double_RO(att_conf_id='3',data_time='2021-06-25 15:24:15.120239',recv_time='2021-06-25 15:24:15.122162',insert_time='2021-06-25 15:24:15.123428',value_r='0.9547788992',quality='2',att_error_desc_id='None')>,\n", + " <Scalar_Double_RO(att_conf_id='3',data_time='2021-06-25 15:24:16.120990',recv_time='2021-06-25 15:24:16.124006',insert_time='2021-06-25 15:24:16.126385',value_r='0.1627633385',quality='2',att_error_desc_id='None')>,\n", + " <Scalar_Double_RO(att_conf_id='3',data_time='2021-06-25 15:24:17.120261',recv_time='2021-06-25 15:24:17.124313',insert_time='2021-06-25 15:24:17.126494',value_r='0.2554102953',quality='2',att_error_desc_id='None')>]" ] }, - "execution_count": 5, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -167,31 +188,112 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 11, "id": "ab476d57", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[<Scalar_Double_RO(att_conf_id='3',data_time='2021-06-21 14:50:06.179562',recv_time='2021-06-21 14:50:07.180444',insert_time='2021-06-21 14:50:07.204869',value_r='0.1400088842',quality='2',att_error_desc_id='None')>,\n", - " <Scalar_Double_RO(att_conf_id='3',data_time='2021-06-21 14:50:10.213110',recv_time='2021-06-21 14:50:10.214549',insert_time='2021-06-21 14:50:10.216117',value_r='0.6627579896',quality='2',att_error_desc_id='None')>]" + "[]" ] }, - "execution_count": 6, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "get_attribute_value_by_interval('lts/randomdata/1/rnd15', '2021-06-21 13:20:00', '2021-06-23 15:21:00')" + "get_attribute_value_by_interval(main_att, '2021-06-21 13:20:00', '2021-06-23 15:21:00')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "21c9b91b", "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Decimal('0.2033680434')" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rows = get_attribute_value_by_hours(main_att,2)\n", + "a = rows[0]\n", + "a.value_r" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "762ea947", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(toolkit.archiver_base.Scalar_Double,)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.__class__.__bases__" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "56b31348", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.2033680434, 0.9330212368, 0.1619766261, 0.1600708165, 0.1953627874, 0.4233485985, 0.174466307, 0.9820536486, 0.9547788992, 0.1627633385, 0.2554102953]\n" + ] + } + ], + "source": [ + "values = [float(item.value_r) for item in rows]\n", + "print(values)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "a26aa8f0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['2021-06-25 15:24:07:930917', '2021-06-25 15:24:08:124548', '2021-06-25 15:24:09:123946', '2021-06-25 15:24:10:123090', '2021-06-25 15:24:11:123866', '2021-06-25 15:24:12:123934', '2021-06-25 15:24:13:123542', '2021-06-25 15:24:14:123980', '2021-06-25 15:24:15:122162', '2021-06-25 15:24:16:124006', '2021-06-25 15:24:17:124313']\n" + ] + } + ], + "source": [ + "timestamps = [item.recv_time.strftime(\"%Y-%m-%d %X:%f\") for item in rows]\n", + "print(timestamps)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2ad3416", + "metadata": {}, "outputs": [], "source": [] }