bellrichm / WeeWX-MQTTSubscribe

A WeeWX service and driver that receives data from MQTT.
GNU General Public License v3.0
52 stars 13 forks source link

Attempt to parse this json #201

Closed bellrichm closed 7 months ago

bellrichm commented 7 months ago

See, https://groups.google.com/g/weewx-user/c/Siu6Zj83CSc

{
  "sensor": [
    {
      "title": "Indoor",
      "list": [
        [ "Temperature", "68.9", "°F" ],
        [ "Humidity", "38", "%" ] ]
    },
    {
      "title": "Outdoor",
      "list": [
        [ "Temperature", "61.7", "°F" ],
        [ "Humidity", "29", "%" ] ]
    },
    {
      "title": "Pressure", "list": [
        [ "Absolute", "26.76", "inhg" ],
        [ "Relative", "29.84", "inhg" ] ]
    },
    {
      "title": "Wind Speed",
      "list": [
        [ "Max Daily Gust", "5.1", "mph" ],
        [ "Wind", "1.1", "mph" ],
        [ "Gust", "1.6", "mph" ],
        [ "Direction", "123", "°" ],
        [ "Wind Average 2 Minute", "0.4", "mph" ],
        [ "Direction Average 2 Minute", "111", "°" ],
        [ "Wind Average 10 Minute", "1.3", "mph" ],
        [ "Direction Average 10 Minute", "134", "°" ]
      ]
    },
    {
      "title": "Rainfall",
      "list": [
        [ "Rate", "0.0", "inch/hr" ],
        [ "Hour", "0.0", "inch", "43" ],
        [ "Day", "0.0", "inch", "44" ],
        [ "Week", "0.0", "inch", "45" ],
        [ "Month", "0.0", "inch", "46" ],
        [ "Year", "5.72", "inch", "47" ],
        [ "Total", "10.65", "inch", "48" ]
      ],
      "range": "Range: 0inch to 393.7inch."
    },
    {
      "title": "Solar",
      "list": [
        [ "Light", "261.36", "w/m²" ],
        [ "UVI", "1.2", "" ]
      ]
    }
  ],
  "battery": {
    "title": "Battery",
    "list": [ "All battery are ok" ]
  }
}
bellrichm commented 7 months ago

Not pretty but this worked with 3.0.0-rc06


