InfluxDB - SELECT (výběr dat)

Home Assistant, Arduino, SDS, Raspberry, Linux, vzdálený dohled, automatizace, měření, opensource, closedsource, hotová řešení, DIY, stavebnice, komponenty, software, postupy, návody, schémata, rady, zkušenosti ...
rva
Příspěvky: 3936
Registrován: úte dub 23, 2013 10:21 am
Lokalita: Kousek od Lysé nad Labem
Systémové napětí: 48V
Výkon panelů [Wp]: 46000
Kapacita baterie [kWh]: 40
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Kousek od Lysé nad Labem

InfluxDB - SELECT (výběr dat)

Příspěvek od rva »

Pro někoho hračka, já se na tom zasekl.
Zajímá mě
1. na jakém článku bývá najvětší napětí při dobíjení baterie
2. na jakém článku bývá najvětší napětí při vybíjení baterie

1. Vyčítám a v grafárně normálně zobrazím data (v tomto případě to je článek, na kterém JK BMS naměří max. napětí - tuto entitu BMS přes ESPHome posílá do HA):

Kód: Vybrat vše

SELECT "value"  FROM "state" WHERE ("entity_id" = 'jk_bms_sklep_max_voltage_cell') AND $timeFilter
Tím zjistím, na jakém článku bývá největší napětí (bez ohledu na směr proudu baterií).

2. Vyčítám a v grafárně normálně zobrazím data (v tomto případě to je proud do baterie (nabíjecí má kladnou hodnotu, vybíjecí zápornou):

Kód: Vybrat vše

SELECT "value" FROM "A" WHERE ("entity_id" = 'jk_bms_sklep_current') AND $timeFilter
Nevím, jak ty dva dotazy zkombinovat, když chci v tom prvním dotazu jenom čísla článků, když je proud baterií kladný (při nabíjení).
_______________________________________________________________________
43 kWp, LiFePO4 62 kWh,
EPSolar 60 A/150 V ET6415N + 3x Isolar SM II (5 kW, 450 V, 80 A) + Axpert PIP 5048MS
rva
Příspěvky: 3936
Registrován: úte dub 23, 2013 10:21 am
Lokalita: Kousek od Lysé nad Labem
Systémové napětí: 48V
Výkon panelů [Wp]: 46000
Kapacita baterie [kWh]: 40
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Kousek od Lysé nad Labem

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od rva »

Zkouším jak ty dva dotazy zkombinovat a stále dostávám nesmysl. Vymázne mi to záporné proudy ale ne odpovídající čísla článků. A přitom chci něco tak jednoduchého jako vybrat čísla článků baterie, pro které je proud baterií kladný. Nakonec si udělám ostudu a budu muset zapojit dceru.
Chybný dotaz do influxDB
Chybný dotaz do influxDB

Kód: Vybrat vše

SELECT ("value")  FROM (SELECT ("value")  FROM "state", "A" WHERE (("entity_id" = 'jk_bms_sklep_max_voltage_cell')  OR ("entity_id" = 'jk_bms_sklep_current'))AND $timeFilter ) WHERE ("value">0)
_______________________________________________________________________
43 kWp, LiFePO4 62 kWh,
EPSolar 60 A/150 V ET6415N + 3x Isolar SM II (5 kW, 450 V, 80 A) + Axpert PIP 5048MS
Antrac1t
Příspěvky: 355
Registrován: ned čer 26, 2022 3:33 pm
Lokalita: Znojemsko
Systémové napětí: 48V
Výkon panelů [Wp]: 5500
Kapacita baterie [kWh]: 11
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od Antrac1t »

bez do script editoru a pooznacuj si potrebne entity a melo by to jit ...

Kód: Vybrat vše

from(bucket: "ADRESA_TVOJI_INFLUXDB")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "V" or r["_measurement"] == "A")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["domain"] == "sensor")
  |> filter(fn: (r) => r["entity_id"] == "jk_bms_sklep_max_voltage_cell" or r["entity_id"] == "jk_bms_sklep_current")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> yield(name: "mean")
