środa, 31 stycznia 2018

Przechodzimy na Malinie z karty SD na dysk HDD/SSD...

Nadeszła pora...

Pora na zmianę głównego miejsca systemu Raspberry Pi. Wiele dobrego mogę powiedzieć o Raspberry Pi, ale na pewno nie to, że używanie kart pamięci (szczególnie przy wielu zapisach do loga, bazy danych, itp.) pozwala na bezstresową pracę. Ostatnio odzyskiwałem backup karty praktycznie co tydzień.

Jakoś tak się stało, że leżał mi mały dysk talerzowy 80GB ze starej PS3. Gdzieś, kiedyś w promocji kupiłem również aktywny hub USB. Niestety, napięcie na portach USB z Raspberry (nie chciałem modyfikować zmiennej max_usb_current) niby zasilało dysk, ale bardzo niestabilnie. Podłączyłem dysk do huba, hub do USB, podpiąłem zasilanie, ruszyło. Pierwszy sukces.

Na początku warto sprawdzić jak nasz dysk przestawia się w systemie, żeby przez przypadek nie sformatować czego, czego zdecydowanie nie chcemy ;)

sudo fdisk -l



Ok, jak widać mój dysk 80GB znalazł się pod /dev/sdb/. Pod /sda/ jest pendrive na którego zapisywane są backupy i leży część danych, na przykład z bajkami dla dzieci. Tak w sumie to warto będzie to niedługo przenieść na dysk, a backupy wypchnąć albo na FTP, albo w chmurę. Może kiedyś...

Skoro wiemy jaki dysk mamy sformatować, bierzemy się do pracy.

sudo fdisk /dev/sdb

I teraz po kolei komendy (po każdej literze Enter):

d - wyczyść dysk

n - new

 p - utwórz domyślną partycję

 1 - podaj numer partycji

w - zapisz zmiany

Po kolei (dinozaury może jeszcze pamiętają to wszystko ze starych komputerów, kiedy jeszcze nie było Windows i dyski trzeba było formatować z linii poleceń :D ):
1. Wymazaliśmy partycje z dysku, jeżeli jakieś były
2. Utworzyliśmy partycję domyślną
3. Podaliśmy dane domyślne - dla uproszczenia, oczywiście partycji można zrobić więcej, zmienić ich rozmiar...
4. Zapisaliśmy zmiany


Pora sformatować dysk.

sudo mkfs.ext4 /dev/sdb


Póżniej musimy dysk sparować z Raspberry Pi:

sudo mount /dev/sdb /mnt

I teraz sedno, synchronizacja naszej karty SD z dyskiem. rsync zachowuje wszystkie uprawnienia, restrykcje, itp.

sudo rsync -axv / /mnt

Kilka minut i mamy kopię karty na dysku.

Wypadałoby również powiadomić Raspberry Pi, że karta SD jest potrzebna tylko i wyłącznie do 'bootowania', cały system jest już na dysku twardym.

To ważna różnica! Raspberry Pi 3 ma opcję jednorazowego przeprogramowania bitu OTP, aby bootowanie odbywało się bez użycia karty SD, ale osobiście się na to jeszcze nie zdecydowałem - po kilku tygodniach testów możliwe, że tak zrobię. Obciążenie karty SD jest jednak teraz minimalne i znacznie zwiększa bezawaryjność systemu.

Najpierw kopia

sudo cp /boot/cmdline.txt /boot/cmdline.txt.bak

I zmieniamy plik cmdline.txt

sudo nano /boot/cmdline.txt

Zmieniamy wartość przy root i dodajemy na końcu rootdelay

root=/dev/sdb i na końcu rootdelay=5

Efekt:

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sdb rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait rootdelay=5


Brawo! Teraz pora wyedytować fstab, aby nasz dysk zawsze się mapował i system wiedział, że 'rootfs' jest na HDD. Czyli używamy karty tylko na moment startu Raspberry Pi, później już wszystko odbywa się na HDD.

sudo nano /mnt/etc/fstab

Zamieniamy wpis przy karcie SD na nasz HDD, stary komentujemy:

/dev/sdb       /               ext4    defaults,noatime  0       1

U mnie wygląda to tak:
proc            /proc           proc    defaults          0       0
/dev/sdb       /               ext4    defaults,noatime  0       1
PARTUUID=376f54aa-01  /boot           vfat    defaults          0       2
#PARTUUID=376f54aa-02  /               ext4    defaults,noatime  0       1


Cudnie! Teraz 

sudo reboot

Chwila stresu i powinniśmy wystartować z dysku. Jak to informatycy piszą: 'U mnie działa'.

Mam nadzieję, że teraz żadnych rozjazdów w systemie nie będę już miał.

W przyszłości przejdę na dysk SSD, gdy uda mi się kupić coś fajnego, małego w dobrej cenie.

sobota, 27 stycznia 2018

Dashticz - wyświetlanie faz księżyca

Na prośbę jednego z czytelników opiszę sposób skonfigurowania w Dashticz bardzo ładnego, przydatnego dodatku - faz księżyca z ich prezentacją na zdjęciach. Nie dość, że estetyczne, to jeszcze naprawdę przydatne.


Nie jestem autorem tego pomysłu i skryptu, od razu piszę. Dlatego po źródłowy kod odsyłam do:


a postaram się tutaj wyjaśnić sposób jego instalacji.

Zacząć trzeba od stworzenia pliku w folderze /scripts/lua, co ważne z początkiem nazwy script_time_. Dla uproszczenia - można tak jak w przykładzie - script_time_moon.lua.

Tam wklejamy kod wskazany w linku.

Tak jak w podanej w Wiki Domoticz instrukcji - krytyczne jest założenie 2 zmiennych użytkownika i 5 wirtualnych czujników w zakładce Devices.


Najpierw jednak Hardware:


I później Dummy sensors z typami jak poniżej:


Czyli User Variable:

MoonPicture STRING
MoonphaseCheck STRING

I Dummy:

Dummy Switch Moon up Text
Dummy Switch Moon under Text
Dummy Switch Moonpercentage Percentage
Dummy Switch Moon age Custom Sensor Days
Dummy Switch Moonphase Text

Teraz pora zmienić dane w script_time_moon.lua. Co do zmiennych, które musimy dostosować:

local moonpicture = "MoonPicture"

Nazwa zmiennej użytkownika - tam skrypt zapisuje numer obrazka png do wyświetlenia.

local checkvar = "MoonphaseCheck"

Również używana w skrypcie. Wpisywana tam jest nazwa fazy. Można zmienić na angielski i później wyświetlać w Domoticz.

local checktime = 3600

Interwał odświeżania danych z WeatherUnderground. Nie może być zbyt mały, bo zależy od planu jaki tam mamy. A zapewne będzie darmowy...

local city = "Warszawa"

Miasto dla WeatherUnderground

local countryCode = "PL"

Kod kraju dla WeatherUnderground

local idxmoonrise='161'
local idxmoonset='162'
local idxmoonpercentage ='163'
local idxmoonage ='164'
local idxmoonphase ='165'

Powyżej 5 czujników, w których musimy wpisać IDX takie jak założyliśmy wcześniej.

local wuAPIkey = "xxxxxxxxxxx"

Klucz WeatherUnderground. Dla przypomnienia - instrukcja założenia tutaj: https://cezarowy.blogspot.com/2017/09/dashticz-spenienie-marzen-maniaka.html

AKTUALIZACJA 2018-05-21!

Z tego co widzę to Weather Underground przestało udostępniać darmowe API z danymi pogodowymi! Postaram się zbadać temat i odpowiedni zmienić opis Dashticz.



local DOMO_IP = "192.168.1.200"
local DOMO_PORT = "80"

Dane dostępowego naszego Domoticz.

local tempfilename = '/var/tmp/phase.tmp'

To miejsce gdzie będzie się zapisywał plik z danymi zrzucanymi z WeatherUnderground. Część danych wygląda na przykład tak:
  "astronomy": 1
  }
        }
                ,       "moon_phase": {
                "percentIlluminated":"81",
                "ageOfMoon":"11",
                "phaseofMoon":"Waxing Gibbous",
                "hemisphere":"North",
                "current_time": {
                "hour":"22",
                "minute":"20"
                },
                "sunrise": {
                "hour":"7",
                "minute":"23"
                },
                "sunset": {
                "hour":"16",
                "minute":"26"
                },
                "moonrise": {
                "hour":"12",
                "minute":"26"
                },
                "moonset": {
                "hour":"2",
                "minute":"54"
                }
        },

Celem skryptu na Wiki Domoticz jest odpowiednie odczytanie tego pliku i zamapowanie zmiennych.

Jeżeli zmienne są poprawne i skrypt zacznie działanie (sam, ponieważ script_time_ uruchamiają się automatycznie), będzie to wyglądać tak:


W sumie mamy już wszystko. Pozostaje konfiguracja Dashticz.

