PureAware implementeaza un server BACnet/IP minimal conform ASHRAE 135-2020, Anexa J, pe portul UDP 47808 (0xBAC0).
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.
| Obiect | Instanta | Nume | Unitate (ASHRAE) |
|---|---|---|---|
| Device | auto/manual | hostname | — |
| AI 0 | 0 | CO2 | parts-per-million (96) |
| AI 1 | 1 | PM1.0 | micrograms-per-cubic-meter (165) |
| AI 2 | 2 | PM2.5 | micrograms-per-cubic-meter (165) |
| AI 3 | 3 | PM4.0 | micrograms-per-cubic-meter (165) |
| AI 4 | 4 | PM10 | micrograms-per-cubic-meter (165) |
| AI 5 | 5 | VOC Index | no-units (95) |
| AI 6 | 6 | NOx Index | no-units (95) |
| AI 7 | 7 | TVOC | parts-per-billion (97) |
| AI 8 | 8 | Temperatura | degrees-Celsius (62) |
| AI 9 | 9 | Umiditate | percent-relative-humidity (29) |
| AI 10 | 10 | Presiune | hectopascals (133) |
| Proprietate | ID | Acces |
|---|---|---|
| Object_Identifier | 75 | Citire |
| Object_Name | 77 | Citire |
| Object_Type | 79 | Citire |
| Present_Value | 85 | Citire |
| Status_Flags | 111 | Citire |
| Event_State | 36 | Citire |
| Out_Of_Service | 81 | Citire |
| Units | 117 | Citire |
| Reliability | 103 | Citire |
| Description | 28 | Citire |
Server Modbus TCP asincron pe portul 502, suportand pana la 3 clienti simultani cu un timeout de inactivitate de 60 de secunde.
| Registru | Parametru | Unitate | Scalare |
|---|---|---|---|
| 0 | Tip Dispozitiv | — | Fix: 1 |
| 1 | VOC Index | — | 1–500, intreg |
| 2 | NOx Index | — | 1–500, intreg |
| 3 | PM1.0 | µg/m³ | Intreg |
| 4 | PM2.5 | µg/m³ | Intreg |
| 5 | PM4.0 | µg/m³ | Intreg |
| 6 | PM10 | µg/m³ | Intreg |
| 7 | Temperatura | °C × 10 | Impartiti la 10 (ex. 235 = 23.5°C) |
| 8 | Umiditate | %RH × 10 | Impartiti la 10 (ex. 654 = 65.4%) |
| 9 | CO2 | ppm | Intreg |
| 10 | TVOC (WELL) | µg/m³ | Intreg |
| 11 | Presiune | hPa × 10 | Impartiti la 10 (ex. 10132 = 1013.2 hPa) |
| FC | Denumire | Descriere |
|---|---|---|
| 01 | Read Coils | Citire iesiri digitale |
| 02 | Read Discrete Inputs | Citire intrari digitale |
| 03 | Read Holding Registers | Citire registre R/W |
| 04 | Read Input Registers | Citire date senzor (principal) |
| 05 | Write Single Coil | Scriere o iesire digitala |
| 06 | Write Single Register | Scriere un registru holding |
| 0F | Write Multiple Coils | Scriere mai multe iesiri digitale |
| 10 | Write Multiple Registers | Scriere mai multe registre holding |
# 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()
node-red-contrib-modbusConfigurati 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.
Client MQTT complet asincron (non-blocant). Publica datele senzorului ca JSON pe topic-ul configurat la un interval configurabil (minim 10 secunde).
| Parametru | Exemplu |
|---|---|
| Server | broker.emqx.io |
| Port | 1883 |
| Utilizator | emqx |
| Parola | public |
| Topic | PureAware_Office |
| Nume Senzor | Office Sensor |
| Interval | 60 (secunde, minim 10) |
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/#
{
"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"
}
name este prezent doar daca este configurat un Nume de Senzor. Campul rssi contine puterea semnalului WiFi in dBm.
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
PureAware_Office/#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.
| Platforma | Fisier | Descriere |
|---|---|---|
| Browser | monitor_remote.html | Deschideti in orice browser — nu necesita instalare |
| Windows | PureAware_Monitor_Setup.exe | Instalator desktop cu integrare system tray |
| Android | PureAware_Monitor_V1.apk | Aplicatie mobila cu suport pinch-to-zoom |
| Setare | Valoare Exemplu |
|---|---|
| Broker | ws://broker.emqx.io:8083/mqtt |
| Topic | PureAware_Office (acelasi topic de baza ca dispozitivul) |
| Utilizator | emqx |
| Parola | public |
| Timeout | 120 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.
Dispozitivul foloseste protocolul Zabbix Sender pentru a trimite date direct la un server Zabbix, in mod asincron.
| Parametru | Implicit |
|---|---|
| Server | monitor.microelemente.ro |
| Port | 55051 |
| Hostname | PureAware_Default |
| Interval | 60 secunde |
| Cheie Element | Tip | Unitate |
|---|---|---|
co2 | Numeric (float) | ppm |
pm1 | Numeric (float) | µg/m³ |
pm25 | Numeric (float) | µg/m³ |
pm4 | Numeric (float) | µg/m³ |
pm10 | Numeric (float) | µg/m³ |
voc | Numeric (float) | — |
nox | Numeric (float) | — |
tvocw | Numeric (float) | µg/m³ |
temp | Numeric (float) | °C |
hum | Numeric (float) | % |
press | Numeric (float) | hPa |
# Obtinere date senzor ca JSON
curl http://192.168.1.100/data.json
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")
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`);
}
# 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
# Incarcare firmware prin cURL
curl -X POST http://192.168.1.100:8081/update \
-F "firmware=@PureAware_SEN66_V1.027.bin"
┌──────────────────────────────────────────────────────────┐
│ 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
aq-lobby, aq-meeting-1)Folositi citirile CO2 pentru a modula clapetele de aer proaspat HVAC:
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 }}"
// 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"]
}
Folositi plugin-ul hardware HTTP/HTTPS Poller:
http://<ip>/data.json| Port | Protocol | Directie | Serviciu |
|---|---|---|---|
| 80 | TCP | Intrare | Dashboard HTTP Status |
| 502 | TCP | Intrare | Modbus TCP |
| 8080 | TCP | Intrare | Interfata Web de Configurare |
| 8081 | TCP | Intrare | Incarcare Firmware OTA |
| 8082 | TCP | Intrare | Incarcare Display Nextion |
| 47808 | UDP | Ambele | BACnet/IP |
| 1883 | TCP | Iesire | MQTT (catre broker) |
| 587/465 | TCP | Iesire | Email SMTP (TLS/SSL) |
| 55051 | TCP | Iesire | Zabbix Sender |
| 123 | UDP | Iesire | Sincronizare Timp NTP |
| 443 | TCP | Iesire | Verificare OTA (HTTPS) |
| 5353 | UDP | Ambele | Descoperire mDNS |
| 1900 | UDP | Ambele | Descoperire SSDP |