string1 - 5.5kwp 3S4P - 460wp | 3x Multiplus ii 3000VA 1F systém | Lifepo4 230AH 48V + Seplos BMS
rva
Příspěvky: 3936
Registrován: úte dub 23, 2013 10:21 am
Lokalita: Kousek od Lysé nad Labem
Systémové napětí: 48V
Výkon panelů [Wp]: 46000
Kapacita baterie [kWh]: 40
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Kousek od Lysé nad Labem

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od rva »

Další neznámá oblast. Koukám, že budu muset nastavit aby v influxDB běželo skriptování ve flux.
influxdb.conf:

Kód: Vybrat vše

  
[http]
flux-enabled = true
Ale zatím povinnnosti, pak omést stovku panelů od sněhu a až pak zábava.
_______________________________________________________________________
43 kWp, LiFePO4 62 kWh,
EPSolar 60 A/150 V ET6415N + 3x Isolar SM II (5 kW, 450 V, 80 A) + Axpert PIP 5048MS
rva
Příspěvky: 3936
Registrován: úte dub 23, 2013 10:21 am
Lokalita: Kousek od Lysé nad Labem
Systémové napětí: 48V
Výkon panelů [Wp]: 46000
Kapacita baterie [kWh]: 40
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Kousek od Lysé nad Labem

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od rva »

Díky za nakopnutí abych zkusil script. Zas jsem o něco chytřejší. Skripty se teda píší ve flux, který je minimálně u mě přístupný v influxDB.
Číslo článku baterie je v jiném měření, než proud baterie a pomocí skriptu je mám už uloženy v jedné tabulce.
Spojení dvou měření do jednoho:

Kód: Vybrat vše

Proud = from(bucket: "ha2/autogen")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "A")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["domain"] == "sensor")
  |> filter(fn: (r) => r["entity_id"] == "jk_bms_sklep_current")
  |> fill(column: "_value", usePrevious: true)
  |> aggregateWindow(every: 1s, fn: distinct)
  |> keep(columns: ["_value", "_time"])
  
Clanek = from(bucket: "ha2/autogen")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "state")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["domain"] == "sensor")
  |> filter(fn: (r) => r["entity_id"] == "jk_bms_sklep_max_voltage_cell")
  |> fill(column: "_value", usePrevious: true)
  |> aggregateWindow(every: 1s, fn: distinct)
  |> keep(columns: ["_value", "_time"])
  
Proud_Clanek = join(tables: {Proud: Proud, Clanek: Clanek}, on: ["_time"])
  |> fill(column: "_value_Proud", usePrevious: true)
  |>fill(column: "_value_Clanek", usePrevious: true)
  |> yield()
  
Flux - spojení (join) dvou měření
Flux - spojení (join) dvou měření
Flux - výstup dvou měření
Flux - výstup dvou měření
Teď to ještě rozdělit na dvě tabulky, jednu s kladným proudem a druhou se záporným a snad by to mělo být ono.
Malý krůček pro lidstvo, ale velký krok pro člověka. Nebo naopak?
_______________________________________________________________________
43 kWp, LiFePO4 62 kWh,
EPSolar 60 A/150 V ET6415N + 3x Isolar SM II (5 kW, 450 V, 80 A) + Axpert PIP 5048MS
bokser01
Příspěvky: 1535
Registrován: pon úno 07, 2022 2:43 pm
Lokalita: Okolí Pardubic
Systémové napětí: 24V
Výkon panelů [Wp]: 10120
Kapacita baterie [kWh]: 13,4
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od bokser01 »

