Sdílení dat mezi dvěma RPi

Pavouk106

  • *****
  • 2 395
    • Zobrazit profil
    • Můj blog
    • E-mail
Sdílení dat mezi dvěma RPi
« kdy: 17. 02. 2017, 09:45:52 »
Ahoj všem,

řeším teď doma takový trabl. Popíšu situaci:
  • V obýváku mám RPi s LCD displejem. Zobrazuje vnitřní a vnější teplotu a vlhkost. Je připojené na domácí wifi (DHCP pevná IP).
  • V kotelně mám také RPi, které momentálně měří teploty vody a má připojená relé. Je také připojené na domácí wifi (DHCP pevná IP).
  • Potřebuji spojit tyhle dvě RPi tak, aby si mezi sebou mohly předávat informace. Z kotelny chci do obýváku dostat teploty a z obýváku potřebuju ručně ovládat relé v kotelně.
  • V obýváku zobrazuji na displeji pomocí pygame. Veškeré skripty jsou v Pythonu 2.7
  • V kotelně zatím nic nezobrazuji, skript na získávání teplot je v Pythonu 2.7, relé zatím neovládám (ale udělám to v Pythonu 2.7)
  • Z obou RPi budu přes OpenVPN číst údaje přes SNMP (serverem, který jinak nefiguruje v této situaci).

Moje představa je taková, že si budu předávat údaje pomocí namountování části filesystému, kde budou soubory s údaji v plaintext. V Pythonu si pak otevřu soubor, vytáhnu data a zobrazím je/sepnu relé. V Pythonu také data do souborů budu ukládat.

Chci se vás poptat, jak bych měl podle vás namountovat filesystem na obou RPi.
  • Mám udělat na jednom vyhrazenou složku a z druhého se připojit a sypat to vše na jedno místo?
  • Nebo mám udělat na každém RPi vlastní složku s daty a namountovat to navzájem (RPi mount složka z RPi a současně na RPi mount složka z RPi)?
Osobně preferuju, ať si každý RPi plácá svoje data na svym písečku a cizí data ať si čte z toho druhýho (tedy možnost 2).

Závisí to na mých preferencích, chápu.
Řekněme, že když mi vypadne spojení, tak RPi s LCD prostě jen nevypíše teploty z kotelny, který kvůli výpadku nevidí. RPi v kotelně při výpadku uvede relé do safemode, tedy do stavu, jako kdyby žádný RPi nebylo.

Další z otázek je nasnadě - jakým způsobem namountovat filesystemy? Udělat si klíč bez hesla a jet přes SSHFS? NFS? Přenášet soubory přes FTP ( ;D )? Zároveň bych potřeboval nějakej failsafe mode - když budu jedno RPi restartovat, tak aby se mi provedl mount automaticky znova (tedy "obnovil" automaticky).

Připomínky ode mne:
Python 2.7 ("stará verze") vyhovuje i do budoucna, protože jakmile to jednou pojede, odmítám na to víc hrabat ("zakonzervuju" to). Netřeba řešit, proč to nepíšu v 3.x. Pravděpodobně nakoupím další SD karty, na které si dám image funkčního řešení, stejně tak koupím i rezervní RPi a LCD. Tohle prostě bude fungovat minimálně dalších 30 let, ideálně 50.
Nechci jít do nějakýho high-level řešení jako třeba ukládat data do MySQL apod.
Nechci v Pythonu řešit síť (třeba předávání dat přímo po síti mezi dvěma skriptama)

Předem díky za názory a podněty.

K obrázku: Červená = obývákový RPi, modrá = kotelnový RPi, černá čára ukazuje očekávaný směr toku dat (zobrazit data z čidel na LCD), přerušovaná čára značí, že to možná někdy bude. Relé na obrázku nejsou, protože ještě nejsou připojená (ještě k nim chybí kus cesty).


Polymath

Re:Sdílení dat mezi dvěma RPi
« Odpověď #1 kdy: 17. 02. 2017, 09:57:40 »
Na to snad existují knihovny, nejjednodušší bude něco jako Bonjour/Zeroconf.

Edit: Necitujte celé názory nad sebou, zhoršuje to čitelnost vlákna.
« Poslední změna: 17. 02. 2017, 11:21:21 od Petr Krčmář »

