Uwaga: Menedżer ładowania cFos może odczytywać większość inwerterów solarnych przy użyciu SunSpec (typ urządzenia "SunSpec Solar Inverter / Meter"). W tym przypadku nie trzeba tworzyć własnej definicji licznika.
Menedżer opłat cFos umożliwia tworzenie własnych definicji liczników w celu obsługi liczników, które nie są dostępne w standardowym repertuarze. Obecnie dostępne są trzy typy: Liczniki Modbus, Liczniki HTTP/JSON i Liczniki MQTT/JSON. Pliki definicji dla tych liczników są bardzo podobne. Liczniki Modbus odczytują dane z określonych rejestrów za pośrednictwem protokołu Modbus, podczas gdy liczniki HTTP/JSON pobierają dane za pośrednictwem żądania HTTP i odczytują w JSON w odpowiedzi. W przypadku liczników MQTT/JSON, cFos Charging Manager subskrybuje tematy MQTT i odczytuje wiadomości opublikowane w ramach tematu jako JSON. Menedżer ładowania cFos używa małego "języka zapytań" do odczytu. Tutaj znajduje się dokumentacja możliwości MQTT w cFos Charging Manager.
Oprócz szeregu predefiniowanych zmiennych, takich jak prąd i napięcie, liczniki zdefiniowane przez użytkownika mogą również odczytywać nieznane, zdefiniowane przez użytkownika zmienne, odpytywać wejścia i ustawiać wyjścia. Odczytywanie zmiennych i ustawianie wyjść umożliwia analizowanie formuł. W połączeniu ze zmiennymi Charging Manager i globalnymi wyjściami Charging Manager opisanymi poniżej, jest to potężna funkcja, która umożliwia nawet niektóre zadania automatyki domowej i sterowanie urządzeniami zewnętrznymi, takimi jak akumulatory. Jeśli realizujesz zadania sterowania za pomocą tej funkcji, prosimy o informację zwrotną. Jesteśmy bardzo zainteresowani tym, co nasi klienci kontrolują za pomocą cFos Charging Manager i pomaga nam to dalej rozwijać Charging Manager zgodnie z potrzebami klientów.
Oto prosta przykładowa definicja dla Modbus, która odczytuje pojedynczy rejestr dla mocy czynnej. Można łatwo zmodyfikować numer rejestru dla konkretnej aplikacji:
Przykładowa definicja dla pojedynczego rejestru.
Oto przykładowa definicja dla Modbus i jedna dla HTTP/JSON:
Pobierz przykładową definicję dla miernika Modbus
Pobierz przykładową definicję dla miernika HTTP/JSON
Charging Manager jest już dostarczany z kilkoma takimi plikami, ale można wgrać własne pliki w "Konfiguracji systemu", a także ponownie je usunąć.
Tutaj znajdziesz większość definicji liczników, które udostępniamy:
Pobierz dostarczone definicje liczników
Jeśli stworzyłeś własny plik licznika i mógłby on być istotny dla innych użytkowników, bylibyśmy bardzo wdzięczni, gdybyś mógł go nam udostępnić. Wtedy dostarczymy go wraz z przyszłymi wersjami Charging Managera.
Pobierz definicje liczników dla dodatkowych licznikówDefinicje liczników to pliki JSON z globalnym obiektem JSON, który ma właściwości i podobiekty. 'rtype' określa typ operacji odczytu: 0 = Modbus, 1 = HTTP/JSON, 2 = MQTT/JSON. 'mtype' określa typ urządzenia: 0 = Inne urządzenie, 1 = Miernik, 2 = Falownik, 4 = Akumulator.
Liczby można podawać w systemie dziesiętnym lub szesnastkowym z prefiksem "0x". Dozwolone są również komentarze jednowierszowe z użyciem "//".
Zalecamy sprawdzenie plików definicji za pomocą walidatora JSON5, np. tego walidatora J SON5 Zdecydowanie należy przeczytać rozdział Formuły, aby zrozumieć, które wartości mogą być używane w formułach w poniższym odnośniku.
silence_period, w msec: Określa długość pauzy przed dostępem Modbus RTU, aby urządzenie rozpoznało początek komunikatu. silence_same_slave, true: Pauza jest również utrzymywana dla wielu dostępów do tego samego urządzenia. retries: Liczba ponownych prób, jeśli urządzenie nie odpowiada. rcv_timeout: w msec: Maksymalny czas oczekiwania, aż urządzenie odpowie, na dostęp.
modbus_read:
Numer funkcji polecenia Modbus do odczytu, zwykle 3 lub 4. modbus_read_max_registers: Maksymalna liczba rejestrów, które mogą być odczytywane jednocześnie. modbus_allow_gaps: true = nieużywane obszary rejestrów mogą być odczytywane w operacji odczytu.
connect_timeout: w msec: Maksymalny czas oczekiwania na połączenie TCP. delay_after_connect: w msec: Pauza po nawiązaniu połączenia przed wysłaniem pierwszego polecenia.
upd_delay: w msec: Określa interwał, w którym urządzenie może zostać odczytane.
Niektóre urządzenia są przeciążone, jeśli są odpytywane zbyt często. manufacturer: String, nazwa producenta.
Jest ona wyświetlana w rozszerzonych informacjach kafelka. delay_accumulated: true = wartości skumulowane (kWh) są odpytywane tylko co 3 sekundy lub jeśli jest wystarczająca moc. false = wartości te są zawsze odpytywane. ui_addr: adres URL, jeśli różni się od adresu urządzenia do wywoływania interfejsu internetowego. reserved: Tablica z wartościami, które są interpretowane jako 0 (przydatne, jeśli urządzenie obsługuje określone wartości w zależności od modelu).
Jeśli pominiesz właściwości wymienione powyżej, cFos Charging Manager użyje wartości domyślnych, które działają dobrze w większości przypadków.
Kolejnym krokiem w definicji JSON jest zdefiniowanie zmiennych, których miernik używa do odczytu lub obliczania wartości prądu, napięcia itp.
Charging Manager rozpoznaje następujące zmienne: type_designation, version, firmware_version, serial: Tworzą one oznaczenie modelu, jak pokazano w rozszerzonych informacjach kafelka.
Są one odpytywane raz podczas konfigurowania lub resetowania miernika. voltage_l1..voltage_l3, current_l1..current_l3, power_w, power_var, power_va, power_w_l1..power_w_l3: Menedżer ładowania cFos próbuje obliczyć na podstawie tych wartości dla voltage_l1..l3, signed current_l1..l3, power_w i power_va. Nie trzeba podawać wszystkich zmiennych.
Menedżer ładowania cFos próbuje obliczyć wartości na podstawie istniejących zmiennych. import_wh, export_wh: Menedżer ładowania używa tych zmiennych do wyświetlania import_wh i export_wh. W przypadku liczników jednokierunkowych (np. falowników) należy zawsze definiować tylko import_wh.
Tylko w przypadku liczników dwukierunkowych (takich jak liczniki magazynowe lub liczniki odniesienia do sieci) należy zdefiniować export_wh. soc: Jeśli jest dostępny, stan naładowania akumulatora jest wyświetlany w % w kafelku.
Można również zdefiniować inne zmienne o różnych nazwach, które są odczytywane przy każdej aktualizacji lub obliczane za pomocą formuł. W przypadku zdefiniowania zmiennych zaczynających się od "CM.", np. CM._set_price, przypisane wartości są przechowywane w globalnych zmiennych Charging Manager (patrz poniżej) i mogą być odpowiednio wyszukiwane.
Zmienne z *: W przypadku zdefiniowania zmiennych zaczynających się od "*", są one wyświetlane w interfejsie użytkownika w kafelku licznika pod rozszerzonymi informacjami, np. temperatura jednostki przechowywania baterii.
Uwaga: W nazwach zmiennych można używać wyłącznie cyfr oraz liter a-z i A-Z.
Obiekt nosi nazwę zmiennej wymienionej powyżej i ma następujące właściwości: fixed: String ze stałą wartością.
Przydatne, jeśli na przykład nie można określić żadnej wartości, np. dla type_designation lub voltage. expr: String.
Zmienna nie jest odczytywana, ale obliczana jako formuła. type: Jeśli nie fixed lub expr, typ zmiennej: int16, uint16, int32, uint32, float, int64, string. Jest to ważne dla Modbus, aby odczytywać rejestry we właściwym formacie. uint16 i uint32 to typy, które mogą akceptować tylko liczby dodatnie.
W przypadku JSON/HTTP zwykle można użyć float. rozdzielczość: float. Odczytana wartość jest mnożona przez "rozdzielczość". Wartości napięcia muszą być w woltach, prądu w miliamperach, mocy w watach, energii w watogodzinach (Wh).
Przy ujemnej "rozdzielczości" można odwrócić wartość, jeśli ma ona przeciwny znak. once: bool (true lub false).
Jeśli true, wartość jest odczytywana tylko raz podczas inicjalizacji urządzenia, w przeciwnym razie jest odczytywana okresowo. address: liczba (Modbus) lub ciąg znaków (HTTP/JSON).
Numer rejestru Modbus lub adres URL HTTP wartości, która ma zostać odczytana. query: String.
W przypadku HTTP JSON specyfikacja w języku zapytań Charging Managera, za pomocą której znajduje on wartość do odczytania w odpowiedzi JSON. order: String. W przypadku protokołu Modbus, kolejność bajtów, "hl" lub "lh", w której znajduje się wartość. length: number. Dla Modbus, długość łańcucha w rejestrach; dla zmiennych "version" i "firmware_version", "length" służy do przekształcania wersji numerycznych w ciągi z kropkami. Dozwolone są wartości 2 lub 4 dla 'length', co skutkuje formatami wersji a.b i a.b.c.d. Przy 'length' 2 i typie 'int16' lub 'uint16', Charging Manager oddziela niski i wysoki bajt kropką, przy 'int32' lub 'uint32' niski i wysoki wyraz, przy 'int64' niski i wysoki dword. W przypadku "lenth" 4 i "int32" lub "uint32" Menedżer ładowania dzieli wartość na 4 bajty oddzielone kropką.
W przypadku "int64" odpowiednio 4 słowa. regex: String. Jeśli określono wyrażenie regularne, odpowiedź licznika nie musi być w formacie JSON. Jako wynik oceniane jest albo całe dopasowanie wyrażenia regularnego, albo pierwsza grupa. Należy używać tylko wtedy, gdy urządzenie nie zwraca JSON.
Oto lista funkcji naszych wyrażeń regularnych: dowolny znak: . nazwane klasy:
\d \s \w \D \S \W klasy anonimowe: [a-z0-9_], [^0-9], [^\d] grupy z alternatywami: (ab|cd|ef) grupy nieprzechwycone: (?:ab|cd) (zachłanne) raz lub brak: a?, a????
(zachłanny) wiele lub żaden: a*, a*?
(greedy) raz lub więcej: a+, a+? początek ciągu: ^ koniec ciągu: $
Menedżer ładowania może zażądać do 32 wartości wejściowych na urządzenie z różnych rejestrów lub elementów JSON. Właściwość "Inputs" jest tablicą JSON.
Dla każdego wejścia należy zdefiniować następujące właściwości: address: Adres (rejestr Modbus lub adres URL).
count:
Liczba bitów wejściowych, które są odczytywane za pomocą tego żądania. query: Dla HTTP/JSON, język zapytań, aby znaleźć wartość w odpowiedzi.
Menedżer ładowania cFos odczytuje wszystkie wejścia zdefiniowane w ten sposób przy każdej aktualizacji i przechowuje bity wewnętrznie w tablicy, którą można następnie przeszukiwać za pomocą formuł Input1..InputN.
Menedżer ładowania może przełączać do 32 wyjść na urządzenie. Wyjścia są zdefiniowane w "outputs" jako tablica JSON obiektów wyjściowych. Wszystkie wyjścia są przełączane na koniec każdego cyklu aktualizacji, jeśli stan danego wyjścia uległ zmianie.
Dla każdego wyjścia należy zdefiniować następujące właściwości w obiekcie wyjścia: address: HTTP URL z opcjonalną metodą HTTP, np. GET http://www.example.com?output1=${var1}. Aby ustawić rejestry Modbus, można użyć interfejsu API HTTP cFos Charging Manager. Charging Manager rozpoznaje odpowiednie dostępy na localhost i przekierowuje żądanie do wewnętrznej obsługi, dzięki czemu nie jest wymagana autoryzacja, jak w przypadku zewnętrznych dostępów HTTP API. Jeśli adres URL jest pusty po wszystkich zamianach, żadne wyjście nie zostanie ustawione. Na przykład, można przełączać dane wyjściowe tylko wtedy, gdy istnieją określone zmienne (patrz formuły: funkcja exists()). W adresie można również podać ${address} i ${id}. Jest to bieżący adres urządzenia i identyfikator Modbus zdefiniowany w ustawieniach.
"Adres" i "id" są używane głównie do korzystania z interfejsu API Modbus (patrz poniżej). body: Opcjonalna treść HTTP dla POST lub PUT.
W adresie URL i treści można użyć ${expr}, aby użyć formuł, które odwołują się do globalnych zmiennych menedżera ładowania lub z odpowiedniego licznika. Formuła "expr" jest obliczana, gdy dane wyjściowe są ustawiane i zastępowane w tekście adresu URL lub treści. Jeśli w powyższym przykładzie http://www.example.com?output1=1 ustawia dane wyjściowe, a http://www.example.com?output1=0 je usuwa, można zdefiniować zmienną "var1" i ustawić ją na 1 lub 0 w zależności od potrzeb. W ten sposób można również zapisywać wartości liczbowe w celu kontrolowania wydajności pamięci w rejestrach Modbus, które wcześniej zostały zapisane w zmiennej za pomocą formuły.
Jeśli zamiast przekazywać wartość liczbową, musisz zastąpić jeden tekst w adresie URL innym w zależności od formuły, np. dla gniazd Shelly WLAN, możesz napisać to w następujący sposób: ${if expr`text1`text2}. "Apostrof" to backtick (kod ASCII 96). Jeśli "expr" != 0, używany jest tekst1, w przeciwnym razie tekst2. W przypadku gniazda Shelly WLAN adres URL wygląda następująco, na przykład: http://<ip-addr>/relay/0?turn=${if expr`on`off}, tzn. jeśli expr != 0, Charging Manager wywołuje http://<ip-addr>/relay/0?turn=on, w przeciwnym razie http://<ip-addr>/relay/0?turn=off.
Jeśli jako adres URL zostanie wprowadzona ścieżka względna, Charging Manager użyje adresu skonfigurowanego dla danego urządzenia. Jeśli wprowadzisz "localhost" jako domenę, Charging Manager przyjmie adres urządzenia, na którym jest uruchomiony. Jeśli rozpozna dostęp do własnego interfejsu API, użyje wewnętrznego programu obsługi zamiast wykonywania pełnego dostępu HTTP, dzięki czemu nie trzeba wprowadzać nazwy użytkownika i hasła w definicji licznika. Adres URL zaczynający się od "*" powoduje, że Charging Manager zawsze wykonuje pełny dostęp HTTP.
Resetowanie wyjść: Oprócz tablicy "outputs" można również zdefiniować tablicę o nazwie "resets", która ma strukturę podobną do tablicy "outputs". Pozwala to na zresetowanie wyjść do ich wartości początkowych, gdy urządzenie jest dezaktywowane. Może to być używane w połączeniu ze zmiennymi zdefiniowanymi przez użytkownika i "once": true, aby zresetować urządzenie do stanu początkowego.
Okresowe zapisywanie wyjść: W przypadku niektórych urządzeń wyjścia muszą być zapisywane okresowo, w przeciwnym razie urządzenie zresetuje wartości do "domyślnych". Na przykład pamięć Kostal powraca do swoich domyślnych reguł, jeśli sterowanie pamięcią nie było aktywnie zapisywane przez jakiś czas. Aby okresowo ustawiać wyjścia, można poprzedzić adres #xxx#, gdzie xxx wskazuje, co ile sekund wyjście jest przepisywane, nawet jeśli wartość do zapisania pozostała taka sama. Na przykład, jeśli adres to /cnf?cmd=set_cm_vars&name=test&val=42, można użyć #30#/cnf?cmd=set_cm_vars&name=test&val=42, aby zapewnić, że wartość ta będzie zapisywana co 30 sekund.
Obecnie w wyrażeniach wyszukiwania "query" można używać nazw członków oraz operatorów "." i "[]", przykłady:
test | Element o nazwie "test" |
nazwa1.nazwa2 | Element o nazwie "nazwa2" w obiekcie dziecięcym "nazwa1" |
name[idx] | Element "idx" elementu obiektu "nazwa". "idx" może być liczbą, np. dla tablic lub ciągiem znaków |
name["u2"] | Element "u2" elementu obiektu "nazwa", odpowiada "nazwa.u2" |
name[{"el1": "v1", "el2": 3}].value | Wybierz element tablicy, który spełnia warunek zapisu obiektowego i oceń element o nazwie 'value'. Tutaj na przykład w tablicy 'nazwa' wybierany jest element, który ma jako obiekty elementy 'el1' o wartości 'v1' i 'el2' o wartości 3, a następnie z tego obiektu zwracana jest wartość elementu 'wartość'. |
W konfiguracji Charging Manager można tworzyć zmienne. Jako wartości można użyć stałej wartości lub formuły. Na koniec każdego cyklu aktualizacji Charging Manager w razie potrzeby ponownie oblicza wartość tych zmiennych. Następnie można ich użyć w (niektórych) parametrach Charging Manager, regułach ładowania lub do sterowania wyjściami. Można również zapisać Ex.member lub Mx.member jako zmienną. W tym przypadku Exi Mxsą identyfikatorami urządzeń stacji ładowania lub liczników skonfigurowanych w aplikacji Charging Manager. "member" to zmienna "zdefiniowana przez użytkownika", która jest zapisywana w odpowiednim urządzeniu. Niektóre zmienne mogą mieć specjalne znaczenie: Dla KEBA, 'out1' jest wyjściem przełączającym, dla liczników ABB B23, 'out1' i 'out2' są wyjściami przełączającymi (dla modeli, które to obsługują). 1 przełącza wyjście, 0 wyłącza je ponownie.
Jeśli masz urządzenia, które muszą być włączone w określonych warunkach, a następnie działają przez pewien czas (np. pralka, zmywarka), możesz również zdefiniować zmienną jako "wyzwalacz". Wtedy formuła zmiennej jest warunkiem, w którym zmienna jest ustawiona na 1. Po upływie określonego czasu zmienna jest ponownie ustawiana na 0. "Warunek ponownego wyzwolenia" umożliwia wielokrotne wydłużanie czasu do wyłączenia (tj. ustawienia zmiennej na 0), o ile warunek jest spełniony.
Uwaga: W nazwach zmiennych można używać wyłącznie cyfr oraz liter a-z i A-Z.
Do celów testowych można wyświetlić menedżera ładowania i zmienne licznika, np. bieżące ceny Awattar:
W konfiguracji Menedżera ładowania można skonfigurować globalne wyjścia, jak opisano powyżej w definicji licznika w sekcji "Wyjścia". Są one ustawiane na koniec każdego cyklu aktualizacji, jeśli ich stan uległ zmianie. Jeśli chcesz sterować wyjściami przełączającymi w urządzeniach zdefiniowanych przez użytkownika, zalecana jest powyższa konwencja (patrz Zmienne Charging Manager): Ustawiasz zmienne o nazwach "out1", "out2" itd. w liczniku zdefiniowanym przez użytkownika i ustawiasz wyjścia w liczniku zdefiniowanym przez użytkownika, które przełączają wyjście w zależności od wartości tych zmiennych.
Interfejs API Modbus menedżera ładowania służy do sterowania urządzeniami Modbus, które mają dowolny adres Modbus RTU lub TCP (dostępny z menedżera ładowania). Podobnie jak w przypadku konfiguracji poszczególnych urządzeń, wprowadź COMx,bd,8,p,s jako adres dla Modbus RTU, gdzie x to numer portu COM, bd to szybkość transmisji, p to parzystość ("N", "E" lub "O"), a s to liczba bitów stopu (1 lub 2). W przypadku protokołu Modbus TCP adres to adres IP urządzenia w sieci Charging Manager, w tym numer portu.
Adres URL (dla HTTP GET) interfejsu API Modbus to: /cnf?cmd=modbus_get lub /cnf?cmd=modbus_set Menedżer ładowania cFos obsługuje następujące dodatkowe parametry zapytania: addr:
Adres urządzenia Modbus RTU lub TCP wspomniany powyżej. func: Numer funkcji Modbus, np. dla odczytu 3 lub 4, dla zapisu 6 lub 16. id: Identyfikator urządzenia Modbus. reg: Numer rejestru Modbus.
Wartość może być podana w systemie dziesiętnym lub szesnastkowym (z prefiksem 0x). val: number: Wartość do zapisania w rejestrze.
Pomiń przy odczycie. type: 'w' 16bit (domyślnie), d = 32bit, f = float, q = 64bit, s = string.
c nt: number: Maksymalna długość łańcucha w rejestrach, pominąć dla innych typów lub ustawić na 1. order: String: Kolejność bajtów, "hl" lub "lh".
Uwaga: Jeśli Twój "licznik" ma przede wszystkim zadania kontrolne, możesz w ustawieniach tego kafelka zaznaczyć opcję "Ukryj urządzenie", aby to urządzenie nie pojawiało się na stronie startowej.
Uwaga: Niektóre mierniki, które są odczytywane poprzez HTTP, wymagają jako autoryzacji nazwy użytkownika/hasła. Można to określić w adresie dla dostępu HTTP, np. za pomocą http://username:password@192.168.2.111
. Jeśli nazwa użytkownika lub hasło zawiera znak "@", należy go zastąpić znakiem "%40".