NODON fil pilote SIN-4-FP-21

Hi, could somebody help me to create a DDF file to be able to use NODON Fil pilote SIN-4-FP-21 ?

I don’t understand how works DDF editor …

I have a description file from the manufacturer, I think that is easy for a Deconz expert !

I don’t know how to share the PDF from the manufacturer …

Thank you

I continue on this existing subject.
I copied/pasted the lines into a json file. the integration refuses to take the file.
the module is still recognized as a simple power outlet. I didn’t make any mistake on copying the json, I know these files. I use them with my php APIs. I removed the module and included it again. No change. Anyone have any idea about the problem?

What is your OS ?
For me it’s a typo, this web page wait for *.DBF file, not for json.
You need to create the DDF in the “devices” folder, but the procedure depend of OS

To understand and do tests I test on Windows, I managed to put the json, the NodOn SIN-4-FP-21 module is recognized as a light named ‘level control switch’. Normally it’s a power outlet, maybe it’s not important at this state.
Currently I can only do ‘on’ true/false.
If I don’t put the json, I also can do ‘on’ true/false.

So there’s something I didn’t understand, sorry. I thought the json placed in the right place was enough. :frowning:
What is the procedure to create a DDF from a json on windows?

I used Deconz Toolbox and DDF auto-bundler → Deconz Toolbox

Upload your .JSON and that should create a .DDB, upload this .DDB with Phoscon.

I tried to integrate your dbb file, without success on my side

If I generate it with your Json, via Deconz toolbox, it is not accepted either.

I am connected to phoscon app, postman can see and modify states so the gateway is ok, and Deconz Toolbox cannot connect to my gateway…

So there’s something I didn’t understand, sorry. I thought the json placed in the right place was enough

Yes, it’s exactly that, but not so easy on some OS , like dockers. And after need to restart because deconz load DDF only at start.

With the DDF you need to have 3 entries :

  • A sensor ZHAThermostat
  • A sensor ZHAConsumption
  • A light “TYPE_LEVEL_CONTROL_SWITCH”

The light entry is for on/off, to change the fil pilote mode need to use the ZHAThermostat

OK, I understand. The json file shows three devices, a bit like some Hue devices which have an id for light, another id for temperature, etc.
the light input is /lights/x/state {“on”: true} no worries.
The others will be sensors/y/…
I need to check the status update with a PUT
followed by a GET, and if the module physically does the job, with a voltmeter.
This is the big advantage of Deconz with conbee, basic Curl commands. It’s very easy in PHP and no need for an external server

@Smanar I did some tests with your json, changing the states with PUT on /lights/X/state {“on”: true} and {“on”: false}
The state is taken into account by the module if I look in GET /lights/X
but nothing physically changes on the module. It is always ON 220V.
The same goes for eco, comfort, off, etc. modes. GET on the sensors a PUT sensors/Y/config {“mode”: “off”} or “comfort” is correctly displayed when I check with a GET but the module state does not change.
Have you had feedback from users confirming that it works?
I also did tests with a json made by @FloHome, same problem, nothing changes at the output of the module terminals with a voltmeter. The /lights/X/state “on” true/false must necessarily change between 0 and 220V.
It’s harder to check for the pilot wire “mode”. In “confort”, according to the standard there is no signal therefore 0v. I always measured 110V in my tests. 110v corresponds to “hors gel” and “off” (arret). I cannot tell the difference with my voltmeter between +110v and -110v, knowing that I measure 110v in all circumstances, "hors gel " and “off” do not allow us to move forward on the problem. Then “confort -1” and “confort -2” are difficult to measure because they appear at 220V for 3 and 7s, once every 5 min.
But I have enough measurements to think that the orders are not transmitted to the connection terminals.

Or maybe I didn’t understand anything :frowning:

I need other information please. I’m gradually switching to Docker synology everything I tested under Windows. when I integrate a devices with its ddf file, the dbb file is stored in docker/deconz/bundles. Where should I put this file if I want my personal version to be kept? is it the json or the ddf that should be kept and where?
thanks

