1-wire-projekti: 20x DS18B20 + RPi

Liittynyt
23.07.2017
Viestejä
258
Otetaanpa täältä sanity check, ja mennään sitten vasta hölmöilemään...
Ideana olisi askarrella järjestelmä, jolla seurata teknisen tilan erilaisten vesiputkien (muovi + kupari) lämpötiloja. Käytännössä siis lähtevien ja tulevien lattialämmitys- sekä käyttövesiputkien lämpöjä.

Ensiksikin antureina olisi yksinkertaisia ja halpoja DS18B20 antureita, joita Kiinasta saa parikymmentä alle kympillä, suunnilleen saman verran olisi niitä seurattavia putkiakin. Nämä kiinnitettäisiin lämmönsiirtotahnan (jos tarpeen), solumuovieristeen ja nippusiteiden kanssa putkiin kiinni.

Anturit olisi tarkoitus kytkeä jotenkin 1-wire-väylään mielellään välttäen ihan kohtuutonta kolvausta ja varmistaen modulaarisuus sekä laajennettavuus. Tässä on nyt hieman epävarmuutta tuon väylän toteutuksesta?
Yksi vaihtoehto voisi olla käyttää rj11-liittimiä ja vaikka tällaisia splitterejä, joilla saisi noita antureita kytkettyä sarjaan. Mahtaisiko toimia? Olisipa hyvä jos löytyisi jostain valmiita rj11-kaapelinpätkiä, joihin toiseen päähän kolvaisi nuo anturit. Mieleläni en itse lähtisi rakentamaan noita rj11-liittimiä.
Toinen vaihtoehto voisi olla joku tällainen liitinpaketti tai vastaava. Tuossa pääsisi kolvailemaan itse vähän reilummin ja se modulaarisuus ei ole ihan niin kunnossa.
Mitenköhän tuon väylän oikein tekisi? Joku ihan muu idea?

Väylä olisi lopulta tarkoitus kytkeä Raspberry Pin kytkentärimaan jotenkin näin. Saa nähdä tuleeko luotettavuusongelmia...
Softapuoli menee sitten Zabbixiin sekä MQTT:n kautta HomeAssistantiin. Se puoli on minulla selkeästi parammin hallussa.

Olisin kiitollinen kaikesta avusta kun tuo rautapuoli ei ole ihan niin näpeissä.
 
Saatta jännite loppua raspista, vallankin jos sun väylälle tulee pituutta yhtään. Itse tilaisin joko hatun raspiintai usb-väyläisen 1-wire-sovittimen, johon saadaan riittävän järeä jännite (5V) ajettua.

Ja itsellä tulossa vastaavaa, mutta sisälämpöjä mittailen, niin ihan sokeripala/juottoliitoksilla meinasin mennä.
 
Kyllä tuo toimii 3,3v:lläkin kunhan käyttää dallasille 3 langan kytkentää. Eli se suora 3,3v joka sensorille. Itsellä yksi 10 sensorin ketju tehtynä noin 20m kaapeliksi ja pelaa hyvin. Eli GND, data 2,2k ylösvetovastuksella ja 3,3v. Data siis suoraan io-pinniin. Kahdella langalla vaatii tosiaan sitten sen 5v tason ja oikein 1-wire parasiittisen aktiiviylövedollisen rajapinnan. Okealla 1w hatilla tai usb pulikalla saa sitten tuon.

Kaksilankaisena ja pelkällä ylösvedolla saa 3-4 dallasia pelaamaan parin metrin kaapeleilla.

RJ11 piuhat saa kätevimmin kun ostaa riittävän pitkiä valmiita ja keskeltä poikki. Kiinankaupat on sitten pullollaan puoli-ilmaisia rj11 splittereitä, esim 1 to 5 on aika yleisesti saatavilla. Rj11:sen saa 4 johtimisena kun tilaa oikeat versiot joten tuo 3 langan kytkentä onnistuu silläkin.

Yksi asia noissa 1-wire kytkennöissä on sitten väylän nopeus. Jos lukee speksin läpi, niin 2-lankaisena ketjun toiminta edellyttää pitkiä sensorin sisäisen konkan latausaikoja. Joten 3 lankaisena sitä dataa saa huomattavasti useammin luettua. Tällä on merkitystä aika paljonkin jos niitä sensoreita on se 20kpl.
 
