• Vítejte na XBMC-Kodi.cz
  • Česko-slovenská komunita fanoušků XBMC/Kodi
Vítejte návštevníku! Přihlášení Registrace


Hodnocení tématu:
  • 2 Hlas(ů) - 1.5 Průměr
  • 1
  • 2
  • 3
  • 4
  • 5
Domácí automatizace - bezpečně
@meda: hele a ja bych to pojmul zase uplne jinak. Vse v zivote se preci ridi vznikem nejake potreby (Maslowowa pyramida). Nu a pokud mas chut trebas na zenskou a chces soulozit, tak prece nebudes resit, jestli si jit koupit rohlik, jen proto, ze ti nekdo rikal, ze je rohlik super pecivo (a jeste lepsi je, kdyz je cerstvej!).

Jde o to, ze bych rekl, ze se dostavame nekam, kdy ta prvotni potreba (v tomto pripade by melo jit treba o to, vyresit treba automatizovany odtah z WC, protoze manzelka rikala, ze....) je zastinena a prebijena tim, ze "chci neco, abych byl in" (aby mi neujel vlak,....resp. si dopln dle libovule). Protoze preci dnes zacina byt IN, kdyz mam doma nejakou domaci automatizaci a zni to zajimave treba v hospode pred chlapama.

Tim nechci nikoho jmenovite urazit, je to pouze konstatovani, jak to na me pusobi.

Berme to tak, ze vyrobcu ruznych IoT je strasna spousta a jeste strasnejsi spousta je vsech moznych prvku, modulu, cidel,....A to vubec nemluvim o tom, ze spousta lidi si i dela vlastni reseni ruznych cidel postavenych na Arduinu, NodeMCU, a jinych vyvojovych deskach.

Proto jsem tu nekolikrat napsal, ze je dobre s necim zacit a postupne se seznamit. Tato problematika je tak obsahla, ze neexistuje zadne jedine "spravne reseni". To je jak s temi auty - pro jednoho je spravne reseni sportovni auto, pro jineho zase Hummer.

Takze zkusme na to jit z druhe strany - co prvne definovat a upresnit potrebu? Tedy co chci ovladat a my se zde muzeme navzajem pohadat, co by na to bylo vhodne 40 47
Apple TV 4K gen.3 128GB - tvOS 16.2 (iSCC, KODI 19.4) & 3x HomePod - audioOS 16.2 & RPi 4B 8GB RAM - IOTstack & 1x RPi 2B - Raspbian & RPi Zero
Intel NUC NUC10i5FNK - i5 10210U, 64GB RAM, ESXi (W10, W11, Debian,...) 
iPhone 15 Pro 512 GB - iOS v17.2.1 (KODI 19.4) & Apple Watch 9 45mm v10.2
iPad Pro 11 512 GB - iPadOS v17.2.1 (KODI 19.4)
 
Citovat
No vidím, že se to tady nějak zvrtlo a reagovat na předchozí dotazy je jako dohánět vlak na nástupišti. Takže jako první bych se chtě zhádat ohledně základu a tím je instalace Home assistantu, kde jsem posílal odkaz na podporované tři možnosti zde

O ostatních metodách se bavit nebudeme, jelikož je to pro začínajícího uživatele krajně nevhodné. Jsem rád, že je tady "linuxák" ch_bdxhegz a ani jsem nemusel svoji myšlenku dál rozvíjet. Napsal to totiž sám: ".....ale ani po těch letech si netroufám označit se za více než mírně středně pokročilého"
Já se vidím úplně stejně, přitom by mě někdo jiný mohl brát jako Guru v této problematice. Takže proto si nemyslím, že navrhované řešení instalace do dockeru je pro začátečníka vhodné.

1. za mě instalace Home Assistantu na Raspberry p 4 se 4GB rozbalením IMAGE na SD kartu. Nesporná výhoda je v tom, že pomocí dd (linuxový terminálový program) rozbalím stažený obraz na SD kartu
Kód:
 sudo dd if='/cesta/k/image/nazev.img' of='/dev/mmcblk0' bs=4M
Následně SD kartu vložím do Raspberry, to připojím na LAN a do zásuvky. Následně otevřu prohlížeč, kde zadám adresu http://hassio.local:8123
Jakmile si Home Assistant osahá IOT zařízení a vytvoří entity, tak se objeví uvítací obrazovka a mám hotovo.

Je snad jednodušší způsob začátku?
 
Citovat
Tak to je báječný vtip. Docker je pro začátečníka nevhodný, ale použití dd je v pohodě? Jako fakt? Začátečník použije Etcher, WinImager nebo něco podobného a doporučovaného na strýnkách HassOS nebo jak se to teď jmenuje...

Ad tabulka - je první nástřel během pár minut pánové, jak jsem psal, tabulku může editovat kdokoliv, tak s chutí do toho, než to smažou :-)

EDIT: Právě jsem si vzpomněl, že jsem kdysi začal psát sérii návodů na instalaci komba Ubuntu server/Docker/HA/etc, jsou tady http://www.kuzbici.eu/pripravujeme-serve...ast-prvni/
Vero4K+, 3xRPi 3B;  xTrend 9500 (OpenPLI + CZ/SK Archives plugin); Turris 1.1; T61p (LinuxMint); T420 (ArchLinux); ThinkPad Edge (Linux Mint)
 
Citovat
Jinak já začínal potřebou zautomatizovat topení. Hnací motor byl jasný a to komfort a úspora. Jelikož se jedná o topení pomocí akumulačních kamen, tak to byla opravdu výzva. Začínal jsem pomocí časového relé, přes ewelik, až k finálnímu node-red. Ostatní automatizace se pouze nabalovala, jelikož jsem kupoval různí IOT zařízení a testoval jejich vhodnost. Nevhodné zařízení jsem pak musel buď vyhodit, nebo pro ně najít vhodné místo mimo topení k zakomponování. Jak požadavky na systém, tak dovednosti uživatele rostou, tak roste i systém a každý jednou dojde k závěru, že HomeAssistant na tohle nestačí. Proto ho doporučuji použít jen jako integračního prostředníka a vizualizaci a pro ostatní použít Node-red. Výsledek je pak po uživatele krásný termostat a pod pokličkou robustní node.

ch_bdxhegz: Rozbalení image je hlavně o použitém systému, pro windows, ios, linux je to vždy něco jiného. V linuxu např. ubuntu, lze použít diskový nástroj s GUI. Ale jako nejvhodnější co do univerzality a jednoduchosti je použít terminál a zmiňované dd. Je to nezávislé na druhu linuxového distra a jednoduché. Takže vtip to není, vždy jsem radši někde ze stránek nakopíroval pár příkazů do terminálu, než složitě klikal v GUI.


Přiložené soubory Miniatury
       
 
Citovat
Jaké mám potřeby - jaké mám schopnosti - jakou mám kupní sílu - jak mne to uspokojí - jak to uspokojí rodinu.
47
 
Citovat
@cuore: v tvem navodu by asi melo padnout, ze vychozi je pocitac, kterym stahnes image a ze bezi na linuxu a ma ctecku karet. Nicmene jak bylo zmineno dale, rekl bych, ze vetsina lidi spis bude mit za system Windows.

Co se tyce Dockeru a jeho instalace, osobne protezuji reseni pres IOT Stack, kde navod step-by-step, jak si to zprovoznit (tedy vcetne HA) je zde:
> https://sensorsiot.github.io/IOTstack/Getting-Started/

Jsi ochoten nasdilet sva flow? 88

@meda: tvemu prispevku jsem nejak nepozorumel. To ma byt nejaka narazka, vtip nebo jen nejaka filosofie?
Apple TV 4K gen.3 128GB - tvOS 16.2 (iSCC, KODI 19.4) & 3x HomePod - audioOS 16.2 & RPi 4B 8GB RAM - IOTstack & 1x RPi 2B - Raspbian & RPi Zero
Intel NUC NUC10i5FNK - i5 10210U, 64GB RAM, ESXi (W10, W11, Debian,...) 
iPhone 15 Pro 512 GB - iOS v17.2.1 (KODI 19.4) & Apple Watch 9 45mm v10.2
iPad Pro 11 512 GB - iPadOS v17.2.1 (KODI 19.4)
 
Citovat
Potřeby?:
Již nyní používám nějaké "chytré" zásuvky od Sonoff, Provozuji Zigbee hub + čidla teploty, dveřní čidla a záplavová čidla připojena přes hub RF433 od Sonoff, používám Yeelight 650 světlo spolu s nativní aplikací a Mi Home. Ke světlu jsou přes Bluetooth hub ve světle připojená další čidla teploty a vlhkosti....
Každý prvek má svoji aplikaci (skoro celá jedna obrazovka na mobilu) a to mě přimělo všechny prvky koncentrovat do jednoho celku.
Již delší dobu to tady a netu pročítám a vždy narazím na něco čemu nerozumím nebo nevím jak dál. Odkazy získané od strýčka Google jsou většinou obecné plácání se snahou přimět nadšence koupit konkrétní produkt a spíše dělají v mozku zmatek. Hemží se dalšími odkazy na stejné příspěvky.
Prostě, potřebuji jednoduchý server s rozumnou spotřebou, který by koncentroval veškeré prvky mé domácnosti a umožňoval provádět automatizaci a byl ovladatelný vzdáleně přes mobil. 
Tak toto jsou mé potřeby. Věřím, že podobné potřeby bude mít více uživatelů.
 
Citovat
@S474N: neber to špatně, ale flow nasdílet nemůžu. Abych to nastínil, je to unikátní řešení pro specifický druh topení, který ti bude stejně k ničemu. No a nyní je tento projekt v jednání ve smyslu odkupu včetně know-how s nejmenovaným výrobcem. Jde tady zkrátka o velké peníze a nasdílením, bych pochopitelně přišel o možnost výdělku. Nemůžu ani vysvětlit funkci regulace, protože tohle všechno je pro výrobce docela citlivé téma (konkurenční boj). Nicméně pokud tě zajímá něco konkrétního v tvém projektu, tak určitě půjde část flow separovat a přiohnout. Navíc v použití obecných a známých věcí, problém taky nevidím (např. detekce otevřeného okna apod). Pokud bych se s výrobcem nedohodl, tak nemám pak problém vše pustit do éteru. Nyní je projekt ve fázi prototypového testování u výrobce. Samozřejmě tady vše funguje ke spokojenosti od minulé topné sezóny, takže jde spíš o to, jestli tohle řešení bude pro výrobce finančně rentabilní pro sériovou produkci.

@Cinda: sonoff používáš s ewelink? Každopádně ty si ideální člověk pro HomeAssistant. Všechny tvoje prvky jdou buď přímo integrovat pomocí API, nebo MQTT. Takže ti stačí jen koupit raspberry pi 4 a máš vše na jednom místě. U sonoffu bych přešel jen z ewelinku na Tasmotu, nebo ESPHome. Je to z důvodu bezpečnosti, kdy tímto krokem odstřihneš čínský cloud. Jde to i s nativní aplikací ewelink, která má už pro HomeAssistant API, ale použitím jiného firmwaru se ti otvírají i další možnosti pro využití zařízení. ZigBee věci jednoduše integruješ pomocí ConBeeII, nebo mnohem levnějším CC2531. Tohle řešení mně osobně spolehlivě funguje na 40 zigbee zařízeních. Pokud uvažuješ o rozsáhlejší síti, tak bych šel do vyšší řady CCXXXX, nebo do ConBeeII. Ale s použitím ConBee se okrádáš o podporu mnoha zařízení a o opensources řešení. Nicméně i ConBee je podporováno v projektu zigbee2mqtt takže by to byla asi nejlepší volba pro koupi. Použiješ ho totiž klasicky pomocí zaintegrování do HomeAssistantu přes API deConz a pokud by ti chyběla podpora zařízení, tak ho můžeš použít v zigbee2mqtt.
 
Citovat
@Cinda: no tak pokud jedes primarne na Androidu, tak je pro tebe HA jednoznacnou volbou. Takze se klidne rid tim, co zde uz padlo: HA+ RPi4/4GB RAM.

@cuore: no me jde primarne o to reseni flow. Casto se takto inspiruji a priohybam si to na zrovna to, co resim. Takto uz jsem nekolikrat predelaval sva flow na uplne jiny zpusob zpracovani.

Pokud jsem to dobre pochopil (spise tedy dobre videl v tom nizkem rozliseni), tak ses spise zastance pouzivani logiky vestavenych nodu typu switch, apod. Kdy tedy logiku neresis v ramci vlastniho skriptu ve "func" a odpovidajicimu poctu output, ale radeji "sekas" switche.

V kazdem pripade drzim palce, at se povede toto usili zmonetizovat. Sam vic, kolik stoji casu to hrani si s tim. Ja treba doposud ovladal televizi pres IR (Broadlink RM PRO) a rekl jsem si, ze by bylo dobre mit i zpetnou vazbu, tak jsem si pohledal, jestli ma televize API (ma a znacne orezane) a nektere funkce jsem si predelal uplne tak, ze co jde ovladat/zjistovat pres API, tak primarne dela pres to a zbytek bud IR nebo virtualnim mackanim klaves v API. A kdyz jsem si toto vsechno udelal, tak zase resim problem toho, ze nez se to vsechno provede, tak se mi mezitim zmeni stav na pocatku a zacne to probihat ve smycce. A takovyma blbostma se clovek muze zadelat na X hodin, i presto, ze vysledek mel uz v predchozim reseni hotove 40.

   
Apple TV 4K gen.3 128GB - tvOS 16.2 (iSCC, KODI 19.4) & 3x HomePod - audioOS 16.2 & RPi 4B 8GB RAM - IOTstack & 1x RPi 2B - Raspbian & RPi Zero
Intel NUC NUC10i5FNK - i5 10210U, 64GB RAM, ESXi (W10, W11, Debian,...) 
iPhone 15 Pro 512 GB - iOS v17.2.1 (KODI 19.4) & Apple Watch 9 45mm v10.2
iPad Pro 11 512 GB - iPadOS v17.2.1 (KODI 19.4)
 
Citovat
@S474N: primárně se snažím vše řešit pomocí běžných node. Je to i preferované řešení komunity okolo tohoto projektu. Ale jak je ti známo, ne vždy to takhle jde a pak si nucen použít funkční node. Na ukázku třeba node pro výpočet pocitové teploty podle kanadského modelu:
Kód:
const T = msg.payload.teplota
const W = msg.payload.vitr

const wc = 13.12 + (0.6215 * T) - (11.37 * W**0.16) + (0.3965 * T * W**0.16)

return { payload: (Math.floor(wc)), topic: "wct" };
node pro české svátky:
Kód:
let d = new Date();
if (d.getMonth() == 0 && d.getDate() == 1) {
    return msg;
}
else if (d.getMonth() == 3 && d.getDate() == 19) {
    return msg;
}
else if (d.getMonth() == 3 && d.getDate() == 22) {
    return msg;
}
else if (d.getMonth() == 4 && d.getDate() == 1) {
    return msg;
}
else if (d.getMonth() == 4 && d.getDate() == 8) {
    return msg;
}
else if (d.getMonth() == 6 && d.getDate() == 5) {
    return msg;
}
else if (d.getMonth() == 6 && d.getDate() == 6) {
    return msg;
}
else if (d.getMonth() == 8 && d.getDate() == 28) {
    return msg;
}
else if (d.getMonth() == 9 && d.getDate() == 28) {
    return msg;
}
else if (d.getMonth() ==10 && d.getDate() == 17) {
    return msg;
}
else if (d.getMonth() == 11 && d.getDate() == 24) {
    return msg;
}
else if (d.getMonth() == 11 && d.getDate() == 25) {
    return msg;
}
else if (d.getMonth() == 11 && d.getDate() == 26) {
    return msg;
}
return null;
node pro časovou značku
Kód:
var today = new Date();
var now = today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate()+' '+today.getHours() + ":" + today.getMinutes();
return {payload: now };
node pro třídění podle aktuálního měsíce
Kód:
var today = new Date();
var now = today.getMonth()+1;

if (now == 1) {return[ msg, null, null, null, null, null, null, null, null, null, null, null];}
if (now == 2) {return[ null, msg, null, null, null, null, null, null, null, null, null, null];}
if (now == 3) {return[ null, null, msg, null, null, null, null, null, null, null, null, null];}
if (now == 4) {return[ null, null, null, msg, null, null, null, null, null, null, null, null];}
if (now == 5) {return[ null, null, null, null, msg, null, null, null, null, null, null, null];}
if (now == 6) {return[ null, null, null, null, null, msg, null, null, null, null, null, null];}
if (now == 7) {return[ null, null, null, null, null, null, msg, null, null, null, null, null];}
if (now == 8) {return[ null, null, null, null, null, null, null, msg, null, null, null, null];}
if (now == 9) {return[ null, null, null, null, null, null, null, null, msg, null, null, null];}
if (now == 10) {return[ null, null, null, null, null, null, null, null, null, msg, null, null];}
if (now == 11) {return[ null, null, null, null, null, null, null, null, null, null, msg, null];}
if (now == 12) {return[ null, null, null, null, null, null, null, null, null, null, null, msg];}
atd. Fukcí mám opravdu napsaných na kila. Dokonce jsem v node-red napsal komplet regulaci Ikea žárovky s jejich ovladačem E1524/E1810. Vše z pohledu uživatele funguje jako by byl ovladač spárovaný přímo se žárovkou, ale přitom vše teče přes node-red. Výhodou je plynulá regulace jasu i chromatičnosti oproti řešení Ikea.
 
Citovat
@cuore: s Ikea zarovkou jsem se trapil vcera vecer. Respektive jsem vyuzil tohoto subflow, ktere resi to, o cem pises (mam to teda jen na on/off a stmivani, protoze mam Ikea On/Off prepinac):
> https://flows.nodered.org/flow/1949af43d...ac706372bd

Nicmene s tim mam jiny problem. Tim, ze to jeste chci prostrelovat do Homekitu pres Homebridge, tak musim pochopitelne menit payload na vstupu i vystupu. Jenze jsem se zasekl na tom, ze LED maji jas 0-255 a ja bych potreboval prepocitavat hodnoty na 0-100 (procent) a na vystupu zas naopak. Tady bych zrovna nejake hotove reseni uvital, at nemusim zbytecne vynalezat kolo.
Apple TV 4K gen.3 128GB - tvOS 16.2 (iSCC, KODI 19.4) & 3x HomePod - audioOS 16.2 & RPi 4B 8GB RAM - IOTstack & 1x RPi 2B - Raspbian & RPi Zero
Intel NUC NUC10i5FNK - i5 10210U, 64GB RAM, ESXi (W10, W11, Debian,...) 
iPhone 15 Pro 512 GB - iOS v17.2.1 (KODI 19.4) & Apple Watch 9 45mm v10.2
iPad Pro 11 512 GB - iPadOS v17.2.1 (KODI 19.4)
 
Citovat
@S474N: Ber to jako mou osobní filosofii pro téma IOT. Nebo prostou matematiku, kdy mi vyšlo, že tomu nepůjdu vstříc. Co jsem už načetl a tahle diskuze mne přesvědčila, že mám čekat, až IOT přijde za mnou sama s rozumnou nabídkou.
Kodi 20 -LibreELEC/LinuxMint/Win/Android -RPi4/3/2/ IntelPC/xMiStick4K -Router 1Gbit 2.4+5GHz
 
Citovat
@S474N: na tohle je vhodné použít kolo jménem range. V ukázce je převod procentuálního rozsahu 0-100 na rozsah 0-255


Přiložené soubory Miniatury
       
 
Citovat
@cuore: za ty nody klobouček, pane
@s4t4n: The Swiss Guy with an English Accent to má dobře podané, ale samotný IOTstack má své mouchy. Kdysi jsem ho zkoušel, ale mám raději nad věcmi větší kontrolu. Nicméně pro začátečníka skvělá věc.
@Cinda: Jasný adept na HomeAssistenta, OpenHub, Domoticz a podobné systémy. Doporučuji vyzkoušet. Jinak pro mobil je skvělá appka jménem HassKit. Wife Factor: 10/10


Přiložené soubory Miniatury
       
Vero4K+, 3xRPi 3B;  xTrend 9500 (OpenPLI + CZ/SK Archives plugin); Turris 1.1; T61p (LinuxMint); T420 (ArchLinux); ThinkPad Edge (Linux Mint)
 
Citovat
@meda: to je naprosto v poradku pristup. Nastesti to neni zadna povinnost, neco podobneho mit doma, spise naopak. Zatim je to spise vec, kdy to "promoreni" populace je velmi nizke. Samozrejme se daji koupit i hotove profesionalni reseni, ovsem v komplexnim reseni treba RD se pohybujeme v radu statisicu. Ale zase bez prace a vse funkcni tak, jak si investor vymysli.

@cuore: tak to je tak jednoduche, az se doslova stydim, ze jsem si ani neproklikal vseschny ty zakladni vestavene nody 40 Diky za nakopnuti spravnym smerem!

@ch_bdxhegz: s Dockerem to mam tak, ze se porad seznamuji. Stejne mi na jednu stranu "chybi" plnohodnotne virtualky na LXC, na ktere jsem byl zvyklej. Co se tyce naseho svycara, zatim musim zaklepat, protoze mi vse bezi bez problemu + je i skvela podpora na Discordu.

Koukam, ze HassKit se evidentne "inspiroval" u HomeKitu 40 47
Apple TV 4K gen.3 128GB - tvOS 16.2 (iSCC, KODI 19.4) & 3x HomePod - audioOS 16.2 & RPi 4B 8GB RAM - IOTstack & 1x RPi 2B - Raspbian & RPi Zero
Intel NUC NUC10i5FNK - i5 10210U, 64GB RAM, ESXi (W10, W11, Debian,...) 
iPhone 15 Pro 512 GB - iOS v17.2.1 (KODI 19.4) & Apple Watch 9 45mm v10.2
iPad Pro 11 512 GB - iPadOS v17.2.1 (KODI 19.4)
 
Citovat
@ch_bdxhegz: Wife Factor: 10/10.  1 . Chápu, že tento faktor je v celé věci nejdůležitější.
 
Citovat
@cuore: tak ted jsem si na to konecne v klidu sedl a range nebude to spravne orechove, jak jsem si puvodne myslel. Protoze ono to pri stisknuti (dim) neposila postupne bri: 0-255, ale posila to payload:
Kód:
{ on:true, bri: 0, transitiontime: XXX}

Hodnota bri je bud 0 (zeslabuje jas) nebo 255 (zvysuje jas), nic mezitim a vzdycky nakonec jeste posle jeden payload "bri_inc: 0".
Apple TV 4K gen.3 128GB - tvOS 16.2 (iSCC, KODI 19.4) & 3x HomePod - audioOS 16.2 & RPi 4B 8GB RAM - IOTstack & 1x RPi 2B - Raspbian & RPi Zero
Intel NUC NUC10i5FNK - i5 10210U, 64GB RAM, ESXi (W10, W11, Debian,...) 
iPhone 15 Pro 512 GB - iOS v17.2.1 (KODI 19.4) & Apple Watch 9 45mm v10.2
iPad Pro 11 512 GB - iPadOS v17.2.1 (KODI 19.4)
 
Citovat
Jen pro inspiraci vlastní řešení Ikea. Světlo v pracovně je o dvou žárovkách Ikea. Za vypínačem je shelly1 nastaveno na MQTT komunikaci, s trvale sepnutým relé, aby byla žárovka pod napětím. Takže Shelly jen posílá informaci o stavu vypínače. Ikea je integrovaná pomocí zigbee2mqtt, mezi ovladačem a žárovkou není žádná vazba. O vše se stará node-red. Vypínač a zigbee ovladač se chovají jako zapojení typu 6.
Kód:
[
    {
        "id": "69e2235f.5b2b3c",
        "type": "tab",
        "label": "Ikea",
        "disabled": false,
        "info": ""
    },
    {
        "id": "9d8954a6.331108",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "Přepínač výstupu",
        "func": "if(msg.payload.action == \"toggle\" || msg.payload == \"toggle\") {\n\nif(context.flow.stav === false){\n  msg.payload = true;  \n}else{\n  msg.payload = false;\n}\ncontext.flow.stav = msg.payload;\n}\nvar newMsg = { payload: context.flow.stav };\nreturn [newMsg];",
        "outputs": 1,
        "noerr": 0,
        "x": 770,
        "y": 240,
        "wires": [
            [
                "49f0bc08.f0f804",
                "7cef1b26.4fc364"
            ]
        ]
    },
    {
        "id": "b60c1685.182ab8",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "Stav světla",
        "func": "context.flow.stav = msg.payload;\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 854,
        "y": 440,
        "wires": [
            [
                "36734ab6.e026f6"
            ]
        ]
    },
    {
        "id": "4df170cd.9a5c9",
        "type": "inject",
        "z": "69e2235f.5b2b3c",
        "name": "První spuštění",
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": "",
        "topic": "firsboot",
        "payload": "false",
        "payloadType": "bool",
        "x": 360,
        "y": 820,
        "wires": [
            [
                "60109daa.a47d74",
                "161a7e28.569072"
            ]
        ]
    },
    {
        "id": "a8d620a6.ad9fe",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "Status",
        "func": "if(msg.payload.state == \"ON\") {\n    \n   msg.payload = true; \n   \n}\n\nelse{\n    \n  msg.payload = false;\n \n}\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 711,
        "y": 440,
        "wires": [
            [
                "b60c1685.182ab8",
                "83e5a4a.23aef58"
            ]
        ]
    },
    {
        "id": "e53bce00.549dd",
        "type": "comment",
        "z": "69e2235f.5b2b3c",
        "name": "Světlo Pracovna",
        "info": "",
        "x": 341,
        "y": 189,
        "wires": []
    },
    {
        "id": "49f0bc08.f0f804",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "topic",
        "func": "var topic = \"vstup\";\nvar newMsg = { payload: msg.payload,topic };\nreturn newMsg;",
        "outputs": 1,
        "noerr": 0,
        "x": 969,
        "y": 294,
        "wires": [
            [
                "5b7a8dcc.a0b984"
            ]
        ]
    },
    {
        "id": "f77474b7.872d18",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "topic",
        "func": "var topic = \"vystup\";\nvar newMsg = { payload: msg.payload,topic };\nreturn newMsg;",
        "outputs": 1,
        "noerr": 0,
        "x": 967,
        "y": 242,
        "wires": [
            [
                "5b7a8dcc.a0b984"
            ]
        ]
    },
    {
        "id": "5b7a8dcc.a0b984",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "porovnání",
        "func": "if (msg.topic == \"vstup\")  {\n\tcontext.state1 = msg.payload;\n                           }\nif (msg.topic == \"vystup\") {\n\tcontext.state2 = msg.payload;\n                           }\nif (context.state1 == context.state2) {\n\nmsg.topic = \"shoda\";\n                                     }\nelse if (context.state2 === false && context.state1 === undefined ) {\n\nmsg.topic = \"chyba\";\nmsg.payload = false;\nreturn [null,msg];\n                                     }\nelse if (context.state2 === true && context.state1 === undefined ) {\n\nmsg.topic = \"chyba\";\nmsg.payload = true;\nreturn [null,msg];\n                                     }\nelse {\n msg.topic = \"neshoda\"; \n msg.payload = context.state1;\n     }\nreturn msg;",
        "outputs": 2,
        "noerr": 0,
        "x": 1159.5,
        "y": 294,
        "wires": [
            [
                "60109daa.a47d74"
            ],
            []
        ]
    },
    {
        "id": "69a2f56.226640c",
        "type": "mqtt in",
        "z": "69e2235f.5b2b3c",
        "name": "Ikea žárovka",
        "topic": "zigbee2mqtt/0x000d6ffffe5b1fd6",
        "qos": "0",
        "datatype": "auto",
        "broker": "6d608c46.1fd3b4",
        "x": 330,
        "y": 440,
        "wires": [
            [
                "a04cbf14.f0df8"
            ]
        ]
    },
    {
        "id": "601fc87c.9e6858",
        "type": "change",
        "z": "69e2235f.5b2b3c",
        "name": "převod výstupu pro Ikea",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "true",
                "fromt": "bool",
                "to": "{\"state\":\"ON\"}",
                "tot": "json"
            },
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "false",
                "fromt": "bool",
                "to": "{\"state\":\"OFF\"}",
                "tot": "json"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1650,
        "y": 296,
        "wires": [
            [
                "4a1bf459.f2245c"
            ]
        ],
        "inputLabels": [
            "true/false"
        ],
        "outputLabels": [
            "ON/OFF"
        ]
    },
    {
        "id": "4a1bf459.f2245c",
        "type": "mqtt out",
        "z": "69e2235f.5b2b3c",
        "name": "Pracovna žárovka 1",
        "topic": "zigbee2mqtt/0x000d6ffffe5b1fd6/set",
        "qos": "0",
        "retain": "true",
        "broker": "6d608c46.1fd3b4",
        "x": 1920,
        "y": 296,
        "wires": []
    },
    {
        "id": "a04cbf14.f0df8",
        "type": "json",
        "z": "69e2235f.5b2b3c",
        "name": "překlad na JSON",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 548,
        "y": 440,
        "wires": [
            [
                "a8d620a6.ad9fe",
                "a3b7a1f8.50369",
                "187cb59b.dfe9aa"
            ]
        ]
    },
    {
        "id": "fdc1cc2f.3022f",
        "type": "mqtt in",
        "z": "69e2235f.5b2b3c",
        "name": "Ovladač Pracovna",
        "topic": "zigbee2mqtt/0x000d6ffffe54f777",
        "qos": "0",
        "datatype": "auto",
        "broker": "6d608c46.1fd3b4",
        "x": 350,
        "y": 600,
        "wires": [
            [
                "726fa62e.a37ea8"
            ]
        ]
    },
    {
        "id": "11e37099.ca773f",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "Přepínač výstupu",
        "func": "if(msg.payload.action == \"toggle\" || msg.payload == \"toggle\") {\n\nif(context.flow.stav1 === false){\n  msg.payload = true;  \n}else{\n  msg.payload = false;\n}\ncontext.flow.stav1 = msg.payload;\n}\nvar newMsg = { payload: context.flow.stav1 };\nreturn [newMsg];",
        "outputs": 1,
        "noerr": 0,
        "x": 810,
        "y": 840,
        "wires": [
            [
                "6b601613.1686a8",
                "abfc6a1f.26bca8"
            ]
        ]
    },
    {
        "id": "74861331.d52d0c",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "Stav světla",
        "func": "context.flow.stav1 = msg.payload;\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 853,
        "y": 1040,
        "wires": [
            [
                "1cc8a3d4.3f0d2c"
            ]
        ]
    },
    {
        "id": "726fa62e.a37ea8",
        "type": "json",
        "z": "69e2235f.5b2b3c",
        "name": "překlad na JSON",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 550,
        "y": 600,
        "wires": [
            [
                "9cf4518f.9563a"
            ]
        ]
    },
    {
        "id": "e1c131ce.6f4e4",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "Status",
        "func": "if(msg.payload.state == \"ON\") {\n    \n   msg.payload = true; \n   \n}\n\nelse{\n    \n  msg.payload = false;\n \n}\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 710,
        "y": 1040,
        "wires": [
            [
                "74861331.d52d0c",
                "a021be.9bc46e4"
            ]
        ]
    },
    {
        "id": "2b310b72.1479e4",
        "type": "mqtt in",
        "z": "69e2235f.5b2b3c",
        "name": "Shelly SW",
        "topic": "shellies/shelly1-93EF36/input/0",
        "qos": "0",
        "datatype": "auto",
        "broker": "6d608c46.1fd3b4",
        "x": 316,
        "y": 680,
        "wires": [
            [
                "4911df08.79efb"
            ]
        ]
    },
    {
        "id": "4911df08.79efb",
        "type": "json",
        "z": "69e2235f.5b2b3c",
        "name": "překlad na JSON",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 370,
        "y": 760,
        "wires": [
            [
                "8b6022c6.f3ce7"
            ]
        ]
    },
    {
        "id": "6b601613.1686a8",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "topic",
        "func": "var topic = \"vstup\";\nvar newMsg = { payload: msg.payload,topic };\nreturn newMsg;",
        "outputs": 1,
        "noerr": 0,
        "x": 989,
        "y": 894,
        "wires": [
            [
                "c081c0f.a2ce34"
            ]
        ]
    },
    {
        "id": "603f6485.3d39fc",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "topic",
        "func": "var topic = \"vystup\";\nvar newMsg = { payload: msg.payload,topic };\nreturn newMsg;",
        "outputs": 1,
        "noerr": 0,
        "x": 987,
        "y": 842,
        "wires": [
            [
                "c081c0f.a2ce34"
            ]
        ]
    },
    {
        "id": "c081c0f.a2ce34",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "porovnání",
        "func": "if (msg.topic == \"vstup\")  {\n\tcontext.state1 = msg.payload;\n                           }\nif (msg.topic == \"vystup\") {\n\tcontext.state2 = msg.payload;\n                           }\nif (context.state1 == context.state2) {\n\nmsg.topic = \"shoda\";\n                                     }\nelse if (context.state2 === false && context.state1 === undefined ) {\n\nmsg.topic = \"chyba\";\nmsg.payload = false;\nreturn [null,msg];\n                                     }\nelse if (context.state2 === true && context.state1 === undefined ) {\n\nmsg.topic = \"chyba\";\nmsg.payload = true;\nreturn [null,msg];\n                                     }\nelse {\n msg.topic = \"neshoda\"; \n msg.payload = context.state1;\n     }\nreturn msg;",
        "outputs": 2,
        "noerr": 0,
        "x": 1179.5,
        "y": 894,
        "wires": [
            [
                "161a7e28.569072"
            ],
            []
        ]
    },
    {
        "id": "793c3e2a.9da53",
        "type": "mqtt in",
        "z": "69e2235f.5b2b3c",
        "name": "Ikea žárovka",
        "topic": "zigbee2mqtt/0x000d6ffffe60a88a",
        "qos": "0",
        "datatype": "auto",
        "broker": "6d608c46.1fd3b4",
        "x": 335,
        "y": 1040,
        "wires": [
            [
                "944ca29d.5187d"
            ]
        ]
    },
    {
        "id": "1346eccd.d2a1e3",
        "type": "change",
        "z": "69e2235f.5b2b3c",
        "name": "převod výstupu pro Ikea",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "true",
                "fromt": "bool",
                "to": "{\"state\":\"ON\"}",
                "tot": "json"
            },
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "false",
                "fromt": "bool",
                "to": "{\"state\":\"OFF\"}",
                "tot": "json"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1689,
        "y": 896,
        "wires": [
            [
                "c978c946.3ae468"
            ]
        ],
        "inputLabels": [
            "true/false"
        ],
        "outputLabels": [
            "ON/OFF"
        ]
    },
    {
        "id": "c978c946.3ae468",
        "type": "mqtt out",
        "z": "69e2235f.5b2b3c",
        "name": "Pracovna žárovka 2",
        "topic": "zigbee2mqtt/0x000d6ffffe60a88a/set",
        "qos": "0",
        "retain": "true",
        "broker": "6d608c46.1fd3b4",
        "x": 1937,
        "y": 896,
        "wires": []
    },
    {
        "id": "944ca29d.5187d",
        "type": "json",
        "z": "69e2235f.5b2b3c",
        "name": "překlad na JSON",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 526,
        "y": 1040,
        "wires": [
            [
                "e1c131ce.6f4e4",
                "b99c8144.7d614",
                "e3e9cd67.a03ef"
            ]
        ]
    },
    {
        "id": "2d05cce1.360d34",
        "type": "mqtt in",
        "z": "69e2235f.5b2b3c",
        "name": "Shelly relé",
        "topic": "shellies/shelly1-93EF36/relay/0",
        "qos": "0",
        "datatype": "auto",
        "broker": "6d608c46.1fd3b4",
        "x": 325,
        "y": 1100,
        "wires": [
            [
                "7fa03ff8.1644b"
            ]
        ]
    },
    {
        "id": "aa5d5c26.7e808",
        "type": "mqtt in",
        "z": "69e2235f.5b2b3c",
        "name": "Shelly SW",
        "topic": "shellies/shelly1-93EF36/input/0",
        "qos": "0",
        "datatype": "auto",
        "broker": "6d608c46.1fd3b4",
        "x": 325,
        "y": 1160,
        "wires": [
            [
                "1d84867b.c2b18a"
            ]
        ]
    },
    {
        "id": "4ba54f9a.af946",
        "type": "change",
        "z": "69e2235f.5b2b3c",
        "name": "změna",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "on",
                "fromt": "str",
                "to": "1",
                "tot": "num"
            },
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "off",
                "fromt": "str",
                "to": "0",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "rele",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 701,
        "y": 1100,
        "wires": [
            [
                "879daccd.44018"
            ]
        ]
    },
    {
        "id": "879daccd.44018",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "porovnání",
        "func": "if (msg.topic == \"rele\")  \n   {\n\tcontext.state1 = msg.payload;\n   }\nif (msg.topic == \"tlacitko\") \n   {\n\tcontext.state2 = msg.payload;\n   }\nif (context.state2 == 1 ) \n   {                          \n   if (context.state1 != context.state2) \n      {\n   var newMsg = {payload: context.state2}\n      }\n   }\nreturn newMsg;",
        "outputs": 1,
        "noerr": 0,
        "x": 862,
        "y": 1132,
        "wires": [
            [
                "f80fd734.5eaf78"
            ]
        ]
    },
    {
        "id": "456f991.d8a2f68",
        "type": "change",
        "z": "69e2235f.5b2b3c",
        "name": "změna",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "tlacitko",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 697,
        "y": 1160,
        "wires": [
            [
                "879daccd.44018"
            ]
        ]
    },
    {
        "id": "e55696cd.55ae48",
        "type": "mqtt out",
        "z": "69e2235f.5b2b3c",
        "name": "Shelly relé",
        "topic": "shellies/shelly1-93EF36/relay/0/command",
        "qos": "0",
        "retain": "true",
        "broker": "6d608c46.1fd3b4",
        "x": 1276,
        "y": 1132,
        "wires": []
    },
    {
        "id": "7fa03ff8.1644b",
        "type": "rbe",
        "z": "69e2235f.5b2b3c",
        "name": "",
        "func": "rbe",
        "gap": "",
        "start": "",
        "inout": "out",
        "property": "payload",
        "x": 488,
        "y": 1100,
        "wires": [
            [
                "4ba54f9a.af946"
            ]
        ]
    },
    {
        "id": "1d84867b.c2b18a",
        "type": "rbe",
        "z": "69e2235f.5b2b3c",
        "name": "",
        "func": "rbe",
        "gap": "",
        "start": "",
        "inout": "out",
        "property": "payload",
        "x": 488,
        "y": 1160,
        "wires": [
            [
                "456f991.d8a2f68",
                "d87a7fe5.aa8d2"
            ]
        ]
    },
    {
        "id": "f80fd734.5eaf78",
        "type": "change",
        "z": "69e2235f.5b2b3c",
        "name": "převod výstupu pro Shelly",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "1",
                "fromt": "num",
                "to": "on",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1061,
        "y": 1132,
        "wires": [
            [
                "e55696cd.55ae48"
            ]
        ],
        "inputLabels": [
            "true/false"
        ],
        "outputLabels": [
            "ON/OFF"
        ]
    },
    {
        "id": "b95f70b9.ef46a",
        "type": "change",
        "z": "69e2235f.5b2b3c",
        "name": "změna",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "1",
                "fromt": "num",
                "to": "ON",
                "tot": "str"
            },
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "0",
                "fromt": "num",
                "to": "OFF",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1462,
        "y": 666,
        "wires": [
            [
                "4a1bf459.f2245c",
                "c978c946.3ae468"
            ]
        ]
    },
    {
        "id": "e2322746.e30e68",
        "type": "change",
        "z": "69e2235f.5b2b3c",
        "name": "změna",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "true",
                "fromt": "bool",
                "to": "ON",
                "tot": "str"
            },
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "false",
                "fromt": "bool",
                "to": "OFF",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1462,
        "y": 440,
        "wires": [
            [
                "4a1bf459.f2245c"
            ]
        ]
    },
    {
        "id": "9cf4518f.9563a",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "Ovladač Ikea",
        "func": "var trideni = msg.payload.action;\n\nif (trideni == \"toggle\"){return [msg, null, null, null, null, null, null, null, null, null, null, null, null, null, null];}\n\nif (trideni == \"toggle_hold\"){return [null, msg, null, null, null, null, null, null, null, null, null, null, null, null, null];}\n\nif (trideni == \"brightness_up_click\"){return [null, null, msg, null, null, null, null, null, null, null, null, null, null, null, null];}\n\nif (trideni == \"brightness_up_hold\"){return [null, null, null, msg, null, null, null, null, null, null, null, null, null, null, null];}\n\nif (trideni == \"brightness_up_release\"){return [null, null, null, null, msg, null, null, null, null, null, null, null, null, null, null];}\n\nif (trideni == \"brightness_down_click\"){return [null, null, null, null, null, msg, null, null, null, null, null, null, null, null, null];}\n\nif (trideni == \"brightness_down_hold\"){return [null, null, null, null, null, null, msg, null, null, null, null, null, null, null, null];}\n\nif (trideni == \"brightness_down_release\"){return [null, null, null, null, null, null, null, msg, null, null, null, null, null, null, null];}\n\nif (trideni == \"arrow_right_click\"){return [null, null, null, null, null, null, null, null, msg, null, null, null, null, null, null];}\n\nif (trideni == \"arrow_right_hold\"){return [null, null, null, null, null, null, null, null, null, msg, null, null, null, null, null];}\n\nif (trideni == \"arrow_right_release\"){return [null, null, null, null, null, null, null, null, null, null, msg, null, null, null, null];}\n\nif (trideni == \"arrow_left_click\"){return [null, null, null, null, null, null, null, null, null, null, null, msg, null, null, null];}\n\nif (trideni == \"arrow_left_hold\"){return [null, null, null, null, null, null, null, null, null, null, null, null, msg, null, null];}\n\nif (trideni == \"arrow_left_release\"){return [null, null, null, null, null, null, null, null, null, null, null, null, null, msg, null];}\n\nif (trideni === \"\"){return [null, null, null, null, null, null, null, null, null, null, null, null, null, null, msg];}",
        "outputs": 15,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 730,
        "y": 600,
        "wires": [
            [
                "9d8954a6.331108",
                "11e37099.ca773f"
            ],
            [
                "50da7ac8.55f194"
            ],
            [
                "c4ba2b75.340bc8",
                "b83053be.c3a4d"
            ],
            [
                "652956c9.a5e038"
            ],
            [
                "652956c9.a5e038"
            ],
            [
                "c4ba2b75.340bc8",
                "b83053be.c3a4d"
            ],
            [
                "652956c9.a5e038"
            ],
            [
                "652956c9.a5e038"
            ],
            [
                "1c00fdac.2551e2",
                "48574499.0dc5dc"
            ],
            [
                "aff957.219a96a8"
            ],
            [
                "aff957.219a96a8"
            ],
            [
                "1c00fdac.2551e2",
                "48574499.0dc5dc"
            ],
            [
                "aff957.219a96a8"
            ],
            [
                "aff957.219a96a8"
            ],
            []
        ],
        "icon": "node-red-contrib-time-range-switch/switch.png"
    },
    {
        "id": "c4ba2b75.340bc8",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "jas krok",
        "func": "   var x = 50;\n   var jas = flow.get(\"pracovna1_jas\");\nif(msg.payload.action == \"brightness_up_click\") {\n    \n   var jas_out = (jas + x);\n   if(jas_out >= 255) {jas_out = 255;}\n    msg.payload = {\"brightness\": jas_out}\n    return msg;\n}\n\nif(msg.payload.action == \"brightness_down_click\") {\n    \n   var jas_out = (jas - x);\n   if(jas_out <= 5) {jas_out = 5;}\n    msg.payload = {\"brightness\": jas_out}\n    return msg;\n}\n\n\n \n\n",
        "outputs": 1,
        "noerr": 0,
        "x": 1000,
        "y": 619,
        "wires": [
            [
                "d650268c.9f9748"
            ]
        ]
    },
    {
        "id": "a3b7a1f8.50369",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "paměť jas",
        "func": "var jas = msg.payload.brightness;\n flow.set(\"pracovna1_jas\", jas);\n return msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 678,
        "y": 392,
        "wires": [
            []
        ]
    },
    {
        "id": "b83053be.c3a4d",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "jas krok",
        "func": "   var x = 50;\n   var jas = flow.get(\"pracovna2_jas\");\nif(msg.payload.action == \"brightness_up_click\") {\n    \n   var jas_out = (jas + x);\n   if(jas_out >= 255) {jas_out = 255;}\n    msg.payload = {\"brightness\": jas_out}\n    return msg;\n}\n\nif(msg.payload.action == \"brightness_down_click\") {\n    \n   var jas_out = (jas - x);\n   if(jas_out <= 5) {jas_out = 5;}\n    msg.payload = {\"brightness\": jas_out}\n    return msg;\n}\n\n\n \n\n",
        "outputs": 1,
        "noerr": 0,
        "x": 1000,
        "y": 660,
        "wires": [
            [
                "c9001183.73dc6"
            ]
        ]
    },
    {
        "id": "b99c8144.7d614",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "paměť jas",
        "func": "var jas = msg.payload.brightness;\n flow.set(\"pracovna2_jas\", jas);\n return msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 679,
        "y": 995,
        "wires": [
            []
        ]
    },
    {
        "id": "652956c9.a5e038",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "jas plynule tlačítko",
        "func": "var step = 10;\n\n if(msg.payload.action === \"brightness_up_hold\"){\n flow.set(\"incrementvalue1\",step)\n }\n else if(msg.payload.action === \"brightness_up_release\"){\n flow.set(\"incrementvalue1\",0)\n }\n \n if(msg.payload.action === \"brightness_down_hold\"){\n flow.set(\"incrementvalue1\",step * -1)\n }\n else if(msg.payload.action === \"brightness_down_release\"){\n flow.set(\"incrementvalue1\",0)\n } \nreturn msg\n\n\n \n\n",
        "outputs": 1,
        "noerr": 0,
        "x": 1030,
        "y": 570,
        "wires": [
            []
        ]
    },
    {
        "id": "979ada96.c72bd8",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "jas plynule hodnota",
        "func": "var iv = flow.get(\"incrementvalue1\") || 0;\nif(iv === 0){\n return null\n}\nvar dimmer = flow.get(\"pracovna1_jas\") || 0;\ndimmer += iv;\nif(dimmer >= 255){\n dimmer = 255;\n}\nif(dimmer <= 5){\n dimmer = 5;\n}\n\nflow.set(\"pracovna1_jas\",dimmer)\n\nmsg.payload = {\"brightness\": dimmer}\nreturn msg",
        "outputs": 1,
        "noerr": 0,
        "x": 1423,
        "y": 492,
        "wires": [
            [
                "d650268c.9f9748"
            ]
        ]
    },
    {
        "id": "6a910130.db572",
        "type": "inject",
        "z": "69e2235f.5b2b3c",
        "name": "0.25s",
        "repeat": ".25",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 1210,
        "y": 493,
        "wires": [
            [
                "979ada96.c72bd8",
                "fafb9c0f.e576c",
                "7cc2ef3f.8c926",
                "4fcbea67.fdb854"
            ]
        ]
    },
    {
        "id": "fafb9c0f.e576c",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "jas plynule hodnota",
        "func": "var iv = flow.get(\"incrementvalue1\") || 0;\nif(iv === 0){\n return null\n}\nvar dimmer = flow.get(\"pracovna2_jas\") || 0;\ndimmer += iv;\nif(dimmer >= 255){\n dimmer = 255;\n}\nif(dimmer <= 5){\n dimmer = 5;\n}\n\nflow.set(\"pracovna2_jas\",dimmer)\n\nmsg.payload = {\"brightness\": dimmer}\nreturn msg",
        "outputs": 1,
        "noerr": 0,
        "x": 1423,
        "y": 560,
        "wires": [
            [
                "c9001183.73dc6"
            ]
        ]
    },
    {
        "id": "d650268c.9f9748",
        "type": "switch",
        "z": "69e2235f.5b2b3c",
        "name": "ON",
        "property": "stav_pracovna1",
        "propertyType": "flow",
        "rules": [
            {
                "t": "true"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 1459,
        "y": 393,
        "wires": [
            [
                "4a1bf459.f2245c"
            ]
        ]
    },
    {
        "id": "83e5a4a.23aef58",
        "type": "change",
        "z": "69e2235f.5b2b3c",
        "name": "ON/OFF",
        "rules": [
            {
                "t": "set",
                "p": "stav_pracovna1",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 864,
        "y": 393,
        "wires": [
            []
        ]
    },
    {
        "id": "a021be.9bc46e4",
        "type": "change",
        "z": "69e2235f.5b2b3c",
        "name": "ON/OFF",
        "rules": [
            {
                "t": "set",
                "p": "stav_pracovna2",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 863,
        "y": 987,
        "wires": [
            []
        ]
    },
    {
        "id": "c9001183.73dc6",
        "type": "switch",
        "z": "69e2235f.5b2b3c",
        "name": "ON",
        "property": "stav_pracovna2",
        "propertyType": "flow",
        "rules": [
            {
                "t": "true"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 1464,
        "y": 716,
        "wires": [
            [
                "c978c946.3ae468"
            ]
        ]
    },
    {
        "id": "1c00fdac.2551e2",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "barva krok",
        "func": "   var x = 50;\n   var barva = flow.get(\"pracovna1_barva\");\nif(msg.payload.action == \"arrow_right_click\") {\n    \n   var barva_out = (barva + x);\n   if(barva_out >= 500) {barva_out = 500;}\n   if(barva_out == 500) {barva_out = 153;}\n    msg.payload = {\"color_temp\": barva_out}\n    return msg;\n}\n\nif(msg.payload.action == \"arrow_left_click\") {\n    \n   var barva_out = (barva - x);\n   if(barva_out <= 153) {barva_out = 153;}\n   if(barva_out == 153) {barva_out = 500;}\n    msg.payload = {\"color_temp\": barva_out}\n    return msg;\n}\n\n\n \n\n",
        "outputs": 1,
        "noerr": 0,
        "x": 1010,
        "y": 703,
        "wires": [
            [
                "d650268c.9f9748"
            ]
        ]
    },
    {
        "id": "187cb59b.dfe9aa",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "paměť barva",
        "func": "var barva = msg.payload.color_temp;\n flow.set(\"pracovna1_barva\", barva);\n return msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 674,
        "y": 348,
        "wires": [
            []
        ]
    },
    {
        "id": "48574499.0dc5dc",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "barva krok",
        "func": "   var x = 50;\n   var barva = flow.get(\"pracovna2_barva\");\nif(msg.payload.action == \"arrow_right_click\") {\n    \n   var barva_out = (barva + x);\n   if(barva_out >= 500) {barva_out = 500;}\n   if(barva_out == 500) {barva_out = 153;}\n    msg.payload = {\"color_temp\": barva_out}\n    return msg;\n}\n\nif(msg.payload.action == \"arrow_left_click\") {\n    \n   var barva_out = (barva - x);\n   if(barva_out <= 153) {barva_out = 153;}\n   if(barva_out == 153) {barva_out = 500;}\n    msg.payload = {\"color_temp\": barva_out}\n    return msg;\n}\n\n\n \n\n",
        "outputs": 1,
        "noerr": 0,
        "x": 1010,
        "y": 747,
        "wires": [
            [
                "c9001183.73dc6"
            ]
        ]
    },
    {
        "id": "e3e9cd67.a03ef",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "paměť barva",
        "func": "var barva = msg.payload.color_temp;\n flow.set(\"pracovna2_barva\", barva);\n return msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 668,
        "y": 955,
        "wires": [
            []
        ]
    },
    {
        "id": "aff957.219a96a8",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "barva plynule tlačítko",
        "func": "var step = 20;\n\n if(msg.payload.action === \"arrow_right_hold\"){\n flow.set(\"incrementvalue2\",step)\n }\n else if(msg.payload.action === \"arrow_right_release\"){\n flow.set(\"incrementvalue2\",0)\n }\n \n if(msg.payload.action === \"arrow_left_hold\"){\n flow.set(\"incrementvalue2\",step * -1)\n }\n else if(msg.payload.action === \"arrow_left_release\"){\n flow.set(\"incrementvalue2\",0)\n } \nreturn msg\n\n\n \n\n",
        "outputs": 1,
        "noerr": 0,
        "x": 1035,
        "y": 794,
        "wires": [
            []
        ]
    },
    {
        "id": "7cc2ef3f.8c926",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "barva plynule hodnota",
        "func": "var iv = flow.get(\"incrementvalue2\") || 0;\nif(iv === 0){\n return null\n}\nvar dimmer = flow.get(\"pracovna1_barva\") || 0;\ndimmer += iv;\nif(dimmer >= 500){dimmer = 500;}\nif(dimmer == 500){dimmer = 153;}\nif(dimmer <= 153){dimmer = 153;}\n\nflow.set(\"pracovna1_barva\",dimmer)\n\nmsg.payload = {\"color_temp\": dimmer}\nreturn msg",
        "outputs": 1,
        "noerr": 0,
        "x": 1434,
        "y": 767,
        "wires": [
            [
                "d650268c.9f9748"
            ]
        ]
    },
    {
        "id": "4fcbea67.fdb854",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "barva plynule hodnota",
        "func": "var iv = flow.get(\"incrementvalue2\") || 0;\nif(iv === 0){\n return null\n}\nvar dimmer = flow.get(\"pracovna2_barva\") || 0;\ndimmer += iv;\nif(dimmer >= 500){dimmer = 500;}\nif(dimmer == 500){dimmer = 153;}\nif(dimmer <= 153){dimmer = 153;}\n\nflow.set(\"pracovna2_barva\",dimmer)\n\nmsg.payload = {\"color_temp\": dimmer}\nreturn msg",
        "outputs": 1,
        "noerr": 0,
        "x": 1437,
        "y": 836,
        "wires": [
            [
                "c9001183.73dc6"
            ]
        ]
    },
    {
        "id": "50da7ac8.55f194",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "default",
        "func": "   var barva = 153;\n   var jas = 255;\nif(msg.payload.action == \"toggle_hold\") {\n\n    msg.payload = {\"brightness\": jas, \"color_temp\": barva}\n    return msg;\n}\n\n\n\n \n\n",
        "outputs": 1,
        "noerr": 0,
        "x": 990,
        "y": 524,
        "wires": [
            [
                "d650268c.9f9748",
                "c9001183.73dc6"
            ]
        ]
    },
    {
        "id": "b885bb4f.6fc328",
        "type": "function",
        "z": "69e2235f.5b2b3c",
        "name": "Status",
        "func": "if(msg.payload.state == 1) {\n    \n   msg.payload = \"toggle\";  \n}\nelse {\n  msg.payload = \"toggle\";\n}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 590,
        "y": 660,
        "wires": [
            [
                "9d8954a6.331108",
                "11e37099.ca773f"
            ]
        ]
    },
    {
        "id": "8b6022c6.f3ce7",
        "type": "rbe",
        "z": "69e2235f.5b2b3c",
        "name": "",
        "func": "rbe",
        "gap": "",
        "start": "",
        "inout": "out",
        "property": "payload",
        "x": 544,
        "y": 760,
        "wires": [
            [
                "b885bb4f.6fc328"
            ]
        ]
    },
    {
        "id": "84d5a16e.db6cc",
        "type": "inject",
        "z": "69e2235f.5b2b3c",
        "name": "První spuštění",
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": "",
        "topic": "firsboot",
        "payload": "{\"state\":\"OFF\"}",
        "payloadType": "json",
        "x": 1740,
        "y": 580,
        "wires": [
            [
                "4a1bf459.f2245c",
                "c978c946.3ae468"
            ]
        ]
    },
    {
        "id": "71b092fc.987cbc",
        "type": "change",
        "z": "69e2235f.5b2b3c",
        "name": "změna",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "1",
                "fromt": "num",
                "to": "ON",
                "tot": "str"
            },
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "0",
                "fromt": "num",
                "to": "OFF",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1482,
        "y": 960,
        "wires": [
            [
                "c978c946.3ae468"
            ]
        ]
    },
    {
        "id": "1cc8a3d4.3f0d2c",
        "type": "trigger",
        "z": "69e2235f.5b2b3c",
        "name": "10s",
        "op1": "",
        "op2": "",
        "op1type": "pay",
        "op2type": "pay",
        "duration": "-10",
        "extend": true,
        "units": "s",
        "reset": "",
        "bytopic": "all",
        "outputs": 1,
        "x": 1010,
        "y": 1040,
        "wires": [
            [
                "603f6485.3d39fc"
            ]
        ]
    },
    {
        "id": "36734ab6.e026f6",
        "type": "trigger",
        "z": "69e2235f.5b2b3c",
        "name": "10s",
        "op1": "",
        "op2": "",
        "op1type": "pay",
        "op2type": "pay",
        "duration": "-10",
        "extend": true,
        "units": "s",
        "reset": "",
        "bytopic": "all",
        "outputs": 1,
        "x": 1010,
        "y": 440,
        "wires": [
            [
                "f77474b7.872d18"
            ]
        ]
    },
    {
        "id": "d87a7fe5.aa8d2",
        "type": "api-call-service",
        "z": "69e2235f.5b2b3c",
        "name": "hassio pracovna",
        "server": "67e633d.daebecc",
        "service_domain": "input_boolean",
        "service": "turn_off",
        "data": "",
        "mergecontext": "",
        "x": 1180,
        "y": 666,
        "wires": [
            [
                "b95f70b9.ef46a"
            ]
        ]
    },
    {
        "id": "7cef1b26.4fc364",
        "type": "api-call-service",
        "z": "69e2235f.5b2b3c",
        "name": "hassio pracovna",
        "server": "67e633d.daebecc",
        "service_domain": "input_boolean",
        "service": "turn_off",
        "data": "",
        "mergecontext": "",
        "x": 1180,
        "y": 440,
        "wires": [
            [
                "e2322746.e30e68"
            ]
        ]
    },
    {
        "id": "abfc6a1f.26bca8",
        "type": "api-call-service",
        "z": "69e2235f.5b2b3c",
        "name": "hassio pracovna",
        "server": "67e633d.daebecc",
        "service_domain": "input_boolean",
        "service": "turn_off",
        "data": "",
        "mergecontext": "",
        "x": 1200,
        "y": 960,
        "wires": [
            [
                "71b092fc.987cbc"
            ]
        ]
    },
    {
        "id": "d0ae340f.a9aee8",
        "type": "api-current-state",
        "z": "69e2235f.5b2b3c",
        "name": "hassio",
        "server": "67e633d.daebecc",
        "outputs": 2,
        "halt_if": "on",
        "override_topic": false,
        "entity_id": "input_boolean.svetlo_pracovna",
        "override_payload": "none",
        "x": 1490,
        "y": 896,
        "wires": [
            [],
            [
                "1346eccd.d2a1e3"
            ]
        ]
    },
    {
        "id": "65bcb43e.77f2ac",
        "type": "api-current-state",
        "z": "69e2235f.5b2b3c",
        "name": "hassio",
        "server": "67e633d.daebecc",
        "outputs": 2,
        "halt_if": "on",
        "override_topic": false,
        "entity_id": "input_boolean.svetlo_pracovna",
        "override_payload": "none",
        "x": 1450,
        "y": 296,
        "wires": [
            [],
            [
                "601fc87c.9e6858"
            ]
        ]
    },
    {
        "id": "60109daa.a47d74",
        "type": "traffic",
        "z": "69e2235f.5b2b3c",
        "name": "SR",
        "property_allow": "topic",
        "filter_allow": "neshoda",
        "ignore_case_allow": false,
        "negate_allow": false,
        "send_allow": true,
        "property_stop": "topic",
        "filter_stop": "shoda",
        "ignore_case_stop": false,
        "negate_stop": false,
        "send_stop": false,
        "default_start": false,
        "differ": false,
        "x": 1329,
        "y": 296,
        "wires": [
            [
                "65bcb43e.77f2ac"
            ]
        ]
    },
    {
        "id": "161a7e28.569072",
        "type": "traffic",
        "z": "69e2235f.5b2b3c",
        "name": "SR",
        "property_allow": "topic",
        "filter_allow": "neshoda",
        "ignore_case_allow": false,
        "negate_allow": false,
        "send_allow": true,
        "property_stop": "topic",
        "filter_stop": "shoda",
        "ignore_case_stop": false,
        "negate_stop": false,
        "send_stop": false,
        "default_start": false,
        "differ": false,
        "x": 1349,
        "y": 896,
        "wires": [
            [
                "d0ae340f.a9aee8"
            ]
        ]
    },
    {
        "id": "6d608c46.1fd3b4",
        "type": "mqtt-broker",
        "z": "",
        "name": "MOSQUITTO",
        "broker": "",
        "port": "",
        "clientid": "",
        "usetls": false,
        "compatmode": true,
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "willTopic": "",
        "willQos": "0",
        "willPayload": ""
    }
]
@S474N: jelikož máš z dimmeru pouze dva stavy, tak bych se zaměřil na vlastní generování "dimming"
Řešení máš ve výše uvedeném příkladu, kde si budeš muset jako první spolehlivě odfiltorvat 0 a 255, takže informaci zda zvyšuješ, nebo snižuješ jas. U Ikea řešení je tohle řešeno funkcí:
Kód:
var trideni = msg.payload.action;

if (trideni == "toggle"){return [msg, null, null, null, null, null, null, null, null, null, null, null, null, null, null];}

if (trideni == "toggle_hold"){return [null, msg, null, null, null, null, null, null, null, null, null, null, null, null, null];}

if (trideni == "brightness_up_click"){return [null, null, msg, null, null, null, null, null, null, null, null, null, null, null, null];}

if (trideni == "brightness_up_hold"){return [null, null, null, msg, null, null, null, null, null, null, null, null, null, null, null];}

if (trideni == "brightness_up_release"){return [null, null, null, null, msg, null, null, null, null, null, null, null, null, null, null];}

if (trideni == "brightness_down_click"){return [null, null, null, null, null, msg, null, null, null, null, null, null, null, null, null];}

if (trideni == "brightness_down_hold"){return [null, null, null, null, null, null, msg, null, null, null, null, null, null, null, null];}

if (trideni == "brightness_down_release"){return [null, null, null, null, null, null, null, msg, null, null, null, null, null, null, null];}

if (trideni == "arrow_right_click"){return [null, null, null, null, null, null, null, null, msg, null, null, null, null, null, null];}

if (trideni == "arrow_right_hold"){return [null, null, null, null, null, null, null, null, null, msg, null, null, null, null, null];}

if (trideni == "arrow_right_release"){return [null, null, null, null, null, null, null, null, null, null, msg, null, null, null, null];}

if (trideni == "arrow_left_click"){return [null, null, null, null, null, null, null, null, null, null, null, msg, null, null, null];}

if (trideni == "arrow_left_hold"){return [null, null, null, null, null, null, null, null, null, null, null, null, msg, null, null];}

if (trideni == "arrow_left_release"){return [null, null, null, null, null, null, null, null, null, null, null, null, null, msg, null];}

if (trideni === ""){return [null, null, null, null, null, null, null, null, null, null, null, null, null, null, msg];}
Následně pomocí funkce jas plynule definuješ kroky regulace:
Kód:
var step = 10;

 if(msg.payload.action === "brightness_up_hold"){
 flow.set("incrementvalue1",step)
 }
 else if(msg.payload.action === "brightness_up_release"){
 flow.set("incrementvalue1",0)
 }
 
 if(msg.payload.action === "brightness_down_hold"){
 flow.set("incrementvalue1",step * -1)
 }
 else if(msg.payload.action === "brightness_down_release"){
 flow.set("incrementvalue1",0)
 }
return msg
A nakonec posíláš požadovaný výsledek:
Kód:
var iv = flow.get("incrementvalue1") || 0;
if(iv === 0){
 return null
}
var dimmer = flow.get("pracovna1_jas") || 0;
dimmer += iv;
if(dimmer >= 255){
 dimmer = 255;
}
if(dimmer <= 5){
 dimmer = 5;
}

flow.set("pracovna1_jas",dimmer)

msg.payload = {"brightness": dimmer}
return msg


Přiložené soubory Miniatury
   
 
Citovat
Zaujímavá téma, no skoro som sa v tom už stratil....

Takže pre tých, ktorý hľadajú jednoduché a dostupné riešenie bez nutnosti vyššie spomínaných znalosti "jadrového odborníka" odporúčam začať u produktov od značky Shelly - a ich ponúkaného cloudového riešenia (https://shelly.cloud). Neskôr v prípade potreby sa môžete presunúť na vlastný server, no to už budete mať aspoň akú takú skúsenosť a hlavne zapojené potrebné svetlá, senzory, relé...

Ponuka je dostatočne široká na to aby pokryla vaše prvotné požiadavky - https://shop.shelly.cloud

A ešte ukážka AUTOmatizácie ... 1


Přiložené soubory Miniatury
       
 
Citovat
@nicko: to je vlastne to same, co jsme doporucovali vyse - Sonoff. Necht si kazdy vybere, co je mu blizsi ci levnejsi. Fungovat budou produkty obou dvou znacek.

Jen teda k Sonoffu jeste napisu, ze idealne brat verze DIY, protoze jsou krasne OTA (over the air) presflashovat na Tasmotu. Neni tedy treba nic pajet nebo vyrabet patice na programovani.
> https://www.s474n.com/iot-smarthome-sono...e-tasmota/

@cuore: diky za konkretni priklad z praxe. Musim se na to nekdy v klidu podivat, protoze ten "pavouk" je doslova brutalni 40
Apple TV 4K gen.3 128GB - tvOS 16.2 (iSCC, KODI 19.4) & 3x HomePod - audioOS 16.2 & RPi 4B 8GB RAM - IOTstack & 1x RPi 2B - Raspbian & RPi Zero
Intel NUC NUC10i5FNK - i5 10210U, 64GB RAM, ESXi (W10, W11, Debian,...) 
iPhone 15 Pro 512 GB - iOS v17.2.1 (KODI 19.4) & Apple Watch 9 45mm v10.2
iPad Pro 11 512 GB - iPadOS v17.2.1 (KODI 19.4)
 
Citovat
  


Přejít na fórum:


Prochází: 1 host(ů)