Re: ESP32 domácí automatizace
Pavel Brychta
pavel.brychta na duhasys.eu
Středa Červen 2 10:56:24 CEST 2021
Nemáte zač - co se týče WiFi, tak hledejte nastavení autoReconnect a
autoConnect parametrů (až použijete ten wifimanager/wificonfig, tak
tohle řešit nemusíte). Je možné, že je máte nastavené na false a pak se
to znovu nepřipojí. Pokud budete mít další dotazy, tak možná raději
pište přímo - nejsem si jistý, kolik lidí by tohle zajímalo.
P.B.
Dne 02. 06. 21 v 10:51 Jan Půhoný napsal(a):
> Ok, díky moc za tipy. Už jsem to snad pochopil. Ještě mě zarazila
> jedna věc, předpokládal bych, že to už je na takovém modulu ošetřené v
> základu nebo přímo ve wifi řadiči nebo jak to napsat, ale evidentně
> ne. Pokud odpojím wifi, třeba tak, že restartuji wifi router, tak se
> sama znovu nepřipojí.
>
> Dá se to nějak nastavit? Nebo musím jednou za čas volat něco jako
> tento kód? Je nějaké doporučení jak to často testovat? Ale čekal bych,
> že když se to jednou nastaví, že to bude vyřešeno na úrovni toho wifi
> řadiče. Nebo mám něco blbě?
>
> if (WiFi.waitForConnectResult() != WL_CONNECTED) {
> WiFi.mode(WIFI_STA);
> WiFi.begin(ssid, password);
> }
>
> Díky,
>
> HP
>
> po 31. 5. 2021 v 12:06 odesílatel Pavel Brychta
> <pavel.brychta na duhasys.eu <mailto:pavel.brychta na duhasys.eu>> napsal:
>
> DD,
>
> přesně tak. Když se podíváte do includnuté Arduino.h, tak uvidíte,
> že freertos/FreeRTOS.h, freertos/task.h a freertos/semphr.h jsou
> součástí, takže můžete volat přímo RTOS funkce. Pro začátek
> doporučuju si načíst třeba
> https://savjee.be/2020/01/multitasking-esp32-arduino-freertos/
> <https://savjee.be/2020/01/multitasking-esp32-arduino-freertos/> a
> pak si k tomu najděte nějaký příklad na semafory a mutexy. Přes
> millis() to bude fungovat také, ale kooperativně. Další možností
> pak je použít knihovnu Ticker, která umožňuje vyytvořit hybrid
> mezi kooperativním použitím millis() a vláknovým RTOS (ušetříte
> třeba RAM na stack oblasti). Trošku potíž může být při přístupu do
> proměnných dash knihovny z jiného vlákna (proto to doporučení
> studia semaforů), ale to dokážou ošetřit semafory, nebo fronty.
> Pokud ale program bude té složitosti, co jste poslal, tak není
> důvod používat ani RTOS, ani Ticker, ale použijte třeba moji
> historickou https://github.com/Pablo2048/Interval
> <https://github.com/Pablo2048/Interval> (teď koukám, že by
> zasloužila aktualizovat - tak zkuste třeba aktuálnější verzi z
> https://git.xpablo.cz/pablo2048/Interval
> <https://git.xpablo.cz/pablo2048/Interval> ). Ta parametrizace
> WiFi by si taky zasloužila něco lepšího než hardcoded credentials
> - zkuste se podívat na knihovnu Wifimanager, nebo můj wificonfig
> (pokud jste dostatečně odvážný...)
>
> P.B.
>
> Dne 31. 05. 21 v 11:17 Jan Půhoný napsal(a):
>> Díky,
>>
>> delay jsem dal pryč. Už to funguje. "Multitasking" na arduinu
>> jsem dělal pomocí millis, tady to funguje taky, viz kód níže, ale
>> jak se to dělá elegantněji na ESP32? Pochopil jsem, že když
>> použiji Arduino framework, tak by mělo jít psát přímo s využitím
>> freertos? Omlouvám se za lama dotazy, ale to tam nemusím už nic
>> includovat a rovnou můžu používat něco jako?
>>
>> void vATaskFunction( void *pvParameters )
>> {
>> for( ;; )
>> {
>> -- Task application code here. --
>> }
>>
>> /* Tasks must not attempt to return from their implementing
>> function or otherwise exit. In newer FreeRTOS port
>> attempting to do so will result in an configASSERT() being
>> called if it is defined. If it is necessary for a task to
>> exit then have the task call vTaskDelete( NULL ) to ensure
>> its exit is clean. */
>> vTaskDelete( NULL );
>> }
>>
>> Potřebuji něco kolem 10 ti tasku, nic náročného, každý se provede
>> do max 1s. Nebo to mám udělat jen pomocí millis? Je potřeba, aby
>> tam na pozadí běžel dash a OTA, takto mi to funguje:
>>
>> #include<Arduino.h>
>> /* ESP32 Dependencies */
>> #include<WiFi.h>
>> #include<AsyncTCP.h>
>> #include<ESPAsyncWebServer.h>
>> #include<ESPDash.h>
>> #include<WiFiUdp.h>
>> #include<ArduinoOTA.h>
>> #include"uptime.h"
>> #include"uptime_formatter.h"
>> /* Your WiFi Credentials */
>> const char* ssid = "puhy_iot"; // SSID
>> const char* password = "iot44puhy"; // Password
>> const char* OTAhostname = "ESP-puhy";
>> /* Start Webserver */
>> AsyncWebServer server(80);
>> /* Attach ESP-DASH to AsyncWebServer */
>> ESPDash dashboard(&server);
>> /*
>> Button Card
>> Format - (Dashboard Instance, Card Type, Card Name)
>> */
>> Card button(&dashboard, BUTTON_CARD, "Zalévej");
>> Card button1(&dashboard, BUTTON_CARD, "Čisti");
>> Card button2(&dashboard, BUTTON_CARD, "Zatop");
>> Card uptimeCard(&dashboard, STATUS_CARD, "Uptime", "success");
>> /*
>> Slider Card
>> Format - (Dashboard Instance, Card Type, Card Name, Card Symbol(optional), int min, int max)
>> */
>> Card slider(&dashboard, SLIDER_CARD, "Test Slider", "", 0, 255);
>> const int ledHeartBeatPin = 2;
>> const int ledPin = 5;
>> // setting PWM properties
>> const int ledPinPWM = 13; /* GPIO13 */
>> //int dutyCycle;
>> /* Setting PWM Properties */
>> const int PWMFreq = 5000; /* 5 KHz */
>> const int PWMChannel = 0;
>> const int PWMResolution = 8;
>> const int MAX_DUTY_CYCLE = (int)(pow(2, PWMResolution) - 1);
>> // Variables will change:
>> int ledState = LOW; // ledState used to set the LED
>> // Generally, you should use "unsigned long" for variables that hold time
>> // The value will quickly become too large for an int to store
>> unsigned long previousMillis =
>> 0; // will store last time LED was updated
>> // constants won't change:
>> long heartBeatInterval =
>> 1000; // interval at which to blink (milliseconds)
>> void setup() {
>> pinMode (ledPin, OUTPUT);
>> pinMode (ledHeartBeatPin, OUTPUT);
>> pinMode (ledPinPWM, OUTPUT);
>> ledcSetup(PWMChannel, PWMFreq, PWMResolution);
>> /* Attach the LED PWM Channel to the GPIO Pin */
>> ledcAttachPin(ledPinPWM, PWMChannel);
>> Serial.begin(115200);
>> /* Connect WiFi */
>> WiFi.mode(WIFI_STA);
>> WiFi.begin(ssid, password);
>> if (WiFi.waitForConnectResult() != WL_CONNECTED) {
>> Serial.printf("WiFi Failed!\n");
>> return;
>> }
>> Serial.print("IP Address: ");
>> Serial.println(WiFi.localIP());
>> /* Attach Button Callback */
>> button.attachCallback([&](bool value){
>> /* Print our new button value received from dashboard */
>> Serial.println("Button Triggered: "+String((value)?"true":"false"));
>> /* Make sure we update our button's value and send update to dashboard */
>> button.update(value);
>> digitalWrite (ledPin, value);
>> dashboard.sendUpdates();
>> });
>> /* Attach Slider Callback */
>> slider.attachCallback([&](int value){
>> /* Print our new slider value received from dashboard */
>> Serial.println("Slider Triggered: "+String(value));
>> /* Make sure we update our slider's value and send update to dashboard */
>> slider.update(value);
>> ledcWrite(PWMChannel, value);
>> dashboard.sendUpdates();
>> });
>> /* Start AsyncWebServer */
>> server.begin();
>> ArduinoOTA.setHostname(OTAhostname);
>> ArduinoOTA.onStart([]()
>> {
>> Serial.println("Start");
>> });
>> ArduinoOTA.onEnd([]()
>> {
>> Serial.println("\nEnd");
>> });
>> ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
>> {
>> Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
>> });
>> ArduinoOTA.onError([](ota_error_t error)
>> {
>> Serial.printf("Error[%u]: ", error);
>> if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
>> else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
>> else if (error == OTA_CONNECT_ERROR)
>> Serial.println("Connect Failed");
>> else if (error == OTA_RECEIVE_ERROR)
>> Serial.println("Receive Failed");
>> else if (error == OTA_END_ERROR) Serial.println("End Failed");
>> });
>> ArduinoOTA.begin();
>> }
>> void loop() {
>> /* Nothing so far */
>> ArduinoOTA.handle();
>> // here is where you'd put code that needs to be running all the time.
>> // check to see if it's time to blink the LED; that is, if the difference
>> // between the current time and last time you blinked the LED is bigger than
>> // the interval at which you want to blink the LED.
>> unsigned long currentMillis = millis();
>> if (currentMillis - previousMillis >= heartBeatInterval) {
>> // save the last time you blinked the LED
>> previousMillis = currentMillis;
>> // if the LED is off turn it on and vice-versa:
>> if (ledState == LOW) {
>> ledState = HIGH;
>> heartBeatInterval = 2500;
>> } else {
>> heartBeatInterval = 20;
>> ledState = LOW;
>> }
>> // set the LED with the ledState of the variable:
>> digitalWrite(ledHeartBeatPin, ledState);
>> Serial.println(uptime_formatter::getUptime());
>> uptimeCard.update(uptime_formatter::getUptime());
>> }
>>
>>
>> Díky za podporu.
>>
>> HP
>>
>>
>>
>> pá 28. 5. 2021 v 6:10 odesílatel Pavel Brychta
>> <pavel.brychta na duhasys.eu <mailto:pavel.brychta na duhasys.eu>> napsal:
>>
>> DD,
>>
>> ano, handler se dává do loop(), ale doporučuju odstranit ten
>> nešťastný delay() i když to zrovna nemusí být zdroj problému.
>> Potíž je v tom, že nepíšete jak se projevuje to, že to
>> nefunguje - pokud upoad proběhne, ale podezřele rychle a
>> firmware se ve skutečnosti nenahraje, tak je to tím, že jste
>> nevymazal paměť flash (pio run -t erase) a to ESP má uloženou
>> jinou partition tabulku. Vždycky, když nahrávám do nového
>> modulu, tak udělám výmaz flash a teprve pak nahraju první
>> firmware. Já prakticky výhradně používám Wrover 16MB moduly s
>> trošku upravenou vnitřní konfigurací a všechny tyto úpravy
>> dělám v přípravku mimo zařízení před osazením (reklamní linka
>> https://s.click.aliexpress.com/e/_9j8PIP
>> <https://s.click.aliexpress.com/e/_9j8PIP> ).
>>
>> P.B.
>>
>> Dne 27. 05. 21 v 23:22 Jan Půhoný napsal(a):
>>> Dobrý večer,
>>>
>>> ten ESPDash je super. Ještě jednou díky za tip. Ohledně těch
>>> WDT asi tam dám i ten externí, bude potřeba ale časovat
>>> někde kolem 1minuty, aby to nezabíralo v případě update
>>> firmware.
>>>
>>> Trochu se s trápím s tím, jak zkombinovat svůj kód s OTA
>>> update. Funguje mi jen jedno nebo druhé, ale dohromady ne.
>>>
>>> Když to napíšu takto z(viz níže), tak OTA je vidět (např. v
>>> Arduino IDE) ale nejde nic nahrát. Testoval jsem jak Arduino
>>> IDE, tak platformio.
>>>
>>> image.png
>>>
>>> Když tam dám jen příklad OTA tak upload normálně funguje,
>>> když tam dám jen ESPDash, normálně to funguje. Ale dohromady
>>> ne.
>>>
>>> Píše se ten OTA handler opravdu do loop?
>>>
>>> #include <Arduino.h>
>>> #if defined(ESP8266)
>>> /* ESP8266 Dependencies */
>>> #include <ESP8266WiFi.h>
>>> #include <ESPAsyncTCP.h>
>>> #include <ESPAsyncWebServer.h>
>>> #elif defined(ESP32)
>>> /* ESP32 Dependencies */
>>> #include <WiFi.h>
>>> #include <AsyncTCP.h>
>>> #include <ESPAsyncWebServer.h>
>>> #endif
>>> #include <ESPDash.h>
>>>
>>>
>>> #include <WiFiUdp.h>
>>> *#include <ArduinoOTA.h>*
>>>
>>> /* Your WiFi Credentials */
>>> const char* ssid = "******"; // SSID
>>> const char* password = "******"; // Password
>>>
>>> const char* OTAhostname = "ESP-puhy";
>>>
>>> /* Start Webserver */
>>> AsyncWebServer server(80);
>>>
>>> /* Attach ESP-DASH to AsyncWebServer */
>>> ESPDash dashboard(&server);
>>>
>>> /*
>>> Button Card
>>> Format - (Dashboard Instance, Card Type, Card Name)
>>> */
>>> Card button(&dashboard, BUTTON_CARD, "Test Button");
>>>
>>> /*
>>> Slider Card
>>> Format - (Dashboard Instance, Card Type, Card Name, Card
>>> Symbol(optional), int min, int max)
>>> */
>>> Card slider(&dashboard, SLIDER_CARD, "Test Slider", "", 0, 255);
>>>
>>>
>>> void setup() {
>>> Serial.begin(115200);
>>>
>>> /* Connect WiFi */
>>> WiFi.mode(WIFI_STA);
>>> WiFi.begin(ssid, password);
>>> if (WiFi.waitForConnectResult() != WL_CONNECTED) {
>>> Serial.printf("WiFi Failed!\n");
>>> return;
>>> }
>>> Serial.print("IP Address: ");
>>> Serial.println(WiFi.localIP());
>>>
>>> /* Attach Button Callback */
>>> button.attachCallback([&](bool value){
>>> /* Print our new button value received from dashboard */
>>> Serial.println("Button Triggered:
>>> "+String((value)?"true":"false"));
>>> /* Make sure we update our button's value and send
>>> update to dashboard */
>>> button.update(value);
>>> dashboard.sendUpdates();
>>> });
>>>
>>> /* Attach Slider Callback */
>>> slider.attachCallback([&](int value){
>>> /* Print our new slider value received from dashboard */
>>> Serial.println("Slider Triggered: "+String(value));
>>> /* Make sure we update our slider's value and send
>>> update to dashboard */
>>> slider.update(value);
>>> dashboard.sendUpdates();
>>> });
>>>
>>> /* Start AsyncWebServer */
>>> server.begin();
>>>
>>> ArduinoOTA.setHostname(OTAhostname);
>>> ArduinoOTA.onStart([]()
>>> {
>>> Serial.println("Start");
>>> });
>>> ArduinoOTA.onEnd([]()
>>> {
>>> Serial.println("\nEnd");
>>> });
>>> ArduinoOTA.onProgress([](unsigned int progress, unsigned
>>> int total)
>>> {
>>> Serial.printf("Progress: %u%%\r", (progress / (total /
>>> 100)));
>>> });
>>> ArduinoOTA.onError([](ota_error_t error)
>>> {
>>> Serial.printf("Error[%u]: ", error);
>>> if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
>>> else if (error == OTA_BEGIN_ERROR) Serial.println("Begin
>>> Failed");
>>> else if (error == OTA_CONNECT_ERROR)
>>> Serial.println("Connect Failed");
>>> else if (error == OTA_RECEIVE_ERROR)
>>> Serial.println("Receive Failed");
>>> else if (error == OTA_END_ERROR) Serial.println("End
>>> Failed");
>>> });
>>> ArduinoOTA.begin();
>>> }
>>>
>>> void loop() {
>>> /* Nothing so far */
>>> * ArduinoOTA.handle();*
>>>
>>> delay(5000);
>>>
>>> }
>>>
>>> Díky,
>>>
>>> HP
>>>
>>>
>>>
>>> st 26. 5. 2021 v 13:45 odesílatel Pavel Brychta
>>> <pavel.brychta na duhasys.eu <mailto:pavel.brychta na duhasys.eu>>
>>> napsal:
>>>
>>> Co se týče WDT, tak fakt nevím - mě zatím vždycky stačil
>>> vnitřní v ESP32 (má i brownout detector, který už jsem
>>> také viděl zabrat). Zařízení mi běží 24/7. Expandér můžu
>>> doporučit místo toho PCF raději MCP23008 (nebo 16, pokud
>>> je 8 GPIO málo) - minimálně z toho důvodu, že má
>>> asynchronní reset, takže po resetu jsou GPIO v
>>> definovaných stavech.
>>>
>>> P.B.
>>>
>>> Dne 26. 05. 21 v 13:30 Jan Půhoný napsal(a):
>>>> Díky za reakce. Jde mi o to mít to co nejvíce low
>>>> level. Opravdu do toho nechci tahat RasPi. Musí to jet
>>>> i když nepůjde wifi a s tou Atmegou to drží roky až se
>>>> divím.
>>>>
>>>> Maximálně do budoucna můžu přidat nějakou vizualizaci
>>>> na něčem jako RasPi, ale to spíš už přímo posílat
>>>> requesty na www a ukládat do MySQL. Potřebuji aby ta
>>>> logika byla spolehlivá. Ano, mám na tom rybičky a
>>>> čerpadlo topení ( a taky zalévání na zahradě a vodoměr
>>>> a zvonky a fakt hodně blbostí :-)
>>>>
>>>> Atmega s watchdogem to zatím pár let dala bez ztráty
>>>> kytičky, uptime tam přetékal bez toho aby se to nějak
>>>> resetovalo nebo tak něco.
>>>>
>>>> Mám to vše jakoby centralizované u hlavního rozvaděče,
>>>> takže nepotřebuji bezdrátové nody po domě, jde mi o to
>>>> nahradit tu AtMegu něčím výkonnějším.
>>>>
>>>> Budu tam potřebovat hodně I/O, je dobrý nápad k tomu
>>>> ESP32 dávat pár PCF8574 jako I/O expander nebo je něco
>>>> robusnějšího?
>>>>
>>>> A další věc, je potřeba k ESP32 dávat externí WDT?
>>>>
>>>> HP
>>>>
>>>>
>>>> st 26. 5. 2021 v 11:47 odesílatel Pavel Brychta
>>>> <pavel.brychta na duhasys.eu
>>>> <mailto:pavel.brychta na duhasys.eu>> napsal:
>>>>
>>>> Tak zrovna to je exemplární případ, jak to určitě
>>>> nedělat. Zde
>>>> https://github.com/Alextros00/ESP32-MQTT-Relay-Control/blob/main/main/app_main.c
>>>> <https://github.com/Alextros00/ESP32-MQTT-Relay-Control/blob/main/main/app_main.c>
>>>>
>>>> není jediná zmínka, nebo náznak řešení nějakého
>>>> failsafe mechanizmu.
>>>> Celé to je na úrovni primitivního Arduino example,
>>>> který se s detaily
>>>> jako je třeba jméno topcu vůbec nezalamuje. MQTT
>>>> failsafe samo o sobě
>>>> nevyřeší ani omylem.
>>>>
>>>> P.B.
>>>>
>>>> Dne 26. 05. 21 v 11:28 T. Meinlschmidt napsal(a):
>>>> > proto pisu mqtt. esp32 tu podporu mqtt ma pomerne
>>>> slusnou. viz treba
>>>> > takovy easy priklad
>>>> >
>>>> >
>>>> https://github.com/Alextros00/Home-Automation-NodeRED-ESP-Telegram
>>>> <https://github.com/Alextros00/Home-Automation-NodeRED-ESP-Telegram>
>>>> >
>>>> > tm
>>>> >
>>>> > Dne 2021-05-26 10:54, Pavel Brychta napsal:
>>>> >> ... až na to, že když pak lehne to Pi, nebo
>>>> WiFi, tak zůstane třeba
>>>> >> čerpadlo běžet stále, nebo uvaříte rybičky.
>>>> Přiznám se, že takovouto
>>>> >> cestou bych nikdy nešel, protože to znamená mít
>>>> failsafe procesy v ESP
>>>> >> a řídící logiku jinde, což pro účely
>>>> automatizace považuji za hodně
>>>> >> nešťastné řešení. Když už, tak autonomní pocesy
>>>> na zařízení a API pro
>>>> >> parametrizaci do toho rPi...
>>>> >>
>>>> >> P.B.
>>>> >>
>>>> >> Dne 26. 05. 21 v 10:49 T. Meinlschmidt napsal(a):
>>>> >>> dobre dopoledne.
>>>> >>>
>>>> >>> ja se priznam, ze bych vubec nesel touhle
>>>> cestou, ale mel ESP ciste
>>>> >>> na hw veci a sber nejakych dat,
>>>> >>> a celou tu logiku nechal v node-red + mqtt
>>>> (treba na rpi). Casem na
>>>> >>> to muzete navazat mobil, UI si udelate podle
>>>> sebe pomerne jednoduse,
>>>> >>> navic to umi spoustu veci z jinych zdroju.
>>>> >>>
>>>> >>> tm
>>>> >>>
>>>> >>> Dne 2021-05-26 10:32, Jan Půhoný napsal:
>>>> >>>> Dobré dopoledne,
>>>> >>>>
>>>> >>>> Ještě bych potřeboval poradit co použít za
>>>> systém na ESP32.
>>>> >>>> Jedná se mi o to, že do ESP32 přepisuji z
>>>> Atmegy 2560 něco jako
>>>> >>>> řízení topení a různých zdrojů tepla a různých
>>>> hejblátek
>>>> >>>> doma. Do teď to běží na ATMEGA 2560 a mám tam
>>>> jednoduchý
>>>> >>>> "multitasking" pomocí millis. Jedná se v
>>>> podstatě jen o čtení
>>>> >>>> teplotních čidel, webserver a pak různé
>>>> výstupy v podobě SSR
>>>> >>>> relé + vstupy a logika mezi tím. Nic
>>>> složitého. Na druhou stranu
>>>> >>>> za ty roky to celkem naboptnalo co se kódu
>>>> týče a ten webserver na
>>>> >>>> té AT2560 je takový dost líný. Navíc tam
>>>> potřebuji číst http
>>>> >>>> requesty data z komerční meteostanice a na to
>>>> už to moc není.
>>>> >>>>
>>>> >>>> Neexistuje nějaký opensource projekt na ESP32,
>>>> kde by byly
>>>> >>>> vyřešeny základní věci jako webserver + nějaká
>>>> grafika a
>>>> >>>> hejblátka abych to nemusel psát úplně od
>>>> začátku. Líbilo by se
>>>> >>>> mi už https a základní struktura a dopsal bych
>>>> si do toho jen tu
>>>> >>>> vlastní logiku a ovládání vstupů a výstupů.
>>>> >>>>
>>>> >>>> Je dobrý nápad na to ESP dávat FreeRTOS, nebo
>>>> to už je překonané
>>>> >>>> a používáte něco lepšího? Případně víte o
>>>> nějakém open
>>>> >>>> source projektu pro domácí automatizaci pro ESP32?
>>>> >>>>
>>>> >>>> Ano, googlil jsem, ale serp je zaplaven videi
>>>> geeků kteří připojí
>>>> >>>> k pár relátkům esp a myslí si co nevymysleli a
>>>> trochu se v tom
>>>> >>>> ztrácím. Já bych potřeboval něco trochu
>>>> robusnějšího.
>>>> >>>>
>>>> >>>> Díky za nápady.
>>>> >>>>
>>>> >>>> HP
>>>> >>>> _______________________________________________
>>>> >>>> HW-list mailing list - sponsored by
>>>> www.HW.cz <http://www.HW.cz>
>>>> >>>> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>>> >>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>> <http://list.hw.cz/mailman/listinfo/hw-list>
>>>> >>> _______________________________________________
>>>> >>> HW-list mailing list - sponsored by www.HW.cz
>>>> <http://www.HW.cz>
>>>> >>> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>>> >>> http://list.hw.cz/mailman/listinfo/hw-list
>>>> <http://list.hw.cz/mailman/listinfo/hw-list>
>>>> >> _______________________________________________
>>>> >> HW-list mailing list - sponsored by www.HW.cz
>>>> <http://www.HW.cz>
>>>> >> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>>> >> http://list.hw.cz/mailman/listinfo/hw-list
>>>> <http://list.hw.cz/mailman/listinfo/hw-list>
>>>> > _______________________________________________
>>>> > HW-list mailing list - sponsored by www.HW.cz
>>>> <http://www.HW.cz>
>>>> > Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>>> > http://list.hw.cz/mailman/listinfo/hw-list
>>>> <http://list.hw.cz/mailman/listinfo/hw-list>
>>>> _______________________________________________
>>>> HW-list mailing list - sponsored by www.HW.cz
>>>> <http://www.HW.cz>
>>>> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>> <http://list.hw.cz/mailman/listinfo/hw-list>
>>>>
>>>>
>>>> _______________________________________________
>>>> HW-list mailing list - sponsored bywww.HW.cz <http://www.HW.cz>
>>>> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>>> http://list.hw.cz/mailman/listinfo/hw-list <http://list.hw.cz/mailman/listinfo/hw-list>
>>> _______________________________________________
>>> HW-list mailing list - sponsored by www.HW.cz
>>> <http://www.HW.cz>
>>> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>> <http://list.hw.cz/mailman/listinfo/hw-list>
>>>
>>>
>>> _______________________________________________
>>> HW-list mailing list - sponsored bywww.HW.cz <http://www.HW.cz>
>>> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>> http://list.hw.cz/mailman/listinfo/hw-list <http://list.hw.cz/mailman/listinfo/hw-list>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> <http://www.HW.cz>
>> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>> http://list.hw.cz/mailman/listinfo/hw-list
>> <http://list.hw.cz/mailman/listinfo/hw-list>
>>
>>
>> _______________________________________________
>> HW-list mailing list - sponsored bywww.HW.cz <http://www.HW.cz>
>> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>> http://list.hw.cz/mailman/listinfo/hw-list <http://list.hw.cz/mailman/listinfo/hw-list>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz <http://www.HW.cz>
> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
> http://list.hw.cz/mailman/listinfo/hw-list
> <http://list.hw.cz/mailman/listinfo/hw-list>
>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210602/455b01a6/attachment-0001.html>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 1624 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210602/455b01a6/attachment-0001.png>
Další informace o konferenci Hw-list