W sekcji config dodajemy:
config['idx_moonpicture'] = 7;

Ten IDX jest numerem naszej User Variable.

W sekcji buttons:

var buttons = {} 
buttons.moon = {width:6, isimage:true, refreshimage:60000, image: 'moon'}

W columns:

columns[1] = {} 
columns[1]['blocks'] = [buttons.moon];
columns[1]['width'] = 3;

I screens:

screens[1] = {}
screens[1]['columns'] = [1];

Oczywiście Wy powinniście dołożyć ten przycisk w kolumnach, które u Was są poprawne i na odpowiednim ekranie.

Chciałbym teraz napisać: 'Cieszymy się, że działa' i mam nadzieję, że tak będzie...

czwartek, 11 stycznia 2018

Xiaomi Air Purifier 2 - integracja z Domoticz

W końcu dotarł do nas Xiaomi Air Purifier 2. Udało się znaleźć go w dobrej cenie, wystarczyło poczekać 2 miesiące i już jest ;) Smog na wsi nie jest tym, co tygrysy lubią najbardziej. Głównie chodzi o zdrowie dzieci.

Sprzęt, jak na Xiaomi przystało - dotarł w zwykłym pudle, bez setki kolorów, ale dobrze zapakowany. Miła niespodzianka - dostarczył go kurier.

Osobiście jestem bardzo zadowolony ze sprzętów tej marki. Działają niezawodnie, cechują się świetnym designem i łatwo się z nimi integrować.

Z tym oczyszczaczem jest podobnie - otwierasz, mówisz 'Ładne to', włączasz, działa.



Po dodaniu do aplikacji (w standardowy dla nich sposób - podłączamy się do WiFi sprzętu i podajemy swoje dane WiFi) możemy od razu nim zarządzać.






Szybka aktualizacja ;)


I jesteśmy online!


Możemy oczywiście dodać widget do telefonu


Ale dobra, to było proste. Bardzo proste.

Teraz wypadałoby go zintegrować z Domoticz, to jest przecież moim głównym celem ;)

Według poradnika z forum Domoticz powinna zadziałać komenda jak poniżej.

sudo apt-get install npm sudo screen

Może i zadziałała, ale nie mogłem później zainstalować miio...

Jak się okazało - chodziło o wersję nodejs. Ruszamy więc z instalacją 'poprawnej' wersji.

sudo curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -

sudo apt-get install -y nodejs

I już można:

sudo npm install --save miio

sudo npm install -g miio

Teraz już zadziała 'discover' - czyli wyszukiwanie kompatybilnych sprzętów.

sudo miio --discover --sync

Po jej wydaniu musicie zobaczyć IP oczyszczacza i jego status, jak poniżej:


Skoro jest, to jedziemy dalej! Do odważnych świat należy.

Poradniki różnie radzą, niektóre są bardziej skomplikowane, inne mniej. U mnie zadziałało to co poniżej.

Dodajemy skrypt, który będzie wysyłał komendy do oczyszczacza. Ja się uparłem i wszystkie wrzuciłem do folderu /scripts, ponieważ jest archiwizowany co noc.

sudo nano /home/pi/domoticz/scripts/airpurifier.js

#!/usr/bin/node
/* eslint-disable */

// Set path to node modules miio
const miio = require('miio');

// No need to change any lines in this section
var deviceip = process.argv[2];
var secondarg = process.argv[3];
var thirdarg = process.argv[4];
function exit() {
process.exit(-1);
}

// Power On (on / off specified as true or false)
if ( secondarg === "power" ) {
        setTimeout(exit, 7000);
        console.log('Sending Power', thirdarg, 'command');
        miio.device({
        address: deviceip
}).then(device => {
                return device.setPower(JSON.parse(thirdarg));
})}

// Status
if ( secondarg === "status" ) {
        miio.device({
        address: deviceip
}).then(device => {
                stats = device.getProperties([ 'power', 'mode', 'aqi', 'temperature', 'humidity' ])
                console.log(stats);
                process.exit();
})}

// Specify favorite manual fan speed (1 to 16) eg usage: fanspeed 16
if ( secondarg === "fanspeed" ) {
        setTimeout(exit, 7000);
        console.log('Setting manual fan speed to:', thirdarg);
        miio.device({
        address: deviceip
}).then(device => {
                return device.setFavoriteLevel(parseInt(thirdarg));
})}

// Set fan mode option, specify: idle, auto, silent or favorite which needs to be set for manual speed control
if ( secondarg === "fanmode" ) {
        setTimeout(exit, 7000);
        console.log('Telling device to use', thirdarg, 'fan speed mode');
        miio.device({
        address: deviceip
}).then(device => {
                return device.call('set_mode', [ thirdarg ])
})}

// Control the device led (specify as bright, dim or off)
if ( secondarg === "led" ) {
        setTimeout(exit, 7000);
        console.log('Setting device led to:', thirdarg);
        miio.device({
        address: deviceip
}).then(device => {
                return device.setLedBrightness(thirdarg);
})}

// Switch the device buzzer on or off (specify as true or false)
if ( secondarg === "buzzer" ) {
        setTimeout(exit, 7000);
        console.log('Setting device buzzer to:', thirdarg);
        miio.device({
        address: deviceip
}).then(device => {
                return device.setBuzzer(JSON.parse(thirdarg));
})}


Jeżeli wszystko zrobiliście poprawnie, komenda jak poniżej pokaże jego status:

node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 status

Próbować możecie z różnymi komendami:

node airpurifier.js 192.168.1.115 power true - Włączenie
node airpurifier.js 192.168.1.115 power false - Wyłączenie
node airpurifier.js 192.168.1.115 status - Wyświetlenie statusu
node airpurifier.js 192.168.1.115 led off - Wyłączenie diody led
node airpurifier.js 192.168.1.115 buzzer true - Włączenie sygnałów głosowych
node airpurifier.js 192.168.1.115 fanmode auto - Tryb Auto
node airpurifier.js 192.168.1.115 fanmode favorite - Tryb Ulubiony

node airpurifier.js 192.168.1.115 fanspeed 16 - Maksymalna prędkość wiatraka



No to teraz pora na Domoticz.

Mała aktualizacja!

Dla pewności i wyjaśnienia. Zaczynamy od zdefiniowania nowego Hardware!


Dopiero później na jego podstawie zakładamy dwa Virtual sensor'y.


Dla jakości powietrza - Custom Sensor


Dla temperatury i wilgotności - Temp + Hum


Zapisujemy ich (Devices) IDX
i wstawiamy do skryptu poniżej

sudo nano /home/pi/domoticz/scripts/xair2domoticz.sh

#!/bin/bash

