Rilegatoria: Introduzione

Training

Il Rilegatura è il passaggio che collega il Vista 3D (oggetti grafici sulla mappa) al DOM delle attrezzature (entità aziendali supervisionate). In termini concreti, creiamo legami stabili tra un oggetto visivo e un dispositivo immersivo, così che qualsiasi azione o dato (stato, variabile, allarme) influenzi la buona rappresentazione visiva — e viceversa (selezione, focus, schede dell'equipaggiamento).

Modello Immersivo di Oggetti: rappresentare fedelmente la realtà

Il Modello Oggetto Immersivo mira a tradurre, senza distorsione, la realtà operativa di un sito nel sistema. Immersive si basa su un MCD (modello dati concettuale) per garantire un Rappresentanza Esatto e attori utilizzabili Professioni (ascensori, sonde, veicoli, telecamere, ecc.) e attori Tecniche (protocolli, variabili, stati, eventi) che saranno monitorati. Comprendere questi attori a monte è essenziale: è proprio questa analisi che rende possibile Trasformazione Fonti commerciali e Traduce correttamente nel modello di oggetti Immersive.

Perché questa modellazione è essenziale

  • Fedeltà al terreno: Un oggetto digitale corrisponde a un oggetto reale (o a un aggregato definito), senza ambiguità.
  • Interoperabilità: dati eterogenei (CMMS, BMS, IoT, file) sono unificati in un'unica struttura.
  • Tracciabilità e supervisione: Ogni dato, evento o allarme è associato all'oggetto "giusto".
  • Scalabilità: un MCD chiaro facilita estensioni (nuove famiglie, nuove proprietà, nuovi siti).

Panoramica del modello

Immersive organizza le entità attorno a quattro concetti chiave: Famiglia di attrezzature, Istanza di Equipaggiamento, Proprietà/Handle e Ambito.

Famiglia di attrezzature

A Famiglia descrive un tipo omogeneo di oggetti (ad esempio:Ascensore, Sensore di temperatura, Veicolo). Definisce il Struttura (proprietà standard, variabili, semantica) e funge da modello per le sue istanze.

Istanza di Equipaggiamento

A Istanza è un pezzo di attrezzatura in cemento appartenente a una singola famiglia. Esempio: Ascensore "ATR5910" dell'edificio B della fabbrica Bidule. Le istanze portano l'identità, la posizione, e collegamenti di supervisione.

Proprietà / Manici

Un corpo espone Proprietà (valori configurati) e Manici (punti dati dinamici pubblicato dal Hub). Le maniglie rappresentano lo stato, le misurazioni o i dati di allarme dell'apparecchiatura (ad esempio: Difetto della porta di atterraggio, Piano attuale, Porta aperta/chiusa).

Anche una famiglia può dichiara i Mangli. Questi nomi di famiglia sono Eredità da tutti i corpi di questa famiglia, che garantiscono una base comune (nomi, tipi, semantica) e semplifica notevolmente scripting e integrazione.

Ambito

A Ambito Raggruppa i corpi secondo una logica Professione (team di risposta, tipo di attività) oppure Geografia (sito, edificio, piano, area). La stessa attrezzatura può appartenere a diversi telescopi per riflettere diversi punti di vista operativi (ad esempio, "Manutenzione ascensori", "Edificio B").

Eredità delle maniglie (Caso → Famiglia)

  • Contratto Dati Comune: Impostare i handle a livello di famiglia crea un'API stabile per tutte le istanze.
  • Riduzione delle lacune: Meno variazioni di nome/tipo, meno sforzo di mappatura e test.
  • Scalabilità: Ogni istanza può aggiungere handle specifici se necessario (senza rompere il contratto base).
  • Scripting semplificato: Gli script possono prendere di mira i handle di famiglia assumendo la loro presenza su tutte le istanze.

Relazioni strutturali e regole

  • Istanze → Famiglia : 1 famiglia include N istanze (cardinalità 1..*).
  • → Famiglia dei Handle : i nickli della famiglia sono Eredità da tutti i corpi.
  • Manici → Istanza : Un'istanza può aggiungere i propri handle (specifici) oltre all'eredità.
  • Estensioni di Scopes ↔ : N↔N relazione permettendo raggruppamenti flessibili e multipli.

Sicurezza e perimetri

Il Famiglie di attrezzature e il Ambiti sono Garantibile : possiamo controllare chi vede, chi configura o chi gestisce un perimetro/famiglia. Questa granularità di accesso è cruciale per compartimentare gli usi (ad esempio, operatori, manutenzione, sicurezza, gestione) e rispetto delle responsabilità.

Trasformare la conoscenza aziendale in un modello immersivo

  1. Identifica gli attori (oggetti reali da supervisionare) e il loro Attributi Utile.
  2. Definizione delle famiglie corrispondenti ai tipi effettivamente osservati; Elenca le proprietà e i handle attesi.
  3. Istanziare ogni attrezzatura in calcestruzzo (identità, posizione, appartenenza agli ambiti).
  4. Dati cartografici (protocolli, API, file) ai handle delle istanza.
  5. Valida la tracciabilità (un evento = un oggetto esatto) e si aggiustare il MCD se necessario.

Esempio riassunto

Famiglia : Ascensore → Procedimenti : "ATR5910" (Edificio B) → Manici : DoorFault, DoorState, PavimentoAmbiti : "Manutenzione ascensori", "Edificio B".

Migliori pratiche

  • Denominazione delle scuderie (ID, famiglie, nickni) per evitare pause durante le evoluzioni.
  • Repository condivisi (siti, edifici, aree) per garantire coerenza trasversale.
  • Handle espliciti (tipo, unità, semantica) per facilitare le regole di scripting e l'interfaccia utente.
  • Ambiti rilevanti per riflettere usi reali (operazione, sicurezza, manutenzione, gestione).
  • Controlli regolari (copertina, orfani, duplicati) per mantenere la qualità del modello.

Binding — modello di esempio (BuildingSensorSimulator)

Per illustrare il Binding 3D ↔ DOM, ci affidiamo al progetto di esempio BuildingSensorSimulator. Immaginiamo di lavorare per un Società di gestione condominiale : è necessario Attrezzature di importazione in Immersive e quindi Elenco Il Famiglie, il Istanze e il Manici che fungerà da contratto dati per il vincolamento.

Promemoria

Il progetto BuildingSensorSimulator, il cui codice sorgente è il seguente:

simula un insieme di sensori e apparecchiature che supportano i vari tutorial nelle nostre pagine dedicate agli sviluppatori della soluzione Immersive.

Questo progetto, dopo analisi, istanza e crea una serie di apparecchiature che possono essere determinate dopo l'analisi del codice sorgente per chi padroneggia il linguaggio C#:

private void Seed()
{
    var now = DateTime.UtcNow;

    int lastId = 0;
    int NextId() => ++lastId;

    //function for simple device with one variable
    Device Single(string name, string type, string unit, string value, int? fixedId = null)
    {
        var id = fixedId ?? NextId();
        return new Device
        {
            Id = id,
            Name = name,
            Type = type,
            Value = value,              // valeurs normalisées en string
            Unit = unit,
            TimestampUtc = now
        };
    }

    //function for elevator
    Device Elevator(string name, int? fixedId = null)
    {
        var id = fixedId ?? NextId();
        return new Device
        {
            Id = id,
            Name = name,
            Type = "elevator",
            Variables =
            [
                new() { Name = "floor", Path = $"floor", Kind = "numeric", Unit = null, Value = "0",      TimestampUtc = now },
                new() { Name = "state", Path = $"state", Kind = "enum",    Unit = null, Value = "Idle",   TimestampUtc = now },
                new() { Name = "door",  Path = $"door",  Kind = "enum",    Unit = null, Value = "Closed", TimestampUtc = now },
            ]
        };
    }

    //function for garage door
    Device GarageDoor(string name, int? fixedId = null)
    {
        var id = fixedId ?? NextId();
        return new Device
        {
            Id = id,
            Name = name,
            Type = "garageDoor",
            Variables =
            [
                new() { Name = "door",     Path = $"door",     Kind = "enum", Value = "Closed", TimestampUtc = now },
                new() { Name = "obstacle", Path = $"obstacle", Kind = "bool", Value = "false",  TimestampUtc = now },
            ]
        };
    }

    // ---------------------------------------
    Devices.AddRange(
    [
        Single("Temp S1",               "sensor",     "°C",  "27.5"),
        Single("Parking Humidity",     "humidity",   "%",   "50"),
        Single("Corridor Light Level",  "light",      "lux", "300"),
        Single("Office Presence",       "presence",   "bool","0"),
        Single("Main Electric Counter", "energy",     "kWh", "1250"),
        Single("Smoke Detector",        "smoke",      "bool","0"),
        Single("Parking Temperature",  "temperature","°C",  "21"),
        ]);

    // Rooms supplémentaires (temp + humidity)
    foreach (var room in new[] {101, 102, 103, 104, 201, 202, 203, 204, 301, 302, 303, 304 })
    {
        Devices.Add(Single($"Room {room} Temperature", "temperature", "°C", "21"));
        Devices.Add(Single($"Room {room} Humidity", "humidity", "%", "50"));
    }

    // 5 détecteurs de fumée
    for (int i = 1; i <= 5; i++)
        Devices.Add(Single($"Smoke Detector S{i}", "smoke", "bool", "0"));


    //start id farther for complex devices
    lastId = 101;
    Devices.Add(Elevator("Lift A"));
    Devices.Add(Elevator("Lift B"));
    Devices.Add(GarageDoor("Garage G1"));

}

Famiglie di attrezzature (offerte)

L'esempio di sindacato di co-proprietà stabilisce le seguenti famiglie di oggetti:

  • Ascensore (ascensore)
  • GarageDoor (porta del garage)
  • Sensore di temperatura
  • UmiditySensor
  • LightSensor
  • PresenceSensor
  • EnergyCounter
  • Rilevatore di fumo

Istanze simulate (estratto)

Ascensori e porte del garage

  • Ascensore : Lift A, Lift B
  • GarageDoor : Garage G1

Sensori a valore singolo

  • Sensore di temperatura : Temp S1, Parking Temperature, Room 101 Temperature, Room 102 Temperature, Room 103 Temperature, Room 104 Temperature, Room 201 Temperature, Room 202 Temperature, Room 203 Temperature, Room 204 Temperature, Room 301 Temperature, Room 302 Temperature,Room 303 Temperature, Room 304 Temperature
  • UmiditySensor : Parking Humidity, Room 101 Humidity, Room 102 Humidity,Room 103 Humidity, Room 104 Humidity, Room 201 Humidity, Room 202 Humidity,Room 203 Humidity, Room 204 Humidity, Room 301 Humidity, Room 302 Humidity,Room 303 Humidity, Room 304 Humidity
  • LightSensor : Corridor Light Level
  • PresenceSensor : Office Presence
  • EnergyCounter : Main Electric Counter
  • Rilevatore di fumo : Smoke Detector, Smoke Detector S1S5

Handle di famiglia (ereditati per ipotenze)

Ascensore

Percorso Gentilezza Unità Descrizione
Manico Elevator/Floor Numerico Piano attuale (0, 1, 2 ...)
Manico Elevator/State enum Stato: Minimo, Trasferimento, Allarme
Manico Elevator/Door enum Porta: Open / Chiuso

GarageDoor

Manico Gentilezza Unità Descrizione
GarageDoor/Door enum Posizione della porta: Open / Chiuso
GarageDoor/Obstacle bool Ostacolo rilevato (sicurezza)

Sensore di temperatura

Manico Gentilezza Unità Descrizione
Temperature/Value Numerico °C Temperatura misurata

UmiditySensor

Manico Gentilezza Unità Descrizione
Humidity/Value Numerico % Umidità relativa

LightSensor

Manico Gentilezza Unità Descrizione
Light/Level Numerico lux Livello di luce

PresenceSensor

Manico Gentilezza Unità Descrizione
Presence/State bool Presenza rilevata (1) / no (0)

EnergyCounter

Manico Gentilezza Unità Descrizione
Energy/Total Numerico kWh Indice dei consumi

Rilevatore di fumo

Manico Gentilezza Unità Descrizione
Smoke/Alarm bool Allarme fumo (vero/falso)

Download delle fonti