On docker, on the official one, you just need to put the json file in the folder /opt/deCONZ/devices Where to mount custom DDF files? · Issue #163 · deconz-community/deconz-docker · GitHub

On m y side I have the Legrand one, and mine have a command to select the on/off mode or the fil pilote mode, it’s for that there is the light entry + ZHAThermostat, the user can use one or the other, but IDK how work your device, the on/off is probably disabled.
On m y device if I enable the fil pilote, the on/off stop working.

You can make test using the GUI for the on/off its the cluster 0x0006 if you want to use the cluster 0xfc00 you need to add to the general.xml file

    <!-- SonOff -->
    <cluster id="0xfc00" name="SonOff - Specific clusters" mfcode="128b">
      <description>xxxxxxxxxxxxxxxxxxxx</description>
      <server>
        <command id="00" dir="recv" name="Unknow" required="m">
          <description>Set fil pilote mode</description>
          <payload>
            <attribute id="0x0000" type="enum8" name="Mode" required="m" default="0x00">
              <value name="Comfort" value="0x01"></value>
              <value name="Comfort -1" value="0x04"></value>
              <value name="Comfort -2" value="0x05"></value>
              <value name="Eco" value="0x02"></value>
              <value name="Hors-Gel" value="0x03"></value>
              <value name="Off" value="0x00"></value>
            </attribute>
          </payload>
        </command>
        <attribute id="0x0000" type="enum8" name="Mode" default="0x00" access="r" required="m">
          <description>Heating mode</description>
          <value name="Comfort" value="0x01"></value>
          <value name="Comfort -1" value="0x04"></value>
          <value name="Comfort -2" value="0x05"></value>
          <value name="Eco" value="0x02"></value>
          <value name="Hors-Gel" value="0x03"></value>
          <value name="Off" value="0x00"></value>
        </attribute>
      </server>
      <client>
      </client>
    </cluster>

Make this change on the windows machine, harder on docker (not sure it’s possible)…
else you can too enable some logs, we will be able to see the request done by deconz and the device return.

Here I can be wrong on the data type

          "write": {
            "cl": "0xfc00",
            "ep": "0x01",
            "cmd": "0x00",
            "eval": "if (Item.val == 'off') { 0 } else if (Item.val == 'confort') { 1 } else if (Item.val == 'eco') { 2 } else if (Item.val == 'hors gel') { 3 } else if (Item.val == 'confort-1') { 4 } else if (Item.val == 'confort-2') { 5 }",
            "fn": "zcl:cmd"
          }

I m using int valur but can need char value ‘0’

Have found usefull information on the doc

The Device supports commands On/Off Cluster as Server to allow the control of the Fil Pilote Heater wired to the Device, in a deprecated mode, when the Gateway does not integrate the Fil Pilote Cluster.
When controlled with the On/Off Cluster, the SIN-4-FP acts as:

Comfort when receiving a On Command,

No-Frost when receiving a Off Command.

So the light entry is useless. But you can use it to force a no-frost/Comfort and see if the device return the value after you send the request, can need to set a bind.