Chlapi zeptám se... Potřebuji do influxdb dostat data která mám na webu, takže bych je potřeboval CURL zobrazit a uložit do influxdb... Jedná se o teplotu bojleru. Jenže přes php mi to nejde a nic jiného neovládám vůbec... :( nenakopnul by jste mě někdo?
MUST 3KW 80A MPPT 24V/ 3,75kWp stringy 5s3P 200wp + 5s1P 150wp. 2 měnič MUST 3KW 80A MPPT 24V 6370Wp stringy 2S4P 400wp bifacial + 2S1P 410wp + 2S3P 395wp Baterie 13,4KWh lifepo4 (2X 8S 280Ah EVE), Celek tedy 10120Wp :yes:
Antrac1t
Příspěvky: 355
Registrován: ned čer 26, 2022 3:33 pm
Lokalita: Znojemsko
Systémové napětí: 48V
Výkon panelů [Wp]: 5500
Kapacita baterie [kWh]: 11
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od Antrac1t »

rva píše: Teď to ještě rozdělit na dvě tabulky, jednu s kladným proudem a druhou se záporným a snad by to mělo být ono.
Malý krůček pro lidstvo, ale velký krok pro člověka. Nebo naopak?
ono to muzes vse napsat normal v selectu pres joiny, ale pres skript je to mnohem rychlejsi (pro me, bejt to mssql tak ti to vypisu pres CTE) ... nech to v jednom, jen pridej druhou y axis na pravou stranu kde nechas vykreslenej proud z baterie a bude to pekne all in one ...
string1 - 5.5kwp 3S4P - 460wp | 3x Multiplus ii 3000VA 1F systém | Lifepo4 230AH 48V + Seplos BMS
Antrac1t
Příspěvky: 355
Registrován: ned čer 26, 2022 3:33 pm
Lokalita: Znojemsko
Systémové napětí: 48V
Výkon panelů [Wp]: 5500
Kapacita baterie [kWh]: 11
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od Antrac1t »

bokser01 píše:Chlapi zeptám se... Potřebuji do influxdb dostat data která mám na webu, takže bych je potřeboval CURL zobrazit a uložit do influxdb... Jedná se o teplotu bojleru. Jenže přes php mi to nejde a nic jiného neovládám vůbec... :( nenakopnul by jste mě někdo?
a kde ti to bezi? v HA? nebo zvlast nekde jinde?
string1 - 5.5kwp 3S4P - 460wp | 3x Multiplus ii 3000VA 1F systém | Lifepo4 230AH 48V + Seplos BMS
bokser01
Příspěvky: 1535
Registrován: pon úno 07, 2022 2:43 pm
Lokalita: Okolí Pardubic
Systémové napětí: 24V
Výkon panelů [Wp]: 10120
Kapacita baterie [kWh]: 13,4
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od bokser01 »

Antrac1t píše:
bokser01 píše:Chlapi zeptám se... Potřebuji do influxdb dostat data která mám na webu, takže bych je potřeboval CURL zobrazit a uložit do influxdb... Jedná se o teplotu bojleru. Jenže přes php mi to nejde a nic jiného neovládám vůbec... :( nenakopnul by jste mě někdo?
a kde ti to bezi? v HA? nebo zvlast nekde jinde?
Mám solaranzeige jede to normálně na raspberry. Zkrátka potřebuju tu hodnotu vyčíst z webu z txt souboru kde je hodnota teploty a nějak vložit do databáze pro někoho nic složitého, no pro mě boj :D
MUST 3KW 80A MPPT 24V/ 3,75kWp stringy 5s3P 200wp + 5s1P 150wp. 2 měnič MUST 3KW 80A MPPT 24V 6370Wp stringy 2S4P 400wp bifacial + 2S1P 410wp + 2S3P 395wp Baterie 13,4KWh lifepo4 (2X 8S 280Ah EVE), Celek tedy 10120Wp :yes:
rva
Příspěvky: 3936
Registrován: úte dub 23, 2013 10:21 am
Lokalita: Kousek od Lysé nad Labem
Systémové napětí: 48V
Výkon panelů [Wp]: 46000
Kapacita baterie [kWh]: 40
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Kousek od Lysé nad Labem

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od rva »

Antrac1t píše: ono to muzes vse napsat normal v selectu pres joiny, ale pres skript je to mnohem rychlejsi ...
Pro mě je to nové, takže nějakou dobu bude trvat, než pochopím o co jde. Cílem je ověřit, jestli se nějak jednoduše nedá detekovat blížící se závada baterie. BMS opakovaně čte napětí na článcích a pro nás lenochy i rovnou posílá číslo článku s maximálním (a minimálním napětí). Jednoduché bylo v grafaně získat histogram na kterém vidím rozdíly mezi články:
JK-BMS histogram
JK-BMS histogram
A to chci rozdělit pro případ, kdy se články nabíjejí a pro případ, kdy se vybíjejí.
_______________________________________________________________________
43 kWp, LiFePO4 62 kWh,
EPSolar 60 A/150 V ET6415N + 3x Isolar SM II (5 kW, 450 V, 80 A) + Axpert PIP 5048MS
Antrac1t
Příspěvky: 355
Registrován: ned čer 26, 2022 3:33 pm
Lokalita: Znojemsko
Systémové napětí: 48V
Výkon panelů [Wp]: 5500
Kapacita baterie [kWh]: 11
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od Antrac1t »

bokser01 píše:
Antrac1t píše:
bokser01 píše:Chlapi zeptám se... Potřebuji do influxdb dostat data která mám na webu, takže bych je potřeboval CURL zobrazit a uložit do influxdb... Jedná se o teplotu bojleru. Jenže přes php mi to nejde a nic jiného neovládám vůbec... :( nenakopnul by jste mě někdo?
a kde ti to bezi? v HA? nebo zvlast nekde jinde?
Mám solaranzeige jede to normálně na raspberry. Zkrátka potřebuju tu hodnotu vyčíst z webu z txt souboru kde je hodnota teploty a nějak vložit do databáze pro někoho nic složitého, no pro mě boj :D
a na ten web to davas pres co? arduino/esp ... proc se ptam, nemam rad takove to skrabani na levem uchu pravou rukou (senzor->txt->web->influx nez senzor->influx)
string1 - 5.5kwp 3S4P - 460wp | 3x Multiplus ii 3000VA 1F systém | Lifepo4 230AH 48V + Seplos BMS
bokser01
Příspěvky: 1535
Registrován: pon úno 07, 2022 2:43 pm
Lokalita: Okolí Pardubic
Systémové napětí: 24V
Výkon panelů [Wp]: 10120
Kapacita baterie [kWh]: 13,4
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od bokser01 »

JJ ESP32 s deep sleep napájené z baterie posílá mi to na webhosting kde se to grafuje a zapisuje ale v té grafaně by to bylo praktičtější
MUST 3KW 80A MPPT 24V/ 3,75kWp stringy 5s3P 200wp + 5s1P 150wp. 2 měnič MUST 3KW 80A MPPT 24V 6370Wp stringy 2S4P 400wp bifacial + 2S1P 410wp + 2S3P 395wp Baterie 13,4KWh lifepo4 (2X 8S 280Ah EVE), Celek tedy 10120Wp :yes:
Antrac1t
Příspěvky: 355
Registrován: ned čer 26, 2022 3:33 pm
Lokalita: Znojemsko
Systémové napětí: 48V
Výkon panelů [Wp]: 5500
Kapacita baterie [kWh]: 11
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od Antrac1t »

bokser01 píše:JJ ESP32 s deep sleep napájené z baterie posílá mi to na webhosting kde se to grafuje a zapisuje ale v té grafaně by to bylo praktičtější
tak pokud pokud ti nebude vadit ze to nebudes mit na webu jako txt, tak tady je jednoduchy postup jak rovnou z esp rvat data do lokal influxdb ... pocitam ze asi nejedes nic pres HA
https://www.debashishsahu.com/posts/sen ... -database/
string1 - 5.5kwp 3S4P - 460wp | 3x Multiplus ii 3000VA 1F systém | Lifepo4 230AH 48V + Seplos BMS
Antrac1t
Příspěvky: 355
Registrován: ned čer 26, 2022 3:33 pm
Lokalita: Znojemsko
Systémové napětí: 48V
Výkon panelů [Wp]: 5500
Kapacita baterie [kWh]: 11
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od Antrac1t »

rva píše:
Antrac1t píše: ono to muzes vse napsat normal v selectu pres joiny, ale pres skript je to mnohem rychlejsi ...
Pro mě je to nové, takže nějakou dobu bude trvat, než pochopím o co jde. Cílem je ověřit, jestli se nějak jednoduše nedá detekovat blížící se závada baterie. BMS opakovaně čte napětí na článcích a pro nás lenochy i rovnou posílá číslo článku s maximálním (a minimálním napětí). Jednoduché bylo v grafaně získat histogram na kterém vidím rozdíly mezi články:
JK-BMS-histogram.jpg
A to chci rozdělit pro případ, kdy se články nabíjejí a pro případ, kdy se vybíjejí.
ja se kdysi vykaslal na max a min a beru aktualni hodnotu a narval to do boxplotu kde jde videt jakej clanek uplne uhejba skrz napeti, jeste by se dalo k tomu pridat proud nabijeni/vybijeni jak jsi zminoval

Obrázek
string1 - 5.5kwp 3S4P - 460wp | 3x Multiplus ii 3000VA 1F systém | Lifepo4 230AH 48V + Seplos BMS
kodl69
Příspěvky: 7627
Registrován: sob črc 19, 2014 8:56 pm
Lokalita: severně od Brna
Systémové napětí: 48V
Výkon panelů [Wp]: 8kWp
Kapacita baterie [kWh]: 12kWh
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od kodl69 »

mě taky přijde jednodušší řešit okamžitý napětí, už jsem tady postoval výstupy z influxdb, kde je vidět, že jiný články jdou první nahoru a jiný první dolů, a jiný m klesá napětí při velkým odběru. Podle mě stačí detekovat napětí mimo rozumný rozsah, tj iu lifepo4 pod 2.7V a nad 3.5V a to dokáže sama BMS, v HA si můžeš tyhle meze nastavit opatrněj, abys měl nějakej ALERT že se něco děje (nebo neděje, jenom jsou nabitý baterky a nestíhá balancer, a nebo jsou vybitý, a některej článek pod zátěží jde strměj dolů). Mě tyhle alerty dělá přímo DIYBMS v4, takže to nemusím řešit nějakým složitým systémem.
ostrov skoro 8kWp neustále ve stádiu zrodu: smartshunt(ex WBJR), MPPT150/45, MPPT 250/100(ex midnitesolar 150 clasic lite), 16S a různě P cca 340Ah Winston, MP II 5000,( ex Powerjack 8kW, ex samodomo cca 4kW). 48V DC rozvody a spotřebiče.
rva
Příspěvky: 3936
Registrován: úte dub 23, 2013 10:21 am
Lokalita: Kousek od Lysé nad Labem
Systémové napětí: 48V
Výkon panelů [Wp]: 46000
Kapacita baterie [kWh]: 40
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Kousek od Lysé nad Labem

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od rva »

Sledovat napětí je moc jednoduché, z BMS jde řada dat, tak třeba se dají zpracovat, aby se s předstihem detekovalo něco podezřelého.
1. BMS údaj o článku s maximálním a článku s minimálním napětí využívá k přelévání náboje.
2. Pokud bude některý článek vyžadovat častěji náboj doplňovat, asi má vyšší samovybíjení, což nemusí vadit, pokud se bude v čase chovat stejně.
3. Pokud ale té energie na vybalancování začne vyžadovat víc a víc, měl bych zpozornět. A to mi jenom sledování napětí neřekne, protože balancery to zpočátku téměř vyrovnají.
_______________________________________________________________________
43 kWp, LiFePO4 62 kWh,
EPSolar 60 A/150 V ET6415N + 3x Isolar SM II (5 kW, 450 V, 80 A) + Axpert PIP 5048MS
rva
Příspěvky: 3936
Registrován: úte dub 23, 2013 10:21 am
Lokalita: Kousek od Lysé nad Labem
Systémové napětí: 48V
Výkon panelů [Wp]: 46000
Kapacita baterie [kWh]: 40
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Kousek od Lysé nad Labem

Re: InfluxDB - SELECT (výběr dat)

Příspěvek od rva »

Tak snad nějaké závěry pro nás, kteří nemají žádné zkušenosti v jazyce flux (ani jiném podobném skriptovacím jazyce). Bral jsem to jako výzvu, jestli z toho něco dostanu. V kódu je vysvětlení amatéra proč jsem co dělal.
Třeba se někdo najde, kdo nám dá rychlokurz jak vše funguje a jak se to má dělat správně.

Kód: Vybrat vše

// Cílem je předpřipravit si data z BMS tak, aby bylo možno posoudit v jakém stavu jsou články baterie.
// Z toho, co BMS ukládá do influxDB, budu využívat: 
// 1. čísla článků s max a min napětím
// 2. balancovací proud
// 3. proud baterii
// Úvod do influxDB je na https://docs.influxdata.com/influxdb/cloud/get-started/
// Do tabulky ClanekMax si chci uložit čísla článků s max napětím - to jsou ty, ze kterých se odebírá balanční proud 
// Pod tímto názvem mohu data z tabulky opakovaně používat pro opakované zpracování např. ClanekTemp = ClanekMax
// 1. Data mám v influxDB databázi ha2. Tam začnu - nejprve si do ClanekMax vyberu tuto databázi:
ClanekMax = from(bucket: "ha2/autogen")
// Výběr musím omezit na časový rozsah, symbol |> je pipe-forward operator, který posílá výstup předchozí funkce jako vstup do té následující
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
// čísla článků jsou uložena v měřeních "state", tak si vyfiltruji jenom tato měření
  |> filter(fn: (r) => r["_measurement"] == "state")
// v těchto měřeních jsou čísla článků uložena ve "field" ktere se jmenuje "value", tak předchozí výsledek dál filtruji
  |> filter(fn: (r) => r["_field"] == "value")
// a opět zužuji výběr na "domain" "sensors" 
  |> filter(fn: (r) => r["domain"] == "sensor")
// a tam mám čísla článků uložena pod "entity_id" "jk_bms_sklep_max_voltage_cell"
  |> filter(fn: (r) => r["entity_id"] == "jk_bms_sklep_max_voltage_cell")
// V influxDB jsou záznamy jako časové řady, pro další zpracování si je převedu do tabulky s časovým oknem po 5s
  |> aggregateWindow(every: 5s, fn: distinct)
// ponechám si v tabulce jenom dva sloupce. 
  |> keep(columns: ["_value", "_time"])
// Pokud si chci prohlédnout tento mezivýsledek, odkomentuji následující řádek, stisknu tlačítko "Run Script"
// a nahoře vpravo si stiskem "View Raw Data" přepínám výsledek mezi grafem a tabulkou (řada dat se třeba ani jako graf nedá zobrazit). 
  //|> yield(name: "CMax")
// Teď mám tabulku ClanekMax s čísly článků + časem a tato data mohu používat pro opakované zpracování např. ClanekTemp = ClanekMax  
// Do tabulky ClanekMin si obdobně uložím články, na kterých bylo min. napětí - do těchto článků tedy teče balanční proud 
ClanekMin = from(bucket: "ha2/autogen")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "state")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["domain"] == "sensor")
  |> filter(fn: (r) => r["entity_id"] == "jk_bms_sklep_min_voltage_cell")
  |> aggregateWindow(every: 5s, fn: distinct)
  |> keep(columns: ["_value", "_time"])
  //|> yield(name: "CMin")
// Do tabulky Balance si obdobně uložím balancovací proud + čas 
Balance = from(bucket: "ha2/autogen")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "A")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["domain"] == "sensor")
  |> filter(fn: (r) => r["entity_id"] == "jk_bms_sklep_balancing_current")
  |> aggregateWindow(every: 5s, fn: first)
  |> keep(columns: ["_value", "_time"])
  //|> yield(name: "Balance")
// Do tabulky Current si uložím jaký proud tekl celou baterií   
Current = from(bucket: "ha2/autogen")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "A")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["domain"] == "sensor")
  |> filter(fn: (r) => r["entity_id"] == "jk_bms_sklep_current")
  |> aggregateWindow(every: 5s, fn: distinct, createEmpty: true)
  |> keep(columns: ["_value", "_time"])
  //|> yield(name: "Current")
C = join(tables: {ClanekMin: ClanekMin, ClanekMax: ClanekMax }, on: ["_time"])
// Ve funkci reduce si zavedu akumulátory C01 - C16, do kterých si ukládám, kolikrát je na daném článku 
// ve sloupci _value_ClanekMin naměřeno minimální napětí
// Spočítá, kolikrát je v dané tabulce článek daného čísla 1-16    
  |> reduce(fn: (r, accumulator) => ({ 
    C01: accumulator.C01 + int(v: (r._value_ClanekMin == 1)), 
    C02: accumulator.C02 + int(v: (r._value_ClanekMin == 2)), 
    C03: accumulator.C03 + int(v: (r._value_ClanekMin == 3)),
    C04: accumulator.C04 + int(v: (r._value_ClanekMin == 4)),
    C05: accumulator.C05 + int(v: (r._value_ClanekMin == 5)),
    C06: accumulator.C06 + int(v: (r._value_ClanekMin == 6)),
    C07: accumulator.C07 + int(v: (r._value_ClanekMin == 7)),
    C08: accumulator.C08 + int(v: (r._value_ClanekMin == 8)),
    C09: accumulator.C09 + int(v: (r._value_ClanekMin == 9)),
    C10: accumulator.C10 + int(v: (r._value_ClanekMin == 10)),
    C11: accumulator.C11 + int(v: (r._value_ClanekMin == 11)),
    C12: accumulator.C12 + int(v: (r._value_ClanekMin == 12)),
    C13: accumulator.C13 + int(v: (r._value_ClanekMin == 13)),
    C14: accumulator.C14 + int(v: (r._value_ClanekMin == 14)),
    C15: accumulator.C15 + int(v: (r._value_ClanekMin == 15)),
    C16: accumulator.C16 + int(v: (r._value_ClanekMin == 16)),
    }), 
    identity: {C01: 0, C02: 0, C03: 0, C04: 0, C05: 0, C06: 0, C07: 0, C08: 0, C09: 0, C10: 0, C11: 0, C12: 0, C13: 0, C14: 0, C15: 0, C16: 0})
  |> yield(name: "Články s minimálním napětím")
