Dokumentation

Brugerdefinerede tællere

Bemærk: cFos Charging Manager kan aflæse de fleste solcelleinvertere ved hjælp af SunSpec (enhedstype "SunSpec Solar Inverter / Meter"). I dette tilfælde behøver du ikke at oprette din egen målerdefinition.

CFos Charging Manager giver dig mulighed for at oprette dine egne målerdefinitioner for at understøtte målere, der ikke er i standardrepertoiret. Der findes i øjeblikket tre typer: Modbus-tællere, HTTP/JSON-tællere og MQTT/JSON-tællere. Definitionsfilerne for disse tællere er meget ens. Modbus-tællere læser deres data via Modbus fra specifikke registre, mens HTTP/JSON-tællere henter deres data via HTTP-forespørgsel og analyserer JSON som svar. For MQTT/JSON-tællere abonnerer cFos Charging Manager på MQTT-emner og analyserer meddelelser, der offentliggøres under emnet, som JSON-meddelelser. Til parsing bruger cFos Charging Manager et lille "forespørgselssprog". Her er dokumentationen af MQTT-funktionerne i cFos Charging Manager.

Ud over en række foruddefinerede variabler, f.eks. strøm og spænding, kan brugerdefinerede tællere også læse ukendte brugerdefinerede variabler, forespørge indgange og indstille udgange. Læsning af variabler og indstilling af udgange gør det muligt at evaluere formler. I kombination med Charging Manager-variablerne og de globale Charging Manager-udgange, der er beskrevet nedenfor, er dette en kraftfuld funktion, som endda giver mulighed for visse automatiseringsopgaver i hjemmet og styring af eksterne enheder som f.eks. batterilagring. Hvis du får kontrolopgaver med dette, bedes du give os feedback. Vi er meget interesserede i, hvad folk styrer med cFos Charging Manager, og det hjælper os med at videreudvikle Charging Manager i overensstemmelse med kundernes behov.

Her er et simpelt eksempel på en definition for Modbus, der læser et enkelt register for aktiv effekt. Du kan nemt ændre registernummeret til din specifikke applikation:
Eksempel på en definition for et enkelt register.

Her er et eksempel på en definition for Modbus og en for HTTP/JSON:
Download eksempeldefinition for Modbus-måler
Download en eksempeldefinition for HTTP/JSON-måler

Charging Manager leveres allerede med et par sådanne filer, men du kan uploade dine egne filer under "Systemkonfiguration" og slette dem igen.
Her finder du de fleste af de meterdefinitioner, som vi leverer:
Download de medfølgende tællerdefinitioner

Så vil vi levere den sammen med fremtidige versioner af Charging Manager.

Download målerdefinitioner for yderligere målere

Strukturen af en definitionsfil:

Tællerdefinitioner er JSON-filer med et globalt JSON-objekt, der har egenskaber og underobjekter. 'rtype' bestemmer typen af læseoperation: 0 = Modbus, 1 = HTTP/JSON, 2 = MQTT/JSON. 'mtype' bestemmer enhedstypen: 0 = Anden enhed, 1 = Måler, 2 = Inverter, 4 = Batterilager.

Du kan angive tal enten i decimal eller hex med præfikset 0x. Enkeltlinjekommentarer med // er også tilladt.

Vi anbefaler, at du kører dine definitionsfiler gennem en JSON5-validator, f.eks. denne JSON5-validator Du bør helt sikkert have læst kapitlet Formler for at forstå, hvilke værdier der kan bruges i formler i den følgende reference.

Modbus-definitioner har et objekt "rtu" med følgende egenskaber:

silence_period, i msec. bestemt, pauselængden før en Modbus RTU-adgang, så enheden kan genkende starten af en meddelelse.
silence_same_slave, true: Pausen overholdes også ved flere adganger til den samme enhed.
retries: Antallet af forsøg, hvis enheden ikke svarer.
rcv_timeout: i msec. den maksimale ventetid pr. adgang, indtil enheden svarer.

