No announcement yet.

mcsMQTT Version 3.6

  • Filter
  • Time
  • Show
Clear All
new posts

  • mcsMQTT Version 3.6

    Version 3.6 introduces features that are intended to improve the user experience.

    The Association table now presents the Topics with JSON items indented below. This assumes that the display is sorted by Topic. The Express selection checkboxes are now slaved to the Topic since all or none of the JSON items within a topic are done in Express mode.

    The ability to remove obsolete topics can now be done on a item by item basis rather than only being able to do it via text box expression. This adds another column to Association tab. A column filtering control was also provided at the top of the Association tab so checkboxes that are often not used can be excluded from the display.

    It is now possible to associate multiple topics with a single HS device. This is useful when a MQTT device reports status after command as an acknowledge and periodically. This way it is possible to have one HS device update based upon either of the topics being delivered.

    The editing of VSP entries on Edit tab now supports direct entry to the desired VSP text (e.g. Start,Stop) to produce Start=0, Stop=1 value status pairs. A clear button was also added to remove existing VSP definitions. VSP list updates now only occur until a topic has been accepted. This will prevent new text being added automatically and potentially affecting the HS control/status operation.

    The HS property for Technology Address will now be populated with the MQTT Topic.

    At this time there is additional processing during background startup to collect information to support the new features. After this version gains some maturing it will be updated to only conditionally collect this information and restore the backup initialization to prior duration.

    The version is available at I would like some user feedback before submitting to updater as my testing may have overlooked a usage that is done by others.

  • #2
    Hi Michael,
    Thanks for your great work on this plugin. Your plugins are always very comprehensive and the rapid support is outstanding.

    My comments on V3.6.0.0:

    1) The topic appearing in the technology address property work great! It makes adding large numbers of devices much easier. Thank you.

    2) The remove obsolete topics using the 'General' tab/obsolete topics text box works great now. No need to stop and start the plugin anymore

    3) Using the 'o' (obsolete) check box on the associations table works but it's a little surprising that as soon as you check the 'o' box the row on the table becomes blank except for the number in the first column. (topic 3 in the screenshot below)
    Click image for larger version

Name:	2019-03-24 (5).png
Views:	46
Size:	85.9 KB
ID:	1294570
    You can get the topic back by clicking the number which brings up the topic properties window. Closing the window restores and 'allows' the topic, but there are few details missing ('r', 'h', and 'd') until you refresh the table.
    Click image for larger version

Name:	2019-03-24 (6).png
Views:	44
Size:	94.8 KB
ID:	1294567
    Not a major issue but I wonder if it would be more intuitive to allow the user to selects a number of 'o' check boxes and then have a 'Delete Marked Obsolete Topics' button at the bottom of the table?

    4) And lastly, when you edit the "Publish Payload Template" in the topic properties window it populates the popup text box with the actual value, not the existing template.
    (exiting template is $$VALUE: in the screenshot below)
    Click image for larger version

Name:	2019-03-24 (3).png
Views:	48
Size:	101.0 KB
ID:	1294569

    (notice the box now populated with the actual value, 0 in this case)
    Click image for larger version

