I'm sure you are right about the triggering circumstances. The code in my 
weewx User routines was correct (using the Meteo France limit), but I had 
put in some modifications around the hauteur_soleil test in connection with 
the method I am using to average and 'normalize' the observations for the 
archive reports. I suspect that, in taking out those modifications for the 
archive update code, I inadvertently also removed the original test.

On Friday, July 1, 2022 at 10:47:43 AM UTC-4 jterr...@gmail.com wrote:

> OK. 
> The variable "hauteur_soleil is the elevation of the sun, in degree.
> From sunset to sunrise, this value will be negative (i.e. sun below the 
> horizon).  
> The formula developed by Metro France was validated to be effective only 
> if sun elevation is > 3°.
>
> In my own implantation of this algorithm, I decided to start the 
> calculation of the sun threshold as soon as the sun elevation was > 0° 
> *and* that the global radiation as measured by the Davis pyranometer was 
> greeter than 20 W/m2.
>
> I suspect that the few dateTime that trigger your  errors were in a 
> situation in which sun elevation was just below zero and that the measured 
> radiation was just higher than 20 W/m2
>
> Le 1 juil. 2022 à 16:19, 'Peter Fletcher' via weewx-user <
> weewx...@googlegroups.com> a écrit :
>
> Something like that is obviously needed. I don't know how my copy of the 
> code omitted the test for hauteur_soleil being > 0. There are a number of 
> sources from which I may have copied it, and I didn't keep links to all of 
> them, but I can't imagine why I would have deleted the test if my source 
> had included it. I will obviously add it to my working code.
>
> On Friday, July 1, 2022 at 2:45:42 AM UTC-4 jterr...@gmail.com wrote:
>
>> OK.  What I don't understand is that my code had always a test 
>>
>> if hauteur_soleil > 3:  (according to Météo France)
>>
>> or more recently
>>
>>  if hauteur_soleil > 0: 
>>
>> in the function, and this test is not on your function.
>>
>> It should be :
>>
>>  hauteur_soleil = asin(sin((pi / 180) * latitude) * sin((pi / 180) * 
>> declinaison) + cos(
>>         (pi / 180) * latitude) * cos((pi / 180) * declinaison) * cos((pi 
>> / 180) * angle_horaire)) * (180 / pi)
>>  If hauteur_soleil > 0:
>>
>>   seuil = (0.73 + 0.06 * cos((pi / 180) * 360 * dayofyear / 365)) * 1080 
>> * pow(
>>          (sin(pi / 180) * hauteur_soleil), 1.25) * coeff
>>   else :
>> seuil = 0
>>  return seuil
>>
>> Le 30 juin 2022 à 22:52, 'Peter Fletcher' via weewx-user <
>> weewx...@googlegroups.com> a écrit :
>>
>> That was going to be my next step! In fact, iterating through a list of 
>> the dateTime values that produce the errors in the real code and passing 
>> each value to the function confirms that it is the specific dateTime values 
>> that are causing the function to misbehave. The returned results are all 
>> complex numbers with negative and numerically identical (for a given 
>> dateTime) real and imaginary components. It does seem to be a bug in the 
>> function. I assume that hauteur_soleil should always be >=0. It appears 
>> that, for my latitude and longitude and for the given specific values of 
>> dateTime, it becomes negative. The last step in the calculation then 
>> involves raising a negative number to a non-integral power, which is 
>> guaranteed to produce interesting results! The really odd thing is that 
>> math.pow is not returning a ValueError, which the docs say is what should 
>> happen under these circumstances, but apparently trying to return a 
>> (possibly) valid complex result.
>> On Thursday, June 30, 2022 at 3:07:38 PM UTC-4 jterr...@gmail.com wrote:
>>
>>> The only clue I have is that the problem is not due to an 
>>> « overloading » of your raspberry pi, but seems to occur with specific 
>>> dateTime values.
>>> You can try to run your script only with a « bad » dateTime :
>>>
>>> "SELECT dateTime, Radiation from archive where dateTime = 1592614500 »
>>>
>>> Does the error occurs ? If yes, you can try to add debugging print 
>>> commands inside the sunshineThreshold function to try to understand.
>>>
>>>
>>>
>>> Le 30 juin 2022 à 19:51, 'Peter Fletcher' via weewx-user <weewx...@
>>> googlegroups.com> a écrit :
>>>
>>> It did as it seems you predicted - passed 1592614800 and stopped at 
>>> 1632611100. You obviously have a clue as to what is going on. Please 
>>> explain!
>>>
>>> On Thursday, June 30, 2022 at 8:59:48 AM UTC-4 jterr...@gmail.com wrote:
>>>
>>>> If you exclude the first one,1592614500 , with a query like "SELECT 
>>>> dateTime, Radiation from archive where dateTime <> 1592614500", will the 
>>>> script stop at 1592614800 ( the next dateTime) or will it continue and 
>>>> stop 
>>>> at 1632611100 ?
>>>>
>>>> Le 30 juin 2022 à 14:34, 'Peter Fletcher' via weewx-user <weewx...@
>>>> googlegroups.com> a écrit :
>>>>
>>>> 1592614500
>>>> 1632611100
>>>> 1632611400
>>>> 1647688800
>>>>
>>>> I can't see a pattern or any common features.
>>>>
>>>> On Thursday, June 30, 2022 at 3:55:49 AM UTC-4 jterr...@gmail.com 
>>>> wrote:
>>>>
>>>>> No, I never had weewx  crashes related to the sunshine calculations. 
>>>>>
>>>>> What are the dateTime values that trigger the error ?
>>>>>
>>>>>
>>>>>
>>>>> Le mercredi 29 juin 2022 à 23:23:16 UTC+2, Peter Fletcher a écrit :
>>>>>
>>>>>> Have you had any odd weewx errors or crashes related to the sunshine 
>>>>>> calculations? I ask because I hadn't, but I decided to try to 'backfill' 
>>>>>> my 
>>>>>> database with sunshine times, based on the 5-minute radiation values, 
>>>>>> and I 
>>>>>> ran into a bizarre bug. I used the code shown below (on a copy of my 
>>>>>> live 
>>>>>> weewx database). As you will see, the threshold calculation code is 
>>>>>> essentially identical to yours, except that it has been converted to a 
>>>>>> regular function (no 'self' parameter) and my station's latitude and 
>>>>>> longitude are hard coded in it. When the code is run under Python 3.9.2 
>>>>>> on 
>>>>>> my Pi, it initially runs without problems, but crashes after 8,000+ 
>>>>>> records 
>>>>>> have been processed with a ValueError on the MaxThreshold vs threshold 
>>>>>> comparison, reporting that it can't compare a complex with a float! If I 
>>>>>> intercept and log the errors, it turns out that, for a few specific 
>>>>>> values 
>>>>>> of dateTime, the function returns a complex number! Even more bizarrely, 
>>>>>> it 
>>>>>> only seems to do that in the context of the running code. If I manually 
>>>>>> run 
>>>>>> through all the operations from the function code at the Python command 
>>>>>> line, using the value of dateTime that produces the first crash, all the 
>>>>>> intermediate results and the final result are sane floats.
>>>>>> There appears to be a second issue, possibly related to my reading 
>>>>>> and writing the database at relatively high frequency, which stalls the 
>>>>>> process after about 18,000 records have been processed, but removing the 
>>>>>> database writes allows it to run to completion without abolishing the 
>>>>>> consistent, albeit infrequent, ValueErrors.
>>>>>>
>>>>>> [backfill.py]
>>>>>> import sqlite3
>>>>>> from datetime import datetime
>>>>>> import time
>>>>>> from math import sin, cos, pi, asin
>>>>>>
>>>>>> def sunshineThreshold(mydatetime):
>>>>>>     coeff = 0.9  # change to calibrate with your sensor
>>>>>>     utcdate = datetime.utcfromtimestamp(mydatetime)
>>>>>>     dayofyear = int(time.strftime("%j", time.gmtime(mydatetime)))
>>>>>>     theta = 360 * dayofyear / 365
>>>>>>     equatemps = 0.0172 + 0.4281 * cos((pi / 180) * theta) - 7.3515 * 
>>>>>> sin(
>>>>>>         (pi / 180) * theta) - 3.3495 * cos(2 * (pi / 180) * theta) - 
>>>>>> 9.3619 * sin(
>>>>>>         2 * (pi / 180) * theta)
>>>>>>
>>>>>>     latitude = 43.0346213
>>>>>>     longitude = -78.689362
>>>>>>
>>>>>>     corrtemps = longitude * 4
>>>>>>     declinaison = asin(0.006918 - 0.399912 * cos((pi / 180) * theta) 
>>>>>> + 0.070257 * sin(
>>>>>>         (pi / 180) * theta) - 0.006758 * cos(2 * (pi / 180) * theta) 
>>>>>> + 0.000908 * sin(
>>>>>>         2 * (pi / 180) * theta)) * (180 / pi)
>>>>>>     minutesjour = utcdate.hour * 60 + utcdate.minute
>>>>>>     tempsolaire = (minutesjour + corrtemps + equatemps) / 60
>>>>>>     angle_horaire = (tempsolaire - 12) * 15
>>>>>>     hauteur_soleil = asin(sin((pi / 180) * latitude) * sin((pi / 
>>>>>> 180) * declinaison) + cos(
>>>>>>         (pi / 180) * latitude) * cos((pi / 180) * declinaison) * 
>>>>>> cos((pi / 180) * angle_horaire)) * (180 / pi)
>>>>>>     seuil = (0.73 + 0.06 * cos((pi / 180) * 360 * dayofyear / 365)) 
>>>>>> * 1080 * pow(
>>>>>>         (sin(pi / 180) * hauteur_soleil), 1.25) * coeff
>>>>>>     return seuil
>>>>>>
>>>>>>
>>>>>> database = 'weewx.sdb'
>>>>>>
>>>>>> maxThreshold=0
>>>>>> count=0
>>>>>> conn=sqlite3.connect(database)
>>>>>> cur=conn.execute("SELECT dateTime, Radiation from archive")
>>>>>> for row in cur:
>>>>>>     count += 1
>>>>>>     if (row[1] is not None) and (row[1] > 20):
>>>>>>     threshold = sunshineThreshold(row[0])
>>>>>>     if threshold > maxThreshold:
>>>>>>         maxThreshold = threshold
>>>>>>     if row[1] > threshold:
>>>>>>         conn.execute("UPDATE archive set SunshineTime = 5 WHERE 
>>>>>> dateTime = " + str(row[0]))
>>>>>>     if count % 1000 == 0:
>>>>>>         print(count, 'Max Threshold', maxThreshold)
>>>>>> conn.close
>>>>>> [/backfill.py]
>>>>>>
>>>>>> On Friday, June 10, 2022 at 3:29:40 AM UTC-4 jterr...@gmail.com 
>>>>>> wrote:
>>>>>>
>>>>>>> On my side, I have looked at the CPU utilization on my raspberry Pi 
>>>>>>> 3B+. I have the mqtt  service service installed, so at each loop all 
>>>>>>> data 
>>>>>>> of the packet are sent to the mqtt broker.
>>>>>>>
>>>>>>> With mqtt and when calculations of the sunshine threshold is done 
>>>>>>> for each loop packet, the total CPU utilization of python3 is about 
>>>>>>> 0.75%
>>>>>>> With mqtt and without calculation of sunshine threshold : 0.5% of 
>>>>>>> total CPU.
>>>>>>>
>>>>>>> So one can estimate that 0.25 % of total CPU is needed for the 
>>>>>>> calculation of the threshold value for each LOOP packet.
>>>>>>>
>>>>>>>
>>>>>>> Le 9 juin 2022 à 22:26, 'Peter Fletcher' via weewx-user <weewx...@
>>>>>>> googlegroups.com> a écrit :
>>>>>>>
>>>>>>> After some experimentation, I found that the radiation value in the 
>>>>>>> VP2 LOOP packets does, indeed, normally change every 50-52 seconds, 
>>>>>>> but, 
>>>>>>> perhaps about a fifth of the 'gaps' are a *multiple* of that time - 
>>>>>>> most often 100+ or 150+ seconds, but occasionally more than that (I saw 
>>>>>>> one 
>>>>>>> 250+ second 'gap'). I saw this under conditions of variable sunshine 
>>>>>>> and 
>>>>>>> clouds when it seemed unlikely that the actual radiation value would 
>>>>>>> have 
>>>>>>> been precisely constant for that length of time, so I am not sure 
>>>>>>> exactly 
>>>>>>> what is going on. In any event, I am revising the code I am using on 
>>>>>>> the 
>>>>>>> basis of doing the threshold calculation when the radiation level 
>>>>>>> changes, 
>>>>>>> but at least every minute, if it remains constant for more than the 
>>>>>>> normal 
>>>>>>> 50-52 seconds..
>>>>>>>
>>>>>>> On Sunday, June 5, 2022 at 12:33:47 PM UTC-4 jterr...@gmail.com 
>>>>>>> wrote:
>>>>>>>
>>>>>>>> I think it is also OK to do an average for every 30 seconds.  It 
>>>>>>>> depends also on the weather station used.
>>>>>>>> For  instance, a Davis Vantage Pro 2 ISS transmits an 
>>>>>>>> updated  solar radiation value every 50 to 60 seconds. So with this 
>>>>>>>> weather 
>>>>>>>> station, even a 1 minute average would not be very different  since 
>>>>>>>> anyway 
>>>>>>>> the solar radiation values of the LOOP packet are the same for at 
>>>>>>>> least 50 
>>>>>>>> seconds.!
>>>>>>>>
>>>>>>>> Le 5 juin 2022 à 18:02, 'Peter Fletcher' via weewx-user <weewx...@
>>>>>>>> googlegroups.com> a écrit :
>>>>>>>>
>>>>>>>> I chose to average the LOOP radiation readings and only to do the 
>>>>>>>> threshold calculation and make the sun/no sun determination every 30 
>>>>>>>> seconds because I thought doing it on every LOOP might overload LOOP 
>>>>>>>> processing (I am running weewx on a Pi 3B, which is also doing a few 
>>>>>>>> other 
>>>>>>>> things which use the CPU). If this is an unnecessary concern, as it 
>>>>>>>> may 
>>>>>>>> very well be, your modified code is much cleaner than mine.
>>>>>>>>
>>>>>>>> On Saturday, June 4, 2022 at 12:41:08 PM UTC-4 jterr...@gmail.com 
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> It is a very good idea to calculate the sunshine duration for each 
>>>>>>>>> LOOP packet and sum these values to make the final archive sunshine 
>>>>>>>>> duration.  I have modified my script accordingly :  
>>>>>>>>> https://github.com/Jterrettaz/sunduration.
>>>>>>>>> The logic is the following :  for each received LOOP packet, the 
>>>>>>>>> radiation is compared to a calculated threshold. If the radiation is 
>>>>>>>>> above 
>>>>>>>>> the threshold value, the sunshine time for the LOOP packet is equal 
>>>>>>>>> to the 
>>>>>>>>> time elapsed between the  previous loop packet and this packet (most 
>>>>>>>>> of the 
>>>>>>>>> time 2 seconds with a Vantage Davis Pro).
>>>>>>>>> The final archive sunshine duration is the sum of all the LOOP 
>>>>>>>>> value within the archive period.
>>>>>>>>> Le vendredi 3 juin 2022 à 21:59:36 UTC+2, Peter Fletcher a écrit :
>>>>>>>>>
>>>>>>>>>> That makes some sense when you are getting data from an 
>>>>>>>>>> 'external' sensor, though there are (IMHO) simpler ways of doing it. 
>>>>>>>>>> weewx 
>>>>>>>>>> already has access to the LOOP radiation data from the VP2, so 
>>>>>>>>>> handling the 
>>>>>>>>>> processing and data storage within weewx makes more sense to me in 
>>>>>>>>>> this 
>>>>>>>>>> case.
>>>>>>>>>>
>>>>>>>>>> On Friday, June 3, 2022 at 3:24:23 PM UTC-4 vince wrote:
>>>>>>>>>>
>>>>>>>>>>> On Friday, June 3, 2022 at 11:17:00 AM UTC-7 Meteo Oberwallis 
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>>  if the interval of Weewx and the data logger is set to 10 
>>>>>>>>>>>> minutes, I would have liked to read the value of the solar sensor 
>>>>>>>>>>>> every 
>>>>>>>>>>>> minute and then write it into a separate .sdb database as possible 
>>>>>>>>>>>> sunshine.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Personally I'd use an external program called via cron and 
>>>>>>>>>>> posting a message to a MQTT topic.  Have weewx subscribe to that 
>>>>>>>>>>> topic to 
>>>>>>>>>>> get the data into your db.
>>>>>>>>>>>
>>>>>>>>>>> This is how I used to get my DS18b20 temperature sensor data 
>>>>>>>>>>> into weewx.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>> -- 
>>>>>>>> You received this message because you are subscribed to a topic in 
>>>>>>>> the Google Groups "weewx-user" group.
>>>>>>>> To unsubscribe from this topic, visit 
>>>>>>>> https://groups.google.com/d/topic/weewx-user/19ylVTRqbh4/unsubscribe
>>>>>>>> .
>>>>>>>> To unsubscribe from this group and all its topics, send an email to
>>>>>>>>  weewx-user+...@googlegroups.com.
>>>>>>>> To view this discussion on the web visit 
>>>>>>>> https://groups.google.com/d/msgid/weewx-user/0e631671-0a74-4963-9f1c-e5f81bc7c366n%40googlegroups.com
>>>>>>>>  
>>>>>>>> <https://groups.google.com/d/msgid/weewx-user/0e631671-0a74-4963-9f1c-e5f81bc7c366n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>> .
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to a topic in 
>>>>>>> the Google Groups "weewx-user" group.
>>>>>>> To unsubscribe from this topic, visit 
>>>>>>> https://groups.google.com/d/topic/weewx-user/19ylVTRqbh4/unsubscribe
>>>>>>> .
>>>>>>> To unsubscribe from this group and all its topics, send an email to 
>>>>>>> weewx-user+...@googlegroups.com.
>>>>>>>
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/weewx-user/f0ecc86f-a615-4a24-a43f-ee0d3963b8adn%40googlegroups.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/weewx-user/f0ecc86f-a615-4a24-a43f-ee0d3963b8adn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>>
>>>>>>>
>>>> -- 
>>>> You received this message because you are subscribed to a topic in the 
>>>> Google Groups "weewx-user" group.
>>>> To unsubscribe from this topic, visit 
>>>> https://groups.google.com/d/topic/weewx-user/19ylVTRqbh4/unsubscribe.
>>>> To unsubscribe from this group and all its topics, send an email to 
>>>> weewx-user+...@googlegroups.com.
>>>>
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/weewx-user/39cf6daa-80ca-4ffb-89d3-0f00b971481an%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/weewx-user/39cf6daa-80ca-4ffb-89d3-0f00b971481an%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>>
>>>>
>>> -- 
>>> You received this message because you are subscribed to a topic in the 
>>> Google Groups "weewx-user" group.
>>> To unsubscribe from this topic, visit 
>>> https://groups.google.com/d/topic/weewx-user/19ylVTRqbh4/unsubscribe.
>>> To unsubscribe from this group and all its topics, send an email to 
>>> weewx-user+...@googlegroups.com.
>>>
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/weewx-user/c07ed2bb-1e3d-43e2-b08c-08a7a3aa92dbn%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/weewx-user/c07ed2bb-1e3d-43e2-b08c-08a7a3aa92dbn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>>
>>>
>> -- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "weewx-user" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/weewx-user/19ylVTRqbh4/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> weewx-user+...@googlegroups.com.
>>
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/weewx-user/f287c1b3-1005-409c-82a9-a072e375d5e9n%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/weewx-user/f287c1b3-1005-409c-82a9-a072e375d5e9n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>>
>>
> -- 
> You received this message because you are subscribed to a topic in the 
> Google Groups "weewx-user" group.
> To unsubscribe from this topic, visit 
> https://groups.google.com/d/topic/weewx-user/19ylVTRqbh4/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to 
> weewx-user+...@googlegroups.com.
>
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/weewx-user/77cd4de6-3b1c-4bc2-9dbc-8d8316bd8a9bn%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/weewx-user/77cd4de6-3b1c-4bc2-9dbc-8d8316bd8a9bn%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
>
>

-- 
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/18425607-f8e0-4708-8344-1c1df95ae8b2n%40googlegroups.com.

Reply via email to