Disse globale egenskaber gælder for Modbus TCP og RTU:

modbus_read: Funktionsnummeret for Modbus-læsekommandoen, normalt 3 eller 4.
modbus_read_max_registers: Det maksimale antal registre, der kan læses ad gangen.
modbus_allow_gaps: true = Ubrugte registerområder kan læses i en læseoperation.

For Modbus TCP og HTTP/JSON findes der et objekt "tcp" med følgende egenskaber:

connect_timeout: er msec. den maksimale ventetid for en TCP-forbindelse.
delay_after_connect: i msec. Hold pause, når forbindelsen er oprettet, før du sender den første kommando.

Begge definitionstyper (Modbus og HTTP/JSON) har følgende yderligere egenskaber:

upd_delay: i msec. bestemmer det interval, hvor en enhed kan læses. Nogle enheder overbelastes, hvis de forespørges for ofte.
manufacturer: String, navn på producenten. Dette vises i de udvidede oplysninger på flisen.
delay_accumulated: true = Akkumulerede værdier (kWh) forespørges kun hvert 3. sekund, eller hvis der er tilstrækkelig strøm. false = Disse værdier forespørges altid.
ui_addr: URL, hvis forskellig fra enhedens adresse til at kalde webgrænsefladen.
reserved: Array med værdier, der fortolkes som 0 (nyttigt, hvis enheden understøtter visse værdier afhængigt af modellen).

Hvis du udelader de egenskaber, der er anført ovenfor, tager cFos Charging Manager standardværdier, der fungerer godt i de fleste tilfælde.

I JSON-definitionen er det næste trin definitionen af variabler, som måleren bruger til at læse eller beregne værdier for strøm, spænding osv. Følgende variabler bruges af Charging Manager. Charging Manager kender følgende variabler:
type_designation, version, firmware_version, serial: Disse danner modelnavnet som vist i den udvidede info på flisen. De forespørges én gang, når måleren sættes op eller nulstilles.
voltage_l1..voltage_l3, current_l1..current_l3, power_w, power_var, power_va, power_w_l1..power_w_l3: CFos Charging Manager forsøger at beregne værdier for voltage_l1..l3, signed current_l1..l3, power_w og power_va ud fra disse. Du behøver ikke at angive alle variabler. CFos Charging Manager forsøger at beregne værdierne ud fra de eksisterende variabler.
import_wh, export_wh: Charging Manager bruger disse variabler til at vise import_wh og export_wh. For ensrettede målere (f.eks. invertere) bør du altid kun definere import_wh. Export_wh bør kun defineres for tovejsmålere (f.eks. lagertanke eller netreferencemålere).

soc: Hvis den er tilgængelig, vises ladetilstanden for en batterilagertank i % i flisen.
Derudover kan du definere andre variabler med forskellige navne, som aflæses ved hver opdatering eller beregnes ved hjælp af formler. Hvis du definerer variabler, der begynder med CM., f.eks. CM._set_price, gemmes de tildelte værdier i de globale Charging Manager-variabler (se nedenfor) og kan forespørges i overensstemmelse hermed.
Variabler med *: Hvis du definerer variabler, der begynder med *, vises de i brugergrænsefladen i målerens flise under udvidet information, f.eks. temperaturen på et batterilager.

Definition af en variabel:


Objektet er opkaldt efter navnet på den variabel, der er anført ovenfor, og har følgende egenskaber: fixed: String med en fast værdi.

Nyttigt, hvis der f.eks. ikke kan bestemmes nogen værdi, f.eks. for type_designation eller voltage. expr: String, variablen læses ikke ud, men evalueres som en formel. type: Hvis ikke fixed eller expr, typen af variabel: int16, uint16, int32, uint32, float, int64, string. Dette er vigtigt for Modbus for at kunne læse registrene i det korrekte format. uint16 og uint32 er typer, der kun kan acceptere positive tal.
Med JSON/HTTP kan du normalt bruge float. resolution: float, den læste værdi ganges med 'resolution'. Værdier for spænding skal være i volt, strøm i milliampere, effekt i watt, energi i watt-timer (Wh).