Raspin kanssa kannattaa käyttää sarja-1w muunninta ds2480 niin väylä toimii paljon paremmin ja luotettavammin kuin suoraan gpiolla. Myös parasiittipower-anturit.

Plussana sen kanssa toimii suoraan owfs...

Tai usb-1w käy tietysti myös.

Tuolla anturimäärällä ilman muuta 3 johdolla 5v syötöllä toimii luotettavammin varsinkin jos on tähti tai lumihiutale
 
Rasbissa käytössä MAX31820 kymmenkunta ja toimii ongelmitta. Supportoi 3.3v joten ei tarvitse kikkailla. Softa yhteensopiva DS18B20 kanssa. Kannattaa vetää käyttöjännite omalla piuhalla jos on vähänkään pitempiä vetoja.
 
Otetaanpa täältä sanity check, ja mennään sitten vasta hölmöilemään...
Ideana olisi askarrella järjestelmä, jolla seurata teknisen tilan erilaisten vesiputkien (muovi + kupari) lämpötiloja. Käytännössä siis lähtevien ja tulevien lattialämmitys- sekä käyttövesiputkien lämpöjä.

Tähän vielä pari lisäystä ettei tule yllätyksiä.
Kannattaa aloittaa mittaamalla tarvittava johdon pituus ja anturien määrä. Jos molempia on paljon niin kannattaa käyttää isompaa jännitettä ja aktiivista ajuria pelkän gpio:n sijaan.

Veljen teknisessä tilassa ja sen ympäristössä on n. 25 anturia ja vähintään sama määrä johtoa (en tiedä tarkkaa määrää). Suurin osa on suoran kaapelin matkalla n. 10-15cm haarojen päässä ja osa vähän kauempana. Lisäksi mittaava raspi on viereisessä huoneessa ja wc välissä, taas muutama metri lisäjohtoa. Muistaaksnei vakio mhs- kaapelia.
Tämän kanssa ei ole ollut mitään ongelmia DS2490 (usb-1wire) eikä DS2480 (serial-1w) kanssa.

Vertailuna suoraan gpio:lla ajettu esp8266 (3.3v) ulkona pystyi luotettavasti lukemaan vain 5 anturia 7m johdon päässä. Raspi/esp vertailuna gpio max virta on raspilla 16mA ja esp 12mA eli aika samoissa.

Jos haluaa paljon antureita yhteen linjaan ja lisäksi luotettavuutta siihen että ne kaikki toimivat kuten kuuluukin ja mittaavat oikein niin kannattaa käyttää noita aktiiviajureita.
Lisäksi käytetty kaapeli vaikuttaa paljon.

Tämä kannattaa myös lukea: Guidelines for Reliable Long Line 1-Wire Networks - Tutorial - Maxim
 
Sattuipa sopivasti tämä ketju, itsekin juuri rupesin miettimään Raspi/Zabbix/1-wire -toteutusta ja tästä ketjusta tuli muutama ihan mietinnän arvoinen asia mieleen.

Tosin, itselläni on mielessä 4-5 anturia. Pari tulee lähelle, noin 1m ja 5m päähän ja pari 30m ja 35m päähän, mahdollisesti yksi vielä tuohon väliin. Mietin vaan toteutusta että miten tuon 5m päässä olevan anturin kaapeloin. Se kun on eri suunnassa kuin muut eli periaatteessa vaihtoehtona on kaksi väylää jotka haarautuvat jo lähtöpäästä, toisessa oksassa 1m, 30m ja 35m päässä anturi ja toisessa yksinään 5m päässä yksi. Toinen vaihtoehto olisi että tekisi oksan tuon 1m päässä olevan anturin kohdalla ja silloin yksinäinen anturi olisi 6m oksan perässä. Kolmas vaihtoehto olisi laittaa kaikki yhteen väylään ilman oksia mutta sitten joutuisi kaapeloimaan tuon yhden eri suunnassa olevan anturin edestakaisin muutenkin ahdasta kaapelikourua pitkin.

Koska väylän pituus pahimmillaankin tulee olemaan 40m (ja Maximin dokkarissa oli mainittu satojen metrien väylä) niin tuskin tuon yhden anturin kaapelointi omana haaranaan tuottaa ongelmaa?

Kaapelina käyttäisin todennäköisesti cat5e utp -kaapelia kun sitä sattuu jo löytymään kaapista. Powerijohtimet ajattelin tuplata niin ei jännite laske niin paljoa pitkässäkään vedossa.
 