# Get the data
data=$(node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 status)
# Sort it
temperature=$(echo "$data" | grep "temperature" | sed -e s/[^0-9.]//g)
humidity=$(echo "$data" | grep "humidity" | sed -e s/[^0-9.%]//g)
aqi=$(echo "$data" | grep "aqi" | sed -e s/[^0-9.]//g)

# Load it into Domoticz
curl -s "http://192.168.1.200/json.htm?type=command&param=udevice&idx=247&nvalue=0&svalue=${temperature};${humidity};0"
curl -s "http://192.168.1.200/json.htm?type=command&param=udevice&idx=248&svalue=${aqi}"

Nadajemy uprawnienia do uruchamiania:
sudo chmod +x /home/pi/domoticz/scripts/xair2domoticz.sh

I wrzucamy do crontab

crontab -e 

*/15 * * * * sudo ~/domoticz/scripts/xair2domoticz.sh


Działa. Łaski nie robi :) U mnie nazywa się to Aqi (tak prawdę mówiąc to identycznie jak w  poradniku...). Temperatura i wilgotność w odpowiedniej zakładce.

Ok, dane już odbieramy. Teraz wypadałoby nauczyć się nim sterować.

Założyłem Selector Switch (na podstawie Hardware), zmieniłem wartości z domyślnych na:
- Off
- Auto
- Low
- Max
- Silent



Pozostało wpisać skrypt LUA. Nie będę cwaniakował - zmieniłem skrypt autora z forum Domoticz (http://www.domoticz.com/forum/viewtopic.php?t=15537)

Skrypt, na podstawie nazwy urządzenia i jego statusów w Domoticz, wysyła komendy do Xiaomi Air Purifier 2.

sudo nano /home/pi/domoticz/scripts/lua/script_device_xair.lua

commandArray = {}
if devicechanged['Oczyszczacz powietrza'] == 'Auto' then
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 power true')
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanmode auto')
end
if devicechanged['Oczyszczacz powietrza'] == 'Off' then
    os.execute ('sudo screen -S airpurifieroff -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 power false')
end
if devicechanged['Oczyszczacz powietrza'] == 'Low' then
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanmode favorite')
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanspeed 3')
end
if devicechanged['Oczyszczacz powietrza'] == 'Max' then
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanmode favorite')
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanspeed 16')
end
if devicechanged['Oczyszczacz powietrza'] == 'Silent' then
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 power true')
    os.execute ('sudo screen -S airpurifieron -d -m node /home/pi/domoticz/scripts/airpurifier.js 192.168.1.115 fanmode silent')
end
return commandArray

I to by było na tyle. Działa, raportuje, oczyszcza. Mam mały problem z czasami nie działającymi ustawieniami Max i Low (komendy wysyłane z linii poleceń działają bez problemu, w powyższym skrypcie może muszę wstawić mały delay). Ale On, Off, Silent, Auto działa bez problemu.

Do tego wypadałoby jeszcze zrobić pobieranie statusu Włączony/Wyłączony i aktualizowanie w Domoticz - automatycznie się to nie dzieje.

Swoją drogą - warto było go nabyć.

środa, 10 stycznia 2018

mBot - zabawki nie tylko dla dzieci :)

Święta, święta i po świętach.

I jeżeli dzieci już dostały zabawki, a nie chcą się nimi bawić - ojciec ma co robić!


mBot, bo o nim mowa, jest akurat w kręgu naszych zainteresowań. Oparty na Arduino, programowalny, z możliwością kupienia dodatków. Ja akurat kupiłem dla syna wersję Bluetooth. Świetna, ale to kompletnie świetna zabawka.

Poniżej kilka zdjęć już złożonego robota. Samo skręcanie to kilka śrubek, opisywać nie ma sensu. Metalowa baza, dwa silniki, dwa koła, czujnik 'obrazu' (aby robot jeździł po linii, którą mu wyznaczymy) oraz czujnik odległości. Na górze Arduino w ładnej, przezroczystej obudowie. Wszystkie kable, złączki - świetnie opisane, połączenie to przyjemność.






Robota można połączyć z komputerem przez USB, kabel jest w zestawie. Tak najłatwiej zaktualizować oprogramowanie.




Sednem jednak są dwie aplikacje, dostępne ze darmo w AppStore (czy też Play Store). To one pozwalają robota programować, można przejść 'szkolenie' z jego obsługi, korzystać z wielu ciekawych funkcji. Możliwości jest mnóstwo!

Pierwszą z nich jest Makeblock. To zestaw mniejszych aplikacji, które zaznajomią Was z mBotem. Jak widać na pierwszym obrazku, podzielone są na sekcje tematyczne.


Pierwsza to sterowanie. Za pomocą 'jakby' pilota w aplikacji możemy skłonić robota do jazdy, włączenia diód, odtworzenia dźwięku.


Druga - Narysuj i jedź, umożliwia narysowanie robotowi trasy, którą później ma powtórzyć. Widać jak się poci, gdy ręka na drży i kreska nie jest idealnie prosta :)


Muzyk - zagraj jak na organkach, albo odtwórz zapisane nuty.


Zdecydowanie najciekawsza jest sekcja Tworzenia



To tutaj możemy pisać nasze 'programy', które w odpowiedni sposób zaprogramują robota.



W aplikacji jest też sekcja aktualizacji firmware robota, jeżeli pojawi się nowa wersja.




Druga aplikacja to mBlock.

Tutaj możemy się zmierzyć z serią zadań, które rozjaśnią nam tajniki sterowania robotem, sprawdzania stanu jego czujników, itp. Wszystko w formie gry, dobrej zabawy. Spotkacie tutaj stosowane również w Domoticz, bloki z funkcjami robota, które możecie dowolnie ustawiać. Mamy tu wszystko: ruch jednym czy też dwoma silnikami, odczyt czujnika odległości, odtwarzanie dźwięków...










Ze strony http://www.mblock.cc/software/mblock/mblock3/ musicie ściągnąć oprogramowanie dla Waszego systemu, jeżeli chcecie połączyć się również z poziomu komputera. Chociaż o niebo wygodniej jest z poziomu tableta/komórki.

Tutaj porada jak sprawdzić i zainstalować najnowsze oprogramowanie dla robota: https://makeblockshop.eu/blogs/known-issues/88952772-first-check-your-firmware-version






Reasumując - rewelacyjna zabawka, która wprowadzi zainteresowane dzieci w świat robotów, programowania, sterowania.

Do zestawu dołączony jest pilot, którym również możemy sterować robotem, oraz kartka z wyrysowaną przykładową trasą, którą może podążać robot, dzięki czujnikom zamontowanym w podwoziu.