Med negativ 'opløsning' kan du invertere en værdi, hvis den har modsat fortegn. once: bool (true eller false), hvis true, læses værdien kun én gang, når enheden initialiseres, ellers periodisk. address: number (Modbus) or string (HTTP/JSON), Modbus-registernummeret eller HTTP-URL'en for den værdi, der skal læses. query:
String, for HTTP JSON specifikationen i forespørgselssproget for Charging Manager, som den finder den værdi, der skal læses i JSON-svaret. order: String, for Modbus byte-rækkefølgen, enten "hl" eller "lh", som værdien er til stede i. length: number, for Modbus længden af en streng i registre. For variablerne 'version' og 'firmware_version' bruges 'length' til at omdanne numeriske versioner til strenge med prikker. Værdier på 2 eller 4 er tilladt for 'length', som så resulterer i versionsformaterne a.b og a.b.c.d. Med 'length' 2 og typen 'int16' eller 'uint16' adskiller Charging Manager low og high byte med en prik, med 'int32' eller 'uint32' low og high word, med 'int64' low og high dword. For 'lenth' 4 og 'int32' eller 'uint32' opdeler Charging Manager værdien i 4 bytes adskilt af en prik.
For 'int64' er de 4 ord tilsvarende. regex: Streng. Hvis der er angivet et regulært udtryk, behøver tællersvaret ikke at være i JSON. Enten evalueres hele matchet af det regulære udtryk eller den første gruppe som resultat. Brug kun dette, hvis enheden ikke returnerer JSON.

Her er en liste over funktioner i vores regulære udtryk: any char: . named classes:



\d \s \w \D \S \W anonyme klasser: [a-z0-9_], [^0-9], [^\d] grupper med alternativer: (ab|cd|ef) ikke-indfangede grupper: (?:ab|cd) (grådig) en gang eller ingen: a?, a???
(grådig) mange eller ingen: a*, a*?


(grådig) en eller flere gange: a+, a+? begyndelsen af strengen: ^ slutningen af strengen: $

Definition af input:

Charging Manager kan forespørge op til 32 inputværdier fra forskellige registre eller JSON-elementer pr. enhed. Egenskaben "Inputs" er et JSON-array. Du skal definere følgende egenskaber for hver indgang:
adresse: Adresse (Modbus-register eller URL).
tæller: Antal inputbits, der skal læses med denne anmodning.
query: For HTTP/JSON, forespørgselssprog til at finde værdien i svaret.

CFos Charging Manager læser alle de input, der er defineret på denne måde, ved hver opdatering og placerer bitsene internt i et array, som derefter kan spørges i formler, Input1..InputN..

Definition af output:

