Sonoff NSPanel by ITead - Smart Scene Wall Switch based on ESP32 and custom Nextion Touch Screen Panel Display (non-Pro variant)

Should be the same :wink: you should get some switch circuits created for that in HA once linked with it, same for the two relays, temperature sensor… After all config has to be done in HA for automations/actions/management of display !

Ah ok, I’ll take a look now - hopefully once I’ve added it in, it will make more sense :slight_smile: :slight_smile:

out of curiosity, are you a backer of kickstarter or did you receive in another way? I cannot wait to get my hands on this beauty :wink:

Just ordered it straight from Sonoff :slight_smile: - delivered last week.

1 Like

So I’ve got it added into Home Assistant - but I can’t see any way to update the screens from Home Assistant itself - I can see from Blakadder’s pages that you can fire commands at it - but they look like JSON rather than MQTT

Leacho. ill share my setup, and a few automations that control my lights.

This is my config.yaml. i use this for various automations and also receiving the raw JSON on raw.

  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_RAW'
    name: 'NSPanel Raw Data'

  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_LivingRoom'
    name: 'NSPanel Living Room'
    value_template: "{{ value_json.NSPanel.params }}"
    json_attributes_topic: "tele/LoungeRoomSwitch/RESULT"
    json_attributes_template: "{{ value_json.NSPanel.params | tojson }}"
    

  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_ID'
    name: 'NS Panel ID'
    value_template: '{{ value_json.NSPanel.id }}'

  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_Switch'
    name: 'NS Panel Switch'
    value_template: '{{ value_json.NSPanel.params.switch }}'  


  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_Ltype'
    name: 'NS Panel Light Type'
    value_template: '{{ value_json.NSPanel.params.ltype }}'
    
  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_Ledtype'
    name: 'NS Panel LED Type'
    value_template: '{{ value_json.NSPanel.params.light_type }}'
    
  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_LED_Red'
    name: 'NS Panel LED Red'
    value_template: '{{ value_json.NSPanel.params.colorR }}'  
    
  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_LED_Green'
    name: 'NS Panel LED Green'
    value_template: '{{ value_json.NSPanel.params.colorG }}'  
    
  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_LED_Blue'
    name: 'NS Panel LED Blue'
    value_template: '{{ value_json.NSPanel.params.colorB }}'   

  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_LED_BR'
    name: 'NS Panel LED Brightness'
    value_template: '{{ value_json.NSPanel.params.bright }}'      

  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_BR'
    name: 'NS Panel White Brightness'
    value_template: '{{ value_json.NSPanel.params.white.br }}'  
    
  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_CT'
    name: 'NS Panel Colour Temp'
    value_template: '{{ value_json.NSPanel.params.white.ct }}'  
    
  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_Red'
    name: 'NS Panel Red'
    value_template: '{{ value_json.NSPanel.params.color.r }}'  
    
  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_Green'
    name: 'NS Panel Green'
    value_template: '{{ value_json.NSPanel.params.color.g }}'  
    
  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_Blue'
    name: 'NS Panel Blue'
    value_template: '{{ value_json.NSPanel.params.color.b }}'      
    
  - platform: mqtt
    state_topic: 'tele/LoungeRoomSwitch/RESULT'
    unique_id: 'NSPPanel_CBR'
    name: 'NS Panel Colour Brightness'
    value_template: '{{ value_json.NSPanel.params.color.br }}'   

When you press a switch on the screen, you need Home assistant to reply with a JSON reply telling the NS PANEL to update the widget on the screen with the change, otherwise every second, tasmota updates the NSPanel with its weather and time, the widget resets.
So you need to respond using the following automation.

alias: nspanel send data back
description: ''
trigger:
  - platform: state
    entity_id: sensor.ns_panel_raw_data
condition: []
action:
  - service: mqtt.publish
    data_template:
      topic: cmnd/LoungeRoomSwitch/NSPSend
      payload: |

        {{'{{"relation":{}}}'.format(trigger.to_state.state)}}
mode: single

I use the following automation that runs when the RAW item is updated, and it grabs information from each of my other items.

I use this automation to update a CCT lightbulb

alias: NSPanel CCT Light ON
description: ''
trigger:
  - platform: state
    entity_id: sensor.ns_panel_raw_data