Tosin, itselläni on mielessä 4-5 anturia. Pari tulee lähelle, noin 1m ja 5m päähän ja pari 30m ja 35m päähän, mahdollisesti yksi vielä tuohon väliin. Mietin vaan toteutusta että miten tuon 5m päässä olevan anturin kaapeloin. Se kun on eri suunnassa kuin muut eli periaatteessa vaihtoehtona on kaksi väylää jotka haarautuvat jo lähtöpäästä, toisessa oksassa 1m, 30m ja 35m päässä anturi ja toisessa yksinään 5m päässä yksi. Toinen vaihtoehto olisi että tekisi oksan tuon 1m päässä olevan anturin kohdalla ja silloin yksinäinen anturi olisi 6m oksan perässä. Kolmas vaihtoehto olisi laittaa kaikki yhteen väylään ilman oksia mutta sitten joutuisi kaapeloimaan tuon yhden eri suunnassa olevan anturin edestakaisin muutenkin ahdasta kaapelikourua pitkin.

Kaapelina käyttäisin todennäköisesti cat5e utp -kaapelia kun sitä sattuu jo löytymään kaapista. Powerijohtimet ajattelin tuplata niin ei jännite laske niin paljoa pitkässäkään vedossa.

Jos käytät cat5e kaapelia niin siinä on 4 paria, samassa kaapelissa menee siis kevyesti 1w sinne (1. pari maa+data) ja takaisin (2. pari maa+data takaisin) ja loput 2 paria maa+vcc joten kaapelikuoruun riittää vain 1 kaapeli. Tämä on yksi mahdollisuus jos teet lenkin sen 5m päässä olevan kautta jolloin verkon pituus kasvaa 10m.
Raspi - 1m - haara 5m sivulle - jatkuu ei ehkä ole hyvä idea koska haaran pituus >3m, tämä löytyy Maximin ohjeesta.

Koska väylän pituus pahimmillaankin tulee olemaan 40m (ja Maximin dokkarissa oli mainittu satojen metrien väylä) niin tuskin tuon yhden anturin kaapelointi omana haaranaan tuottaa ongelmaa?

Kuten varmasti huomasit niin se satojen metrien versio vaatii vähän enemmän ajurilta ja softalta: Advanced 1-Wire Network Driver - Reference Schematic - Maxim

Zabbixista ei ole tietoa joten saattaa mennä metsään sen osalta, mutta

Yksi mahdollisuus on käyttää useampaa 1-wire väylää, tuossa omassa esp- toteutuksessa käytin yhteensä 4 linjaa jotta kaikkiin sai tarpeeksi lyhyen johdon niin toimii luotettavasti pakkasessakin.

Tai DS2480/DS2490 ajuri ja yksinkertainen verkko sen sijaan että tekee itse tuon advanced- ajurin ja kirjoittaa sille softan. Edelleen noiden 2480/90 piirien kanssa toimii mainiosti owfs jolloin lämpötilojen lukeminen onnistuu helposti vaikka cat:lla.
 
Jatketaanpa tänne itse aloittamaani ketjuun.
Projekti on viimein vuoden "tuumailun" jälkeen edistynyt ja ratkaisu on käytössä. Pähkinänkuoressa homma menee näin:
- RPi 1B (joo, vanha, uusiokäyttöön nostettu) + uusi Raspbian + uusi RPi3:n oma virtalähde.
- Suoraan GPIO-väylään liitetty 3 langan kytkentä, 4,7k vastus datan ja 3.3V jännitteen välissä, kolmas piuha maassa.
- Tämä veto yhdistettynä viiteen 1->5 RJ11 splitteriin.
- Noista sitten niitä RJ11 piuhoja keskimäärin noin puolen metrin vedoilla (kaikki alle metrisiä) ja niiden päässä ne DS18B20-anturit. Yhteensä väylän pituus on varmasti alle 10 metriä.
Ja tältä se näyttää:
20200426_194344.jpg


