Appendix

System Statuses and Icons

Production Sites

A system with a PRIMARY Solar meter is considered a production system. A production system can have one of the following technical statuses:

These are the statuses shown on the site details page. An explanation of why a site is assigned a given status can be obtained by hovering the mouse over the status button on the Solar tab:

For usability, the production status is actually shown in two columns on the systems list page.

Select the "Status & Issues" column configuration to show the above columns:

"Production Status" here can be one of: 

The "Production Performance" column shows whether a site that is producing is actually producing as expected, over- or under-producing.

Automatic Determination of System Status for a System with a Primary Device

The status of a system with a primary production device is determined according to the following rules, shown in order or priority, i.e. whichever rule matches first determines the status. All rules are run against the readings obtained from the primary production meter set for the system. The primary device is indicated by the words (PRIMARY) on the site details page:

Rules

The rules for determining system status diverge depending on whether the system has a timeout set that is under one day (1440 minutes).

Rules for systems where the NOT PRODUCING Notifications Timeout is less than 1 day:
  1. System has no production device: NORMAL

  2. Mana has never obtained any readings from the device: COM ERR

  3. The COM ERR timeout set for the system*1 has passed since the device reported any readings, where the timeout only takes into consideration minutes in the solar day*2 (i.e. if the system did not report during the night, this does not automatically push the system status into COM ERR): COM ERR

  4. Current power output exceeds the minimum production threshold*3: NORMAL/OVER-/UNDER-PRODUCING (see step #9 below for criteria).

    Current power output is determined by taking the most recent reading. If that is 0 or invalid, then we take into consideration the value set in the "0 Power Readout Tolerance" field on the site form. If nothing is set, then we use a tolerance of 60 minutes. This means that if the most recent reading is 0, then we look back in time up to 60 minutes to find the first non-zero value and use that to evaluate if current power output exceeds the minimum production threshold. We allow for this because some sites return 0 as the most recent reading (incorrectly), and also, this is a way to allow a site to not produce power for a few minutes without it affecting the site status.

    Power output is determined using direct power readouts if available within the 0 Power Readout Tolerance timeframe. If unavailable, but we can determine positive power during this timeframe from energy readouts (cumulative or delta), then we use that. If that is unavailable, but we have positive direct power readouts from the past 6 hours, then we use that. Otherwise we fall back on the most recent power reading derived from energy readouts (cumulative or delta). 

    If all readings obtained within the 0 Power Readout Tolerance timeframe are under the minimum production threshold, then this criteria is not met (and we continue evaluating the criteria below).

  5. Site time is before the end of the Expected Production Period4 and...

    1. If performance ratio is unavailable for today or yesterday, and the energy generated today as well as yesterday is less than what the site is expected to produce in a day*5NOT PRODUCING

    2. If performance ratio IS available both for today and yesterday, then we compare that to the site Not Producing Threshold Pct*6. In other words, if both the performance ratio for today and yesterday were below the threshold percent, then the site status is: NOT PRODUCING
      See MANA-2402 for an explanation as to why this was implemented.
  6. Site last reported during the Expected Production Period taking into consideration the not producing notification timeout as well as a dawn/dusk offset*7, and irradiance is either set to be disregarded, not available, or available and above the irradiance threshold*8, then: NOT PRODUCING 
    (note that we already know that the current power output does not exceed the minimum production threshold since we checked for that in step #4)

  7. Site last reported after the solar day end (minus a dawn/dusk offset*7), and...
    1. If performance ratio is unavailable for today and the energy generated today is less than what the site is expected to produce in a day*5 then: NOT PRODUCING
    2. If performance ratio IS available for today, then we compare that to the site Not Producing Threshold Pct*6. In other words, if the performance ratio for today was below the threshold percent, then the site status is: NOT PRODUCING
  8. If site last status was NOT PRODUCING then we stay with that until production exceeds the threshold (see MANA-2371 to understand why this is required)

  9. In all other cases: 
    1. If the energy produced so far this month minus the energy produced today is 10% over the predicted energy set for this system for this month, proportionally adjusted to the days elapsed in this month until today: OVERPRODUCING
    2. Energy produced so far this month minus the energy produced today is 10% under the predicted energy set for this system for this month, proportionally adjusted to the days elapsed in this month until today: UNDERPRODUCING
    3. Otherwise: NORMAL
Rules for systems where the NOT PRODUCING Notifications Timeout is at least 1 day:

For such systems we use a simplified algorithm for determining system status:

  1. System has no production device: NORMAL

  2. Mana has never obtained any readings from the device: COM ERR

  3. The COM ERR timeout set for the system*1 has passed since the device reported any readings, where the timeout only takes into consideration minutes in the solar day*2 (i.e. if the system did not report during the night, this does not automatically push the system status into COM ERR): COM ERR

  4. Current power output exceeds the minimum production threshold*3: NORMAL/OVER-/UNDER-PRODUCING (see step #9 below for criteria)

  5. When the energy generated today is more than what the site is expected to produce in a day*5 then: NORMAL/OVER-/UNDER-PRODUCING (see step #9 below for criteria)

  6. When the timeout is at least 1440 minutes (1 day) 
    1. and the energy generated yesterday is more than what the site is expected to produce in a day*5 then: NORMAL/OVER-/UNDER-PRODUCING (see step #9 below for criteria)
    2. or the Site last reported before the solar day end yesterday (minus a dawn/dusk offset*7), and yesterday the site was fine, then don't change the site status (until the morning at least)

      (in other words, we will only go to NOT PRODUCING if the site hasn't reported readouts for yesterday by the morning, or if those readouts did arrive but indicated very low energy production.)
  7. When the timeout is at least 2880 minutes (2 days)
    1. and the energy generated the day before yesterday is more than what the site is expected to produce in a day*5 then: NORMAL/OVER-/UNDER-PRODUCING (see step #9 below for criteria)
    2. or the Site last reported before the solar day end the day before yesterday (minus a dawn/dusk offset*7), and yesterday the site was fine, then don't change the site status (until the morning at least)

      (in other words, we will only go to NOT PRODUCING if the site hasn't reported readouts for two days ago by the morning, or if those readouts did arrive but indicated very low energy production.)
  8. When the timeout is at least 4320 minutes (3 days)
    1. and the energy generated 3 days ago is more than what the site is expected to produce in a day*5 then: NORMAL/OVER-/UNDER-PRODUCING (see step #9 below for criteria)
    2. or the Site last reported before the solar day end two days ago (minus a dawn/dusk offset*7), and yesterday the site was fine, then don't change the site status (until the morning at least)

      (in other words, we will only go to NOT PRODUCING if the site hasn't reported readouts for three days ago by the morning, or if those readouts did arrive but indicated very low energy production.)
  9. Otherwise: NOT PRODUCING
Footnotes for the above rules

*1: System COM ERR Timeout

The COM ERR timeout set for the system has passed since the device reported any readings...

See System-specific Issue Generation Settings for a more detailed explanation.

This can be set on the system configuration form:

The default value (if not set here) is: 120 minutes.

*2: Business Minutes Elapsed since Last Report

...where the timeout only takes into consideration minutes in the solar day...

When determining how many minutes ago a device last reported, we only take into account the number of minutes elapsed during the solar day, where the solar day can be set on the site settings page:

If not set here, de following default values are used: 7 a.m. - 5 p.m.

Note that for historical reasons we don't make use of the calculated sunrise and sunset values when determining how long a site has not been reporting. Using the calculated sunrise and sunset times here could be argued for.

*3: Minimum Production Threshold

If a site is producing 0, or very little, then we consider it to effectively not be producing at all. This "very little" is determined by the Minimum Production Threshold. This threshold can be set specifically for a site by clicking on the little envelope icon next to the site name:

If not set here, then the threshold is considered to be 1% of the system module output, as set on the system form (System Size field):

If no system size is set, then the threshold is set to 5kW.

*4: Expected Production Period

Site time is before the end of the Expected Production Period and... 

We expect a site to produce energy during a period each day. This "Expected Production Period" can be set explicitly for a site on the site details form:

If it is not set here, then we use the calculated site sunrise and sunset times adjusted by a "dawn/dusk offset" value of 60 minutes. See MANA-2402 as to why this was changed from 30 to 60 minutes!  120 minutes. See MANA-3715 as to why this was changed from 60 to 120 minutes!

The sunrise and sunset times for a site are calculated every day based on location / time zone information and using the sunrise/sunset algorithm published by the US Naval Observatory . It is shown on the site detail page in the top-right corner:

In order to "play it safe", a fixed minimum and maximum value is hard-coded. These are: 7 a.m. and 5 p.m.

So, if the sunrise is calculated to be before 6, then the site is expected to be producing after 7. In other words, even if the sunrise is at 4 a.m., it is not expected to be producing before 7 a.m..

Similarly, if the sunset is after 8 p.m., the site is not expected to be producing after 5 p.m..

So, taking the above screenshot as an example, we would expect this given site to be producing between 7:29 am and 5:07 pm on this day. 

*5: Site Expected Daily Energy Production:

the energy generated today as well as yesterday is less than what the site is expected to produce in a day...

COALESCE(`system`.ModuleOutput * 
         (TIMESTAMPDIFF(MINUTE, 
                        site.SiteDayStart, 
                        site.SiteDayEnd
                       )/60) * COALESCE(site.NotProducingThresholdPct, 0.05), 1)

Calculated using the module output (System DC Size on the site configuration form, or AC size if DC is unavailable) multiplied by the site expected production period (see *4 above) and the site "Not Producing Threshold Pct" (see *6 below).

If for some reason any of the above cannot be calculated (system DC/AC size isn't given, or no GPS coordinates are set for the site) then a fix threshold of 1 kWh is used.

*6: "Site Not Producing Threshold Pct"

This if 5% by default, but can be set explicitly for a site on the site settings form:

*7: Site Expected Production Period - NOT PRODUCING Notifications Timeout

Site last reported during the Expected Production Period taking into consideration the not producing notification timeout...

COALESCE(`system`.NotProducingNotificationTimeout, 120) < TIMESTAMPDIFF(MINUTE, site.SiteDayStart, site.SiteDayEnd)
AND		DATE(production_device_summary.LastReport) = DATE(`system`.SiteTime)
AND		TIME(production_device_summary.LastReport)
			BETWEEN (site.SiteDayStart + INTERVAL COALESCE(`system`.NotProducingNotificationTimeout, 120) MINUTE) AND site.SiteDayEnd

The site solar day is the same as what is described in footnote #4 above. Additionally, we also allow a leeway that can be set specifically for each system by clicking the envelope icon next to the system name:

So, if the sun rises at 6:29 am at a site and sets at 6:07 pm, and has a NOT PRODUCING Notifications Timeout set to 60 minutes, then we will be checking that the site is producing energy between 8:29 am (6:29 + timeout + dawn/dusk offset) and 5:07 pm (6:07 - dawn/dusk offset). If nothing is set, the default value is 120 minutes.

*8: irradiance is either not available or available and above the irradiance threshold

NOT(site.SystemStatusConsidersIrradiance)
OR		device_irradiance_stats.ID IS NULL
OR		ABS(TIMESTAMPDIFF(MINUTE, device_irradiance_stats.LastIrradianceReferenceDateTimeUTC, production_device_summary.LastReportUTC)) > 30
OR		device_irradiance_stats.LastIrradiance > COALESCE(site.IrradianceThreshold, 50)

A site can be set to disregard irradiance completely on the site details page:

If enabled, and the last irradiance data was reported in the past 30 minutes, then we check the last irradiance value reported. If it exceeds the irradiance threshold (50 W/m2 by default, but can be set explicitly for a site on the site details page), then we expect the site to be producing energy during daylight hours as explained above.

 
Relevant Source Code for System Status Determination
`system`.StatusCode = 
	CASE 
	WHEN	production_device_summary.SystemID IS NULL
	THEN
		1	#'NORMAL'
	
	WHEN	production_device_summary.LastReportUTC IS NULL
	THEN
		2	#'COM ERR'
		
	WHEN	#MANA-1216 for PV OUTPUT devices take business hours into account only:
			production_device_summary.BusinessMinutesSinceLastReport > COALESCE(`system`.ComErrTimeout, 120) 
	THEN 
		3	#'COM ERR' 
		
	WHEN 	COALESCE(production_device_summary.CurrentOutput, 0) >= COALESCE(`system`.NotProducingThreshold, `system`.ModuleOutput * 0.01, 5)
	THEN
		4	#PRODUCING/OVER-UNDER
		
	WHEN	/*	Current output is below 1% during the solar day (checked previously)
				and generated yesterday AND generated today is under threshold
				irradiance doesn't matter
			*/
					TIME(`system`.SiteTime) < site.SiteDayEnd
			AND		(	system_stats.PerformanceRatioToday IS NULL
					OR	system_stats.PerformanceRatioYesterday IS NULL)
			AND		COALESCE(production_device_summary.GeneratedYesterday, 0) 
						< COALESCE(`system`.ModuleOutput * 
							(TIMESTAMPDIFF(MINUTE, 
								site.SiteDayStart, 
								site.SiteDayEnd
							)/60) * COALESCE(site.NotProducingThresholdPct, 0.05), 1)
			AND		#kWh, MANA-607, MANA-551
					COALESCE(production_device_summary.GeneratedToday, 0) 
						< COALESCE(`system`.ModuleOutput 
							* TIMESTAMPDIFF(MINUTE, 
								site.SiteDayStart, 
								site.SiteDayEnd
							)/60 * COALESCE(site.NotProducingThresholdPct, 0.05), 1)
	THEN
		5 	#'NOT PRODUCING'
		
	WHEN	/*	Current output is below 1% during the solar day (checked previously)
				and generated yesterday AND generated today is under threshold
				irradiance doesn't matter
			*/
					TIME(`system`.SiteTime) < site.SiteDayEnd
			AND		system_stats.PerformanceRatioToday IS NOT NULL
			AND		system_stats.PerformanceRatioYesterday IS NOT NULL
			AND		system_stats.PerformanceRatioYesterday < COALESCE(site.NotProducingThresholdPct, 0.05)
			AND		system_stats.PerformanceRatioToday < COALESCE(site.NotProducingThresholdPct, 0.05)
	THEN
		55 	#'NOT PRODUCING'
					
	WHEN	/*	Current output is below 1% during the solar day (checked previously)
				and last report is today after day start + NotProducingNotificationTimeout and before day end
				and irradiance shouldn't be taken into account or irradiance is above threshold (MANA-2402)
			*/
					COALESCE(`system`.NotProducingNotificationTimeout, 120) < TIMESTAMPDIFF(MINUTE, site.SiteDayStart, site.SiteDayEnd)
			AND		DATE(production_device_summary.LastReport) = DATE(`system`.SiteTime)
			AND		TIME(production_device_summary.LastReport)
						BETWEEN (site.SiteDayStart + INTERVAL COALESCE(`system`.NotProducingNotificationTimeout, 120) MINUTE) AND site.SiteDayEnd
			AND	(
							NOT(site.SystemStatusConsidersIrradiance)
					OR		device_irradiance_stats.ID IS NULL
					OR		ABS(TIMESTAMPDIFF(MINUTE, device_irradiance_stats.LastIrradianceReferenceDateTimeUTC, production_device_summary.LastReportUTC)) > 30
					OR		device_irradiance_stats.LastIrradiance > COALESCE(site.IrradianceThreshold, 50)
				)
				# No other check - current output should be at least 1% during the solar day
				/* A nice check for above condition:
					SELECT 	EnergyProduced / 3600000,
							`system`.ModuleOutput,
							CASE WHEN EnergyProduced / 3600000 < COALESCE(`system`.NotProducingThreshold, `system`.ModuleOutput * 0.01, 1) THEN 'X' ELSE NULL END
					FROM	device_readout_hourly 
							INNER JOIN device ON device.ID = device_readout_hourly.DeviceID
							INNER JOIN `system` ON `system`.ID = device.SystemID
					WHERE	DATE(ReferenceDateTimeLocal) = '2017-07-21' AND HOUR(ReferenceDateTimeLocal) = 7
					*/	
	THEN
		6 	#'NOT PRODUCING'
						
	WHEN	/* 	Current output is below 1% during the solar day (checked previously)
				and last report is today after day end 
				and generated today is less than the threshold then NOT PRODUCING */
					DATE(production_device_summary.LastReport) = DATE(`system`.SiteTime)
			AND		TIME(production_device_summary.LastReport) > site.SiteDayEnd
			AND		system_stats.PerformanceRatioToday IS NULL
			AND		#kWh, MANA-607, MANA-551, should have produced at least at 10% for each hour since 7 am today
					COALESCE(production_device_summary.GeneratedToday, 0) 
						< COALESCE(`system`.ModuleOutput 
							* TIMESTAMPDIFF(MINUTE, 
								site.SiteDayStart, 
								site.SiteDayEnd
							)/60 * COALESCE(site.NotProducingThresholdPct, 0.05), 1)
	THEN
		7 	#'NOT PRODUCING'
						
	WHEN	/* 	Current output is below 1% during the solar day (checked previously)
				and last report is today after day end 
				and generated today is less than the threshold then NOT PRODUCING */
					DATE(production_device_summary.LastReport) = DATE(`system`.SiteTime)
			AND		TIME(production_device_summary.LastReport) > site.SiteDayEnd
			AND		system_stats.PerformanceRatioToday IS NOT NULL
			AND		system_stats.PerformanceRatioToday
						< COALESCE(site.NotProducingThresholdPct, 0.05)
	THEN
		77 	#'NOT PRODUCING'			
					
	WHEN	/* MANA-2371: if last status was NOT PRODUCING then we stay with that until production excedes the threshold */
			`system`.Status = 'NOT PRODUCING'
	THEN
		8 	#'NOT PRODUCING'			
		
	ELSE 
		9	#PRODUCING/OVER-UNDER
	
END

 

Automatic Determination of System Status for a Aggregator Systems

Aggregator systems are systems without a primary physical production metering device, but with subsystems.

The status of these systems is determined based on the status of the subsystems, in the following order of precedence:

  1. If any of the subsystems have status "NORMAL", then the aggregator system has status "NORMAL"
  2. If any of the subsystems have status "OVERPRODUCING", then the aggregator system has status "OVERPRODUCING"
  3. If any of the subsystems have status "UNDERPRODUCING", then the aggregator system has status "UNDERPRODUCING"
  4. If any of the subsystems have status "NOT PRODUCING", then the aggregator system has status "NOT PRODUCING"
  5. If any of the subsystems have status "COM ERR", then the aggregator system has status "COM ERR"

Relevant Source Code for Aggregator System Status Determination

CASE 	MIN(
			CASE 
				WHEN uh.`Status` = 'COM ERR' THEN 4
				WHEN uh.`Status` = 'NOT PRODUCING' THEN 3
				WHEN uh.`Status` = 'UNDERPERFORMING' THEN 2
				WHEN uh.`Status` = 'OVERPERFORMING' THEN 1
				WHEN uh.`Status` = 'NORMAL' THEN 0
			END
		) 
	WHEN 4 THEN 'COM ERR'
	WHEN 3 THEN 'NOT PRODUCING'
	WHEN 2 THEN 'UNDERPERFORMING'
	WHEN 1 THEN 'OVERPERFORMING'
	ELSE 'NORMAL'
END AS `Status`

PV Site/System Status Icon

The icon shown in the maps can be one of:

The icon shown is loosely determined by the status of the system based on the following logic (in order of precedence):

  1. System status is COM ERR/NOT PRODUCING: thunderstorm

  2. If system has children or grandchildren, and any of the children/grandchildren are COM ERR/NOT PRODUCING:
    1. and site takes irradiance into account and irradiance is available and above the irradiance threshold (see footnote *8 above) then: sunny+thunderstorm
    2. and site time is during the expected solar production period (see *4 above) then: sunny+thunderstorm
    3. otherwise moon+thunderstorm
  3. Latest power reading was obtained in the past 30 minutes and exceeds the minimum production threshold*3 then: sunny

  4. Site is set to consider irradiance and the latest irradiance readout was within the past 30 minutes and exceeds the threshold then (see *8 above for more details): sunny

  5. Site local time is within the Expected Production Period (see *4 above): sunny
  6. Otherwise: moon
Relevant Source Code
CASE WHEN`system`.`Status` IN ('COM ERR', 'NOT PRODUCING') 
THEN 
	'thunderstorm.png'
WHEN 	vw_system_l2children.ParentID IS NOT NULL 
	AND	vw_system_l2children.SubSystemsStatus IN ('COM ERR', 'NOT PRODUCING')
THEN
	CASE WHEN 	site.SystemStatusConsidersIrradiance
			AND	device_irradiance_stats.ID IS NOT NULL
			AND	ABS(TIMESTAMPDIFF(MINUTE, device_irradiance_stats.LastIrradianceReferenceDateTimeUTC, UTC_TIMESTAMP)) <= 30
			AND	device_irradiance_stats.LastIrradiance > COALESCE(site.IrradianceThreshold, 50)
			AND 	HOUR(CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', COALESCE(site_time_zone.MysqlName, 'UTC'))) BETWEEN 5 AND 21
	THEN
		'sunny+thunderstorm.png'
	WHEN 	TIME(CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', COALESCE(site_time_zone.MysqlName, 'UTC'))) 
				BETWEEN COALESCE(NULLIF(site.DayStart, '00:00:00'), 
					COALESCE(GREATEST(TIME(site.SunriseToday)+INTERVAL _offsetFromDayStartAndEnd MINUTE, CAST('080000' AS TIME)), CAST('080000' AS TIME))
					) AND COALESCE(NULLIF(site.DayEnd, '00:00:00'), 
					COALESCE(LEAST(TIME(site.SunsetToday)-INTERVAL _offsetFromDayStartAndEnd MINUTE, CAST('190000' AS TIME)), CAST('190000' AS TIME))
					) 
	THEN
		'sunny+thunderstorm.png'
	ELSE
		'moon+thunderstorm_v3.png'
	END
WHEN 	vw_system_l1children.ParentID IS NOT NULL 
	AND	vw_system_l1children.SubSystemsStatus IN ('COM ERR', 'NOT PRODUCING')
THEN
	CASE WHEN 	site.SystemStatusConsidersIrradiance
			AND	device_irradiance_stats.ID IS NOT NULL
			AND	ABS(TIMESTAMPDIFF(MINUTE, device_irradiance_stats.LastIrradianceReferenceDateTimeUTC, UTC_TIMESTAMP)) <= 30
			AND	device_irradiance_stats.LastIrradiance > COALESCE(site.IrradianceThreshold, 50)
			AND 	HOUR(CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', COALESCE(site_time_zone.MysqlName, 'UTC'))) BETWEEN 5 AND 21
	THEN
		'sunny+thunderstorm.png'
	WHEN	TIME(CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', COALESCE(site_time_zone.MysqlName, 'UTC'))) 
				BETWEEN COALESCE(NULLIF(site.DayStart, '00:00:00'), COALESCE(GREATEST(TIME(site.SunriseToday)+INTERVAL _offsetFromDayStartAndEnd MINUTE, CAST('080000' AS TIME)), CAST('080000' AS TIME))) 
					AND COALESCE(NULLIF(site.DayEnd, '00:00:00'), COALESCE(LEAST(TIME(site.SunsetToday)-INTERVAL _offsetFromDayStartAndEnd MINUTE, CAST('190000' AS TIME)), CAST('190000' AS TIME))) 
	THEN
		'sunny+thunderstorm.png'
	ELSE
		'moon+thunderstorm_v3.png'
	END
WHEN 			COALESCE(`system`.CurrentProductionPower, 0) > COALESCE(`system`.NotProducingThreshold, `system`.ModuleOutput * 0.01, 5) 
		AND ABS(TIMESTAMPDIFF(MINUTE, `system`.LastProductionReport, CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', COALESCE(site_time_zone.MysqlName, 'UTC')))) < 30
THEN
	CASE WHEN	site.SystemStatusConsidersIrradiance
			AND	device_irradiance_stats.ID IS NOT NULL
			AND	ABS(TIMESTAMPDIFF(MINUTE, device_irradiance_stats.LastIrradianceReferenceDateTimeUTC, UTC_TIMESTAMP)) <= 30
			AND	device_irradiance_stats.LastIrradiance < COALESCE(site.IrradianceThreshold, 50)
			AND 	NOT(TIME(CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', COALESCE(site_time_zone.MysqlName, 'UTC'))) 
						BETWEEN (LEAST(
							COALESCE(NULLIF(site.DayStart, '00:00:00'), CAST('120000' AS TIME)),
							COALESCE(TIME(site.SunriseToday), CAST('120000' AS TIME)),
							CAST('080000' AS TIME)) - INTERVAL _offsetFromDayStartAndEnd MINUTE) 
						AND	(GREATEST(
							COALESCE(NULLIF(site.DayEnd, '00:00:00'), CAST('120000' AS TIME)),
							COALESCE(TIME(site.SunsetToday), CAST('120000' AS TIME)),
							CAST('190000' AS TIME)) + INTERVAL _offsetFromDayStartAndEnd MINUTE)
						)	# Subtract and add here, unlike in other places, so we make sure not to show the question mark while it's daylight
	THEN	# Power is being generated and it is nighttime according to irradiance
		'sunny.png' # Zoli wants this off: 'sunny+info_circle.png'
	ELSE	# Power is being generated and it is daytime or no irradiance readouts exist
		'sunny.png'
	END
WHEN			site.SystemStatusConsidersIrradiance
		AND	device_irradiance_stats.ID IS NOT NULL
		AND	ABS(TIMESTAMPDIFF(MINUTE, device_irradiance_stats.LastIrradianceReferenceDateTimeUTC, UTC_TIMESTAMP)) <= 30
		AND	device_irradiance_stats.LastIrradiance > COALESCE(site.IrradianceThreshold, 50)
		AND 	HOUR(CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', COALESCE(site_time_zone.MysqlName, 'UTC'))) BETWEEN 5 AND 21
THEN
	'sunny.png'
WHEN	TIME(CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', COALESCE(site_time_zone.MysqlName, 'UTC'))) 
			BETWEEN COALESCE(NULLIF(site.DayStart, '00:00:00'), COALESCE(GREATEST(TIME(site.SunriseToday)+INTERVAL _offsetFromDayStartAndEnd MINUTE, CAST('080000' AS TIME)), CAST('080000' AS TIME))) 
				AND COALESCE(NULLIF(site.DayEnd, '00:00:00'), COALESCE(LEAST(TIME(site.SunsetToday)-INTERVAL _offsetFromDayStartAndEnd MINUTE, CAST('190000' AS TIME)), CAST('190000' AS TIME))) 
THEN
	'sunny.png'
ELSE
	'moon.png'
END

Consumption Sites

A system with a PRIMARY Total Consumption or Load type device is considered a consumption system. A consumption system can have one of the following technical statuses:

These are the statuses shown on the site details page. An explanation of why a site is assigned a given status can be obtained by hovering the mouse over the status button:

The consumption status is also shown on the systems list page:

"Consumption Status" here can be one of: 

Automatic Determination of System Status for a System with a Primary Device

The status of a system with a primary consumption device is determined according to the following rules, shown in order or priority, i.e. whichever rule matches first determines the status. All rules are run against the readings obtained from the primary consumption meter set for the system. The primary device is indicated by the words (PRIMARY) on the site details page:

Rules:

  1. Mana has never obtained any readings from the device: COM ERR
  2. The COM ERR timeout set for the system has passed since the device reported any readings: COM ERR
  3. Otherwise: NORMAL

Automatic Determination of System Status for a Aggregator Systems

Aggregator systems are systems without a primary physical production metering device, but with subsystems.

The status of these systems is determined based on the status of the subsystems, in the following order of precedence:

  1. If any of the subsystems have status "NORMAL", then the aggregator system has status "NORMAL"
  2. If any of the subsystems have status "COM ERR", then the aggregator system has status "COM ERR"

PV Site/System Status Icon

The icon shown in the maps can be one of:

The icon shown is loosely determined by the status of the system based on the following logic (in order of precedence):

  1. System status is COM ERR: red triangle
  2. If system has children or grandchildren, and any of the children/grandchildren are COM ERR: lightbulb + red triangle
  3. If the device has reported non-zero values in the past twelve hours, then: yellow lightbulb
  4. Otherwise: white lightbulb

Hybrid Sites

Sites with both production and consumption devices are considered hybrid sites. These sites have both a production and a consumption status in the sites list page. On the map, the status of the production device takes precedence over the status of the consumption device.

The following additional icons are available for use, but not currently in use:

Notifications

Notifications can be delivered via email or reviewed on the Mana Website. 

On the website, you can see your most recent notification on the Dashboard page. You can also hide any notifications that you've read.

Issue Notifications

You can opt to receive notifications of the following issue-related events:

Notification Type Explanation
Issue Created for Me When a new issue is created, the system sends a notification to the assignee.
Issue Assigned to Me When an existing issue is assigned, the system sends a notification to the new user.
Issue Status Changed When an issue status is changed, the system sends notifications to the issue creator and assignee.
Issue Deleted When an existing issue is deleted, the system sends notifications to the issue creator and assignee.
Issue Comment Added When a comment is added to an issue, the system sends notifications to the issue creator and assignee.

 

System Status Notifications

You can opt to be notified of the following types of system-related events:

Notification Type Explanation
System Production COM ERR The system production meter status has been COM ERR for a certain amount of time.
System Production NOT PRODUCING The system production meter status has been NOT PRODUCING for a certain amount of time.
System Production COM ERR Resolved The system production meter status was COM ERR but has returned to NORMAL.
System Production NOT PRODUCING Resolved The system production meter  status was NOT PRODUCING but has returned to NORMAL.
System Consumption COM ERR The system consumption meter status has been COM ERR for a certain amount of time.
System Consumption COM ERR Resolved The system consumption meter status was COM ERR but has returned to NORMAL.

System Performance Deviation Notifications

You can opt to be notified of the following types of system-related events:

Notification Type Explanation
System Production DEVIATION System momentary power production has deviated from predicted power by a certain amount for at least a certain amount of time.
System Production DEVIATION Resolved System momentary power production had deviated previously, but has now returned to within the expected envelope for a certain amount of time.

The methodology for determining whether a system is deviating from expected is as follows: 

Production Performance = Momentary Actual Power Reading / Predicted Power

If the production performance falls below the minimum threshold (%) or exceeds the maximum threshold (%) for a certain amount of time (the duration threshold), then an issue is created and a notification generated.

You can review the momentary actual power vs. predicted power on the analytics page for the given system, just make sure the "Predicted Power" series is on:

Enabling/Disabling Notifications for a System

The different types of notifications that can be automatically generated for a system can be turned off for a given system.

Note that if you turn off a type of notification for a system, then such notifications will also be turned off for the subsystems of that system as well!

To set these system-specific settings, open the site details page (from the sites list page or using the sites quick-access drop-down). Then, click on the little envelope next to the given system:

You can turn COM ERR and/or NOT PRODUCING notifications on or off, and you can also set a timeout. For an overview of the options available, see System-specific Issue Generation Settings in the Mana Administrator's Manual.

A Word on Timeouts

There are two timeouts that affect system status notifications. 

First, the website can be configured to wait a specified amount of minutes before setting a system's status to COM ERR. This is to allow some lag in communications between the device(s) and Mana. This timeout can be set on the system form:

Second, the website can be configured to wait a specified amount of minutes after a system has stopped reporting before creating a COM ERR issue. Similarly, a timeout can be set after a system has stopped reporting non-null values before a NOT PRODUCING issue should be created.

Note that the issue generation timeout is not in addition to the COM ERR timeout, but the COM ERR timeout must elapse before a system state is set to COM ERR. In other words, the largest value set in either the system COM ERR timeout or the system COM ERR Notifications timeout must elapse before a COM ERR notification is created.  

If you are an administrator, refer to the Mana Administrator's Manual for a technical overview of how issue generation and notifications work.

Effective Availability Calculation

Effective Availability

EA Calculation

Effective Availability is calculated for each aggregator system as follows:

$$Ea\%\ =\ \frac{Energy\ Produced}{Energy\ Produced\ +\ Energy\ Lost}$$

It is calculated on a granular level (depending on the readout frequency, i.e. for every 5 or 15 minute period). The daily EA is calculated the same way but of course the values are for the whole day. The daily Energy Produced and Energy Lost values are determined by summing the values calculated on the granular level for the given day.

EA is only calculated "when the sun is shining", which means that if the site is not expected to be producing, then EA is not calculated at all for that 5 or 15 minute period. Irradiance as well as the current average power production of all subsystems are used to determine whether all subsystem of a given system are expected to be producing. This is necessary since we don't expect units to produce in the dark.

The exact algorithm to determine whether a system is expected to be producing is as follows:

If an irradiance threshold is not set for the site, or irradiance is unavailable, 
	and the sum of the average power of all subsystems during the previous period exceeds the minimum power threshold
	→ then all subsystems are expected to be producing
Otherwise, if irradiance threshold is set for the site 
	and irradiance readouts are available 
    and the current measured irradiance exceeds the irradiance threshold
	→ then all subsystems are expected to be producing
Otherwise
   → the site is not expected to be producing (no EA is calculated)

The Minimum Power Threshold is determined as 1% of the sum of module outputs for the given system.

The Irradiance Threshold can be set on the site configuration form for the whole site:

Energy Produced is calculated simply as the sum of the readouts of all subsystems. 

Energy Lost is calculated based on the energy produced by units (which we call subsystems) that are online, if available:

$$Energy\ Lost\ =\ Energy\ Produced\ *\ \frac{DC\ Size\ of\ Units\ Offline\ +\ DC\ Size\ of\ Units\ Not\ Producing}{DC\ Size\ of\ Online\ Subsystems}$$

DC size of units is determined from the Module Output of the system, which in turn is the sum Wattage * Device Count of all "Module" type devices registered to that system. In case of virtual aggregator systems, this value is calculated from its subsystems that do have modules.

A subsystem is considered online in the context of the above equation if it produced at least 0.5 kW over the preceding period at an average power of at least 0.1% of the rated module output.

A subsystem is considered not producing if it is reporting values, but these values are below the threshold explained above.

A subsystem is considered offline if readings are unavailable.

If no subsystems are online, then we use the predicted hourly output for the aggregator system to calculate the energy lost. The predicted hourly output for an aggregator system is calculated as follows:

$$\frac{System\ Size\ *\ Derate\ Factor\ *\ Irradiance}{1000} \ *\ ( 1-Temp.\ Coefficient\ *\ ( Celsius\ Cell\ Temp.-25))$$

We can then get the energy lost as follows:

$$Energy\ Lost\ =\ \frac{Predicted\ Hourly\ Energy\ Output}{60} \ *\ Minutes\ in\ Period$$

EA Visualization

The EA for each site is available from the Analytics tab on the site details page:

The values are also available in a table on the Local Readings tab for each site:

The result includes the values used in the calculation, and can be exported in various formats:

Use the Local Readings tab to drill-down and identify why the site underperformed on a given day (circled in the previous image):