Senzor de Calitate a Aerului PureAware

Ghid de Integrare
Firmware V1.027

1. Integrare BACnet/IP

PureAware implementeaza un server BACnet/IP minimal conform ASHRAE 135-2020, Anexa J, pe portul UDP 47808 (0xBAC0).

1.1 Descoperirea Dispozitivului

Dispozitivul raspunde la broadcast-urile Who-Is cu un raspuns I-Am (unicast + broadcast). ID-ul Instantei Dispozitivului este derivat din ultimii 3 octeti ai adresei MAC (interval 0–4.194.302) sau poate fi setat manual.

1.2 Harta Obiectelor

ObiectInstantaNumeUnitate (ASHRAE)
Deviceauto/manualhostname
AI 00CO2parts-per-million (96)
AI 11PM1.0micrograms-per-cubic-meter (165)
AI 22PM2.5micrograms-per-cubic-meter (165)
AI 33PM4.0micrograms-per-cubic-meter (165)
AI 44PM10micrograms-per-cubic-meter (165)
AI 55VOC Indexno-units (95)
AI 66NOx Indexno-units (95)
AI 77TVOCparts-per-billion (97)
AI 88Temperaturadegrees-Celsius (62)
AI 99Umiditatepercent-relative-humidity (29)
AI 1010Presiunehectopascals (133)

1.3 Servicii Suportate

1.4 Proprietati Suportate per Obiect AI

ProprietateIDAcces
Object_Identifier75Citire
Object_Name77Citire
Object_Type79Citire
Present_Value85Citire
Status_Flags111Citire
Event_State36Citire
Out_Of_Service81Citire
Units117Citire
Reliability103Citire
Description28Citire

1.5 Integrare cu Platforme BMS

Tridium Niagara N4

  1. Deschideti Reteaua BACnet in Niagara Workbench
  2. Rulati o descoperire Who-Is pe subnet
  3. Dispozitivul PureAware apare cu Instanta Dispozitivului si hostname-ul
  4. Adaugati dispozitivul → Niagara descopera automat toate cele 11 obiecte AI
  5. Mapati punctele AI la programul de control sau baza de date istorice

Controlere BACnet Honeywell / Schneider / Siemens

  1. Configurati clientul BACnet pe controlerul dumneavoastra pentru a scana portul UDP 47808
  2. Adaugati Instanta Dispozitivului PureAware ca dispozitiv remote
  3. Mapati Registrele de Intrare la variabilele controlerului folosind ReadProperty sau RPM
  4. Setati un interval de interogare (recomandat: 30–60 secunde)
Nota: Dispozitivul nu suporta segmentare. Asigurati-va ca cererile RPM raman sub 1024 octeti. Pentru seturi mari de proprietati, folositi cereri RPM multiple.

2. Integrare Modbus TCP

Server Modbus TCP asincron pe portul 502, suportand pana la 3 clienti simultani cu un timeout de inactivitate de 60 de secunde.

2.1 Harta Registrelor de Intrare (FC 04)

RegistruParametruUnitateScalare
0Tip DispozitivFix: 1
1VOC Index1–500, intreg
2NOx Index1–500, intreg
3PM1.0µg/m³Intreg
4PM2.5µg/m³Intreg
5PM4.0µg/m³Intreg
6PM10µg/m³Intreg
7Temperatura°C × 10Impartiti la 10 (ex. 235 = 23.5°C)
8Umiditate%RH × 10Impartiti la 10 (ex. 654 = 65.4%)
9CO2ppmIntreg
10TVOC (WELL)µg/m³Intreg
11PresiunehPa × 10Impartiti la 10 (ex. 10132 = 1013.2 hPa)

2.2 Coduri de Functie Suportate

FCDenumireDescriere
01Read CoilsCitire iesiri digitale
02Read Discrete InputsCitire intrari digitale
03Read Holding RegistersCitire registre R/W
04Read Input RegistersCitire date senzor (principal)
05Write Single CoilScriere o iesire digitala
06Write Single RegisterScriere un registru holding
0FWrite Multiple CoilsScriere mai multe iesiri digitale
10Write Multiple RegistersScriere mai multe registre holding

