Browse Source

cleanup code Nodescanner

micha 3 months ago
parent
commit
ed733b2667
5 changed files with 348 additions and 103 deletions
  1. 1 0
      lib/ArtNetNode.py
  2. 254 98
      tool/TK-Nodescanner.py
  3. 1 1
      tool/TK-Nodescanner2.py
  4. 40 0
      tool/cprint.py
  5. 52 4
      tool/nodescan.py

+ 1 - 0
lib/ArtNetNode.py

@@ -67,6 +67,7 @@ class ArtNetNode():
             dmx_count += 1
             c.append(struct.pack("B",v))
         c = b"".join(c)
+        self._data = c
         if port:
             self.s.sendto(c, (self.sendto, port)) # default 6454
         else:

+ 254 - 98
tool/TK-Nodescanner.py

@@ -16,9 +16,14 @@ import tkinter as Tkinter
 import _thread as thread
 import datetime
 
+from cprint import cprint
+
 import nodescan 
 #import nodescan2 #as nodescaner
 
+_file_path = "/opt/LibreLight/Xdesk/"
+sys.path.insert(0,"/opt/LibreLight/Xdesk/")
+
 title = "TK-ArtNet-Nodscaner"
 sys.stdout.write("\x1b]2;"+title+"\x07")
 
@@ -28,7 +33,7 @@ try:
     mc = memcache.Client(['127.0.0.1:11211'], debug=0)
     #mc.set("dmx-1", [1]*512)
 except Exception as e:
-    print("Exception",e)
+    cprint("Exception",e,color="red")
 
 #lock.acquire()
 #lock.release()
@@ -60,7 +65,7 @@ class LOCK_BUF():
 node_list = LOCK_BUF() #[]
 
 def fill_form(event=None):
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     global node_list
     clear_form()
 
@@ -69,14 +74,14 @@ def fill_form(event=None):
     try:
         csel = li_nodes.curselection()[0]
     except Exception as e:
-        print("ERR no node selected in node-list:",e)
+        cprint("ERR no node selected in node-list:",e,color="red")
         return 0
     print("+++",[csel,len(node_list2)])
 
     try:
         sel = int(li_nodes.get(csel).split()[0])-1
     except:
-        print("ERR no leeding number in Listbox.line" )
+        cprint("ERR no leeding number in Listbox.line" ,color="red")
         return 0
 
     if not node_list2:
@@ -107,14 +112,14 @@ def fill_form(event=None):
         else:
             univ = ord(node_list2[sel]["SwOut"][0:1]) 
     except Exception as e:
-        print("load Exception",e)
+        cprint("load Exception",e,color="red")
         MSG["text"] = e
         MSG["bg"] = "red"
     e_artnet_uni1.insert("end",univ) 
 
     
 def clear_form():
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     e_ip.configure(state='normal')
     e_ip.delete("0","end")
     e_ip.configure(state='readonly')
@@ -127,12 +132,12 @@ def clear_form():
 
     
 def clear_node_list():
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     li_nodes.delete("0","end")
 
     
 def poll(delay=1,ip=""):
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
 
     if not ip:
         ip = p_variable.get()
@@ -143,12 +148,12 @@ def poll(delay=1,ip=""):
     fill_form()
     
 def clear(event= None):
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     clear_node_list()
     clear_form()
     
 def poll_loop():
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     time.sleep(1)
     while 1:
         poll()
@@ -159,7 +164,7 @@ rx = nodescan.ArtNetNodes()
 #rx = nodescan2        
 
 def scan():
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     global rx,node_list,old_tick,Scrollbar
     print("get node from cache "    )
     li_nodes.insert("end",str("----"))
@@ -169,19 +174,20 @@ def scan():
         try:
             _scan()
         except Exception as e:
-            print("_scan Exception as",e) #,e.argv)
+            cprint("_scan Exception as",e,color="red") #,e.argv)
             MSG["text"] = e
             MSG["bg"] = "red"
         time.sleep(0.3)
 
 import nodescan2 #as nodescan2
 def _scan():
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     #print(sys._getframe().f_code.co_name)
     global rx,node_list,old_tick,Scrollbar
     ips = nodescan2.os_list_ip() #example
-    for i,v in ips.items():
-        print(i,v)
-        #get_mask(ips)
+    #for i,v in ips.items():
+    #    print(" ",i,v)
+    #    #get_mask(ips)
     nodescan2.ArtPoll()
 
     nodes = []