Pavouk106

  • *****
  • 2 395
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Sdílení dat mezi dvěma RPi
« Odpověď #2 kdy: 17. 02. 2017, 10:26:12 »
Teď jsem si o Zeroconf něco přečetl a podle mě to není to, co hledám. Já potřebuju službu na předání dat.

Síť mi teď jede, nastaveno všechno mám, RPi se vidí, a můžou spolu "mluvit". Jde jen o to, jakou službu pro "mluvení" použít (SSHFS, NFS, ...)

anonym

Re:Sdílení dat mezi dvěma RPi
« Odpověď #3 kdy: 17. 02. 2017, 12:00:44 »
A nie je to celkom jedno? Ja by som pouzil SSHFS - predpokladam, ze SSH tam bude bezat tak ci tak, cize je to viac menej zadarmo...

Re:Sdílení dat mezi dvěma RPi
« Odpověď #4 kdy: 17. 02. 2017, 12:16:45 »
Mountovat to jako filesystem mi přijde šílené, pokud jde jen o předání dat.
Předpokládám, že vám tam na každém běží démon. Když na každou stranu přidáte do pythoního kódu http server, který předá ty požadované hodnoty, tak máte hotovo. V Pythonu tak 20-30 řádků. Přidání autentikace a ssl podle libosti. Na internetu mraky tutoriálů.
Pokud to nechcete dělat přes http, tak bych to udělal jako jednorázový skript přes ssh. Naloguje se, přečte hodnoty a zase se odloguje.


ehmmm

Re:Sdílení dat mezi dvěma RPi
« Odpověď #5 kdy: 17. 02. 2017, 12:34:24 »
A nez resit nejake knihovny, tak nemuze jedna aplikace sedet na UDP portu a druha se ji obcas zeptat? Chapu, je to nemoderni, nebezpecne a asi na pet radku v pythonu na kazde strane.

Polymath

Re:Sdílení dat mezi dvěma RPi
« Odpověď #6 kdy: 17. 02. 2017, 12:56:03 »
Teď jsem si o Zeroconf něco přečetl a podle mě to není to, co hledám. Já potřebuju službu na předání dat.

Síť mi teď jede, nastaveno všechno mám, RPi se vidí, a můžou spolu "mluvit". Jde jen o to, jakou službu pro "mluvení" použít (SSHFS, NFS, ...)
Když se vidí, tak jedině TCP. Cokoliv jiného je v tomto případě blbost.

Jenda

Re:Sdílení dat mezi dvěma RPi
« Odpověď #7 kdy: 17. 02. 2017, 13:14:16 »
Mountovat to jako filesystem mi přijde šílené, pokud jde jen o předání dat.
Také. Tím, že je to oboje Python, tak bych to zabalil pomocí Pickle, poslal soketem a neřešil.

Pavouk106

  • *****
  • 2 395
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Sdílení dat mezi dvěma RPi
« Odpověď #8 kdy: 17. 02. 2017, 13:25:59 »
Na moderní/nemoderní si nehraju, víceméně mi fakt jde jen o to, aby to jelo ;-)

Neběží mi démoni, jen skript s while 1 (no co, dělá to to, co má). Takže komunikace na nějaký systémovější úrovni není.

SSH samozřejmě běží na obojím a běžet bude. Můžu ale klidně nahodit NFS, pokud bude mít výhody. Jde mi hlavně o to, aby se to samo připojilo, kdyby došlo k výpadku na jedné straně.

RPi spadne, tak RPi přestane zobrazovat jeho teploty.
Jakmile RPi najede, tak si RPi samo během startu namountuje složku z RPi.
Já potřebuju, aby RPi nějak detekovalo najetí RPi a postaralo se o mount složky z RPi. Ideálně tak, aby to uměla technologie sama (reconnect).

Je pravda, že navzdory tomu, že se nechci pouštět do sítě v Pythonu, tak HTTP by bylo ideální. Na každym písečku by byly soubory s hodnotama a druhá strana by si je jen pravidelně četla. Kdyby jedna strana vypadla, nic se neděje, prostě nemá hodnoty a po znovunajetí se vše srovná samo. V tomhle případě jsem i ochotnej rozjet webovej server (mimo Python skript).

