logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Włączanie wielu liczników energii w OpenBecken dla urządzeń BL0942 i ADE7880

cdtdsilva 26 Mar 2024 20:24 4533 55
Najlepsze odpowiedzi

How can I enable extra energy meter statistics and export counters in OpenBeken for BL0942/ADE7880 devices?

Dodatkowe statystyki energii w OpenBeken nie włączają się samym interfejsem WWW — trzeba włączyć NTP, skonfigurować statystyki poleceniem `SetupEnergyStats`, np. `backlog Powersave 1; startDriver BL0942; startDriver NTP; ntp_timeZoneOfs 1; SetupEnergyStats 1 60 60` [#21022822][#21025220] Jeśli chcesz dodać własne liczniki eksportu/netmeteringu dla BL0942, trzeba zmienić `drv_bl_shared.c` oraz powiązane wyliczenie/obsługę zapisu, a najlepiej nie dodawać nowych pól do struktur flash, tylko wykorzystać istniejącą rezerwę lub ostatnie zachowane kanały, żeby nie psuć zgodności i nie zwiększać niepotrzebnie zużycia flash [#21024952][#21026479] Zapis statystyk energii jest już batched i nie odbywa się przy każdym odczycie, a w kodzie pojawiła się też funkcja `BL09XX_SaveEmeteringStatistics`, gdzie ustawiana jest częstotliwość zapisu [#21024952][#21031759] Dla netmeteringu autor wątku później przeszedł na osobne statystyki godzinowe/okresowe i użycie flag, a komunikacja z automatyzacją ma iść raczej przez komendę konsoli oraz ewentualny przycisk w webapp, nie przez hardcodowanie dodatkowych elementów w natywnym UI [#21031005][#21060974][#21068748] Nie ma tu gotowej „magicznej” opcji w standardowym UI — potrzebna jest albo własna kompilacja/PR, albo uruchamianie odpowiednich komend z `autoexec.bat` i webapp [#21068748]
Wygenerowane przez model językowy.
REKLAMA
Treść została przetłumaczona angielski » polski Zobacz oryginalną wersję tematu
  • #1 21021021
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    Aktualizuję to, aby odzwierciedlić pracę wykonaną nad tym projektem.

    Obecnie można mierzyć zużycie energii w trybie zwrotnym i forwardowym na urządzeniach opartych na BL0942.
    Wdrożyłem także Netmetering, dzięki czemu wiemy, ile wynosi zużycie własne, a ile faktycznie eksportuje się do sieci.

    Netmetering to suma salda zużytego i wyprodukowanego. Załóżmy, że wyprodukowałeś 1000 W i zużyłeś 500 W, saldo będzie dodatnie 500 W,
    Zwykle byłoby to eksportowane do sieci w celu późniejszego wykorzystania, ale w najnowszych taryfach przedsiębiorstwa użyteczności publicznej skróciły czas, w którym można to zrobić, zazwyczaj pomiędzy odczytami liczników (15 do 60 minut). Jakakolwiek nadwyżka zostanie oznaczona jako „Eksport@” i sprzedana przedsiębiorstwu użyteczności publicznej za bardzo niską cenę w porównaniu z ceną zakupu.

    Aby lepiej wykorzystać to postanowienie, dodałem funkcję umożliwiającą zdalny przekaźnik, gdy istnieje pewna ilość dodatniego salda. Pozwala to skierować część tej energii do podgrzewacza wody, systemu grzewczego lub dowolnego innego urządzenia.
    Może być używany samodzielnie lub podłączony do asystenta domowego w celu uruchomienia automatyki.

    Dalsze szczegóły w miarę kontynuowania...
    Teraz przejdźmy do oryginału...

    Na inny temat Połączyć Dodałem obsługę energii do przodu i do tyłu w smart plus opartym na BL0942.

    OpenBecken posiada jeden globalny licznik energii - nie ma możliwości wyświetlenia dodatkowych odczytów energii wyeksportowanej.
    Chciałbym włączyć dodatkowe, ale nie wiem jak to zrobić - nie jest to zbyt dobrze udokumentowane, jak w Tasmota. Czy są jakieś niestandardowe kompilacje, w których zaimplementowano tę funkcję?

    Coś takiego, co jest włączone w Shelly 3EM przy użyciu ADE7880:
    Interfejs użytkownika Shelly EM z danymi zużycia energii.

    Widzę, że w pliku drv_bl_shared.c znajdują się statystyki dotyczące różnych statystyk, takich jak „Energia dzisiaj”, „Energia wczoraj”, „Energia z ostatniej godziny” itp. Czy są one używane na konkretnym urządzeniu? Czy istnieje sposób, aby w jakiś sposób włączyć je w interfejsie internetowym?

    Dzięki!
  • REKLAMA
  • #2 21022822
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    To bardzo dobry pomysł.
    Myślę, że musisz edytować ten plik:
    https://github.com/openshwprojects/OpenBK7231T_App/blob/main/src/driver/drv_bl_shared.c
    Mianowicie ta tablica:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Musisz także zaktualizować odpowiednie wyliczenie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Aby korzystać z dodatkowych liczników, takich jak „energia dzisiaj” itp., musisz włączyć NTP i skonfigurować liczniki energii. Więcej szczegółów znajdziesz w naszej dokumentacji:
    https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/commands.md
    Powiązane polecenie to Skonfiguruj statystyki energii .
    Aby uzyskać więcej informacji, możesz sprawdzić inne wątki:
    https://www.elektroda.com/rtvforum/find.php?q=SetupEnergyStats


    Gdy dokonasz modyfikacji, będę mógł scalić Twoje zmiany. Daj mi znać, jeśli będziesz mieć dalsze pytania.
    Pomogłem? Kup mi kawę.
  • #3 21023986
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    Miałem nadzieję, że pomożecie mi włączyć dodatkowe statystyki, jak pokazano na moim poprzednim obrazie (na razie pomińmy statystyki dotyczące czasu i skupmy się wyłącznie na sumach). Statystyki te należy przypisać do zmiennej i tu właśnie napotykam trudności ze zrozumieniem kodu.

    Na podstawie moich badań wydaje się, że jest to prawidłowa funkcja

    void BL_ProcessUpdate(float voltage, float current, float power,
                          float frequency, float energyWh) {...}


    Funkcję tę trzeba jednak zmodyfikować, aby wyświetlić na stronie jeszcze kilka elementów (np. całkowitą produkcję) i jakoś je zapisać, podobnie jak dane o zużyciu.

    Jeśli chodzi o przechowywanie, wydaje się, że ta funkcja jest za to odpowiedzialna,
    HAL_FlashVars_SaveTotalConsumption(sensors[OBK_CONSUMPTION_TOTAL].lastReading);

    ale nie jestem pewien, w jakich okolicznościach zapisuje. Jak mogę się upewnić, że nie zapiszę pamięci zbyt wiele razy?

    Wygląda na to, że to zadanie może przekroczyć moje obecne możliwości, pomimo moich szczerych wysiłków, by mu pomóc.
  • #4 21024952
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    cdtdsilva napisał:
    I
    void BL_ProcessUpdate(float voltage, float current, float power,
                          float frequency, float energyWh) {...}


    Jeśli założymy, że energiaWh jest ujemna, gdy mamy zysk energii, to nie musisz dodawać tam zmiennej. Musisz dodać instrukcję warunkową w dalszej części wiersza, aby oddzielić wartości „wzięte” od „podanych”.


    cdtdsilva napisał:

    Jeśli chodzi o przechowywanie, wydaje się, że ta funkcja jest za to odpowiedzialna,
    HAL_FlashVars_SaveTotalConsumption(sensors[OBK_CONSUMPTION_TOTAL].lastReading);


    Myślę, że powinieneś móc rozszerzyć tam struktury:
    https://github.com/openshwprojects/OpenBK7231T_App/blob/main/src/hal/hal_flashVars.h#L20
    Aktualizacja spowoduje uszkodzenie statystyk dla wszystkich użytkowników, ale może uda nam się z tym żyć...
    A może wykorzystać „zarezerwowane” 3-bajtowe pole?
    A może zapisz go w ostatnich 4 bajtach:
    
    	short savedValues[MAX_RETAIN_CHANNELS];
    

    Nikt nigdy nie przechowuje więcej niż 4 kanałów, a MAX_RETAIN_CHANNELS wynosi 12, więc możesz tego użyć... jeśli potrzebujesz 4 bajtów.

    cdtdsilva napisał:
    Jak mogę się upewnić, że nie zapiszę pamięci zbyt wiele razy?

    Kod flashvars działa poprzez wielokrotne zapisywanie 64-bajtowych bloków na pojedynczej stronie, a następnie usuwanie ich dopiero wtedy, gdy strona jest pełna. Zatem zakładając rozmiar strony 4096, otrzymujemy 4096/64 = 64 zapisy na cykl kasowania. Ponadto myślę, że wykorzystywanych jest więcej stron. Jest więc wielokrotnie bardziej wydajny i mniej podatny na błyskawiczne zużycie niż zwykłe ślepe „wymazywanie i zapisywanie” przy każdej zmianie.


    cdtdsilva napisał:

    Wygląda na to, że to zadanie może przekroczyć moje obecne możliwości, pomimo moich szczerych wysiłków, by mu pomóc.

    Jestem bardzo zadowolony z Waszej dotychczasowej aktywności. Jeśli zajdzie taka potrzeba, mogę pomóc więcej. Proszę, powiedz mi, jakiego nowego pola, jakiego rodzaju i rozmiaru potrzebujesz, a mogę je dodać dla Ciebie.
    Najprawdopodobniej po prostu użyję:
    
    	short savedValues[MAX_RETAIN_CHANNELS];
    

    bo tak jak mówiłem wcześniej nie wyobrażam sobie scenariusza gdzie ktoś robi pomiary energii i ma około 10 kanałów przekaźnikowych..
    Pomogłem? Kup mi kawę.
  • #5 21025193
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    p.kaczmarek2 napisał:
    cdtdsilva napisał:

    void BL_ProcessUpdate(float voltage, float current, float power,
                          float frequency, float energyWh) {...}


    Jeśli założymy, że energiaWh jest ujemna, gdy mamy zysk energii, to nie musisz dodawać tam zmiennej. Musisz dodać instrukcję warunkową w dalszej części wiersza, aby oddzielić wartości „wzięte” od „podanych”.

    Tak, robię to teraz.
    p.kaczmarek2 napisał:

    cdtdsilva napisał:

    Jeśli chodzi o przechowywanie, wydaje się, że ta funkcja jest za to odpowiedzialna,
    HAL_FlashVars_SaveTotalConsumption(sensors[OBK_CONSUMPTION_TOTAL].lastReading);


    Myślę, że powinieneś móc rozszerzyć tam struktury:
    https://github.com/openshwprojects/OpenBK7231T_App/blob/main/src/hal/hal_flashVars.h#L20
    Aktualizacja spowoduje uszkodzenie statystyk dla wszystkich użytkowników, ale może uda nam się z tym żyć...
    A może wykorzystać „zarezerwowane” 3-bajtowe pole?
    A może zapisz go w ostatnich 4 bajtach:
    
    	short savedValues[MAX_RETAIN_CHANNELS];
    

    Nikt nigdy nie przechowuje więcej niż 4 kanałów, a MAX_RETAIN_CHANNELS wynosi 12, więc możesz tego użyć... jeśli potrzebujesz 4 bajtów.

    Dodałem to jako takie. Czy widzisz jakieś potencjalne problemy, biorąc pod uwagę większy rozmiar?
    Czy coś zostanie nadpisane, jeśli użyjemy obu?

    /* Fixed size 32 bytes */
    typedef struct ENERGY_METERING_DATA {
    	float TotalGeneration;
    	float TotalConsumption;
    	float TodayConsumpion;
    	//float YesterdayConsumption;
    	long save_counter;
    	float ConsumptionHistory[2];
    	time_t ConsumptionResetTime;
    	unsigned char reseved[3];
    	char actual_mday;
    } ENERGY_METERING_DATA;


    p.kaczmarek2 napisał:

    cdtdsilva napisał:
    Jak mogę się upewnić, że nie zapiszę pamięci zbyt wiele razy?

    Kod flashvars działa poprzez wielokrotne zapisywanie 64-bajtowych bloków na pojedynczej stronie, a następnie usuwanie ich dopiero wtedy, gdy strona jest pełna. Zatem zakładając rozmiar strony 4096, otrzymujemy 4096/64 = 64 zapisy na cykl kasowania. Ponadto myślę, że wykorzystywanych jest więcej stron. Jest więc wielokrotnie bardziej wydajny i mniej podatny na błyskawiczne zużycie niż zwykłe ślepe „wymazywanie i zapisywanie” przy każdej zmianie.

    To świetnie, nic się wtedy nie zmieni.

    p.kaczmarek2 napisał:
    cdtdsilva napisał:

    Wygląda na to, że to zadanie może przekroczyć moje obecne możliwości, pomimo moich szczerych wysiłków, by mu pomóc.

    Jestem bardzo zadowolony z Waszej dotychczasowej aktywności. Jeśli zajdzie taka potrzeba, mogę pomóc więcej. Proszę, powiedz mi, jakiego nowego pola, jakiego rodzaju i rozmiaru potrzebujesz, a mogę je dodać dla Ciebie.

    Najprawdopodobniej po prostu użyję:
    
    	short savedValues[MAX_RETAIN_CHANNELS];
    

    bo tak jak mówiłem wcześniej nie wyobrażam sobie scenariusza gdzie ktoś robi pomiary energii i ma około 10 kanałów przekaźnikowych..


    No to ruszamy :)

    Czy istnieje timer systemowy, którego mogę używać bez konieczności korzystania z protokołu NTP? Chcę resetować zmienną mocy bezwzględnej co 15 minut/60 minut.
    Gdzie znajduje się kod strony internetowej? Chcę dodać dodatkowy przycisk do resetowania statystyk generowania, obok przycisku podsumowującego
  • #6 21025220
    Honsu
    Poziom 3  
    Posty: 76
    Ocena: 5
    Mam wpisane w pliku autoexec.bat

    startDriver NTP
    ntp_timeZoneOfs 1
    SetupEnergyStats 1 60 60
    Zrzut ekranu przedstawiający statystyki zużycia energii z różnymi danymi pomiarowymi.
  • #7 21025418
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    Nie jestem pewien, czy to przeoczyłem, ale czy możesz @cdtdsilva określić, ile bajtów potrzebujesz?

    cdtdsilva napisał:

    Dodałem to jako takie. Czy widzisz jakieś potencjalne problemy, biorąc pod uwagę większy rozmiar?

    Dodanie nowych pól do tej struktury spowoduje, że wszyscy użytkownicy stracą statystyki energii po ponownym uruchomieniu i spowodują szybsze zużycie pamięci flash.

    Moja propozycja jest obecnie taka:

    p.kaczmarek2 napisał:

    A może zapisz go w ostatnich 4 bajtach:
    
    	short savedValues[MAX_RETAIN_CHANNELS];
    

    Nikt nigdy nie przechowuje więcej niż 4 kanałów, a MAX_RETAIN_CHANNELS wynosi 12, więc możesz tego użyć... jeśli potrzebujesz 4 bajtów.

    Skorzystaj z tych pól zamiast dodawać nowe. Po prostu zdobądź wskaźnik i rzuć go na liczbę całkowitą lub jaki typ chcesz?

    cdtdsilva napisał:

    Czy istnieje timer systemowy, którego mogę używać bez konieczności korzystania z protokołu NTP? Chcę resetować zmienną mocy bezwzględnej co 15 minut/60 minut.

    Czy chcesz go używać wyłącznie do celów testowych, czy do produkcji?
    Istnieje polecenie addRepeatingEvent, którego można użyć do testów programistycznych.

    cdtdsilva napisał:

    Gdzie znajduje się kod strony internetowej? Chcę dodać dodatkowy przycisk do resetowania statystyk generowania, obok przycisku podsumowującego

    Proszę nie dodawać żadnych specjalnych przycisków do natywnej strony HTTP. Musimy zachować pamięć flash. Niektóre urządzenia mają tylko 1 MB. Wystarczy dodać polecenie konsoli, jak tutaj:
    Wycinek tabeli z komendą resetowania licznika energii i opcjonalną nową wartością.
    Zrzut ekranu kodu źródłowego aplikacji OpenBK7231T w pliku drv_bl_shared.c.
    Następnie możesz edytować kod naszej aplikacji internetowej JavaScript tutaj:
    https://github.com/OpenBekenIOT/webapp
    aby dodać przycisk wywołujący to polecenie, tak jak zrobiłem to tutaj:
    Zrzut ekranu aplikacji webowej z narzędziami do zarządzania urządzeniami IoT. [/cytat]
    Pomogłem? Kup mi kawę.
  • #8 21025677
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    p.kaczmarek2 napisał:
    Nie jestem pewien, czy to przeoczyłem, ale czy możesz @cdtdsilva określić, ile bajtów potrzebujesz?


    Potrzebuję 8 bajtów. Liczniki całkowite są zapisywane jako float - używając skrótu, zgaduję, że mamy dostępne tylko 4 bity, co spowodowałoby ich szybsze przepełnienie.

    Myślałem o użyciu pola „Wczorajsze zużycie” lub skomentowaniu go, tak jak w przykładzie, aby dać miejsce na zmienną o tym samym rozmiarze. Technicznie rzecz biorąc, jest to jedyne pole, które mogłoby zostać uszkodzone, pozostałe pozycje pamięci pozostają niezmienione. Oszczędza to tylko zużycie z ostatnich 24 godzin, więc będzie mieć minimalny wpływ na użytkowników.

    p.kaczmarek2 napisał:

    Dodanie nowych pól do tej struktury spowoduje, że wszyscy użytkownicy stracą statystyki energii po ponownym uruchomieniu i spowodują szybsze zużycie pamięci flash.

    Patrz wyżej.

    p.kaczmarek2 napisał:

    Czy chcesz go używać wyłącznie do celów testowych, czy do produkcji?
    Istnieje polecenie addRepeatingEvent, którego można użyć do testów programistycznych.


    Chcę go używać do produkcji, bez NTP. Czy w przypadku opóźnień nieblokujących używany jest systemowy licznik taktów?
  • REKLAMA
  • #9 21025722
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    Mogę spróbować dodać dla Ciebie dwa pola zmiennoprzecinkowe w miejsce ostatnich 4 zachowanych kanałów, których nikt nie używa. Jak mam je nazwać? Dwa 32-bitowe liczby zmiennoprzecinkowe, więc 2*4 = 8 bajtów.

    Jak dokładny czas potrzebujesz?
    Pomogłem? Kup mi kawę.
  • #10 21025744
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    p.kaczmarek2 napisał:
    Mogę spróbować dodać dla Ciebie dwa pola zmiennoprzecinkowe w miejsce ostatnich 4 zachowanych kanałów, których nikt nie używa. Jak mam je nazwać? Dwa 32-bitowe liczby zmiennoprzecinkowe, więc 2*4 = 8 bajtów.


    Dzięki. Potrzebuję tylko jednej zmiennej o nazwie TotalGeneration. Powinien to być plik zmiennoprzecinkowy 64-bitowy / 8 bajtów.

    p.kaczmarek2 napisał:
    Jak dokładny czas potrzebujesz?

    Czas nie musi być bardzo precyzyjny, wystarczy około 15 lub 60 minut, ponieważ są to standardowe czasy pomiaru netto oferowane przez zakłady użyteczności publicznej.

    Powiedziałem, że nie chcę używać NTP... Dla wyjaśnienia - nie mam nic przeciwko używaniu go - Ale chcę móc z niego korzystać bez Internetu. Czy zatem sterownik nadal będzie działał, a czas nie będzie zsynchronizowany (tzn. zacznie liczyć od 19:00)? Będę robił, to zmierzenie liczby sekund i zaplanowanie następnego oczyszczenia licznika energii absolutnej z wyprzedzeniem 15 lub 60 minut. Najlepiej byłoby to zsynchronizować z początkiem godziny, jeśli urządzenie było podłączone do Internetu, ale poprawna strefa czasowa, dzień, tydzień itp. nie jest wymagana.

    Pomiar energii już działa, wystarczy dodać funkcję pomiaru netto i zmienić „TotalGeneration” na nową zmienną, którą będziesz tworzyć, a także uporządkować kod
    Zrzut ekranu przedstawiający statystyki zużycia energii z wartościami takimi jak częstotliwość, napięcie, prąd i inne parametry elektryczne.
  • #11 21025789
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    Cała nasza matematyka jest wykonywana na 32-bitowych systemach zmiennoprzecinkowych, a 32-bitowy zmiennoprzecinkowy służy do przechowywania zużycia energii. Dlaczego nagle chcesz używać 64-bitowego typu double do wytwarzania energii? Jakiej mocy spodziewasz się wygenerować, jeśli Twoim zdaniem przekroczy ona typ 32-bitowy?

    Jeśli martwisz się o precyzję zmiennoprzecinkową, możesz także zdecydować się na 32-bitową liczbę całkowitą bez znaku i założyć, że jest to wartość w Wh lub coś w tym stylu, w zależności od wymaganej precyzji.

    Jeśli chodzi o czas - może po prostu wykonaj:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    w kodzie sterownika? W aktualizacji zaznaczenia „co sekundę”...

    Dodano po 1 [minutach]:

    Ponadto – czy możesz uwzględnić flagę 25 w swoich zmianach?
    Fragment listy funkcji oprogramowania z wierszem wyróżnionym na pomarańczowo.
    Mówiąc dokładniej - uruchamiaj zmiany tylko wtedy, gdy ta flaga jest ustawiona?

    Pytam, ponieważ mieliśmy raporty mówiące, że niektóre układy pomiaru mocy losowo zgłaszają wartości ujemne...
    Pomogłem? Kup mi kawę.
  • #12 21025841
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    p.kaczmarek2 napisał:
    Cała nasza matematyka jest wykonywana na 32-bitowych systemach zmiennoprzecinkowych, a 32-bitowy zmiennoprzecinkowy służy do przechowywania zużycia energii. Dlaczego nagle chcesz używać 64-bitowego typu double do wytwarzania energii? Jakiej mocy spodziewasz się wygenerować, jeśli Twoim zdaniem przekroczy ona typ 32-bitowy?


    Przyjmowałem różne założenia, ale teraz rozumiem, o co ci chodzi. 4 bajty to ok.

    Czy wystarczy zainicjować go jako
    #define MAX_RETAIN_CHANNELS 10
    a następnie dodaj naszą nową zmienną na górze
    typedef struct ENERGY_METERING_DATA {float TotalGeneration; ...}
    więc zajmuje te pierwsze 4 bajty?

    p.kaczmarek2 napisał:

    Jeśli chodzi o czas - może po prostu wykonaj:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    w kodzie sterownika? W aktualizacji zaznaczenia „co sekundę”…


    Spróbuję tego na początek.

    p.kaczmarek2 napisał:

    Ponadto – czy możesz uwzględnić flagę 25 w swoich zmianach?
    Fragment listy funkcji oprogramowania z wierszem wyróżnionym na pomarańczowo.
    Mówiąc dokładniej - uruchamiaj zmiany tylko wtedy, gdy ta flaga jest ustawiona?
    Pytam, ponieważ mieliśmy raporty mówiące, że niektóre układy pomiaru mocy losowo zgłaszają wartości ujemne...


    Tak, to nie powinno stanowić problemu.
  • REKLAMA
  • #13 21025864
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    cdtdsilva napisał:
    p.kaczmarek2 napisał:
    Cała nasza matematyka jest wykonywana na 32-bitowych systemach zmiennoprzecinkowych, a 32-bitowy zmiennoprzecinkowy służy do przechowywania zużycia energii. Dlaczego nagle chcesz używać 64-bitowego typu double do wytwarzania energii? Jakiej mocy spodziewasz się wygenerować, jeśli Twoim zdaniem przekroczy ona typ 32-bitowy?


    Przyjmowałem różne założenia, ale teraz rozumiem, o co ci chodzi. 4 bity są OK.

    OK, ok, ale to 4 bajty, a nie bit. To tylko dwie litery, ale mają znaczenie.

    cdtdsilva napisał:

    Czy wystarczy zainicjować go jako
    #define MAX_RETAIN_CHANNELS 10
    a następnie dodaj naszą nową zmienną na górze
    typedef struct ENERGY_METERING_DATA {float TotalGeneration; ...}
    więc zajmuje te pierwsze 4 bajty?

    Twoje rozwiązanie może być bardziej eleganckie, ale nadal optowałbym za nieco bardziej „hackowatym” podejściem, które utrzymuje MAX_RETAIN_CHANNELS na poziomie 12, ale nadal pozwala na zastąpienie dwóch ostatnich wartości (2 * 2 bajty = 4 bajty) twoją wartością.
    Dzieje się tak, ponieważ moim zdaniem prawie nie ma ryzyka konfliktu między tymi dwoma zastosowaniami, więc możemy zachować obie te funkcje, po prostu udokumentuję, że zajmują one tę samą przestrzeń.

    OK, więc czy mogę teraz dodać tę funkcję, aby przechowywać dla Ciebie 4-bajtową liczbę zmiennoprzecinkową? Dodam go już do głównego drzewa, ale nie będzie on nigdzie wywoływany, pozostawię to Tobie.
    Pomogłem? Kup mi kawę.
  • #14 21025906
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    p.kaczmarek2 napisał:
    cdtdsilva napisał:
    p.kaczmarek2 napisał:
    Cała nasza matematyka jest wykonywana na 32-bitowych systemach zmiennoprzecinkowych, a 32-bitowy zmiennoprzecinkowy służy do przechowywania zużycia energii. Dlaczego nagle chcesz używać 64-bitowego typu double do wytwarzania energii? Jakiej mocy spodziewasz się wygenerować, jeśli Twoim zdaniem przekroczy ona typ 32-bitowy?


    Przyjmowałem różne założenia, ale teraz rozumiem, o co ci chodzi. 4 bity są OK.

    OK, ok, ale to 4 bajty, a nie bit. To tylko dwie litery, ale mają znaczenie.

    Ups... Poprawione!

    p.kaczmarek2 napisał:
    cdtdsilva napisał:

    Czy wystarczy zainicjować go jako
    #define MAX_RETAIN_CHANNELS 10
    a następnie dodaj naszą nową zmienną na górze
    typedef struct ENERGY_METERING_DATA {float TotalGeneration; ...}
    więc zajmuje te pierwsze 4 bajty?


    Twoje rozwiązanie może być bardziej eleganckie, ale nadal optowałbym za nieco bardziej „hackowatym” podejściem, które utrzymuje MAX_RETAIN_CHANNELS na poziomie 12, ale nadal pozwala na nadpisanie dwóch ostatnich wartości (2 * 2 bajty = 4 bajty) twoją wartością.
    Dzieje się tak, ponieważ moim zdaniem prawie nie ma ryzyka konfliktu między tymi dwoma zastosowaniami, więc możemy zachować obie te funkcje, po prostu udokumentuję, że zajmują one tę samą przestrzeń.

    OK, więc czy mogę teraz dodać tę funkcję, aby przechowywać dla Ciebie 4-bajtową liczbę zmiennoprzecinkową? Dodam go już do głównego drzewa, ale nie będzie on nigdzie wywoływany, pozostawię to Tobie.


    Tak, śmiało.
    Myślałem o zapisaniu bajtów w pętli do lokalizacji pamięci, ale obawiałem się, że utrata zasilania może zwiększyć ryzyko uszkodzenia danych. Jestem pewien, że będziesz miał lepszy pomysł ;)

    Dodano po 10 [godzinach] 18 [minutach]:

    OK – zmiany zostały zakończone.

    Wprowadziłem zmiany, które zaproponowałem wcześniej, a gdy będzie już gotowa, będziemy mogli korzystać z nowej funkcji.
    src/hal/hal_flashVars.h
    #define MAX_RETAIN_CHANNELS 10
    ...
    typedef struct ENERGY_METERING_DATA {float TotalGeneration; ...}


    NTP działa dobrze bez Internetu, więc użyłem zmiennej minutowej po jej włączeniu. Nie zakłóca to zgodności z istniejącymi statystykami (przykład PowerSave 1; startDriver NTP; SetupEnergyStats 1 60 60) – działają tak, jak działały. Mierzą zużycie i pozostają na poziomie 0 przy wytwarzaniu.

    Flaga 25 wyłącza statystyki netmeteringu i licznik generacji. Energia czynna wynosi 0, a licznik zużycia nie jest zwiększany.
    Prąd, napięcie i zmienna są nadal wyświetlane, ale nie mają one nic wspólnego ze zmianami w moim kodzie - prawdopodobnie zawsze były, tak jakbyś podłączał kondensator do obciążenia (dużo prądu/war, zerowe zużycie).

    Wygląda na to, że całe pokolenie nie jest zapisywane zbyt często. Ponowne uruchomienie zapisuje go, ale wyciągnięcie wtyczki nie. Zużycie zwykle oszczędza się w odstępach co 0,01 lub 0,02 kW.

    W przypadku funkcji pomiaru netto chciałbym móc ustawić zmienną definiującą rzeczywisty czas (15 minut, 60 minut itp.) - Czy mogę to zrobić za pomocą konsoli? A może można go dodać na stronie internetowej? Zmienna nazywa się
    net_metring_interval


    Czy można na podstawie wartości danej zmiennej uruchomić polecenie, np. zamknąć przekaźnik, gdy generacja przekroczy określony próg? Jakieś przykłady, do których mogę się odwołać?
  • #15 21026479
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    cdtdsilva napisał:

    Wprowadziłem zmiany, które zaproponowałem wcześniej, a gdy będzie już gotowa, będziemy mogli korzystać z nowej funkcji.
    #define MAX_RETAIN_CHANNELS 10
    ...
    typedef struct ENERGY_METERING_DATA {float TotalGeneration; ...}


    Jak powiedziałem, wolałbym zachować MAX_RETAIN_CHANNELS na poziomie 12 i po prostu użyć dwóch ostatnich kanałów zachowania jako pływaka z obsadą, ale później dodam dla ciebie próbkę.

    cdtdsilva napisał:

    Wygląda na to, że całe pokolenie nie jest zapisywane zbyt często. Ponowne uruchomienie zapisuje go, ale wyciągnięcie wtyczki nie. Zużycie zwykle oszczędza się w odstępach co 0,01 lub 0,02 kW.

    Nie jestem obecnie pewien, muszę sprawdzić kod bl_shared.c.

    cdtdsilva napisał:

    W przypadku funkcji pomiaru netto chciałbym móc ustawić zmienną definiującą rzeczywisty czas (15 minut, 60 minut itp.) - Czy mogę to zrobić za pomocą konsoli? A może można go dodać na stronie internetowej? Zmienna nazywa się
    net_metring_interval

    Należy to zrobić za pomocą polecenia konsoli, a później możesz użyć naszej strony Vue/JS, aby utworzyć do tego przycisk.

    cdtdsilva napisał:

    Czy można na podstawie wartości danej zmiennej uruchomić polecenie, np. zamknąć przekaźnik, gdy generacja przekroczy określony próg? Jakieś przykłady, do których mogę się odwołać?

    Myślę, że możesz skorzystać dodajChangeHandler za to:
    https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/autoexecExamples.md

    Dodano po 5 [godzinach] 36 [minutach]:

    @cdtdsilva Mam małą aktualizację. Sprawdziłem kod i teraz wiem, gdzie zapisane są dane. Następująca funkcja została dodana przez naszego współpracownika, więc nie mogłem jej po prostu rozgryźć z pamięci.
    Musisz wyszukać BL09XX_SaveEmeteringStatistics
    Zobacz: https://github.com/search?q=repo%3Aopenshwpro...pp%20BL09XX_SaveEmeteringStatistics&type=code
    W pliku bl_shared.c znajduje się instrukcja warunkowa określająca częstotliwość zapisywania danych pomiarowych energii.
    Pomogłem? Kup mi kawę.
  • Pomocny post
    #16 21031005
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    Cześć p.kaczmarek2!

    Fragment kodu, którego użyłem do zapisania zmiennej generującej, służy celom programistycznym. Użyję Twojego kodu, gdy już skończysz. Na razie po prostu upewniłem się, że użyto właściwych pozycji pamięci, więc jest on wstecznie kompatybilny z ostatecznym kodem.

    Mogę potrzebować pomocy w zsynchronizowaniu Twojego repozytorium z moim - ostatnim razem po prostu nadpisało wszystkie moje zmiany (dobrze, że miałem kopię zapasową). Tym razem zmieniono zbyt wiele plików, aby zrobić to ręcznie. Nie jestem codziennym użytkownikiem Githuba, więc nie jestem pewien, jakie są tam wszystkie korzyści…

    Zauważyłem, że dane dotyczące mocy są zapisywane w odstępach co 10 Wh. Prawdopodobnie warto to udokumentować.
    Przyrost o 10 Wh jest prawdopodobnie odpowiedni dla inteligentnej wtyczki, przy zużyciu energii w całym domu prawdopodobnie zapisze pamięć flash ponad 1000 razy dziennie.
    Sugeruję użytkownikom zmianę wartości domyślnej na 100 W i dodanie małego wskaźnika pokazującego ustawioną wartość.

    Zmienna zapisująca flash to ta poniżej, wewnątrz src/driver/drv_bl_shared.c. Napisałem go ponownie, aby zapisać za każdym razem, gdy którakolwiek z wartości przekroczy próg ustawiony przez „changeSavedThresholdEnergy”.

    if (((sensors[OBK_CONSUMPTION_TOTAL].lastReading - lastSavedEnergyCounterValue) >= changeSavedThresholdEnergy) ||
            ((xTaskGetTickCount() - lastConsumptionSaveStamp) >= (6 * 3600 * 1000 / portTICK_PERIOD_MS)) 


    Zmodyfikowałem funkcję statystyk okresowych, aby dopasować ją do potrzeb Netmeteringu (równowagi pomiędzy zużyciem i wytwarzaniem), obecnie wdrażanej przez przedsiębiorstwa energetyczne.
    Ponieważ zarówno okres, jak i strefa czasowa będą się różnić na całym świecie, użytkownik będzie musiał ręcznie włączyć protokół NTP i statystyki.
    Moje polecenie start wygląda tak, dla porównania:
    backlog Powersave 1; startDriver BL0942; startDriver NTP; ntp_timeZoneOfs 1; SetupEnergyStats 1 60 15


    Statystyki energii określają okres oferowany przez przedsiębiorstwo użyteczności publicznej. 60 sekund i x minut. Reszta powinna być oczywista.
    Same statystyki pokazują wyniki spożycia, tak jak poprzednio. Saldo netmeteringu jest pokazane w osobnym wpisie. Wartość dodatnia wskazuje na nadwyżkę produkcji, a ujemna na zużycie z sieci.

    Tam, gdzie występuje nadwyżka produkcji, przewidziałem możliwość włączenia zdalnej inteligentnej wtyczki. Można go wykorzystać do włączenia grzałki zanurzeniowej lub sterowania pompą ciepła. W Polsce obecne przepisy przewidują 60-minutowy okres pomiaru sieci, co jest bardzo hojnym wynikiem. Przekaźnik wyłącza się, jeśli panel fotowoltaiczny nie produkuje powyżej wartości minimalnej lub spada poniżej pewnej kwoty nadwyżki produkcji, w przeciwnym razie pozostaje włączony. Progi włączania i wyłączania są różne, aby uwzględnić pewną histerezę, a ponadto przekaźnik zmienia stan tylko co 2 minuty.

    W tej chwili wartości domyślne to:
    > 50W (natychmiastowe) i >10Wh nadwyżki produkcji na załączenie przekaźnika,
    <50W (natychmiastowe) i <5Wh nadwyżki produkcji wyłącza przekaźnik.
    2 minuty na zmianę stanu

    Wartości te mogą wymagać dostosowania w zależności od mocy instalacji.
    Obecnie adres IP zdalnej wtyczki jest zakodowany na stałe.

    Włączono protokół NTP i użyto go do synchronizacji odczytów. Jeśli urządzenie jest podłączone do Internetu i może przeprowadzić synchronizację, protokół NTP służy również do synchronizacji czasu wewnętrznego na początku każdej godziny (GG:00min). Dzięki temu początek okresu pomiarowego odpowiada okresowi stosowanemu przez przedsiębiorstwo użyteczności publicznej. Stan tego przekaźnika jest wyświetlany na stronie internetowej.

    Wszystkie te funkcje są włączone przy użyciu flagi 25.

    Nie sprawdzałem funkcji MTTQ, ponieważ nie mam HA ręcznie. W zasadzie wszystko powinno działać, ale nie sprawdzałem, czy odczyty generacji są poprawnie raportowane.

    To, jakie funkcje chcesz zachować w wersji ostatecznej, pozostawiam Tobie. Byłoby miło, gdyby strona internetowa umożliwiała dostosowanie tych parametrów przez użytkownika końcowego. Mogę pomóc je udokumentować.

    Dla porównania, oto zrzut ekranu. Dla każdego, kto chce wypróbować pliki binarne, są one dodane jako załącznik do tego posta.
    Zrzut ekranu interfejsu do monitorowania energii przedstawiający różne parametry elektryczne.
    Załączniki:
    • OpenBK7231T_App_main_3368c80d8dbc.zip (10.21 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #17 21031759
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    Oto moja propozycja funkcji zapisu:
    https://github.com/openshwprojects/OpenBK7231...mmit/9003bc67d12c16749c7d59ae5b4709d57560f522
    Możesz zsynchronizować zmiany z sieci, aby uzyskać moje zmiany na swoim widelcu.

    Konflikty scalania mogą być rzeczywiście trudne do rozwiązania. Czy korzystałeś z gui Githuba? Może spróbuj użyć dedykowanego narzędzia do porównywania/scalania?
    Myślę, że mogą istnieć pewne samouczki online dotyczące rozwiązywania konfliktów:
    https://www.youtube.com/results?search_query=how+to+merge+git+conflikty
    Alternatywnie możesz po prostu przepisać/skopiować i wkleić zmiany do głównego drzewa....

    Byłoby mi trochę trudno to zrobić za pomocą twojego widelca, ponieważ nie rozumiem dobrze twojego kodu i nie jestem głównym twórcą funkcji pomiaru mocy, o ile wiem, zostały one wprowadzone przez @ valeklubomir, a później inny użytkownik je ulepszył.

    Jest to bardzo dobre, jeśli wszystko jest włączone przez flagę 25.

    Nie jestem pewien co do tej części „przekaźnika zmiany kierunku”. Muszę to sprawdzić, jak tylko pojawi się w PR. Moje główne pytanie brzmi: ile miejsca zajmuje pamięć flash i dlaczego nie po prostu użyć skryptu z addChangeHandler? Ale znowu, może jeśli nie zajmuje to dużo miejsca, jest to dobry pomysł... lub możemy po prostu #ifdef i pozwolić użytkownikom na włączenie tej funkcji w obk_config.h, abyśmy mogli zaoszczędzić miejsce na pamięci flash, gdy nie jest potrzebne...

    Chcę zachować wszystkie Twoje funkcje, tak jak powiedziałem, mam tylko kilka wymagań:
    - eksport energii musi być włączony przez flagę 25 lub podobną (i to jest już zaimplementowane, prawda?)
    - jeśli dodasz funkcje wymagające dużej ilości pamięci/przestrzeni flash, rozważ dodanie opcji ich wyłączenia do obk_config.h
    - nie można zepsuć zbyt dużej kompatybilności ze starszymi wersjami
    - i jak powiedziałeś, potrzebujemy kilku podstawowych dokumentów

    Gdy uda ci się rozwiązać konflikty, dokonam ostatecznego przeglądu kodu. Mogę także przeprowadzić podstawowe testy z @DeDaMrAz i może @divadiow przed połączeniem.

    Dodano po 1 [minutach]:

    EDYCJA: Stopień energii do zapisania można skonfigurować za pomocą polecenia konsoli
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #18 21032447
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    Cześć p.kaczmarek2

    Nie mam żadnych konfliktów, ostatnim razem, gdy próbowałem się połączyć, w jakiś sposób nadpisało to moje zmiany.
    Nie korzystam z tych narzędzi na co dzień, więc rozpracowanie tego wszystkiego jest dla mnie niezwykle czasochłonne. Teraz, gdy święta wielkanocne się skończyły, nie spieszy mi się z czasem, więc będę musiał przejrzeć później.

    Część kodu „przekaźnik przekierowania” to pętla if z instrukcjami warunkowymi, która wywołuje polecenie Send Get w celu wysłania żądania HTTP w celu włączenia lub wyłączenia zdalnej wtyczki. Cały kod jest zawarty w środku. Wykorzystuje to kod już zawarty w selftest_http_client.c, przykład:

    ///CMD_ExecuteCommand("SendGet http://192.168.0.103/cm?cmnd=POWER%20TOGGLE", 0);

    Być może masz dobre pojęcie o wykorzystaniu pamięci przez tę funkcję. Resztę uważam za znikomą. Jeszcze kilka zmiennych i pętli.

    90% dodatków znajduje się w src/driver/drv_bl_shared.c.
    Wprowadziłem kilka wcześniejszych zmian w sposobie uzyskiwania danych pomiarowych z BL0942 w pliku /src/driver/drv_bl0942.c

    Reszta to dodawanie zmiennych tu i tam. Jestem całkiem pewien, że nie została utracona żadna kompatybilność wsteczna, ale ze względu na strukturę pamięci dane generacji są prawdopodobnie wysyłane przez MQTT niezależnie od flagi 25 (jako wartość 0). Należy to przetestować, aby upewnić się, że nic nie pójdzie nie tak z HA itp.

    Wiem, że wszystkie zmienne można zmienić za pomocą konsoli. Czy chcesz mi powiedzieć, że nie ma miejsca na wprowadzenie zmian? Uważam, że bardziej przyjazne dla użytkownika byłoby umieszczenie ich w interfejsie internetowym, ale rozumiem, jeśli problemem jest przestrzeń. Moglibyśmy również stworzyć osobną wersję, trochę przypominającą tasmota (z #ifdef) specyficzną dla użytkowników wymagających pomiaru odwrotnego. W końcu to dość niszowa aplikacja.

    Tak czy inaczej, przygotuję kilka szczegółów obejmujących różne interesujące zmienne. Prawdopodobnie zapomnę o nich za kilka tygodni, więc lepiej je udokumentować :-)

    Tymczasem działają one dobrze poprzez MQTT w asystencie domowym.
    Panel monitorowania zużycia energii elektrycznej z wykresami i tabelami. Interfejs użytkownika Home Assistant z różnymi statystykami domowymi.
  • #19 21032496
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    @cdtdsilva, czy używasz GUI Githuba? Jeśli nie będzie konfliktów, mógłbym po prostu połączyć Twoje zmiany w mojej witrynie, ale wtedy nie będziesz obecny w historii Githuba jako współtwórca i myślę, że Twoja obecność tam jest zasłużona, ponieważ wykonałeś dobrą robotę. To zależy od Ciebie. Jeśli uważasz, że możesz rozsądnie przetestować to na swojej stronie, mogę otworzyć dla Ciebie PR, gdy wyślesz mi swój kod...

    cdtdsilva napisał:

    Część kodu „przekaźnik przekierowania” to pętla if z instrukcjami warunkowymi, która wywołuje polecenie Send Get w celu wysłania żądania HTTP w celu włączenia lub wyłączenia zdalnej wtyczki. Wykorzystuje to kod już zawarty w selftest_http_client.c, przykład:

    ///CMD_ExecuteCommand("SendGet http://192.168.0.103/cm?cmnd=POWER%20TOGGLE", 0);


    Myślę, że powinno to być napisane w skrypcie, nie możemy mieć tego w kodzie, ale możesz zostawić to w komentarzu w kodzie jako przykład.



    cdtdsilva napisał:

    Wiem, że wszystkie zmienne można zmienić za pomocą konsoli. Czy w ten sposób chcesz mi powiedzieć, że nie ma miejsca na wprowadzenie zmian? Uważam, że bardziej przyjazne dla użytkownika byłoby umieszczenie ich w interfejsie internetowym, ale rozumiem, jeśli problemem jest przestrzeń.

    Rozwiązanie jest bardzo proste:
    1. wykonaj polecenie konsoli
    2. dodaj interfejs do naszej aplikacji internetowej:
    https://github.com/OpenBekenIOT/webapp
    na przykład:
    Zrzut ekranu interfejsu aplikacji webowej z narzędziami konfiguracyjnymi.

    cdtdsilva napisał:

    ale zrozum, jeśli przestrzeń jest problemem.

    BL602 jest bardzo blisko limitu rozmiaru OTA. Co więcej, BK7231 mają problem, ponieważ plik OTA rośnie i czasami osiąga rozmiar LFS i zastępuje LFS na OTA

    cdtdsilva napisał:

    Moglibyśmy również stworzyć osobną wersję, trochę przypominającą tasmota (z #ifdef) specyficzną dla użytkowników wymagających pomiaru odwrotnego. W końcu to dość niszowa aplikacja.

    Jeśli to możliwe i łatwe, tak.



    cdtdsilva napisał:

    Tymczasem działają one dobrze poprzez MQTT w asystencie domowym.
    Panel monitorowania zużycia energii elektrycznej z wykresami i tabelami. Interfejs użytkownika Home Assistant z różnymi statystykami domowymi.

    Wygląda to bardzo dobrze i obiecująco!
    Pomogłem? Kup mi kawę.
  • #20 21034035
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    @p.kaczmarek2

    Kompiluję przy użyciu strony internetowej github.

    Nie mam absolutnie żadnego problemu, że nie ma tam mojego nazwiska jako współtwórcy. Jestem wystarczająco szczęśliwy, że inni korzystają z tego kodu. Coraz częściej wydaje się, że aby zrozumieć rachunek za energię, nie mówiąc już o wszystkich kwestiach związanych z energią słoneczną i jej zasadami, trzeba mieć stopień doktora!

    To właściwie przypomina mi, że wdrożenie „energii netto” przez asystenta domowego jest prawdopodobnie bezużyteczne dla większości ludzi, ponieważ w obecnych programach istnieje okres karencji, w którym można zużyć wytworzoną energię, po czym jest ona sprzedawana lub oddawana do sieci. Tak więc, kiedy patrzę na liczby, ostatecznie widzę, co zostało wyeksportowane, ale nie wiem, ile tego było w okresie objętym pomiarem netto lub poza nim.

    Mogę dodać kolejny licznik, aby rozróżnić energię zużytą w okresie netmeteringu od energii zewnętrznej, która została wyeksportowana lub sprzedana do sieci. Myślę, że na rynku istnieje poważna luka w oferowaniu czegoś, co pozwoli ludziom dokładnie zrozumieć, w jaki sposób są naliczani im rachunki i jak lepiej wykorzystać wygenerowaną przez siebie energię...

    Zdałem sobie również sprawę, że potrzebuję sposobu na obejście sieci dla mojego obciążenia przekierowania. Na przykład, jeśli jest to zbiornik wody lub pompa ciepła, mogę chcieć, aby działały na zegarze, jeśli na koniec dnia nie będzie produkcji. Należy zatem zastąpić zasady oparte na energii. W związku z tym próbowałem dowiedzieć się, jak odczytać naciśnięcia przycisków. Mógłbyś mi powiedzieć gdzie jest ta funkcja? A także, jak przełączyć diodę LED stanu? Bawiłem się z „setChannel x `state`”, ale nie mogę uzyskać w ten sposób spójnych wyników. Zatem wszelkie wskazówki dotyczące odpowiedniej dokumentacji byłyby świetne.

    Porzucę 2-minutową histeryzę, aby włączać i wyłączać obciążenie przekierowania, i zamiast tego polegać na zgromadzonej energii netto... Użycie obciążenia 1000 W, jako przykładu, przekłada się na około 17 W na minutę. Ustawienie „rezerwy” 40 W przed załączenie przekaźnika zapewnia zadowalające rezultaty, bez zbędnych opóźnień. Obecnie pracuję z czasami 15 minut netto, które stanowią największe wyzwanie, ale osoby w Polsce mogą wybrać wyższe wartości, ponieważ mają całą godzinę na wykorzystanie resztek!

    A teraz wracamy do kodu...
    Cytat:
    Myślę, że powinno to być napisane w skrypcie, nie możemy mieć tego w kodzie, ale możesz zostawić to w komentarzu w kodzie jako przykład.


    Czy możesz mi powiedzieć, jak działa ten skrypt? Czy to plik autoexec.bat?

    Myślę, że nawet jeśli flaga 25 zostanie pominięta, kod nadal będzie w pamięci. Jedynym prawdziwym sposobem na zaoszczędzenie miejsca jest komentowanie linii w czasie kompilacji? Ale potrzebowalibyśmy łatwego sposobu na wygenerowanie plików binarnych. Może osobna kompilacja ze zmienionymi zasadami?

    Cytat:
    Rozwiązanie jest bardzo proste:
    1. wykonaj polecenie konsoli
    2. dodaj interfejs do naszej aplikacji internetowej:
    https://github.com/OpenBekenIOT/webapp
    na przykład:


    To interesujące. Czy zatem ta aplikacja internetowa wskazuje stronę zewnętrzną, zamiast być przechowywana w pamięci flash? To wyjaśniałoby, dlaczego nie mogę uzyskać do niego dostępu po podłączeniu do hotspotu Becken ;)

    Zamierzam dokładniej dopracować kod w ciągu najbliższych kilku dni lub gdy tylko będzie trochę słońca. Byłoby wspaniale, gdybyś mógł wyjaśnić, jak czytać naciśnięcia przycisków i przełączać diodę LED stanu.
  • #21 21051414
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    @p.kaczmarek2

    Mając na celu zapewnienie jak największej kompatybilności kodu z różnymi urządzeniami, czy możesz dodać nową flagę, aby odwrócić kierunek zasilania prądem przemiennym?
    Wynika to z faktu, że niektóre urządzenia mierzą zużycie jako dodatnie lub ujemne.

    W moich testach zmieniłem flagę 40 i działa dobrze, ale potrzebuję jednej, aby dodać ją do ostatecznego kodu. Coś w stylu: "Odwróć kierunek przepływu prądu zmiennego"

    Dzięki
  • #22 21053679
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    Jasne, oto flaga, o którą prosiłeś:
    https://github.com/openshwprojects/OpenBK7231...mmit/9b85615336fa44096d3d2620137296c487faa6a1
    Proszę o scalenie zmian i jest gotowy do użycia.

    Jestem bardzo zadowolony z ostatnich postępów, kiedy spodziewasz się być gotowy do ostatecznego scalenia PR?
    Pomogłem? Kup mi kawę.
  • #23 21054935
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    Dzięki za pomoc.
    Prawdopodobnie w ten weekend. Rejestruję dane na dwóch jednostkach i muszę porównać je z danymi dostawcy, aby sprawdzić dokładność.

    Wszystko wydaje się działać OK.

    Z ciekawości - patrząc na kod flagi, z obecną alokacją lampy błyskowej - ile więcej flag możemy dodać?
  • #24 21054964
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    Flagi są obecnie przechowywane jako dwie 32-bitowe wartości, więc jest ich maksymalnie 64.
    Pomogłem? Kup mi kawę.
  • #25 21058515
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    Ok.

    Myślę o następujących funkcjach:
    Włącz wentylator chłodzący (gdy generowana moc jest większa niż wartość zadana)
    Zdalny przekaźnik (flaga włącza lub wyłącza grzałkę akumulacyjną lub pompę ciepła w oparciu o nadwyżkę generowanej mocy)
    System magazynowania: Gdy nie ma zużycia, na koniec okresu pomiaru netto, włącza magazyn baterii, aby zmniejszyć zużycie.
    Wyłącz pomiar netto: Pokazuje import i eksport dokładnie tak, jak zmierzono.

    Jeśli nie, prawdopodobnie uruchomię osobny wariant z nimi.

    W innej kwestii, mam problemy z kompilacją do BL602. komunikaty o błędach są raczej mylące, czy masz pomysł, co może być problemem? Link
  • #27 21058992
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    Zrzut ekranu z commitem na GitHubie, pokazujący zmiany w pliku new_common.h z trzema dodatkami i jedną usuniętą linią. To nie zadziałało.
  • #29 21060367
    cdtdsilva
    Poziom 11  
    Posty: 171
    Pomógł: 4
    Ocena: 15
    miegapele napisał:

    new_cfg.h musi być dołączony, tak jak jest w wielu innych sterownikach. bl602 build wydaje się być surowy jeśli chodzi o niejawne deklaracje funkcji


    Dzięki, to załatwiło sprawę!
  • #30 21060386
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14460
    Pomógł: 650
    Ocena: 12470
    cdtdsilva napisał:
    Ok. Czy mógłbym użyć kilku innych w jakiejś przyszłej wersji?
    Włącz wentylator chłodzący (gdy generowana moc jest większa niż wartość zadana)
    Zdalny przekaźnik (flaga włącza lub wyłącza grzałkę akumulacyjną lub pompę ciepła w oparciu o nadwyżkę generacji)
    System magazynowania: Gdy nie ma zużycia, na koniec okresu pomiaru netto, włącza magazyn baterii, aby zmniejszyć zużycie.
    Wyłącz pomiar netto: Pokazuje import i eksport dokładnie tak, jak zostały zmierzone.

    To dużo flag. Może powinniśmy rozważyć po prostu dodanie dodatkowego bajtu dla "flag mocy" w config struct?

    Dałoby to 8 flag.

    Ale nie jestem pewien, musiałbym to przemyśleć.

    Ponadto... czy są one ściśle związane z pomiarem mocy? Czy "enable cooling fan" nie powinno być w zewnętrznym sterowniku?
    To samo dotyczy zdalnego przekaźnika. Hmm
    Pomogłem? Kup mi kawę.

Podsumowanie tematu

✨ W dyskusji poruszono temat integracji wielu liczników energii w systemie OpenBecken, szczególnie dla urządzeń opartych na chipach BL0942 i ADE7880. Użytkownicy omawiali implementację funkcji netmeteringu, która pozwala na monitorowanie zużycia energii oraz eksportu do sieci. Wprowadzono zmiany w kodzie, aby umożliwić zdalne sterowanie przekaźnikami w oparciu o dodatnie saldo energii. Wskazano na potrzebę modyfikacji struktur danych oraz dodania nowych flag do obsługi pomiarów energii, w tym flagi do odwracania kierunku przepływu prądu zmiennego. Użytkownicy dzielili się również doświadczeniami związanymi z testowaniem i optymalizacją kodu, aby poprawić dokładność pomiarów oraz zmniejszyć zużycie pamięci flash.
Wygenerowane przez model językowy.
REKLAMA