@@ -224,7 +230,12 @@ def _scan():
     time.sleep(10)
 
 def refresh_node_list():
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
+    refresh_node_list1()
+    refresh_node_list2()
+
+def refresh_node_list1():
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     #aprint(len(nodes))
     li_node_scroll = li_nodes.yview()
     
@@ -283,7 +294,7 @@ def refresh_node_list():
             REFRESHSTAMP = time.time()-float(node["REFRESHSTAMP"])
             timeline +="  PING:%0.1f"% REFRESHSTAMP 
             li_nodes.insert("end",str(node_nr).rjust(3," ") +timeline )
-            if last_change > 10:
+            if last_change > 20:
                 color = li_nodes.itemconfig("end", bg="ORANGE")
         except Exception as e:
             li_nodes.insert("end",str(e)+"\n" )
@@ -310,26 +321,157 @@ def refresh_node_list():
     
     print("scroll:",li_node_scroll)
     
+def refresh_node_list2():
+    cprint(sys._getframe().f_code.co_name,color="yellow")
+    node_nr = 1
+    nodesB = {}
+    for node in node_list.get(): #nodes:
+        k = node["MAC"]
+        nodesB[k] = node
+        
+
+    k_sort = list(nodesB.keys())
+    k_sort.sort()
+
+    node_list.set([]) # =[]
+    for k in k_sort:
+        node_list.append(nodesB[k])
+
+    out = []
+    for k in k_sort:
+
+        print(" ",k)
+        node = nodesB[k]
+
+        txt = " "*5 + "="*30
+        bg=""
+        out.append({"txt":txt,"bg":bg})
+
+        bg  = "lightgrey"
+        txt = str(node_nr).rjust(3," ") +" "+ node["lname"]
+        out.append({"txt":txt,"bg":bg})
+
+        ip = str(node_nr).rjust(3," ") +" "+ node["IP"]
+        bg = ""
+        if "PortTypes" in node:
+            if not node["PortTypes"]:
+                pass
+            if node["PortTypes"][0] == "@":
+                ip += "  DMX-in"
+                bg ="yellow"
+            else:
+                ip += "  DMX-out"
+                bg ="lightgreen" 
+        
+        txt = str(node_nr).rjust(3," ") +" short Name:"+ node["sname"]
+        out.append({"txt":txt,"bg":bg})
+
+        txt=ip
+        bg = ""
+        out.append({"txt":txt,"bg":bg})
+        
+        inout = " UNIVERS OUT="+ str(ord(node["SwOut"][0:1]))+" IN="+ str(ord(node["SwIn"][0:1]))
+        txt = str(node_nr).rjust(3," ") + inout
+        bg = ""
+        out.append({"txt":txt,"bg":bg})
+        
+        txt = str(node_nr).rjust(3," ") +" MAC:"+ node["MAC"]
+        bg = ""
+        out.append({"txt":txt,"bg":bg})
+        
+        txt = ""
+        bg = ""
+        try:
+            last_change=time.time()-float(node["UPDATESTAMP"]) 
+            timeline = ""
+            timeline += " CHANGE:%0.1f"% (last_change)
+            REFRESHSTAMP = time.time()-float(node["REFRESHSTAMP"])
+            timeline +="  PING:%0.1f"% REFRESHSTAMP 
+
+            txt = str(node_nr).rjust(3," ") +timeline 
+            if last_change > 20:
+                bg="ORANGE"
+        except Exception as e:
+            txt = str(e)+"\n" 
+            bg = "red"
+        out.append({"txt":txt,"bg":bg})
+
+        txt=""
+        bg = ""
+        try:
+            if node["BOOT"]:
+                BOOT = time.time()-float(node["BOOT"])
+            else:
+                BOOT = 0
+            timeline ="  BOOT:%0.1f"% BOOT
+
+            txt = str(node_nr).rjust(3," ") +timeline +" sec" 
+            bg = ""
+        except Exception as e:
+            txt = str(e)+"\n" 
+            bg = "red"
+        out.append({"txt":txt,"bg":bg})
+
+        node_nr += 1
     
