Sterowanie głosem (Amazon Echo i Alexa)

Po co zajmować się sterowaniem głosem?  Bo się da!  Odkąd pojawiły się urządzenia pełniące funkcję asystentów głosowych radzących sobie z interpretacją języka mówionego, wykorzystanie ich w automatyce domowej było tylko kwestią czasu.

 Alexa

Do połączenia Amazon Echo z systemem automatyki opartej o PLC użyłem najnowszego modelu Echo nabytego na amazon.de (od paru dni przesyłka do PL jest możliwa!) oraz Raspberry Pi.  Na RPi zainstalowałem system pimatic (tylko dlatego, że na ten moment jako jedyny znaleziony przeze mnie oferuje wtyczkę do obsługi nowego Echo, która działa).  System pimatic jest używany do automatyki domowej opartej o RPi, ale w sumie może być wykorzystywany do sterowania PLC.  W tym celu dopisałem 2 wtyczki:

- pimatic-wago, tworzącą nowe urządzenia w systemie pimatic

- wago-common, jako uniwersalny moduł dla nodejs do komunikacji ze sterownikiem PLC.

Nie jest to na pewno jedyne i najlepsze rozwiązanie, ale na moment pisania tego artykułu wdało mi się najprostsze.

Co więc należy zrobić?

  1. Uruchamiamy RPi, najlepiej czyste i nowe, ściągamy obraz Raspbiana ze strony https://www.raspberrypi.org/downloads/ i postępujemy zgodnie z instrukcjami z https://www.raspberrypi.org/documentation/installation/installing-images/README.md
  2. Instalujemy nodejs zgodnie z instrukcjami ze strony https://nodejs.org/en/download/package-manager/
  3. Instalujemy pakiet "n", który umożliwia zmianę aktywnej wersji nodejs, jako że pimatic nie działa z najnowszym nodejs.  Opis potrzebnych kroków zaczerpnąłem z https://www.abeautifulsite.net/how-to-upgrade-or-downgrade-nodejs-using-npm.  Wykonać trzeba polecenie "sudo npm install -g n", a następnie "sudo n 4.8.3"
  4. Instalujemy system pimatic zgodnie z instrukcjami ze strony https://pimatic.teamemo.com/Guide/Getting-Started, oczywiście, z pominięciem kroków dotyczących instalacji nodejs
  5. W pliku config.json w części plugins:
    • określamy hasło użytkownika admin w części 'users'
    • w części httpServer zmieniamy port na inny niż 80, czyli np. 8011
    • dodajemy wtyczkę pimatic-echo zgodnie z instrukcjami z https://www.npmjs.com/package/pimatic-echo, co ostatecznie sprowadza się do dodania w części 'plugins' jako pierwszej:

      {
      "plugin": "echo",
      "port": 80,
      "active": true
      }

    • dodajemy moją wtyczkę pimatic-wago zgodnie z instrukcjami  z https://www.npmjs.com/package/pimatic-wago, co oznacza dodanie w części 'plugins' jako ostatniej

      {
      "plugin": "wago",
      "addressPLC": "192.XXX.XXX.XXX,
      "visuFile": "nazwa_wizualizacji",
      "active": true
      }

  6. Uruchamiamy pimatic komendą "sudo node_modules/pimatic/pimatic.js" 

Pierwsze uruchomienie zajmie dobrych kilka minut bo pimatic musi pobrać i zainstalować dodatkowe elementy, z których sqlite pochłania większość czasu.  Propouję uważnie analizować komunikaty dotyczące wersji zainstalowanych wtyczek.  Jeśli pimatic nie zainstaluje najnowszej wersji wtyczki pimatic-wago można to zrobić ręcznie z katalogu pimatic-XXX komendą 'npm install pimatic-wago'.

Gdy system wystartuje, w przeglądarce pod adresem naszego RPi (adres można sprawdzić np komendą 'ifconfig'), czyli np. 192.168.1.200:8011 zobaczymy stronę systemu pimatic.

