🎉 Node-RED 1.1.0-beta.2 released

We have just released the second public beta release of Node-RED 1.1.0

This includes many fixes and improvements based on your feedback to the first beta.

Fixed in this release

  • Some nodes (eg Dashboard nodes) unexpectedly show a configuration error
  • Some configuration nodes incorrectly show a '0' user count in the config node sidebar
  • Debug node's status 'automatic' behaviour not working as expected
  • Missing tooltips on Outliner buttons
  • Cannot re-enable a disabled config node
  • Buttons don't work for a node freshly added to a group
  • Trigger node - disabling second output doesn't mark workspace dirty
  • "Select node" behaviour in Catch/Complete/Status nodes not working as expected on Android
  • Function node still creates VM for empty setup/close code
  • Duplicate events on node buttons with Android
  • Merging flows from the server breaks the view
  • node-red admin throws error when displaying help. (node-red-admin@0.2.6 published with fix)
  • Edit group dialog throws error on Done for some users

Not yet fixed

  • Node icons turning blue randomly (think this is due to the latest Chrome changing its default form/focus CSS)

New things

Editor performance improvements

For those of you with larger flows, you should hopefully notice a performance improvement in the editor with this beta. Particularly when switching between tabs.

Outliner handling of config nodes

The Outline sidebar has been updated to change how Config nodes are handled. Rather than give you a flat list of them, they are now listed according to their type. They also include a count for how many nodes use them - clicking on the count opens the search box that lists those users.

Outliner search options

The Outliner search box now also has a dropdown option to select some predefined searches - this makes it easy to find unused config nodes etc.

image

Group margin

The margin between a group border and its contents has been increased to better accommodate nodes that have status as well as wires that wrap around inside the box.

Installing the beta

If you want to try out the beta, you will need specify node-red@next when you use npm to update. Without the @next you'll still get 1.0.x.

So on a Pi you'd do:

sudo npm install -g --unsafe-perm node-red@next

Reporting problems

If you hit any problems, please report them either as a reply on this topic, or in the #dev slack channel. Please do not post new topics to the forum regarding the beta as that could confuse users who are not using the beta.

Outstanding work

Sort options on the outliner

Planning to add options to select how the items in the outliner tree are sorted

Add examples flows for the core nodes

We have three PRs still being reviewed that include around 60 example flows for the core nodes... hoping to get them all in.

Documentation

Need to update the docs and user guide to cover the new features.

15 Likes

I have not yet tried any of the newest beta versions but have a question up front that might be "old & known" to you already. If so, well, maybe it should work like this but I thought I should ask and also ask if this, if already known, has been "fixed" in any of the betas?

When I import a flow with existing MQTT nodes from one NR to another instance, the import process creates a new broker setting even if such is already existing and could have been used. So after a couple of imports you end up having a collection with copies of the same. Like in the example below

I'm using NR 1.0.2

not exactly on topic... best asked as a separated thread.

Hi Nick, Dave.

First a disclaimer...
This is not running from NPM install so possibly related?

I am running from GIT (fetched latest, running dev branch & using npm run dev to launch, using new browser instances) - seeing some weirdness (Chrome latest + Edge - same effect)

  • 1st flow is very messed up
  • 2nd flow OK at first but after switching between tabs, 1st flow gets stranger and nodes on other flows seem to get bumped right about 2 grids

DEV tools show...
image

image

Again, take with a pinch of salt - if there are some new updates in package.json i might need npm update?

EDIT...
NPM v12.16.1
npm outdated...