+        out.append({"txt":"","bg":"white"})
+
+    li_node_scroll = li_nodes.yview()
+    li_nodes.delete("0","end")
+    for i in out:
+        #print("list:",i)
+        li_nodes.insert("end",i["txt"])
+        bg=i["bg"]
+        if not bg:
+            bg = "lightgrey"
+            bg = "#ddd"
+        li_nodes.itemconfig("end", bg=bg)
 
-def get_new_ip(event=None):
-    print(sys._getframe().f_code.co_name)
-    b = e_ip_new.get().replace("[","").replace("]","")
-    return b
 
 def get_new_ip_str(event=None):
-    print(sys._getframe().f_code.co_name)
-    x = get_new_ip()
-    #x = x[1:-1]
+    cprint(sys._getframe().f_code.co_name,color="yellow")
+    x = e_ip_new.get().replace("[","").replace("]","")
     x = x.strip()
-    #x = x.replace(",",".")
     x = x.replace(" ","")
     x = x.split(",")
     print( "get_new_ip_str",x)
     return x
-    
+
+def get_form(event=None):
+    cprint(sys._getframe().f_code.co_name,color="yellow")
+
+    x = e_ip_new.get().replace("[","").replace("]","")
+    x = x.strip()
+    x = x.replace(" ","")
+    x = x.split(",")
+    ip2 = ".".join(x)
+
+    ip = e_ip_new.get()
+    ip = ip.replace(" ","")
+    ip = ip.replace(",",".")
+    MASK = variable.get() #e_mask_new.get()
+    #new_mac = b"CMD MAC6 " + struct.pack("<B",(int(e_mac2.get(),16)))
+    mac = e_mac.get()
+    mac_new = e_mac2.get()
+    ln = e_lname.get()
+    sn = e_sname.get()
+    univ = e_artnet_uni1.get()
+
+    data={}
+    data["IP"] = ip
+    data["IP2"] = ip2
+    data["sname"] = sn
+    data["lname"] = ln
+    data["netmask"] = MASK
+    data["mac"] = mac
+    data["mac_new"] = mac_new
+    data["univ"] = univ
+    print("FORM:",data)
+    return data
+
 def send_artaddr(event=None):
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
+    get_form()
     ln = e_lname.get()
     sn = e_sname.get()
 
@@ -348,11 +490,11 @@ def send_artaddr(event=None):
 
 
 def send_none(event=None):
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     pass
     
 def send_mac(event=None):
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     #new_mac = "CMD MAC6 " + hex(e_mac2.get()) #)
     #new_mac = "CMD MAC6 " + struct.pack("<B",(int(e_mac2.get(),16))).decode()
     new_mac = b"CMD MAC6 " + struct.pack("<B",(int(e_mac2.get(),16)))
@@ -364,54 +506,59 @@ def send_mac(event=None):
         cur_ip +=[int(i)]
     print("SEND MAC:",cur_ip,new_mac)
     nodescan.send_node_cmd(cur_ip,cmd=new_mac)
+    # nodescan.sock.sendto(cmddata2 ,(ip,port))
     #poll(delay=1.5)
 
-def send_dmx_store(event=None):
-    print(sys._getframe().f_code.co_name)
-    cmd = "CMD DMX STORE "
-    
-    a = e_ip.get().replace("[","").replace("]","")
-    cur_ip = []    
-    for i in a.split(","):
-        cur_ip +=[int(i)]
-    print("SEND:",cur_ip,cmd)
-    nodescan.send_node_cmd(cur_ip,cmd)
-    poll(delay=1.5)
 
-def SEND_CMD(cmd="NIX"):
-    print(sys._getframe().f_code.co_name)
+def SEND_CMD(cmd="NIX",entry=None):
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     def cb(event=None):
-        print(sys._getframe().f_code.co_name,cmd)
-        _send_cmd(cmd=cmd)
-    return cb
-
-def send_cmd(event=None):
-    print(sys._getframe().f_code.co_name)
-    cmd = e_cmd.get() #"CMD DMX STORE "
-    _send_cmd(cmd=cmd)
-
-def send_cmd2(event=None):
-    print(sys._getframe().f_code.co_name)
-    cmd = e_cmd2.get() #"CMD DMX STORE "
-    _send_cmd(cmd=cmd)
+        cprint(sys._getframe().f_code.co_name,color="yellow")
+        _cmd=cmd
+        if entry:
+             _cmd = entry.get() #"CMD DMX STORE "
+        print("  SEND_CMD.cb()",[_cmd])
+        if not _cmd:
+            cprint("  SEND_CMD: no cmd",color="red")
+        #_send_cmd(cmd=_cmd)
+        port = 7600
+        form = get_form()
+        if form["IP2"]:
+            _cmd2 = []
+            for i in _cmd:
+                try:
+                    _cmd2.append(ord(i) )
+                except:
+                    _cmd2.append(ord(" ") )
+
+            print("  _cmd2",_cmd2)
+            for i in range(31):
+                if len(_cmd2) < i:
+                    _cmd2.append(0)
+            for i in _cmd2:
+                print(" ",i,i,hex(i))
+
+            _cmd2 = bytes(_cmd2)
+            print("  _cmd2",_cmd2)
+
+            nodescan.sock.sendto(_cmd2 ,(form["IP2"],port))
 
-def send_cmd3(event=None):
-    print(sys._getframe().f_code.co_name)
-    cmd = e_cmd3.get() #"CMD DMX STORE "
-    _send_cmd(cmd=cmd)
+    return cb
 
-def send_cmd4(event=None):
-    print(sys._getframe().f_code.co_name)
-    cmd = e_cmd4.get() #"CMD DMX STORE "
-    _send_cmd(cmd=cmd)
+def send_artdmx(val=127):
+    def cb():
+        form = get_form()
+        print(form)
+        import lib.ArtNetNode as an
+        if form["IP2"] and form["univ"]:
+            artnet = an.ArtNetNode(to=form["IP2"],univ=form["univ"],port=4566)
+            artnet.send([val]*512,port=6454)
+            print(artnet._data)
+    return cb
 
-def send_cmd5(event=None):
-    print(sys._getframe().f_code.co_name)
-    cmd = e_cmd5.get() #"CMD DMX STORE "
-    _send_cmd(cmd=cmd)
     
 def _send_cmd(event=None,cmd=""):
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     #cmd = e_cmd.get() #"CMD DMX STORE "
     cmd = cmd.split(" ")
     value = cmd[-1]
@@ -420,13 +567,13 @@ def _send_cmd(event=None,cmd=""):
     except:pass
     cmd = cmd[:-1] #.append(value)
     cmd.append(value)
-    print("_send_cmd:",cmd)
+    print("_send_cmd:",[cmd])
     cmd=" ".join(map(str,cmd) )
-    a = e_ip.get().replace("[","").replace("]","")
+    a = e_ip.get()
     if not a:
-        print("ERR: _send_cmd STOP no Node-IP selected !! ---------")
-        return 0
-
+        cprint(" NO NODE-IP SELECTED",color="red")
+        return
+    a = a.replace("[","").replace("]","")
     cur_ip = []
     sep = "xx"
     if "," in a:
@@ -435,12 +582,7 @@ def _send_cmd(event=None,cmd=""):
         sep = "."
     for i in a.split(sep):
         cur_ip +=[int(i)]
-    print("SEND:",cur_ip,cmd)
-    b_scan.insert("end", "SendCMD: "+str(cur_ip)+cmd+"\n")
-    #import socket
-    #sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    #sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
-    #nodescan.sock = sock
+    cprint("_cmd_send:",cur_ip ,"CMD:",[cmd],color="yellow")
     nodescan.send_node_cmd(cur_ip,cmd)
     #poll(delay=1.5)
 
@@ -477,7 +619,6 @@ def kill_librelight(event=None):
     poll()
 
 def start_librelight(event=None):
-    print(sys._getframe().f_code.co_name)
     #for i in ["CONSOLE.py","EDITOR.py","ASP"]:
     for i in ["ASP"]:
         cmd='screen -XS "{}" quit | echo ""'.format(i)
@@ -503,7 +644,6 @@ def start_librelight(event=None):
 
 
 def set_ip(event=None):
-    print(sys._getframe().f_code.co_name)
     print("SET NEW IP")
 
     cur_ip=(2,0,0,94)
@@ -535,7 +675,7 @@ def set_ip(event=None):
     poll(delay=1.5)
     
 def set_node_pin(evnet=None):
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     cmd = "CMD DMX=PIN"
     ip = get_new_ip_str()
     print("ip",[ip])
@@ -543,14 +683,14 @@ def set_node_pin(evnet=None):
     poll(delay=1.5)
     
 def set_node_in(evnet=None):
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     cmd="CMD DMX=IN"
     ip = get_new_ip_str()
     nodescan.send_node_cmd(ip,cmd=cmd)
     poll(delay=1.5)
     
 def set_node_out(evnet=None):
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     cmd="CMD DMX=OUT"
     ip = get_new_ip_str()
     nodescan.send_node_cmd(ip,cmd=cmd)
@@ -588,6 +728,7 @@ b_scan.configure(bg="#0f0")
 #POLL ['2.255.255.255', 6454] OK ;
 
 def get_ips():
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     local_ips = []
     #local_ips.append("2.0.0.255")
     cmd='ip a | grep " inet " | cut -d " " -f 6 | sort -h'
@@ -775,7 +916,9 @@ line_frame = Tkinter.Frame(eframe)
 line_frame.pack(side="top",expand=0,fill="x")
 Tkinter.Label(line_frame,text="CMD",font=font3,width=6).pack(side="left",expand=0,fill="y")
 e_cmd = Tkinter.Entry(line_frame,font=font3,width=26)
-e_cmd.bind("<Return>", send_cmd )
+CMD="" #DMX OUT STORE"
+c=SEND_CMD(CMD,entry=e_cmd)
+e_cmd.bind("<Return>", c )
 e_cmd.pack(side="left")
 
 #-------------------------------------------- line
@@ -817,7 +960,29 @@ b_scan.pack(side="top",expand=1,fill="x")
 line_frame = Tkinter.Frame(eframe1)
 line_frame.pack(side="top",expand=0,fill="x")
 
+e = Tkinter.Button(line_frame,text="DMX:0",font=font3,width=16,command=send_artdmx(0),bg="orange")
+e.pack(side="left")
 
+line_frame = Tkinter.Frame(eframe1)
+line_frame.pack(side="top",expand=0,fill="x")
+
+e = Tkinter.Button(line_frame,text="DMX:127",font=font3,width=16,command=send_artdmx(127),bg="orange")
+e.pack(side="left")
+
+line_frame = Tkinter.Frame(eframe1)
+line_frame.pack(side="top",expand=0,fill="x")
+
+e = Tkinter.Button(line_frame,text="DMX:255",font=font3,width=16,command=send_artdmx(255),bg="orange")
+e.pack(side="left")
+
+line_frame = Tkinter.Frame(eframe1)
+line_frame.pack(side="top",expand=0,fill="x")
+e = Tkinter.Label(line_frame,text="",width=16)
+e.pack(side="left")
+
+
+line_frame = Tkinter.Frame(eframe1)
+line_frame.pack(side="top",expand=0,fill="x")
 Tkinter.Label(line_frame,text="CMD",font=font3,width=6).pack(side="left",expand=0,fill="y")
 e_cmd2 = Tkinter.Entry(line_frame,font=font3,width=16)
 CMD="- DMX ERASE"
@@ -859,7 +1024,7 @@ e_cmd5.pack(side="left")
 
 
 def network_listenet():
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     b_scan.insert("end", "log:\n" )
     while 1:
         #print(".")
@@ -879,23 +1044,14 @@ def network_listenet():
 
 
 def update_idletask():
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     while 1:
-        time.sleep(1)
         root.update_idletasks()
-        #print(nodescan.sock)
-        #print(dir(nodescan.sock))
-        #print(nodescan.sock.getsockopt())
-        #if nodescan.sock.connected == 0:
-        #    MSG["text"] = "Nodescanner not Connected !"
-        #    MSG["bg"] = "red"
-        #else:
-        #    MSG["text"] = ""
-        #    MSG["bg"] = "grey"
+        time.sleep(1)
         
 
 def main():
-    print(sys._getframe().f_code.co_name)
+    cprint(sys._getframe().f_code.co_name,color="yellow")
     thread.start_new_thread(scan, () )
     thread.start_new_thread(nodescan.node_cmd_recive, () )
     thread.start_new_thread(network_listenet, () )

+ 1 - 1
tool/TK-Nodescanner2.py

@@ -459,7 +459,7 @@ def set_ip(event=None):
         
     if new_ip == cur_ip:
         print("neu und als IP sind gleich"  )
-        return 0
+        #return 0
     #cur_ip=(2,0,0,94)
     #new_ip=(2,0,0,201)
     

+ 40 - 0
tool/cprint.py

@@ -0,0 +1,40 @@
+#!/usr/bin/python3
+import sys
+
+icolor = 1
+def cprint(*text,color="blue",space=" ",end="\n"):
+    #return 0 #disable print dbg
+    if not color:
+        print(text)
+        return 0
+
+    if color == "green":
+        txt = '\033[92m'
+    elif color == "red":
+        txt = '\033[0;31m\033[1m'
+    elif color == "yellow":
+        txt = '\033[93m\033[1m'
+    elif color == "cyan":
+        txt = '\033[96m'
+    else:
+        txt = '\033[94m'
+    for t in text:
+        txt += str(t ) +" "
+    #HEADER = '\033[95m'
+    #OKBLUE = '\033[94m'
+    #OKCYAN = '\033[96m'
+    #OKGREEN = '\033[92m'
+    #WARNING = '\033[93m'
+    #FAIL = '\033[91m'
+    #ENDC = '\033[0m'
+    #BOLD = '\033[1m'
+    #UNDERLINE = '\033[4m'
+    txt += '\033[0m'
+    print(txt,end=end)
+    #return txt
+    try:
+        sys.stdout.flush() # to grep output
+    except BrokenPipeError as e:
+        print("BROKEN PIPE ERROR CPRINT = EXIT")
+        #exit()
+ 

+ 52 - 4
tool/nodescan.py

@@ -16,6 +16,48 @@ import copy
 import random
 import traceback
 
+#!/usr/bin/python3
+import sys
+import cprint
+
+icolor = 1
+def cprint(*text,color="blue",space=" ",end="\n"):
+    #return 0 #disable print dbg
+    if not color:
+        print(text)
+        return 0
+
+    if color == "green":
+        txt = '\033[92m'
+    elif color == "red":
+        txt = '\033[0;31m\033[1m'
+    elif color == "yellow":
+        txt = '\033[93m\033[1m'
+    elif color == "cyan":
+        txt = '\033[96m'
+    else:
+        txt = '\033[94m'
+    for t in text:
+        txt += str(t ) +" "
+    #HEADER = '\033[95m'
+    #OKBLUE = '\033[94m'
+    #OKCYAN = '\033[96m'
+    #OKGREEN = '\033[92m'
+    #WARNING = '\033[93m'
+    #FAIL = '\033[91m'
+    #ENDC = '\033[0m'
+    #BOLD = '\033[1m'
+    #UNDERLINE = '\033[4m'
+    txt += '\033[0m'
+    print(txt,end=end)
+    #return txt
+    try:
+        sys.stdout.flush() # to grep output
+    except BrokenPipeError as e:
+        cprint("BROKEN PIPE ERROR CPRINT = EXIT",color="red")
+        #exit()
+ 
+
 sys.stdout.write("\x1b]2;Nodescan\x07")
 
 print(socket.AF_INET)
@@ -38,14 +80,20 @@ class socket_warp():
             print(__file__,"BIND",ip_port)
             self.connected = 1
         except socket.error as e:
-            print("Socket 6454 ", "ERR: {0} ".format(e.args))
+            cprint("Socket 6454 ", "ERR: {0} ".format(e.args),color="red")
             #sys.exit()
     def sendto(self,bdata,ip_port=('0.0.0.0',9999)):
         ip,port = ip_port
         print(sys._getframe().f_code.co_name)
         #,sock.sendto(b'Art-Net\x00\x00 \x00\x0e\x06\x00',(ip,port)) # ArtPol / ping
-        self.sock.sendto(bdata,(ip,port)) # ArtPol / ping
-
+        print("sendto--",[ip,port])
+        try:
+            self.sock.sendto(bdata,(ip,port)) # ArtPol / ping
+        except Exception as e:
+            cprint("  ERR ----- ---- ",color="red")
+            cprint(__file__,"sendto",(ip,port),[bdata],color="red")
+            cprint("  ERR",e,color="red")
+            cprint()
     def recvfrom(self,leng):
         #print(sys._getframe().f_code.co_name,data)
         data = b"err"
@@ -53,7 +101,7 @@ class socket_warp():
         try:
             data, addr = self.sock.recvfrom(leng)
         except Exception as e:
-            print(__file__,"ERR",e)
+            cprint(__file__,"ERR",e,color="red")
             time.sleep(1)
         #if data:
         #    print(sys._getframe().f_code.co_name,data)