Spis treści

Mroźna majówka

Zamieszanymroz
Rozpoczęto2018-04-30
Status
Tagi

Majówka to piękny czas, żeby wreszcie coś zrobić, a dokładniej 7 takich cusiów - jeden na każdy dzień majówki.

Worklog

Projekt 1 - pokazówka na warsztaty z micro:bit

W najbliższym czasie, będę prowadzić warsztaty z programowania w micropython na micro:bitach w mojej firmie (adva), aby nie przyjść z pustymi rękoma, postanowiłem przygotować projekt - pokazówkę. Jako że firma produkuje sprzęt sieciowy, zaś ja osobiście siedzę w dziale automatyzacji, postanowiłem przygotować przykładowy układ/test jig oparty na micro:bit prezentujący możliwości wykorzystania tej technologi to tworzenia szybkich prototypów układów testujących produkowane urządzenia.

Wymagania:

  1. kontrola przez interfejs CLI
  2. układ ma być w stanie fizycznie podłączyć i odłączyć przewód LAN
  3. układ ma być w stanie podłączyć oraz odłączyć urządzenie do/z zasilania
  4. układ ma być w stanie fizycznie podłączyć oraz odłączyć wtyczkę SFP do testowanego urządzenia.

Wyniki:

Udało się uzyskać wszystkie wymagania oprócz ostatniego - podłączania/odłączania wtyczki SFP - zabrakło na to czasu. Do projektu wykorzystano: kawałek deski, kilka śrub, kątowniki stolarskie, taśma montażowa, micro:bit, moduł 2x przkaźnik, serwo, konwerter buck-boost, płytkę prototypową, adapter micro:bit - płytka prototypowa, kabelki.

Kod

from microbit import *
class Actions(object):
    def connect_lan(self):
        """Connect the lan plug int the DUT"""
        pin16.write_analog(130)
        sleep(10c00)
        pin16.write_digital(0)
        
    def disconnect_lan(self):
        """Disconnect the lan plug from the DUT"""
        pin16.write_analog(60)
        sleep(1000)
        pin16.write_digital(0)

    def plug_power(self):
        """Power on the DUT by enabling power"""
        pin12.write_digital(1)
        
    def unplug_power(self):
        """Disconnect power from the DUT"""
        pin12.write_digital(0)
    
    def _wrong_action(self):
        uart.write("\nthere is no such action. try again\n")
        
    def help(self):
        """Display list of avalaible commands"""
        uart.write("""
        connect_lan    - Connect the lan plug int the DUT
        disconnect_lan - Disconnect the lan plug from the DUT
        plug_power     - Power on the DUT by enabling power
        unplug_power   - Disconnect power from the DUT
        help           - show this help
        """)

def read_command():
    command = ''
    while True:
        while not uart.any():
            sleep(1)
        byte = uart.read(1)
        uart.write(byte)
        if ord(byte) == 13:
            break
        command += chr(ord(byte))
    return command

actions = Actions()
uart.write("Hello, enter 'help' for commands list\n")
while True:
    command = read_command()
    uart.write("\n\ncommand: {}\n\n".format(command))
    getattr(actions, command, actions._wrong_action)()

Zdjęcia

Tak oto wygląda wynik prac projektowych:

ASCII���User comments ASCII���ASCII

Monolit

Celem projektu jest budowa monolitu inspirowanego czarnym monolitem z odysei kosmicznej, który służy do godnego prezentowania obydwu tomów Sztuki Elektroniki. Szafeczka, która ma posłużyć powstała wcześniej.

Wymagania funkcjonalne:

  1. szafeczka ma przechowywać oraz godnie eksponować dwa tomy Sztuki Elektroniki
  2. szafeczka ma mieć system automatycznego otwierania oraz zamykania drzwiczek sterowany przy pomocy guzika.
  3. drzwiczki szafeczki mają się otwierać pełnym godności, powolnym posuwistym ruchem
  4. otwieraniu drzwiczek ma towarzyszyć muzyka z odysei kosmicznej
  5. otwieraniu drzwiczek mają towarzyszyć zgrane z muzyką efekty świetlne
  6. wnętrze monolitu, celem podkreślenia efektów świetlnych ma być białe
  7. z zewnątrz monolit ma być czarny

Postępy

  1. Kiedyś - budowa szafeczki, pomalowanie wnętrza na biało
  2. 1 V 2018 - skonstruowanie czujników otwarcia i zamknięcia drzwiczek opartych na fotoprzerywnikach oraz analogowych śrubkach, mechanizmu otwierania i zamykania drzwiczek opartego na silniku z drukarki, lego, sznurka, prętów metalowych z drukarki oraz zużytych baterii jako przeciwwagi

Galeria

 Dzień 1: zewnętrzny ogląd monolitu - widać mechanizm otwierający/zamykający  Dzień 1: wnętrze monolitu widać przeciwwagę odpowiedzialną za zamykanie drzwiczek oraz fotoprzerywacze odpowiedzialne za detekcję zamknięcia drzwiczek  Dzień 1: fotoprzerywacz oraz śrubka pełniąca rolę czujnika otwarcia drzwiczek  Dzień 1: tył monolitu - serwomechanizm otwierający drzwiczki

Open Machine Spirit - kontroler zaworu grzejnika

W ramach projektu Open Machine Spirit projektujemy wspólnie system automatyki domowej. W ramach tego projektu mam zamiar stworzyć dzisiaj sprawny prototyp zaworu grzejnikowego. Wstępny prototyp oparty o wyjęty z komercyjnego rozwiązania serwomechanizm zaworu, mostek H na tranzystorach bipolarnych oraz micro:bit został przygotowany wcześniej.

Wymagania:

  1. układ musi być w stanie wysterować komercyjny serwomechanizm wyjęty z innego, dostępnego na rynku sterownika
  2. układ musi być zdalnie sterowany z poziomu wygodnego panelu administracyjnego

Postępy

  1. 2 V 2018 - analiza dokumentacji Home Asisstant pod kątem dodania wsparcia dla micro:bit

Galeria

 Dzień 1: wstępny prototyp oparty na mostku H z tranzystorów bipolarnych, micro:bit oraz serwomechanizmu zaworu

Projekt pusty

Czwartek jest ciężki i pasuje ;p poczytałem se o zasłonach zaciemniających i posłuchałem podcastu Joe Rogann 1109 z gościem od głowy i snu. I tyle.

Wieszak na ręczniki papierowe

Plan jest prosty - potrzebuję w kuchni wieszaka papierowe ręczniki. Idealny projekt na relaksujący piątek. Z wykorzystaniem Jackowej piły posuwowej i czyjejś (czyjej?) szlifierki pasowej całość zajmuje tylko chwilę.

Wymagania

  1. wieszak ma być estetyczny
  2. wieszak ma być podczepiany pod półkę, która już wisi na ścianie.

Rozwiązanie

  1. kawałek drewna, odpadek z budowy półki
  2. kawałek stalowego(?) pręta.
  3. lakier do drewna.

projekt jest równie prosty co problem - kawałek zaokrąglonej, polakierowanej deseczki, z której pod kątem prostym wystaje długi, metalowy pręt służący do wieszania ręczników.

Galeria

 Materiały na projekt - deska i pręt

zdjęcie gotowego projektu będzie jutro - gdy wyschnie lakier.

Projekt 6: raport z rynku trójmiejskich nieruchomości

Jako przedstawiciel pracującej szlachty IT posiadam pewien nadmiarowy przychód, który warto by zainwestować w coś dochodowego i bezpiecznego, a czy istnieje na tym świecie inwestycja bezpieczniejsza niż inwestycja w nieruchomość?