Jinak já data budu chtít tak jako tak v plaintext souborech - to kvůli tomu SNMP, pohodlně si to z nich vytáhnu. Tím částečně odsuzuju přímý předávání dat mezi skriptama.

Tomas Rollo

Re:Sdílení dat mezi dvěma RPi
« Odpověď #9 kdy: 17. 02. 2017, 15:54:43 »
A nešlo by použít MQTT (https://en.wikipedia.org/wiki/MQTT)? Tj. na RPI s LCD rozjet MQTT broker, treba Mosquitto (https://mosquitto.org/) a pres nej informace vymenovat?

Vyhody:
- publish+subscribe, kdy se bez problemu muze pripojit i ten SNMP server a hodnoty publikovane od RPI z kotelny si budou vycitat jak RPI s LCD tak i ten SNMP server
- moznost pouziti retain nastaveni, kdy si broker bude pamatovat naposledy publikovane hodnoty a dokaze je dat subscriberum i bez toho, ze by publisher (RPI v kotelne) byl online
- moznost pres to jednoduse sdilet i provozni parametry toho RPI v kotelne (tj. jestli bezi, kolik ma disku, RAM, vytizeni CPU, apod)
- bud uz existuji konektory (pro ten SNMP server), nebo je mozne resit i shell skripty (Mosquitto ma CLI rozhrani)
- muzu pripojovat i dalsi subscribery postavene na dalsich technologiich - podpora MQTT je ted uz ve spouste home automation systemu (treba muj oblibeny Home Assistant https://home-assistant.io/)

JirSoft

Re:Sdílení dat mezi dvěma RPi
« Odpověď #10 kdy: 17. 02. 2017, 16:25:36 »
Používám doma něco podobného (RPI které měří a řídí teploty u psů, pak pár ESP8266 které měří teploty a různé jiné kravinky a RPI v domě jako zobrazovací panel s LCD, který umožňuje ty jednotlivé hodnoty i nastavit). Mám na to vybranou UDP multicast adresu (abych nepoužíval broadcast) a každý měřák (ESP8266 i RPI), kromě nějakého ukládání svých dat do DB posílají každých 5 vteřin balík svých dat na tu UDP multicast adresu. Zobrazovači pak stačí poslouchat a když jsou data, tak aktualizovat (výpadek nevadí). Pokud chci změnit hodnoty, pošlu je na daný přístroj a ten mi potvrdí změnu. Funguje perfektně, mám namixovaný Python, Arduino C a XOJO a žádná komplikace.
Data zároveň zapisuje každé zařízení do DB na Synlogy (pomocí HTTP volání PHP skriptu) a to skript duplikuje na můj veřejný server. Zvenku se pak mohu na údaje podívat na tom věřejném, doma přímo na Synology...

Pavouk106

  • *****
  • 2 395
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Sdílení dat mezi dvěma RPi
« Odpověď #11 kdy: 17. 02. 2017, 18:28:21 »
Tomas Rollo: MQTT zní dobře. Trochu si myslím, že za současný situace je to teda kanon na vrabce, ale díky za doporučení. Minimálně o tý technologii budu vědět a možná jí využiju jinde. Jinak osobně se příkláním spíš ke dvěma vlastním písečkům (tj. nezávislosti) než k centralizovanýmu řešení (MQTT na jednom stroji, ostatní se mu hlásí)

Jinak retain je defacto nežádoucí, protože by mohlo dojít k nějaký podivný situaci, kdy by si jedna nebo druhá strana myslela něco špatnýho...

Provozní věci RPi bude mít SNMP, ze kterýho sbírám data přes OpenVPN (server je jinde).

JirSoft: Já právě asi nechci jít takovou "obecnou" cestou. Tím, že mám jen dvě zařízení a víc jich nebude (pokud ano, třeba Arduina, tak budou připojný do USB jednoho z těch RPi), tak se mi nechce jít až takhle zeširoka. Ale řešený to máš pěkně ;-) Jinak já to právě taky sbírám na veřejném serveru, ale jen jako log a na čumendu na data. Jinak to má fungovat víceméně realtime - kouknu na LCD a vidim, kolik je venku, jak teplá je voda v bojleru atd. Zpětně to je na serveru spíš kvůli debugování (který momentálně provádim).

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Sdílení dat mezi dvěma RPi
« Odpověď #12 kdy: 17. 02. 2017, 18:35:28 »
A nestacilo by uplne hloupe pouzit scp a RPi by si data posilala z cronu jednou za minutu? Jedna minuta neni u regulace kotle zadna doba, kvuli ktere by si clovek mel delat vrasky. Kotel neni jaderny reaktor.

Pavouk106

  • *****
  • 2 395
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Sdílení dat mezi dvěma RPi
« Odpověď #13 kdy: 17. 02. 2017, 18:43:06 »
JardaP.: Co Ty víš, čím doma topíme ;D Taky by to bylo řešení, ale raději bych předávál informace častěji, řekněme alespoň 1x 10s. Kdybych to scp dal opakovaně 5x za sebou do bash skriptu s prodlevou 10 sekund a pouštěl jednou za minutu, docílil bych víceméně kýženýho efektu.

Je to lepší než SSHFS, protože u toho je problém s právy (pod čím běží Python skript, jaký uživatel to připojil, ...).

Nicméně si nejsem jistý, jestli to bude lepší/jednodušší/použitelnější, než HTTP server.

Zatím teda přichází v úvahu dvě možnosti: SCP a HTTP. Uvidíme, dnes nebo zítra se na to mrknu trochu víc a jedno z toho rozjedu. Osobně vidím jednodušší to HTTP (pustím server, dám mu documentroot a jedu).

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Sdílení dat mezi dvěma RPi
« Odpověď #14 kdy: 17. 02. 2017, 19:32:07 »
JardaP.: Co Ty víš, čím doma topíme ;D

Tak jestli topite na uran, tak stejne musis mit regulator rovnou na reaktoru a nejake RPi v bejvaku mu do regulace nesmi kecat. Pak tam jeste musis mit nekolik zabezpecovacich systemu. Reaktor, kdyz ujede regulace, tak exponencialne ujede, az vybouchne a roztece se.

Citace
Taky by to bylo řešení, ale raději bych předávál informace častěji, řekněme alespoň 1x 10s. Kdybych to scp dal opakovaně 5x za sebou do bash skriptu s prodlevou 10 sekund a pouštěl jednou za minutu, docílil bych víceméně kýženýho efektu.

Proc? Abych videl, ze mi kazdych 10s naroste teplota na kotli o pul stupne, namisto aby to po minute poskocilo o 3? Budes travit cas pred displayem a koukat na cislicka? To te za den omrzi. A jotel je tak pomala regulacni soustava, ze kdybys ty data posilal kazdych 5 minut,  porad jeste by se to neposralo.

Citace
Je to lepší než SSHFS, protože u toho je problém s právy (pod čím běží Python skript, jaký uživatel to připojil, ...).

man sshfs, -o allow_other

Ja bych se spis bal toho, ze mi sshfs spadne, kdyz treba vypadne spojeni, protoze nekdo pustil neodruseny mixer. To abys to hlidal skriptem, shodil a obnovil. U scp je mi jedno, kdyz to obcas neprojde. V nejhorsim po par minutach bez dat vypnu kotel, dokud zase nezacnou chodit. A na displayi v bejvaku hodim chybovou hlasku.

Citace
Zatím teda přichází v úvahu dvě možnosti: SCP a HTTP. Uvidíme, dnes nebo zítra se na to mrknu trochu víc a jedno z toho rozjedu. Osobně vidím jednodušší to HTTP (pustím server, dám mu documentroot a jedu).

S scp je to urcite jednodusssi na implementaci. S HTTP bych ale nesel do jineho reseni, nez ze obe RPi si budou navzajem vystavovat data jako read only, aby si nejaky hracicka nekratil cas tim, ze mi bude psat do nejakych hodnot. I tak ale je scp bezpecnejsi. Muzes i pouzit klice, jako u ssh. Hezke je na tom take to, ze obe RPi budou na siti skoro neviditelna. Web server pritahuje vic pozornosti, nez ssh bezici na portu 5687. To by mohlo byt zajimave proto, ze kdyz to nekdo hodla rozchodit a nadale to nebude updatovat, tak za tech 30 let to urcite nebude bezpecne. Mozna ani to ssh.