[MQTTSubscribeService]
    # Turn the service on and off.
    # Default is true.
    # Only used by the service.
    enable = false

    # Controls if validation errors raise an exception (stopping WeeWX from starting) or only logged.
    # Default is true
    log_validation_errors = false

    # The binding, loop or archive.
    # Default is loop.
    # Only used by the service.
    binding = loop

    # The MQTT server.
    # Default is localhost.
    host = localhost

    # Controls the MQTT logging.
    # Default is false.
    log = false

    # password for broker authentication.
    # Default is None.
    password = None

    # The port to connect to.
    # Default is 1883.
    port = 1883

    # username for broker authentication.
    # Default is None.
    username = None

    # For additional information see, https://github.com/bellrichm/WeeWX-MQTTSubscribe/wiki/Configuring#the-topic-name-sections
    [[topics]]
        # Units for MQTT payloads without unit value.
        # Valid values: US, METRIC, METRICWX.
        # For more information see, http://weewx.com/docs/customizing.htm#units
        # Default is US.
        unit_system = US

        # Configuration information about the MQTT message format for this topic
        [[[message]]]
            # The format of the MQTT payload.
            # Currently support: individual, json, keyword.
            # Must be specified.
            type = json        

        # The first topic to subscribe to
        # For additional information see, https://github.com/bellrichm/WeeWX-MQTTSubscribe/wiki/Configuring#the-topic-name-sections
        [[[topic1]]]
            unit_system = METRIC
            #ignore = false

            # First top level property, 'sensor'.
            # The 'sensor' propety is an array of 'sensors'.
            # Each element ('sensor') in the array consists of these properties
            #    - 'title' property
            #    - 'list' property
            #       The 'list' property is an array of 'observations'.
            #       Each element ('observation') consists of an object with these properties.
            #       Note: 'Rainfall' has an additional property.
            #         - 'label' property
            #         - 'data' property
            #         - 'unit' property
            [[[[sensor]]]]
                [[[[[subfields]]]]]
                    [[[[[[indoor]]]]]]
                    [[[[[[outdoor]]]]]]
                    [[[[[[pressure]]]]]]
                    [[[[[[windSpeed]]]]]]
                    [[[[[[rainFall]]]]]]
                    [[[[[[solar]]]]]]

            # First element in the 'sensor' array.
            [[[[indoor_title]]]]
                ignore = true
            [[[[indoor_list]]]]
                [[[[[subfields]]]]]                
                    [[[[[[temperature]]]]]]
                    [[[[[[humidity]]]]]]

            [[[[indoor_temperature]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[indoor_temperature_label]]]]
                ignore = true            
            [[[[indoor_temperature_unit]]]]
                ignore = true

            [[[[indoor_humidity]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[indoor_humidity_label]]]]
                ignore = true            
            [[[[indoor_humidity_unit]]]]
                ignore = true

            # Second element in the 'sensor' array.                
            [[[[outdoor_title]]]]
                ignore = true
            [[[[outdoor_list]]]]
                [[[[[subfields]]]]]                
                    [[[[[[temperature]]]]]]
                    [[[[[[humidity]]]]]]

            [[[[outdoor_temperature]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[outdoor_temperature_label]]]]
                ignore = true            
            [[[[outdoor_temperature_unit]]]]
                ignore = true

            [[[[outdoor_humidity]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[outdoor_humidity_label]]]]
                ignore = true            
            [[[[outdoor_humidity_unit]]]]
                ignore = true                

            [[[[pressure_title]]]]
                ignore = true
            [[[[pressure_list]]]]
                [[[[[subfields]]]]]                
                    [[[[[[absolute]]]]]]
                    [[[[[[relative]]]]]]

            # Third element in the 'sensor' array.
            [[[[pressure_absolute]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[pressure_absolute_label]]]]
                ignore = true            
            [[[[pressure_absolute_unit]]]]
                ignore = true

            [[[[pressure_relative]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[pressure_relative_label]]]]
                ignore = true            
            [[[[pressure_relative_unit]]]]
                ignore = true

            # Fourth element in the 'sensor' array.                
            [[[[windSpeed_title]]]]
                ignore = true
            [[[[windSpeed_list]]]]
                [[[[[subfields]]]]]
                    [[[[[[maxDailyGust]]]]]]
                    [[[[[[wind]]]]]]
                    [[[[[[windGust]]]]]]
                    [[[[[[direction]]]]]]
                    [[[[[[windAvg2]]]]]]
                    [[[[[[windAvgDir2]]]]]]
                    [[[[[[windAvg10]]]]]]
                    [[[[[[windAvgDir10]]]]]]

            [[[[windSpeed_maxDailyGust]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[windSpeed_maxDailyGust_label]]]]
                ignore = true            
            [[[[windSpeed_maxDailyGust_data]]]]
                ignore = true
            [[[[windSpeed_maxDailyGust_unit]]]]
                ignore = true

            [[[[windSpeed_wind]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[windSpeed_wind_label]]]]
                ignore = true            
            [[[[windSpeed_wind_unit]]]]
                ignore = true

            [[[[windSpeed_windGust]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[windSpeed_windGust_label]]]]
                ignore = true            
            [[[[windSpeed_windGust_unit]]]]
                ignore = true                    

            [[[[windSpeed_direction]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[windSpeed_direction_label]]]]
                ignore = true            
            [[[[windSpeed_direction_unit]]]]
                ignore = true

            [[[[windSpeed_windAvg2]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[windSpeed_windAvg2_label]]]]
                ignore = true            
            [[[[windSpeed_windAvg2_data]]]]
                ignore = true
            [[[[windSpeed_windAvg2_unit]]]]
                ignore = true

            [[[[windSpeed_windAvgDir2]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[windSpeed_windAvgDir2_label]]]]
                ignore = true            
            [[[[windSpeed_windAvgDir2_data]]]]
                ignore = true
            [[[[windSpeed_windAvgDir2_unit]]]]
                ignore = true

            [[[[windSpeed_windAvg10]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[windSpeed_windAvg10_label]]]]
                ignore = true            
            [[[[windSpeed_windAvg10_data]]]]
                ignore = true
            [[[[windSpeed_windAvg10_unit]]]]
                ignore = true

            [[[[windSpeed_windAvgDir10]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[windSpeed_windAvgDir10_label]]]]
                ignore = true            
            [[[[windSpeed_windAvgDir10_data]]]]
                ignore = true
            [[[[windSpeed_windAvgDir10_unit]]]]
                ignore = true

            # Fifth element in the 'sensor' array.                
            [[[[rainFall_title]]]]
                ignore = true
            [[[[rainFall_range]]]]
                ignore = true
            [[[[rainFall_list]]]]
                [[[[[subfields]]]]]
                    [[[[[[rate]]]]]]
                    [[[[[[hour_total]]]]]]
                    [[[[[[day_total]]]]]]
                    [[[[[[week_total]]]]]]
                    [[[[[[month_total]]]]]]
                    [[[[[[year_total]]]]]]
                    [[[[[[running_total]]]]]]                    

            [[[[rainFall_rate]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[rainFall_rate_label]]]]
                ignore = true            
            [[[[rainFall_rate_data]]]]
                ignore = true
            [[[[rainFall_rate_unit]]]]
                ignore = true

            [[[[rainFall_hour_total]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[delta]]]]]]
                    [[[[[[unit]]]]]]
                    [[[[[[data]]]]]]
            [[[[rainFall_hour_total_label]]]]
                ignore = true            
            [[[[rainFall_hour_total_delta]]]]
                ignore = true
            [[[[rainFall_hour_total_unit]]]]
                ignore = true
            [[[[rainFall_hour_total_data]]]]
                ignore = true

            [[[[rainFall_day_total]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[delta]]]]]]
                    [[[[[[unit]]]]]]
                    [[[[[[data]]]]]]
            [[[[rainFall_day_total_label]]]]
                ignore = true            
            [[[[rainFall_day_total_delta]]]]
                ignore = true
            [[[[rainFall_day_total_unit]]]]
                ignore = true
            [[[[rainFall_day_total_data]]]]
                ignore = true

            [[[[rainFall_week_total]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[delta]]]]]]
                    [[[[[[unit]]]]]]
                    [[[[[[data]]]]]]
            [[[[rainFall_week_total_label]]]]
                ignore = true            
            [[[[rainFall_week_total_delta]]]]
                ignore = true
            [[[[rainFall_week_total_unit]]]]
                ignore = true
            [[[[rainFall_week_total_data]]]]
                ignore = true

            [[[[rainFall_month_total]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[delta]]]]]]
                    [[[[[[unit]]]]]]
                    [[[[[[data]]]]]]
            [[[[rainFall_month_total_label]]]]
                ignore = true            
            [[[[rainFall_month_total_delta]]]]
                ignore = true
            [[[[rainFall_month_total_unit]]]]
                ignore = true
            [[[[rainFall_month_total_data]]]]
                ignore = true

            [[[[rainFall_year_total]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[delta]]]]]]
                    [[[[[[unit]]]]]]
                    [[[[[[data]]]]]]
            [[[[rainFall_year_total_label]]]]
                ignore = true            
            [[[[rainFall_year_total_delta]]]]
                ignore = true
            [[[[rainFall_year_total_unit]]]]
                ignore = true
            [[[[rainFall_year_total_data]]]]
                ignore = true

            [[[[rainFall_running_total]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[delta]]]]]]
                    [[[[[[unit]]]]]]
                    [[[[[[data]]]]]]
            [[[[rainFall_running_total_label]]]]
                ignore = true            
            [[[[rainFall_running_total_delta]]]]
                ignore = true
            [[[[rainFall_running_total_unit]]]]
                ignore = true

            # Sixth element in the 'sensor' array.                
            [[[[solar_title]]]]
                ignore = true
            [[[[solar_list]]]]
                [[[[[subfields]]]]]
                    [[[[[[light]]]]]]
                    [[[[[[uvi]]]]]]

            [[[[solar_light]]]]
                [[[[[subfields]]]]]
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[solar_light_label]]]]
                ignore = true
            [[[[solar_light_unit]]]]
                ignore = true

            [[[[solar_uvi]]]]
                [[[[[subfields]]]]]
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[solar_uvi_label]]]]
                ignore = true
            [[[[solar_uvi_unit]]]]
                ignore = true

            # Second top level property, 'battery'.
            [[[[battery_title]]]]
                ignore = true
            [[[[battery_list]]]]
                [[[[[subfields]]]]]
                    [[[[[[data]]]]]]                
            [[[[battery_data]]]]
                ignore = true