Name:	2019-03-24 (4).png
Views:	46
Size:	96.8 KB
ID:	1294568

    I'm looking forward to getting my CBus lights moved to MQTT control.


    P.S. are you taking donations for you plugins?
    Attached Files
    iCore5 Win 10 Pro x64 SSD

    HS3 Pro Edition Windows

    BLOccupied:,Device History:,Yamaha:,UltraMon3:,mcsXap:,Restart:,UltraNetatmo3:, UltraM1G3:,Ultra1Wire3:,BLBackup:,Harmony Hub:,DoorBird:,UltraECM3:,Nanoleaf 3P:,UltraRachio3:,Z-Wave:,SDJ-Health:,BLGarbage:,Blue-Iris:,Chromecast:,Pushover 3P:,EasyTrigger:


    • #3
      Good feedback on how the obsolete checkboxes should work. I made it more like the delete operation used for HS devices. Also never noticed the payload template. It is also fixed in

      No donations. I'm just trying to make it something that is useful for me and help the community. The feedback from those on the board is invaluable.


      • #4
        Observed that Non-plugin devices were not showing in Association tab. Fixed in


        • #5
          You are giving better consumer support than other author that sells their plugin . It was a hard decision to remove your plugin from my install. With big5 ( i need http from it ) it was redondant to keep both.

          I just saw it was possible to poll and parse json data, in nodered. Will your plugin make a topic for each json parsed value ?


          • #6
            This is an exemple of an forecast api. I almost need all the data . Will your plugin create ~200 topics with this?

            sorry here is the link :


            • #7
              I took a quick look and I can see one thing that may be a problem. The "[" is used in the JSON encoding. I currently do not have any provisions to recognize syntax associated with it. I have never seen it in the JSON docs I have looked at. How would it be used in the decoding? Could you put the data for the first day in a structured/indented format to understand how it should be parsed? Alternately a short example that uses it.

              Otherwise this payload should be able be handled unless there is some MQTT constraint on the size of a payload.

              I use OpenWeatherMap as one of the providers for weather data for mcsSprinklers and I do not recall this syntax in what I download.


              • #8
                a [] mean the number in the list for recurrent data type i think.

                So for the first 3 hours i need to put JSON(input,"list[0].rain.3h") because it is the first rain.3h after the ''list'':[ at the beginning.

                JSON(input,"list[37].weather[0].main") here is another a little more complex example. This is the 38th weather.

                there is also a [ after weather ( and there is only one set of weather per 3h list ), So i had to add a [0] after weather.

                This is the first 3 hours [0]:
                 "list":[{"dt":1553644800,"main":{"temp":-5.32,"temp_min":-5.78,"temp_max":-5.32,"pressure":1028.7,"sea_level":1028.7,"grnd_level":1024.11,"humidity":74,"temp_kf":0.46},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"clouds":{"all":0},"wind":{"speed":3.58,"deg":287.512},"sys":{"pod":"n"},"dt_txt":"2019-03-27 00:00:00"}

                this is an exemple of how i do it in big five
                 JSON(input,"") && JSON(input,"list[0].dt_txt") && JSON(input,"list[0].main.temp") && JSON(input,"list[0].weather[0].main") && JSON(input,"list[0].weather[0].description") && JSON(input,"list[0].clouds.all") && JSON(input,"list[0].rain.3h") && JSON(input,"list[0].snow.3h") && JSON(input,"list[0].main.pressure") && JSON(input,"list[0].main.humidity") && JSON_Num(input,"list[0].wind.speed") *3.6 && JSON(input,"list[0].wind.deg") && JSON(input,"list[1].dt_txt") && JSON(input,"list[1].main.temp") && JSON(input,"list[1].weather[0].main") && JSON(input,"list[1].weather[0].description") && JSON(input,"list[1].clouds.all") && JSON(input,"list[1].rain.3h") && JSON(input,"list[1].snow.3h") && JSON(input,"list[1].main.pressure") && JSON(input,"list[1].main.humidity") && JSON_Num(input,"list[1].wind.speed") *3.6 && JSON(input,"list[1].wind.deg") && JSON(input,"list[2].dt_txt") && JSON(input,"list[2].main.temp") && JSON(input,"list[2].weather[0].main") && JSON(input,"list[2].weather[0].description") && JSON(input,"list[2].clouds.all") && JSON(input,"list[2].rain.3h") && JSON(input,"list[2].snow.3h") && JSON(input,"list[2].main.pressure") && JSON(input,"list[2].main.humidity") && JSON_Num(input,"list[2].wind.speed") *3.6 && JSON(input,"list[2].wind.deg") && JSON(input,"list[3].dt_txt") && JSON(input,"list[3].main.temp") && JSON(input,"list[3].weather[0].main") && JSON(input,"list[3].weather[0].description") && JSON(input,"list[3].clouds.all") && JSON(input,"list[3].rain.3h") && JSON(input,"list[3].snow.3h") && JSON(input,"list[3].main.pressure") && JSON(input,"list[3].main.humidity") && JSON_Num(input,"list[3].wind.speed") *3.6 && JSON(input,"list[3].wind.deg") && JSON(input,"list[4].dt_txt") && JSON(input,"list[4].main.temp") && JSON(input,"list[4].weather[0].main") && JSON(input,"list[4].weather[0].description") && JSON(input,"list[4].clouds.all") && JSON(input,"list[4].rain.3h") && JSON(input,"list[4].snow.3h") && JSON(input,"list[4].main.pressure") && JSON(input,"list[4].main.humidity") && JSON_Num(input,"list[4].wind.speed") *3.6 && JSON(input,"list[4].wind.deg") && JSON(input,"list[5].dt_txt") && JSON(input,"list[5].main.temp") && JSON(input,"list[5].weather[0].main") && JSON(input,"list[5].weather[0].description") && JSON(input,"list[5].clouds.all") && JSON(input,"list[5].rain.3h") && JSON(input,"list[5].snow.3h") && JSON(input,"list[5].main.pressure") && JSON(input,"list[5].main.humidity") && JSON_Num(input,"list[5].wind.speed") *3.6 && JSON(input,"list[5].wind.deg") && JSON(input,"list[6].dt_txt") && JSON(input,"list[6].main.temp") && JSON(input,"list[6].weather[0].main") && JSON(input,"list[6].weather[0].description") && JSON(input,"list[6].clouds.all") && JSON(input,"list[6].rain.3h") && JSON(input,"list[6].snow.3h") && JSON(input,"list[6].main.pressure") && JSON(input,"list[6].main.humidity") && JSON_Num(input,"list[6].wind.speed") *3.6 && JSON(input,"list[6].wind.deg") && JSON(input,"list[7].dt_txt") && JSON(input,"list[7].main.temp") && JSON(input,"list[7].weather[0].main") && JSON(input,"list[7].weather[0].description") && JSON(input,"list[7].clouds.all") && JSON(input,"list[7].rain.3h") && JSON(input,"list[7].snow.3h") && JSON(input,"list[7].main.pressure") && JSON(input,"list[7].main.humidity") && JSON_Num(input,"list[7].wind.speed") *3.6 && JSON(input,"list[7].wind.deg") && JSON(input,"list[15].dt_txt") && JSON(input,"list[15].main.temp") && JSON(input,"list[15].weather[0].main") && JSON(input,"list[15].weather[0].description") && JSON(input,"list[15].clouds.all") && JSON(input,"list[15].rain.3h") && JSON(input,"list[15].snow.3h") && JSON(input,"list[15].main.pressure") && JSON(input,"list[15].main.humidity") && JSON_Num(input,"list[15].wind.speed") *3.6 && JSON(input,"list[15].wind.deg") && JSON(input,"list[23].dt_txt") && JSON(input,"list[23].main.temp") && JSON(input,"list[23].weather[0].main") && JSON(input,"list[23].weather[0].description") && JSON(input,"list[23].clouds.all") && JSON(input,"list[23].rain.3h") && JSON(input,"list[23].snow.3h") && JSON(input,"list[23].main.pressure") && JSON(input,"list[23].main.humidity") && JSON_Num(input,"list[23].wind.speed") *3.6 && JSON(input,"list[23].wind.deg") && JSON(input,"list[31].dt_txt") && JSON(input,"list[31].main.temp") && JSON(input,"list[31].weather[0].main") && JSON(input,"list[31].weather[0].description") && JSON(input,"list[31].clouds.all") && JSON(input,"list[31].rain.3h") && JSON(input,"list[31].snow.3h") && JSON(input,"list[31].main.pressure") && JSON(input,"list[31].main.humidity") && JSON_Num(input,"list[31].wind.speed") *3.6 && JSON(input,"list[31].wind.deg") && JSON(input,"list[37].dt_txt") && JSON(input,"list[37].main.temp") && JSON(input,"list[37].weather[0].main") && JSON(input,"list[37].weather[0].description") && JSON(input,"list[37].clouds.all") && JSON(input,"list[37].rain.3h") && JSON(input,"list[37].snow.3h") && JSON(input,"list[37].main.pressure") && JSON(input,"list[37].main.humidity") && JSON_Num(input,"list[37].wind.speed") *3.6 && JSON(input,"list[37].wind.deg")
                this is what i see in the big5 config file :
                "DeviceValueExpression": " JSON(input,\"\") && JSON(input,\"list[0].dt_txt\") && JSON(input,\"list[0].main.temp\") && JSON(input,\"list[0].weather[0].main\") && JSON(input,\"list[0].weather[0].description\") && JSON(input,\"list[0].clouds.all\") && JSON(input,\"list[0].rain.3h\") && JSON(input,\"list[0].snow.3h\") && JSON(input,\"list[0].main.pressure\") && JSON(input,\"list[0].main.humidity\") && JSON_Num(input,\"list[0].wind.speed\") *3.6 && JSON(input,\"list[0].wind.deg\") && JSON(input,\"list[1].dt_txt\") && JSON(input,\"list[1].main.temp\") && JSON(input,\"list[1].weather[0].main\") && JSON(input,\"list[1].weather[0].description\") && JSON(input,\"list[1].clouds.all\") && JSON(input,\"list[1].rain.3h\") && JSON(input,\"list[1].snow.3h\") && JSON(input,\"list[1].main.pressure\") && JSON(input,\"list[1].main.humidity\") && JSON_Num(input,\"list[1].wind.speed\") *3.6 && JSON(input,\"list[1].wind.deg\") && JSON(input,\"list[2].dt_txt\") && JSON(input,\"list[2].main.temp\") && JSON(input,\"list[2].weather[0].main\") && JSON(input,\"list[2].weather[0].description\") && JSON(input,\"list[2].clouds.all\") && JSON(input,\"list[2].rain.3h\") && JSON(input,\"list[2].snow.3h\") && JSON(input,\"list[2].main.pressure\") && JSON(input,\"list[2].main.humidity\") && JSON_Num(input,\"list[2].wind.speed\") *3.6 && JSON(input,\"list[2].wind.deg\") && JSON(input,\"list[3].dt_txt\") && JSON(input,\"list[3].main.temp\") && JSON(input,\"list[3].weather[0].main\") && JSON(input,\"list[3].weather[0].description\") && JSON(input,\"list[3].clouds.all\") && JSON(input,\"list[3].rain.3h\") && JSON(input,\"list[3].snow.3h\") && JSON(input,\"list[3].main.pressure\") && JSON(input,\"list[3].main.humidity\") && JSON_Num(input,\"list[3].wind.speed\") *3.6 && JSON(input,\"list[3].wind.deg\") && JSON(input,\"list[4].dt_txt\") && JSON(input,\"list[4].main.temp\") && JSON(input,\"list[4].weather[0].main\") && JSON(input,\"list[4].weather[0].description\") && JSON(input,\"list[4].clouds.all\") && JSON(input,\"list[4].rain.3h\") && JSON(input,\"list[4].snow.3h\") && JSON(input,\"list[4].main.pressure\") && JSON(input,\"list[4].main.humidity\") && JSON_Num(input,\"list[4].wind.speed\") *3.6 && JSON(input,\"list[4].wind.deg\") && JSON(input,\"list[5].dt_txt\") && JSON(input,\"list[5].main.temp\") && JSON(input,\"list[5].weather[0].main\") && JSON(input,\"list[5].weather[0].description\") && JSON(input,\"list[5].clouds.all\") && JSON(input,\"list[5].rain.3h\") && JSON(input,\"list[5].snow.3h\") && JSON(input,\"list[5].main.pressure\") && JSON(input,\"list[5].main.humidity\") && JSON_Num(input,\"list[5].wind.speed\") *3.6 && JSON(input,\"list[5].wind.deg\") && JSON(input,\"list[6].dt_txt\") && JSON(input,\"list[6].main.temp\") && JSON(input,\"list[6].weather[0].main\") && JSON(input,\"list[6].weather[0].description\") && JSON(input,\"list[6].clouds.all\") && JSON(input,\"list[6].rain.3h\") && JSON(input,\"list[6].snow.3h\") && JSON(input,\"list[6].main.pressure\") && JSON(input,\"list[6].main.humidity\") && JSON_Num(input,\"list[6].wind.speed\") *3.6 && JSON(input,\"list[6].wind.deg\") && JSON(input,\"list[7].dt_txt\") && JSON(input,\"list[7].main.temp\") && JSON(input,\"list[7].weather[0].main\") && JSON(input,\"list[7].weather[0].description\") && JSON(input,\"list[7].clouds.all\") && JSON(input,\"list[7].rain.3h\") && JSON(input,\"list[7].snow.3h\") && JSON(input,\"list[7].main.pressure\") && JSON(input,\"list[7].main.humidity\") && JSON_Num(input,\"list[7].wind.speed\") *3.6 && JSON(input,\"list[7].wind.deg\") && JSON(input,\"list[15].dt_txt\") && JSON(input,\"list[15].main.temp\") && JSON(input,\"list[15].weather[0].main\") && JSON(input,\"list[15].weather[0].description\") && JSON(input,\"list[15].clouds.all\") && JSON(input,\"list[15].rain.3h\") && JSON(input,\"list[15].snow.3h\") && JSON(input,\"list[15].main.pressure\") && JSON(input,\"list[15].main.humidity\") && JSON_Num(input,\"list[15].wind.speed\") *3.6 && JSON(input,\"list[15].wind.deg\") && JSON(input,\"list[23].dt_txt\") && JSON(input,\"list[23].main.temp\") && JSON(input,\"list[23].weather[0].main\") && JSON(input,\"list[23].weather[0].description\") && JSON(input,\"list[23].clouds.all\") && JSON(input,\"list[23].rain.3h\") && JSON(input,\"list[23].snow.3h\") && JSON(input,\"list[23].main.pressure\") && JSON(input,\"list[23].main.humidity\") && JSON_Num(input,\"list[23].wind.speed\") *3.6 && JSON(input,\"list[23].wind.deg\") && JSON(input,\"list[31].dt_txt\") && JSON(input,\"list[31].main.temp\") && JSON(input,\"list[31].weather[0].main\") && JSON(input,\"list[31].weather[0].description\") && JSON(input,\"list[31].clouds.all\") && JSON(input,\"list[31].rain.3h\") && JSON(input,\"list[31].snow.3h\") && JSON(input,\"list[31].main.pressure\") && JSON(input,\"list[31].main.humidity\") && JSON_Num(input,\"list[31].wind.speed\") *3.6 && JSON(input,\"list[31].wind.deg\") && JSON(input,\"list[37].dt_txt\") && JSON(input,\"list[37].main.temp\") && JSON(input,\"list[37].weather[0].main\") && JSON(input,\"list[37].weather[0].description\") && JSON(input,\"list[37].clouds.all\") && JSON(input,\"list[37].rain.3h\") && JSON(input,\"list[37].snow.3h\") && JSON(input,\"list[37].main.pressure\") && JSON(input,\"list[37].main.humidity\") && JSON_Num(input,\"list[37].wind.speed\") *3.6 && JSON(input,\"list[37].wind.deg\")"


                • #9
                  This is the first 3 hours parsed from nodered:

                  msg.payload : Object
                  cod: "200"
                  message: 0.0057
                  cnt: 40
                  list: array[40]
                  [0 … 9]
                  0: object
                  dt: 1553644800
                  main: object
                  temp: -5.75
                  temp_min: -5.78
                  temp_max: -5.75
                  pressure: 1028.7
                  sea_level: 1028.7
                  grnd_level: 1024.11
                  humidity: 74
                  temp_kf: 0.03
                  weather: array[1]
                  0: object
                  id: 800
                  main: "Clear"
                  description: "clear sky"
                  icon: "01n"
                  clouds: object
                  all: 0
                  wind: object
                  speed: 3.58
                  deg: 287.512
                  sys: object
                  pod: "n"
                  dt_txt: "2019-03-2700:00:00"

                  Attached Files


                  • #10
                    Looking at your first 3 hours list I see the following specific items

                    This would generate 20 HS devices assuming parent/grouping devices are created. I suspect that the next 3 hours (or whatever grouping) will have the same names. What should be done to make each unique? I suspect I do not yet understand the practical meaning of [].

                    I have no issue with adding a HTTP polling at a user-entered rate to fetch JSON that would be treated just as if it was MQTT payload. This way the mcsMQTT features could take advantage of multiple ways of getting data. In the control direction this would take some more thought.


                    • #11
                      Like you said , it does not understand the []

                      here is what i get from the subtopic in mcsmqtt
                      Attached Files


                      • #12
                        Originally posted by Michael McSharry View Post

                        I suspect I do not yet understand the practical meaning of [].
                        Maybe it is just easier for api creator. They just have to copy paste


                        • #13
                          Originally posted by Michael McSharry View Post
                          This would generate 20 HS devices assuming parent/grouping devices are created. I suspect that the next 3 hours (or whatever grouping) will have the same names. What should be done to make each unique?
                          keep the [0] in the name if there is any?

                          I have no issue with adding a HTTP polling at a user-entered rate to fetch JSON that would be treated just as if it was MQTT payload. This way the mcsMQTT features could take advantage of multiple ways of getting data. In the control direction this would take some more thought.
                          Thanks ! And for control, i am not at a level of creating my own json syntax anyways !


                          • #14
                            I implemented the parser for the non-standard JSON. There are over 700 unique items in the link you provided. This seems like a burdensome way to get weather data. What can you do with this much data? Would you want to filter some of it out before publishing?


                            • #15
                              I have over 150 from this api. Yes i will need to filter them, as i did with big 5

                              . Thanks a lot Micheal!!