Stworzyłem nowy mod (fork) z innym podejściem do rozdzielczości i stabilnych odczytów do monitorowania mocy / energii z BL0937:
https://github.com/listen-obk/OpenBK7231T_App_BLtest
To podejście będzie działać tylko z układami monitorującymi moc wyjściową częstotliwości, takimi jak BL0937 i HLW8012.
Mój zamiar: Chciałem zmierzyć niskie obciążenia, takie jak zużycie wtyczki (drugi przykład). Nie mam pętli sterowania, w której wymagane są regularne szybkie aktualizacje, zamiast tego wolę dokładne i stabilne odczyty mocy / energii. Ten widelec został już wspomniany na stronie
https://www.elektroda.com/rtvforum/topic4114715.html#21745185], gdzie przedstawiono inne rozwiązanie.
Moje rozwiązanie:
Według karty katalogowej jeden impuls BL0937 reprezentuje nieco poniżej 0,5 mWh, co oznacza, że minimalna rozdzielczość dla mocy przy częstotliwości próbkowania jednej sekundy wynosi około 1,7 W. Ale nie potrzebuję aktualizacji co sekundę, a nie wyższej rozdzielczości, dlatego najpierw dodałem warunek "minimalna liczba impulsów przed aktualizacją", co oznacza, że w aplikacjach o niskiej mocy potrzeba kilku sekund, zanim pojawi się wystarczająca liczba impulsów do obliczenia mocy. Zmieniłem również bazę: liczba impulsów nigdy nie jest resetowana. W ten sposób żadne impulsy nie zostaną pominięte, jeśli nie zostaną uwzględnione w bieżącym cyklu, zostaną uwzględnione w następnym. Następnie zdałem sobie sprawę, że przy większej mocy nadal mam ten sam problem zbyt wielu aktualizacji i niestabilnych odczytów nawet przy stabilnym obciążeniu, więc dodałem kolejną opcję minimalnego i maksymalnego czasu cyklu. Aby to kontrolować, pojawiły się dwie nowe komendy:
BL0937_MinPulsesVCP <minPulses_V> <minPulses_C> <minPulses_P>
BL0937_IntervalCPMinMax <minInterval> <maxInterval>
Po zabawie z tym chyba najbardziej przydatna będzie druga komenda.
BL0937_IntervalCPMinMax <minInterval> kontroluje minimalny cykl aktualizacji w sekundach. Jeśli jest ustawiony np. na 10, wszystkie impulsy energii w ciągu 10 sekund są podsumowywane i moc jest obliczana na tej podstawie. Oznacza to coś w rodzaju sprzętowego uśredniania mocy (przynajmniej tak długo, jak wszystkie impulsy są przechwytywane przez procedurę przerwania). Brak zależności od częstotliwości próbkowania, krótkie skoki mocy nawet poniżej 1 sekundy będą uwzględnione z punktu widzenia energii, ale nie zobaczysz tych wysokich szczytów jako odczytu mocy.
Drugim wymogiem aktualizacji jest BL0937_MinPulsesVCP ... <minPulses_P> : jeśli minInterval osiągnięty, ale nie ma wystarczającej liczby impulsów minPulses_P , czekamy, aż zobaczymy ten limit liczby impulsów. Inny przykład: przy 0,25 W jest jeden impuls co 7 s. Dla dokładności chcę mieć co najmniej 2 impulsy - oznacza to, że wynikowy interwał będzie wynosił 14 s zgodnie z formułą arkusza danych. Jeśli obciążenie wzrośnie, interwał będzie się dynamicznie zmniejszał (dolny limit minInterval).
Dla niższych obciążeń, BL0937_IntervalCPMinMax <maxInterval> zacznie działać: jeśli minPulses_P nie zostanie osiągnięty w tym czasie, aktualizacja zostanie wymuszona.
Ponownie, skupiam się na jest na monitorowaniu mocy/energii, dlatego <minPulses_V> <minPulses_C> nie będą wyzwalać aktualizacji, tylko kontrolować przełączanie między pomiarami V i C. Pomiar V zwykle trwa tylko jedną sekundę, ale pomiar C może trwać dłużej. Wykonywana jest średnia dla obu pomiarów w cyklu (czas cyklu określony przez moc). Nie oczekuj wysokiej dokładności, ma to bardziej charakter informacyjny (wpływ na obliczenia współczynnika mocy).
Szczególnie przy długich interwałach interesujące może być szybsze rozpoznawanie zmian mocy (włączanie/wyłączanie grzałki). Aby to osiągnąć, dodałem kolejną komendę
BL0937_ForceOnPwrROC <rateofchange_W/s> <rateofchange_W/cycle>
<rateofchange_W/s> przeznaczony do skoków mocy (jak włączanie/wyłączanie grzejnika) i stałego obciążenia. Porównuje moc prądu z ostatnią sekundą. Jeśli dodatnia lub ujemna różnica jest powyżej limitu, odczyty są aktualizowane trzy razy (w kolejnych sekundach). Pierwsza aktualizacja będzie średnią mocą od ostatniej regularnej aktualizacji ( <minInterval> ), druga będzie miała rzeczywistą nową moc, ale czasami wolt/prąd nie są jeszcze poprawnie zaktualizowane.
<rateofchange_W/cycle> przeznaczony do obciążenia impulsowego (PWM) (sterownik 2-punktowy, taki jak grzejnik z termostatem). porównuje średnią moc bieżącego cyklu z mocą ostatniego cyklu i wyzwala jedną aktualizację i wyzwala trzy aktualizacje, jak powyżej.
Intencją jest ustawienie długich interwałów, np. średniej mocy powyżej 900 s, ale rozpoznawanie zdarzeń włączania/wyłączania z lepszą rozdzielczością czasową. Poprawi to dokładność zewnętrznego monitorowania energii.
Używam MQTT (z FHEM) do historii i kontroli i brakowało mi aktualnych wartości. Tasmota odpowiada aktualnymi wartościami przy zmianie i jeśli nie podano żadnych argumentów. Zaimplementowałem to samo dla nowych poleceń i dla BL współdzielonych poleceń VCPPublishIntervals, VCPPublishThreshold i VCPPrecision. Zachowanie musi być włączone przez inną komendę EnabeMQTTOnCommand 1 . To może być domyślne, ale chciałem być jak najbardziej kompatybilny.
Kompatybilność jest powodem innej komendy: BL0937_ScalefactorMultiply <factorV> <factorC> <factorP>
Surowe wartości V i P do skalowania i kalibracji są oczekiwane jako int w drv_pwrCal.c, ale dla lepszej rozdzielczości (P poniżej 1,7 W) wymagane są ułamki 1. Dlatego mnożę surową wartość (częstotliwość, V przez 10, P przez 1000) przed skalowaniem i stosuję niższy współczynnik skali (przesunięcie cyfry w porównaniu do głównej gałęzi).
Oznacza to, że jeśli oprogramowanie układowe zmieni się w stosunku do głównej gałęzi, wewnętrzne współczynniki skali muszą zostać zmienione. Aby zachować kalibrację, zwykle powinno to być BL0937_ScalefactorMultiply 0.1 1 0.001 .
Inną opcją może być BL0937_ScalefactorMultiply 0 0 0 . Jako rodzaj nowej funkcji spowoduje to zresetowanie kalibracji i użycie nowych wartości domyślnych. Po tym nowa kalibracja może być dobra.
Nie jest wymagane żadne działanie, jeśli urządzenie zostało początkowo sflashowane tym modem lub kalibracja nie została wcześniej wykonana.
Uwaga: przed ponownym flashowaniem do głównej gałęzi firmware, BL0937_ScalefactorMultiply 10 1 1000 należy wykonać, w przeciwnym razie wymagana będzie ponowna kalibracja.
Na stronie urządzenia polecenie pokaże aktualnie używane i domyślne wartości oraz zaleci mnożniki (10^x), aby zachować kalibrację. Notacja naukowa powinna pomóc dostrzec różnice.
przykładowy wpis w dzienniku:
Info:CMD:ts 5639 BL0937_ScalefactorMultiply: za mało argumentów do zmiany. Bieżące (domyślne) wartości V 1.248886E-01 (1.581335E-02) C 1.072063E-02 (1.287009E-02) P 1.280320E+00 (1.707145E-03), zalecane współczynniki 0.100000 1.000000 0.001000
Jeśli polecenie zostanie wysłane za pośrednictwem MQTT, odpowiedź będzie zawierać nowe współczynniki skali (lub bieżące wartości, jeśli polecenie zostanie wysłane bez argumentu).
Info:MQTT:P ublishing val 1.248886E-01 1.072063E-02 1.280320E+00 to ecr66000CFF9367/ScalefactorsVCP retain=0
Na koniec zastanawiałem się nad dokładnością czasu, ponieważ jest on używany do obliczania częstotliwości. W tym celu dodałem komendę SendTimestamps . Z wartością 1 będzie wysyłać NTP i wewnętrzne znaczniki czasu (diff) przez MQTT co godzinę. Idealnie różnica nie powinna zmieniać się w czasie. Jest to tylko ciekawostka, ponieważ częstotliwość jest w rzeczywistości uwzględniana w ogólnej kalibracji (współczynnik skali). Domyślnie jest wyłączona, włącz ją poleceniem SendTimestamps 1.
Chociaż jest to wersja testowa, istnieje kilka dzienników na poziomie debugowania i dodatkowego debugowania w celu sprawdzenia poprawności obliczeń (odpowiedzi na polecenia, tiki, impulsy, częstotliwość, ...).
Do tej pory mogłem testować tylko na najnowszych wtyczkach Tuya z ECR6600 i BL0937, które używają 2ms ticków. Byłoby wspaniale zobaczyć, czy działa (obliczanie częstotliwości) również na innych platformach.
Należy pamiętać, że ustawienia wyjścia VCPPublishIntervals i VCPPublishThreshold są dodatkowymi warunkami i mogą opóźnić lub uniemożliwić aktualizacje. Ten wariant może być czymś w rodzaju zamiennika dla VCPPublishIntervals.
Zapraszam do wypróbowania. Wszelkie komentarze na temat rozwiązania i nazw są mile widziane. Nie miałem żadnych problemów z OTA z i do głównych gałęzi/wersji powyżej 200 (kiedy zaczynałem). Należy wziąć pod uwagę tylko ScaleFactor, w przeciwnym razie EnergyStats może mieć szczyty lub luki, podczas gdy odczyty mocy są nieprawidłowe. Poza limitami bezpieczeństwa historii, nie ma żadnych zmian w tym kodzie. Od czasu do czasu synchronizuję fork, aby być na bieżąco z główną funkcjonalnością.
Wskazówka: podczas gdy jest to niestandardowe oprogramowanie układowe, na githubie przejdź do Actions, a następnie kliknij (ostatnie) pomyślne uruchomienie przepływu pracy, pobierz z sekcji Artifacts.
https://github.com/listen-obk/OpenBK7231T_App_BLtest
To podejście będzie działać tylko z układami monitorującymi moc wyjściową częstotliwości, takimi jak BL0937 i HLW8012.
Mój zamiar: Chciałem zmierzyć niskie obciążenia, takie jak zużycie wtyczki (drugi przykład). Nie mam pętli sterowania, w której wymagane są regularne szybkie aktualizacje, zamiast tego wolę dokładne i stabilne odczyty mocy / energii. Ten widelec został już wspomniany na stronie
https://www.elektroda.com/rtvforum/topic4114715.html#21745185], gdzie przedstawiono inne rozwiązanie.
Moje rozwiązanie:
Według karty katalogowej jeden impuls BL0937 reprezentuje nieco poniżej 0,5 mWh, co oznacza, że minimalna rozdzielczość dla mocy przy częstotliwości próbkowania jednej sekundy wynosi około 1,7 W. Ale nie potrzebuję aktualizacji co sekundę, a nie wyższej rozdzielczości, dlatego najpierw dodałem warunek "minimalna liczba impulsów przed aktualizacją", co oznacza, że w aplikacjach o niskiej mocy potrzeba kilku sekund, zanim pojawi się wystarczająca liczba impulsów do obliczenia mocy. Zmieniłem również bazę: liczba impulsów nigdy nie jest resetowana. W ten sposób żadne impulsy nie zostaną pominięte, jeśli nie zostaną uwzględnione w bieżącym cyklu, zostaną uwzględnione w następnym. Następnie zdałem sobie sprawę, że przy większej mocy nadal mam ten sam problem zbyt wielu aktualizacji i niestabilnych odczytów nawet przy stabilnym obciążeniu, więc dodałem kolejną opcję minimalnego i maksymalnego czasu cyklu. Aby to kontrolować, pojawiły się dwie nowe komendy:
BL0937_MinPulsesVCP <minPulses_V> <minPulses_C> <minPulses_P>
BL0937_IntervalCPMinMax <minInterval> <maxInterval>
Po zabawie z tym chyba najbardziej przydatna będzie druga komenda.
BL0937_IntervalCPMinMax <minInterval> kontroluje minimalny cykl aktualizacji w sekundach. Jeśli jest ustawiony np. na 10, wszystkie impulsy energii w ciągu 10 sekund są podsumowywane i moc jest obliczana na tej podstawie. Oznacza to coś w rodzaju sprzętowego uśredniania mocy (przynajmniej tak długo, jak wszystkie impulsy są przechwytywane przez procedurę przerwania). Brak zależności od częstotliwości próbkowania, krótkie skoki mocy nawet poniżej 1 sekundy będą uwzględnione z punktu widzenia energii, ale nie zobaczysz tych wysokich szczytów jako odczytu mocy.
Drugim wymogiem aktualizacji jest BL0937_MinPulsesVCP ... <minPulses_P> : jeśli minInterval osiągnięty, ale nie ma wystarczającej liczby impulsów minPulses_P , czekamy, aż zobaczymy ten limit liczby impulsów. Inny przykład: przy 0,25 W jest jeden impuls co 7 s. Dla dokładności chcę mieć co najmniej 2 impulsy - oznacza to, że wynikowy interwał będzie wynosił 14 s zgodnie z formułą arkusza danych. Jeśli obciążenie wzrośnie, interwał będzie się dynamicznie zmniejszał (dolny limit minInterval).
Dla niższych obciążeń, BL0937_IntervalCPMinMax <maxInterval> zacznie działać: jeśli minPulses_P nie zostanie osiągnięty w tym czasie, aktualizacja zostanie wymuszona.
Ponownie, skupiam się na jest na monitorowaniu mocy/energii, dlatego <minPulses_V> <minPulses_C> nie będą wyzwalać aktualizacji, tylko kontrolować przełączanie między pomiarami V i C. Pomiar V zwykle trwa tylko jedną sekundę, ale pomiar C może trwać dłużej. Wykonywana jest średnia dla obu pomiarów w cyklu (czas cyklu określony przez moc). Nie oczekuj wysokiej dokładności, ma to bardziej charakter informacyjny (wpływ na obliczenia współczynnika mocy).
Szczególnie przy długich interwałach interesujące może być szybsze rozpoznawanie zmian mocy (włączanie/wyłączanie grzałki). Aby to osiągnąć, dodałem kolejną komendę
BL0937_ForceOnPwrROC <rateofchange_W/s> <rateofchange_W/cycle>
<rateofchange_W/s> przeznaczony do skoków mocy (jak włączanie/wyłączanie grzejnika) i stałego obciążenia. Porównuje moc prądu z ostatnią sekundą. Jeśli dodatnia lub ujemna różnica jest powyżej limitu, odczyty są aktualizowane trzy razy (w kolejnych sekundach). Pierwsza aktualizacja będzie średnią mocą od ostatniej regularnej aktualizacji ( <minInterval> ), druga będzie miała rzeczywistą nową moc, ale czasami wolt/prąd nie są jeszcze poprawnie zaktualizowane.
<rateofchange_W/cycle> przeznaczony do obciążenia impulsowego (PWM) (sterownik 2-punktowy, taki jak grzejnik z termostatem). porównuje średnią moc bieżącego cyklu z mocą ostatniego cyklu i wyzwala jedną aktualizację i wyzwala trzy aktualizacje, jak powyżej.
Intencją jest ustawienie długich interwałów, np. średniej mocy powyżej 900 s, ale rozpoznawanie zdarzeń włączania/wyłączania z lepszą rozdzielczością czasową. Poprawi to dokładność zewnętrznego monitorowania energii.
Używam MQTT (z FHEM) do historii i kontroli i brakowało mi aktualnych wartości. Tasmota odpowiada aktualnymi wartościami przy zmianie i jeśli nie podano żadnych argumentów. Zaimplementowałem to samo dla nowych poleceń i dla BL współdzielonych poleceń VCPPublishIntervals, VCPPublishThreshold i VCPPrecision. Zachowanie musi być włączone przez inną komendę EnabeMQTTOnCommand 1 . To może być domyślne, ale chciałem być jak najbardziej kompatybilny.
Kompatybilność jest powodem innej komendy: BL0937_ScalefactorMultiply <factorV> <factorC> <factorP>
Surowe wartości V i P do skalowania i kalibracji są oczekiwane jako int w drv_pwrCal.c, ale dla lepszej rozdzielczości (P poniżej 1,7 W) wymagane są ułamki 1. Dlatego mnożę surową wartość (częstotliwość, V przez 10, P przez 1000) przed skalowaniem i stosuję niższy współczynnik skali (przesunięcie cyfry w porównaniu do głównej gałęzi).
Oznacza to, że jeśli oprogramowanie układowe zmieni się w stosunku do głównej gałęzi, wewnętrzne współczynniki skali muszą zostać zmienione. Aby zachować kalibrację, zwykle powinno to być BL0937_ScalefactorMultiply 0.1 1 0.001 .
Inną opcją może być BL0937_ScalefactorMultiply 0 0 0 . Jako rodzaj nowej funkcji spowoduje to zresetowanie kalibracji i użycie nowych wartości domyślnych. Po tym nowa kalibracja może być dobra.
Nie jest wymagane żadne działanie, jeśli urządzenie zostało początkowo sflashowane tym modem lub kalibracja nie została wcześniej wykonana.
Uwaga: przed ponownym flashowaniem do głównej gałęzi firmware, BL0937_ScalefactorMultiply 10 1 1000 należy wykonać, w przeciwnym razie wymagana będzie ponowna kalibracja.
Na stronie urządzenia polecenie pokaże aktualnie używane i domyślne wartości oraz zaleci mnożniki (10^x), aby zachować kalibrację. Notacja naukowa powinna pomóc dostrzec różnice.
przykładowy wpis w dzienniku:
Info:CMD:ts 5639 BL0937_ScalefactorMultiply: za mało argumentów do zmiany. Bieżące (domyślne) wartości V 1.248886E-01 (1.581335E-02) C 1.072063E-02 (1.287009E-02) P 1.280320E+00 (1.707145E-03), zalecane współczynniki 0.100000 1.000000 0.001000
Jeśli polecenie zostanie wysłane za pośrednictwem MQTT, odpowiedź będzie zawierać nowe współczynniki skali (lub bieżące wartości, jeśli polecenie zostanie wysłane bez argumentu).
Info:MQTT:P ublishing val 1.248886E-01 1.072063E-02 1.280320E+00 to ecr66000CFF9367/ScalefactorsVCP retain=0
Na koniec zastanawiałem się nad dokładnością czasu, ponieważ jest on używany do obliczania częstotliwości. W tym celu dodałem komendę SendTimestamps . Z wartością 1 będzie wysyłać NTP i wewnętrzne znaczniki czasu (diff) przez MQTT co godzinę. Idealnie różnica nie powinna zmieniać się w czasie. Jest to tylko ciekawostka, ponieważ częstotliwość jest w rzeczywistości uwzględniana w ogólnej kalibracji (współczynnik skali). Domyślnie jest wyłączona, włącz ją poleceniem SendTimestamps 1.
Chociaż jest to wersja testowa, istnieje kilka dzienników na poziomie debugowania i dodatkowego debugowania w celu sprawdzenia poprawności obliczeń (odpowiedzi na polecenia, tiki, impulsy, częstotliwość, ...).
Do tej pory mogłem testować tylko na najnowszych wtyczkach Tuya z ECR6600 i BL0937, które używają 2ms ticków. Byłoby wspaniale zobaczyć, czy działa (obliczanie częstotliwości) również na innych platformach.
Należy pamiętać, że ustawienia wyjścia VCPPublishIntervals i VCPPublishThreshold są dodatkowymi warunkami i mogą opóźnić lub uniemożliwić aktualizacje. Ten wariant może być czymś w rodzaju zamiennika dla VCPPublishIntervals.
Zapraszam do wypróbowania. Wszelkie komentarze na temat rozwiązania i nazw są mile widziane. Nie miałem żadnych problemów z OTA z i do głównych gałęzi/wersji powyżej 200 (kiedy zaczynałem). Należy wziąć pod uwagę tylko ScaleFactor, w przeciwnym razie EnergyStats może mieć szczyty lub luki, podczas gdy odczyty mocy są nieprawidłowe. Poza limitami bezpieczeństwa historii, nie ma żadnych zmian w tym kodzie. Od czasu do czasu synchronizuję fork, aby być na bieżąco z główną funkcjonalnością.
Wskazówka: podczas gdy jest to niestandardowe oprogramowanie układowe, na githubie przejdź do Actions, a następnie kliknij (ostatnie) pomyślne uruchomienie przepływu pracy, pobierz z sekcji Artifacts.