bellrichm commented 7 months ago

After #204


[MQTTSubscribeService]
    # Turn the service on and off.
    # Default is true.
    # Only used by the service.
    enable = false

    # Controls if validation errors raise an exception (stopping WeeWX from starting) or only logged.
    # Default is true
    log_validation_errors = false

    # The binding, loop or archive.
    # Default is loop.
    # Only used by the service.
    binding = loop

    # The MQTT server.
    # Default is localhost.
    host = localhost

    # Controls the MQTT logging.
    # Default is false.
    log = false

    # password for broker authentication.
    # Default is None.
    password = None

    # The port to connect to.
    # Default is 1883.
    port = 1883

    # username for broker authentication.
    # Default is None.
    username = None

    # For additional information see, https://github.com/bellrichm/WeeWX-MQTTSubscribe/wiki/Configuring#the-topic-name-sections
    [[topics]]
        # Units for MQTT payloads without unit value.
        # Valid values: US, METRIC, METRICWX.
        # For more information see, http://weewx.com/docs/customizing.htm#units
        # Default is US.
        unit_system = US

        # Configuration information about the MQTT message format for this topic
        [[[message]]]
            # The format of the MQTT payload.
            # Currently support: individual, json, keyword.
            # Must be specified.
            type = json        

        # The first topic to subscribe to
        # For additional information see, https://github.com/bellrichm/WeeWX-MQTTSubscribe/wiki/Configuring#the-topic-name-sections
        [[[topic1]]]
            unit_system = METRIC
            #ignore = false

            # First top level property, 'sensor'.
            # The 'sensor' propety is an array of 'sensors'.
            # Each element ('sensor') in the array consists of these properties
            #    - 'title' property
            #    - 'list' property
            #       The 'list' property is an array of 'observations'.
            #       Each element ('observation') consists of an object with these properties.
            #       Note: 'Rainfall' has an additional property.
            #         - 'label' property
            #         - 'data' property
            #         - 'unit' property
            [[[[sensor]]]]
                #ignore = b
                [[[[[subfields]]]]]
                    # ignore = c # unused
                    [[[[[[indoor]]]]]]
                    [[[[[[outdoor]]]]]]
                    [[[[[[pressure]]]]]]
                    [[[[[[windSpeed]]]]]]
                    [[[[[[rainFall]]]]]]
                    [[[[[[solar]]]]]]

            # First element in the 'sensor' array.
            [[[[indoor_title]]]]
                ignore = true
            [[[[indoor_list]]]]
                [[[[[subfields]]]]]                
                    [[[[[[temperature]]]]]]
                    [[[[[[humidity]]]]]]

            [[[[indoor_temperature]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                        ignore = true
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
                        ignore = true

            [[[[indoor_humidity]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                        ignore = true
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
                        ignore = true

            # Second element in the 'sensor' array.                
            [[[[outdoor_title]]]]
                ignore = true
            [[[[outdoor_list]]]]
                [[[[[subfields]]]]]                
                    [[[[[[temperature]]]]]]
                    [[[[[[humidity]]]]]]

            [[[[outdoor_temperature]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                        ignore = true
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
                        ignore = true

            [[[[outdoor_humidity]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                        ignore = true
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
                        ignore = true

            [[[[pressure_title]]]]
                ignore = true
            [[[[pressure_list]]]]
                [[[[[subfields]]]]]                
                    [[[[[[absolute]]]]]]
                    [[[[[[relative]]]]]]

            # Third element in the 'sensor' array.
            [[[[pressure_absolute]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                        ignore = true
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
                        ignore = true

            [[[[pressure_relative]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                        ignore = true
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
                        ignore = true

            # Fourth element in the 'sensor' array.                
            [[[[windSpeed_title]]]]
                ignore = true
            [[[[windSpeed_list]]]]
                [[[[[subfields]]]]]
                    [[[[[[maxDailyGust]]]]]]
                        ignore = true
                    [[[[[[wind]]]]]]
                    [[[[[[windGust]]]]]]
                    [[[[[[direction]]]]]]
                    [[[[[[windAvg2]]]]]]
                        ignore = true
                    [[[[[[windAvgDir2]]]]]]
                        ignore = true
                    [[[[[[windAvg10]]]]]]
                        ignore = true
                    [[[[[[windAvgDir10]]]]]]
                        ignore = true

            [[[[windSpeed_wind]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[windSpeed_wind_label]]]]
                ignore = true            
            [[[[windSpeed_wind_unit]]]]
                ignore = true

            [[[[windSpeed_windGust]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[windSpeed_windGust_label]]]]
                ignore = true            
            [[[[windSpeed_windGust_unit]]]]
                ignore = true                    

            [[[[windSpeed_direction]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[windSpeed_direction_label]]]]
                ignore = true            
            [[[[windSpeed_direction_unit]]]]
                ignore = true

            # Fifth element in the 'sensor' array.                
            [[[[rainFall_title]]]]
                ignore = true
            [[[[rainFall_range]]]]
                ignore = true
            [[[[rainFall_list]]]]
                [[[[[subfields]]]]]
                    [[[[[[rate]]]]]]
                    [[[[[[hour_total]]]]]]
                        ignore = true
                    [[[[[[day_total]]]]]]
                        ignore = true
                    [[[[[[week_total]]]]]]
                        ignore = true
                    [[[[[[month_total]]]]]]
                        ignore = true
                    [[[[[[year_total]]]]]]
                        ignore = true
                    [[[[[[running_total]]]]]]                    

            [[[[rainFall_rate]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
            [[[[rainFall_rate_label]]]]
                ignore = true            
            [[[[rainFall_rate_data]]]]
            [[[[rainFall_rate_unit]]]]
                ignore = true        

            [[[[rainFall_running_total]]]]
                [[[[[subfields]]]]]                
                    [[[[[[label]]]]]]
                    [[[[[[delta]]]]]]
                    [[[[[[unit]]]]]]
                    [[[[[[data]]]]]]
            [[[[rainFall_running_total_label]]]]
                ignore = true            
            [[[[rainFall_running_total_delta]]]]
                ignore = true
            [[[[rainFall_running_total_unit]]]]
                ignore = true

            # Sixth element in the 'sensor' array.                
            [[[[solar_title]]]]
                ignore = true
            [[[[solar_list]]]]
                [[[[[subfields]]]]]
                    [[[[[[light]]]]]]
                    [[[[[[uvi]]]]]]

            [[[[solar_light]]]]
                [[[[[subfields]]]]]
                    [[[[[[label]]]]]]
                        ignore = true
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
                        ignore = true

            [[[[solar_uvi]]]]
                [[[[[subfields]]]]]
                    [[[[[[label]]]]]]
                        ignore = true
                    [[[[[[data]]]]]]
                    [[[[[[unit]]]]]]
                        ignore = true

            # Second top level property, 'battery'.
            [[[[battery_title]]]]
                ignore = true
            [[[[battery_list]]]]
                [[[[[subfields]]]]]
                    [[[[[[data]]]]]]                
            [[[[battery_data]]]]
                ignore = true

I wonder if I could default to opting out to make it smaller still.