Kolvailutekniikkaa harjoitellessa ja muutenkin tusatessa meni aikansa, mutta nyt homma on kasassa ja voin sanoa, että vaikka ei ehkä nätti olekaan, niin toimii!
... Toimii siis niin kauan kun en kytke yli 13 anturia kiinni. Noin 14. anturin kohdalla toimii jokusen tunnin, mutta sitten alkaa syslogiin pukata virhettä:
Koodi:
May  7 21:02:38 w1pi kernel: [259256.411598] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:03:17 w1pi kernel: [259295.372510] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:03:56 w1pi kernel: [259334.253374] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:04:34 w1pi kernel: [259373.134933] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:05:13 w1pi kernel: [259412.015387] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:05:52 w1pi kernel: [259450.896400] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:06:31 w1pi kernel: [259489.777352] w1_slave_driver 28-0000047b05eb: Read failed CRC check
Tuosta toipuu sitten vasta kun napsii piuhat irti, boottailee ja aloittaa alusta.
Kun tuon nyt pystyn toistamaan useammankin anturin laittamalla 14:ta, uskallan olla sitä mieltä, että tuon yksittäisen anturin liitosviasta ei ole kyse, vaan väylässä on jotain isompaa harmia.

Täällä käsitellään melko vastaavanlaista ongelmaa, mutta selkeää ratkaisua tuolta ei löydy ja ehdotettuja korjauksia on niin paljon, että en ole lähtenyt niitä arpomaan.
Joten ajattelin kokeilla täältä kotimaiselta foorumilta, josku apua löytyisi.
Eli, olisiko ehdotuksia, mitä kannattaisi kokeilla?
 
Jatketaanpa tänne itse aloittamaani ketjuun.
Projekti on viimein vuoden "tuumailun" jälkeen edistynyt ja ratkaisu on käytössä. Pähkinänkuoressa homma menee näin:
- RPi 1B (joo, vanha, uusiokäyttöön nostettu) + uusi Raspbian + uusi RPi3:n oma virtalähde.
- Suoraan GPIO-väylään liitetty 3 langan kytkentä, 4,7k vastus datan ja 3.3V jännitteen välissä, kolmas piuha maassa.
- Tämä veto yhdistettynä viiteen 1->5 RJ11 splitteriin.
- Noista sitten niitä RJ11 piuhoja keskimäärin noin puolen metrin vedoilla (kaikki alle metrisiä) ja niiden päässä ne DS18B20-anturit. Yhteensä väylän pituus on varmasti alle 10 metriä.
Ja tältä se näyttää:
20200426_194344.jpg


Kolvailutekniikkaa harjoitellessa ja muutenkin tusatessa meni aikansa, mutta nyt homma on kasassa ja voin sanoa, että vaikka ei ehkä nätti olekaan, niin toimii!
... Toimii siis niin kauan kun en kytke yli 13 anturia kiinni. Noin 14. anturin kohdalla toimii jokusen tunnin, mutta sitten alkaa syslogiin pukata virhettä:
Koodi:
May  7 21:02:38 w1pi kernel: [259256.411598] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:03:17 w1pi kernel: [259295.372510] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:03:56 w1pi kernel: [259334.253374] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:04:34 w1pi kernel: [259373.134933] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:05:13 w1pi kernel: [259412.015387] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:05:52 w1pi kernel: [259450.896400] w1_slave_driver 28-0000047b05eb: Read failed CRC check
May  7 21:06:31 w1pi kernel: [259489.777352] w1_slave_driver 28-0000047b05eb: Read failed CRC check
Tuosta toipuu sitten vasta kun napsii piuhat irti, boottailee ja aloittaa alusta.
Kun tuon nyt pystyn toistamaan useammankin anturin laittamalla 14:ta, uskallan olla sitä mieltä, että tuon yksittäisen anturin liitosviasta ei ole kyse, vaan väylässä on jotain isompaa harmia.

Täällä käsitellään melko vastaavanlaista ongelmaa, mutta selkeää ratkaisua tuolta ei löydy ja ehdotettuja korjauksia on niin paljon, että en ole lähtenyt niitä arpomaan.
Joten ajattelin kokeilla täältä kotimaiselta foorumilta, josku apua löytyisi.
Eli, olisiko ehdotuksia, mitä kannattaisi kokeilla?

Pienempi vastus on tietysti helpoin, muistaakseni alle 1k ei enää toimi kun anturit ei jaksa vetää kunnolla alas.
Jos kaapelissa on enemmän johtoja kuin 3 niin laita data toiseen reunaan kauemmaksi muista ja jännite & maa toiseen reunaan, helpottaa vähän kaapelin kapasitanssia ja saattaa auttaa.

Esp8266 kanssa olen käyttänyt 3k ja 2k ylösvetoakin, ei juuri merkitystä toimintaan verrattuna 4.7k/5.6k. Siinä siis sama suoraan io - 1wire ja ylösveto.

DS2490 (usb - 1wire) tai (DS2480B sarja - 1wire) ja 5V syöttö on paras ratkaisu. Toimii useampi kymmenen anturia pitkilläkin kaapeleilla.
Usb- versio on vähän työläämpi tehdä ja sarjapiiri tarvitsee itsensä ja raspin väliin transistorit kääntämään signaalit ja säätämään tasot. Molemmilla testattu ja toimii hyvin. Kummankin kanssa on kätevä käyttää owfs:ää antureiden lukemiseen (kätevästi vaikka cat:in kanssa).
 
Täällä käsitellään melko vastaavanlaista ongelmaa, mutta selkeää ratkaisua tuolta ei löydy ja ehdotettuja korjauksia on niin paljon, että en ole lähtenyt niitä arpomaan.
Joten ajattelin kokeilla täältä kotimaiselta foorumilta, josku apua löytyisi.
Eli, olisiko ehdotuksia, mitä kannattaisi kokeilla?

En ole noin monen one-wire -anturin kanssa touhunnut, mutta kevään aikana joudin hieman ihmettelelmään pienempää kytkentää ja sain selville, että tähtikytkentä voi olla ongelmallinen tälle kommunikointitavalle. Ja jos oikein tulkitsin, niin sinulla on viisi tähtikytkentäpistettä tuossa kokoonpanossa. Saattaa olla tarpeen miettiä johdotusta uudelleen.


hau
 
En ole noin monen one-wire -anturin kanssa touhunnut, mutta kevään aikana joudin hieman ihmettelelmään pienempää kytkentää ja sain selville, että tähtikytkentä voi olla ongelmallinen tälle kommunikointitavalle. Ja jos oikein tulkitsin, niin sinulla on viisi tähtikytkentäpistettä tuossa kokoonpanossa. Saattaa olla tarpeen miettiä johdotusta uudelleen.

Totta, tähti on huono malli.
Jos mahdollista niin johdotus uudelleen suoraan anturilta toiselle.
 
No niin, mainitsinkin jo siitä tusaamisesta...
Kytkentä on tällainen:
ds18b20.png


Onko tuo nyt sitten tähti vai mikä - kertokaa te.
Minäkin luin kyllä toki, että se tähti ei ole optimi, mutta tuohon päädyin suoraan sanoen vain, koska sain sen noin toimimaan.
Mitenkäs tuo sitten pitäisi korjata?

Tietysti jos ensin kannattaisi kokeilla jotain kevyempää kuin kaikkien(!) kolvaustan uusimista, kuten esim. vastuksen vaihtoa pienempään, lisävirtaa tjms, erittäin mielelelläni kokeilen. Transistorit jne. menee kyllä meikäläisen kompetenssin yli, ellei tuota yo. vastaavaa rautalankakuvaa ole saatavilla.
 
Virallista nimeä en kyllä tiedä mutta samat ongelmat tuossa tulee kuin tähdessä vaikka "keskipisteitä" on enemmän ja sakarat ehkä lyhyempiä... "Tikapuu ilman toista reunaa" ?

Yksi hyvä tapa voisi olla jakaa tuo yksi väylä useaan palaan, esimerkiksi väylä / jakopurkki.
Täällä kerrotaan että voi käyttää useampaa väylää, se on varmaan helpoin tapa testata, tarvitsee vaan johdon jakopurkilta raspille ja ylösvedon.

Jos ei toimi tai jos virheen sattuessa pitää aina bootata (= ei kovin kätevää) niin vierekkäiset väylät saa helposti myös arduinolla/vastaavalla kortilla.
Siihen sitten yksinkertainen softa joka käy läpi kaikki väylät ja niistä kaikki anturit ja tulostaa anturin osoitteen ja lämpötilan sarjaporttiin. Tämä toistetaan halutuin väliajoin. Ja lukeminen raspissa usb- sarjaportista kuten arduino/vastaavat normaalistikin.
Vaatii avr:lle pari valmista kirjastoa ja vähän omaa koodausta.
 
Tee useampi 1-wire bus ja laita yksi tuollainen "rypäs" aina yhteen väylään. Nykyyään tuon pitäisi onnistua kohtuu helposti:
 
Tuo kuva olisi topologialtaan väylä joka sinänsä on varsin ok 1wirelle. Mutta siinä kuvassa missä oli niitä 5-jakoja kasa niin näytti että olisi viiteen haaraan oksittu tähti eli ehkä hankalin mahdollinen topologia 1wirelle.

Raspílla taisi tosiaan onnistua useampikin 1wire -väylä joten joko sitä pitäsi hyödyntää tai sitten tuota kytkentää muuttaa väylämäisempään suuntaan.

Tuon 1wire -väylän sai jollain komennolla resetoituakin ilman piuhojen irroitusta ja reboottia, en vaan juuri nyt muista miten. Jos tuo ongelma olisi satunnaista niin helpoin tapa tietty olisi vaan resetoida väylä ja jatkaa pollausta entiseen tapaan.

Tosiaan vastuksen vaihto astetta pienempään saattaa auttaa ja on helppo konsti (laittaa nykyisen vastuksen rinnalle jonkun sopivan arvon, vaikkapa 10k) mutta varmuuden saisi helpoiten oskilloskoopilla väylää mittaamalla niin näkisi vetääkö nuo anturit väylän liian alas, pyöristyykö datapulssit vai missä ongelma piilee.

Itselläni on 3k3 vastus pulluppina ja väylä haarautuu tällä hetkellä kahteen suuntaan, toiseen suuntaan 1,5m ja toiseen suuntaan 2,5m, haaroituskohta on noin 1m päässä raspista ja tuo ylösvetovastus on siinä. Tuossa pidemmässä oksassa on kaksi anturia, toinen on ihan päässä ja toinen noin puolessa välissä. Tuohon pitäisi vielä saada yksi anturi kiinni mutta sille tulisi liki 5m piuhaa, katoo nyt miten lähtee toimimaan kun joskus saa aikaiseksi. Tuon lisäanturin kytkentäpiste alustavasti tulisi olemaan valitettavasti tuo nykyisen väylän haarakohta tai sitten pitää kaapeloida tuo lyhyemmän haaran jatkoksi mutta se on aikalailla haastava veto.

Tuolla nykyisellä setillä ei ole ainakaan viimeiseen vuoteen tullut ensimmäistäkään ongelmaa noiden anturien kanssa vaikka oma kaapelivalinta vähän jännittikin kun se on pääsääntöisesti ohutta suojattua, parikierrettyä mikrofonikaapelia.
 
3,3v syöttö tuossa tulee vastaan, ei niinkään johdotuksen pituus. 5v 1-wire palikka käyttöön niin pitäisi toimia ongelmitta. Suurimmalla osalla 1w antureista minimijännite on 3v joten 3,3 syötöllä tulee äkkiä rajat vastaan. Käyttöjännite kun vaikuttaa myös dataliikenteen rajoihin. Dataliikenteessä antureiden hajakapasitanssit laskee jännitetasoja jolloin 1/0 bittien rajat ei enää ylity. 5v syötöllä raja-arvoihin jää enemmän turvamarginaalia.
 
No niin, projekti on saatu päätökseen ja on siis pienen "loppuraportin" aika.
Tavoitteena oli siis saada talon teknisessä tilassa olevien erilaisten kiertovesiputkien lämpötilat seurantaan mittaamalla niiden pintalämpötilaa ds18b20 anturien muodostamalla 1-wire-verkolla ja keräämällä data Raspberry Pi:llä Zabbix-valvontajärjestelmään sekä Home Assistant taloautomaatioon.
Mitään varsinaista aikapainetta ei (onneksi) ollut ja projekti venähti reilusti yli vuoden mittaiseksi kaikenlaisesta ympäröivästä elämästä johtuen.

Ensimmäisessä versiossa 1-wire-väylä oli kytketty suoraan Raspberry Pi:n GPIO-pinneihin. Se toimi ihan hyvin, kunnes verkkoon kytkettiin 14. anturi ja ilmeisesti virran vähyydestä johtuen verkosta tuli epästabiili ja lopulta lakkasi toimimasta. 13 anturia ei tavoitteisiin nähden ollut riittävästi, joten lisäselvittelyjen jälkeen päädyin lopulta kaksinkertaistamaan projektin budjetin ja tilasin ds9490r USB-to-1-Wire -adapterin. Tällä ongelma lopulta ratkesi ja nyt seurannassa on 24 anturia ja järjestelmä toimii hyvin.

Seuraavat osat tarvittiin:
- ds18b20 antureja, n. 20€ Ebay
- ds9490r adapteri, n. 50€ Partco.fi
- rj11-rj11 eli puhelinkaapeleita, n. 20€ Ebay
- rj11-hubeja 5 kpl, n. 6€ Ebay
- Raspberry Pi 1B, 0€ romulaatikosta
+ muuta sälää, kuten jotain työkaluja, kolvaustarpeet, kutistesukkaa, nippusiteitä, putkieristettä jne.

Ja tältä se toteutus nyt sitten näyttää:
20200707_162602.jpg


Kytkentä on sama, jonka kuvasin jo ylempänä, mutta Raspissa on siis kiinni ds9490r josta se 1w-verkko lähtee niiden GPIO-pinnien sijaan.
1594128640962.png


Softapuolella pohjalla on tietenkin Raspbian.
ds9490r:n mukaan tullessa päädyin ottamaan OWFS:n käyttöön tuottamaan rajapinta 1-wire-verkkoon. Se vaatii alleen owserver-paketin, lisäksi asensin ow-shell paketin, joka toi owdir-työkalun, millä owfs-debukkaus oli helpompaa.
Kalibroin anturit laittamalla ne samaan pussiin kahden Ruuvitag-sensorin kanssa ja totesin, että tarkkuuksissa oli yllättävän suuria, jopa yli asteen heittoja. Varmaan valitsin liian halvat anturit, mutta joka tapauksessa päädyin tallentamaan kustakin anturista offset-arvon toisaalla olevaan tietokantaan, josta ne luetaan aina käynnistyksessä.
Luetut arvot julkaistaan MQTT-palveluun, josta ne sitten luetaan tarvittavasti sinne Zabbixiin ja HomeAssistantiin.
Tämän kaiken toteuttava ohjelmanpätkä on kaikessa yksinkertaisuudessaan tässä:
Python:
#!/usr/bin/env python3

import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish
import mysql.connector
import pyownet
import time

# Initialize MQTT
mqtt = mqtt.Client("temp")
mqtt.connect("<mqtt-host>")

# Query sensors from the DB
db = mysql.connector.connect(
    host="<mysql-host>", database='<sensor-db>',
    user="<username>", passwd="<password>")
c = db.cursor()
c.execute('SELECT sensor_id, offset FROM ds18b20')
sensors = c.fetchall()
db.close()

# Initialize OWFS
owproxy = pyownet.protocol.proxy(host='localhost', port=4304)
owdir =  owproxy.dir(slash=False, bus=False)

while True:
    for sensor in owdir:
        stype = owproxy.read(sensor + '/type').decode()
        if stype == 'DS18B20':
            sid = "28-" + owproxy.read(sensor+'/r_id').decode().lower()
            offset = [element[1] for element in sensors if element[0] == sid];
            temp = round(float(owproxy.read(sensor+'/temperature')) + float(offset[0]),1)
            #print("debug: %s %.1f %s" % (sid, temp, str(offset[0])))
            mqtt.publish("home/tn_temp/"+sid, str(temp), retain=True)
    time.sleep(30)

Tuolla skriptissä on ikilooppi ja se on asennettu systemd-serviceksi ja käynnistyy aina palvelimen bootissa. On siis koko ajan päällä.

Ja siellä Zabbixissa graafit näyttävät nyt sitten lopulta tältä:
1594128832624.png


Projektin pääasiallinen tavoite oli lisätä ymmärrystä talotekniikasta. Se täyttyi kirkkaasti ja olen nyt pystynyt tekemään tarkentavia säätöjä esim. huoneiden lämpötilojen suhteen. Tuskin tämä projekti koskaan tulee rahallisesti maksamaan itseään takaisin, mutta se ei tässä ollutkaan varsinaisesti ollut tavoitteena.
Lisäksi tuli opittua aika paljon ainakin 1-wire-verkoista, Python-koodauksesta, OWFS:stä, juottamisesta, kaapeleiden itse teosta, Home Assistantista. Joten voin kyllä sanoa, että aika kirkkaasti meni voiton puolelle tämä projekti.

Paljon kiitoksia kaikille keskusteluun osallistuneille ja apua tarjonneille! Ilman teitä en olisi saanut tätä projektia näin hienosti maaliin.
@Markok, @Zyrppa, @vesas, @ississ, @JaniKari, @Hyrava, @hau
 

Statistiikka

Viestiketjuista
258 146
Viestejä
4 487 996
Jäsenet
74 159
Uusin jäsen
kahvirommi

Hinta.fi

Back
Ylös Bottom