condition: []
action:
  - service: light.turn_on
    target:
      entity_id: |
        {% if states.sensor.ns_panel_id.state == "1" %}
          light.tall_lamp
        {% elif  states.sensor.ns_panel_id.state == "2" %}
          light.small_lamp
        {% elif  states.sensor.ns_panel_id.state == "5" %}
          light.christmas_lights
        {% endif %}
    data_template:
      brightness_pct: |
        {% if states.sensor.ns_panel_light_type.state == "white" %}
          {% if states.sensor.ns_panel_brightness.state | int >= 0 %}
            {{ states.sensor.ns_panel_brightness.state | int }}
          {% else %}
            100
          {% endif %}
        {% elif  states.sensor.ns_panel_light_type.state == "color" %}
          {% if states.sensor.ns_panel_colour_brightness.state | int >= 0 %}
            {{ states.sensor.ns_panel_colour_brightness.state | int }}
          {% else %}
            100
          {% endif %}
        {% else %}
          100
        {% endif %}
      rgb_color:
        - '{{ states.sensor.ns_panel_red.state | int }}'
        - '{{ states.sensor.ns_panel_green.state | int }}'
        - '{{ states.sensor.ns_panel_blue.state | int }}'
mode: single

This one to update an LED strip

alias: NSPanel LED Light ON
description: ''
trigger:
  - platform: state
    entity_id: sensor.ns_panel_raw_data
condition: []
action:
  - service: light.turn_on
    target:
      entity_id: |
        {% if states.sensor.ns_panel_id.state == "3" %}
          light.tasmota
        {% endif %}
    data_template:
      brightness_pct: |

        {% if states.sensor.ns_panel_led_brightness.state | int >= 0 %}
          {{ states.sensor.ns_panel_led_brightness.state | int }}
        {% else %}
          100
        {% endif %}
      rgb_color:
        - '{{ states.sensor.ns_panel_led_red.state | int }}'
        - '{{ states.sensor.ns_panel_led_green.state | int }}'
        - '{{ states.sensor.ns_panel_led_blue.state | int }}'
mode: single

This one to turn any of my lights off

alias: nspanel Light OFF
description: ''
trigger:
  - platform: state
    entity_id: sensor.ns_panel_raw_data
condition:
  - condition: state
    entity_id: sensor.ns_panel_switch
    state: 'off'
action:
  - service: light.turn_OFF
    target:
      entity_id: |
        {% if states.sensor.ns_panel_id.state == "1" %}
          light.tall_lamp
        {% elif  states.sensor.ns_panel_id.state == "2" %}
          light.small_lamp
        {% elif  states.sensor.ns_panel_id.state == "3" %}
          light.tasmota
        {% elif  states.sensor.ns_panel_id.state == "5" %}
          light.christmas_lights
        {% endif %}
mode: single

and this one to update the switch position on my widgets if i turn a bulb or the LED strip on any other way other than through the panel

