Bingo, fixed by installing v2.1.0-RC MQTTSubscribeDriver. Adding 
collect_observations = True and single_queue = True to   [[topics], I get 
desired behavior.  Null lightning distance is recorded in absence of 
strikes and with an test simulated lightning strike by battery charger 
shorting, I get lightning strike recording and a lightning distance.  Loop 
shows both lightning distance and strikes in same loop:

LOOP:   2021-08-11 14:56:07 EDT (1628708167) active: 1.0, cloudbase: 
5636.94172822, dateTime: 1628708167.42, dewpoint: 70.6358563958, heatindex: 
93.4196227576, humidex: 103.698544022, lightning_distance: None, 
lightning_strike_count: 0, maxSolarRad: None, outHumidity: 57.0, outTemp: 
87.8, rainRate: 0, usUnits: 1
LOOP:   2021-08-11 14:56:07 EDT (1628708167) active: 1.0, cloudbase: 
5636.94172822, dateTime: 1628708167.43, dewpoint: 70.6358563958, heatindex: 
93.4196227576, humidex: 103.698544022, lightning_distance: None, 
lightning_strike_count: 0, maxSolarRad: None, outHumidity: 57.0, outTemp: 
87.8, rainRate: 0, usUnits: 1

Supporting the idea that lightning strikes and distances were being 
interpreted at different times I caught two lightning strikes this morning 
(before installing v2.1.0-RC) which shows the 8 am lightning strike before 
lightning distance change  and the 11 am lightning strike after lightning 
distance change.  By not being synchronized, the correction 
(lightning_distance = lightning_distance if lightning_strike_count > 0 else 
None) would never work.  

Thanks





[image: Screenshot (14).png]

On Wednesday, August 11, 2021 at 11:41:31 AM UTC-4 bell...@gmail.com wrote:

> I fear the root cause is that MQTTSubscribeDriver takes each MQTT message 
> and creates a loop packet. This works ok for 'aggregated' messages like 
> json or keyword (the original implementations). But for 'individual' 
> payloads that are dependent on each other, it is problematic.I've already 
> had to deal with this for wind data. MQTTSubscribe collects speed and 
> direction data into a single loop packet.
>
> Since then I've been experimenting with collecting data and creating the 
> loop packet from the collection.  Looking at your loop packets, I think it 
> might help you. 
>
> The code is a pre-release which can be found here, 
> https://github.com/bellrichm/WeeWX-MQTTSubscribe/releases/tag/v2.1.0-rc02
>
> You will need to add two undocumented configuration options.
>
> [MQTTSubscribeDriver]
> .
> .
> .
>
>     [[topics]
>         # With the exception of wind data, by default a packet is created 
> for every MQTT message received.
>         # When this is true, MQTTSubscribe attempts to collect 
> observations across messages into a packet.
>         # Default is False.
>         # This is experimental and may be removed.
>         collect_observations = True
>
>         # With the exception of wind data, by default a queue is created 
> for every MQTT topic.
>         # When this is true, MQTTSubsribe uses a single queue for all non 
> wind data.
>         # This is useful when 'collect_observations = True'.
>         # Default is False.
>         # This is experimental and may be removed.
>         single_queue = True
>
> .
> .
> .
>
> With this, the incoming data should be collected and a loop packet only 
> created when the arriving observation is already in the collection. Since, 
> hopefully, the loop packet now has both strike and distance data, your 
> [[Corrections]] should work.
>
> If this doesn't work. I'll have to go back to the drawing board and look 
> for a different solution. If it comes to this, I'd need a debug level log 
> for at least one archive period so that I can analyze the data.
>
> This is beta code, so the usual caveats apply. 
> rich
>
> ps.
> If you are using rtl_433 to publish to MQTT, another option might be to 
> use the 'events' topic that it publishes to. This is a json formatted 
> message so the loop packet created for each MQTT message should have both 
> the strike and distance data.
>
> On Wednesday, 11 August 2021 at 09:52:39 UTC-4 gle...@gmail.com wrote:
>
>> I am using weewx-MQTTSubscribe to bring data into Weewx from sensors, so 
>> i don't use SDR sensor map, see config for mqttsubscribe here 
>> https://github.com/bellrichm/WeeWX-MQTTSubscribe/wiki/Configuring  A 
>> number of unsuccessful tries to modify mqttsubscribe are commented out.  
>> [MQTTSubscribeDriver]
>>  [[topics]]
>>   [[[rtl_433/9b13b3f4-rtl433/devices/Acurite-6045M/C/223/strike_count]]]
>>             
>> [[[[rtl_433/9b13b3f4-rtl433/devices/Acurite-6045M/C/223/strike_count]]]]
>>                 name = lightning_strike_count    #strikes_total  
>> #strike_count
>>                 contains_total = true
>> #                conversion_type = int
>> #                units = count
>> #                expires_after = 0
>>         
>> [[[rtl_433/9b13b3f4-rtl433/devices/Acurite-6045M/C/223/storm_dist]]]
>>             
>> [[[[rtl_433/9b13b3f4-rtl433/devices/Acurite-6045M/C/223/storm_dist]]]]
>>                 name = lightning_distance    #strike_dist  #LS_1_distance
>> #                units = mile
>> #                conversion_type = int
>> #                expires_after = 0
>>
>>
>>
>>     [[Corrections]]
>>         # For each type, an arbitrary calibration expression can be given.
>>         # It should be in the units defined in the StdConvert section.
>>         # Example:
>>          lightning_distance = lightning_distance if 
>> lightning_strike_count > 0 else None
>>
>> [Accumulator]
>>     [[lightning_strike_count]]
>>         extractor = sum 
>>     [[lightning_distance]]
>>         extractor = min
>> #        merger = minmax
>>
>>
>> On Wednesday, August 11, 2021 at 7:58:38 AM UTC-4 tarob...@gmail.com 
>> wrote:
>>
>>> I think going back to your original issue something seems to be off. Can 
>>> you post you weewx.conf for lightning data? If you're using sdr, should 
>>> contain the following in each section:
>>>
>>> [SDR]
>>>     [[sensor_map]]
>>>         ......
>>>         lightning_distance = distance.XXXX.AcuriteLightningPacket
>>>         strikes_total = strikes_total.XXXX.AcuriteLightningPacket
>>>     [[deltas]]
>>>         rain = rain_total
>>>         lightning_strike_count = strikes_total
>>>
>>> [StdCalibrate]
>>>     
>>>     [[Corrections]]
>>>         lightning_distance = lightning_distance if 
>>> lightning_strike_count > 0 else None
>>>
>>> [Accumulator]
>>>     [[lightning_strike_count]]
>>>         extractor = sum
>>>     [[lightning_distance]]
>>>         extractor = min
>>>
>>> On Tuesday, August 10, 2021 at 2:46:44 PM UTC-4 gle...@gmail.com wrote:
>>>
>>>> Initially I thought Rich's solution was going to work, adding his 
>>>> suggested correction <lightning_distance = lightning_distance if 
>>>> 'lightning_strike_count'in locals() and lightning_strike_count> 0 else 
>>>> None>  eliminated my fixed lightning_distance data in the absence of 
>>>> lightning_counts, but it created a new problem, now I don't get 
>>>> lightning_distance values with a lightning strike.  I triggered the 
>>>> lightning detector with a spark by transiently shorting a battery charger 
>>>> at time 14:22:16 , which produced 2 detected lightnings and 14:22:24 which 
>>>> produced one, but the lightning_distance remains at None.  My mqtt 
>>>> explorer 
>>>> reports the lightning detector is sending a constant 12-mile lightning 
>>>> distant 
>>>>
>>>> LOOP:   2021-08-10 14:22:16 EDT (1628619736) dateTime: 1628619736.82, 
>>>> lightning_distance: None, maxSolarRad: None, outHumidity: 73.0, rainRate: 
>>>> 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:16 EDT (1628619736) dateTime: 1628619736.81, 
>>>> lightning_strike_count: 2.0, maxSolarRad: None, rainRate: 0.32, usUnits: 1 
>>>>  
>>>>       <--------------------------------------------------------
>>>> LOOP:   2021-08-10 14:22:16 EDT (1628619736) dateTime: 1628619736.82, 
>>>> lightning_distance: None, lightning_strike_count: 0.0, maxSolarRad: None, 
>>>> rainRate: 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:16 EDT (1628619736) dateTime: 1628619736.83, 
>>>> lightning_distance: None, lightning_strike_count: 0.0, maxSolarRad: None, 
>>>> rainRate: 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:16 EDT (1628619736) dateTime: 1628619736.81, 
>>>> lightning_distance: None, maxSolarRad: None, rainRate: 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:16 EDT (1628619736) dateTime: 1628619736.82, 
>>>> lightning_distance: None, maxSolarRad: None, rainRate: 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:16 EDT (1628619736) dateTime: 1628619736.83, 
>>>> lightning_distance: None, maxSolarRad: None, rainRate: 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:24 EDT (1628619744) dateTime: 1628619744.67, 
>>>> lightning_distance: None, maxSolarRad: None, outTemp: 82.000004, rainRate: 
>>>> 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:24 EDT (1628619744) dateTime: 1628619744.68, 
>>>> lightning_distance: None, maxSolarRad: None, outTemp: 82.000004, rainRate: 
>>>> 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:24 EDT (1628619744) dateTime: 1628619744.69, 
>>>> lightning_distance: None, maxSolarRad: None, outTemp: 82.000004, rainRate: 
>>>> 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:24 EDT (1628619744) dateTime: 1628619744.67, 
>>>> lightning_distance: None, maxSolarRad: None, outHumidity: 73.0, rainRate: 
>>>> 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:24 EDT (1628619744) dateTime: 1628619744.68, 
>>>> lightning_distance: None, maxSolarRad: None, outHumidity: 73.0, rainRate: 
>>>> 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:24 EDT (1628619744) dateTime: 1628619744.69, 
>>>> lightning_distance: None, maxSolarRad: None, outHumidity: 73.0, rainRate: 
>>>> 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:24 EDT (1628619744) dateTime: 1628619744.68, 
>>>> lightning_strike_count: 1.0, maxSolarRad: None, rainRate: 0.32, usUnits: 1 
>>>>  
>>>>           <-----------------------------------------------------------
>>>> LOOP:   2021-08-10 14:22:24 EDT (1628619744) dateTime: 1628619744.69, 
>>>> lightning_distance: None, lightning_strike_count: 0.0, maxSolarRad: None, 
>>>> rainRate: 0.32, usUnits: 1
>>>> LOOP:   2021-08-10 14:22:24 EDT (1628619744) dateTime: 1628619744.69, 
>>>> lightning_distance: None, lightning_strike_count: 0.0, maxSolarRad: None, 
>>>> rainRate: 0.32, usUnits: 1
>>>>
>>>>
>>>> On Tuesday, August 10, 2021 at 9:20:17 AM UTC-4 bell...@gmail.com 
>>>> wrote:
>>>>
>>>>> I'm no python expert (probably know just enough to be dangerous), but 
>>>>> something like this might get you want you want. 
>>>>>
>>>>> # ligtning_strike_count must exist and have a count > 0 for 
>>>>> lightning_distance to have a valid value
>>>>> lightning_distance = lightning_distance if 'lightning_strike_count'in 
>>>>> locals() and lightning_strike_count> 0 else None
>>>>>
>>>>> rich
>>>>> On Tuesday, 10 August 2021 at 03:03:01 UTC-4 gjr80 wrote:
>>>>>
>>>>>> On Tuesday, 10 August 2021 at 08:37:42 UTC+10 gle...@gmail.com wrote:
>>>>>>
>>>>>>> Here is my output running weewxd directly, I see three lines which 
>>>>>>> show lightning_distance to be None, which is expected from corrections, 
>>>>>>> but 
>>>>>>> the following three lines show lightning_distance to be 11.999...  It 
>>>>>>> appears the correction " lightning_distance = lightning_distance if 
>>>>>>> lightning_strike_count > 0 else None" is working but being ignored in 
>>>>>>> final 
>>>>>>> output to graph and database.  Any additional thoughts?
>>>>>>>
>>>>>>
>>>>>> The reason you see no change to lightning_distance for some packets 
>>>>>> is that for those packets lightning_strike_count does not exist so 
>>>>>> your calibration expression fails and no change is made, in other words 
>>>>>> lightning_distance remains as it was 11.9999999954. Why does this 
>>>>>> happen, in layman's terms when lightning_strike_count is not in the 
>>>>>> loop packet the calibration expression in effect has an unknown variable 
>>>>>> (
>>>>>> lightning_strike_count) and the calibration expression raises an 
>>>>>> error. The StdCalibrate service which handles the calibration 
>>>>>> expressions catches that error and discards that calibration expression. 
>>>>>> Given the limitations of the StdCalibrate service I am not aware of 
>>>>>> any calibration expression that would do as you want, of course a WeeWX 
>>>>>> and 
>>>>>> python wizard might come along an prove me wrong!
>>>>>>
>>>>>> My thoughts on a solution, unless there is a simple solution in your 
>>>>>> WeeWX driver or elsewhere upstream of WeeWX I would be writing your own 
>>>>>> WeeWX service to look at the packet and make the necessary correction. 
>>>>>> This 
>>>>>> way you can use a bit of python code to do exactly what you want and you 
>>>>>> won't be limited by the single line expressions as used by 
>>>>>> StdCalibrate. All up it should take no more than 10 lines of code. 
>>>>>> The service could be a data_service or process_service (refer 
>>>>>> weewx.conf [Engine] [[Services]]) but would need to appear before 
>>>>>> StdArchive is called. The advantage of your own service is that 
>>>>>> there is no need to change any one else's code (eg WeeWX driver, 
>>>>>> upstream 
>>>>>> code) so you will not have your changes lost during an upgrade (WeeWX or 
>>>>>> otherwise).
>>>>>>
>>>>>> Gary
>>>>>>
>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to weewx-user+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/weewx-user/ca810af0-2673-4278-b12a-93f65e15ff58n%40googlegroups.com.

Reply via email to