Package                  Current  Wanted      Latest  Location
cheerio                   0.22.0  0.22.0  1.0.0-rc.3  node-red
cron                       1.7.2   1.7.2       1.8.2  node-red
fs-extra                   8.1.0   8.1.0       9.0.1  node-red
grunt                      1.0.4   1.0.4       1.1.0  node-red
grunt-concurrent           2.3.1   2.3.1       3.0.0  node-red
grunt-contrib-compress     1.5.0   1.5.0       1.6.0  node-red
grunt-jsdoc-to-markdown    4.0.0   4.0.0       5.0.0  node-red
grunt-jsonlint             2.0.0   2.0.0       2.1.2  node-red
i18next                   15.1.2  15.1.2      19.4.5  node-red
iconv-lite                 0.5.1   0.5.1       0.6.0  node-red
jsdoc-nr-template          1.0.0     git         git  node-red
marked                     0.8.2   0.8.2       1.1.0  node-red
mocha                      5.2.0   5.2.0       8.0.1  node-red
mqtt                      2.18.8  2.18.8       4.1.0  node-red
request                   2.88.0  2.88.0      2.88.2  node-red
semver                     6.3.0   6.3.0       7.3.2  node-red
should                     8.4.0   8.4.0      13.2.3  node-red
sinon                     1.17.7  1.17.7       9.0.2  node-red
supertest                  3.4.2   3.4.2       4.0.2  node-red
ws                         6.2.1   6.2.1       7.3.0  node-red

@Steve-Mcl cache cleared ? (keep dev tools open while refreshing)

Thanks a lot Nick et al devs

Some observations/issues

Group

Label checkbox is unchecked with a value of "Hide".

The behaviour looks like a checkbox.
The behaviour acts like a toggle button.

When opening the group properties I thought that the label be set by default and checking the checkbox would "hide" it.

Group

Can easily move node inside group (merge)
Cannot easily remove node from group (and no default shortcut)

Outliner

Grouped nodes

  • additional icon to remove node from group ? (would fulfill request above)

Outliner (possible bug)

  • select 2 nodes, group them
  • in outliner they show up as group
  • in this group, per node a "Configuration Nodes" tree is created
  • try renaming the group, in the outliner everything end up under "configuration nodes"

Screenshot 2020-06-16 at 18.19.17

My previously reported issues with Android seem to be fixed, great!

Unfortunately there's a new one: I can only start dragging connections from the input sides of nodes (the lines do not connect though). Nothing happens from the output of nodes no matter how hard I try. I doubt dragging a connection from the input side shouldn't even be possible?

Edit: tested with 1.0 and it appears dragging a connection from either side of a node works. On this beta neither work as expected.

@dceejay
Yeah, maybe, I was not sure since my question was kind of related to the beta. I read the instruction given from above:

If you hit any problems, please report them either as a reply on this topic, or in the #dev slack channel. Please do not post new topics to the forum regarding the beta as that could confuse users who are not using the beta.

My main Alexa flow is not as pretty as it once was - looks likes nodes have maybe increased in length and have ended up butting into each other

NR on Win10/Chromium browser on Pi4

@cymplecy I seen similar artefacts - can you check something for me?

switch between flow tabs, see if things move around?

Yes - the joys of English negatives... meaning... only post things about the beta in this thread please.

1 Like

I have a problem importing a flow (which was posted in another thread here). It says it has imported the nodes but only a couple of them show up. On previous node-red they appear as normal. There are some missing nodes as you can see, though I don't know if that is relevant.

image

