blakadder / nspanel

Sonoff NSPanel protocol and hacking information. Tasmota Berry driver for NSPanel
https://blakadder.github.io/nspanel/
Creative Commons Zero v1.0 Universal
131 stars 36 forks source link

bad json payload #22

Open costascontis opened 2 years ago

costascontis commented 2 years ago

i have found a weird bug(?) …using the original blakadder’s nspanel.be .When i change the thermostat’s setting for example from 19 to 20 i get at mqtt

{"NSPanel":{"ATCMode":0,"ATCExpect0":20}}

and everything is working ok parsing and transforming reading the number setpoint in openhab but when i set to 21 and only then i get

{"NSPanel":{"ATCMode":0,"ATCExpect0":21}B}}

This is only happening with “21” value…

mbbrenner commented 2 years ago

I found the same... I found a little solution. Please comment....

 def every_100ms()
    if self.ser.available() > 0
    var msg = self.ser.read()   # read bytes from serial as bytes
    import string
      if size(msg) > 0
        print("NSP: Received Raw =", msg)
        if msg[0..1] == self.header
          mode = "NSPanel"
          var lst = self.split_55(msg)
          for i:0..size(lst)-1
            msg = lst[i]
              if self.atc['mirror'] == true
                if msg[2] == 0x84 self.ser.write(msg)   # resend messages with type 0x84 for thermostat page
                end
              end
            var j = size(msg) - 1
            while msg[j] != 0x7D
              msg = msg[0..-1]
              j -= 1
            end        
            msg = msg[5..j]
              if size(msg) > 2
                if msg == bytes('7B226572726F72223A307D') # don't publish {"error":0}
                else 
                var jm = string.format("{\"NSPanel\":%s}",msg.asstring())
--->                if ((string.find(jm,"}B}")) != -1)
--->                    var substring =  string.split(jm, "}B}", 1) 
--->                    jm = substring[0]+substring[1]+"}"
--->                end

                tasmota.publish_result(jm, "RESULT")
                end
              end
          end
        elif msg == bytes('000000FFFFFF88FFFFFF')
          log("NSP: Screen Initialized")   # print the message as string
          self.screeninit()
        else
          var jm = string.format("{\"NSPanel\":{\"Nextion\":\"%s\"}}",str(msg[0..-4]))
          tasmota.publish_result(jm, "RESULT")        end       
      end
    end
  end
yvesdm3000 commented 2 years ago

I have a similar issue with a bad json payload, but on scene buttons. I have 3 scene buttons, but when I press on the last button, the last '}' is doubled. Press on the second button gives me: {"id":"2"} Press on the third button gives me: {"id":"3"}}

yvesdm3000 commented 2 years ago

See https://github.com/blakadder/nspanel/pull/27