Keresés

Új hozzászólás Aktív témák

  • krisztián28

    csendes tag

    Szervusztok!
    Örömmel látom, hogy magyar nyelven is indult fórum a "házilag kivitelezhető" okos otthonról.
    Nagyon tetszik és érdekel is a téma, így kb 3-4 hónappal ezelőtt én is belevágtam a saját okos otthonunk megvalósításába,,,
    Jelenleg egy Raspberry Pi 3-on fut egy Domoticz.
    Amikor a lakás elektromos rendszerét építettük, akkor majdnem mindenhova ki lett építve a gyengeáramnak is csövezés.
    Minden csőbe behúztam 4 szál vezetéket (GND, 3,3V; 5V; 12V). Egy 600W-os jobb minőségű ATX táppal sikerült megoldani központilag egy helyről a tápellátást is, minden modulnak.
    Jelenleg ESP8266-ra épülő vezérlőkkel és az ESP EASY szoftverrel csatlakoztatom az érzékelőket (nyomógomb, páratartalom, hőmérséklet, PIR stb.) és a szilárdtest reléket (SSR).
    433Mhz-es elektromos redőnyeink vannak, ezeket pedig egy RFlink Gateway vezérli.

    Most, hogy végigolvastam a fórumot, nagyon megtetszett a MySensors féle variáció, szimpatikusabb mint az ESP8266 Wifi rendszeren való vezérlés.
    Kíváncsiságképpen vettem egy pár darab Arduino NANO-t és NRF24L01 antennákat.
    Tegnap összeraktam a Serial gateway-t, egy másik NANO-ra pedig egy RelayActuator-t. Annyi különbséggel, hogy nem sima relét hanem SSR-t raktam rá.
    Nagy volt az öröm, mert minden elsőre szépen működött. Dugdosós panelen összeraktam a dimmer vezérlést is egy kis darab 12V-os LED szalaggal, az is elsőre működött :) :) :)
    A kétféle vezérlő között (MySensors és ESP8266) annyi különbséget már felfedeztem, hogy a MySensors sokkal gyorsabban komunikál a Domoticz-el.
    Szimpatikus, hogy vannak előre megirt programok (sajnos programozni nem tudok).
    Így most úgy döntöttem, hogy lecserélem az eddigi összes vezérlést MySensors-ra.
    Egyetlen problémám annyi, hogy jó lenne ha egy Arduino NANO-ra, UNO-ra, vagy akár MEGA-ra (54db I/O láb) több érzékelőt is rá lehetne kötni.
    Például egy MEGA-ra mondjuk 8-10 db SSR-t, hőmérséklet érzékelő szenzorokat, mozgásérzékelő szenzorokat stb...
    Azért is lenne fontos, mert most is több érzékelő van 1 db ESP8266-ra kötve és a rajta futó programban (ESP EASY) vannak kükön-külön beállítva a lábak, hogy melyikre milyen eszköz van csatlakoztatva.
    Kérdésem annyi lenne, hogy ez kivitelezhető? Mennyire bonyolult átírni/megírni a programot?
    Esetlegesen az is megoldható lenne, hogy a Serial gateway-re is tudjak érzékelőket kötni???
    Előre is köszönöm mindenkinek az építő jellegű hozzászólásokat :)
    További szép napot mindenkinek! :) :) :)

  • krisztián28

    csendes tag

    válasz Yoshida #458 üzenetére

    Szia.
    Köszönöm a válaszod, akkor próbálkozom vele, hátha összejön.
    Ha esetleg a sketchet megosztanád azt megköszönném, hátha sikerül kisilabizálnom belőle, hogy hogy is kell "összeollózni".
    Előre is köszönöm :) :) :)

  • krisztián28

    csendes tag

    Sziasztok!
    Tudtok olyan kapcsolásról és programról amivel RGB led szalagot lehetne vezérelni Domoticz segítségével?
    Olyanra gondolok ami már tesztelt és tuti, hogy működik. Lehet ESP8266, vagy akár Arduino + NRF24L01.
    Előre is köszönöm!
    További szép napot!

  • krisztián28

    csendes tag

    Szervusztok!
    Találtam a neten egy előre megírt programot Arduino Nano-ra. (MySensors)
    Maga a progi annyit tud, hogy 1 nyomógomb megnyomásakor 1 relét vagy egyéb eszközt bekapcsol és mindaddig bekapcsolva tartja amíg nem történik újabb gombnyomás.
    Annyiban sikerült átírnom a programot, hogy most 6 külön kimenete és 6 különböző nyomógomb bemenete van. Ez tökéletesen működik is :)
    Szeretnék még több kimenetet és bemenetet felhasználni , esetleg még későbbiekben más érzékelőket is rákötni, de a Nano-n már nincs több pin :((
    A kérdésem annyi lenne, hogy esetlegesen az egész megírt programot fel lehetne tölteni egy Arduino Mega-ra?
    Illetve úgy feltölteni, hogy működjön is. Sajnos hiába töltöm fel a Mega-ra a programot nem akar működni... :(
    Előre is köszönöm :R

  • krisztián28

    csendes tag

    válasz layerke #471 üzenetére

    Köszönöm a válaszod! :R
    Akkor ha jól értem akkor csak a Nano-val vagy a Mini-vel érdemes próbálkozni...

  • krisztián28

    csendes tag

    Sziasztok!

    Egy kis segítségre lenne szükségem.

    Domoticzról lenne szó.
    Adott egy világítás, amit egy nyomógombbal szeretnék ki - be kapcsolni, amolyan "impulzus relés" megoldás. Külön elektronika veszi a nyomógomb jelét és külön elektronika felelős a lámpa felkapcsolásáért. A gomb csak a megnyomás pillanatában küld "on" jelet a Domoticz számára, egyébként "off" állapotban van. Tehát azt szeretném, hogy gombnyomásra az adott világítás kapcsoljon be, a következő gombnyomásra padig ki. (Későbbiekben szeretném ezt a világítást több helyről kapcsolgatni ugyanígy nyomógombokkal.)

    A Domoticzen belül az "események" beállításoknál próbáltam létrehozni egy blocky examples-t.

    Ami nem teljesen úgy működik ahogy szeretném... Amikor a gombot megnyomom akkor csak villog a lámpa :Y
    Van valakinek ötlete, hogy mit ronthattam el???
    Előre is köszönöm az építő jellegű hozzászólásokat! :R
    További szép napot mindenkinek! :)

  • krisztián28

    csendes tag

    válasz balibatyo78 #501 üzenetére

    Szia!
    Nagyon szépen köszönöm a segítséged! :R :R :R :R :R
    Tökéletesen működik :C :C
    Szép napot!

  • krisztián28

    csendes tag

    válasz pomk #510 üzenetére

    Szia.
    Elképzelhető, hogy a szolgáltatói routeren a wifi csatornán kellene állítani, ammenyiben ez lehetséges :)

  • krisztián28

    csendes tag

    válasz qqzs #794 üzenetére

    Szia

    Nálam 6 db SmartHome "márkájú" rádiós vezérlésű redőnymotor van felszerelve.
    Raspberry pi 3-on van egy Domoticz telepítve amihez USB-n csatlakozik egy RFlink gateway 433Mhz-es modullal.
    Már több mint egy éve tökéletesen működik! :)

  • krisztián28

    csendes tag

    válasz qqzs #800 üzenetére

    Szia!

    Itt van még két link...
    Annó itt vettem a szettet, ezt csak össze kell rakni, a legfrissebb firmware-t rátölteni USB-n keresztül a szettben található Arduino Mega-ra, utána csatlakoztatni rá a 433Mhz-es modult. Ezek után csak csatlakoztatni kell az egészet a Raspberry Pi-hez USB-n keresztül. Egy-két beállítás még szoftveresen a Domoticz-on belül és már működik is! Bármilyen 433Mhz-es eszközt tudsz vele vezérelni, (redőny, dugalj, termosztát, stb...) illetve 433Mhz-es eszközök küldött adatait ki tudod olvasni. P.: időjárás állomás, ajtónyitás érzékelő, mozgás érzékelő.
    Itt van még egy videó is, hogy a rendelt cuccot, hogy kell összerakni :)
    És még egy link

    További szép napot mindenkinek! :)

  • krisztián28

    csendes tag

    Sziasztok!

    Valaki használ közületek jelenlét érzékelőt?
    Azt szeretném megoldani, hogy ha a fürdőszobába belépek akkor kapcsoljon fel a villany, ha pedig elhagyom a helységet akkor le. A mozgásérzékelős megoldás nem jó, mert ha mondjuk a tükör előtt épp valaki fogat mos és mondjuk nem mozog annyira, hogy a PIR érzékelje akkor lekapcsol a villany. Tehát valami olyan érzékelőre lenne szükség ami addig ad jelet amíg a helységben tartózkodom.
    Domoticz-ot, ESPEASY-t és MySensor-t használok.
    Valakinek ötlete?
    Előre is köszönöm!

  • krisztián28

    csendes tag

    válasz Norby-007 #1148 üzenetére

    Egy spárga végére kötött kis papír zsebkendő vagy vatta és egy erős porszívó csodákra képes ha semmiképp nem tudod a behúzót a csövekbe betolni!
    Nekem már nagyon sokszor segített ez a megoldás!

  • krisztián28

    csendes tag

    válasz Gh0sT #1244 üzenetére

    Szia!

    Igen jól gondolod!
    1 db arduino nano-ra rátöltöd usb-n keresztűl az alábbi programot, majd ha kész van akkor az alábbi leírás szerint csatlakoztatod hozzá az NRF 24L01 antannát female-female
    vezetékkel (figyelj a vezetékekre, mert nekem volt már, hogy hibás volt és nem akart működni). Majd csatlakoztatod a Domoticz-ot futtató vashoz. Ezek után a beállítások -> hardver résznél hozzáadod mint MySensors Gateway USB. Ezek után már fel fogja ismerni a Domoticz a MySensors-os eszközöket.

    Én személy szerint a szenzoroknál és egyéb eszközöknél is arduino nano-t használok, mert var rajta usb csati (egyszerűbb programot rátölteni), ezzel szemben a minin nincs. Mondjuk a mini egy kicsit kevesebb helyet foglal, ha ez számít. A nano-n van 3,3V és 5V-os kivezetés is. így az 5 és a 3.3V-os eszközöket is egyszerűen csatlakoztatni tudod rá.

  • krisztián28

    csendes tag

    válasz krisztián28 #1248 üzenetére

    Még annyi, hogy az általam linkelt eBay-es eladótól szoktam leginkább vásárolni, és nem nagyon volt még a "termékeivel" probléma. Általában 3-4 hét alatt meg is érkezik a megrendelt cucc. :)

  • krisztián28

    csendes tag

    válasz Gh0sT #1250 üzenetére

    Mindenképp kell a másik oldalra is antenna, hiszen e nélkül nem tudnának kommunikálni.
    Nálam a tápellátást egy 600W-os ATX tápegység intézi, a raspberry a +5V standby-ra van kötve így ha a táp "ki van kapcsolva" (a zöld vezeték nincs GND-re kötve) a Raspberry 3 akkor is megy.
    A tápegységet pedig Domoticz alól le tudom kapcsolni, ha esetleg valamelyik szenzorral vagy arduino-val gond lenne.
    A lakásban van gyenge áramnak külön csövezés kiépítve így mindenhova ki van húzva a 3.3V, 5V és a 12V, illetve egy 12 eres riasztó vezeték is amit későbbiekben BUS rendszernek akarok használni (ezt lehet, hogy UTP-re fogom cserélni mert nem tudom mennyire lesz rajta stabil az RS485 kommunikáció), ugyanis a MySensors-nak van RS485-ös BUS rendszerű kommunikációja is abban az esetben meg nem kell telerakni antennákkal az egész lakást. Kevesebb az elektroszmog. :)

    Elemekkel és akkumulátorokkal még nem működtettem MySensors dolgokat, így ebben nem tudok sajnos segíteni!

    [ Szerkesztve ]

  • krisztián28

    csendes tag

    válasz BullZeye #1316 üzenetére

    Szia!

    Én is Smart Home-os motorokat használok. Azokból is a rádiós kivitelt. 433MHz-en kommunikál amihez tökéletesen illeszthető az RFlink! Nálam lassan 1 éve hiba nélkül működik.
    Domoticz vezérli, reggel felhúzódnak este pedig napnyugtakor lehúzódnak!
    Nálam ilyen motorok mennek.

  • krisztián28

    csendes tag

    válasz itanczos #1337 üzenetére

    Szia!
    Nálam csak egy irányú a vezérlés, de eddig ez nem okozott problémát (a motorok a végállásnál úgy is megállnak). Olyat lehet esetleg, hogy Domoticz-ban külön virtuális gombok vannak a redőny vezérlésére: Le, Fel, Stop. Tehát a Stop gombbal bármilyen állapotnál megállítható a redőny. Vagy esetlegesen a vezérlést úgy állítod be, hogy mondjuk kapjon egy "Le" parancsot, majd utána 5mp után kapjon egy Stop parancsot, így tudnád mondjuk azt állítani, hogy meddig húzódjon le a redőnyöd.
    A másik lehetőség, hogy valamilyen enkódert vagy trimmer potmétert teszel a motor végére és abból tudod az állapotát lekérdezni.
    Ebben az esetben viszont sima vezetékes motorokat vennék és építenék hozzá egy vezérlést ESP8266-al vagy Arduino-val amin mondjuk egy MySensor működne...
    (Én személy szerint ezt a lehetőséget választanám ha most építenék hasonlót, viszont a meglévő már kész és számomra tökéletesen működik. A másik visszatartó dolog az, hogy sajnos hülye vagyok a programíráshoz :(( :(( )

    Szerk,:Most jutott eszembe, hogy ha jól emlékszem az ESPEASY -ben lehet analóg lábon lekérdezni értékeket. Ha esetleg az analóg lábra lenne valamilyen módon csatlakoztatva egy trimmer potméter akkor szerintem viszonylag egyszerűen lekérdezhető lenne a redőny állapota...

    [ Szerkesztve ]

  • krisztián28

    csendes tag

    válasz itanczos #1344 üzenetére

    Szia!
    Itt egy link.
    Ebben minden benne van ami kell neked :C :))
    Ha jól olvasom akkor százalékosan érzékeli is a redőnyök állapotát.
    Dugdosós panelon össze kell rakni megnézni, hogy hogy is működik!

  • krisztián28

    csendes tag

    válasz mekkGyver #1418 üzenetére

    Nekem például azért szimpatikusabb a mysensors mert sokkal inkább realtime mint az espeasy-s esp8266.
    Magyarán ha mondjuk mysensors-al kapcsolgatok egy fényforrást domoticz-on keresztül akkor azonnal felkapcsol a világítás, míg espeasy esetében vagy egy kis késés 1-1,5mp. Vagy pl. volt olyan hogy hirtelen ki-be kapcsoláskor megbolondult az egész espeasy és diszkóba illő fényeffektet varázsolt a nappaliba (folyamatosan ki-be kapcsolgatott amíg újra nem indítottam).
    Lehet, hogy ha írnék egy saját programot az esp8266-ra akkor ez a hiba pl. kiküszöbölhető lenne... Egyetlen problémám, hogy nem tudok programot írni, így "hozott anyagból dolgozom".
    Mellékesen jegyzem meg, elképzelhető, hogy csak én bénáztam el valamit és azért volt vele negatív tapasztalatom. Lehet az is, hogy ha MQTT-vel vezérelném akkor másképp viselkedne, de sajnos fogalmam sincs, hogy mi az az MQTT.
    Az espeasy-ben tetszik, hogy egyszerre több érzékelőnek be tudom hívni az adatait vagy több dolgot tudok vele kapcsolgatni, vagy "mindent" vegyesen "egy" eszközzel meg lehet oldani.
    A mysensors-nál is gondolom van erre lehetőség csak ott meg a programíráshoz kellene konyítani, legalább annyira, hogy több előre megírt programot össze tudjak ollózni és így lehetne 1 db arduino-val szintén több dolgot írányítani vagy több féle érzékelő értéket kiolvastatni. De programozás tudásának hiányában ez is felejtős...
    Így marad az hogy minden érzékelő kap 1 arduino-t :))

    [ Szerkesztve ]

  • krisztián28

    csendes tag

    válasz kleinguru #1428 üzenetére

    Ha okos TV-d van akkor érdemes lenne akár pingelni az ip címét... A Domoticz tud ilyet :)

  • krisztián28

    csendes tag

    válasz Gh0sT #1449 üzenetére

    Szia!
    Nézd meg ezt a rajzot, szerintem pont azt tudja ami kell neked. :)
    Egyébként a converternek van 2 db bemenő vezetéke + és GND és van két kimenő vezetéke + és GND tehát a bekötése nem bonyolult.

    [ Szerkesztve ]

  • krisztián28

    csendes tag

    válasz mekkGyver #1457 üzenetére

    Az nrf24l01 modul miatt gondoltam, hogy szüksége lehet a 3.3V-ra :)

  • krisztián28

    csendes tag

    Sziasztok!
    Valamelyikőtök leírná ha van ideje rá, hogy mégis mit tud az MQTT?
    Mi is ez? Hogy kell használni? Hogy kell konfigurálni?
    Sajnos magyar nyelven nem sok mindent találtam róla :(
    Van egy rahedli esp8266-os cuccom, de mivel nem teljesen voltam elégedett a "sebességével" (Domoticz HTTP protokollt használtam) ezért parkolópályára tettem őket és inkább a MySensors felé indultam. Most viszont kipróbálnám az espeasy-t Domoticz MQTT-n keresztül kommunikálni a Raspberry-n futó Domoticz-al.
    Viszont nem tudom, hogy merre induljak...
    Előre is köszönöm ha valamelyikőtök szán erre időt és megfogalmazza egy pár mondatban.
    Lehetséges, hogy a többieknek is segítség lenne :)) :))

  • krisztián28

    csendes tag

    Itanczos és MekkGyver nagyon szépen köszönöm, hogy szántatok rá ídőt, hogy elmagyarázzátok hogy mi is az MQTT. Hát ezt nekem még fel kel fognom... :)

  • krisztián28

    csendes tag

    válasz Norby-007 #1502 üzenetére

    A vízóra aknába szerintem tegyél gyengeáramú elzárót. Így az aknába nem kell 230V-ot levinni. :)

  • krisztián28

    csendes tag

    válasz Norby-007 #1532 üzenetére

    A digi-s eszközöd jelenleg router üzemmódban van!
    Üsd be a bőngészödbe az alábbi címet: 192.168.100.1 majd felhasználónév: user, jelszó: digi.
    És már benn is vagy a router felületén :)

    [ Szerkesztve ]

  • krisztián28

    csendes tag

    Sziasztok!

    MQTT-vel kapcsolatban kellene még egy kis segítség...
    Feltelepítettem a PI-re az MQTT brokert, az elvileg működik is rendesen.
    Adott egy D1 mini amin ESP EASY fut. Domoticz MQTT protokollt állítottam be a kommunikációhoz. Na most a Domoticz látja az ESP-t, egy virtuális kapcsolót tudok is vele kapcsolgatni ha rövidre zárok két vezetéket ami a D1 minire van csatlakoztatva. Ezt a Domoticz-ban az esemény fül alatt látom is, hogy vette a jelet. Ez eddig szép és jó... Viszont, hogy tudom a Domoticz alól vezérelni a D1 minit? Mondjuk az egyik lábra magas jelet szeretnék küldeni? Ahogy nézegettem az on illetve off parancshoz is valami scriptet kellene írnom? Ha így van akkor ezeket a scripteket hova kell bemásolni? Hogy kell megírni? Mit kell hogy tartalmazzon? Külön script kell mondjuk egy "be" kapcsoláshoz és külön egy a "ki" kapcsoláshoz?

    Előre is köszönöm a segítséget!

  • krisztián28

    csendes tag

    Sziasztok!

    Valaki állított már be impulzus jeladós vízórát ESP EASY-ben Domoticz alatt?
    Nem nagyon akar értelmes értéket adni... lehet, hogy én rontok el valamit...

  • krisztián28

    csendes tag

    Szervusztok!

    Vásároltam egy RS-485 kommunikációval rendelkező fogyasztás mérőt.
    Hogyan lehetne Domoticz-al kiolvasni az adatokat róla? (Raspberry Pi-n fut a Domo...)
    Vettem hozzá usb-s RS 485 átalakítót is..

    Előre is köszönöm a segítséget.

    [ Szerkesztve ]

  • krisztián28

    csendes tag

    válasz qqzs #2016 üzenetére

    Szia!

    A magyar okos otthonos cég szerintem a Chameleon :)
    A 2.4 GHz jelet pedig tudja az RFlink vezérelni! :)

  • krisztián28

    csendes tag

    Sziasztok!
    Úgy emlékszem, hogy valaki említette itt a fórumon, hogy használ RS 485 porton kommunikáló fogyasztásmérőt... Szeretnék kérni egy ilyen fogyasztásmérő beállításában egy kis segítséget Domoticz alá.
    Előre is nagyon köszönöm :)

  • krisztián28

    csendes tag

    válasz Pulsar #2161 üzenetére

    Így van! Annyi a különbség, hogy raktam még rá egy kék színű ledet, amit a relével kötöttek sorba. Tehát ha a relé behúzott állapotban van akkor világít a kék led is! :)

    [ Szerkesztve ]

  • krisztián28

    csendes tag

    válasz itanczos #2366 üzenetére

    Szia!

    Én biztos nem merném rákötni az egész lakás/ház betápját egy Sonoff POW-ra még ha rá is van írva, hogy papíron 16A-t bír!
    Inkább nézz valami kalapsínre pattintható digitális fogyasztásmérőt! Ez pl. tud impulzus jelet is küldeni és MODBUS rendszeren RS485-ön is komunikál. :)
    A MODBUS-on keresztül pedig minden infót, akár pillanatnyi fogyasztást ki tudsz róla olvasni.
    Én vettem ilyen mérőt, jól működik bár sajnos még Domoticz alá nem tudtam "beintegrálni".
    Van róla leírás a neten csak nem egészen értem ezért ez még várat magára.

  • krisztián28

    csendes tag

    Szervusztok!

    Segítséget szeretnék kérni.
    Adott egy konyhai szagelszívó aminek három fokozata van a ventilátor sebességének kapcsolására. ESP EASY alatt egy D1 minivel szeretném megtudni hogy az adott szagelszívó bármelyik sebességen működik-e vagy kikapcsolt állapotban van. A szagelszívót nem szeretném megbontani és a belsejében változtatásokat eszközölni! Az ötletem az lenne, hogy az elszívó betáp kábelén figyelném a fázis vezetéket, hogy mekkora áramerősség folyik rajta, ezt az értéket kéne valahogy illesztenem a D1 mini egyetlen analóg lábára ami ha jól tudom csak 0-1V -ig képes mérést végezni.
    Van erre esetleg valakinek ötlete vagy látott esetleg a neten valami kapcsolást vagy érzékelő szenzort erre a célra? Nagyon fontos lenne, hogy ESP EASY alatt működni tudjon!

    Esetleg egy Sonoff pow esp easy firmware-vel jó lehetne a feladatra?

    Előre is köszönöm az építő jellegű hozzászólásokat!

  • krisztián28

    csendes tag

    Sziasztok!

    Van ötletetek arra, hogy MySensorral hogy lehetne megoldani egy led szalagnak a dimmelését.
    Egy fali nyomógombbal szeretném még vezérelni a domoticzen kívül.
    Ha röviden megnyomom a nyomógombot akkor ki - be kapcsol a led szalag, ha hosszan nyomva tartom akkor pedig dimmel.
    Előre is köszönöm a segítséget!

  • krisztián28

    csendes tag

    válasz JoHn123 #3636 üzenetére

    Szia!

    A fent említett feladatra szerintem egy kalapsínre patttintható fogyasztás mérő a legjobb megoldás! Ebből is érdemes olyat beszerezni, ami modbus (RS485) protokollon kommunikál. A lényeg az , hogy a fogyasztási értékeket, és egyéb adatokat Feszültség (V), Áramerősség (A), Frekvencia (Hz), Fogyasztás (W) a készülék saját magában tárolja és ezeket a tárolt értékeket lehet modbus rendszeren kiolvasni belőle.
    (A kommunikációhoz kell még egy usb -> rs485 konverter ami eBay-n kb 300,-.)
    Én vásároltam ilyen eszközt be is van kötve, működik is szépen pontosan mér (az ELMŰ órájával megegyező fogyasztási értéket mutatja). Egy problémám van csak vele, hogy domoticzon keresztül nem sikerült értékeket kiolvasnom belőle. Ez leginkább valószínű, hogy az én tudatlanságom számlájára írható. Szívesen venném, ha sikerült ezt már valakinek megoldani akkor igazán megosztaná az itt jelen levőkkel....
    Én nagyon hálás lennék érte!!!

    Egy két link, hogy én miket vettem:
    Fogyasztásmérő
    USB->RS485
    Egy két leírás amit találtam a Domoticzhoz
    Ez egy külön plugin amit Domoticz alá lehet telepíteni és képes olvasni és írni modbus protokollon kommunikáló eszközöket.

    Itt van még egy másik féle leírás is

    [ Szerkesztve ]

  • krisztián28

    csendes tag

    válasz jedie82 #3952 üzenetére

    Szia!

    Nálam is üzemel egy pár MySensors-os kütyü!
    Nekem is egy arduino nano usb-vel összekötve a RPI-vel a gateway, ezen van egy NRF24 antenna.
    Ehhez kapcsolódik több "kliens" ami ugyanúgy arduino nano és egy NRF24 antennából áll.
    Ezek stabilan jól működnek!
    A minap viszont én is próbáltam ráerőszakolni egy megát a rendszerre, de nem jártam sikerrel! Hasonló hibaüzeneteket kapok min Te! Úgy néz ki, hogy a megával nem igazán akar működni! Próbáld meg először, ha lehetőséged van rá, egy másik nanoval megoldani a "kliens" oldalt, legalább egy próba erejéig!

    Viszont, ha már így a MySensors került szóba valaki tudna tanácsot adni, hogy hogy kell összeollózni több sketch-et, hogy az működjön is?
    Szeretnék egy arduinóra többféle érzékelőt (DS18b20), impulzus mérőt (vízórához) és SSR-t (fűtés kapcsolásra) is felkötni.

    Előre is köszönöm szépen!

  • krisztián28

    csendes tag

    Sziasztok!
    Segítséget szeretnék kérni!
    Adott egy MySensors sketch ami egy ledet hivatott dimmerelni.
    Szeretném duplikálni, magyarul egy Arduino Nanoval két külön led szalagot vezérelni két külön nyomógombbal.
    Programozásban nem vagyok jártas, de megpróbáltam átírni a programot viszont nem igazán úgy működik ahogy kéne.
    Valaki ránézne, hogy mit rontottam el? :F :F :F

    /*
    Board Transmit Receive PWM Unusable
    ----- -------- ------- ------------
    Arduino Uno 9 8 10
    Arduino Mega 46 48 44, 45
    */

    #define SN "tobb_led_dimmer_teszt_proba"
    #define SV "1.0"

    #define MY_DEBUG
    #define MY_NODE_ID 10
    #define MY_RS485
    #define MY_RS485_DE_PIN 2
    #define MY_RS485_BAUD_RATE 9600

    #include <OneButton.h>
    #include <MySensors.h>

    #define CHILD_ID_LIGHT1 1
    #define CHILD_ID_LIGHT2 2
    #define LED1_PIN 6 //nappali fehér led
    #define LED2_PIN 7 //előszoba led
    #define BUTTON1_PIN 3 //nappali fehér led gomb GND-re
    #define BUTTON2_PIN 4 //előszoba led gomb GND-re
    #define FADE_DELAY 10 // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)

    byte ledLevel;
    boolean ledDimWay;

    OneButton button1(BUTTON1_PIN, false);
    OneButton button2(BUTTON2_PIN, false);

    void setup()
    {

    // Setup the buttons
    pinMode(BUTTON1_PIN, INPUT_PULLUP);
    pinMode(BUTTON2_PIN, INPUT_PULLUP);

    button1.attachClick(click1);
    button1.attachDuringLongPress(press1);
    button1.attachLongPressStart(pstart1);
    button1.attachLongPressStop(pstop1);

    button2.attachClick(click2);
    button2.attachDuringLongPress(press2);
    button2.attachLongPressStart(pstart2);
    button2.attachLongPressStop(pstop2);

    // Pull the gateway's current dim level - restore light level upon sendor node power-up
    request(CHILD_ID_LIGHT1, V_DIMMER);
    request(CHILD_ID_LIGHT2, V_DIMMER);
    }

    void presentation()
    {
    sendSketchInfo(SN, SV);

    // Register the LED Dimmable Light with the gateway
    present(CHILD_ID_LIGHT1, S_DIMMER, "nappali fehér led");
    present(CHILD_ID_LIGHT2, S_DIMMER, "előszoba világítás");
    }

    void loop()
    {
    button1.tick();
    button2.tick();
    }


    void receive(const MyMessage &message)
    {
    if (message.type == V_LIGHT || message.type == V_DIMMER) {

    // Retrieve the power or dim level from the incoming request message
    int requestedLevel = atoi(message.data);

    // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
    requestedLevel *= ( message.type == V_LIGHT ? 100 : 1 );

    // Clip incoming level to valid range of 0 to 100
    requestedLevel = requestedLevel > 100 ? 100 : requestedLevel;
    requestedLevel = requestedLevel < 0 ? 0 : requestedLevel;

    setLED(requestedLevel);
    }
    }

    void setLED(byte level)
    {
    //Fade LED to set level
    int delta = (level - ledLevel) < 0 ? -1 : 1;

    while (ledLevel != level)
    {
    ledLevel += delta;
    analogWrite(LED1_PIN, (int)(ledLevel / 100. * 255) );
    analogWrite(LED2_PIN, (int)(ledLevel / 100. * 255) ); //????????????????????????jó????
    delay(FADE_DELAY);
    }

    MyMessage lightMsg1(CHILD_ID_LIGHT1, V_LIGHT);
    MyMessage dimmerMsg1(CHILD_ID_LIGHT1, V_DIMMER);
    MyMessage lightMsg2(CHILD_ID_LIGHT2, V_LIGHT);
    MyMessage dimmerMsg2(CHILD_ID_LIGHT2, V_DIMMER);

    send(lightMsg1.set(ledLevel > 0));
    send(dimmerMsg1.set(ledLevel));
    send(lightMsg2.set(ledLevel > 0));
    send(dimmerMsg2.set(ledLevel));
    }

    void writeToLED()
    {
    analogWrite(LED1_PIN, map(ledLevel,0,100,0,255));
    analogWrite(LED2_PIN, map(ledLevel,0,100,0,255));
    }

    void click1() {setLED(ledLevel>0 ? 0 : 100); }
    void pstart1() {ledDimWay = ledLevel<100; }
    void press1() {if(ledDimWay && ledLevel<100) ledLevel++; if(!ledDimWay && ledLevel>5) ledLevel--; writeToLED(); delay(25); }
    void pstop1() {setLED(ledLevel); }

    void click2() {setLED(ledLevel>0 ? 0 : 100); }
    void pstart2() {ledDimWay = ledLevel<100; }
    void press2() {if(ledDimWay && ledLevel<100) ledLevel++; if(!ledDimWay && ledLevel>5) ledLevel--; writeToLED(); delay(25); }
    void pstop2() {setLED(ledLevel); }

    Köszönöm előre is!

  • krisztián28

    csendes tag

    válasz itanczos #4281 üzenetére

    Szia!
    Köszönöm, hogy ránéztél! Nem szándékosan nem dupláztam azokat, azt hittem, hogy mást nem kell duplikálni...
    Átnézem még egyszer. :)

  • krisztián28

    csendes tag

    válasz layerke #4283 üzenetére

    Szia!

    Abszolút igazad van!

    Némileg módosítottam a programot, alább fel is töltöm...

    Annyi a lényeg, hogy az első led tökéletesen működik, lehet dimmelni, ki és bekapcsolni (bekapcsoláskor és kikapcsoláskor is van fade-lése) nyomógombról és a domoticz alól is.
    A második led viszont ha például megnyomom a második nyomógombot akkor a gomb hatására fade-lés nélkül bekapcsol majd újabb gombnyomásra fadelés nélkül kikapcsol. Dimmelni nem lehet hosszú gombnyomással. Domoticz alól pedig ha a virtuális gombra kattintok akkor csak az első ledet kapcsolja ki és be.
    Úgy gondolom hogy amit a vázlaton kiemeltem részt, oda kellene még valamit beírni illetve duplikálni, csak azt nem tudom, hogy mit...
    #define SN "eloszoba led"
    #define SV "1.0"

    #define MY_DEBUG
    #define MY_NODE_ID 6
    #define MY_RS485
    #define MY_RS485_DE_PIN 10
    #define MY_RS485_BAUD_RATE 9600

    #include <OneButton.h>
    #include <MySensors.h>

    #define CHILD_ID_LIGHT1 1
    #define CHILD_ID_LIGHT2 2
    #define FADE_DELAY 10 // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
    #define LED1_PIN 6 //led szalag
    #define LED2_PIN 7 //led szalag
    #define BUTTON1_PIN 3 //nyomógomb
    #define BUTTON2_PIN 4 //nyomógomb

    byte ledLevel;
    boolean ledDimWay;
    byte ledLevel2;
    boolean ledDimWay2;

    OneButton button1(BUTTON1_PIN, HIGH); //a 3-as lábat kell GND-re húzni! nyomógomb
    OneButton button2(BUTTON2_PIN, HIGH); //a 3-as lábat kell GND-re húzni! nyomógomb

    void setup()
    {
    pinMode(BUTTON1_PIN, INPUT_PULLUP);

    button1.attachClick(click1);
    button1.attachDuringLongPress(press1);
    button1.attachLongPressStart(pstart1);
    button1.attachLongPressStop(pstop1);

    request(CHILD_ID_LIGHT1, V_DIMMER); // Pull the gateway's current dim level - restore light level upon sendor node power-up


    pinMode(BUTTON2_PIN, INPUT_PULLUP);

    button2.attachClick(click2);
    button2.attachDuringLongPress(press2);
    button2.attachLongPressStart(pstart2);
    button2.attachLongPressStop(pstop2);

    request(CHILD_ID_LIGHT2, V_DIMMER); // Pull the gateway's current dim level - restore light level upon sendor node power-up
    }


    void presentation()
    {
    sendSketchInfo(SN, SV);

    present(CHILD_ID_LIGHT1, S_DIMMER, "előszoba világítás1"); // Register the LED Dimmable Light with the gateway
    present(CHILD_ID_LIGHT2, S_DIMMER, "előszoba világítás2"); // Register the LED Dimmable Light with the gateway
    }


    void loop()
    {
    button1.tick();
    button2.tick();
    }

    //-------------------------------------------------------------------------------------------------------------------------------------------------
    void receive(const MyMessage &message)
    {
    if (message.type == V_LIGHT || message.type == V_DIMMER) {

    int requestedLevel = atoi(message.data); // Retrieve the power or dim level from the incoming request message

    requestedLevel *= ( message.type == V_LIGHT ? 100 : 1 ); // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]

    requestedLevel = requestedLevel > 100 ? 100 : requestedLevel; // Clip incoming level to valid range of 0 to 100
    requestedLevel = requestedLevel < 0 ? 0 : requestedLevel; // Clip incoming level to valid range of 0 to 100

    setLED(requestedLevel);
    }
    }
    //---------------------------------------------------------------------------------------------------------------------------------------------------

    void setLED(byte level)
    {
    int delta = (level - ledLevel) < 0 ? -1 : 1; //Fade LED to set level

    while (ledLevel != level)
    {
    ledLevel += delta;
    analogWrite(LED1_PIN, (int)(ledLevel / 100. * 255) );
    delay(FADE_DELAY);
    }

    MyMessage lightMsg(CHILD_ID_LIGHT1, V_LIGHT);
    MyMessage dimmerMsg(CHILD_ID_LIGHT1, V_DIMMER);

    send(lightMsg.set(ledLevel > 0));
    send(dimmerMsg.set(ledLevel));
    }

    void setLED2(byte level)
    {
    int delta = (level - ledLevel2) < 0 ? -1 : 1; //Fade LED to set level

    while (ledLevel2 != level)
    {
    ledLevel2 += delta;
    analogWrite(LED2_PIN, (int)(ledLevel2 / 100. * 255) );
    delay(FADE_DELAY);
    }

    MyMessage light2Msg(CHILD_ID_LIGHT2, V_LIGHT);
    MyMessage dimmer2Msg(CHILD_ID_LIGHT2, V_DIMMER);

    send(light2Msg.set(ledLevel2 > 0));
    send(dimmer2Msg.set(ledLevel2));
    }


    void writeToLED()
    {
    analogWrite(LED1_PIN, map(ledLevel,0,100,0,255));
    }

    void writeToLED2()
    {
    analogWrite(LED2_PIN, map(ledLevel2,0,100,0,255));
    }

    void click1() {setLED(ledLevel>0 ? 0 : 100); }
    void pstart1() {ledDimWay = ledLevel<100; }
    void press1() {if(ledDimWay && ledLevel<100) ledLevel++; if(!ledDimWay && ledLevel>5) ledLevel--; writeToLED(); delay(25); }
    void pstop1() {setLED(ledLevel); }

    void click2() {setLED2(ledLevel2>0 ? 0 : 100); }
    void pstart2() {ledDimWay2 = ledLevel2<100; }
    void press2() {if(ledDimWay2 && ledLevel2<100) ledLevel2++; if(!ledDimWay2 && ledLevel2>5) ledLevel2--; writeToLED2(); delay(25); }
    void pstop2() {setLED2(ledLevel2); }

  • krisztián28

    csendes tag

    válasz ghck #4286 üzenetére

    Szia!
    Nagyon köszönöm a segítséget!!! Tökéletesen működik így, hogy átírtam egy másik lábra :C :C :C
    Nagy az öröm!!!

    Ha valakit érdekel feltöltöm a működő kódot, hátha valaki hasznát veszi !
    Az eredeti kód nem az én szüleményem! Innen származik!
    Az átalakított programban egy arduino nano RS485-ön kommunikál a központtal ami szintén egy arduino nano ami usb-n van csatlakoztatva egy raspberry pi-re. A gomb megnyomásakor a rákötött led szalag fokozatosan (fadel-ve) bekapcsol 100%-ra, következő gombnyomásra fokozatosan lekapcsol 0%-ra. Ha hosszan tartod nyomva a gombot akkor pedig lehet fényerőt szabályozni. Domoticz alatt is tökéletesen működik ott is lehet ki -be kapcsolni és a csúszkán (át kell állítani dimmerre) is lehet szabályozni a fényerőt. A programban jelenleg összesen 2 db különálló led szalagot lehet szabályozni 2 db nyomógombbal.
    /*
    Board Transmit Receive PWM Unusable
    ----- -------- ------- ------------
    Arduino Uno 9 8 10
    Arduino Mega 46 48 44, 45
    */

    #define SN "eloszoba led"
    #define SV "1.0"

    #define MY_DEBUG
    #define MY_NODE_ID 6
    #define MY_RS485
    #define MY_RS485_DE_PIN 10
    #define MY_RS485_BAUD_RATE 9600

    #include <OneButton.h>
    #include <MySensors.h>

    #define CHILD_ID_LIGHT1 1
    #define CHILD_ID_LIGHT2 2
    #define FADE_DELAY 10 // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
    #define FADE_DELAY2 10 // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
    #define LED1_PIN 6 //led szalag
    #define LED2_PIN 5 //led szalag
    #define BUTTON1_PIN 3 //nyomógomb
    #define BUTTON2_PIN 4 //nyomógomb

    byte ledLevel;
    boolean ledDimWay;
    byte ledLevel2;
    boolean ledDimWay2;

    OneButton button1(BUTTON1_PIN, HIGH); //a 3-as lábat kell GND-re húzni! nyomógomb
    OneButton button2(BUTTON2_PIN, HIGH); //a 3-as lábat kell GND-re húzni! nyomógomb

    void setup()
    {
    pinMode(BUTTON1_PIN, INPUT_PULLUP);

    button1.attachClick(click1);
    button1.attachDuringLongPress(press1);
    button1.attachLongPressStart(pstart1);
    button1.attachLongPressStop(pstop1);

    request(CHILD_ID_LIGHT1, V_DIMMER); // Pull the gateway's current dim level - restore light level upon sendor node power-up


    pinMode(BUTTON2_PIN, INPUT_PULLUP);

    button2.attachClick(click2);
    button2.attachDuringLongPress(press2);
    button2.attachLongPressStart(pstart2);
    button2.attachLongPressStop(pstop2);

    request(CHILD_ID_LIGHT2, V_DIMMER); // Pull the gateway's current dim level - restore light level upon sendor node power-up
    }


    void presentation()
    {
    sendSketchInfo(SN, SV);

    present(CHILD_ID_LIGHT1, S_DIMMER, "előszoba világítás1"); // Register the LED Dimmable Light with the gateway
    present(CHILD_ID_LIGHT2, S_DIMMER, "előszoba világítás2"); // Register the LED Dimmable Light with the gateway
    }


    void loop()
    {
    button1.tick();
    button2.tick();
    }

    //-------------------------------------------------------------------------------------------------------------------------------------------------
    void receive(const MyMessage &message)
    {
    if (message.type == V_LIGHT || message.type == V_DIMMER) {

    if (message.sensor == 1){

    int requestedLevel = atoi(message.data); // Retrieve the power or dim level from the incoming request message

    requestedLevel *= ( message.type == V_LIGHT ? 100 : 1 ); // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]

    requestedLevel = requestedLevel > 100 ? 100 : requestedLevel; // Clip incoming level to valid range of 0 to 100
    requestedLevel = requestedLevel < 0 ? 0 : requestedLevel; // Clip incoming level to valid range of 0 to 100

    setLED(requestedLevel);
    }

    if (message.sensor == 2){

    int requestedLevel2 = atoi(message.data); // Retrieve the power or dim level from the incoming request message

    requestedLevel2 *= ( message.type == V_LIGHT ? 100 : 1 ); // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]

    requestedLevel2 = requestedLevel2 > 100 ? 100 : requestedLevel2; // Clip incoming level to valid range of 0 to 100
    requestedLevel2 = requestedLevel2 < 0 ? 0 : requestedLevel2; // Clip incoming level to valid range of 0 to 100

    setLED2(requestedLevel2);
    }
    }
    }
    //---------------------------------------------------------------------------------------------------------------------------------------------------

    void setLED(byte level)
    {
    int delta = (level - ledLevel) < 0 ? -1 : 1; //Fade LED to set level

    while (ledLevel != level)
    {
    ledLevel += delta;
    analogWrite(LED1_PIN, (int)(ledLevel / 100. * 255) );
    delay(FADE_DELAY);
    }

    MyMessage lightMsg(CHILD_ID_LIGHT1, V_LIGHT);
    MyMessage dimmerMsg(CHILD_ID_LIGHT1, V_DIMMER);
    send(lightMsg.set(ledLevel > 0));
    send(dimmerMsg.set(ledLevel));
    }


    void setLED2(byte level2)
    {

    int delta = (level2 - ledLevel2) < 0 ? -1 : 1; //Fade LED to set level

    while (ledLevel2 != level2)
    {
    ledLevel2 += delta;
    analogWrite(LED2_PIN, (int)(ledLevel2 / 100. * 255) );
    delay(FADE_DELAY);
    }

    MyMessage lightMsg2(CHILD_ID_LIGHT2, V_LIGHT);
    MyMessage dimmerMsg2(CHILD_ID_LIGHT2, V_DIMMER);
    send(lightMsg2.set(ledLevel2 > 0));
    send(dimmerMsg2.set(ledLevel2));
    }


    void writeToLED()
    {
    analogWrite(LED1_PIN, map(ledLevel,0,100,0,255));
    }

    void writeToLED2()
    {
    analogWrite(LED2_PIN, map(ledLevel2,0,100,0,255));
    }

    void click1() {setLED(ledLevel>0 ? 0 : 100); }
    void pstart1() {ledDimWay = ledLevel<100; }
    void press1() {if(ledDimWay && ledLevel<100) ledLevel++; if(!ledDimWay && ledLevel>5) ledLevel--; writeToLED(); delay(25); }
    void pstop1() {setLED(ledLevel); }

    void click2() {setLED2(ledLevel2>0 ? 0 : 100); }
    void pstart2() {ledDimWay2 = ledLevel2<100; }
    void press2() {if(ledDimWay2 && ledLevel2<100) ledLevel2++; if(!ledDimWay2 && ledLevel2>5) ledLevel2--; writeToLED2(); delay(25); }
    void pstop2() {setLED2(ledLevel2); }

    Használjátok egészséggel!
    Mindenkinek köszönöm a segítséget!
    Szép estét! :)

  • krisztián28

    csendes tag

    válasz Yoshida #4285 üzenetére

    Szia!

    Ha RGBW szalagot szeretnél vezérelni nézd meg ezt a kódot!
    Ezt a programot még nem próbáltam, de szerintem jó lehet!
    /**
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * version 2 as published by the Free Software Foundation.
    *
    * LED STRIP sketch for Mysensors
    *******************************
    *
    * REVISION HISTORY
    * 1.0
    * Based on the example sketch in mysensors
    * 1.1
    * prgspeed parameter (send as V_VAR1 message)
    * HomeAssistant compatible (send status to ack)
    * 1.2
    * OTA support
    * 1.3
    * Power-on self test
    * 1.4
    * Bug fix
    * 1.5
    * Other default values
    * 1.6
    * Repeater feature
    * 1.7
    * Multitasking. Alarm and RELAX modes.
    * 1.8
    * Reengineered programs/modes logic.
    * RGBW variant. Requires 4 PWM pins, so we need to move use a different pin for one of radio connections.
    */

    #define MY_OTA_FIRMWARE_FEATURE
    // #define MY_REPEATER_FEATURE
    #define MY_NODE_ID AUTO

    #define MY_RADIO_NRF24

    //#define MY_DEBUG

    // Normally the radio uses pin 9 for CE
    #define MY_RF24_CE_PIN 8

    #include <MySensors.h>

    #define CHILD_ID_LIGHT 1

    #define SN "LED Strip"
    #define SV "1.8"

    MyMessage lightMsg(CHILD_ID_LIGHT, V_LIGHT);
    MyMessage rgbwMsg(CHILD_ID_LIGHT, V_RGBW);
    MyMessage dimmerMsg(CHILD_ID_LIGHT, V_DIMMER);
    MyMessage prgspeedMsg(CHILD_ID_LIGHT, V_VAR1);
    MyMessage programMsg(CHILD_ID_LIGHT, V_VAR2);

    #define RR 0
    #define GG 1
    #define BB 2
    #define WW 3

    byte current[] = {255, 255, 255, 255};
    byte target[] = {255, 255, 255, 255};
    byte save[] = {0, 0, 0, 0};
    byte temp[] = {0, 0, 0, 0};

    float delta[] = {0.0, 0.0, 0.0, 0.0};

    char rgbwstring[] = "000000ff";

    int on_off_status = 0;
    int dimmerlevel = 100;
    int prgspeed = 20;
    unsigned long last_update = 0;
    unsigned long tick_length = 5;
    int fade_step = 0;

    int program_timer;
    int program_cycle;
    int program_step;

    // Make sure these are PWM pins
    #define REDPIN 6
    #define GREENPIN 5
    #define BLUEPIN 3
    #define WHITEPIN 9

    #define LIGHT_NORMAL 0
    #define LIGHT_FADING 1

    #define PROGRAM_NOP 0

    int light_mode = LIGHT_NORMAL;
    int program_mode = PROGRAM_NOP;

    #define SET 0
    #define SET_AND_WAIT 1
    #define SET_RANDOM 2
    #define SET_RANDOM_AND_WAIT 3
    #define FADE 4
    #define FADE_RANDOM 5
    #define WAIT 6

    typedef struct rgb_cmd {
    byte cmd;
    int p;
    byte rgbw[4];
    } rgb_cmd;

    rgb_cmd program_ALARM[] = {
    {SET_AND_WAIT, 25, {255, 255, 255, 0}},
    {SET_AND_WAIT, 25, {0, 0, 0, 0}},
    {SET_AND_WAIT, 25, {0, 0, 0, 255}},
    {SET_AND_WAIT, 25, {0, 0, 0, 0}}
    };

    rgb_cmd program_RELAX[] = {
    {FADE, 1000, {255, 32, 0, 0}},
    {FADE, 1000, {255, 32, 16, 0}},
    {FADE, 1000, {255, 16, 32, 0}},
    {FADE, 1000, {255, 128, 0, 0}},
    {FADE, 1000, {255, 32, 0, 0}},
    {FADE, 1000, {255, 32, 32, 0}},
    {FADE, 1000, {255, 0, 32, 0}}
    };

    rgb_cmd program_PARTY[] = {
    {SET_AND_WAIT, 10, {255, 0, 0, 0}},
    {SET_AND_WAIT, 10, {0, 0, 0, 255}},
    {SET_AND_WAIT, 10, {255, 0, 0, 0}},
    {SET_AND_WAIT, 10, {0, 0, 0, 255}},
    {SET_AND_WAIT, 10, {255, 0, 0,0}},
    {SET_AND_WAIT, 10, {0, 0, 0, 255}},
    {SET_AND_WAIT, 10, {255, 0, 0,0}},
    {SET_AND_WAIT, 10, {0, 0, 0, 255}},
    {SET_AND_WAIT, 10, {255, 0, 0, 0}},
    {SET_AND_WAIT, 10, {0, 0, 0, 255}},
    {FADE_RANDOM, 50, {255, 255, 255, 0}},
    {FADE_RANDOM, 50, {255, 255, 255, 0}},
    {FADE_RANDOM, 50, {255, 255, 255, 0}},
    {FADE_RANDOM, 50, {255, 255, 255, 0}},
    {SET_AND_WAIT, 50, {0, 0, 255, 0}},
    {SET_AND_WAIT, 50, {0, 255, 255 ,0}},
    {SET_AND_WAIT, 50, {255, 255, 0, 0}},
    {SET_AND_WAIT, 50, {0, 255, 0, 0}},
    {FADE_RANDOM, 50, {255, 255, 255, 0}},
    {FADE_RANDOM, 50, {255, 255, 255, 0}},
    {FADE_RANDOM, 50, {255, 255, 255, 0}},
    {FADE_RANDOM, 50, {255, 255, 255, 0}},
    {FADE_RANDOM, 50, {255, 255, 255, 0}}
    };


    rgb_cmd* programs[] = {
    &program_ALARM[0], &program_RELAX[0], &program_PARTY[0]
    };

    const int program_steps[] = {
    sizeof(program_ALARM)/sizeof(rgb_cmd),
    7,
    22
    };

    void setup()
    {
    // Fix the PWM timer. Without this the LEDs will flicker.
    TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00);

    // Output pins
    pinMode(REDPIN, OUTPUT);
    pinMode(GREENPIN, OUTPUT);
    pinMode(BLUEPIN, OUTPUT);
    pinMode(WHITEPIN, OUTPUT);

    }

    void presentation()
    {
    // Send the Sketch Version Information to the Gateway
    sendSketchInfo(SN, SV);
    present(CHILD_ID_LIGHT, S_RGBW_LIGHT);
    }

    void selftest() {
    on_off_status = 1;
    current[RR] = 255;
    current[GG] = 0;
    current[BB] = 0;
    current[WW] = 0;
    set_hw_status();
    wait(200);
    current[RR] = 0;
    current[GG] = 255;
    set_hw_status();
    wait(200);
    current[GG] = 0;
    current[BB] = 255;
    set_hw_status();
    wait(200);
    current[BB] = 0;
    current[WW] = 255;
    set_hw_status();
    wait(200);
    current[RR] = 0;
    current[GG] = 0;
    current[BB] = 0;
    set_hw_status();
    wait(200);
    on_off_status = 0;
    }

    void loop()
    {
    static bool first_message_sent = false;
    if ( first_message_sent == false ) {
    selftest();
    set_hw_status();
    send(rgbwMsg.set(rgbwstring));
    send(lightMsg.set(on_off_status));
    send(dimmerMsg.set(dimmerlevel));
    send(prgspeedMsg.set(prgspeed));
    send(programMsg.set(program_mode));
    first_message_sent = true;
    }

    unsigned long now = millis();
    // Maybe we wrapped around? Then reset last_update to 0.
    if (now < last_update) {
    last_update = 0;
    }

    if (now - last_update > tick_length) {
    last_update = now;

    // If we're fading, finish that before we do anything else
    if (light_mode == LIGHT_FADING) {
    calc_fade();
    } else {
    if (program_mode > PROGRAM_NOP) {
    handle_program();
    }
    }
    }

    set_hw_status();

    }

    void receive(const MyMessage &message)
    {
    int val;

    if (message.type == V_RGBW) {
    for (int i=0; i<=3; i++) {
    temp[i] = hextoint(message.data[i*2]) * 16 + hextoint(message.data[i*2+1]);
    }
    // Save old value
    strcpy(rgbwstring, message.data);

    init_fade(prgspeed, temp);
    send(rgbwMsg.set(rgbwstring));

    } else if (message.type == V_LIGHT || message.type == V_STATUS) {
    val = atoi(message.data);
    if (val == 0 or val == 1) {
    on_off_status = val;
    send(lightMsg.set(on_off_status));
    }

    } else if (message.type == V_PERCENTAGE) {
    val = atoi(message.data);
    if (val >= 0 and val <=100) {
    dimmerlevel = val;
    send(dimmerMsg.set(dimmerlevel));
    }

    } else if (message.type == V_VAR1 ) {
    val = atoi(message.data);
    if (val >= 0 and val <= 2000) {
    prgspeed = val;
    send(prgspeedMsg.set(val));
    }

    } else if (message.type == V_VAR2 ) {
    val = atoi(message.data);
    if (val == PROGRAM_NOP) {
    stop_program();
    send(programMsg.set(val));
    } else {
    init_program(val);
    send(programMsg.set(val));
    }

    } else {
    return;
    }

    }

    void execute_step(rgb_cmd cmd) {

    if (cmd.cmd == SET) {
    set_rgb(cmd.rgbw);
    } else if (cmd.cmd == SET_AND_WAIT) {
    set_rgb(cmd.rgbw);
    program_timer = cmd.p;
    } else if (cmd.cmd == SET_RANDOM) {
    set_rgb_random(cmd.rgbw);
    } else if (cmd.cmd == SET_RANDOM_AND_WAIT) {
    set_rgb_random(cmd.rgbw);
    program_timer = cmd.p;
    } else if (cmd.cmd == FADE) {
    init_fade(cmd.p, cmd.rgbw);
    } else if (cmd.cmd == FADE_RANDOM) {
    init_fade_random(cmd.p, cmd.rgbw);
    } else if (cmd.cmd == WAIT) {
    program_timer = cmd.p;
    }
    }

    void init_program(int program) {
    program_mode = program;
    program_step = 0;
    program_timer = 0;
    save_state();
    execute_step(programs[program_mode-1][0]);
    }

    void handle_program() {
    if (program_timer > 0) {
    program_timer--;
    }

    if (program_timer == 0) {
    program_step++;
    if (program_step == program_steps[program_mode-1]) {
    program_step = 0;
    }
    execute_step(programs[program_mode-1][program_step]);
    }
    }

    void stop_program() {
    restore_state();
    light_mode = LIGHT_NORMAL;
    program_mode = PROGRAM_NOP;
    }

    void save_state() {
    memcpy(save, current, 4 );
    }

    void restore_state() {
    memcpy(current, save, 4 );
    }

    void set_rgb (byte rgbw[]) {
    light_mode = LIGHT_NORMAL;
    memcpy(current, rgbw, 4);
    }

    void set_rgb_random (byte rgbw[]) {
    light_mode = LIGHT_NORMAL;
    for (int i=0; i <= 3; i++){
    current[i] = random(rgbw[i]);
    }
    }

    void init_fade(int t, byte rgbw[]) {
    light_mode = LIGHT_FADING;
    fade_step = t;
    memcpy(target, rgbw, 4);
    for (int i=0; i<=3; i++) {
    delta[i] = (target[i] - current[i]) / float(fade_step);
    }
    }

    void init_fade_random(int t, byte rgbw[]) {
    light_mode = LIGHT_FADING;
    fade_step = t;
    for (int i=0; i<=3; i++) {
    target[i] = random(rgbw[i]);
    delta[i] = (target[i] - current[i]) / float(fade_step);
    }
    }

    void calc_fade() {
    if (fade_step > 0) {
    fade_step--;
    for (int i=0; i<=3; i++) {
    current[i] = target[i] - delta[i] * fade_step;
    }
    } else {
    light_mode = LIGHT_NORMAL;
    }
    }

    void set_hw_status() {
    analogWrite(REDPIN, on_off_status * (int)(current[RR] * dimmerlevel/100.0));
    analogWrite(GREENPIN, on_off_status * (int)(current[GG] * dimmerlevel/100.0));
    analogWrite(BLUEPIN, on_off_status * (int)(current[BB] * dimmerlevel/100.0));
    analogWrite(WHITEPIN, on_off_status * (int)(current[WW] * dimmerlevel/100.0));
    }

    byte hextoint (byte c) {
    if ((c >= '0') && (c <= '9')) return c - '0';
    if ((c >= 'A') && (c <= 'F')) return c - 'A' + 10;
    if ((c >= 'a') && (c <= 'f')) return c - 'a' + 10;
    return 0;
    }

    [ Szerkesztve ]

Új hozzászólás Aktív témák