Wymagania

  1. zbudować bazę danych zawierającą: powierzchnię, liczbę pokoi, cenę i adres nieruchomości na terenie trójmiasta
  2. zbudować bazę danych zawierającą: powierzchnię, liczbę pokoi, cenę i adres nieruchomości pod wynajem na terenie trójmiasta
  3. stworzyć heatmapę cen nieruchomości
  4. stworzyć heatmapę cen wynajmu
  5. znaleźć kolejne możliwości analizy uzyskanych danych.

Dziennik prac

  1. 2018/05/05 12:43 – początek prac nad projektem – znaleźć stronę zawierającą informację o nieruchomościach na sprzedaż i użyć scrapy do pobrania danych, narazie, o jednej nieruchomości. Udało się ukraść całą bazę danych mieszkań na trójmiasto.pl
  2. 2018/05/12 – instalacja Nominatim w lokalnej maszynie wirtualnej – bazy danych adresów, która umożliwi stworzenie mapy wizualizującej wyniki raportu. Instalacja przeprowadzona na podstawie: http://nominatim.org/release-docs/latest/appendix/Install-on-Ubuntu-16/, kolejny krok to import bazy OSM. Aktualny stan: Internal Server Error: nativecode=pg_connect(): Unable to connect to PostgreSQL server: FATAL: database "nominatim" does not exist ** pgsql://@/nominatim.

Kod

class NieruchomosciTrojmiastoCrawler(scrapy.Spider):                                           
    name = "nieruchomosci_trojmiasto_pl"       

    def start_requests(self):                  
        urls = [                               
           'https://dom.trojmiasto.pl/nieruchomosci-sprzedam/wi,100.html?strona=101', # mieszkania                                                                                             
           #'https://dom.trojmiasto.pl/nieruchomosci-sprzedam/wi,200.html', # domy             
        ]                                      
        for url in urls:                       
            yield scrapy.Request(url=url, callback=self.parse)                                 

    def parse(self, response):                 
        items = response.css('.ogloszenia .ogl-item')                                          
        for item in items:                     
            url = item.css('h3.title a::attr(href)').extract_first()                           
            name = item.css('h3 a::text').extract_first()                                      
            price = item.css('.prize strong::text').extract()[0].strip()                       
            price = ''.join(re.findall('\d+', price))                                          
            address = item.css('.place::text').extract_first().strip()                         
            address = (';'.join(filter(None, re.split('\s+', address)))).replace(';/;','/')    
            attrs = item.css('.ogl-params li::text').extract()                                 
            rooms = level = surface_area = 'None'                                              
            for attr in attrs:                 
                if 'pok.' in attr:             
                    rooms = re.search('\d+', attr).group(0)                                    
                elif 'piętro' in attr:         
                    level = re.search('\d+', attr).group(0)                                    
                elif 'm' in attr:              
                    surface_area = re.search('\d+(\.\d+)?', attr).group(0)                     

            if price and surface_area != 'None':                                               
                price_per_m2 = "{0:.2f}".format(float(price) / float(surface_area))            

            yield {                            
                'url': url, 'name':name, 'price':price, 'address':address,                     
                'rooms':rooms, 'level': level, 'surface_area':surface_area,                    
                'price_per_m2': price_per_m2   
            }                                  

        next_url = response.css('.subcontent-body.ogloszenia .navi-bar .navi-pages li.page-last a::attr(href)').extract_first()                                                                
        I('next_url={}'.format(next_url))      
        if next_url:                           
            yield response.follow(response.url.split('?')[0] + next_url, callback=self.parse)  

Projekt ostatni: Zamek do warsztatu

od wieków @yazjack próbuje odpalić kontrolę dostępu do warsztatu, ale nie może bo c++. Dlatego też w ostatni dzień będę próbował zintegrować istniejący serwer kontroli dostępu stworzony przez @algreed z urządzeniem @yazjack. Trzymajcie kciuki.

Dziennik prac

  1. 6 V 2018 - główny problem został rozwiązany - esp potrafi się komunikować z serwerem i interpretować odpowiedź. teraz trzeba jeszcze dodać obsługę serva i wywalić bazę danych z github . Branchyk: https://github.com/allgreed/core-doorctl/tree/mroz-working-connection