Przejdź do głównej zawartości

Zaprogramowane sterowanie MQTT

wskazówka

Zaprogramowane sterowanie MQTT jest przeznaczone do zaplanowanych wiadomości z wyprzedzeniem. W przypadku sterowania na żywo, zobacz Sterowanie MQTT na żywo zamiast tego.

Ten przewodnik pomoże Ci skonfigurować MQTT na Twoim DemoBrandName ControllerDemoName, aby zdalnie sterować i monitorować instalacje baterii i paneli słonecznych.

Co potrzebujesz

  1. DemoBrandName ControllerDemoName z dostępem do internetu.
  2. Poświadczenia MQTT: Można je uzyskać, wysyłając e-mail na adres support@eniris.be.
  3. Środowisko deweloperskie Pythona (lub inny klient MQTT). Ten przewodnik używa podstawowego przykładu napisanego w Pythonie, aby pomóc Ci rozpocząć pracę z MQTT i wysyłaniem komend. Zalecamy użycie Pythona ze względu na łatwość użycia, ale wspierany jest także każdy inny klient MQTT.

Dodatkowe informacje

MQTT jest szybkim protokołem komunikacyjnym w Internecie. To system wiadomości publish/subscribe, który pozwala na bezpośrednie połączenie między Twoją maszyną a DemoBrandName ControllerDemoName. Twoje zasoby są klasyfikowane w grupy: solarne, baterie, EV i HVAC. W tej chwili ta integracja pozwala na kontrolę na poziomie grupy, a nie poszczególnych urządzeń.

Konfiguracja po raz pierwszy (Punkt wyjścia dla nowych użytkowników)

Mam DemoBrandName ControllerDemoName, który chciałbym skonfigurować do zdalnego sterowania MQTT.

1. Sprawdź swoją sieć

Upewnij się, że Twoja sieć pozwala na ruch sieciowy mqtt przez port 1883. Możesz to sprawdzić, używając polecenia:

nc -zv mqtt.eniris.be 1883

Jeśli to polecenie nie jest dostępne, możesz w alternatywny sposób pobrać i uruchomić ten kod Pythona.

W przypadku wątpliwości skonsultuj się ze swoim inżynierem sieciowym lub tymczasowo użyj hotspotu 4G/5G swojego telefonu w przypadku wystąpienia błędów połączenia.

notatka

Gdy port 1883 nie jest dostępny w Twojej sieci, oferujemy zabezpieczenie na porcie 80. Można to skonfigurować w Twoim kliencie MQTT na późniejszym etapie tego podręcznika.

2. Dodaj swoje urządzenia

Zaloguj się do interfejsu uruchamiania i upewnij się, że urządzenia zostały dodane do DemoBrandName ControllerDemoName.

3. Dodaj zewnętrzny sygnał MQTT

Obraz 1
Obraz 1
Obraz 1

4. Włącz zdalny sygnał MQTT

Wybierz wszystkie urządzenia, które chcesz włączyć do zdalnego sterowania MQTT.

Obraz 1

5. Sygnał zdalny został dodany

Interfejs zdalnego sterowania MQTT został teraz aktywowany na Twoim DemoBrandName ControllerDemoName.

Jesteśmy gotowi do wysyłania podstawowych komend za pomocą prostego przykładu. Kolumna Status informuje, czy jakaś komenda jest aktywna.

Skrypt demo w Pythonie

Dobrą bazą wyjściową byłoby przetestowanie nowo skonfigurowanej integracji przy użyciu prostego przykładu.

Ten kod testowy wykonuje prostą pracę, ciągle wysyłając następujący harmonogram:

  • Bateria: Ładowanie z mocą 5 kW przez 15 minut co 10 minut
  • Energia słoneczna: Ustawienie mocy na 0 kW przez godzinę co 30 minut

DemoBrandName ControllerDemoName odpowiada wiadomością potwierdzającą zawierającą unikalny identyfikator harmonogramu lub wiadomością o błędzie.

Następnie pobieramy następny harmonogram dla obu typów urządzeń, potwierdzając, że komenda została wykonana pomyślnie.

Proszę pobrać plik poniżej w preferowanym IDE Pythona. Wypełnij swój numer seryjny i poświadczenia MQTT, a następnie uruchom skrypt:

