2016. március 30., szerda

Mesék a házautomatizálásról - Ugrókódos távirányító

[2016.04.16]: Amikor írtam ezt a cikket, nem vettem észre, hogy a cape manager slots fájlja a régi helyre mutat. Javítva.

Ha az autódban ülsz és be akarsz jutni a garázsodba, tudom, hogy nem divatos, de a leg kényelmesebb eszköz a kulcskarikádon lógó kicsi távirányító (valami az autoba integrált cucc jobb és divatosabb lenne, talán csinálok valami ilyesmit később).

Ahhoz, hogy távirányítani tudjam az OpenHAB-ot és rajta keresztül a garázskaput/világítást, vettem egy ilyen ugrókódos távirányítót az aliexpressen:

http://www.aliexpress.com/item/RF-Rolling-Code-Decoding-Receiver-Module-2-Transmitters-DC-5V-4CH-TTL-Output-Learning-Momentary-Toggle/32295201884.html



A tervem az, hogy a garázsvilágítás, a garázskapu és még néhány (miután két gombja marad, pontosan kettő) dolog távirányítására használom.
Először is felraktam egy breadboard-ra, bekapcsoltam, hogy kipróbáljam, működik-e.
Az első próbálkozásra tökéletesen működött, kitalálni, melyik csatorna melyik gombhoz tartozik, gyerekjáték volt.
Az egyetlen probléma a cuccal, hogy 5V-os logikai kimenetei vannak, én a BeagleBone Green-hez akarom kötni, aminek a GPIO portjai nem tolerálják az 5V-ot.
Úgy döntöttem, hogy a világ legyegyszerűbb szintillesztőjét fogom használni hozzá. Egy ellenállásosztót. Egy 39K-s és egy 68K-s ellenállás megoldoja a kérdést, multiméteren mérve.

