Как создать несколько устройств BACnet/IP в одном «приложении» (один и тот же <ip>:<порт>) с помощью Python (для одного Python

Программы на Python
Ответить
Anonymous
 Как создать несколько устройств BACnet/IP в одном «приложении» (один и тот же <ip>:<порт>) с помощью Python (для одного

Сообщение Anonymous »

Я занимаюсь разработкой на python 3.13 в Windows.
У меня 2 компьютера:
  • На первом я хочу запустить файл .py для имитации нескольких устройств BACnet на моем компьютере. IP-адрес: 192.168.1.54/24, порт = BAC0 (47808)
  • На втором, в той же подсети, я хочу визуализировать свои устройства, подключившись к YABE (еще один BACnet Explorer) со следующей конфигурацией: «BACnet/IP V4 и V6 через Udp» port = BAC0 и Local endpoint = 192.168.1.38
До сих пор мне удавалось создать 1 устройство с 2 переменными по умолчанию, используя BAC0.lite (BAC0==2025.9.15):

Код: Выделить всё

#!/usr/bin/env python3
"""
BACnet device with custom objects - Fixed version => Mahé can see my 2 variables on his PC using YABE!
"""

import asyncio
from BAC0 import lite
from bacpypes3.local.analog import AnalogValueObject, AnalogInputObject
from bacpypes3.primitivedata import Real, ObjectIdentifier
from bacpypes3.basetypes import EngineeringUnits

async def main():
try:
print("🚀 Starting BACnet device with objects...")

# Create BACnet device
bacnet_device = lite(ip="192.168.1.54/24", deviceId=1234)

# Access underlying bacpypes3 application to create objects
app = bacnet_device.this_application.app

# Create BACnet objects
temp_sensor = AnalogValueObject(
objectIdentifier=ObjectIdentifier("analogValue,1"),
objectName="Room_Temperature",
presentValue=Real(22.5),
units=EngineeringUnits.degreesCelsius,
description="Temperature sensor",
)
app.add_object(temp_sensor)

pressure_sensor = AnalogInputObject(
objectIdentifier=ObjectIdentifier("analogInput,2"),
objectName="Room_Pressure",
presentValue=Real(1013.25),
units=EngineeringUnits.pascals,
description="Pressure sensor",
)
app.add_object(pressure_sensor)

print("✅ BACnet device with objects created!")
print("   Device ID: 1234")
print("   Address: 192.168.2.110/24")
print("   Created objects:")
print(f"   - {temp_sensor.objectName}: {temp_sensor.presentValue} °C")
print(f"   - {pressure_sensor.objectName}: {pressure_sensor.presentValue} Pa")
print("\n🔍 Scan with YABE to see objects")

# Keep running
await asyncio.Future()

except KeyboardInterrupt:
print("\n🛑 Stopped")
except Exception as e:
print(f"❌ Error: {e}")
finally:
if 'bacnet_device' in locals():
await bacnet_device.disconnect()

if __name__ == "__main__":
asyncio.run(main())
Во время выполнения:

Код: Выделить всё

(xml_3_13) PS C:\Users\POTIEAL\Documents\RetD\m2524238-convertisseur_xml_danfoss> python .\test_bacnet_BAC0_eng.py
🚀 Starting BACnet device with objects...
2026-03-27 17:05:07,682 - INFO    | Starting Asynchronous BAC0 version 2025.09.15 (Lite)
2026-03-27 17:05:07,682 - INFO    | Using bacpypes3 version 0.0.106
2026-03-27 17:05:07,682 - INFO    | Use BAC0.log_level to adjust verbosity of the app.
2026-03-27 17:05:07,682 - INFO    | Ex.  BAC0.log_level('silence') or BAC0.log_level('error')
2026-03-27 17:05:07,762 - INFO    | Using ip : 192.168.1.54/24 on port 47808 | broadcast : 192.168.1.255
2026-03-27 17:05:08,394 - INFO    | Using default JSON configuration file
2026-03-27 17:05:08,400 - INFO    | Registered as BACnet/IP App | mode normal
2026-03-27 17:05:08,401 - INFO    | Device instance (id) : 1234
✅ BACnet device with objects created!
Device ID: 1234
Address: 192.168.2.110/24
Created objects:
- Room_Temperature: 22.5 °C
- Room_Pressure: 1013.25 Pa

🔍 Scan with YABE to see objects
2026-03-27 17:05:08,402 - INFO    | Installing recurring task Ping Registered Devices Task (id:2480079317248)
2026-03-27 17:05:08,405 - INFO    | Installing recurring task Cleanup Tasks List (id:2480079430160)
Вид YABE моего устройства 1234
Но когда я попытался создать другое устройство:
  • с помощью BAC0 и пытаясь установить другой экземпляр BAC0.lite, я получил: BAC0.core.io.IOExceptions.InitializationError: предоставленный IP-адрес (192.168.49.110) недействителен. Проверьте, не использует ли другое программное обеспечение порт 47808 на этом сетевом интерфейсе. Если да, вы можете определить несколько IP-адресов для каждого интерфейса. Или укажите другой IP с помощью BAC0.lite(ip='IP/mask')
  • Я также пробовал напрямую работать с bacpypes3 вместо BAC0 с такими объектами, как:

    Код: Выделить всё

    from bacpypes3.vlan import Network as VirtualNetwork, Node as VirtualNode
    
    Однако я был ошеломлен, поскольку попробовал дюжину вариантов и получил такие ошибки, как:

    Код: Выделить всё

      File "C:\Users\POTIEAL\Documents\RetD\m2524238-convertisseur_xml_danfoss\venv\xml_3_13\Lib\site-packages\bacpypes3\netservice.py", line 576, in bind
    raise RuntimeError("already bound: %r" % (net,))
    
    при исполнении или

    Код: Выделить всё

        raise ConfigurationError("unbound server")
    
    bacpypes3.comm.ConfigurationError: unbound server
    
    при получении whois() со 2-го компьютера..
Как просто объявить отдельные устройства на основе их идентификатора (или имени) на одном и том же ip:port, чтобы видеть все объекты BACnet с одним соединением на YABE моего 2-го компьютера?>
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»