Charging Manager kan skifte op til 32 udgange pr. enhed. Udgangene defineres i "outputs" som et JSON-array af udgangsobjekter. Alle udgange skiftes i slutningen af hver opdateringscyklus, hvis status for den respektive udgang har ændret sig.
For hvert output skal du definere følgende egenskaber i output-objektet:
adresse: HTTP-URL med valgfri HTTP-metode, f.eks. GET http://www.example.com?output1=${var1}. For at indstille Modbus-registre kan du bruge HTTP-API'en i cFos Charging Manager. Charging Manager registrerer matchende adgange på localhost og omdirigerer anmodningen til den interne handler, så du behøver ikke autorisation som med eksterne HTTP API-adgange. Hvis URL'en er tom efter alle udskiftninger, indstilles der ikke noget output. Du kan f.eks. kun skifte output, hvis visse variabler eksisterer (se formler: exists()-funktionen). I adressen kan du desuden angive ${address} og ${id}. Dette er den aktuelle enhedsadresse og Modbus ID som defineret i indstillingerne. Adresse og id bruges hovedsageligt til at bruge Modbus API (se nedenfor).
body: Valgfri HTTP body til POST eller PUT.
I URL'en og brødteksten kan du bruge ${expr}-formler, der refererer til globale Charging Manager-variabler eller fra den respektive tæller. Formlen 'expr' evalueres, når output indstilles, og erstattes i teksten i URL'en eller brødteksten. Hvis http://www.example.com?output1=1 i ovenstående eksempel indstiller outputtet, og http://www.example.com?output1=0 sletter det, kan du definere en variabel 'var1' og indstille den til 1 eller 0 efter ønske. På denne måde kan du også skrive numeriske værdier for at kontrollere hukommelsesydelsen i Modbus-registre, som du tidligere har gemt i en variabel ved hjælp af en formel.
Hvis du i stedet for at sende en numerisk værdi i URL'en har brug for at erstatte en tekst med en anden afhængigt af formlen, f.eks. med Shelly WLAN-sokler, kan du skrive det sådan her: ${if expr`text1`text2}. 'Apostrof' er et backtick (ASCII-kode 96). Hvis 'expr' != 0, indsættes tekst1, ellers tekst2. For Shelly WLAN-stikket ser URL'en således ud: http://<ip-addr>/relay/0?turn=${if expr`on`off}, dvs. hvis expr != 0, kalder Charging Manager http://<ip-addr>/relay/0?turn=on, ellers http://<ip-addr>/relay/0?turn=off.

Hvis du indtaster en relativ sti som URL, tager Charging Manager den adresse, der er konfigureret for den respektive enhed. Hvis du indtaster 'localhost' som domæne, tager Charging Manager adressen på den enhed, som den kører på. Hvis den registrerer en adgang til sin egen API, bruger den den interne handler i stedet for at udføre en fuld HTTP-adgang, så du ikke behøver at gemme et brugernavn og en adgangskode i tællerdefinitionen. En URL, der starter med en *, vil få Charging Manager til altid at udføre en fuld HTTP-adgang.

Nulstil udgange: Ud over et "outputs"-array kan du også definere et array med navnet "resets", der er struktureret som "outputs"-arrayet. Dette kan bruges til at nulstille udgange til deres oprindelige værdier, når enheden deaktiveres. Med dette, i kombination med brugerdefinerede variabler og "once": true, kan du sætte enheden tilbage til dens oprindelige tilstand.
Skriv udgange med jævne mellemrum: For nogle enheder skal udgangene skrives med jævne mellemrum, ellers nulstiller enheden værdierne til "standard". For eksempel bruger Kostal-hukommelsen sine standardregler igen, hvis hukommelseskontrollen ikke er blevet skrevet aktivt i et stykke tid. Hvis du vil indstille udgange periodisk, kan du sætte #xxx# foran adressen, hvor xxx angiver, hvor mange sekunder der skal gå, før udgangen skrives igen, også selvom værdien, der skal skrives, er forblevet den samme. Hvis adressen f.eks. er /cnf?cmd=set_cm_vars&name=test&val=42, kan du bruge #30#/cnf?cmd=set_cm_vars&name=test&val=42 for at sikre, at denne værdi bliver skrevet hvert 30. sekund.

Definition af forespørgselssprog:

I øjeblikket kan medlemsnavne og operatorerne "." og "[]" bruges i søgeudtrykkene "query", f.eks:

testElement med navnet "test"
name1.name2Element med navnet "name2" i underobjekt "name1"
navn[idx]Element "idx" i objektelementet "name". "idx" kan være et tal, f.eks. for arrays, eller en streng
name["u2"]Element "u2" i objektelementet "name", svarer til "name.u2"
name[{"el1": "v1", "el2": 3}].valueVælg det arrayelement, der opfylder betingelserne i objektnotationen, og evaluer elementet "value". Her vælges f.eks. i arrayet "name" det element, der som objektelementer har "el1" med værdien "v1" og "el2" med værdien 3, og derefter returneres værdien af elementet "value" fra dette objekt.

Variabler for Global Charging Manager:

