Loading go-apps/meep-sss/api/swagger.yaml +2 −2 Original line number Diff line number Diff line Loading @@ -791,7 +791,7 @@ paths: schema: type: array items: $ref: '#/components/schemas/SensorStatusSubscription' $ref: '#/components/schemas/SensorDataSubscription' x-content-type: application/json "400": description: "Bad Request: used to indicate that incorrect parameters were\ Loading Loading @@ -1577,5 +1577,5 @@ components: status_data_subscriptionId_body: type: object properties: SensorStatusSubscription: SensorDataSubscription: $ref: '#/components/schemas/SensorDataSubscription' go-apps/meep-sss/sbi/sss-sbi.go +33 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,18 @@ type SensorData struct { DataTimestamp *TimeStamp } type SensorDiscoveryEventSubscription struct { SubscriptionType string SensorInfoList []string GeographicalArea []AreaInfo } type AreaInfo struct { Shape string Points []Point Radius int32 } type TimeStamp struct { Seconds int32 NanoSeconds int32 Loading Loading @@ -418,6 +430,27 @@ func GetSensorData(sensorIdentifier string) (data SensorData, err error) { return data, nil } func ProcessSensorDiscoveryEventSubscription(sensorDiscoveryEventSubscription SensorDiscoveryEventSubscription) (err error) { log.Info("sbi.processSensorDiscoveryEventSubscription: ", sensorDiscoveryEventSubscription) if sbi.sssMgr == nil { err = errors.New("No IoT platform registered") return err } sub := tm.SensorDiscoveryEventSubscription{ SubscriptionType: sensorDiscoveryEventSubscription.SubscriptionType, SensorInfoList: sensorDiscoveryEventSubscription.SensorInfoList, } // TODO FSCOM Add GeographicalArea field & create a convert function err = sbi.sssMgr.ProcessSensorDiscoveryEventSubscription(sub) if err != nil { return err } return nil } func convertSensorDiscoveryInfoListFromSssMgr(s []tm.SensorDiscoveryInfo) (sensors []SensorDiscoveryInfo) { sensors = make([]SensorDiscoveryInfo, len(s)) for i, val := range s { Loading go-apps/meep-sss/server/meep-sss.go +104 −64 Original line number Diff line number Diff line Loading @@ -885,17 +885,94 @@ func subscriptionsPOST(subType string, w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") var subscriptionCommon SubscriptionCommon var bodyBytes []byte var err error switch subType { case SENS_DISCOVERY: var sub SensorDiscoverySubscriptionIdBody // Read JSON input stream provided in the Request, and stores it in the bodyBytes as bytes bodyBytes, err = ioutil.ReadAll(r.Body) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes)) // Unmarshal function to converts a JSON-formatted string into a SubscriptionCommon struct and store it in extractSubType err = json.Unmarshal(bodyBytes, &sub) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: sub: ", sub) subscriptionType := "" if sub.SensorDiscoveryEventSubscription.SubscriptionType != nil { subscriptionType = string(*sub.SensorDiscoveryEventSubscription.SubscriptionType) } subscriptionCommon = SubscriptionCommon{ SubscriptionType: subscriptionType, CallbackReference: sub.SensorDiscoveryEventSubscription.CallbackReference, WebsockNotifConfig: sub.SensorDiscoveryEventSubscription.WebsockNotifConfig, RequestTestNotification: sub.SensorDiscoveryEventSubscription.RequestTestNotification, } case SENS_STATUS: var sub SensorStatusSubscriptionIdBody // Read JSON input stream provided in the Request, and stores it in the bodyBytes as bytes bodyBytes, err = ioutil.ReadAll(r.Body) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes)) // Unmarshal function to converts a JSON-formatted string into a SubscriptionCommon struct and store it in extractSubType err = json.Unmarshal(bodyBytes, &sub) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: sub: ", sub) subscriptionType := "" if sub.SensorStatusSubscription.SubscriptionType != nil { subscriptionType = string(*sub.SensorStatusSubscription.SubscriptionType) } subscriptionCommon = SubscriptionCommon{ SubscriptionType: subscriptionType, CallbackReference: sub.SensorStatusSubscription.CallbackReference, WebsockNotifConfig: sub.SensorStatusSubscription.WebsockNotifConfig, RequestTestNotification: sub.SensorStatusSubscription.RequestTestNotification, } case SENS_DATA: var sub SensorDataSubscriptionIdBody // Read JSON input stream provided in the Request, and stores it in the bodyBytes as bytes bodyBytes, _ := ioutil.ReadAll(r.Body) bodyBytes, err = ioutil.ReadAll(r.Body) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes)) // Unmarshal function to converts a JSON-formatted string into a SubscriptionCommon struct and store it in extractSubType err := json.Unmarshal(bodyBytes, &subscriptionCommon) err = json.Unmarshal(bodyBytes, &sub) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: subscriptionCommon: ", subscriptionCommon) log.Info("subscriptionsPost: sub: ", sub) subscriptionType := "" if sub.SensorDataSubscription.SubscriptionType != nil { subscriptionType = string(*sub.SensorDataSubscription.SubscriptionType) } subscriptionCommon = SubscriptionCommon{ SubscriptionType: subscriptionType, CallbackReference: sub.SensorDataSubscription.CallbackReference, WebsockNotifConfig: sub.SensorDataSubscription.WebsockNotifConfig, RequestTestNotification: sub.SensorDataSubscription.RequestTestNotification, } } // Validating mandatory parameters provided in the request body if subscriptionCommon.SubscriptionType == "" { Loading Loading @@ -1058,12 +1135,6 @@ func subscriptionsByIdGET(subType string, w http.ResponseWriter, r *http.Request subsIdStr := vars["subscriptionId"] log.Info("subsIdStr: ", subsIdStr) q := u.Query() sensorIdentifier := q.Get("sensorIdentifier") log.Debug("subscriptionsByIdGET: sensorIdentifier: ", sensorIdentifier) sensorIdentifiers := strings.Split(sensorIdentifier, ",") log.Debug("subscriptionsByIdGET: sensorIdentifiers: ", sensorIdentifiers) // Find subscription entry in Redis DB keyName := baseKey + "subscriptions:" + subsIdStr log.Info("subscriptionsByIdGET: keyName: ", keyName) Loading Loading @@ -1217,24 +1288,10 @@ func processSensorDiscoveryEventSubscription(bodyBytes []byte, link *Subscriptio // FIXME FSCOM Check filter values if sensorDiscoveryEventSubscription.WebsockNotifConfig == nil && sensorDiscoveryEventSubscription.CallbackReference == "" { err = errors.New("Mandatory CallbackReference parameter should be present") log.Error(err.Error()) return "", err } if sensorDiscoveryEventSubscription.CallbackReference == "" { err = errors.New("CallbackReference parameter should be present") log.Error(err.Error()) return "", err } if sensorDiscoveryEventSubscription.WebsockNotifConfig != nil { err = errors.New("WebsockNotifConfig not supported") log.Error(err.Error()) return "", err } registerSensorDiscoveryEventSubscription(subsIdStr, nil, sensorDiscoveryEventSubscription) sensorDiscoveryEventSubscription.SubscriptionType = new(SubscriptionType) *sensorDiscoveryEventSubscription.SubscriptionType = SENSOR_DISCOVERY_EVENT_SUBSCRIPTION sensorDiscoveryEventSubscription.Links = link // Store subscription key in redis Loading Loading @@ -1313,6 +1370,17 @@ func registerSensorDiscoveryEventSubscription(subId string, currentSensorDiscove intList = append(intList, subsId) subscriptionExpiryMap[int(sensorDiscoveryEventSubscription.ExpiryDeadline.Seconds)] = intList } sub := sbi.SensorDiscoveryEventSubscription{ SubscriptionType: string(SENSOR_DISCOVERY_EVENT_SUBSCRIPTION), SensorInfoList: sensorDiscoveryEventSubscription.SensorInfoList, } // TODO FSCOM Add GeographicalArea field & create a convert function err := sbi.ProcessSensorDiscoveryEventSubscription(sub) if err != nil { log.Error("Failed to register sensorDiscoveryEventSubscription: ", err) errHandlerProblemDetails(nil, err.Error(), http.StatusInternalServerError) return } } log.Info("registerSensorDiscoveryEventSubscription: After subscriptionExpiryMap: ", subscriptionExpiryMap) log.Info("New registration: ", subsId, " type: ", SENS_DISCOVERY) Loading Loading @@ -1366,24 +1434,10 @@ func processSensorStatusSubscription(bodyBytes []byte, link *SubscriptionLinks, // FIXME FSCOM Check filter values if sensorStatusSubscription.WebsockNotifConfig == nil && sensorStatusSubscription.CallbackReference == "" { err = errors.New("Mandatory CallbackReference parameter should be present") log.Error(err.Error()) return "", err } if sensorStatusSubscription.WebsockNotifConfig != nil { err = errors.New("WebsockNotifConfig not supported") log.Error(err.Error()) return "", err } if sensorStatusSubscription.CallbackReference == "" { err = errors.New("CallbackReference parameter should be present") log.Error(err.Error()) return "", err } registerSensorStatusSubscription(subsIdStr, nil, sensorStatusSubscription) sensorStatusSubscription.SubscriptionType = new(SubscriptionType) *sensorStatusSubscription.SubscriptionType = SENSOR_STATUS_SUBSCRIPTION sensorStatusSubscription.Links = link // Store subscription key in redis Loading Loading @@ -1516,24 +1570,10 @@ func processSensorDataSubscription(bodyBytes []byte, link *SubscriptionLinks, su // FIXME FSCOM Check filter values if sensorDataSubscription.WebsockNotifConfig == nil && sensorDataSubscription.CallbackReference == "" { err = errors.New("Mandatory CallbackReference parameter should be present") log.Error(err.Error()) return "", err } if sensorDataSubscription.WebsockNotifConfig != nil { err = errors.New("WebsockNotifConfig not supported") log.Error(err.Error()) return "", err } if sensorDataSubscription.CallbackReference == "" { err = errors.New("CallbackReference parameter should be present") log.Error(err.Error()) return "", err } registerSensorDataSubscription(subsIdStr, nil, sensorDataSubscription) sensorDataSubscription.SubscriptionType = new(SubscriptionType) *sensorDataSubscription.SubscriptionType = SENSOR_DATA_SUBSCRIPTION sensorDataSubscription.Links = link // Store subscription key in redis Loading go-apps/meep-sss/server/model_status_data_subscription_id_body.go +1 −1 Original line number Diff line number Diff line Loading @@ -10,5 +10,5 @@ package server type SensorDataSubscriptionIdBody struct { SensorStatusSubscription *SensorDataSubscription `json:"SensorStatusSubscription,omitempty"` SensorDataSubscription *SensorDataSubscription `json:"SensorStatusSubscription,omitempty"` } go-packages/meep-sss-client/api/swagger.yaml +2 −2 Original line number Diff line number Diff line Loading @@ -791,7 +791,7 @@ paths: schema: type: array items: $ref: '#/components/schemas/SensorStatusSubscription' $ref: '#/components/schemas/SensorDataSubscription' x-content-type: application/json "400": description: "Bad Request: used to indicate that incorrect parameters were\ Loading Loading @@ -1577,5 +1577,5 @@ components: status_data_subscriptionId_body: type: object properties: SensorStatusSubscription: SensorDataSubscription: $ref: '#/components/schemas/SensorDataSubscription' Loading
go-apps/meep-sss/api/swagger.yaml +2 −2 Original line number Diff line number Diff line Loading @@ -791,7 +791,7 @@ paths: schema: type: array items: $ref: '#/components/schemas/SensorStatusSubscription' $ref: '#/components/schemas/SensorDataSubscription' x-content-type: application/json "400": description: "Bad Request: used to indicate that incorrect parameters were\ Loading Loading @@ -1577,5 +1577,5 @@ components: status_data_subscriptionId_body: type: object properties: SensorStatusSubscription: SensorDataSubscription: $ref: '#/components/schemas/SensorDataSubscription'
go-apps/meep-sss/sbi/sss-sbi.go +33 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,18 @@ type SensorData struct { DataTimestamp *TimeStamp } type SensorDiscoveryEventSubscription struct { SubscriptionType string SensorInfoList []string GeographicalArea []AreaInfo } type AreaInfo struct { Shape string Points []Point Radius int32 } type TimeStamp struct { Seconds int32 NanoSeconds int32 Loading Loading @@ -418,6 +430,27 @@ func GetSensorData(sensorIdentifier string) (data SensorData, err error) { return data, nil } func ProcessSensorDiscoveryEventSubscription(sensorDiscoveryEventSubscription SensorDiscoveryEventSubscription) (err error) { log.Info("sbi.processSensorDiscoveryEventSubscription: ", sensorDiscoveryEventSubscription) if sbi.sssMgr == nil { err = errors.New("No IoT platform registered") return err } sub := tm.SensorDiscoveryEventSubscription{ SubscriptionType: sensorDiscoveryEventSubscription.SubscriptionType, SensorInfoList: sensorDiscoveryEventSubscription.SensorInfoList, } // TODO FSCOM Add GeographicalArea field & create a convert function err = sbi.sssMgr.ProcessSensorDiscoveryEventSubscription(sub) if err != nil { return err } return nil } func convertSensorDiscoveryInfoListFromSssMgr(s []tm.SensorDiscoveryInfo) (sensors []SensorDiscoveryInfo) { sensors = make([]SensorDiscoveryInfo, len(s)) for i, val := range s { Loading
go-apps/meep-sss/server/meep-sss.go +104 −64 Original line number Diff line number Diff line Loading @@ -885,17 +885,94 @@ func subscriptionsPOST(subType string, w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") var subscriptionCommon SubscriptionCommon var bodyBytes []byte var err error switch subType { case SENS_DISCOVERY: var sub SensorDiscoverySubscriptionIdBody // Read JSON input stream provided in the Request, and stores it in the bodyBytes as bytes bodyBytes, err = ioutil.ReadAll(r.Body) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes)) // Unmarshal function to converts a JSON-formatted string into a SubscriptionCommon struct and store it in extractSubType err = json.Unmarshal(bodyBytes, &sub) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: sub: ", sub) subscriptionType := "" if sub.SensorDiscoveryEventSubscription.SubscriptionType != nil { subscriptionType = string(*sub.SensorDiscoveryEventSubscription.SubscriptionType) } subscriptionCommon = SubscriptionCommon{ SubscriptionType: subscriptionType, CallbackReference: sub.SensorDiscoveryEventSubscription.CallbackReference, WebsockNotifConfig: sub.SensorDiscoveryEventSubscription.WebsockNotifConfig, RequestTestNotification: sub.SensorDiscoveryEventSubscription.RequestTestNotification, } case SENS_STATUS: var sub SensorStatusSubscriptionIdBody // Read JSON input stream provided in the Request, and stores it in the bodyBytes as bytes bodyBytes, err = ioutil.ReadAll(r.Body) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes)) // Unmarshal function to converts a JSON-formatted string into a SubscriptionCommon struct and store it in extractSubType err = json.Unmarshal(bodyBytes, &sub) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: sub: ", sub) subscriptionType := "" if sub.SensorStatusSubscription.SubscriptionType != nil { subscriptionType = string(*sub.SensorStatusSubscription.SubscriptionType) } subscriptionCommon = SubscriptionCommon{ SubscriptionType: subscriptionType, CallbackReference: sub.SensorStatusSubscription.CallbackReference, WebsockNotifConfig: sub.SensorStatusSubscription.WebsockNotifConfig, RequestTestNotification: sub.SensorStatusSubscription.RequestTestNotification, } case SENS_DATA: var sub SensorDataSubscriptionIdBody // Read JSON input stream provided in the Request, and stores it in the bodyBytes as bytes bodyBytes, _ := ioutil.ReadAll(r.Body) bodyBytes, err = ioutil.ReadAll(r.Body) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes)) // Unmarshal function to converts a JSON-formatted string into a SubscriptionCommon struct and store it in extractSubType err := json.Unmarshal(bodyBytes, &subscriptionCommon) err = json.Unmarshal(bodyBytes, &sub) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } log.Info("subscriptionsPost: subscriptionCommon: ", subscriptionCommon) log.Info("subscriptionsPost: sub: ", sub) subscriptionType := "" if sub.SensorDataSubscription.SubscriptionType != nil { subscriptionType = string(*sub.SensorDataSubscription.SubscriptionType) } subscriptionCommon = SubscriptionCommon{ SubscriptionType: subscriptionType, CallbackReference: sub.SensorDataSubscription.CallbackReference, WebsockNotifConfig: sub.SensorDataSubscription.WebsockNotifConfig, RequestTestNotification: sub.SensorDataSubscription.RequestTestNotification, } } // Validating mandatory parameters provided in the request body if subscriptionCommon.SubscriptionType == "" { Loading Loading @@ -1058,12 +1135,6 @@ func subscriptionsByIdGET(subType string, w http.ResponseWriter, r *http.Request subsIdStr := vars["subscriptionId"] log.Info("subsIdStr: ", subsIdStr) q := u.Query() sensorIdentifier := q.Get("sensorIdentifier") log.Debug("subscriptionsByIdGET: sensorIdentifier: ", sensorIdentifier) sensorIdentifiers := strings.Split(sensorIdentifier, ",") log.Debug("subscriptionsByIdGET: sensorIdentifiers: ", sensorIdentifiers) // Find subscription entry in Redis DB keyName := baseKey + "subscriptions:" + subsIdStr log.Info("subscriptionsByIdGET: keyName: ", keyName) Loading Loading @@ -1217,24 +1288,10 @@ func processSensorDiscoveryEventSubscription(bodyBytes []byte, link *Subscriptio // FIXME FSCOM Check filter values if sensorDiscoveryEventSubscription.WebsockNotifConfig == nil && sensorDiscoveryEventSubscription.CallbackReference == "" { err = errors.New("Mandatory CallbackReference parameter should be present") log.Error(err.Error()) return "", err } if sensorDiscoveryEventSubscription.CallbackReference == "" { err = errors.New("CallbackReference parameter should be present") log.Error(err.Error()) return "", err } if sensorDiscoveryEventSubscription.WebsockNotifConfig != nil { err = errors.New("WebsockNotifConfig not supported") log.Error(err.Error()) return "", err } registerSensorDiscoveryEventSubscription(subsIdStr, nil, sensorDiscoveryEventSubscription) sensorDiscoveryEventSubscription.SubscriptionType = new(SubscriptionType) *sensorDiscoveryEventSubscription.SubscriptionType = SENSOR_DISCOVERY_EVENT_SUBSCRIPTION sensorDiscoveryEventSubscription.Links = link // Store subscription key in redis Loading Loading @@ -1313,6 +1370,17 @@ func registerSensorDiscoveryEventSubscription(subId string, currentSensorDiscove intList = append(intList, subsId) subscriptionExpiryMap[int(sensorDiscoveryEventSubscription.ExpiryDeadline.Seconds)] = intList } sub := sbi.SensorDiscoveryEventSubscription{ SubscriptionType: string(SENSOR_DISCOVERY_EVENT_SUBSCRIPTION), SensorInfoList: sensorDiscoveryEventSubscription.SensorInfoList, } // TODO FSCOM Add GeographicalArea field & create a convert function err := sbi.ProcessSensorDiscoveryEventSubscription(sub) if err != nil { log.Error("Failed to register sensorDiscoveryEventSubscription: ", err) errHandlerProblemDetails(nil, err.Error(), http.StatusInternalServerError) return } } log.Info("registerSensorDiscoveryEventSubscription: After subscriptionExpiryMap: ", subscriptionExpiryMap) log.Info("New registration: ", subsId, " type: ", SENS_DISCOVERY) Loading Loading @@ -1366,24 +1434,10 @@ func processSensorStatusSubscription(bodyBytes []byte, link *SubscriptionLinks, // FIXME FSCOM Check filter values if sensorStatusSubscription.WebsockNotifConfig == nil && sensorStatusSubscription.CallbackReference == "" { err = errors.New("Mandatory CallbackReference parameter should be present") log.Error(err.Error()) return "", err } if sensorStatusSubscription.WebsockNotifConfig != nil { err = errors.New("WebsockNotifConfig not supported") log.Error(err.Error()) return "", err } if sensorStatusSubscription.CallbackReference == "" { err = errors.New("CallbackReference parameter should be present") log.Error(err.Error()) return "", err } registerSensorStatusSubscription(subsIdStr, nil, sensorStatusSubscription) sensorStatusSubscription.SubscriptionType = new(SubscriptionType) *sensorStatusSubscription.SubscriptionType = SENSOR_STATUS_SUBSCRIPTION sensorStatusSubscription.Links = link // Store subscription key in redis Loading Loading @@ -1516,24 +1570,10 @@ func processSensorDataSubscription(bodyBytes []byte, link *SubscriptionLinks, su // FIXME FSCOM Check filter values if sensorDataSubscription.WebsockNotifConfig == nil && sensorDataSubscription.CallbackReference == "" { err = errors.New("Mandatory CallbackReference parameter should be present") log.Error(err.Error()) return "", err } if sensorDataSubscription.WebsockNotifConfig != nil { err = errors.New("WebsockNotifConfig not supported") log.Error(err.Error()) return "", err } if sensorDataSubscription.CallbackReference == "" { err = errors.New("CallbackReference parameter should be present") log.Error(err.Error()) return "", err } registerSensorDataSubscription(subsIdStr, nil, sensorDataSubscription) sensorDataSubscription.SubscriptionType = new(SubscriptionType) *sensorDataSubscription.SubscriptionType = SENSOR_DATA_SUBSCRIPTION sensorDataSubscription.Links = link // Store subscription key in redis Loading
go-apps/meep-sss/server/model_status_data_subscription_id_body.go +1 −1 Original line number Diff line number Diff line Loading @@ -10,5 +10,5 @@ package server type SensorDataSubscriptionIdBody struct { SensorStatusSubscription *SensorDataSubscription `json:"SensorStatusSubscription,omitempty"` SensorDataSubscription *SensorDataSubscription `json:"SensorStatusSubscription,omitempty"` }
go-packages/meep-sss-client/api/swagger.yaml +2 −2 Original line number Diff line number Diff line Loading @@ -791,7 +791,7 @@ paths: schema: type: array items: $ref: '#/components/schemas/SensorStatusSubscription' $ref: '#/components/schemas/SensorDataSubscription' x-content-type: application/json "400": description: "Bad Request: used to indicate that incorrect parameters were\ Loading Loading @@ -1577,5 +1577,5 @@ components: status_data_subscriptionId_body: type: object properties: SensorStatusSubscription: SensorDataSubscription: $ref: '#/components/schemas/SensorDataSubscription'