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

Jak oskryptować automatyczne wyłączanie się przekaźnika po czasie w OBK bez Home Assistant?

p.kaczmarek2 02 Lut 2024 08:27 3072 8
REKLAMA
📢 Słuchaj (Głos AI):
  • Zrzut ekranu interfejsu skryptu OpenBeken z przyciskiem Toggle 1 i timerem.
    Zaprezentuję tu mały, przykładowy skrypt OpenBeken wyłączający urządzenie po danym czasie od włączenia. Czas oczekiwania będzie również konfigurowalny przez użytkownika, a cały mechanizm zostanie oskryptowany ręcznie, co daje użytkownikowi duże możliwości modyfikacji bez żadnych zmian w firmware.

    Wykorzystane urządzenie
    Do prezentacji użyłem gniazda LSPA9 sterowanego przez WiFi opartego na układzie BK7231:
    Białe gniazdo WiFi LSPA9 z przyciskiem zasilania.
    Temat o gnieździe:
    https://www.elektroda.com/rtvforum/topic3887748.html


    Podstawy skryptowania
    Skrypty tworzymy w systemie plików hostowanym na urządzeniu. Oto krótki tutorial:



    Plik wykonywany na starcie to autoexec.bat, można w nim umieścić nasz program.
    Dokumentacja znajduje się tutaj:
    https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/README.md
    Dokumentacja komend ma osobną podstronę:
    https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/commands.md
    W dokumentacji znajdują się też przykłady plików autoexec.bat:
    https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/autoexecExamples.md


    Tworzymy własny skrypt
    Najpierw zastanówmy się, co chcemy aby nasz skrypt oferował:
    - czas opóźnienia do wyłączenia powinien być pokazany w polu tekstowym
    - czas opóźnienia do wyłączenia powinien być pamiętamy po reboocie urządzenia
    - bieżąca wartość czasu oczekiwania (gdy trwa odliczanie) powinna być pokazana jako timer, osobno od wartości "nastawionej"
    - gdy użytkownik włącza urządzenie, to opracowany timer automatycznie się załącza i odlicza czas
    Tutaj mała uwaga - jeśli ktoś by się uparł, to w OBK można by to zrobić jedną komendą, poprzez addRepeatingEvent, ale my chcemy rozbić to najbardziej jak się da na komendy by móc potem dowolnie je edytować.

    Mając już koncept skryptu musimy postarać się bardziej rozbić go na części pierwsze, czyli:
    - określić zmienne (w OBK kanały) jakich użyjemy - tu potrzebny będzie stan przekaźnika, bieżąca wartość czasu do wyłączenia oraz stała początkowa wartość do wyłączenia
    - określić typy tych zmiennych w (w OBK typy kanałów) by móc je wyświetlać na panelu WWW, oto lista typów
    - określić sposób odliczania czasu, tutaj, jako że to jest przykład, zdecydowałem się po prostu zmniejszać wartość kanału w prostej pętli
    - określić sposób wykrycia zmiany stanu przekaźnika, tutaj użyłem zdarzenia zmiany AddChangeHandler

    W oparciu o to można opracować gotowy skrypt. Oto mój przykładowy autoexec.bat;
    
    
    // Used channels:
    // Channel 1 - relay
    // Channel 2 - current countdown value
    // Channel 3 - constant time for countdown
    
    // this will make channel 3 save in memory
    setStartValue 3 -1
    // if channel 3 is not set (default first case), set it to 15 seconds11
    if $CH3==0 then setChannel 3 15
    // display text field for channel 3 on www page
    setChannelType 3 TextField
    // set label
    setChannelLabel 3 TurnOffTime
    // display timer seconds (read only) for channel 2 on www page
    setChannelType 2 TimerSeconds
    // shorthand for setting channel 2 to value of channel 3
    alias turn_off_after_time backlog setChannel 2 $CH3
    // shorthand for clearing current timer value
    alias on_turned_off setChannel 2 0
    // shorthand to set relay off
    alias turn_off_relay setChannel 1 0
    // check used to turn off relay when countdown value reaches 0
    alias do_check if $CH2==0 then turn_off_relay 
    // an update command; it decreases current countdown by 1 and checks for 0
    alias do_tick backlog addChannel 2 -1; do_check
    // event triggers for channel 1 changing to 0 and 1
    addChangeHandler Channel1 == 1 turn_off_after_time 
    addChangeHandler Channel1 == 0 on_turned_off
    
    // main loop - infinite
    again:
    if $CH2!=0 then do_tick
    delay_s 1
    goto again
    

    Po restarcie urządzenia otrzymujemy zmodyfikowany panel:
    Interfejs sterowania gniazdem WiFi z układem BK7231, pokazujący opcje konfiguracji czasu wyłączenia.
    Widać na panelu przycisk od przełącznika przekaźnika, bieżącą wartość odliczania oraz nastawę czasu odliczania.
    W momencie załączenia przekaźnika rozpoczyna się odliczanie:
    Zrzut ekranu interfejsu panelu sterowania przekaźnikiem z odliczaniem czasu do wyłączenia.
    Wartość kanału 2 spada:
    Panel sterowania OpenBeken z odliczaniem czasu dla przekaźnika WiFi
    Po chwili dociera do 0 i przekaźnik się otwiera:
    Interfejs panelu sterowania gniazda LSPA9 z ustawieniami czasu wyłączenia.
    Skrypt jest odporny na wielokrotne włączanie i wyłączanie zasilania, nie ma możliwości popsucia tu tej logiki.

    Dla miminalistów
    Oczywiście cały przykład tutaj powstał po to, by też pokazać możliwości skryptowania. Jeśli ktoś nie chce pisać za dużo kodu, to również i taki skrypt da radę:
    
    // This aliased command will turn off relay on CH1 after 10 seconds
    // addRepeatingEvent	[IntervalSeconds][RepeatsOr-1][CommandToRun]
    alias turn_off_after_time addRepeatingEvent 10 1 setChannel 1 0
    // this will run the turn off command every time that CH1 becomes 1
    addChangeHandler Channel1 == 1 turn_off_after_time 
    

    Można go nawet skompresować:
    
    addChangeHandler Channel1 == 1 addRepeatingEvent 10 1 setChannel 1 0
    

    Tyle, że on nie oferuje możliwości podglądu i nastawiania czasów na panelu WWW i nie eksponuje ich dla MQTT.

    Podsumowanie
    Tak oskryptowane urządzenie może wykonywać różnego rodzaju automatyzacje zupełnie bez udziału chmury a nawet bez udziału Home Assistant. Co więcej, można nawet tak wykonywać automatyzacje na wielu urządzeniach, poprzez komendę SendGet, ale o tym innym razem. W razie wątpliwości polecam zajrzeć do naszej dokumentacji:
    https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/autoexecExamples.md
    Oczywiście w razie pytań postaram się pomóc.
    PS: Temat powstał w odpowiedzi na coraz częściej pojawiające się pytania o tego typu skrypty, m. in. tutaj i tutaj. Temat będzie też tłumaczony na język angielski.

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
    Inżynier programista z wieloletnim doświadczeniem embedded i full stack developer.
    Specjalizuje się w: embedded, Full-Stack Developer
    p.kaczmarek2 napisał 14749 postów o ocenie 12849, pomógł 659 razy. Jest z nami od 2014 roku.
  • REKLAMA
  • #2 20941803
    pepedombo
    Poziom 12  
    Posty: 52
    Pomógł: 3
    Ocena: 16
    Myslalem, ze openbeken to jakas normalna platforma na normalnym mcu, ale teraz to sie srogo przejechalem :) Skrypt wyglada jakby z tylu siedzial interpreter i prawdziwe mcu, czyli marnotrawstwo.
  • #3 20942174
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14749
    Pomógł: 659
    Ocena: 12849
    Chyba nie rozumiem tego komentarza, czy mógłbyś wyjaśnić co próbujesz przez to powiedzieć?

    Czy chodzi Ci o to, że Twoim zdaniem obecność interpretera prostych komend na MCU to marnotrawstwo, bo można pisać programy bezpośrednio w C?

    Oczywiście, można pisać w OpenBeken w C, ale wtedy trzeba wykonać kompilację i cały proces OTA by zaktualizować wsad, a czasem wygodniej jest mieć zmiany wprowadzone momentalnie, po 1 sekundzie od zaakceptowania, po to jest język komend.
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #4 20947093
    pepedombo
    Poziom 12  
    Posty: 52
    Pomógł: 3
    Ocena: 16
    Czyli interpreter, czyli obciazenie, czyli marnotrawstwo. W stm8 przy minimalnej ilosci pamieci nie dalo sie nawet dolaczyc floatow i zrobic prostego wyswietlacza, a tutaj prosze - 'komendy'. Po prostu myslalem, ze to inne srodowisko, a nie skrypty.
  • #5 20947107
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14749
    Pomógł: 659
    Ocena: 12849
    Mam wrażenie, że chyba się nie rozumiemy, ale ciekawi mnie Twoje zdanie więc postaram się nieco wyjaśnić sytuację.

    To jest ogólnie, tak jak napisałeś, "inne środowisko" i jest to framework napisany w języku C z prostym HAL pod różne MCU, ale na układach na których chodzi OpenBeken jest tyle miejsca w pamięci Flash i RAM, że OpenBeken może mieć swój własny mini system plików (oparty o LittleFS) i też własny system prostych skryptów i zdarzeń, zasadniczo interpreter.

    Czemu natomiast sądzisz, że interpreter to
    pepedombo napisał:
    obciazenie, czyli marnotrawstwo

    przecież całość w żaden sposób nie spowalnia docelowych urzadzeń, ani nie wymusza przykładowo powiększania ich pamięci Flash (BK7231 i tak ma ją wbudowaną, więc nie byłoby to możliwe), jak również nie wymusza dokupienia "mocniejszych MCU" (byłoby to absurdem, bo celem projektu jest to by chodził na tych modułach WiFi które są w produktach z Chin), jak również nie dyskryminuje żadnego modułu WiFi (chodzi na wszystkich które do tej pory udało się rozgryźć)?

    Podsumowując, zarówno z punktu widzenia developera OBK, jak i z punktu widzenia końcowego użytkownika, obecność takiego interpretera w żaden sposób nie szkodzi, jedynie polepsza atrakcyjność środowiska. Przykładowo już widziałem, że userzy we skrypcie OBK zrobili sami sobie sterownik rolet i to bez modyfikacji kodu w C.


    PS: A tak patrząc na to co piszesz o STM8, to wiesz, że na tych modułach WiFi które wspiera OBK, w ogóle chodzi już RTOS, jest cały stack TCP/IP, chodzi WiFi, itd? Jest też klient MQTT (korzystamy z LWIP), jest zdolność wysyłania żądań GET (np. raportowania pomiarów poprzez GET do serwera), itd. To nieco już inna sytuacja niż proste 8-bitowce, które sam programowałem przez długi czas.
    Pomogłem? Kup mi kawę.
  • #6 20947140
    pepedombo
    Poziom 12  
    Posty: 52
    Pomógł: 3
    Ocena: 16
    W stm8 poruszam sie dla zabawy i wlasciwie pierwsze co mnie odrzucilo to pierwsze discovery z oszalamiajaco ograniczona iloscia pamieci. (stm8s003f3). Gdybym na tym mial zrobic interpreter (bo takowe robilem kiedys w C) to upadlbym szybko z uwagi na dostepna pamiec. Wiem, ze po prostu zaczalem zbyt ekstremalnie, ale nie widze potrzeby dokladania kolejnego poziomu api nad aktualne. Nawet do 32 bitowych mcu nie widze potrzeby rozklepywania tego na boki - no moze delikatnie, chodzi tu glownie o tcp. Cos jak pisanie shaderow w hlsl - po co tworzyc dodatkowa warstwe do czegos co jest stosunkowo proste i ma byc szybkie przy ograniczonych zasobach ? Interpeter to zawsze pasozyt - patrz java lub lepiej zrobiony .net.
    Danych nie wysylamy do serwera przez GET. Mozna, ale od jakiegos czasu jest to mocno naciagane podejscie (CRUD).
  • REKLAMA
  • #7 21005994
    omelchuk890
    Poziom 11  
    Posty: 70
    Ocena: 10
    @p.kaczmarek2 Powiedz mi, czy to Lua?
    Czy to oznacza, że nie studiowałem go na próżno?
    Czy przy pisaniu skryptu można kierować się tą dokumentacją? https://nodemcu.readthedocs.io/en/dev/
    Chcę użyć modułu W600 do moich płyt opartych na ESP - 01 i komunikacji z pozostałymi układami scalonymi za pomocą protokołu I2C.
    Naprawdę podoba mi się twój interfejs i stabilność działania!
    Chciałbym przetestować moje skrypty w symulatorze OBK, ale nie ma mowy, żebym mógł go uruchomić... https://github.com/openshwprojects/obkSimulator
  • REKLAMA
  • #8 21007275
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14749
    Pomógł: 659
    Ocena: 12849
    Ten język to nie LUA, to język skryptowy OBK.

    Symulator mogę postarać się wkrótce opublikować.
    Pomogłem? Kup mi kawę.
  • #9 21378225
    SebiTNT
    Poziom 1  
    Posty: 1
    Bardzo dziękuję za wysiłek @p.kaczmarek2!

    Uruchamiam powyższy przykładowy skrypt na LN882H. Niestety kontroler uruchamia się ponownie z komunikatem "Reboot reason: 2 - Wdt", gdy licznik czasu osiągnie 0 sekund. Czy mogę coś z tym zrobić?

    Z góry bardzo dziękuję!
📢 Słuchaj (Głos AI):

Podsumowanie tematu

✨ W dyskusji poruszono temat skryptowania automatycznego wyłączania przekaźnika w systemie OpenBeken (OBK) bez użycia Home Assistant. Użytkownik zaprezentował przykładowy skrypt, który wyłącza urządzenie po określonym czasie, z możliwością konfiguracji przez użytkownika. Wskazano, że skrypty są tworzone w systemie plików na urządzeniu, a dokumentacja jest dostępna na GitHubie. Pojawiły się różnice zdań dotyczące użycia interpretera skryptów w porównaniu do programowania w C, z argumentami na rzecz elastyczności i prostoty wprowadzania zmian. Użytkownicy podzielili się doświadczeniami z różnymi modelami, w tym LN882H, oraz problemami z rebootem kontrolera.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA