supla-device na Linux

Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

admoskal pisze: ndz sty 08, 2023 7:56 pm Pytanie.
Nie widzę, abyś coś źle wpisał. Natomiast wydaje mi się, że masz jedną parę ( ) nadmiarowo:

Kod: Zaznacz cały

sudo i2cset -y 1 0x20 0x14 $(( $(sudo i2cget -y 1 0x20 0x14) | 0x04 ))
Do tego wydaje mi się, że wstawianie "sudo" wewnątrz skryptów to nie jest dobry pomysł. sudo odpali komendę z poziomu roota, więc tutaj pewnie ustawiłeś, aby nawet o hasło nie pytał. Lepiej ustaw sobie użytkownika, z którego uruchomisz supla-device i daj temu użytkownikowi uprawnienia potrzebne do używania tych poleceń i2cset/i2cget.

Natomiast odnośnie tego błędu, to spróbuj u siebie w konsoli odpalić shella "sh" i tam wklej te polecenia, które wstawiłeś do pliku konfiguracyjnego. Z reguły w Linuxach domyślnie jest używany bash, a tutaj uruchamia się sh - one mają trochę inne składnie i funkcje.
Widzimy się na Supla Offline Party vol. 2 :!:
admoskal
Posty: 28
Rejestracja: pn gru 25, 2017 11:32 am

Dziękuję za szybką odpowiedź. :)
Czy mógłbyś się wypowiedzieć jeszcze na temat wejść z obsługą command (trzy wątki wcześniej) :)
Dzięki.
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

admoskal pisze: ndz sty 08, 2023 7:34 pm Witajcie.

Mam pytanie - czy supla-device obsługuje wejścia sterowane z cmd?

- type: BinaryParsed
name: PB0
source:
type: Cmd
command: "if (( ($(sudo i2cget -y 1 0x20 0x13) & 0x01 ) == 0x01)); then echo 0; else echo 1; fi"
parser:
type: Simple
refresh_time_ms: 1000

lecz nie działa...
Nie widzę tutaj parametru "state".
Wstaw:

Kod: Zaznacz cały

    state: 0
Oznacza to, że stan ma być czytany z pierwszego wiersza tekstu zwaracanego przez komendę.
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

Jak ustawisz ten ekspander, to podziel się proszę jakimś krótkim opisem jak całość ustawić oraz plikiem konfiguracyjnym :)
Widzimy się na Supla Offline Party vol. 2 :!:
admoskal
Posty: 28
Rejestracja: pn gru 25, 2017 11:32 am

Witaj - mam jeszcze drobne pytanie na temat możliwości uruchamiania komend podczas zmiany stanu BinaryParsed.

Do pełni szczęścia brakuje mi możliwości wykonywania polecenia w BinaryParsed (lub nie umiem tego zrobić :) ) podczas zmiany stanu z L/H i H/L.

Teraz BinaryParsed w moim configu wyglądają jak poniżej :

- type: BinaryParsed
name: GPB7
source:
type: Cmd
command: "if [ $(($(/usr/sbin/i2cget -y 1 0x20 0x13) & 0x80 )) = 128 ]; then echo 0; else echo 1; fi"
parser:
type: Simple
refresh_time_ms: 1000
state: 0

.. a chciałbym dodać jeszcze linijki, np :
cmd_on: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) | 0x01 ))"
cmd_off: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) & 0xfe ))"
lub po prostu odpalić cokolwiek curl-em - np. linki bezpośrednie (cmd_on: "curl cokolwiek" lub cmd_on: "/adres_do_skryptu")

Dzięki za odpowiedź, pozdrawiam.
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

admoskal pisze: pn sty 09, 2023 7:23 pm Witaj - mam jeszcze drobne pytanie na temat możliwości uruchamiania komend podczas zmiany stanu BinaryParsed.

Do pełni szczęścia brakuje mi możliwości wykonywania polecenia w BinaryParsed (lub nie umiem tego zrobić :) ) podczas zmiany stanu z L/H i H/L.

Teraz BinaryParsed w moim configu wyglądają jak poniżej :

- type: BinaryParsed
name: GPB7
source:
type: Cmd
command: "if [ $(($(/usr/sbin/i2cget -y 1 0x20 0x13) & 0x80 )) = 128 ]; then echo 0; else echo 1; fi"
parser:
type: Simple
refresh_time_ms: 1000
state: 0

.. a chciałbym dodać jeszcze linijki, np :
cmd_on: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) | 0x01 ))"
cmd_off: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) & 0xfe ))"
lub po prostu odpalić cokolwiek curl-em - np. linki bezpośrednie (cmd_on: "curl cokolwiek" lub cmd_on: "/adres_do_skryptu")
Aktualnie nie ma takiej możliwości.
Natomiast pole "command" możesz rozbudować (albo dodać plik ze skryptem, aby to pole nie było za długie i nieczytelne) i ten dodatkowy warunek wstawić bezpośrednio tam.
Widzimy się na Supla Offline Party vol. 2 :!:
admoskal
Posty: 28
Rejestracja: pn gru 25, 2017 11:32 am

Masz rację - działa zacnie :)
admoskal
Posty: 28
Rejestracja: pn gru 25, 2017 11:32 am

Witajcie.

Chciałem podzielić się drobnym cookbookiem na podpięcie expandera MCP23017 do RockPi S.
Expander MCP23017 posiada 16 konfigurowalnych portów I/O z możliwością ustawienia rezystorów podciągających - z mojej praktyki stabilnie chodzą pull-up.
Dla tego przykładu ustawimy 8 portów GPA0-GPA7 jako wyjścia oraz 8 portów GPB0-GPB7 jako wejścia.
Adres na szynie i2c (zworki) mojego MCP ustawiłem na 0x20 (wejścia A0, A1, A2 do masy).
Sprawdzam, czy widać moje MCP : sudo i2cdetect -y 1
Otrzymałem tabelkę - widzę urządzenie pod adresem 0x20.

Kilka informacji na początek :
- używamy narzędzi i2c-tools - jak nie masz - instaluj.
a/ polecenie do ustawiania bitów : i2cset [-y] i2cbus chip-address data-address value
b/ polecenie do odczytu bitów : i2cget [-y] i2cbus chip-address data-address

Opis bardziej szczegółowy :
Wstaw "-y" po i2cget i i2cset, brak tego spowoduje oczekiwanie na potwierdzenie wykonania polecenia przez usera - czyli tego chcemy uniknąć :)
i2cbus odczytujemy za pomocą : sudo i2cdetect -l lub /usr/sbin/i2cdetect -l
Na ekranie będziemy widzieli i2c-0 lub i2c-1
data-adres (mapa pamięci) i value (wartości) omówimy poniżej.


Mapa pamięci
a/ rejestr IODIRA - adres hex 0x00 - kierunek portów A0-A7 : 0 - wyjście, 1 - wejście

Przykład 1 : Port A 0-7 jako wyjścia - sudo i2set -y 1 0x20 0x00 0x00
Przykład 2 : Port A 0-6 jako wyjścia, A7 jako wejście - sudo i2cset -y 1 0x20 0x00 0x80

b/ rejestr IODIRB - adres hex 0x01 - kierunek portów B0-B7 : 0 - wyjście, 1 - wejście
Ustawienia jak powyżej, w naszym przykładzie : sudo i2cset -y 1 0x20 0x01 0xFF

c/ rejestr GPPUA - adres hex 0x0C - pull-up portu A : 0 - off, 1 -on

d/ rejestr GPPUB - adres hex 0x0D - pull-up portu B : 0 - off, 1 -on
Jako, że ustawiliśmy port B jako wejścia - ustawimy też pull-up.
Przykład nr 1 : pull-up na portach 0-7 (1111 1111 = 0xFF) : sudo i2cset -y 1 0x20 0x0d 0xFF
Przykład nr 2 : pull-up na porcie 0 i 1 (0000 0011 = 0x03) : sudo i2cset -y 1 0x20 0x0d 0x03

e/ rejestr GPIOA - adres hex 0x12 - odczyt stanu portu A - jeżeli A jest wejściem

f/ rejestr GPIOB - adres hex 0x13 - odczyt stanu portu B - jeżeli B jest wejściem
Przykład : sudo i2cget -y 1 0x20 0x13
Jeżeli ustawiliśmy pull-up i nie mamy podłączonego żadnego wejścia do masy to otrzymamy 0xFF.
Jeśli podłączymy GPB0 do masy to otrzymamy 0xFE czyli 1111 1110.
Dla GPB1 do masy otrzymamy 0xFD czyli 1111 1101.

g/ rejestr OLATA - adres hex 0x14 - jeżeli A jest wyjściem to zapis do portu wyjściowego (1 włącza stan wysoki, 0 niski)
Przykład1 : włączamy stan wysoki H na GPA0 : sudo i2cset -y 1 0x20 0x14 0x01
Przykład2 : włączamy stan niski L na GPA0 : sudo i2cset -y 1 0x20 0x14 0x00
UWAGA : taki zapis wyzeruje inne porty - jak chcesz pozostawić inne porty w stanie niezmiennym to musisz :
- dla włączenia dosumować dany pin do odczytanej wartości portu OLATA (suma logiczna OR)
- dla wyłączenia wykonać iloczyn logiczny (and) - patrz niżej w config

h/ rejestr OLATB - adres hex 0x15 - jeżeli B jest wyjściem to zapis do portu wyjściowego (1 włącza stan wysoki, 0 niski)

jak potrzebujesz więcej : https://gist.github.com/ChickenProp/3183960
----------------------------------------------------------------------------------------------------------------------------------

Wstępna teoria za nami.

Teraz zajmijmy się wartościami początkowymi.
Najprościej początkową robotę załatwić w crontrab :

sudo crontab -e

Kod: Zaznacz cały

# port A jako wyjścia
@reboot /usr/sbin/i2cset -y 1 0x20 0x00 0x00

# port B jako wejścia
@reboot /usr/sbin/i2cset -y 1 0x20 0x01 0xFF

# port B pull up 0..7
@reboot /usr/sbin/i2cset -y 1 0x20 0x0d 0xFF
i w końcu plik konfiguracyjny :

Kod: Zaznacz cały

# 
Example supla-device config file for Linux device
# https://github.com/SUPLA/supla-device

name: RockPiS
log_level: debug
state_files_path: "/home/xxxx/supla-stan"
security_level: 2 # disable certyficate verification

supla:
  server: svrx.supla.org
  mail: xxxx@xxxx.xxxx.pl

channels:

# CmdRelay with state kept in memory and stored in storage
  - type: CmdRelay
    name: GPA0
    initial_state: restore
    cmd_on: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) | 0x01 ))"
    cmd_off: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) & 0xfe ))"

  - type: CmdRelay
    name: GPA1
    initial_state: restore
    cmd_on: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) | 0x02 ))"
    cmd_off: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) & 0xfd ))"

  - type: CmdRelay
    name: GPA2
    initial_state: restore
    cmd_on: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) | 0x04 ))"
    cmd_off: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) & 0xfb ))"

  - type: CmdRelay
    name: GPA3
    initial_state: restore
    cmd_on: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) | 0x08 ))"
    cmd_off: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) & 0xf7 ))"

  - type: CmdRelay
    name: GPA4
    initial_state: restore
    cmd_on: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) | 0x10 ))"
    cmd_off: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) & 0xef ))"

  - type: CmdRelay
    name: GPA5
    initial_state: restore
    cmd_on: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) | 0x20 ))"
    cmd_off: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) & 0xdf ))"

  - type: CmdRelay
    name: GPA6
    initial_state: restore
    cmd_on: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) | 0x40 ))"
    cmd_off: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) & 0xbf ))"

  - type: CmdRelay
    name: GPA7
    initial_state: restore
    cmd_on: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) | 0x80 ))"
    cmd_off: "/usr/sbin/i2cset -y 1 0x20 0x14 $(( $(/usr/sbin/i2cget -y 1 0x20 0x14) & 0x7f ))"

  - type: BinaryParsed
    name: GPB0
    source:
      type: Cmd
      command: "if [ $(($(/usr/sbin/i2cget -y 1 0x20 0x13) & 0x01 )) = 1 ]; then /home/xxxx/supla-stan/gpa0_off>/dev/null 2>&1; echo 0; else /home/xxxx/supla-stan/gpa0_on>/dev/null 2>&1; echo 1; fi"
    parser:
      type: Simple
      refresh_time_ms: 1000
    state: 0

  - type: BinaryParsed
    name: GPB1
    source:
      type: Cmd
      command: "if [ $(($(/usr/sbin/i2cget -y 1 0x20 0x13) & 0x02 )) = 2 ]; then echo 0; else echo 1; fi"
    parser:
      type: Simple
      refresh_time_ms: 1000
    state: 0

  - type: BinaryParsed
    name: GPB2
    source:
      type: Cmd
      command: "if [ $(($(/usr/sbin/i2cget -y 1 0x20 0x13) & 0x04 )) = 4 ]; then echo 0; else echo 1; fi"
    parser:
      type: Simple
      refresh_time_ms: 1000
    state: 0

  - type: BinaryParsed
    name: GPB3
    source:
      type: Cmd
      command: "if [ $(($(/usr/sbin/i2cget -y 1 0x20 0x13) & 0x08 )) = 8 ]; then echo 0; else echo 1; fi"
    parser:
      type: Simple
      refresh_time_ms: 1000
    state: 0

  - type: BinaryParsed
    name: GPB4
    source:
      type: Cmd
      command: "if [ $(($(/usr/sbin/i2cget -y 1 0x20 0x13) & 0x10 )) = 16 ]; then echo 0; else echo 1; fi"
    parser:
      type: Simple
      refresh_time_ms: 1000
    state: 0

  - type: BinaryParsed
    name: GPB5
    source:
      type: Cmd
      command: "if [ $(($(/usr/sbin/i2cget -y 1 0x20 0x13) & 0x20 )) = 32 ]; then echo 0; else echo 1; fi"
    parser:
      type: Simple
      refresh_time_ms: 1000
    state: 0

  - type: BinaryParsed
    name: GPB6
    source:
      type: Cmd
      command: "if [ $(($(/usr/sbin/i2cget -y 1 0x20 0x13) & 0x40 )) = 64 ]; then echo 0; else echo 1; fi"
    parser:
      type: Simple
      refresh_time_ms: 1000
    state: 0

  - type: BinaryParsed
    name: GPB7
    source:
      type: Cmd
      command: "if [ $(($(/usr/sbin/i2cget -y 1 0x20 0x13) & 0x80 )) = 128 ]; then echo 0; else echo 1; fi"
    parser:
      type: Simple
      refresh_time_ms: 1000
    state: 0 
    
W katalogu supla-stan mam 2 pliki : gpa0_on i gpa0_off. W nich mam linki bezpośrednie - w tym przypadku stan niski na gpa0 włącza przekaźnik - można to użyć np. w czujniku zalania, itp.

Jeszcze raz wielkie dzięki dla Klew-a za super robotę z supla-device.

Pozdrawiam.
Awatar użytkownika
shimano73
Posty: 1968
Rejestracja: ndz lut 28, 2016 12:27 pm
Lokalizacja: Orzesze
Kontakt:

Na moim terminalu mam postawiona stacje pogodowa , teraz chciałbym dodać sterowanie ogrzewaniem i inne bajery :lol: . Jako że moje prace będą związane z częstymi zmianami konfiguracji co wiązało by się z usuwaniem uradzenia z clouda i utratą historii . Chciałbym na jednym terminalu uruchomić kilka razy "supla-divice for linux" jak to zrobić ?
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

shimano73 pisze: wt sty 10, 2023 10:51 am Na moim terminalu mam postawiona stacje pogodowa , teraz chciałbym dodać sterowanie ogrzewaniem i inne bajery :lol: . Jako że moje prace będą związane z częstymi zmianami konfiguracji co wiązało by się z usuwaniem uradzenia z clouda i utratą historii . Chciałbym na jednym terminalu uruchomić kilka razy "supla-divice for linux" jak to zrobić ?
Wystarczy że utworzysz wiele plików konfiguracyjnych yaml. Podaj tam różne ścieżki do "state_files_path" (najlepiej bezwzględną, aby uniezależnić się od bieżącego katalogu - czyli zacznij ścieżkę od / ).
Następnie możesz odpalać wiele razy w linii poleceń:
./supla-device-linux -c /home/supla/cfg1.yaml
./supla-device-linux -c /home/supla/cfg2.yaml
etc.

Analogicznie jeśli chcesz tych instancji używać jako service'ów, to po prostu dodaj kilka osobnych plików z konfiguracją kilku osobnych serwisów i z każdego uruchamiaj supla device z innym plikiem yaml.
Widzimy się na Supla Offline Party vol. 2 :!:
ODPOWIEDZ

Wróć do „supla-dev”