Gdy powyższe zakończy się sukcesem, możesz kontynuować wysyłanie innych typów wiadomości. Wszystkie wiadomości opisano poniżej.

Dokumentacja MQTT do wysyłania komend

Ta sekcja szczegółowo opisuje format wiadomości MQTT i wymagania dotyczące ładunku do skonfigurowania zaplanowanej kontroli urządzeń w sieci DemoBrandName ControllerDemoName.

Tematy MQTT

  • Temat subskrypcyjny: standard1/rp_one_s/remoteScheduleMetrics/<controller SN>
  • Temat informacji zwrotnej: standard1/outbound/remoteScheduleMetrics/feedback/<controller SN>

Gdzie <controller SN> powinien zostać zastąpiony rzeczywistym numerem seryjnym DemoBrandName ControllerDemoName, który zamierzasz kontrolować.

Typy wiadomości MQTT

1. Ustaw harmonogram (set_schedule)

Tworzy nowy harmonogram dla typu urządzenia.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Timestamp Unix>,
"message_type": "set_schedule",
"fields": {
"device_type": "<Typ urządzenia>",
"node_id": "<ID węzła>" (Opcjonalnie),
"start_time": <Timestamp Unix>,
"end_time": <Timestamp Unix>,
"policy": "<Polityka>",
"power_setpoint_w": <Ustawienie w watach>,
"site_import": <Import miejsca w watach>,
"site_export": <Eksport miejsca w watach>,
"remove_overlap": <True/False> (Opcjonalnie) (default=False),
"tag": <Tag String> (Opcjonalnie) (default=None),
}
}

Odpowiedź (Sukces):

{
"requestTime": <Timestamp Unix>,
"time": <Timestamp Unix>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedule_ack",
"state": {
"schedule_id": <ID harmonogramu>,
"deleted_ids": <Usunięte ID harmonogramów, jeśli remove_overlap=True>
"tag": <Tag String> (default=None),
},
"responseCode": 0
}
}

2. Ustaw harmonogramy (set_schedules)

Tworzy wiele nowych harmonogramów.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Timestamp Unix>,
"message_type": "set_schedules",
"fields":
"0": '{
"device_type": "<Typ urządzenia>",
"node_id": "<ID węzła>" (Opcjonalnie),
"start_time": <Timestamp Unix>,
"end_time": <Timestamp Unix>,
"policy": "<Polityka>",
"power_setpoint_w": <Ustawienie w watach>,
"site_import": <Import miejsca w watach>,
"site_export": <Eksport miejsca w watach>,
"remove_overlap": <True/False> (Opcjonalnie) (default=False),
}',
"1": '{
"device_type": "<Typ urządzenia>",
"node_id": "<ID węzła>" (Opcjonalnie),
"start_time": <Timestamp Unix>,
"end_time": <Timestamp Unix>,
"policy": "<Polityka>",
"power_setpoint_w": <Ustawienie w watach>,
"site_import": <Import miejsca w watach>,
"site_export": <Eksport miejsca w watach>,
"remove_overlap": <True/False> (Opcjonalnie) (default=False),
}',
...
}

Odpowiedź (Sukces):

{
"requestTime": <Timestamp Unix>,
"time": <Timestamp Unix>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedules_ack",
"state": {
"schedule_ids": <ID harmonogramów>,
"deleted_ids": <Usunięte ID harmonogramów, jeśli remove_overlap=True>
},
"responseCode": 0
}
}

3. Pobierz harmonogram (get_schedule)

Pobiera konkretny harmonogram według ID.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Timestamp Unix>,
"message_type": "get_schedule",
"fields": {
"id": <ID harmonogramu>
}
}

Odpowiedź:

