čtvrtek 28. března 2024

Kamerový systém

Když jsem dokončoval dům, pořídil jsem kamerový systém nepříliš známé značky Partizan. Nebyla to dobrá volba. Systém fungoval, ale byl hrozně uzavřený, většina funkcí byla dostupná pouze fyzicky na NVR přes připojený monitor a myš, obsluha nepohodlná, optika kamer průměrná a detekce pohybu trpící množstvím falešných alarmů. Pravda, je to už přes 5 let. O důvod víc systém inovovat!

Strefil jsem skvělou dobu výprodejů značky HiLook, což je low-end od renomovaného Hikvision. Na Alze jsem pořídil tři kusy 4MP kamer IPC-B149HA (4mm), k tomu z CZC přidal další 4MP kameru IPC-B449HA (6mm) a rekordér NVR-108MH-D(C). Do NVR jsem osadil mírně starší HDD řady WD Purple. Celá sranda nakonec stála jen pár tisíc... a mnoho hodin času.

První dojmy z kamer byly skvělé. Obraz vynikající, k tomu perfektní detekce pohybu. Rozhodně se vyplatí volit HA verze, které mají Motion Detection 2.0, spolehlivost detekce je výborná. Také NVR a k němu rozumný přístup přes webové rozhraní mě potěšilo. Potíže začaly, když jsem se to celé snažil rozumně nastavit. NVR sice umí samo konfigurovat kamery, ale ne perfektně. Hlavní problém byl však se záznamem. Nepodařilo se mi rozběhat kontinuální záznam s označením detekce pohybu v časové ose, tuto funkcionalitu prý Hikvision z webové verze rozhraní v minulosti odstranil (?!). Následně jsem zjistil, že mám i problém s ukládáním pouze při detekci pohybu.

Všechny návody zmiňují nutnost zapnout funkci Dual VCA na kamerách, ta ale v těchto HiLook low-end verzích chybí. Vlastně celý firmware je neuvěřitelně osekaný, zatímco hardware je parádní, tak funkce (i kritické) prostě nejsou. Po cvičené aktualizaci firmwaru jedné z kamer se to ještě zhoršilo - zmizela položka FTP uploadu snímků při detekci pohybu... downgrade samozřejmě nemožný, starší firmwary nedostupné, ještě že výměnná politika Alzy je v tomto velmi vstřícná.

Naštěstí se funkčního očesání nedočkalo ONVIF rozhraní. Takže nakonec jsou HiLook kamery připojený k HiLook rekordéru nikoliv přes nativní Hikvision protokol, ale prostřednictvím ONVIF. Vyrobil jsem pro tento účel na kamerách uživatele s omezenými právy, aby rekordér nemohl do nastavení kamer zasahovat, takže to konečně mám celé spokojeně pod kontrolou.

Záznam při detekci pohybu funguje spolehlivě, napájení kamer je vyřešené běžným PoE switchem TP-Link. Kamera s 6mm ohniskem, tj. úzkým úhlem záběru, perfektně sedla dovnitř garáže a je namířená na vrata. Funkce WDR (Wide Dynamic Range) si uspokojivě poradila s kontrasty. Ostatní kamery zabírají okolí domu. Za zmínku stojí také ColorVu, což je funkce přirozených barev i při nízkém okolním osvětlení. Znamená to, že kamery nemají klasický neviditelný IR přísvit, ale slušně svítí bílou LEDkou. Pokud je v okolí pouliční lampa, bude stačit. Pokud ne, bude holt na zahradě nové světlýko.