2.3 Exemplu Python (pymodbus)

# pip install pymodbus
from pymodbus.client import ModbusTcpClient

client = ModbusTcpClient('192.168.1.100', port=502)
client.connect()

# Citire toate cele 12 registre de intrare incepand de la adresa 0
result = client.read_input_registers(address=0, count=12, slave=1)

if not result.isError():
    regs = result.registers
    print(f"CO2:         {regs[9]} ppm")
    print(f"PM2.5:       {regs[4]} ug/m3")
    print(f"Temperature: {regs[7] / 10.0:.1f} C")
    print(f"Humidity:    {regs[8] / 10.0:.1f} %RH")
    print(f"VOC Index:   {regs[1]}")
    print(f"Pressure:    {regs[11] / 10.0:.1f} hPa")

client.close()

2.4 Exemplu Node-RED

  1. Instalati node-red-contrib-modbus
  2. Adaugati un nod Modbus-Read: Host = IP-ul dispozitivului, Port = 502
  3. FC = 4 (Read Input Registers), Adresa = 0, Cantitate = 12
  4. Setati intervalul de interogare la 30–60 secunde
  5. Conectati la un nod Function pentru a parsa si scala valorile

2.5 PLC Schneider / Allen-Bradley

Configurati un modul Modbus TCP Client care pointeaza la IP-ul dispozitivului pe portul 502. Mapati registrele de intrare 0–11 la tag-urile PLC. Folositi un interval de interogare de 5–60 secunde.

Important: Serverul asincron deconecteaza clientii inactivi dupa 60 de secunde. Asigurati-va ca intervalul de interogare este mai scurt decat acesta, sau implementati logica de reconectare.

3. Integrare MQTT

Client MQTT complet asincron (non-blocant). Publica datele senzorului ca JSON pe topic-ul configurat la un interval configurabil (minim 10 secunde).

3.1 Configurare

ParametruExemplu
Serverbroker.emqx.io
Port1883
Utilizatoremqx
Parolapublic
TopicPureAware_Office
Nume SenzorOffice Sensor
Interval60 (secunde, minim 10)

3.2 Structura Topic-urilor

Dispozitivul publica pe: {topic}/{mac6}/data

Exemplu: PureAware_Office/8a0de8/data

Pentru a va abona la toate dispozitivele de pe un topic de baza, folositi wildcard-ul: PureAware_Office/#

3.3 Format JSON Payload

{
  "device_type": "SEN66",
  "name":   "Office Sensor",
  "co2":    "845",
  "pm1":    "3",
  "pm25":   "5",
  "pm4":    "7",
  "pm10":   "8",
  "voc":    "127",
  "nox":    "15",
  "tvocw":  "342",
  "temp":   "23.5",
  "hum":    "55.2",
  "press":  "1013.2",
  "rssi":   "-52"
}
Nota: Toate valorile sunt siruri JSON. Campul name este prezent doar daca este configurat un Nume de Senzor. Campul rssi contine puterea semnalului WiFi in dBm.

3.4 Home Assistant — Senzori MQTT

Adaugati acestea in fisierul configuration.yaml (inlocuiti topic-ul cu topic-ul complet al dispozitivului dumneavoastra):

# configuration.yaml
mqtt:
  sensor:
    - name: "PureAware CO2"
      state_topic: "PureAware_Office/8a0de8/data"
      value_template: "{{ value_json.co2 }}"
      unit_of_measurement: "ppm"
      device_class: carbon_dioxide

    - name: "PureAware PM2.5"
      state_topic: "PureAware_Office/8a0de8/data"
      value_template: "{{ value_json.pm25 }}"
      unit_of_measurement: "ug/m3"
      device_class: pm25

    - name: "PureAware Temperatura"
      state_topic: "PureAware_Office/8a0de8/data"
      value_template: "{{ value_json.temp }}"
      unit_of_measurement: "C"
      device_class: temperature

    - name: "PureAware Umiditate"
      state_topic: "PureAware_Office/8a0de8/data"
      value_template: "{{ value_json.hum }}"
      unit_of_measurement: "%"
      device_class: humidity

    - name: "PureAware VOC Index"
      state_topic: "PureAware_Office/8a0de8/data"
      value_template: "{{ value_json.voc }}"
      device_class: volatile_organic_compounds_parts

    - name: "PureAware Presiune"
      state_topic: "PureAware_Office/8a0de8/data"
      value_template: "{{ value_json.press }}"
      unit_of_measurement: "hPa"
      device_class: atmospheric_pressure