{
"requestTime": <Timestamp Unix>,
"time": <Timestamp Unix>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

#### 4. Pobierz aktywny harmonogram (`get_active_schedule`)
Pobiera obecnie aktywny harmonogram dla typu urządzenia.

```json
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_active_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcjonalnie),
}
}

Odpowiedź (Sukces):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_active_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

5. Pobierz następny harmonogram (get_next_schedule)

Pobiera następny nadchodzący harmonogram dla typu urządzenia.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_next_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcjonalnie),
}
}

Odpowiedź (Sukces):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_next_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

6. Pobierz harmonogramy (get_schedules)

Pobiera wszystkie harmonogramy dla określonej daty.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedules",
"fields": {
"date": "<Date String of Format dd/mm/yyyy>"
}
}

Odpowiedź (Sukces):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}

7. Pobierz przyszłe harmonogramy (get_future_schedules)

Pobiera wszystkie przyszłe harmonogramy.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_future_schedules",
"fields": {}
}

Odpowiedź (Sukces):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_future_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}

8. Usuń harmonogram (remove_schedule)

Usuwa konkretny harmonogram według ID.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "remove_schedule",
"fields": {
"id": <Schedule ID>
}
}

Odpowiedź (Sukces):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "remove_schedule_ack",
"state": "Harmonogram <Schedule ID> został pomyślnie usunięty",
"responseCode": 0
}
}

9. Pobierz opinie dotyczące strony (get_feedback)

Pobiera szczegółowe opinie na temat stanu systemu.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_feedback",
"fields": {
"device": <Device (node) level>
}
}

Odpowiedź (Sukces):

Struktura ładunku informacji zwrotnej

10. Topologia strony (get_toplogy)

Pobiera topologię strony.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_topology",
"fields": {}
}

Odpowiedź (Sukces):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_topology_ack",
"state": {
"nodeId": <nodeId>,
"nodeType": <nodeType>,
"nomCurrent": <nominalCurrent>
"children": [{<ChildObject>}]
},
"responseCode": 0
}
}

Standardowy format odpowiedzi harmonogramu

{
"id": <Schedule ID>,
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcjonalnie),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Schedule Policy>",
"power_setpoint_w": <Setpoint in watts>,
"created_at": <Unix Timestamp>
}

Typy komponentów i zasady

Aby uzyskać szczegóły dotyczące dostępnych komponentów i zasad, które można zaplanować, zapoznaj się z sekcją Komponenty i polityki MQTT w dokumentacji na żywo MQTT Control.

Harmonogramy specyficzne dla urządzenia można wysyłać za pomocą opcjonalnego pola node_id, odnosząc się do identyfikatora węzła kontrolowanego urządzenia.

Obsługa błędów

Wszystkie wiadomości mogą zwrócić odpowiedź z błędem z responseCode: 1, gdy wystąpi błąd:

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "<Message Type>_ack",
"error": <Error Body>,
"responseCode": 1
}
}

Gdy wystąpi niepowiązany błąd, typ wiadomości będzie ( general_error ).

Typowe błędy obejmują:

  • Nakładanie się harmonogramów z istniejącymi harmonogramami
  • Nieprawidłowy zakres czasowy
  • Typ urządzenia nie znaleziony
  • ID harmonogramu nie znaleziony
  • Nieprawidłowa polityka dla typu urządzenia

Zasady zarządzania harmonogramem

  1. Zasady dotyczące nakładania się
    • Harmonogramy nie mogą się nakładać dla tego samego typu urządzenia
    • Harmonogramy nie mogą się nakładać dla tego samego urządzenia
    • Harmonogramy dla tego samego urządzenia i typu urządzenia nie mogą się nakładać
    • Istniejące, nakładające się harmonogramy zostaną usunięte, jeśli zmienna remove_overlap jest ustawiona na True podczas tworzenia nowego harmonogramu.
  2. Każdy harmonogram musi mieć:
    • Ważny typ urządzenia
    • Czas rozpoczęcia (znacznik czasu Unix)
    • Czas zakończenia (znacznik czasu Unix)
    • Politykę (zgodną z dostępnymi politykami typu urządzenia)
    • Ustawienie mocy (dla polityk, które tego wymagają)
  3. Czas rozpoczęcia musi być przed czasem zakończenia
  4. Jeśli czas rozpoczęcia jest w przeszłości, zostanie automatycznie zmieniony na rozpoczęcie teraz
  5. Harmonogramy mogą być usuwane tylko wtedy, gdy jeszcze się nie rozpoczęły. Aktywne harmonogramy nie mogą być usuwane.
  6. Harmonogramy można ustawiać niezależnie dla różnych typów urządzeń
  7. System automatycznie stosuje odpowiednią politykę, gdy harmonogram staje się aktywny