Po zalogowaniu się przechodzimy do menu, Devices -> Add device. W polu Class wybieramy WagoSwitch i wypełniamy:

  • ID - nazwę, którą chcemy widzieć na ekranie systemu pimatic
  • tapAddr - nazwa zmiennej, która powinna zostać 'kliknięta', tzn, której przypisana zostanie wartość 1 i potem wartość 0 (np. PLC_PRG.Light1_Visu)
  • stateAddr - nazwa zmiennej, która przechowuje stan danego obwodu, np. .OUT1

 pimatic new device

 W części "Echo" wypałniamy

  • checkbox przy name i wpisujemy nazwę z przedrostkiem Echo, np. EchoDining Room.  Na dziś używam angielskich nazw, gdyż takie rozumie i rozpoznaje Alexa...
  • checkbox przy active i ręcznie przełączamy na 'Yes'

pimatic new device 2

Po kliknięciu save urządzenie zostaje zapamiętane. Wychodzimy z menu Devices przyciskiem 'Back'. Aby dodać nowe urządzenie do ekranu, należy w parwym górnym rogu wybrać ikonkę koła zębatego, wybrać 'Add new item', wskazać linię z nowym urządzeniem (pojawi się ptaszek).  Oto jak wygląda przykłądowy ekran działającego systemu pimatic:

pimatic screen

 

Kolejnym krokiem jest sprawdzenie, czy nowe urządzenie widziane jest przez Echo.  Logujemy się na stronę alexa.amazon.com, wybieramy Smart Home, klikamy Devices i nastęnie Discover. Równocześnie na stronie pimatic po wybraniu z menu Devices, w prawym górnym rogu klikamy "Discover devices". Po 20 sekundach Echo zakończy poszukiwania, a my po ponownym kliknięciu Smart Home - Devices powinniśmy zobaczyć nowo-wykryte urządzenia

pimatic alexa devices

 

Jeśli nasze nowe urządzenie znajduje się na liście, jesteśmy gotowi do testowania komend głosowych tj. "Alexa, turn on/off XXX", czyli np. "Alexa, turn on dining room".  Jeśli wszystko pójdzie dobrze, Alexa odpowie "OK" a światło się włączy.

* * *

Dla przypomnienia dodam jeszcze kilka słów o tym, jak przygotować program w CoDeSysie do komunikacji.

Pierwszym krokiem jest stworzenie nowej wizualizacji (np. "example").  W nowej wizualizacji należy umieścić wszystkie elementy, do których chcemy mieć dostęp czyli np:

  • w przypadku sterowania światłami, kwadrat, który zmienia kolor w zależności od stanu .OUT1, i który przy kliknięciu tapuje zmienną PLC_PRG.Light1_VIS.
  • pole tekstowe o treści %s, które wyświetla wartość zmiennej PLC_PRG.Sensor1
  • kwadracik sygnalizujący wzbudzenie czujki ruchu, który zmienia kolor w zależności od wartości zmiennej PLC_PRG.MoveSensor1

pimatic wago Codesys1

Wizualizacja taka powinna być dostępna przez www (prawym klawiszen na nazwę wizualizacji -> Object Properties i checkbox przy Use as... Web-Visualization)

pimatic wago Codesys2

Wizualizacje powinny też być spakowane - zakładka Resources -> Target Settings -> zakładka Visualization -> checkbox przy Compression.

pimatic wago Codesys5

Po skompilowaniu programu i przejścia w tryb on-line plik example_xml.zip umieszczany jest na sterowniku w katalogu plc.

pimatic wago Codesys4

Plik ten z pamięci sterownika pobierany jest przez wtyczkę wago-common, jest rozpakowywany i analizowany.  Każdej zmiennej (np. PLC_PRG.Light1_VIS) przypisany zostaje dokładny adres w pamięci (np. 4,101240,2,1), który jest wykorzystywany do dalszej komunikacji.