Tein MicroPythonilla pienen palvelimen Raspberry Pi Pico W:lle. Tämä sopii arkkitehtuuriltaan projektiin, jonka pitää pyöriä jatkuvasti myös ilman liikennettä mutta joka ei vaadi kuitenkaan kovin tiivistä pääsilmukkaa.
Koodi on GitHubissa: https://github.com/Metabolix/MicroPython-WebMain
Ominaisuudet:
Runkoon sisältyy WLAN (yhdistys tai AP), PING (onko verkkoyhteys hengissä), NTP (ajan päivitys verkosta), hallintasivu (tiedostot ja laitteen resetointi) ja itse palvelin. Pyynnön tullessa se lukee otsikot (koska Content-Length pitää kuitenkin löytää). Pyyntö välitetään oikealle käsittelijälle. Sisällön lukemiseen ja vastaamiseen on helpot funktiot.
Palvelimella ajettava moduuli (ohjelma) voi olla funktio tai __call__-funktiolla varustettu olio. Palvelin kutsuu sitä pyynnön tullessa ja säännöllisesti taustatyötä varten. Palvelimelle voi laittaa useita moduuleja. Itse asiassa NTP ja hallintasivu ovat toteutukseltaan moduuleja, ja näistä jälkimmäinen pitää itse lisätä käyttöön, jos sen ylipäänsä haluaa.
Tausta:
Tietysti yritin vähän perehtyä muiden tekemiin ratkaisuihin. Ei äkkiseltään löytynyt oikein sopivaa ominaisuuksien ja arkkitehtuurin yhdistelmää. Osassa oli liian vähän ominaisuuksia (olivat suorastaan vain pieniä esimerkkejä palvelimen alkeista), ja hienommista näytti puuttuvan tuo idea, että jotain tapahtuisi taustalla myös ilman verkkoliikennettä. Lisäksi halusin joka tapauksessa hallintasivun, jotta voisin päivittää koodia helpommin. Yleisesti ottaen en saanut netistä käsitystä, että jokin tietty ratkaisu olisi hyvä ja laajalti käytetty, minkä takia pidin oman koodaamista hyväksyttävänä vaihtoehtona.
Projektin innoittajana on toinen projektini, johon liittyy mikrokontrollerin langaton ohjaus. Epäonnisesti hankin välineet pari kuukautta liian aikaisin ja virittelin sitten omatekoista RF-yhteyttä, mutta lopulta liian epävarman yhteyden takia tilasin 2022 kesällä julkaistun Raspberry Pi Pico W:n, jonka saa suoraan langattomaan verkkoon kiinni.
Pitää kai ihmisen jotain harrastaa.
Mielenkiintoinen! Itselläni on työn alla softa kotiautomaatio ohjaimeen mikä tällä hetkellä vaan hakee verkosta seuraavan vuorokauden pörssisähköhinnat, optimoi varaavia lämmityksiä päälle vuorokauden edullisimpina tunteina ja ohjelmallisesti toteutetun astrokello toiminnon avulla ohjaa pihavaloja. Tarkoitus olisi kuitenkin lisätä tuohon myöhemmin tuki myös muita ohjauksia varten sekä lisätä mukaan myös aurinkopaneelien tuottoennuste. Ajattelin myös WebSocket palvelimen lisätä ja toteuttaa mobiililaitteille graafisen halllintaohjelman.
Pythoniin verrattuna 8th:lla on helppo käyttää säikeitä eikä ohjelmassa ole tarvetta tiiviiseen päälooppiin. Omassa ohjelmassani säie nukkuu seuraavaan tapahtumaan asti. Mikäli ohjauksien aika-asetukset tai itse ohjaukset muuttuvat, niin työnnän säikeelle jonoon viestin tai suoraan suoritettavan tehtävän ja herätän säikeen. Mikäli säikeen jonossa ei ole mitään, niin käsitellään seuraava tapahtuma normaalisti ja mikäli jonossa on jotain, niin käsitellään se.
jalski kirjoitti:
Pythoniin verrattuna 8th:lla...
Huomioithan, että tämä toimii mikrokontrollerissa eikä tietokoneessa. Jos käytössä olisi tavallinen Raspberry Pi 1-4 tai edes Zero, tietenkin silloin olisi ihan eri valikoima kieliä ja valmiita ratkaisuja. Osittain tämän homman ideana onkin, että hienomman käyttöliittymän voi tehdä oikealle palvelimelle ja mikrokontrollerin ei tarvitse osata esimerkiksi WebSockettia. Varmaan pitää silti varmuuden vuoksi tehdä jokin salasanan tarkastus tähän.
Metabolix kirjoitti:
Huomioithan, että tämä toimii mikrokontrollerissa eikä tietokoneessa.
Huomioin ja meinasinkin jälkeenpäin editoida viestiäni, että omassa kohde ohjaimessani toki integroituna Raspberry PI CM3B+ pohjainen tietokone ja itsenäisesti toimiva 1-Wire ohjain. Nämä on sisäisesti yhdistetty sarjaväylän kautta.
Mainitsin vaan piruuttani tuosta säikeiden käytön helppoudesta 8th:lla verrattuna Pythoniin. Vilkaisin fission Python ohjelman koodia ja näytti pyörittävän aika tiivistä silmukkaa mittausten ja ohjausten käsittelyssä. Itse aion vaan nukkua seuraavaan ohjaustapahtumaan asti. Lisäksi oma säie lukee 1-Wire ohjaimelta tulevaa tietoa, päivittää mittaukset ja muiden väylään liitettyjen 1-Wire laitteiden tilat eteenpäin.
Itse olen rakentanut kotiautomaatiota Arduinolla ja siinä ESP32 moduuli Wifi yhteyttä varten. Käytännössä vaan kerään antureilta dataa, ja arduino työntää wifin kautta metriikkadatan palvelimella olevalle MQTT backendille.
Arduinossa minulla on kiinni muutama toimilaite, zigbeen yli toimiva relepakka autotallin sähkölämmityspattereille, sekä pieni askelmoottori jolla ohjaan patteriveden lämpötilaa PID-säädöllä patteriveden meno- ja paluulämpötilan suhteessa asuintilojen sisä- ja ulkolämpötilaan.
Dashboardin tiedoille tein apache supersetillä, joka näyttää reaaliaikaista tietoa ja historiaa. Varsinaiset asetukset järjestelmään olen toistaiseksi tehnyt suoraan kantaan, ja arduino hakee asetusmuutokset rajapinnasta 30min välein.
Heh, 20 vuotta sitten täällä oli vähän toisenlaiset projektit, nyt on kotiautomaatiota kaikilla. Julkaisen omani, kunhan saan nämä tietoturva-asiat kuntoon.
MQTT saattaisi kattaa tarpeet muun viestinnän osalta. Ohjelmiston etäpäivitys on kuitenkin minulle täysin välttämätön ominaisuus, koska tarvitsen sitä vuonna 2035, kun pitää alkaa ratkaista 32-bittisen aikaleiman ongelmaa, jos laite on vielä silloin käytössä.
Salauksen osalta näköjään HTTPS-yhteyden avaus heikoillakin parametreilla vie monta sekuntia, joten tämä ei sovi nykyiseen runkoon (yksi pyyntö per yhteys). Luultavasti ratkaisen salauksen, IP-asetukset ja NATin yhdellä iskulla siten, että laitan mikrokontrollerin yhdistämään ulkoiseen välityspalvelimeen ja tunneloin pyynnöt sieltä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.