44# Author: Ian Patterson
55# Contact email: ian@botts-inc.com
66# ==============================================================================
7+ import asyncio
8+ import json
79
810from conSys4Py .core .default_api_helpers import APIHelper
11+ from conSys4Py .datamodels .observations import ObservationOMJSONInline
912
1013from oshconnect .datamodels .datamodels import Node , System
11- from oshconnect .datasource .datasource import DataSource
14+ from oshconnect .datasource .datasource import DataSource , DataSourceHandler
1215from oshconnect .datastore .datastore import DataStore
1316from oshconnect .styling .styling import Styling
1417from oshconnect .timemanagement .timemanagement import TimeManagement
1518
1619
1720class OSHConnect :
1821 _name : str = None
19- datasource : DataSource = None
22+ # datasource: DataSource = None
2023 datastore : DataStore = None
2124 styling : Styling = None
2225 timestream : TimeManagement = None
2326 _nodes : list [Node ] = []
2427 _systems : list [System ] = []
2528 _cs_api_builder : APIHelper = None
29+ _datasource_handler : DataSourceHandler = None
2630 _datafeeds : list [DataSource ] = []
2731 _datataskers : list [DataStore ] = []
2832 _datagroups : list = []
33+ _tasks : list = []
2934
3035 def __init__ (self , name : str , ** kwargs ):
3136 self ._name = name
3237 if 'nodes' in kwargs :
3338 self ._nodes = kwargs ['nodes' ]
39+ self ._datasource_handler = DataSourceHandler ()
3440
3541 def get_name (self ):
3642 return self ._name
@@ -74,8 +80,18 @@ def select_temporal_mode(self, mode: str):
7480 """
7581 pass
7682
77- def playback_streams (self , streams : list ):
78- pass
83+ async def playback_streams (self , stream_ids : list = None ):
84+ if stream_ids is None :
85+ clients = await self ._datasource_handler .connect_all ()
86+ for client in clients :
87+ task = asyncio .create_task (self ._handle_datastream_client (client ))
88+ self ._tasks .append (task )
89+ else :
90+ for stream_id in stream_ids :
91+ clients = await self ._datasource_handler .connect_ds (stream_id )
92+ for client in clients :
93+ msg = await client .recv ()
94+ print (msg )
7995
8096 def visualize_streams (self , streams : list ):
8197 pass
@@ -85,10 +101,15 @@ def get_visualization_recommendations(self, streams: list):
85101 pass
86102
87103 def discover_datastreams (self ):
104+ # NOTE: This will need to check to prevent dupes in the future
88105 for system in self ._systems :
89106 res_datastreams = system .discover_datastreams ()
90- print (f'Datastreams found: { res_datastreams } ' )
91- self ._datafeeds .extend (res_datastreams )
107+ # create DataSource(s)
108+ new_datasource = [
109+ DataSource (name = ds .name , mode = "websocket" , properties = {}, datastream = ds , parent_system = system ) for ds in
110+ res_datastreams ]
111+ self ._datafeeds .extend (new_datasource )
112+ list (map (self ._datasource_handler .add_datasource , new_datasource ))
92113
93114 def discover_systems (self , nodes : list [str ] = None ):
94115 search_nodes = self ._nodes
@@ -107,3 +128,12 @@ def authenticate_user(self, user: dict):
107128
108129 def synchronize_streams (self , systems : list ):
109130 pass
131+
132+ async def _handle_datastream_client (self , client ):
133+ try :
134+ async for msg in client :
135+ msg_dict = json .loads (msg .decode ('utf-8' ))
136+ obs = ObservationOMJSONInline .model_validate (msg_dict )
137+
138+ except Exception as e :
139+ print (f"An error occurred while reading from websocket: { e } " )
0 commit comments