Protože jsem paranoidní, mají kamery na firewallu zakázanou veškerou síťovou komunikaci s okolním světem s výjimkou synchronizace času. Nějaký přístup "zvenku" jsem k nim ale chtěl. U předchozích kamer byla jediná možnost získat RTSP stream a z něj udělat pomocí ffmpeg snímek formátu JPEG, předaný webovému serveru. Pomalé, náročné. Vybrané kamery HiLook mají přes ONVIF dostupný snapshot, jak prozradil ONVIF Device Manager. Získat odpovídající URL pomocí Wiresharku (http://192.168.1.64/onvif-http/snapshot?Profile_1) bylo dílem okamžiku. Krása. No a když už ho máme, co streamovat takové pseudo-video pomocí MJPEG? Celé to jde přece snadno udělat v PHP!

header("Content-Type: multipart/x-mixed-replace; boundary=cam-boundary");
header(
"Cache-Control: no-cache");
header(
"Pragma: no-cache");

$ch = curl_init();
curl_setopt(
$ch, CURLOPT_URL, $cam_url);
curl_setopt(
$ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(
$ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt(
$ch, CURLOPT_USERPWD, $cam_user . ':' . $cam_password]);

$ts = microtime(true);
while (!connection_aborted()) {
    $data = curl_exec($ch);
    echo "--cam-boundary\r\n";
    echo "Content-Type: image/jpeg\r\n";
    echo "Content-Length: " . strlen($data) . "\r\n\r\n";
    echo $data;
    ob_flush();
    $ts = $ts + 0.5;
    @time_sleep_until($ts);
}
curl_close(
$ch);

čtvrtek 8. února 2024

Odpojovač akumulátoru

Meteostanice na chalupě funguje. Většinou. Vyrobil jsem novou revizi desky, o ní někdy příště. Mimo jiné podporuje spínání několika výstupů na základě dálkově nastavitelných parametrů, jako je napětí akumulátoru, teploty rosného bodu apod.

Nedávno jsem ale musel vyrazit na fyzickou opravu. Stejně jako při experimentech se zřejmě ve výjimečných případech kousne MCU, když GSM modul začne vysílat. Nejspíš kombinace špatného přizpůsobení antény a zvýšení výkonu při určitých podmínkách šíření. Watchdog samozřejmě používám, ale nezareagoval. Takže výsledkem byl VRLA olověný akumulátor vybitý na necelé 3V.

Řešení? Odpojovač akumulátoru při poklesu napětí. Čínských modulů je k dispozici několik, doslova za pár korun. Jejich nevýhodou je ovšem značná vlastní spotřeba - používají běžné 12V relé a obvykle také operační zesilovač se značným odběrem. Takže jsem se rozhodl pro návrh vlastního řešení.

Odpojovač je postaven na obvodu MCP121. Tento obvod je původně určený jako napěťový supervizor a resetovací obvod pro mikrokontroléry. Vzhledem k extrémně nízkému vlastnímu odběru (pod 2uA) lze však s výhodou použít i pro navrhovanou aplikaci. Zvolená varianta MCP121T-300E/TT generuje aktivní reset (log. 0) při napětí pod cca 3V, má minimální hysterezi a výstup s otevřeným kolektorem. Pro posunutí rozhodovací úrovně k napětí vhodnému pro olověné akumulátory je obvod napájený z děliče R3/R4, čímž je vypínací napětí nastaveno na cca 9,5V. Pull-up pro gate tranzistoru Q2 zároveň zvyšuje hysterezi a posouvá zapínací napětí na cca 11,0V.

Tranzistor Q2 spíná výkonový P-MOSFET tranzistor Q1, který připojuje zátěž. Dioda LED1 indikuje aktivní výstup, s výhodou je použita modrá LED, která již při proudu řádově 100uA spolehlivě svítí. Celková spotřeba zařízení se pohybuje kolem 40uA při odpojeném akumulátoru a do 200uA při připojeném vč. proudu pro LED indikaci.

Při experimentech se mi podařilo "nakopnout" tranzistor Q1. Fungoval, spínal, ale při napětí na gate (Vgs) nad cca 11V začal prudce stoupat proud. Podle datasheetu by přitom tranzistor měl bezpečně zvládnout 20V. Na druhém kusu vše v pořádku, udělal jsem tedy destruktivní test - napětí jsem zvyšoval až k cca 16V, kdy tranzistor odešel do křemíkového nebe a zůstal sepnutý navždy. Po výměně za nový vše OK.

Vodotěsnost jsem vzhledem k přítomnosti modré LED a nedostatku průhledných smršťovaček vyřešil zalitím pomocí chrchlometu (lepící pistole) s průhlednými náboji. Na stole se vše chová perfektně - tak uvidíme po instalaci v provozu. Schéma a DPS pro Eagle jsou dostupné na mém Githubu.