// Tím jsem získal první zajímavý výsledek - tabulku s tím, kolikrát bylo na každém článku naměřeno minimální napětí.
// Dále by mě zajímalo, na kterém článku bylo naměřeno minimální napětí při vybíjení baterie (proud je menší než nula)
// Vytvořím si tabulku s články + proudem baterií
C1 = join(tables: {ClanekMin: ClanekMin, ClanekMax: ClanekMax }, on: ["_time"])
CBC1 = join(tables: {Clanek: C1, Current: Current}, on: ["_time"])
  //|> yield(name: "CBC1")
// vyberu záznamy s vybíjením baterie (proud <0)
  |> filter(fn: (r) => r._value < 0)
  //|> yield(name: "CBC1")
// Spočítá, kolikrát je v dané tabulce článek daného čísla 1-16 při vybíjení baterie   
  |> reduce(fn: (r, accumulator) => ({ 
    C01: accumulator.C01 + int(v: (r._value_ClanekMin == 1)), 
    C02: accumulator.C02 + int(v: (r._value_ClanekMin == 2)), 
    C03: accumulator.C03 + int(v: (r._value_ClanekMin == 3)),
    C04: accumulator.C04 + int(v: (r._value_ClanekMin == 4)),
    C05: accumulator.C05 + int(v: (r._value_ClanekMin == 5)),
    C06: accumulator.C06 + int(v: (r._value_ClanekMin == 6)),
    C07: accumulator.C07 + int(v: (r._value_ClanekMin == 7)),
    C08: accumulator.C08 + int(v: (r._value_ClanekMin == 8)),
    C09: accumulator.C09 + int(v: (r._value_ClanekMin == 9)),
    C10: accumulator.C10 + int(v: (r._value_ClanekMin == 10)),
    C11: accumulator.C11 + int(v: (r._value_ClanekMin == 11)),
    C12: accumulator.C12 + int(v: (r._value_ClanekMin == 12)),
    C13: accumulator.C13 + int(v: (r._value_ClanekMin == 13)),
    C14: accumulator.C14 + int(v: (r._value_ClanekMin == 14)),
    C15: accumulator.C15 + int(v: (r._value_ClanekMin == 15)),
    C16: accumulator.C16 + int(v: (r._value_ClanekMin == 16)),
    }), 
    identity: {C01: 0, C02: 0, C03: 0, C04: 0, C05: 0, C06: 0, C07: 0, C08: 0, C09: 0, C10: 0, C11: 0, C12: 0, C13: 0, C14: 0, C15: 0, C16: 0})
  |> yield(name: "Články s minimálním napětím při vybíjení baterie")