{
  "schema": "devcap1.schema.json",
  "ddfvalidate": false,
  "manufacturername": "NodOn",
  "modelid": "SIN-4-FP-21",
  "vendor": "NodOn",
  "product": "Cable outlet",
  "sleeper": false,
  "status": "Gold",
  "subdevices": [
    {
      "type": "$TYPE_THERMOSTAT",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0x0201"
      ],
      "meta": {
        "values": {
          "config/mode": {"confort": 1, "confort-1": 4, "confort-2": 5, "eco": 2, "hors gel": 3, "off": 0}
        }
      },
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername"
        },
        {
          "name": "attr/modelid"
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/swversion"
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "config/mode",
          "refresh.interval": 3600,
          "read": {
            "at": "0x0000",
            "cl": "0xfc00",
            "ep": "0x01",
            "fn": "zcl:attr"
          },
          "parse": {
            "at": "0x0000",
            "cl": "0xfc00",
            "ep": "0x01",
            "eval": "if (Attr.val == 0) { Item.val = 'off'; } else if (Attr.val == 1) { Item.val = 'confort'; } else if (Attr.val == 2) { Item.val = 'eco'; } else if (Attr.val == 3) { Item.val = 'hors gel';} else if (Attr.val == 4) { Item.val = 'confort-1'; } else if (Attr.val == 5) { Item.val = 'confort-2'; }",
            "fn": "zcl:attr"
          },
          "write": {
            "cl": "0xfc00",
            "ep": "0x01",
            "cmd": "0x00",
            "eval": "if (Item.val == 'off') { 0 } else if (Item.val == 'confort') { 1 } else if (Item.val == 'eco') { 2 } else if (Item.val == 'hors gel') { 3 } else if (Item.val == 'confort-1') { 4 } else if (Item.val == 'confort-2') { 5 }",
            "fn": "zcl:cmd"
          }
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/lastupdated"
        }
      ]
    },
    {
      "type": "$TYPE_CONSUMPTION_SENSOR",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0x0702"
      ],
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername"
        },
        {
          "name": "attr/modelid"
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/swversion"
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/lastupdated"
        },
        {
          "name": "state/consumption"
        }
      ]
    },
    {
      "type": "$TYPE_LEVEL_CONTROL_SWITCH",
      "restapi": "/lights",
      "uuid": [
        "$address.ext",
        "0x01"
      ],
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername"
        },
        {
          "name": "attr/modelid"
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/swversion"
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "state/on",
          "refresh.interval": 5
        },
        {
          "name": "state/reachable"
        }
      ]
    }
  ],
  "bindings": [
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0006",
      "report": [
        {
          "at": "0x0000",
          "dt": "0x10",
          "min": 1,
          "max": 300
        }
      ]
    },
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0702",
      "report": [
        {
          "at": "0x0000",
          "dt": "0x25",
          "min": 1,
          "max": 300,
          "change": "0x00000001"
        }
      ]
    },
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0xfc00",
      "report": [
        {
          "at": "0x0000",
          "dt": "0x20",
          "min": 1,
          "max": 3600,
          "change": "0x00000001"
        }
      ]
    } 
  ]
}

I think I didn’t understand the functions. actually on/off is to indicate whether or not the module manages the pilot wire orders, and not to turn on/off the radiators as I thought. so, I have to test with an electric heater connected and not just a voltmeter. maybe the result is different. it’s more complex than a simple on/off module. I wanted to go too fast. And I don’t know how to do the json based on the technical data. I need to understand, I’m interested in knowing how to do it. @FloHome sent me the NodOn technical sheet, thanks to him. We’re going to save a lot of time. :+1:

Ok, if I force /lights/X/state:
{“on”, true} I get 0V confort mode ok
{“on”, false } I get 130V hors gel mode ok
but the thermostat sensors are not updated, it remains on “eco” for example when it should have moved to “confort” then to “hors gel”
what should I modify so that the sensor config mode is taken into account, there is no change to the voltmeter
initially, it is on “null”, this is not normal according to the instructions. the “null” state does not exist

I used the GUI, there is an error:

Yes it’s bind/report I have added on the DDF

    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0xfc00",
      "report": [
        {
          "at": "0x0000",
          "dt": "0x20",
          "min": 1,
          "max": 3600,
          "change": "0x00000001"
        }
      ]
    } 

With this part deconz ask the device to send values changes, but if it don’t work with the GUI, I can have make a mistake elsewhere.

On the XML file try to use

<attribute id="0x0000" type="u8" name="Mode" required="m" default="0x00">

Because from the doc it’s a uint8, but the rest seem ok for me

  • command 0x00
  • values 0x0X
  • no manufacture code

Perhaps need to use the manufacture code too in the request

<command id="00" dir="recv" name="Unknow" required="m" vendor="0x128b">

I modified it so that’s not the problem.

don’t work