Du kan oprette variabler i konfigurationen af Charging Manager. Du kan bruge en fast værdi eller en formel som værdi. Ved slutningen af hver opdateringscyklus genberegner Charge Manager om nødvendigt værdien af disse variabler. Du kan derefter bruge dem i (visse) Charging Manager-parametre, Charging Rules eller til at styre udgange. Du kan også skrive Ex.member eller Mx.member som variabler. Her er Exog Mxenhedens ID for en wallbox eller måler, der er oprettet i Charging Manager. member er en "brugerdefineret" variabel, der er gemt i den tilsvarende enhed. Nogle af variablerne kan have en særlig betydning: For KEBA er "out1" en koblingsudgang, for ABB B23-målere er "out1" og "out2" koblingsudgange (for modeller, der understøtter dette). En 1 slår udgangen til, en 0 slår den fra igen.

Hvis du har apparater, der skal tændes under visse betingelser, men derefter kører i et stykke tid (f.eks. vaskemaskine, opvaskemaskine), kan du også definere variablen som en "trigger". Så er variablens formel den betingelse, hvor variablen sættes til 1. Efter en justerbar tid sættes den så til 0 igen. En "retrigger-betingelse" gør det muligt at forlænge tiden indtil slukning (dvs. sætte variablen til 0) igen og igen, så længe betingelsen er opfyldt.

Til testformål kan du vise Charging Manager og målervariabler, f.eks. de aktuelle Awattar-priser:


                        Skærmbillede af tællervariabler

Global Charging Manager Outputs:

I konfigurationen af Charging Manager kan du konfigurere globale udgange som beskrevet ovenfor i tællerdefinitionen under "Outputs". Disse sættes ved slutningen af hver opdateringscyklus, hvis deres status er ændret. Hvis du ønsker at styre koblingsudgange i brugerdefinerede enheder, anbefales ovenstående konvention (se Variabler i Charging Manager): Du indstiller variabler med navnene "out1", "out2" osv. i den brugerdefinerede tæller og opretter udgange i den brugerdefinerede tæller, som skifter output afhængigt af værdien af disse variabler.

Global Modbus API for Charging Manager:

Modbus API'en i Charging Manager bruges til at styre Modbus-enheder, der har en hvilken som helst Modbus RTU- eller TCP-adresse (tilgængelig fra Charging Manager). For Modbus RTU skal du indtaste COMx,bd,8,p,s som adresse, hvor x er COM-portnummeret, bd er baudfrekvensen, p er pariteten ("N", "E" eller "O") og s er antallet af stopbits (1 eller 2), som i konfigurationen af de enkelte enheder. For Modbus TCP er adressaten IP-adressen på enheden i Charging Manager's netværk, herunder portnummeret.
URL'en (for HTTP GET) for Modbus API'en er:
/cnf?cmd=modbus_get eller /cnf?cmd=modbus_set
cFos Charging Manager understøtter følgende yderligere forespørgselsparametre:
addr: Ovennævnte Modbus RTU- eller TCP-enhedsadresse.
func: Modbus-funktionsnummer, f.eks. til læsning 3 eller 4, til skrivning 6 eller 16.
id: Enheds-ID for Modbus-enheden.
reg: Modbus-registernummer. Værdien kan angives i decimaltal eller hexatal (med præfikset 0x).
val: tal, værdi, der skal skrives ind i registret. Undlad det ved læsning.
type: "w" 16bit (standard), d = 32bit, f = float, q = 64bit, s = string.
cnt: tal, den maksimale længde af strengen i registre, udelades for andre typer eller sættes til 1.
order: String, byteorden, enten "hl" eller "lh".

Bemærk: Hvis din "counter" primært har kontrolopgaver, kan du markere indstillingen "Skjul enhed" i indstillingerne for denne flise, så denne enhed ikke vises på startsiden.

Bemærk: Nogle målere, der aflæses via HTTP, kræver et brugernavn/adgangskode som autorisation. Du kan angive dette i adressen for HTTP-adgang, f.eks. med http://username:[email protected]. Hvis dit brugernavn eller din adgangskode indeholder et "@", skal du erstatte det med "%40".