3.5 Pipeline Grafana + InfluxDB

  1. Folositi Telegraf cu plugin-ul MQTT Consumer pentru a va abona la topic
  2. Telegraf parseaza JSON si scrie in InfluxDB
  3. Creati dashboard-uri Grafana cu panouri de serii temporale pentru fiecare parametru
  4. Setati alerte pe CO2 > 1000 ppm, PM2.5 > 25 µg/m³, etc.

3.6 MQTT Node-RED

  1. Adaugati un nod mqtt in abonat la PureAware_Office/#
  2. Conectati la un nod json pentru a parsa payload-ul
  3. Directionati valorile catre gauge-uri, grafice sau noduri de baze de date din dashboard

3.7 PureAware Remote Monitor

PureAware include aplicatii dedicate de monitorizare care se conecteaza la broker-ul MQTT prin WebSocket (ws://) si afiseaza date live de la toate dispozitivele descoperite pe acelasi topic de baza.

PlatformaFisierDescriere
Browsermonitor_remote.htmlDeschideti in orice browser — nu necesita instalare
WindowsPureAware_Monitor_Setup.exeInstalator desktop cu integrare system tray
AndroidPureAware_Monitor_V1.apkAplicatie mobila cu suport pinch-to-zoom

Setari Monitor

SetareValoare Exemplu
Brokerws://broker.emqx.io:8083/mqtt
TopicPureAware_Office (acelasi topic de baza ca dispozitivul)
Utilizatoremqx
Parolapublic
Timeout120 secunde (cardul devine estompat daca nu se primesc date)

Monitorul se aboneaza la {topic}/# si descopera automat toate dispozitivele. Fiecare dispozitiv apare ca un card cu valori live ale senzorilor, insigne AQI si indicator RSSI.

4. Integrare Zabbix

Dispozitivul foloseste protocolul Zabbix Sender pentru a trimite date direct la un server Zabbix, in mod asincron.

4.1 Configurare

ParametruImplicit
Servermonitor.microelemente.ro
Port55051
HostnamePureAware_Default
Interval60 secunde

4.2 Configurare Server Zabbix

  1. Creati un Host in Zabbix cu acelasi hostname configurat pe dispozitiv
  2. Creati Elemente de tip "Zabbix trapper" pentru fiecare parametru:
Cheie ElementTipUnitate
co2Numeric (float)ppm
pm1Numeric (float)µg/m³
pm25Numeric (float)µg/m³
pm4Numeric (float)µg/m³
pm10Numeric (float)µg/m³
vocNumeric (float)
noxNumeric (float)
tvocwNumeric (float)µg/m³
tempNumeric (float)°C
humNumeric (float)%
pressNumeric (float)hPa
  1. Creati Trigger-e pentru alerte (ex. CO2 > 1000 ppm timp de 5 minute)
  2. Construiti Grafice si Dashboard-uri pentru vizualizare

5. Integrare HTTP / REST API

5.1 Status Public (Port 80)

Exemplu cURL

# Obtinere date senzor ca JSON
curl http://192.168.1.100/data.json

Exemplu Python

import requests

resp = requests.get("http://192.168.1.100/data.json")
data = resp.json()

print(f"CO2: {data['co2']} ppm")
print(f"PM2.5: {data['pm25']} ug/m3")
print(f"Temperature: {data['temp']} C")

Exemplu JavaScript Fetch

async function getSensorData() {
  const resp = await fetch('http://192.168.1.100/data.json');
  const data = await resp.json();

  console.log(`CO2: ${data.co2} ppm`);
  console.log(`PM2.5: ${data.pm25} ug/m3`);
  console.log(`Temp: ${data.temp} C`);
}

5.2 API de Configurare (Port 8080)

# Obtinere configuratie curenta
curl -u admin:pureaware http://192.168.1.100:8080/config/export

# Actualizare o setare
curl -u admin:pureaware -X POST \
  http://192.168.1.100:8080/setting \
  -d "mqtt_en=on&mserver=mqtt.local&mport=1883"

# Import fisier complet de configurare
curl -u admin:pureaware -X POST \
  http://192.168.1.100:8080/config/import \
  -H "Content-Type: application/data.json" \
  -d @pureaware-config.json

5.3 Actualizare OTA (Port 8081)

# Incarcare firmware prin cURL
curl -X POST http://192.168.1.100:8081/update \
  -F "firmware=@PureAware_SEN66_V1.027.bin"

6. Integrare Sistem de Management al Cladirii (BMS)

6.1 Prezentare Generala a Arhitecturii

  ┌──────────────────────────────────────────────────────────┐
  │                   BMS Head-End / SCADA                    │
  │             (Niagara / Honeywell / Schneider)             │
  └────────────┬──────────────────────┬───────────────────────┘
               │ BACnet/IP            │ Modbus TCP
               │ UDP 47808            │ TCP 502
  ┌────────────▼──────────────────────▼───────────────────────┐
  │                  Retea IP (VLAN)                           │
  └──┬──────────┬──────────┬──────────┬──────────┬────────────┘
     │          │          │          │          │
  ┌──▼──┐   ┌──▼──┐   ┌──▼──┐   ┌──▼──┐   ┌──▼──┐
  │ AQS │   │ AQS │   │ AQS │   │ AQS │   │ AQS │
  │ #1  │   │ #2  │   │ #3  │   │ #4  │   │ #5  │
  └─────┘   └─────┘   └─────┘   └─────┘   └─────┘
  Lobby     Sala de   Etaj      Sala      Depozit
            sedinte   birouri   server

6.2 Implementare Multi-Senzor

6.3 Ventilatie Controlata prin Cerere (DCV)

Folositi citirile CO2 pentru a modula clapetele de aer proaspat HVAC:

7. Automatizari Casnice

7.1 Home Assistant

Doua metode de integrare:

# configuration.yaml
sensor:
  - platform: rest
    resource: http://192.168.1.100/data.json
    name: PureAware
    scan_interval: 60
    json_attributes:
      - co2
      - pm25
      - temp
      - hum
      - voc
      - press
    value_template: "{{ value_json.co2 }}"

7.2 openHAB

// pureaware.things
Thing http:url:pureaware "Senzor PureAware" [
    baseURL="http://192.168.1.100/data.json",
    refresh=60
] {
    Channels:
        Type number : co2   [stateTransformation="JSONPATH:$.co2"]
        Type number : pm25  [stateTransformation="JSONPATH:$.pm25"]
        Type number : temp  [stateTransformation="JSONPATH:$.temp"]
        Type number : hum   [stateTransformation="JSONPATH:$.hum"]
}

7.3 Domoticz

Folositi plugin-ul hardware HTTP/HTTPS Poller:

  1. Adaugati hardware: HTTP/HTTPS Poller
  2. URL: http://<ip>/data.json
  3. Interval: 60 secunde
  4. Creati senzori virtuali si mapati campurile JSON folosind scripturi Lua

8. Cerinte de Retea si Firewall

PortProtocolDirectieServiciu
80TCPIntrareDashboard HTTP Status
502TCPIntrareModbus TCP
8080TCPIntrareInterfata Web de Configurare
8081TCPIntrareIncarcare Firmware OTA
8082TCPIntrareIncarcare Display Nextion
47808UDPAmbeleBACnet/IP
1883TCPIesireMQTT (catre broker)
587/465TCPIesireEmail SMTP (TLS/SSL)
55051TCPIesireZabbix Sender
123UDPIesireSincronizare Timp NTP
443TCPIesireVerificare OTA (HTTPS)
5353UDPAmbeleDescoperire mDNS
1900UDPAmbeleDescoperire SSDP
Recomandare VLAN: Plasati dispozitivele PureAware pe un VLAN dedicat IoT/BMS. Permiteti doar porturile necesare listate mai sus prin firewall. Restrictionati porturile de administrare (8080, 8081, 8082) la VLAN-ul de administrare.