alias: NSPanel Update Widget State when device changes
description: ''
trigger:
  - platform: device
    type: turned_on
    device_id: 8d2bd172ff304d1d97502e1ffc9edaee
    entity_id: light.tall_lamp
    domain: light
    id: tall on
  - platform: device
    type: turned_on
    device_id: ec57922dd96ed593581f9c5c978ba5ad
    entity_id: light.small_lamp
    domain: light
    id: small on
  - platform: device
    type: turned_on
    device_id: 63b3caa3d98370f6874b31e82a1cfa4b
    entity_id: light.tasmota
    domain: light
    id: led on
  - platform: device
    type: turned_off
    device_id: 8d2bd172ff304d1d97502e1ffc9edaee
    entity_id: light.tall_lamp
    domain: light
    id: tall off
  - platform: device
    type: turned_off
    device_id: ec57922dd96ed593581f9c5c978ba5ad
    entity_id: light.small_lamp
    domain: light
    id: small off
  - platform: device
    type: turned_off
    device_id: 63b3caa3d98370f6874b31e82a1cfa4b
    entity_id: light.tasmota
    domain: light
    id: led off
  - platform: state
    entity_id: light.christmas_lights
    id: xmasON
    to: 'on'
  - platform: state
    entity_id: light.christmas_lights
    id: xmasOFF
    to: 'off'
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id: tall on
        sequence:
          - service: mqtt.publish
            data:
              topic: cmnd/LoungeRoomSwitch/NSPSend
              payload: >-
                {"relation":{"NSPanel":{"ctype":"group","id":"1","params":{"switch":"on"}}}}
      - conditions:
          - condition: trigger
            id: small on
        sequence:
          - service: mqtt.publish
            data:
              topic: cmnd/LoungeRoomSwitch/NSPSend
              payload: >-
                {"relation":{"NSPanel":{"ctype":"group","id":"2","params":{"switch":"on"}}}}
      - conditions:
          - condition: trigger
            id: led on
        sequence:
          - service: mqtt.publish
            data:
              topic: cmnd/LoungeRoomSwitch/NSPSend
              payload: >-
                {"relation":{"NSPanel":{"ctype":"group","id":"3","params":{"switch":"on"}}}}
      - conditions:
          - condition: trigger
            id: tall off
        sequence:
          - service: mqtt.publish
            data:
              topic: cmnd/LoungeRoomSwitch/NSPSend
              payload: >-
                {"relation":{"NSPanel":{"ctype":"group","id":"1","params":{"switch":"off"}}}}
      - conditions:
          - condition: trigger
            id: small off
        sequence:
          - service: mqtt.publish
            data:
              topic: cmnd/LoungeRoomSwitch/NSPSend
              payload: >-
                {"relation":{"NSPanel":{"ctype":"group","id":"2","params":{"switch":"off"}}}}
      - conditions:
          - condition: trigger
            id: led off
        sequence:
          - service: mqtt.publish
            data:
              topic: cmnd/LoungeRoomSwitch/NSPSend
              payload: >-
                {"relation":{"NSPanel":{"ctype":"group","id":"3","params":{"switch":"off"}}}}
      - conditions:
          - condition: trigger
            id: xmasON
        sequence:
          - service: mqtt.publish
            data:
              topic: cmnd/LoungeRoomSwitch/NSPSend
              payload: >-
                {"relation":{"NSPanel":{"ctype":"group","id":"5","params":{"switch":"on"}}}}
      - conditions:
          - condition: trigger
            id: xmasOFF
        sequence:
          - service: mqtt.publish
            data:
              topic: cmnd/LoungeRoomSwitch/NSPSend
              payload: >-
                {"relation":{"NSPanel":{"ctype":"group","id":"5","params":{"switch":"off"}}}}
    default: []
mode: queued
max: 20

I haven’t set up automations yet to update the panel with the colour or temp yet, but im sure you could figure that out with this information.

This is also my autoexec.be file. The beginning section is where you set your widgets

# index "name   ", "ctype", uiid | name max 8 characters, rest will be truncated)
  1: ["TallLmp", "group", 69],
  2: ["SmllLmp", "group", 69],
  3: ["LEDStrip", "group", 33],
  4: ["Blinds", "group", 11],
  5: ["Xmastree", "group", 1],
  6: [],
  7: [],
  8: [],
}

To add, something that blakadder has not documented is a device UIID of 11 is Blinds control.

I also have all of my items as a ‘group’ rather than a ‘device’ so i dont have to update the device with ‘online’.

if any part of this is not clear let me know.
Im loving my panel. and with the current setup of tasmota, and automations you can do anything. Even use the thermostat page to turn on or off air con in your house.

i have also had to tune my ADCPARAM1 with the following to get the temp to actually match what is in my house

18:13:38.052 CMD: adcparam1
18:13:38.074 MQT: stat/LoungeRoomSwitch/RESULT = {"AdcParam1":[2,68000,10000,3450]}

again, im sure i can use attributes of the RAW data entity to send information instead of breaking down each JSON item into its own entity, but this was how i got mine working for now.

6 Likes

Thank you for this detailed post! What does blinds support look like in the interface?

you get open stop and close. and a position slider.
You can pass all that information with similar automations and rules

I now have an automation that updates the CCT bulb widget on the NS Panel when a lightbulb state changes

alias: NS Panel Update widget when state entity changes 2
description: ''
trigger:
  - platform: state
    entity_id: light.tall_lamp
    id: '1'
  - platform: state
    entity_id: light.small_lamp
    id: '2'
  - platform: state
    entity_id: light.tasmota
    id: '3'