[{"id":"2c5ad109.25539e","type":"function","z":"8c2e7f74.bb0a3","name":"Analog-AVL","func":"let m = msg.payload\n//let AVLdat = m.substr(0,50) ON Site\nlet stx = String.fromCharCode(0x02)\n//let AVLdat = m.substr(3,39)\nlet AVLdat = m.substr(0,42)\nlet tram = m.substr(0,3)\nlet oldrad = \"159999\"\nlet site = m.substr(48,2)\nlet etx = String.fromCharCode(0x03)\n\nif (tram === \"301\") {\n    tram = 315;\n}\nif (tram === \"701\") {\n    tram = 316;\n}\n\nreturn [{payload: stx + \"M0\" +  AVLdat + oldrad + site + etx}]\n//return [{payload: tram + AVLdat + oldrad + site + \"\\n\\r\"}]","outputs":1,"noerr":0,"x":450,"y":360,"wires":[["c8a3bc91.5b2e3","2c3d7702.3dcd58"]]},{"id":"2c3d7702.3dcd58","type":"serial out","z":"8c2e7f74.bb0a3","name":"","serial":"3c75249f.5274fc","x":770,"y":360,"wires":[]},{"id":"86bf6ffc.e8ad6","type":"tcp in","z":"8c2e7f74.bb0a3","name":"","server":"client","host":"10.200.5.28","port":"4002","datamode":"stream","datatype":"utf8","newline":"M0","topic":"DMR-AVL","base64":false,"x":160,"y":260,"wires":[["6d58429a.351d8c"]]},{"id":"c8a3bc91.5b2e3","type":"function","z":"8c2e7f74.bb0a3","name":"DMR_loc'n","func":"var  m = msg.payload;\nvar i;\nvar radcol;\n\nvar siem = context.get('siem') || [];\nvar city = context.get('city') || [];\nvar hand = context.get('hand') || [];\n\n//----------------------------------\nif ((m.substr(0,5)===\"reset\") || (siem.length === 0)){\n    node.warn(\"dbg01: reset\");\n    for (i = 0; i < 25; i++) {\n    siem[i] = [\"  \",i+301,\"--:--:--\",\"---\",\"---\",\"    \"];\n    context.set(\"siem\",siem);\n    }\n}\n    \nif ((m.substr(0,5)===\"reset\") || (city.length === 0)){\n    node.warn(\"dbg02: reset\");\n    for (i = 0; i < 7; i++) {\n    city[i] = [\"   \",i+501,\"--:--:--\",\"---\",\"---\",\"----\"];\n    context.set(\"city\",city);\n    }\n}\n    \nif ((m.substr(0,5)===\"reset\") || (hand.length === 0)){\n    node.warn(\"dbg03: reset\");\n    for (i = 0; i < 4; i++) {\n    hand[i] = [\"   \",i+701,\"--:--:--\",\"---\",\"---\",\"----\"];\n    context.set(\"hand\",hand);\n    }\n}\n\n//parse incoming string for ID:\n//M0310 53 23 2928 001 26 1244 220023 WNGN27S01003000000000003\n\nvar ident = m.substr(3,3);\nlet id=parseInt(ident);\n//source radio ident\n\nlet lat = parseFloat(m.substr(6,2))\nlet ma = parseFloat(m.substr(8,2))\nlet sa = parseFloat(m.substr(10,4))\n// lat: DDMMdddd(decimalmins)\n\nlet lon = parseFloat(m.substr(14,3))\nlet mo = parseFloat(m.substr(17,2))\nlet so = parseFloat(m.substr(19,4))\n// lon: DDMMdddd(decimalmins\n\nlet time = m.substr(23,6);\n\nlet e = m.substr(29,1)\n    if (e === \"E\") { e = -1\n    }\n    else {e = 1\n    }\n\nlet n = m.substr(30,1)\n    if (n === \"N\") { n = 1\n    }\n    else {n = -1\n    }\n// West,North flag\nlet speed = m.substr(36,3);\n\nlet head  = m.substr(39,3);\n\nlet radsys = m.substr(45,6)\n\nlat = (lat*1 + ma/60 + sa/600000) * n\nlon = (lon*1 + mo/60 + so/600000) * e\n\nlat = lat.toFixed(6);\nlon = lon.toFixed(6);\n\ntime = time.substr(0,2)+\":\"+time.substr(2,2)+\":\"+time.substr(4,2);\n// HHmmss\n\nnode.warn(\"dbg04:\" + radsys)\n\nif (radsys === \"159999\"){\n    radsys = \"Old\";\n    radcol = \"#00FF00\";\n} else {\n    radsys = \"New\";\n    radcol = \"#FF0000\";\n}\n\n\nlet icon = \"bus\";\n\nsource = \"tableIn\"\n\nlet Mapdat = {payload:{name:ident, lat:lat, lon:lon, time:time, speed:speed, bearing:head, iconColor:radcol}};\n// message format for scrolling UI display\n\n\nlet site = m.substr(52,1)*1;\nif (site === 2) {site = \"Gren\"}\nif (site === 3) {site = \"Park\"}\nif (site === 4) {site = \"Raeb\"}\nif (site === 5) {site = \"Dent\"}\n\n\n//Push data into array\nif (id >=301 && id <=325) {\n    siem[id-301] = [radsys,ident,time,speed,head,site]\n    context.set(\"siem\",siem);\n    }\n\nelse if (id >=501 && id <=507) { \n    city[id-501] = [radsys,ident,time,speed,head,site]\n    context.set(\"city\",city);\n    }\n\nelse if (id >=701 && id <=704){\n    hand[id-701] = [radsys,ident,time,speed,head,site]\n    context.set(\"hand\",hand);\n    }\n    \n//siemDMR = {payload:[siemDMR]};\n//node.warn(\"dbg04: payloadSiem\"[siemDMR]);\n//cityDMR = {payload:[cityDMR]};\n//handDMR = {payload:[handDMR]};\n    \nreturn [Mapdat,{payload:siem},{payload:city},{payload:hand}];\n//return [{payload:handDMR},{payload:cityDMR},{payload:siemDMR}];\n//msg1 =msg.payload=[tramDMR];\n//return [siemDMR,cityDMR,handDMR]\n\n","outputs":4,"noerr":0,"x":610,"y":180,"wires":[["fd73c0fe.f1c03"],["15d3c667.02c6aa"],["c3dab008.49391"],["cbd43828.3cfea8"]]},{"id":"15d3c667.02c6aa","type":"ui_table","z":"8c2e7f74.bb0a3","group":"747612c0.28310c","name":"Siemens","order":1,"width":"8","height":"13","columns":[{"field":"0","title":"RadSys","width":"8%","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"1","title":"ID","width":"","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"2","title":"Update Time","width":"20%","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"3","title":"Speed","width":"","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"4","title":"head dgs","width":"","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"5","title":"Site","width":"","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":780,"y":160,"wires":[],"icon":"font-awesome/fa-arrow-circle-right"},{"id":"fd73c0fe.f1c03","type":"worldmap","z":"8c2e7f74.bb0a3","name":"TramMap","lat":"54.823059","lon":"-1.748133 ","zoom":"13","layer":"OSM","cluster":"","maxage":"300","usermenu":"show","layers":"show","panit":"false","panlock":"false","zoomlock":"false","hiderightclick":"false","coords":"deg","showgrid":"false","path":"/trammap","x":780,"y":100,"wires":[],"icon":"font-awesome/fa-bus"},{"id":"6d58429a.351d8c","type":"function","z":"8c2e7f74.bb0a3","name":"tait-DMR-AVL","func":"let m = msg.payload\nlet AVLdat = m.substr(0,49);\nlet site = (m.substr(49,1)*1)+1\nsite = site.toString()\nreturn [{payload: String.fromCharCode(0x02)+ \"M0\" + AVLdat + site + String.fromCharCode(0x03)}]\n","outputs":1,"noerr":0,"x":360,"y":260,"wires":[["2c3d7702.3dcd58","c8a3bc91.5b2e3"]]},{"id":"82ae9a6d.193348","type":"split","z":"8c2e7f74.bb0a3","name":"AVLsplit","splt":"M0","spltType":"str","arraySplt":"47","arraySpltType":"len","stream":true,"addname":"topic","x":280,"y":360,"wires":[["2c5ad109.25539e"]]},{"id":"4dcf121.24caaec","type":"ui_button","z":"8c2e7f74.bb0a3","name":"","group":"747612c0.28310c","order":8,"width":11,"height":1,"passthru":false,"label":"Reset Data Table","tooltip":"","color":"","bgcolor":"","icon":"","payload":"reset","payloadType":"str","topic":"reset_data","x":370,"y":160,"wires":[["c8a3bc91.5b2e3"]]},{"id":"c3dab008.49391","type":"ui_table","z":"8c2e7f74.bb0a3","group":"747612c0.28310c","name":"CityLink","order":2,"width":"8","height":"5","columns":[{"field":"0","title":"ID","width":"8%","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"1","title":"RadSys","width":"","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"2","title":"Update Time","width":"20%","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"3","title":"Speed","width":"","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"4","title":"Head dgs","width":"","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"5","title":"Site","width":"","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":780,"y":200,"wires":[],"icon":"font-awesome/fa-arrow-circle-right"},{"id":"cbd43828.3cfea8","type":"ui_table","z":"8c2e7f74.bb0a3","group":"747612c0.28310c","name":"HandHeld","order":3,"width":"8","height":"3","columns":[{"field":"0","title":"Rad Sys","width":"8%","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"1","title":"ID","width":"","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"2","title":"Update Time","width":"20%","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"3","title":"Speed","width":"","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"4","title":"Heading","width":"","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"5","title":"Site","width":"","align":"center","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":780,"y":260,"wires":[],"icon":"font-awesome/fa-arrow-circle-right"},{"id":"c3b7216a.3b3d4","type":"serial in","z":"8c2e7f74.bb0a3","name":"/dev/ttyUSB0","serial":"ad0db688.378208","x":110,"y":360,"wires":[["82ae9a6d.193348"]]},{"id":"3c75249f.5274fc","type":"serial-port","z":"","serialport":"/dev/ttyUSB0","serialbaud":"9600","databits":"8","parity":"none","stopbits":"1","waitfor":"","newline":"2","bin":"false","out":"time","addchar":"","responsetimeout":"20"},{"id":"747612c0.28310c","type":"ui_group","z":"","name":"Radio AVL","tab":"df233723.ff4b98","order":1,"disp":true,"width":"25","collapse":false},{"id":"ad0db688.378208","type":"serial-port","z":"","serialport":"/dev/ttyUSB0","serialbaud":"9600","databits":"8","parity":"none","stopbits":"1","waitfor":"0x02","dtr":"none","rts":"none","cts":"none","dsr":"none","newline":"54","bin":"false","out":"count","addchar":"","responsetimeout":"10000"},{"id":"df233723.ff4b98","type":"ui_tab","z":"","name":"AVL","icon":"dashboard","order":3,"disabled":false,"hidden":false}]

Okay - so there's plenty to sort out.

Assume there will be a beta.3 later this week.

Nodes move to the right, wider nodes with bigger steps. (nodes with hidden label don't move)

I get this too.

When I was at work (retired now) we had to pay people to do the testing, and often they weren't much good, here you get hoards of skilled volunteers leaping in to help. Think how lucky you are :slight_smile:

3 Likes

Now fixed in git:

@bakman2 - your other pieces of feedback are helpful and add to the list of known possible improvements, but as they aren't bugs as such, not going to address them in beta.3

I think that covers the bugs in this thread. My apologies for letting them slip out - especially the nodes creeping across the page. I simply failed to spot it.

Unless anyone shouts, will do beta.3 tomorrow morning. Time for a cup of tea.

7 Likes

Impressive bug fixing spree but you didn't mention my Android bug report. It seems like Android support is becoming the "IE" for Node-RED...

But for me at least regression on that front would be a big loss as I currently spend most of my Node-RED time on an Android tablet (including all my forum activity so far, also including creation of occasional example flows). :slightly_smiling_face:

With that said I believe creating a release with those fixes would far outweigh this marginal use case even if it's preventing creation of any flows on Android.

Ah yes, sorry. I will sort out the android issues in time for the final release, but don't want to hold up beta.3 as these fixes really need to get out.

But I will have a quick look in the morning as it ought to be something simple.

And don't worry, we still have IE11 support to worry about. IE is very much the IE of Node-RED.

3 Likes

Some things fixed, thanks Nick.

One thing I've not seen reported. If you select a group and use the keyboard to move it, it moves to the right. You cannot move it to the left with the keyboard past that point. No errors in the console.

This shows you how far over it goes (second group down):

The changes on the info tab are nice.

1 Like