A következő rész, a BeagleBone GPIO felkonfigurálása. Az OpenHAB a Linux GPIO Sysfs interfészt használja, ami nagyon egyszerű (https://www.kernel.org/doc/Documentation/gpio/sysfs.txt).

Először megpróbáltam adatot olvasni parancssorból. A vevő egy csatornáját rákötöttem a BBG 60-as GPIO (P9, 12-es érintkező) portra.

A konzolon a következő parancsokat szükséges kiadni:

echo '60' > /sys/class/gpio/export
echo 'in' > /sys/class/gpio/gpio60/direction

Ezek után az érték, ezzel a paranccsal olvasható:

cat /sys/class/gpio/gpio60/value

A parancsok jól működtek, de akár megnyomtam a gombot akár nem, mindíg 1-est kaptam vissza.

Megmérve a bemenetet, 1.6V-ot kaptam akkor is amikor a vevő kimenetén 0V volt. Ez azt jelenti, hogy a BBG bemenet tápra van húzva.

Ebből adódóan két lehetőségem maradt:

1. Kikapcsolom a felhúzó ellenállást valahogy
2. Az ellenállások helyett valami aktív szintillesztőt használok.

Az elsőt választottam.
Körülnézve tisztán kiderült, hogy a felhúzó ellenállás vezérlése nem része a Linux GPIO csomagnak. Sokat olvasva kiderült, hogy a BBG Cape Manager Overlay-eket használ ennek megoldására. Ez a múltban (korábbi kernel verziók) hol volt, hol nem volt. A 4.1.x-esre amit én használok, viszont már része a mainline kernelnek.

Itt van némi olvasnivaló:

https://github.com/jadonk/validation-scripts/blob/master/test-capemgr/README.md
http://www.thing-printer.com/cape-manager-is-back-baby/
http://www.valvers.com/embedded-linux/beaglebone-black/step04-gpio/

Az overlay repository (tanulhatsz belőle, de nem szükséeges ennek a feladatnak a megoldásához):
https://github.com/RobertCNelson/bb.org-overlays

A leghasználhatóbb dolog amit találtam ez a tool volt:

http://kilobaser.com/blog/2014-07-28-beaglebone-black-devicetreeoverlay-generator

Ez képes a szükséges overlayt előűllítani.

Tehát a 60-as GPIO felhúzóellenállásának a kikapcsolásához a következőkre van szükség::

1. Mentsük el a következő fájlt a /lib/firmware könyvtárba bspm_p9_12_2f-00A0.dts néven:


/*
 * This is a template-generated file from BoneScript
 */

/dts-v1/;
/plugin/;

/{
    compatible = "ti,beaglebone", "ti,beaglebone-black";
    part_number = "BS_PINMODE_P9_12_0x2f";

    exclusive-use =
        "P9.12",
        "gpio1_28";

    fragment@0 {
        target = <&am33xx_pinmux>;
        __overlay__ {
            bs_pinmode_P9_12_0x2f: pinmux_bs_pinmode_P9_12_0x2f {
                pinctrl-single,pins = <0x078 0x2f>;
            };
        };
    };

    fragment@1 {
        target = <&ocp>;
        __overlay__ {
            bs_pinmode_P9_12_0x2f_pinmux {
                compatible = "bone-pinmux-helper";
                status = "okay";
                pinctrl-names = "default";
                pinctrl-0 = <&bs_pinmode_P9_12_0x2f>;
            };
        };
    };
};

2. Fordítsuk le:
dtc -O dtb -o /lib/firmware/bspm_P9_12_2f-00A0.dtbo -b 0 -@ /lib/firmware/bspm_P9_12_2f-00A0.dts

3. Töltsük be:
echo bspm_P9_12_2f > /sys/devices/bone_capemgr.?/slots
echo bspm_P9_12_2f > /sys/devices/platform/bone_capemgr/slots

Ezután a felhúzóellenállás megszűnt létezni. A távirányító státusza olvasható lett.

Rendben, ez most működik egy csatornára, de mi van néggyel? Tudok négy overlay-t generálni, de hogyan kombinálom egy fájlba? Elég kevés infót találtam, mindaddig amíg rá nem akadtam erre az Adafruit dokumentációra:

https://learn.adafruit.com/introduction-to-the-beaglebone-black-device-tree/device-tree-overlays

A doksi alapján sikeresen kombináltam a négy generált overlay-t. Végülis a P8 7-10 lábait használtam.

Az overlay (suf_keeloq-00A0.dts):

/*
 * SUF - 4-Channel Keyloq receiver cape
 */

/dts-v1/;
/plugin/;

/{
    compatible = "ti,beaglebone", "ti,beaglebone-black";
    part_number = "SUF-KEELOQ";

    exclusive-use =
        "P8.7",
        "P8.8",
        "P8.9",
        "P8.10",
        "mmc1_sdcd",
        "gpio2_3",
        "gpio2_5",
        "gpio2_4";

    fragment@0 {
        target = <&am33xx_pinmux>;
        __overlay__ {
            suf_keeloq_pins: pinmux_suf_keeloq_pins {
                pinctrl-single,pins = <
0x090 0x2f
0x094 0x2f
0x09c 0x2f
0x098 0x2f
>;
            };
        };
    };
    fragment@1 {
        target = <&ocp>;
        __overlay__ {
            suf_keeloq_pinmux {
                compatible = "bone-pinmux-helper";
                status = "okay";
                pinctrl-names = "default";
                pinctrl-0 = <&suf_keeloq_pins>;
            };
        };
    };
};

fordítás és betöltés:
dtc -O dtb -o /lib/firmware/suf_keeloq-00A0.dtbo -b 0 -@ /lib/firmware/suf_keeloq-00A0.dts 
echo suf_keeloq > /sys/devices/bone_capemgr.?/slots
echo suf_keeloq > /sys/devices/platform/bone_capemgr/slots

Ez már működik, csak jó lenne valahogy boot időben betölteni.
Ahhoz, hogy ezt elérjük, hozzá kell adnunk a /boot/uEnv.txt fájlhoz:

cape_enable=bone_capemgr.enable_partno=suf_keeloq

Következik: Integráció az OpenHAB-bal

SharePoint Sync - Sokadszor

Drága Microsoft!

Ezt egy picit már unom. Szerencsére cégesen megszabadultunk a SharePoint Sync-től. Kemény pénzért előfizettünk a DropBox-ra.
Én még próbálkozom, hogy a saját MAPS előfizetésemnél megoldjam ezt a kérdést. Kezdem feladni, ez egy használhatatlan bénázás.
Ma megint megpróbáltam szinkronizálni. A gépem, friss Windows 10, az összes frissítéssel, rajta az utolsó O365-ös Office az utolsó frissítéssel. A szinkronizálandó könyvtár az O365-ös SharePoint-ban.
Az eredmény:


És amikor ezen nagynehezen átvergődtem:


A szóban forgó könyvtár egy megemészthetetlen méretű, teljes 2.35GB-os valami.

Már nem vagyok mérges. Talán kicsit szomorú, már nem tudom, hogy sírjak, vagy nevessek.
Csak baráti jó tanács: Lassan itt lenne az ideje, ezt a bénázást befejezni.

Aláírás:
Gömöri Zoltán
EX-MVP, EX-MCITP, EX-MCSE

2016. március 28., hétfő

Mesék a házautomatizálásról - OpenHAB telepítés

Akkor itt most felrakom az OpenHAB-ot mint központi házvezérlőt.
Az OpenHAB egy java alapú rendszer, tehát telőször is szükségünk van egy Oracle Java-ra. Ahhoz, hogy ezt felrakjuk hozzá kell adnunk a PPA repository-ját.
Melleseleg: Tudom, hogy a sudo vudu alapvetően fontos, a biztonsághoz. Magam részéről a saját Windowsos gépemet egyszerű felhasználóként használom XP óta, amikor az UAC még tervként sem létezett.
De amikor valamit összerakok, akár Windows-on akár Linux-on és amit csinálok az tisztán adminisztratív dolog, azt adminként csinálom. Tehát az első dolog amit csinálok a linuxon, amikor jó néhány dolgot telepítenem kell, ezzel kezdem:

sudo su

Ezért a továbbiakban nem fogok minden sor elejére sudo-t írni.

1. Adjuk hozzá a dpkg-hez az Oracle Java PPA repository-ját és rakjuk fel:

apt-get install software-properties-common
add-apt-repository ppa:webupd8team/java apt-get update apt-get install oracle-java8-installe 

2. Töltsük le az OpenHAB fájljait. Ezekre lesz szükségünk:

3. Csomagoljuk ki a fájlokat és gyártsunk konfigurációt

mkdir /opt/openhab
unzip distribution-1.8.1-runtime.zip -d /opt/openhab/
unzip distribution-1.8.1-demo.zip -d /opt/openhab/
cp /opt/openhab/openhab_default.cfg /opt/openhab/openhab.cfg

4. Miután még mindíg sudo módban vagyunk el is indíthatjuk az OpenHAB-ot, hogy ellenőrizzük a funkcionalitását:

/opt/openhab/start.sh

Némi várakozás után megnézhetjük az eredményt egy böngészőben:

http://<ip cím>:8080/openhab.app?sitemap=demo


Rendben. A szerverünk működik, de még nem végeztünk. Itt áljunk meg egy pillanatra.

Először: talán észrevetted, hogy nem csináltam specifikus felhasználót az openhab-hoz. Ennek oka van.

Az Ubuntut nem beágyazott rendszerekhez tervezték. Ezért, nincs arra beépített megoldás (vagy én nem tudok róla), hogy a mezei felghasználó hozzáférjen a hardver GPIO portokhoz (ha te tudsz erre egyszerű megoldást, kérlek, ne tartsd meg magadnak). A következő részekben, használni akarom a GPIO-t. Ezek alapján az OpenHAB a root nevében fog futni.

Másodszor: Szükségünk van egy megoldásra, hogy az OpenHAB daemon-ként fusson. Tehát...

5. Töltsük le a daemon scriptet innen:

https://github.com/openhab/openhab/wiki/Samples-Tricks#how-to-configure-openhab-to-start-automatically-on-linux

Mentsük el az /etc/init.d mappába openhab néven.
Állítsuk be:

chmod a+x /etc/init.d/openhab
update-rc.d openhab defaults

Szerkesszük meg a kedvenc szövegszerkeszőnkkel. Valószínüleg csak a RUN_AS bejegyzést kell openhab-ról root-ra állítani.
Indítsuk el:

/etc/init.d/openhab start

Most újra ellenőrizheted a böngészőben, hogy megy-e, és a /var/log/openhab.log-ban nézhetjük meg, hogy van-e hiba.

2016. március 26., szombat

Mesék a házautomatizálásról - Irány a komfortzónám

Ok, kezdjük el:

Nem vagyok egy Linux guru. A piacon rengeteg különböző disztribució létezik, de nekem, csak az Ubuntuval és a Debiannal van némi tapasztalatom. Továbbá általában nem használok semmilyen linux GUI-t.
Tehát amikor belekezdek egy Linux alapú projectbe, az azt jelenti, hogy felrakok egy Ubuntut.
Miután úgy döntöttem, hogy ezt a projectet BeagleBone Green-re építem, fel kell raknom rá egy 14.14 LTS-t.
Az alap információ itt található: http://elinux.org/BeagleBoardUbuntu

1. Le kell tölteni a kész image-et innen: https://rcn-ee.com/rootfs/2016-02-11/flasher/BBB-eMMC-flasher-ubuntu-14.04.3-console-armhf-2016-02-11-2gb.img.xz
(ma a 16.04 már létezik, de én maradok a régebbinél, mert az stabilabbnak tűnik). Le kell tölteni továbbá az image író eszközt (Win32DiskImager):
És szükségünk van egy minimum 2GB-os uSD kártyára is.

2. Csomagoljuk ki az image-et egy mappába a gépen. A 7-Zip pl. alkalmas a feladatra. Telepítsük fel a Win32DiskImagert.

3. Írjuk ki az image tartalmát a uSD kártyára


4. Amikor az írás kész, rakjuk át a kártyát a Beaglebone-ba. Nyomjuk meg és tartsuk lenyomva a boot select gombot (a uSD foglalathoz legközelebb lévő gomb) miközben tápellátást adunk a panelnek. Egy rövid indulási fázis után a LEDek Knight Rider-est fognak játszani (Hmm, mindenki tudja még, hogy mi az a Knight Rider?). Várjuk meg amíg befejezi és az összes LED bekapcsol.

5 Dugjuk fel az eszközt az Ethernet hálózatra. Ha ki tudjuk deríteni a DHCP által adott címet, akkot a 6-8 pont opcionális. Csak indítsuk újra a panelt, a tápellátásának ki és bekapcsolásával.

6. Telepítsük fel a panel PC meghajtóját. A Windows meghajtó itt található:
64 bit: http://beagleboard.org/static/beaglebone/latest/Drivers/Windows/BONE_D64.exe
32 bit: http://beagleboard.org/static/beaglebone/latest/Drivers/Windows/BONE_DRV.exe
Ez NEM egy soros port emulátor, amint azt várnánk, hanem egy virtuális ethernet meghajtó. Egy SSH terminálra (pl. PuTTY) lesz szükségünk a csatlakozáshoz.

7. Csatlakoztassuk a BeagleBone-t a PC-hez. Ha már hozzá volt kötve, csak húzzuk ki az USB kábelt és dugjuk vissza. Amikor kihúztuk, vegyük ki a uSD kártyát is. A továbbiakban nem lesz rá szükségünk.
8. Ha lefuttatjuk az ipconfig-ot a gépen, egy új ethernet interface tűnik fel:


A címe 192.168.7.1. A Beaglebone a 192.168.7.2-es címen található. Csatlakozzunk az SSH terminálunkkal hozzá.

9. Ha nem használtuk az USB/Ethernetet a csatlakozáshoz, csak csatlakozzunk a DHCP-től kapott címmel. Az alapértelmezett felhasználó/jelszó páros: ubuntu/temppwd
Ha statikus címre van szükségünk, csak szerkesszük meg az /etc/network/interfaces fájlt.

10. Ha ellenőrizzük a DNS beállításainkat, azok valószínüleg nem működnek. A /etc/resov.conf szerkesztése nem oldja meg a problémát, miután a következő újraindításnál felülírásra kerül.
Szerkesszük meg a /etc/resolvconf/interface-order fájlt és rakjuk az eth* bejegyzést a lista tetejére. Ez korrgálja a DNS beállításokat.

11. Indítsuk újra a szerkezetet.

12. Telepítsük fel a frissítéseket:

apt-get update
apt-get upgrade

2016. március 25., péntek

Mesék a házautomatizálásról - Miért?

Miért ne?
Azóta tervezem ezt mióta elköltöztünk 2009-ben. Akartam valami ház automatizálást rögtön a kezdetektől. Van egy barátom aki mélyen benne van a KNX rendszerekben. Azt mondta, hogy a költség a ház kb. 10%-a. Nem akartam ennyit kifizetni, így egyszerűen dobtam az ötletet.
Természetesen az automatizálás megjelent a házban itt-ott, de integráció nélkül.
Volt néhány kísérletem az automatizálásra, de nem mentem ennél tovább.
Csak a gyűjtemény kedvéért:
- Vettem egy pár Conrad FHT80B termosztátot és a kapcsolódó szelepeket. Ezek működnek a házban ma, de "szigeteket" képeznek.
- Vettem és telepítettem egy páratartalom érzékelőt és kapcsolót (része a Conrad FS20 rendszernek) a páramentesítőhöz (a beépített vezérlő használhatatlannak bizonyult)
- Vettem egy számítógép interfészt és egy kód monitort az FS20 rendszerhez. Az interfész változatlanul a dobozában van. A kód monitort (vagy hívjuk debuggernek) használtam párszor
- Vettem egy CUL v3.2-t az FS20 rendszer vezérlésére, de ez is az egyik alkatrész dobozomban kallódott mostanáig.
- Terveztem és építettem egy pár hőmérőt, amit arra szántam, hogy egy későbbi termosztát project alapját képezze, aminek neki se kezdtem.
Ahogy látod máig semmi kb. sem történt.
Miért most?
Ahogy haladok az elektronikai projectjeimmel, néhány dolog felkeltette a párom érdeklődését. Ebből pedig született egy kérés.
A garázsban nem látunk semmit, ha nincs felkapcsolva a lámpa, de nem tudod kikapcsolni, miután beültél az autoba. Az eredmény: Ha lusta vagyok (ami néha megesik), a lámpa felkapcsolva marad.
Ezt meg kéne oldani.
Az egy egyszerű megoldás lenne, hogy lecseréljük a kapcsolót egy nyomógombra, hozzáteszünk egy időzítőt, de...
Én össze akarok hozni egy ház automatizálási rendszert. Ez egy jó kiindulópont. Tehát az egyszerű megoldás helyett, miért ne építsünk valami nagyot?