# -*- encoding: utf-8 -*-
from multiprocessing import Process
import time
import multiprocessing
import json
import RPi.GPIO as GPIO
from gpiozero import MCP3202
import smbus
import sys

info = True
info1 = True
warning = True
error = True

def proces1_fcn():
    http_pom = False
    tornado_pom = False
    sys.path.append('/home/pi/.local/lib/python2.7/site-packages')          #tornado location
    try:
        import tornado.httpserver
        import tornado.websocket
        import tornado.ioloop
        import tornado.web
        from tornado import gen
        import uuid

        clients = []

        class WSHandler(tornado.websocket.WebSocketHandler):

            def open(self):
                clients.append(self)
                self.id = str((uuid.uuid4()).int)                       # random id v tvare int na string
                if info:
                    print 'I1: WS pripojil sa klient', self.id

            def on_message(self, message):

                try:
                    msg_rcv_p1 = json.loads(message)                        # vytvorim slovník z JSON retazca
                except ValueError:
                    self.write_message(message)           # posle sebe nerozpoznanu spravu v tvare obycajneho retazca
                    if warning:
                        print 'W1: Neplatny JSON format, posielam klientom spravu:\n', message       # chyba nie je ziadny cmd

                else:
                    try:
                        if msg_rcv_p1["cmd"] == "init":                     # ak je prikaz init
                            msg_rcv_p1["id"] = self.id                      # pridaj id klienta
                            if info1:
                                print 'I1: Prikaz init od klienta ID: ', self.id
                        else:
                            if info1:
                                print 'I1: Prikaz nie je init'      # id netreba
                    except KeyError:
                        self.write_message(message)                 # posle sebe neplatnu spravu
                        if warning:
                            print 'W1: Neexistuje prikaz'
                    else:
                        q_rcv.put(msg_rcv_p1)                                   # vsetko OK, do zasobniku sa da slovnik s alebo bez id
                        if info1:
                            print 'I1: Zo spravy sa vytvoril slovnik'

            def on_close(self):
                clients.remove(self)
                print('connection closed')

            def check_origin(self, origin):
                return True

        application = tornado.web.Application([
            (r'/ws', WSHandler),
        ])

        def posli_prikaz():
            if not q_snd.empty():
                msg = q_snd.get()                                       # zo zasobnika nacitam JSON objekt so spravou a datami
                if msg["cmd"] == "init":
                    for client in clients:
                        if client.id == msg["id"]:
                            msg["cas"] = time.strftime('%d.%m.%Y %H:%M:%S')
                            client.write_message(json.dumps(msg))       # ak je prikaz init, posli konkretnemu ID spravu init a stav v tvare jednoducheho JSON stringu
                            if info1:
                                print 'I1: posielam prikaz init klientovy ID: ', msg["id"]
                else:
                    for client in clients:
                        client.write_message(json.dumps(msg))           # inak posli spravu a data vsetkym v tvare jednoducheho JSON stringu
                    if info1:
                        print 'I1: posielam prikaz vsetkym\n', json.dumps(msg, indent=4)
            return

        @gen.coroutine
        def loop_100ms():
            while True:
                nxt = gen.sleep(0.1)  # Start the clock.
                yield posli_prikaz()  # Run while the clock is ticking.
                yield nxt  # Wait for the timer to run out.

        if __name__ == "__main__":
            my_ip = '192.168.1.250'
            http_server = tornado.httpserver.HTTPServer(application)
            http_pom = True
            http_server.listen(8888, address=my_ip)
            print '*** Websocket Server Started at', my_ip, ' ***'
            lup = tornado.ioloop.IOLoop.current()
            lup.run_sync(loop_100ms)
            lup.start()
            tornado_pom = True
    except:
        if http_pom:
            http_server.stop()
        if tornado_pom:
            tornado.ioloop.IOLoop.instance().stop()
        print '\n\n**********  Proces 1 cleaned up, reraising exception  **********\n'
        raise

def proces2_fcn():
    try:
        import os.path
        import smbus
        bus = smbus.SMBus(1)
        adc1_zrazky = MCP3202(0)
        adc2_poda = MCP3202(1)
        zrazky_pin = 12
        vlhkost_pin = 13
        okruhy = [27, 22]
        vlhkomer_napajanie_pin = 5
        zrazkomer_napajanie_pin = 26
        GPIO.setwarnings(True)
        GPIO.setup(okruhy + [vlhkomer_napajanie_pin, zrazkomer_napajanie_pin], GPIO.OUT)
        GPIO.setup([zrazky_pin, vlhkost_pin], GPIO.IN, pull_up_down=GPIO.PUD_DOWN)          # pull down aby som nenacitaval random hodnoty z odpojených vstupov
        zmena = False
        prsi = False
        je_vlhko = False
        viac_okruhov_pom = True         # pomocna premenna pre jednorazove odoslanie warningu webu pri spusteni viacerych okruhov
        krok_adc = 60                    # 60sekund
        pred_adc = time.time()-krok_adc
        krok_dht = 10                    # 10sekund
        pred_dht = time.time()-krok_dht
        stav_err = False

        if __name__ == "__main__":

            try:
                with open('/home/pi/zavlaha/stav.txt') as infile:
                    stav = json.load(infile)
            except:
                stav_err = True
            else:
                if info:
                    print("I2: Stav nacitany zo suboru stav.txt")

            if stav_err:
                try:
                    with open('/home/pi/zavlaha/init.txt') as infile:
                        stav = json.load(infile)
                except:
                    print("Err2: Subory stav.txt a init.txt neexistuju")
                    raise
                else:
                    if warning:
                        print("W2: Stav nacitany zo suboru init.txt")

            #  ___ main ___

            while True:

                # 1 aktualizacia vstupov

                # minutová slučka
                if time.time()-pred_adc >= krok_adc:
                    pred_adc += krok_adc

                    GPIO.output(vlhkomer_napajanie_pin, True)  # zapne sa napajanie senzoru a pocka sa
                    GPIO.output(zrazkomer_napajanie_pin, True)  # zapne sa napajanie senzoru a pocka sa
                    time.sleep(0.01)

                    if adc1_zrazky.value == 0.0001220852154804053:
                        if info:
                            print 'Senzor zrážok je odpojený'
                            stav["zrazky"]["hodnota"] = 0
                            zrazky = False

                    else:
                        stav["zrazky"]["hodnota"] = (round((1-adc1_zrazky.value)*100, 1))
                        zrazky = True if stav["zrazky"]["hodnota"] >= stav["zrazky"]["prah"] else False

                    if adc2_poda.value == 0.0001220852154804053:
                        if info:
                            print 'Vlhkomer pôdy je odpojený'
                            stav["vlhkost"]["hodnota"] = 0
                            vlhkost = False

                    else:
                        stav["vlhkost"]["hodnota"] = round((1-adc2_poda.value)*100, 1)
                        vlhkost = True if stav["vlhkost"]["hodnota"] >= stav["vlhkost"]["prah"] else False

                    GPIO.output(vlhkomer_napajanie_pin, False)
                    GPIO.output(zrazkomer_napajanie_pin, False)
                    q_snd.put({'cmd': 'zrazky_hodnota', 'zrazky_hodnota': stav["zrazky"]["hodnota"]})
                    q_snd.put({'cmd': 'vlhkost_hodnota', 'vlhkost_hodnota': stav["vlhkost"]["hodnota"]})
                    print 'Zrážky:', repr(stav["zrazky"]["hodnota"])
                    print 'Pôda:', repr(stav["vlhkost"]["hodnota"])

                # 10s slučka
                if time.time()-pred_dht >= krok_dht:
                    pred_dht += krok_dht
                    humidity = 0.0
                    temperature = 0.0
                    try:
                        data = bus.read_i2c_block_data(0x5c, 0x00, 5)
                        i = 0

                        while not data[0x00] + data[1] + data[2] + data[3] == data[4]:
                            i += 1
                            data = bus.read_i2c_block_data(0x5c, 0x00, 5)
                            if i == 10:
                                humidity = 'pokazeny'
                                temperature = 'senzor'
                                # q_snd.put({'cmd': 'warning', 'msg': 'Senzor teploty a vlhkosti je pokazeny'})
                                print 'Senzor teploty a vlhkosti je pokazeny'
                                break
                        if i < 10:
                            humidity = data[0x00]+float(data[1])/10
                            temperature = data[2]+float(data[3])/10
                            print 'Vlhkost = ', humidity, '%'
                            print 'Teplota : ', temperature, 'C'

                    except IOError:
                        humidity = 'odpojeny'
                        temperature = 'senzor'
                        if info:
                            print 'Senzor teploty a vlhkosti je odpojeny'

                    if stav["dht"]["teplota"] != temperature:
                        stav["dht"]["teplota"] = temperature
                        q_snd.put({'cmd': 'dht_teplota', 'dht_teplota': temperature})     # do zasobnika sa da JSON objekt TO_DO nie JSON objekt ale python slovnik vsade !!!
                        zmena = True                                                    # pomocna premenna pre zapis do suboru
                        if info:
                            print 'I2 dht teplota: ', temperature

                    if stav["dht"]["vlhkost"] != humidity:
                        stav["dht"]["vlhkost"] = humidity
                        q_snd.put({'cmd': 'dht_vlhkost', 'dht_vlhkost': humidity})     # do zasobnika sa da JSON objekt TO_DO nie JSON objekt ale python slovnik vsade !!!
                        zmena = True                                                    # pomocna premenna pre zapis do suboru
                        if info:
                            print 'I2 dht vlhkost: ', humidity

                if stav["zrazky"]["stav"] != zrazky:
                    stav["zrazky"]["stav"] = zrazky
                    q_snd.put({'cmd': 'zrazky_stav', 'zrazky_stav': zrazky})
                    zmena = True
                    if info:
                        print 'I2 zrazky stav: ', zrazky

                if stav["vlhkost"]["stav"] != vlhkost:
                    stav["vlhkost"]["stav"] = vlhkost
                    q_snd.put({'cmd': 'vlhkost_stav', 'vlhkost_stav': vlhkost})
                    zmena = True
                    if info:
                        print 'I2 vlhkost stav: ', vlhkost

                # 2 vyhodnotenie prikazov

                if not q_rcv.empty():
                    msg_rcv = q_rcv.get()                           # prijmem spravu ako JSON objekt
                    try:
                        cmd = msg_rcv["cmd"]                           # oddelim si prikaz

                        if cmd == "init":
                            msg_rcv_tmp = stav                          # ak je prikaz init, do spravy dam stav
                            msg_rcv_tmp["cmd"] = msg_rcv["cmd"]         # pridam prikaz a id
                            msg_rcv_tmp["id"] = msg_rcv["id"]
                            q_snd.put(msg_rcv_tmp)                      # do zasobniku dam JSON objekt
                            if info:
                                print 'I2: Rcv msg: init od klienta id: ', msg_rcv["id"]

                        elif cmd == "zaliev_aut_rezim":
                            if stav[cmd] != msg_rcv[cmd]:
                                stav[cmd] = msg_rcv[cmd]                  # ak sa zmeni hodnota, zmena stavu, WEB, log
                                q_snd.put(msg_rcv)                          # do zasobniku dam JSON objekt
                                zmena = True
                                if not stav[cmd]:                      # ak sa prepne na manualny rezim, okruhy sa vypnu
                                    stav["okruh"][0]["manualne"] = False
                                    stav["okruh"][1]["manualne"] = False
                                    q_snd.put({"cmd": "okruh", "okruh": 0, "manualne": False})  # do zasobniku dam JSON objekt
                                    q_snd.put({"cmd": "okruh", "okruh": 1, "manualne": False})  # do zasobniku dam JSON objekt

                                if info:
                                    print 'I2: zaliev_aut_rezim=', stav[cmd]
                            else:
                                if info1:
                                    print 'I2: zaliev_aut_rezim ma rovnaku hodnotu'

                        elif cmd == "okruh":
                            cmd_ok = False              # pomocna premenna pre vyhodnotenie prikazu

                            # okruh cas on
                            try:
                                time_rcv_on = time.strptime(msg_rcv["on"], '%H:%M')                    # normalizacia casu 0:00 => 00:00
                                time_rcv_on = time.strftime('%H:%M', time_rcv_on)                      # normalizovany cas spat na string        TO_DO except zly string time ?
                            except KeyError:
                                if info1:
                                    print 'I2: nie je to sprava okruh on'
                            else:
                                if stav["okruh"][msg_rcv["okruh"]]["cas"][msg_rcv["cas"]]["on"] != time_rcv_on:
                                    stav["okruh"][msg_rcv["okruh"]]["cas"][msg_rcv["cas"]]["on"] = time_rcv_on
                                    q_snd.put(msg_rcv)
                                    zmena = True
                                    if info:
                                        print 'I2: okruh', msg_rcv["okruh"], 'cas', msg_rcv["cas"], 'on=', stav["okruh"][msg_rcv["okruh"]]["cas"][msg_rcv["cas"]]["on"]
                                else:
                                    if info1:
                                        print 'I2: okruh ma rovnaku hodnotu casu on'
                                cmd_ok = True           # prikaz sa vyhodnotil

                            # okruh cas off
                            try:
                                time_rcv_off = time.strptime(msg_rcv["off"], '%H:%M')                    # normalizacia casu 0:00 => 00:00
                                time_rcv_off = time.strftime('%H:%M', time_rcv_off)                   # normalizovany cas spat na string
                            except KeyError:
                                if info1:
                                    print 'I2: nie je to sprava okruh off'
                            else:
                                if stav["okruh"][msg_rcv["okruh"]]["cas"][msg_rcv["cas"]]["off"] != time_rcv_off:
                                    stav["okruh"][msg_rcv["okruh"]]["cas"][msg_rcv["cas"]]["off"] = time_rcv_off
                                    q_snd.put(msg_rcv)
                                    zmena = True
                                    if info:
                                        print 'I2: okruh', msg_rcv["okruh"], 'cas', msg_rcv["cas"], 'off=', stav["okruh"][msg_rcv["okruh"]]["cas"][msg_rcv["cas"]]["off"]
                                else:
                                    if info1:
                                        print 'I2: okruh ma rovnaku hodnotu casu off'

                                cmd_ok = True          # prikaz sa vyhodnotil

                            # okruh aut_rezim
                            try:
                                aut_rezim = msg_rcv["aut_rezim"]
                            except KeyError:
                                if info1:
                                    print 'I2: nie je to sprava aut_rezim'
                            else:
                                if stav["okruh"][msg_rcv["okruh"]]["aut_rezim"] != aut_rezim:
                                    stav["okruh"][msg_rcv["okruh"]]["aut_rezim"] = aut_rezim
                                    q_snd.put(msg_rcv)
                                    zmena = True
                                    if info:
                                        print 'I2: okruh', msg_rcv["okruh"], 'aut_rezim =', stav["okruh"][msg_rcv["okruh"]]["aut_rezim"]
                                else:
                                    if info1:
                                        print 'I2: okruh ma rovnaku hodnotu aut_rezim'
                                cmd_ok = True          # prikaz sa vyhodnotil

                            # okruh manualne
                            try:
                                manualne = msg_rcv["manualne"]
                            except KeyError:
                                if info1:
                                    print 'I2: nie je to sprava manualne'
                            else:
                                if stav["okruh"][msg_rcv["okruh"]]["manualne"] != manualne:
                                    stav["okruh"][msg_rcv["okruh"]]["manualne"] = manualne
                                    q_snd.put(msg_rcv)
                                    zmena = True
                                    if info:
                                        print 'I2: okruh', msg_rcv["okruh"], 'manualne =', stav["okruh"][msg_rcv["okruh"]]["manualne"]
                                else:
                                    if info1:
                                        print 'I2: okruh ma rovnaku hodnotu manualne'
                                cmd_ok = True          # prikaz sa vyhodnotil

                            # prikaz okruh sa nepodarilo vyhodnotit
                            if not cmd_ok:
                                if warning:
                                    print 'W2: vyhodnotenie prikazu okruh sa nepodarilo !\n', json.dumps(msg_rcv, indent=4)

                        # zrazky_bypass
                        elif cmd == "zrazky_bypass":
                            try:
                                zrazky_bypass = msg_rcv[cmd]
                            except KeyError:
                                if warning:
                                    print 'W2: zrazky_bypass chyba\n', json.dumps(msg_rcv, indent=4)
                            else:
                                if stav["zrazky"]["bypass"] != zrazky_bypass:
                                    stav["zrazky"]["bypass"] = zrazky_bypass
                                    q_snd.put(msg_rcv)
                                    zmena = True
                                    if info:
                                        print 'I2: zrazky_bypass = ', stav["zrazky"]["bypass"]
                                else:
                                    if info1:
                                        print 'I2: zrazky_bypass ma rovnaku hodnotu'

                        # vlhkost_bypass
                        elif cmd == "vlhkost_bypass":
                            try:
                                vlhkost_bypass = msg_rcv[cmd]
                            except KeyError:
                                if warning:
                                    print 'W2: vlhkost_bypass chyba\n', json.dumps(msg_rcv, indent=4)
                            else:
                                if stav["vlhkost"]["bypass"] != vlhkost_bypass:
                                    stav["vlhkost"]["bypass"] = vlhkost_bypass
                                    q_snd.put(msg_rcv)
                                    zmena = True
                                    if info:
                                        print 'I2: vlhkost_bypass = ', stav["vlhkost"]["bypass"]
                                else:
                                    if info1:
                                        print 'I2: vlhkost_bypass ma rovnaku hodnotu'

                        # zrazky_prah
                        elif cmd == "zrazky_prah":
                            try:
                                zrazky_prah = msg_rcv[cmd]
                            except KeyError:
                                if warning:
                                    print 'W2: zrazky_prah chyba\n', json.dumps(msg_rcv, indent=4)
                            else:
                                if stav["zrazky"]["prah"] != zrazky_prah:
                                    stav["zrazky"]["prah"] = zrazky_prah
                                    q_snd.put(msg_rcv)
                                    pred_adc -= krok_adc
                                    zmena = True
                                    if info:
                                        print 'I2: zrazky prah = ', stav["zrazky"]["prah"]
                                else:
                                    if info1:
                                        print 'I2: zrazky prah ma rovnaku hodnotu'

                        # vlhkost_prah
                        elif cmd == "vlhkost_prah":
                            try:
                                vlhkost_prah = msg_rcv[cmd]
                            except KeyError:
                                if warning:
                                    print 'W2: vlhkost_prah chyba\n', json.dumps(msg_rcv, indent=4)
                            else:
                                if stav["vlhkost"]["prah"] != vlhkost_prah:
                                    stav["vlhkost"]["prah"] = vlhkost_prah
                                    q_snd.put(msg_rcv)
                                    pred_adc -= krok_adc
                                    zmena = True
                                    if info:
                                        print 'I2: vlhkost prah = ', stav["vlhkost"]["prah"]
                                else:
                                    if info1:
                                        print 'I2: vlhkost prah ma rovnaku hodnotu'

                        else:
                            q_snd.put(msg_rcv)
                            if info:
                                print 'Neznamy prikaz sa posiela spat\n', json.dumps(msg_rcv, indent=4)

                    except KeyError:
                        if warning:
                            print 'W2: V sekcii rozpoznavania prikazov nastala chyba kluca !!!\n', json.dumps(msg_rcv, indent=4)
                    except ValueError:
                        if warning:
                            print 'W2: V sekcii rozpoznavania prikazov nastala chyba hodnoty !!!\n', json.dumps(msg_rcv, indent=4)

                # 3 logika

                # automatika
                if stav["zaliev_aut_rezim"]:                                # ak je zavlaha v automatickom rezime
                    for x in range(0, 2):                                   # iteracia cez okruhy
                        aut_vyp_pom = False
                        if stav["okruh"][x]["aut_rezim"]:                   # ak je okruh v automatickom rezime
                            # automaticke zapnutie okruhu                                                   # pomocna premenna pre zapnutie vystupu
                            for y in range(0, 4):                       # iteracia cez casy (rano, obed, vecer...)
                                if stav["okruh"][x]["cas"][y]["on"] < time.strftime('%H:%M:%S') < stav["okruh"][x]["cas"][y]["off"]:              # ak je cas zavlazovat
                                    # if not GPIO.input(okruhy[x]):                                       # ak sa nezavlazuje
                                    aut_vyp_pom = True                      # je cas zavlazovat dany okruh a zavlazuje sa nastavi sa priznak aby sa nekontrolovalo automaticke vypnutie
                                    if not je_vlhko:
                                        if not stav["zrazky"]["bypass"] or ((stav["zrazky"]["bypass"]) and not stav["zrazky"]["stav"]):
                                            if prsi:
                                                prsi = False                                    # neprsi alebo sa neriesia zrazky
                                            if not GPIO.input(okruhy[x]):                               # ak nieje dany okruh uz zapnuty...
                                                GPIO.output(okruhy[x], True)                            # nastav vystup GPIO prislusneho okruhu na True
                                                stav["okruh"][x]["stav"] = True                         # zmen stav
                                                zmena = True                                            # pomocny priznak pre zapis do suboru
                                                q_snd.put({"cmd": "okruh", "okruh": x, "stav": stav["okruh"][x]["stav"]})           # poslat spravu webu
                                                if info:
                                                    print 'I2: automatika: cas:', y, 'zmenil okruh', x, 'na', stav["okruh"][x]["stav"]
                                        else:
                                            if not prsi:
                                                prsi = True
                                                msg_zrazky = 'Pršíi, nebude sa zalievať'                # pomocny string
                                                GPIO.output(okruhy[0], False)                           # nastav vystup GPIO prislusneho okruhu na False
                                                GPIO.output(okruhy[1], False)                           # nastav vystup GPIO prislusneho okruhu na False
                                                stav["okruh"][0]["stav"] = False                        # zmen stav
                                                stav["okruh"][1]["stav"] = False                        # zmen stav
                                                zmena = True                                            # pomocny priznak pre zapis do suboru
                                                q_snd.put({'cmd': 'warning', 'msg': msg_zrazky})        # webu sa posle warning
                                                q_snd.put({"cmd": "okruh", "okruh": 0, "stav": stav["okruh"][0]["stav"]})           # poslat spravu webu
                                                q_snd.put({"cmd": "okruh", "okruh": 1, "stav": stav["okruh"][1]["stav"]})           # poslat spravu webu
                                                if info:
                                                    print 'I2: ', msg_zrazky

                                    if not prsi:
                                        if not stav["vlhkost"]["bypass"] or ((stav["vlhkost"]["bypass"]) and not stav["vlhkost"]["stav"]):
                                            if je_vlhko:
                                                je_vlhko = False                                    # neprsi alebo sa neriesia zrazky
                                            if not GPIO.input(okruhy[x]):                               # ak nieje dany okruh uz zapnuty...
                                                GPIO.output(okruhy[x], True)                            # nastav vystup GPIO prislusneho okruhu na True
                                                stav["okruh"][x]["stav"] = True                         # zmen stav
                                                zmena = True                                            # pomocny priznak pre zapis do suboru
                                                q_snd.put({"cmd": "okruh", "okruh": x, "stav": stav["okruh"][x]["stav"]})           # poslat spravu webu
                                                if info:
                                                    print 'I2: automatika: cas:', y, 'zmenil okruh', x, 'na', stav["okruh"][x]["stav"]
                                        else:
                                            if not je_vlhko:
                                                je_vlhko = True
                                                msg_vlhko = 'Je vlhko, nebude sa zalievať'                # pomocny string
                                                GPIO.output(okruhy[0], False)                           # nastav vystup GPIO prislusneho okruhu na False
                                                GPIO.output(okruhy[1], False)                           # nastav vystup GPIO prislusneho okruhu na False
                                                stav["okruh"][0]["stav"] = False                        # zmen stav
                                                stav["okruh"][1]["stav"] = False                        # zmen stav
                                                zmena = True                                            # pomocny priznak pre zapis do suboru
                                                q_snd.put({'cmd': 'warning', 'msg': msg_vlhko})        # webu sa posle warning
                                                q_snd.put({"cmd": "okruh", "okruh": 0, "stav": stav["okruh"][0]["stav"]})           # poslat spravu webu
                                                q_snd.put({"cmd": "okruh", "okruh": 1, "stav": stav["okruh"][1]["stav"]})           # poslat spravu webu
                                                if info:
                                                    print 'I2: ', msg_vlhko

                            # automaticke vypnutie okruhu

                            for y in range(0, 4):                       # iteracia cez casy (rano, obed, vecer...)
                                if not stav["okruh"][x]["cas"][y]["on"] < time.strftime('%H:%M:%S') < stav["okruh"][x]["cas"][y]["off"]:              # ak nie je cas zavlazovat
                                    if not aut_vyp_pom:
                                        if GPIO.input(okruhy[x]):                           # ak nieje dany okruh uz vypnuty...
                                                GPIO.output(okruhy[x], False)                   # nastav vystup GPIO prislusneho okruhu na False
                                                stav["okruh"][x]["stav"] = False                # zmen stav
                                                zmena = True                                    # pomocny priznak pre zapis do suboru
                                                q_snd.put({"cmd": "okruh", "okruh": x, "stav": stav["okruh"][x]["stav"]})           # poslat spravu webu
                                                if info:
                                                    print 'I2: automatika: cas', y, 'zmenil okruh', x, 'na', stav["okruh"][x]["stav"]

                        # manual jednotliveho okruhu

                        else:                                                       # okruh je v manualnom rezime
                            if stav["okruh"][x]["manualne"]:                            # okruh ma poziadavok na mnualne otvorenie
                                if not GPIO.input(okruhy[x]):                           # ak nieje dany okruh uz zapnuty...
                                    GPIO.output(okruhy[x], True)                        # nastav vystup GPIO prislusneho okruhu na True
                                    stav["okruh"][x]["stav"] = True                     # zmen stav
                                    zmena = True                                        # pomocny priznak pre zapis do suboru
                                    q_snd.put({"cmd": "okruh", "okruh": x, "stav": stav["okruh"][x]["stav"]})           # poslat spravu webu
                                    if info:
                                        print 'I2: manualna zmena okruhu', x, 'na', stav["okruh"][x]["stav"]

                            else:                                                       # okruh ma poziadavok na mnualne zatvorenie
                                if GPIO.input(okruhy[x]):                               # ak nieje dany okruh uz vypnuty...
                                    GPIO.output(okruhy[x], False)                       # nastav vystup GPIO prislusneho okruhu na False
                                    stav["okruh"][x]["stav"] = False                    # zmen stav
                                    zmena = True                                        # pomocny priznak pre zapis do suboru
                                    q_snd.put({"cmd": "okruh", "okruh": x, "stav": stav["okruh"][x]["stav"]})           # poslat spravu webu
                                    if info:
                                        print 'I2: manualna zmena okruhu', x, 'na', stav["okruh"][x]["stav"]

                # manual vsetky
                else:                                                   # ak je zavlaha v manualnom rezime
                    prsi = False
                    je_vlhko = False
                    for x in range(0, 2):                                   # iteracia cez okruhy
                        if stav["okruh"][x]["manualne"]:                            # okruh ma poziadavok na mnualne otvorenie
                            if not GPIO.input(okruhy[x]):                           # ak nieje dany okruh uz zapnuty...
                                GPIO.output(okruhy[x], True)                        # nastav vystup GPIO prislusneho okruhu na True
                                stav["okruh"][x]["stav"] = True                     # zmen stav
                                zmena = True                                        # pomocny priznak pre zapis do suboru
                                q_snd.put({"cmd": "okruh", "okruh": x, "stav": stav["okruh"][x]["stav"]})           # poslat spravu webu
                                if info:
                                    print 'I2: manualna zmena okruhu', x, 'na', stav["okruh"][x]["stav"]

                        else:                                                       # okruh ma poziadavok na mnualne zatvorenie
                            if GPIO.input(okruhy[x]):                               # ak nieje dany okruh uz vypnuty...
                                GPIO.output(okruhy[x], False)                       # nastav vystup GPIO prislusneho okruhu na False
                                stav["okruh"][x]["stav"] = False                    # zmen stav
                                zmena = True                                        # pomocny priznak pre zapis do suboru
                                q_snd.put({"cmd": "okruh", "okruh": x, "stav": stav["okruh"][x]["stav"]})           # poslat spravu webu
                                if info:
                                    print 'I2: manualna zmena okruhu', x, 'na', stav["okruh"][x]["stav"]

                if GPIO.input(okruhy[0]) and GPIO.input(okruhy[1]):
                    if viac_okruhov_pom:
                        viac_okruhov_pom = False
                        q_snd.put({'cmd': 'warning', 'msg': 'Viacero okruhov je spustenych naraz !'})        # webu sa posle warning
                        print 'I2: viacero okruhov je spustenych naraz !!!'
                else:
                    viac_okruhov_pom = True                 # ak nie je spustenych viacero okruhov naraz nastavi sa priznak pre vyhodnocovanie

                # 4 zapis stavu do suboru

                if zmena:
                    stav["cas"] = time.strftime('%d.%m.%Y %H:%M:%S')
                    with open('/home/pi/zavlaha/stav.txt', 'w') as outfile:
                    # with open('stav.txt', 'w') as outfile:
                        json.dump(stav, outfile, indent=4)
                    zmena = False

                time.sleep(0.1)
    except:
        GPIO.cleanup()
        print '\n\n**********  Proces 2 cleaned up, reraising exception  **********\n'
        raise


if __name__ == "__main__":
    q_rcv = multiprocessing.Queue()
    q_snd = multiprocessing.Queue()
    p1 = Process(name='p1', target=proces1_fcn, )
    p2 = Process(name='p2', target=proces2_fcn, )
    p1.start()
    p2.start()
    print 'Zavlaha 1.0\n', time.strftime('%d.%m.%Y %H:%M:%S')
