panorama.yaml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665
  1. # yaml-language-server: $schema=https://schemas.sourcemeta.com/openapi/v3.1/schema/2025-09-15.json
  2. openapi: 3.1.0
  3. info:
  4. title: Edison Next Panorama - Integration API
  5. description: |-
  6. API standard di integrazione di *Edison Next Panorama* con sistemi esterni
  7. contact:
  8. name: API Support
  9. email: support@panorama.edisonnext.it
  10. version: 0.9.2
  11. license:
  12. name: © 2025 - 2030 Copyright Edison Next Spa. All rights reserved
  13. url: https://edisonnext.it
  14. externalDocs:
  15. description: Edison Next Panorama - Specifiche di Integrazione v.1.0
  16. url: https://panorama.edisonnext.it/
  17. # security di default (richiesta anche per accedere ai dati in lettura)
  18. security:
  19. - panorama_consumer_api_key: []
  20. #servers:
  21. # - url: https://panorama.edisonnext.it/api/v1
  22. # description: Main (production) API server
  23. # - url: <Here staging API server>
  24. # description: Staging API server
  25. # - url: <Here development API server>
  26. # description: Development API server
  27. tags:
  28. - name: Data Source
  29. description: operations for data sources
  30. - name: Type
  31. description: operations for data types
  32. - name: Entity Browse
  33. description: operations to browse entities and their state
  34. - name: Entity
  35. description: operations to manage entities (data provider only)
  36. - name: Device
  37. description: Operations about Devices
  38. paths:
  39. /type:
  40. get:
  41. summary: Restituisce i Tipi di Entità definiti
  42. tags: [Type]
  43. operationId: getTypes
  44. responses:
  45. '200':
  46. description: successful operation
  47. content:
  48. application/json:
  49. schema:
  50. type: array
  51. items:
  52. $ref: '#/components/schemas/Type'
  53. post:
  54. summary: Crea un nuovo Tipo di Entità (admin only)
  55. tags: [Type]
  56. # security:
  57. # - panorama_administrator_api_key: []
  58. requestBody:
  59. required: true
  60. content:
  61. application/json:
  62. schema:
  63. $ref: '#/components/schemas/Type'
  64. responses:
  65. '201':
  66. description: Tipo creato
  67. /type/{id}:
  68. get:
  69. summary: Restituisce un singolo Tipo di Entità
  70. tags: [Type]
  71. parameters:
  72. - in: path
  73. name: id
  74. required: true
  75. schema:
  76. type: string
  77. responses:
  78. '200':
  79. description: Tipo trovato
  80. content:
  81. application/json:
  82. schema:
  83. $ref: '#/components/schemas/Type'
  84. '404':
  85. description: Tipo non trovato
  86. put:
  87. summary: Modifica un Tipo esistente (admin only)
  88. tags: [Type]
  89. parameters:
  90. - in: path
  91. name: id
  92. required: true
  93. schema:
  94. type: string
  95. requestBody:
  96. required: true
  97. content:
  98. application/json:
  99. schema:
  100. $ref: '#/components/schemas/Type'
  101. responses:
  102. '200':
  103. description: Tipo aggiornato
  104. delete:
  105. summary: Elimina un Tipo (senza istanze di elementi) esistente (admin only)
  106. tags: [Type]
  107. /source:
  108. get:
  109. summary: Restituisce le fonti dati disponibili
  110. tags: [Data Source]
  111. responses:
  112. '200':
  113. description: successful operation
  114. content:
  115. application/json:
  116. schema:
  117. type: array
  118. items:
  119. $ref: '#/components/schemas/Source'
  120. post:
  121. summary: Aggiunge una Fonte Dati (admin only)
  122. tags: [Data Source]
  123. requestBody:
  124. required: true
  125. content:
  126. application/json:
  127. schema:
  128. $ref: '#/components/schemas/Source'
  129. responses:
  130. '201':
  131. description: Fonte Dati creata
  132. /source/{id}:
  133. put:
  134. summary: Modifica una sorgente dati esistente (admin only)
  135. tags: [Data Source]
  136. delete:
  137. summary: Elimina una sorgente dati (vuota) esistente (admin only)
  138. tags: [Data Source]
  139. /terminology:
  140. get:
  141. summary: Restituisce le Nomenclature definite
  142. tags: [Type]
  143. operationId: getTerminologies
  144. responses:
  145. '200':
  146. description: successful operation
  147. content:
  148. application/json:
  149. schema:
  150. type: array
  151. items:
  152. $ref: '#/components/schemas/Terminology'
  153. post:
  154. summary: Crea una nuova Nomenclatura (admin only)
  155. tags: [Type]
  156. requestBody:
  157. required: true
  158. content:
  159. application/json:
  160. schema:
  161. $ref: '#/components/schemas/Terminology'
  162. responses:
  163. '201':
  164. description: Nomenclatura creata
  165. /terminology/{id}:
  166. get:
  167. summary: Restituisce una singola Nomenclatura
  168. tags: [Type]
  169. put:
  170. summary: Modifica una Nomenclatura esistente (admin only)
  171. tags: [Type]
  172. delete:
  173. summary: Elimina una Nomenclatura (senza riferimenti in qualche tipo) esistente (admin only)
  174. tags: [Type]
  175. /entity:
  176. get:
  177. summary: Ricerca di entità
  178. tags: [Entity Browse]
  179. parameters:
  180. - name: type
  181. in: query
  182. description: Filter by entity type
  183. required: false
  184. explode: true
  185. schema:
  186. type: string
  187. - name: catalog
  188. in: query
  189. description: Filter by data catalog
  190. required: false
  191. explode: true
  192. schema:
  193. type: string
  194. - name: state
  195. in: query
  196. description: Filter by entity state
  197. required: false
  198. explode: true
  199. schema:
  200. type: string
  201. responses:
  202. '200':
  203. description: Lista di entità
  204. content:
  205. application/json:
  206. schema:
  207. type: array
  208. items:
  209. $ref: '#/components/schemas/Entity'
  210. post:
  211. summary: Crea una nuova entità
  212. tags: [Entity]
  213. requestBody:
  214. required: true
  215. content:
  216. application/json:
  217. schema:
  218. $ref: '#/components/schemas/Entity'
  219. responses:
  220. '201':
  221. description: Entità creata
  222. /entity/{id}:
  223. get:
  224. summary: Ottiene una singola entità
  225. tags: [Entity Browse]
  226. parameters:
  227. - in: path
  228. name: id
  229. required: true
  230. schema:
  231. type: string
  232. responses:
  233. '200':
  234. description: Entità trovata
  235. content:
  236. application/json:
  237. schema:
  238. $ref: '#/components/schemas/Entity'
  239. '404':
  240. description: Entità non trovata
  241. put:
  242. summary: Modifica un'entità esistente (escluso lo stato)
  243. tags: [Entity]
  244. parameters:
  245. - in: path
  246. name: id
  247. required: true
  248. schema:
  249. type: string
  250. requestBody:
  251. required: true
  252. content:
  253. application/json:
  254. schema:
  255. $ref: '#/components/schemas/Entity'
  256. responses:
  257. '200':
  258. description: Entità aggiornata
  259. delete:
  260. summary: Elimina un'entità
  261. tags: [Entity]
  262. parameters:
  263. - in: path
  264. name: id
  265. required: true
  266. schema:
  267. type: string
  268. responses:
  269. '204':
  270. description: Entità eliminata
  271. /state/{id}:
  272. put:
  273. summary: Modifica lo stato di un'Entità
  274. tags: [Entity]
  275. parameters:
  276. - in: path
  277. name: id
  278. required: true
  279. schema:
  280. type: string
  281. requestBody:
  282. required: true
  283. content:
  284. application/json:
  285. schema:
  286. type: string
  287. responses:
  288. '200':
  289. description: Stato Entità aggiornato
  290. /history/{id}:
  291. get:
  292. summary: Ottiene la storia delle variazioni di stato di un'Entità
  293. tags: [Entity Browse]
  294. parameters:
  295. - in: path
  296. name: id
  297. description: l'ID dell'entità di cui ottenere la storia
  298. required: true
  299. schema:
  300. type: string
  301. responses:
  302. '200':
  303. description: Entità trovata
  304. content:
  305. application/json:
  306. schema:
  307. type: array
  308. items:
  309. type: object
  310. properties:
  311. timestamp:
  312. type: string
  313. format: date-time
  314. state:
  315. type: string
  316. examples: ['off', '22°C']
  317. '404':
  318. description: Entità non trovata
  319. /device:
  320. get:
  321. summary: Elenco di tutti i dispositivi
  322. tags: [Device]
  323. responses:
  324. '200':
  325. description: Lista di dispositivi
  326. content:
  327. application/json:
  328. schema:
  329. type: array
  330. items:
  331. $ref: '#/components/schemas/Device'
  332. /device/{id}:
  333. get:
  334. summary: Ottiene informazioni su un singolo dispositivo
  335. tags: [Device]
  336. parameters:
  337. - in: path
  338. name: id
  339. required: true
  340. schema:
  341. type: string
  342. responses:
  343. '200':
  344. description: Dispositivo trovato
  345. content:
  346. application/json:
  347. schema:
  348. $ref: '#/components/schemas/Device'
  349. '404':
  350. description: Dispositivo non trovato
  351. components:
  352. schemas:
  353. Terminology:
  354. type: object
  355. description: Nomenclatura di riferimento per i Tipi di Entità. Può essere interna o esterna (schema.gov.it, UCUM, Google Knowledge Graph)
  356. required: [id, name, syntax]
  357. properties:
  358. id:
  359. type: string
  360. format: uri
  361. description: Identificativo univoco della Nomenclatura (terminology)
  362. examples:
  363. - http://dati.beniculturali.it/cis
  364. name:
  365. type: string
  366. description: Nome canonico della Nomenclatura
  367. description:
  368. type: string
  369. description: Descrizione della Nomenclatura
  370. documentation:
  371. type: string
  372. format: uri
  373. description: Link alla documentazione della Nomenclatura
  374. examples:
  375. - 'https://schema.gov.it/'
  376. subject:
  377. type: string
  378. description: Soggetto titolare del Tipo
  379. examples:
  380. - 'Ministero per i Beni e le Attività Culturali'
  381. uri:
  382. type: string
  383. format: uri
  384. description: URI autoritativa della Nomenclatura
  385. examples:
  386. - http://dati.beniculturali.it/cis
  387. Type:
  388. type: object
  389. description: Tipi di entità, comprensivi di riferimento al nomenclatore e definizione della struttura del payload specifico
  390. required: [id, name, syntax]
  391. properties:
  392. id:
  393. type: string
  394. format: uri
  395. description: Identificativo univoco del Tipo di Entità
  396. examples:
  397. - http://dati.beniculturali.it/cis/CulturalInstituteOrSite
  398. name:
  399. type: string
  400. description: Nome canonico del Tipo di Entità
  401. examples:
  402. - Istituti e Luoghi Della Cultura Italiani (musei, biblioteche, cinema, ecc)
  403. native:
  404. type: boolean
  405. description: Se il Tipo è nativo di piattaforma o importato
  406. default: false
  407. stateType:
  408. $ref: '#/components/schemas/State'
  409. syntax:
  410. type: string
  411. format: json
  412. description: Definizione (JSON-LD) della sintassi del Tipo di Entità
  413. terminology:
  414. $ref: '#/components/schemas/Terminology'
  415. examples:
  416. - http://dati.beniculturali.it/cis
  417. uri:
  418. type: string
  419. format: uri
  420. description: URI autoritativo del Tipo (se non nativo)
  421. examples:
  422. - http://dati.beniculturali.it/cis/CulturalInstituteOrSite
  423. State:
  424. type: object
  425. description: Definisce una possibile rappresentazione della situazione attuale nel «divenire» delle Entità di un certo Tipo
  426. examples:
  427. - Aperto o Chiuso
  428. - Acceso o Spento
  429. - (StatoSemaforo) Rosso, Giallo, Verde, Lampeggiante, Spento
  430. - TemperaturaAmbiente - la temperatura attuale di un ambiente in gradi centigradi
  431. properties:
  432. id:
  433. type: string
  434. format: uri
  435. description: ID univoco del Tipo di Stato
  436. name:
  437. type: string
  438. description: Nome canonico del Tipo di Stato
  439. uom:
  440. type: string
  441. description: Unità di misura (per grandezze scalari)
  442. kind:
  443. type: string
  444. description: La tipologia elementare del Tipo di Stato (grandezza con unità di misura, stringa, eccetera)
  445. examples:
  446. - Enumeration
  447. - Number
  448. - String
  449. Entity:
  450. type: object
  451. description: rappresenta un generico oggetto urbano, è di uno specifico Tipo, afferisce a una Sorgente Dati, ha uno Stato dinamico, è dotato di proprietà type-specific, può avere un Device associato, è tipicamente geo-localizzabile
  452. required: [id, type, source, createdDate, updatedDate]
  453. properties:
  454. id:
  455. type: string
  456. description: ID univoco dell'Entità sulla piattaforma
  457. name:
  458. type: string
  459. description: Nome canonico dell'Entità sulla piattaforma
  460. examples:
  461. - Antiquarium e Acquedotto romano di Trieste
  462. geometry:
  463. type: object
  464. description: Coordinate geografiche dell'Entità
  465. properties:
  466. lat:
  467. type: Number
  468. description: Latitudine dell'Entità
  469. examples: [45.61809]
  470. long:
  471. type: Number
  472. description: Longitudine dell'Entità
  473. examples: [13.827805]
  474. type:
  475. $ref: '#/components/schemas/Type'
  476. parent:
  477. $ref: '#/components/schemas/Entity'
  478. source:
  479. $ref: '#/components/schemas/Source'
  480. externalId:
  481. type: string
  482. description: Identificativo dell'Entità nel sistema sorgente
  483. examples:
  484. - http://dati.beniculturali.it/mibact/luoghi/resource/CISNameInTime/20738
  485. state:
  486. type: object
  487. description: Stato dell'entità
  488. properties:
  489. value:
  490. type: string
  491. description: Valore dello stato (determinato da Type.stateType)
  492. timestamp:
  493. type: string
  494. format: date-time
  495. description: Data/ora dello stato
  496. validity:
  497. type: object
  498. properties:
  499. from:
  500. type: string
  501. format: date-time
  502. description: Inizio validità
  503. to:
  504. type: string
  505. format: date-time
  506. description: Fine validità
  507. payload:
  508. type: object
  509. description: Attributi personalizzati in base al tipo di entità
  510. additionalProperties: true
  511. examples:
  512. - { chiusura: 'Lunedì|Giovedì|Domenica' }
  513. deviceId:
  514. description: Device associato all'entità
  515. $ref: '#/components/schemas/Device'
  516. createdDate:
  517. type: string
  518. format: date-time
  519. description: Data e ora di creazione dell'entità (timestamp ISO 8601)
  520. updatedDate:
  521. type: string
  522. format: date-time
  523. description: Data e ora dell'ultima modifica all'entità, escluse le modifiche di stato (timestamp ISO 8601)
  524. Source:
  525. type: object
  526. description: Fonte dati, interna o esterna, relativa a un soggetto alimentante
  527. properties:
  528. id:
  529. type: string
  530. format: uri
  531. description: ID univoco della Fonte Dati
  532. examples:
  533. - 'fvg_ispfor_tsgo'
  534. - 'fvg_ispfor'
  535. name:
  536. type: string
  537. description: Nome canonico della Fonte Dati
  538. examples:
  539. - 'Ministero per i Beni e le Attività Culturali'
  540. - 'Vincolo idrogeologico. L. 3267/1923 Comune di Trieste'
  541. - 'Ispettorati forestali'
  542. - 'Recupero energetico di biogas da digestione anaerobica o da discarica R1 (BDAD)'
  543. - 'Area golenale'
  544. - 'Copertura 2019 della banda larga in Italia secondo i criteri di rilevazione DESI 2020'
  545. internal:
  546. type: boolean
  547. description: Indica se la fonte dati è nativa della piattaforma o meno
  548. default: false
  549. organization:
  550. type: string
  551. description: Organizzazione di riferimento (ovvero soggetto alimentante) per la Fonte Dati
  552. examples:
  553. - 'Ministero per i Beni e le Attività Culturali'
  554. - 'Regione Autonoma Friuli Venezia Giulia - ISPETTORATO FORESTALE DI TRIESTE E GORIZIA'
  555. - 'RAFVG - DC Risorse agroalimentari, forestali e ittiche - Area foreste e territorio'
  556. - 'Regione Autonoma Friuli Venezia Giulia - SERVIZIO DISCIPLINA GESTIONE RIFIUTI E SITI INQUINATI'
  557. - 'Regione Autonoma Friuli Venezia Giulia - SERVIZIO GEOLOGICO'
  558. - 'Autorità per le Garanzie nelle Comunicazioni - AGCOM'
  559. processor:
  560. type: string
  561. description: Organizzazione che gestisce tecnicamente la Fonte Dati
  562. examples:
  563. - 'Insiel S.p.A.'
  564. - 'Regione autonoma Friuli Venezia Giulia'
  565. required: [id, name, organization, internal]
  566. Device:
  567. type: object
  568. description: Dispositivo IoT gestito nativamente in piattaforma
  569. required: [id, fk_firmware_id, fk_tenant_code, fk_device_service_id, created_date, updated_date]
  570. properties:
  571. id:
  572. type: string
  573. format: uri
  574. description: Identificativo univoco del dispositivo
  575. serial:
  576. type: string
  577. description: Seriale del dispositivo
  578. fk_firmware_id:
  579. type: string
  580. format: uri
  581. description: Identificativo univoco del firmware del dispositivo
  582. fk_tenant_code:
  583. type: string
  584. format: uri
  585. description: Identificativo univoco del tenant appartenente il dispositivo
  586. fk_device_service_id:
  587. type: string
  588. format: uri
  589. description: Identificativo univoco del servizio
  590. decrypt_key:
  591. type: string
  592. description: Chiave di decrypting del dispositivo
  593. auth_key:
  594. type: string
  595. description: Chiave di authentication del dispositivo
  596. logical_device_name:
  597. type: string
  598. description: Logical device name del dispositivo
  599. mac_address:
  600. type: string
  601. description: Mac address del dispositivo
  602. createdDate:
  603. type: string
  604. format: date-time
  605. description: Data di creazione
  606. updatedDate:
  607. type: string
  608. format: date-time
  609. description: Ultimo aggiornamento
  610. securitySchemes:
  611. panorama_auth:
  612. type: oauth2
  613. flows:
  614. implicit:
  615. authorizationUrl: https://panorama.edisonnext.it/oauth/authorize
  616. scopes:
  617. "write:entities": Panorama data provider
  618. "read:entities": Panorama data consumer
  619. "write:types": Panorama tenant administrator
  620. panorama_consumer_api_key:
  621. type: apiKey
  622. name: consumerApiKey
  623. in: header
  624. panorama_provider_api_key:
  625. type: apiKey
  626. name: providerApiKey
  627. in: header
  628. panorama_administrator_api_key:
  629. type: apiKey
  630. name: administratorApiKey
  631. in: header