# 👷‍♂️ 0.110 Beta

**URL:** <https://ai-speaker.discourse.group/t/0-110-beta/461>\
**Category:** Ogłoszenia\
**Created:** [22 Maj 2020 13:33 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461 "2020-05-22T13:33:20Z")\
**Posts on this page:** 16\
**Page:** 2

<div class="post-metadata">

**Autor:** ![jolka](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/jolka/32/5_2.png) [@jolka](https://ai-speaker.discourse.group/u/jolka)\
**Data wpisu:** [26 Maj 2020 06:42 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/21 "2020-05-26T06:42:21Z")

</div>

> [@Iron](#):
>
> Czy HACS został usunięty z integracji w nowym HA ?

Raczej nikt go nie usuwał, tylko HA zmienia różne rzeczy z wersji na wersje i komponenty niestandardowe przestają działać. W repo HACS jest zgłoszone issue (i setki innych związanych z HACS na forum HA):

> <https://github.com/hacs/integration/issues/1250>
>
> After recent HA update to : 0.110 HACS fails to reload. 
> I get the below errors… in the log ive tried fully uninstalling HACS and reinstalling but get the same error.
> 
> 2020-05-25 06:45:10 ERROR (SyncWorker\_0) \[homeassistant.util.json\] JSON file reading failed: /config/.storage/hacs/120370503.hacs
> Traceback (most recent call last):
> File "/usr/src/homeassistant/homeassistant/util/json.py", line 31, in load\_json
> with open(filename, encoding="utf-8") as fdesc:
> NotADirectoryError: \[Errno 20\] Not a directory: '/config/.storage/hacs/120370503.hacs'
> 2020-05-25 06:45:10 CRITICAL (MainThread) \[hacs.data\] \[\[Errno 20\] Not a directory: '/config/.storage/hacs/120370503.hacs'\] Restore Failed!
> 2020-05-25 06:45:10 WARNING (MainThread) \[homeassistant.config\_entries\] Config entry for hacs not ready yet. Retrying in 5 seconds.
> 2020-05-25 06:45:16 WARNING (MainThread) \[homeassistant.setup\] Setup of updater is taking over 10 seconds.
> 2020-05-25 06:45:22 ERROR (MainThread) \[homeassistant.components.updater\] Timeout fetching Home Assistant update data
> 2020-05-25 06:45:23 ERROR (SyncWorker\_18) \[homeassistant.util.json\] JSON file reading failed: /config/.storage/hacs/120370503.hacs
> Traceback (most recent call last):
> File "/usr/src/homeassistant/homeassistant/util/json.py", line 31, in load\_json
> with open(filename, encoding="utf-8") as fdesc:
> NotADirectoryError: \[Errno 20\] Not a directory: '/config/.storage/hacs/120370503.hacs'
> 2020-05-25 06:45:23 CRITICAL (MainThread) \[hacs.data\] \[\[Errno 20\] Not a directory: '/config/.storage/hacs/120370503.hacs'\] Restore Failed!
> 2020-05-25 06:45:23 WARNING (MainThread) \[homeassistant.config\_entries\] Config entry for hacs not ready yet. Retrying in 10 seconds.
> 2020-05-25 06:45:34 ERROR (SyncWorker\_18) \[homeassistant.util.json\] JSON file reading failed: /config/.storage/hacs/120370503.hacs
> Traceback (most recent call last):
> File "/usr/src/homeassistant/homeassistant/util/json.py", line 31, in load\_json
> with open(filename, encoding="utf-8") as fdesc:
> NotADirectoryError: \[Errno 20\] Not a directory: '/config/.storage/hacs/120370503.hacs'
> 2020-05-25 06:45:34 CRITICAL (MainThread) \[hacs.data\] \[\[Errno 20\] Not a directory: '/config/.storage/hacs/120370503.hacs'\] Restore Failed!
> 2020-05-25 06:45:34 WARNING (MainThread) \[homeassistant.config\_entries\] Config entry for hacs not ready yet. Retrying in 20 seconds.
> 2020-05-25 06:45:55 ERROR (SyncWorker\_9) \[homeassistant.util.json\] JSON file reading failed: /config/.storage/hacs/120370503.hacs
> Traceback (most recent call last):
> File "/usr/src/homeassistant/homeassistant/util/json.py", line 31, in load\_json
> with open(filename, encoding="utf-8") as fdesc:
> NotADirectoryError: \[Errno 20\] Not a directory: '/config/.storage/hacs/120370503.hacs'
> 2020-05-25 06:45:55 CRITICAL (MainThread) \[hacs.data\] \[\[Errno 20\] Not a directory: '/config/.storage/hacs/120370503.hacs'\] Restore Failed!
> 2020-05-25 06:45:55 WARNING (MainThread) \[homeassistant.config\_entries\] Config entry for hacs not ready yet. Retrying in 40 seconds.
> 2020-05-25 06:46:36 ERROR (SyncWorker\_16) \[homeassistant.util.json\] JSON file reading failed: /config/.storage/hacs/120370503.hacs
> Traceback (most recent call last):
> File "/usr/src/homeassistant/homeassistant/util/json.py", line 31, in load\_json
> with open(filename, encoding="utf-8") as fdesc:
> NotADirectoryError: \[Errno 20\] Not a directory: '/config/.storage/hacs/120370503.hacs'
> 2020-05-25 06:46:36 CRITICAL (MainThread) \[hacs.data\] \[\[Errno 20\] Not a directory: '/config/.storage/hacs/120370503.hacs'\] Restore Failed!
> 2020-05-25 06:46:36 WARNING (MainThread) \[homeassistant.config\_entries\] Config entry for hacs not ready yet. Retrying in 80 seconds.

na końcu zgłoszenia jest jakieś opis obejścia - może pomoże…

Wg nas HACS będzie miał większy sens jak HA przestanie być beta, bo dodawanie niestandardowych rzeczy do czegoś co się zmienia z wersji na wersji ma właśnie taki efekt. Dlatego tego nie używamy i nie wspieramy.

> [@Iron](#):
>
> Niestety teraz żeby cokolwiek zmienić trzeba restartować HA :-(((((( wcześniej wystarczyła edycja ui-lovelace.yaml.

W HA trwa “porzucenie konfiguracji w yaml-a” i przejście na JSON-a i edycję wszystkiego w aplikacji. HA opublikował na blogu wpis na ten temat → “The future of YAML”

> **[The future of YAML](https://www.home-assistant.io/blog/2020/04/14/the-future-of-yaml/)**
>
> A blog post answering the 'Is YAML going away?' question.

Teraz każda nowa integracja lub poprawka w integracji musi mieć konfiguracje w aplikacji a YAML jest opcjonalny (dla geeków co lubią konsole). Oczywiście nie wszystkim się to podoba, my akurat uważamy, że to dobra droga (jedyna, jeśli HA ma być dla Kowalskiego).

* * *

Dobra wiadomość na koniec, chyba udało nam się poprawić blokowanie mikrofonu na pilocie, wydamy niebawem poprawkę na beta 🙂 Zobaczymy @Iron czy przejdzie test dzieci 😉

---

<div class="post-metadata">

**Autor:** ![jolka](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/jolka/32/5_2.png) [@jolka](https://ai-speaker.discourse.group/u/jolka)\
**Data wpisu:** [26 Maj 2020 09:30 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/22 "2020-05-26T09:30:45Z")

</div>

> [@Pattio](#):
>
> Wszystko zrobione jak wyżej, nadal problemy zigbee, takie coś w logach:

chyba widzimy co się dzieje… jakiś proces blokuje `/dev/ttyACM0` - port na którym działa zigbee2mqtt  
być może jest to inna instancja zigbee

sprawdz proszę w konsoli coś takiego

`pm2 status`

i wyślij nam co tam jest?

jeżeli masz 2 razy serwis zigbee - tak jak poniżej:

 ![image](https://global.discourse-cdn.com/free1/uploads/ai_speaker/original/2X/8/878fee1fbb8c0af8bbf207445739a0ed0a7d6b90.png)

to usuń ręcznie jeden serwis, tak:

`pm2 delete 7`

gdzie 7 to id serwisu, a potem zapisz ustawienia serwisów:

`pm2 save`

i zobacz czy to pomaga?

Oczywiście sprawdzamy jak to możliwe, że proces się powielił… ale udało nam się to też wywołać.

---

<div class="post-metadata">

**Autor:** ![Pattio](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/pattio/32/10849_2.png) [@Pattio](https://ai-speaker.discourse.group/u/Pattio)\
**Data wpisu:** [26 Maj 2020 10:01 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/23 "2020-05-26T10:01:37Z")

</div>

Z tego co widze to mam aż 3, już biorę się za usuwanie, rozumiem że dwa ostatnie?

 ![Bez tytułu3](https://global.discourse-cdn.com/free1/uploads/ai_speaker/original/2X/3/3999f06656f0891f6344422c29e5aadc29e0c08e.png)

---

<div class="post-metadata">

**Autor:** ![Stravi](https://avatars.discourse-cdn.com/v4/letter/s/e9c0ed/32.png) [@Stravi](https://ai-speaker.discourse.group/u/Stravi)\
**Data wpisu:** [26 Maj 2020 10:04 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/24 "2020-05-26T10:04:12Z")

</div>

Proponuje 11 i 13 czyli te które mają restarty.

---

<div class="post-metadata">

**Autor:** ![Pattio](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/pattio/32/10849_2.png) [@Pattio](https://ai-speaker.discourse.group/u/Pattio)\
**Data wpisu:** [26 Maj 2020 10:13 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/25 "2020-05-26T10:13:05Z")

</div>

Tak też zrobiłem, po usunięciu sytuacja prezentuje się następująco:

 ![Bez tytułu4](https://global.discourse-cdn.com/free1/uploads/ai_speaker/original/2X/4/44dac7d1c0db67071a477d4106e6ffd4d049d131.png)  
 ![Bez tytułu5](https://global.discourse-cdn.com/free1/uploads/ai_speaker/original/2X/9/972f5d7cafe625843192dbfd7a350a2b12a6ad33.png)

---

<div class="post-metadata">

**Autor:** ![jolka](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/jolka/32/5_2.png) [@jolka](https://ai-speaker.discourse.group/u/jolka)\
**Data wpisu:** [26 Maj 2020 11:22 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/26 "2020-05-26T11:22:21Z")

</div>

dzięki za info 🙂

Wiesz jak to odtworzyć? jak zrobić żeby pojawiło się więcej niż jeden serwis zigbee?  
W kodzie to teoretycznie nie jest to możliwe, bo przed każdym dodaniem nowego serwisu zigbee zatrzymujemy i usuwamy poprzedni.

Oczywiście próbujemy to odtworzyć i poprawić.

---

<div class="post-metadata">

**Autor:** ![jolka](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/jolka/32/5_2.png) [@jolka](https://ai-speaker.discourse.group/u/jolka)\
**Data wpisu:** [26 Maj 2020 12:27 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/27 "2020-05-26T12:27:52Z")

</div>

już chyba wiadomo jak to się stało, źródło jest w tej zmianie

> [@BETA seedling Nowa wersja 0.109 wydana na kanale BETA](https://ai-speaker.discourse.group/t/beta-nowa-wersja-0-109-wydana-na-kanale-beta/423/45):
>
> Udało nam się też poprawić blokowanie interfejsu podczas uruchamiania lub zatrzymywania serwisów (tunel czy zigbee) jest 💪

Czyli nie czekamy aż się serwis zatrzyma tylko asynchronicznie zatrzymujemy i uruchamiamy serwisy, więc jak ktoś szybko będzie wkładał i wyciągał dongla to może się tak zdarzyć, że 2 razy najpierw usuniemy a potem 2 razy dodamy… 🐛

Pracujemy nad poprawką w kolejnej wersji, a na teraz zalecamy większy zen 🙏 😉 przy wyciąganiu i wkładaniu dongla usb

---

<div class="post-metadata">

**Autor:** ![Pattio](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/pattio/32/10849_2.png) [@Pattio](https://ai-speaker.discourse.group/u/Pattio)\
**Data wpisu:** [26 Maj 2020 12:40 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/28 "2020-05-26T12:40:15Z")

</div>

Właśnie mi się udało to odtworzyć, myślałem co zrobiłem że pojawił się trzeci serwis zigbee, okazuje się że jak przełożę moduł zigbee w inne gniazo usb to się pojawia następny serwis zigbee.  
Jak na załączonym obrazku :

 ![Bez tytułu6](https://global.discourse-cdn.com/free1/uploads/ai_speaker/original/2X/7/7338723c9c11fc6243f37949763e001133a9944e.png)

---

<div class="post-metadata">

**Autor:** ![jolka](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/jolka/32/5_2.png) [@jolka](https://ai-speaker.discourse.group/u/jolka)\
**Data wpisu:** [27 Maj 2020 06:57 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/29 "2020-05-27T06:57:37Z")

</div>

dzięki za info - poszło do sprawdzenia, jeżeli zadziała OK z naszą poprawką z wczoraj to dzisiaj wydamy wersję 0.110.3b w której to będzie już poprawione

---

<div class="post-metadata">

**Autor:** ![Iron](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/iron/32/63_2.png) [@Iron](https://ai-speaker.discourse.group/u/Iron)\
**Data wpisu:** [27 Maj 2020 08:40 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/30 "2020-05-27T08:40:57Z")

</div>

> [@jolka](#):
>
> Dobra wiadomość na koniec, chyba udało nam się poprawić blokowanie mikrofonu na pilocie, wydamy niebawem poprawkę na beta 🙂 Zobaczymy @Iron czy przejdzie test dzieci 😉

Super bo miałem znowu pisać w tej sprawie 😉 Może pełen reboot bramki po aktualizacji był by też zasadny bo uzdrawiał by audio 🙂 robiłem ostatnio kilka aktualizacji, dzisiaj chciałem użyć mikrofonu w pilocie i zonk… wyjęcie i włożenie dongla rozwiązało problem ale po reboocie bramki efekt był by ten sam a użytkownik nawet by problemu nie zauważył.

---

<div class="post-metadata">

**Autor:** ![jolka](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/jolka/32/5_2.png) [@jolka](https://ai-speaker.discourse.group/u/jolka)\
**Data wpisu:** [28 Maj 2020 09:52 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/31 "2020-05-28T09:52:53Z")

</div>

# 0110.3b2 wydana

zmiany:

- HA w wersji 0.110.3
- AIS dom serwer w wersji 2.0.6 (poprawki na blokowanie mikrofonu na pilocie)  
 ![image](https://global.discourse-cdn.com/free1/uploads/ai_speaker/original/2X/2/20b30c7c94236dfb38307d22a4bdba1ec3a0e243.png)
- kilka innych drobnych poprawek (zależności pomiędzy pakietami)

* * *

⚠ : Możliwość owielania serwisów zigbee (podczas szybkiego wkładania i wyciągania dongla bez czekania na komunikat systemu), jest to dość skomplikowany problem, który nie da się łatwo rozwiązać. Testujemy nowy sposób na dynamiczne dodawanie lub restartowanie serwisów (jeżeli już istnieją), ale to trochę potrwa.

To jak to działa teraz:

- Wkładasz dongla USB Zigbee
- Mechanizm Linux [`inotify`](https://ai-speaker.com/docs/ais_app_integration_usb/#wprowadzenie) informuje nas że dodano sprzęt USB
- Jolka rozpoznaje urządzenie i informuje głosowo “Dodano urządzenie Zigbee” `*`
- Jolka usuwa wszystkie serwisy Zigbee (żeby ich nie powielać) `*`
- Jolka zleca uruchomienie nowego serwisu Zigbee `*`
- Po uruchomieniu Jolka informuje, ze uruchomiono serwis Zigbee `*`

`*` dodając zadanie do wykonania do pętli zdarzeń  
To wszystko dzieje się asynchronicznie, bez blokowania działania innych rzeczy na bramce.  
Nasz system nie działa tak jak „tradycyjna” aplikacja oparta na wątkach, ale na jednym specjalnym logicznym wątku zwanym pętlą zdarzeń: [asyncio — Asynchronous I/O — Python 3.14.0 documentation](https://docs.python.org/3/library/asyncio.html)  
Daje nam to sporo korzyści (jesteśmy pewni, że zadanie się wykona i że się wykona tylko raz, na jednym z 4 fizycznych rdzeni dostępnych na bramce). Biblioteka obsługująca pętle zdarzeń nie czeka na zakończenie wykonania zdarzenia tylko zleca wykonanie i “jedzie dalej” a potem wraca do zleconego zadania, żeby przekazać odpowiedz.

Jeżeli ktoś wkłada i wyciąga dongla USB kilka razy bez czekania na komunikat to zleca dodanie i usunięcie kilka razy sewisu Zigbee. Pętla zdarzeń wykona wszystkie te zlecenia ale usuwanie może wykonać szybciej niż dodawanie, w związku z czym serwisy się powielą…

Możemy łatwo się cofnąć do blokowania aplikacji do momentu skończenia zadania, tak jak to robiliśmy jeszcze w wersji 0.108, ale będziemy to próbować rozwiązać inaczej. Postaramy się zastąpić funkcje: start, stop, delete, save w PM2 jedną funkcją StartOrRestart.

> ℹ**Obejście problemu - nie wkładamy, nie przekładamy dongla USB Zigbee za szybko, czekamy aż Jolka poinformuje, że skończyła wykonywać zadanie po wyciągnięciu dongla zigbee (zatrzymała serwis zigbee) zanim włożymy ponownie dongla Zigbee (i zlecimy uruchomienie nowego serwisu zigbee).**

---

<div class="post-metadata">

**Autor:** ![jolka](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/jolka/32/5_2.png) [@jolka](https://ai-speaker.discourse.group/u/jolka)\
**Data wpisu:** [1 Czerwiec 2020 10:45 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/32 "2020-06-01T10:45:02Z")

</div>

# 0.110.4b2 wydana na BETA

2 zmiany:

- HA w wersji 0.110.4
- nowy I/O scheduler

* * *

Od kilku dni wykonujemy stress testy urządzenia, jak skończymy, to opublikujemy metodologię i wyniki w osobnym wpisie. Efektem tych testów jest zmiana trybu zarządznia wejściem i wyjściem na bramce (io scheduler w Linux).

Dotychczas mieliśmy I/O scheduler CFG który uchodzi za najbardziej zbalansowany I/O Scheduler (harmonogram wykonywanych zadań wejścia i wyjścia jest wyważony). Ma on jednak jedną wadę - pod stałym, dłgotrwałmy obciążeniem może wystąpić destabilizacja, ponieważ I/O próbuje jak najlepiej utworzyć harmonogram wykonywanych zadań. Stabilność jest dla nas ważniejsza niż wydajność dlatego w tej wersji (narazie testowo) zmieniamy I/O scheduler na NOOP, który jest bardzo prostym harmonogram, polegającym na wstawianiu wszystkich operazji wejścia i wyjścia do kolejki (nie stara się porządkować zapisywanych danych tak jak CFG). NOOP nie jest faworytem jeżeli chodzi o wydajność ale jest stabilny i prosty, więc go lubimy 🙂  
Dla końcowego użytkownika zmiana nie powinna być zauważalna, od kilku dni nasze bramki mają NOOP i wszystko jest OK, gdyby jednak u kogoś nastąpiła jakaś “destabilizacja” po tej aktualizacji to dajcie znać na info@sviete.pl  
Jeżeli nie będzie problemów, to harmonogram NOOP pojawi się w wersji stabilnej 0.110, którą wydamy 10 czerwca.

---

<div class="post-metadata">

**Autor:** ![Cino111](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/cino111/32/283_2.png) [@Cino111](https://ai-speaker.discourse.group/u/Cino111)\
**Data wpisu:** [1 Czerwiec 2020 12:52 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/33 "2020-06-01T12:52:44Z")

</div>

Zawieszała mi się bramka z kartą SD 64GB. Czy NOOP powinien pomóc? Zawieszanie w nocy, czyli chyba w momencie przejścia do zapisywania logów do kolejnego pliku.

---

<div class="post-metadata">

**Autor:** ![jolka](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/jolka/32/5_2.png) [@jolka](https://ai-speaker.discourse.group/u/jolka)\
**Data wpisu:** [1 Czerwiec 2020 13:14 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/34 "2020-06-01T13:14:41Z")

</div>

Pewności na 100% nie ma czy to pomoże u Ciebie, być może w Twoim przypadku winna jest po prostu karta. Nie są to proste rzeczy na które da się odpowiedzieć tak / nie, za jakiś czas będziemy mieli więcej wniosków czy to pomaga czy nie.

---

<div class="post-metadata">

**Autor:** ![jolka](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/jolka/32/5_2.png) [@jolka](https://ai-speaker.discourse.group/u/jolka)\
**Data wpisu:** [3 Czerwiec 2020 07:07 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/35 "2020-06-03T07:07:49Z")

</div>

## 0.110.4b4 wydana na beta

### Zmiany:

- zigbee2mqtt 1.13.1  
 ![image](https://global.discourse-cdn.com/free1/uploads/ai_speaker/original/2X/7/788ba01588988d862bb836f2021ba204132b39f7.png)
- nowy sposób uruchamiania serwisów zigbee i tunel
- poprawione odświeżanie mapy urządzeń zigbee oraz odtwarzacza
- ustawiamy tryb zarządzania częstotliwością procesora `interactive` (to jest kolejna poprawka mająca za zadanie ustabilizować działanie systemu)

---

<div class="post-metadata">

**Autor:** ![jolka](https://yyz2.discourse-cdn.com/free1/user_avatar/ai-speaker.discourse.group/jolka/32/5_2.png) [@jolka](https://ai-speaker.discourse.group/u/jolka)\
**Data wpisu:** [9 Czerwiec 2020 11:05 UTC](https://ai-speaker.discourse.group/t/0-110-beta/461/36 "2020-06-09T11:05:51Z")

</div>

## 0.110.5 wydana na beta

 ![image](https://global.discourse-cdn.com/free1/uploads/ai_speaker/original/2X/4/4944d546d36f7ba19134552bd09925d58b0185c3.png)

Ostrzegamy, że pierwsze uruchomienie po aktualizacji może trwać nawet 20 minut (w zależności od tego jakie ktoś są dodane integracje i ile będzie trwało pobieranie i kompilowanie zależności).

Dodaliśmy też “przywracanie systemu” gdyby aktualizacja się nie powiodła.  
Podczas uruchomienia bramki robimy sprawdzenie czy system jest poprawnie zainstalowany i jeżeli nie to informuje głosowo, że trwa przywracanie systemu i instalujemy najnowszą stabilną wersję.

Jutro wydamy 0.110.5 na kanale stabilnym 👋

[Poprzednia strona](https://ai-speaker.discourse.group/t/0-110-beta/461.md?page=1)