// A získal jsem tabulku s tím, jak často bylo na některém článku minimální napětí když se baterie vybíjela
// Do třetice by mě zajímalo, na jakých článcích je minimální napětí při nabíjení baterie - proud > 0
// Vytvořím si tabulku s články + proudem baterií
CBC2 = join(tables: {Clanek: C1, Current: Current}, on: ["_time"])
  //|> yield(name: "CBC2")
// vyberu záznamy s nabíjenímm baterie (proud > 0)
  |> filter(fn: (r) => r._value > 0)
  //|> yield(name: "CBC2")
// Spočítá, kolikrát je v dané tabulce článek daného čísla 1-16 při nabíjení baterie
  |> reduce(fn: (r, accumulator) => ({ 
    C01: accumulator.C01 + int(v: (r._value_ClanekMin == 1)), 
    C02: accumulator.C02 + int(v: (r._value_ClanekMin == 2)), 
    C03: accumulator.C03 + int(v: (r._value_ClanekMin == 3)),
    C04: accumulator.C04 + int(v: (r._value_ClanekMin == 4)),
    C05: accumulator.C05 + int(v: (r._value_ClanekMin == 5)),
    C06: accumulator.C06 + int(v: (r._value_ClanekMin == 6)),
    C07: accumulator.C07 + int(v: (r._value_ClanekMin == 7)),
    C08: accumulator.C08 + int(v: (r._value_ClanekMin == 8)),
    C09: accumulator.C09 + int(v: (r._value_ClanekMin == 9)),
    C10: accumulator.C10 + int(v: (r._value_ClanekMin == 10)),
    C11: accumulator.C11 + int(v: (r._value_ClanekMin == 11)),
    C12: accumulator.C12 + int(v: (r._value_ClanekMin == 12)),
    C13: accumulator.C13 + int(v: (r._value_ClanekMin == 13)),
    C14: accumulator.C14 + int(v: (r._value_ClanekMin == 14)),
    C15: accumulator.C15 + int(v: (r._value_ClanekMin == 15)),
    C16: accumulator.C16 + int(v: (r._value_ClanekMin == 16)),
    }), 
    identity: {C01: 0, C02: 0, C03: 0, C04: 0, C05: 0, C06: 0, C07: 0, C08: 0, C09: 0, C10: 0, C11: 0, C12: 0, C13: 0, C14: 0, C15: 0, C16: 0})
  |> yield(name: "Články s minimálním napětím při nabíjení baterie")
// Tím jsem získal třetí zajímavý výsledek - kde je nejnižší napětí, když se baterie nabíjí
// obdobně mohu získat řadu dalšách dat třeba o článcích s max. napětím, popřípadě s přeléváním energie při balancování 
  
tabulka výsledků ve flux
tabulka výsledků ve flux
Výsledky jsem exportoval jako csv a graf udělal v excelu.
články s minimálním napětím při nabíjení a vybíjení baterie
články s minimálním napětím při nabíjení a vybíjení baterie
Vlastní kód je určitě neoptimální, zpracování 24 hodin záznamu z JK-BMS trvalo cca 3 minuty.
_______________________________________________________________________
43 kWp, LiFePO4 62 kWh,
EPSolar 60 A/150 V ET6415N + 3x Isolar SM II (5 kW, 450 V, 80 A) + Axpert PIP 5048MS

  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek