diff --git a/i2cserv/i2c_array.py b/i2cserv/i2c_array.py
index 89ef667741f0333a90ad404d4cf6d3ab7a042ca3..51381eea5a05a6f097810c7831789011e7810691 100644
--- a/i2cserv/i2c_array.py
+++ b/i2cserv/i2c_array.py
@@ -100,11 +100,12 @@ class i2c_array(i2c_dev):
         for RCUi in range(self.N):
             for Vari in range(Step):
                 if not(mask[RCUi*Step+Vari]): continue
-                if not(self.I2Cmask[RCUi]<=self.I2Ccut):
-                  mask[RCUi*Step+Vari]=False;
-                  continue;
                 i0=(RCUi*Step+    Vari)*Step2
                 i1=(RCUi*Step+(Vari+1))*Step2
+                if not(self.I2Cmask[RCUi]<=self.I2Ccut):
+#                  mask[RCUi*Step+Vari]=False;  #Use this if we do not what to update opc-ua var with NaN
+                  value1[i0]=None
+                  continue;
                 devreg=var1['devreg'][Vari];
                 width=var1.get('width',8)
                 bitoffset=GetField(var1,'bitoffset',Vari,0)
@@ -115,6 +116,7 @@ class i2c_array(i2c_dev):
                 if not(res):
                   if self.disableI2ConError: self.I2Cmask[RCUi]+=1;
                   if self.I2Cmask[RCUi]>self.I2Ccut: mask[RCUi*Step+Vari]=False;
+                  value1[i0]=None
                   continue;
                 self.I2Cmask[RCUi]=0;
                 value1[i0:i1]=value2
@@ -138,7 +140,7 @@ class i2c_array(i2c_dev):
         if devreg.get('store'):
                 storearray=self.getstorearray(devreg);
                 for RCUi in range(self.N):
-                  if (mask[RCUi]) and (self.I2Cmask[RCUi]<=self.I2Ccut):   
+                  if (mask[RCUi]) and (self.I2Cmask[RCUi]<=self.I2Ccut) and not(value[0] is None):   
                       storearray[RCUi]=value[0]
                       self.RCUi=RCUi;
                 logging.debug(str(("Stored values:",self.getstorearray(devreg))))
@@ -163,7 +165,7 @@ class i2c_array(i2c_dev):
                 self.I2Cmask[RCUi]=0; 
                 value1[RCUi]=value2[0]
                 if devreg.get('store'):
-                  if mask[RCUi]:   
+                  if mask[RCUi] and not(value2[0] is None):   
                       storearray[RCUi]=value2[0]
         logging.debug(str(("Stored values:",self.getstorearray(devreg))))
         return True;
@@ -194,6 +196,7 @@ class i2c_array(i2c_dev):
 #        print(width,bitoffset,l1)
         value2=value
         reg=devreg['register_R']
+        value2[0]=None; #default
         if reg>255: #This is for the monitor ADC (+ DTH)
           callback(0,[250],read=3)
           if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False;
diff --git a/i2cserv/i2c_dev.py b/i2cserv/i2c_dev.py
index 2d59a6cea8f5b5571d102f44c040ea160efa9a5e..c1a8abcb109f03fb1605900eccc945677d3b8d93 100644
--- a/i2cserv/i2c_dev.py
+++ b/i2cserv/i2c_dev.py
@@ -126,12 +126,13 @@ class i2c_dev(hwdev):
 
     def OPCUAReadVariable(self,varid,var1,mask):
       if len(mask)==0: mask=[True]; 
-      logging.info(str(("Read Var",var1['name'],mask)))
+      logging.info(str(("Read Var",var1['name'],"Mask=",mask)))
       if not(var1.get('devreg')): return []
       #data=self.GetVarValueAll(var1)
       #else:             
       oldmask=self.I2Cmask.copy()
       data,mask2=self.GetVarValueMask(var1,mask);
+      logging.info(str(("Read Var",var1['name'],"Data=",data)))
 #      if len(mask)==len(mask2): mask[:]=mask2[:];
 #      elif len(mask)==0: (mask.append(x) for x in mask2);
       Data=OPCUAset(varid,InstType.varSet,data.copy(),mask2.copy())
diff --git a/i2cserv/i2cbitbang1.py b/i2cserv/i2cbitbang1.py
index 47c9a945330863c784b500ac97900e49e58b2810..df5884caa6de99f91dbda4ee394ddf1f85d4ff84 100644
--- a/i2cserv/i2cbitbang1.py
+++ b/i2cserv/i2cbitbang1.py
@@ -48,7 +48,7 @@ class i2cbitbang1(hwdev):
 
 #        ADC_address=dev.Register_W<<1; #Write
         ADC_address=address<<1;#dev.Register_W<<1; #Write
-        logging.info(str(("I2Cbb set",hex(ADC_address),value)))
+        logging.debug(str(("I2Cbb set",hex(ADC_address),value)))
         
         SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
         SetI2C(CLKdev,1,CLKpin,[1]) #Should be high for start
@@ -94,7 +94,7 @@ class i2cbitbang1(hwdev):
 
 
         ADC_address=1+(reg_address<<1); #Read
-        logging.info(str(("I2Cbb get",hex(ADC_address),value)))
+        logging.debug(str(("I2Cbb get",hex(ADC_address),value)))
 
         SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
         SetI2C(CLKdev,1,CLKpin,[1]) #Should be high for start bit
@@ -124,7 +124,8 @@ class i2cbitbang1(hwdev):
               SetI2C(CLKdev,1,CLKpin,[1]) 
               GetI2C(SDAdev,1,SDApin,ack)
 #              print(ack[0])
-              b=(b<<1)+ack[0];
+              if ack[0] is None: b=None
+              elif not b is None: b=(b<<1)+ack[0];
               SetI2C(CLKdev,1,CLKpin,[0]) 
 #          print("RXbyte",hex(b));
           SetI2C(SDAdev,1,SDApin,[0]) 
@@ -139,7 +140,7 @@ class i2cbitbang1(hwdev):
 #        if not(RXbyte()==0x80): return False;
         for i in range(len(value)):
           value[i]=RXbyte(last=(i==len(value)-1))
-        logging.debug(str(("si status:",hex(status),[hex(v) for v in value])))#should be 0x80
+        logging.debug(str(("si status:",hex(status),[hex(v) for v in value])))#should be 0x80 - will fail for None!!
         #stop
         #SetI2C(DIRdev,1,DIRpin,[0]) #low
         SetI2C(CLKdev,1,CLKpin,[1]) 
diff --git a/i2cserv/spibitbang1.py b/i2cserv/spibitbang1.py
index 4bbfb01c0c31fc3cc548979dc9bac574c85e5ac6..b41e5fecb62f0ce0772c1b315092f8d491df357c 100644
--- a/i2cserv/spibitbang1.py
+++ b/i2cserv/spibitbang1.py
@@ -93,7 +93,9 @@ class spibitbang1(hwdev):
         for cnt in range(8*(ADC_bytes+1)):
               GetI2C(SDOdev,1,SDOpin,ret_value) #enable
 #              logging.debug("Got bit"+str((ret_value)))
-              for i in range(N): value[i]=(value[i]<<1)+ ret_value[i]
+              for i in range(N): 
+                   if ret_value is None: value[i]=None 
+                   elif not value[i] is None: value[i]=(value[i]<<1)+ ret_value[i]
               SetI2C(CLKdev,1,CLKpin,[1]) 
               SetI2C(CLKdev,1,CLKpin,[0])  #read after falling edge
         SetI2C(CSdev,1,CSpin,[1]) #disable
diff --git a/i2cserv/spibitbang2.py b/i2cserv/spibitbang2.py
index 0dedef82fcb86ed04e8e82420143ab22411878e3..e2de015473a7eca942d5045b95f788705b238504 100644
--- a/i2cserv/spibitbang2.py
+++ b/i2cserv/spibitbang2.py
@@ -87,7 +87,10 @@ class spibitbang2(hwdev):
               SetI2C(CLKdev,1,CLKpin,[0]) 
               SetI2C(CLKdev,1,CLKpin,[1])  #read after rising
               GetI2C(SDOdev,1,SDOpin,ret_value) 
-              for i in range(N): value[i]=(value[i]<<1)+ ret_value[i]
+#              for i in range(N): value[i]=(value[i]<<1)+ ret_value[i]
+              for i in range(N): 
+                   if ret_value is None: value[i]=None 
+                   elif not value[i] is None: value[i]=(value[i]<<1)+ ret_value[i]
         SetI2C(CLKdev,1,CLKpin,[0]) 
         SetI2C(CSdev,1,CSpin,[1]) #disable
         return True;
diff --git a/opcuaserv/yamlreader.py b/opcuaserv/yamlreader.py
index c5c8953c0905aa1b4f4aa341f5c11675f69f9f1b..c53c54612189e78ca0505516df16535ec02b81dc 100644
--- a/opcuaserv/yamlreader.py
+++ b/opcuaserv/yamlreader.py
@@ -168,10 +168,19 @@ class yamlreader(yamlconfig):
         width=(v.get('width',8)-1)//8+1
         endian=v.get('endian','>');
         logging.debug(str(("OPCset",width,data)))
+        notvalid=[(d is None) for d in data[::width]]
+        cnt=int(len(data)//width)
+        assert(cnt==len(notvalid))
+#        print(notvalid)
+        for x in range(len(data)):
+               if data[x] is None: data[x]=0; 
         if dtype=="boolean": 
-                data2=[d==1 for d in data];
+                data2=[d==1 for d in data]; 
                 convert=v.get("convert_unit")
-                if convert: data2=[eval("convert_unit."+convert)(d) for d in data2]
+                if convert: 
+                    data2=[eval("convert_unit."+convert)(d) for d in data2]
+                    for x in range(cnt): 
+                        if notvalid[x]: data2[x]=False;
         elif (dtype in ['uint8','uint16','uint32','uint64','double']): 
             data=bytearray(data)
             if width<=1: 
@@ -188,9 +197,10 @@ class yamlreader(yamlconfig):
                 logging.warn("OPCset"+v['name']+" unsupported width!"+str(width))
                 return;
         elif dtype=="string": 
-                cnt=int(len(data)/width)
 #                data2=[(bytearray(data[i*width:(i+1)*width]).decode("utf-8")) for i in range(cnt)]
                 data2=[bytearray(data)[i*width:(i+1)*width].decode("utf-8",errors='ignore') for i in range(cnt)]
+                for x in range(cnt): 
+                       if notvalid[x]: data2[x]="";
         else:
                 logging.warn("OPCset unsupported type");
                 return;
@@ -203,7 +213,8 @@ class yamlreader(yamlconfig):
                     data2=[(d*scale) for d in data2]
                 convert=v.get("convert_unit")
                 if convert: data2=[eval("convert_unit."+convert)(d) for d in data2]
-
+                for x in range(cnt): 
+                    if notvalid[x]: data2[x]=float('nan')
         var1=v.get('OPCR')
         if not(var1): var1=v.get('OPCW')
         if not(var1):