condition: []
action:
  - choose:
      - conditions:
          - condition: or
            conditions:
              - condition: trigger
                id: '1'
              - condition: trigger
                id: '2'
        sequence:
          - service: mqtt.publish
            data_template:
              topic: cmnd/LoungeRoomSwitch/NSPSend
              payload: >-
                {% if trigger.to_state.state == 'off' %}
                    {"relation":{"NSPanel":{"id":"{{trigger.id}}","params":{"switch":"{{trigger.to_state.state}}"}}}}    
                {% elif trigger.to_state.attributes.color_mode == 'hs' %}
                    {"relation":{"NSPanel":{"id":"{{trigger.id}}","params":{"switch":"{{trigger.to_state.state}}","ltype":"color","color":{
                    "r":{{trigger.to_state.attributes.rgb_color[0]}},
                    "g":{{trigger.to_state.attributes.rgb_color[1]}},
                    "b":{{trigger.to_state.attributes.rgb_color[2]}},
                    "br":{{trigger.to_state.attributes.brightness    
                    | multiply(0.392156862745098) | int}}
                    }}}}}
                {% elif trigger.to_state.attributes.color_mode == 'color_temp'
                %}
                    {"relation":{"NSPanel":{"id":"{{trigger.id}}","params":{"switch":"{{trigger.to_state.state}}","ltype":"white",
                    "white":{"br":{{trigger.to_state.attributes.brightness | multiply(0.392156862745098) | int}},
                    "ct":{{ (154 - trigger.to_state.attributes.color_temp|float) / -0.85 }}        
                    }}}}}
                {% endif %}
    default: []
mode: single

you would have to add different trigger id’s for LED strips. As it uses a different pattern for R G B and brightness, no idea why.

for instance the above will send a MQTT message looking like this when the colour is set to red

{"relation":{"NSPanel":{"id":"1","params":{"switch":"on","ltype":"color","color":{
    "r":255,
    "g":0,
    "b":0,
    "br":99
    }}}}}

and the following when the colour is set to white and colour temp cool

{"relation":{"NSPanel":{"id":"1","params":{"switch":"on","ltype":"white",
    "white":{"br":99,
    "ct":-0.0        
    }}}}}

and when colour temp set to warm

{"relation":{"NSPanel":{"id":"1","params":{"switch":"on","ltype":"white",
    "white":{"br":99,
    "ct":254.11764705882354        
    }}}}}

I would use this automation for CCT RGB bulbs widget. and use another trigger condition to 3 to change the MQTT for LED strips
.

1 Like

I’ve manage to install ESPHome on mine.
Works but it’s a beginning. Weather, devices (curtain, lights) and thermostat are not currently supported. Only groups are supported but it seems that there are some bugs with it (I think because there is no documentation currently available).
I really hope that support for ESPHome will be extended, the NSPanel is a great device

@Chris_Hemmings thank you so much for this! - that’s great information - I’ll have a play around over the next couple of days and I’ll come back to you to let you know how I get on :slight_smile:

Why in the world they put two relays instead of a dimmer

1 Like

Dimmers cost more + dimmer implementations are complicated and have different compatibility issues.

Size restrictions in some implementations can also be a factor depending on the technology used, just look at their Sonoff branded dimmer → https://itead.cc/product/sonoff-d1-smart-dimmer-switch/ compared to the smaller Shelly Dimmer 2 → https://shelly.cloud/products/shelly-dimmer-2-smart-home-light-controller/ or the even smaller and much more expensive Qubino Mini Dimmer → https://qubino.com/products/mini-dimmer/

I have several of those myself and not counting traditional incandescent lightbulbs they all have different compatibility issues with different types of dimmable LED lights and dimmable transformers so in most cases I had to buy and test a lot of different dimmable LED light for such dimmers to get them to work at an acceptable level as they will otherwise flicker or just not dim properly.

not a problem mate. My automations certainly are not the most efficient. But they work

@Chris_Hemmings your post has been the key for me. I don’t know enough about MQTT to create what you have done but I am learning from your work and installed MQTT Explorer to see what is coming and going. The assumption is that any integration from the touch panel will need to be coded to automations. Thank you again. FYI I am not able to see the blinds device 11 on my US version.

definitely.
There might be a way to have entities update without automations but i find it working perfectly with my automations above.

Curious why you did not try Tasmota which seems further along based on the work from blakadder and now @Chris_Hemmings providing the HA integration info

I prefer ESPHome over Tasmota and MQTT :man_shrugging:

1 Like

Can we hope that Esphome will be able to unlock that soon ?
I’m planning to upload a custom hmi inside so i’m a bit impatient.

@Raspiaigle what will your custom hmi will do? I am hoping to learn and use the Nextion Editor to someday code an Alarm Panel page. Very far off from what I can do now.