Датчик наружного освещения - очень полезная штука при автоматизации дома. Из рабочих сценариев в которых он понадобится - освещение территории, освещение отдельных участков по движению, управление ролетами/шторами/маркизами для затенения, полив газона и много других, сугубо практических, сценариев.

Реализация датчика освещения может быть например "железной" (сумрачный датчик из строительного магазина за 5 баксов, немного электронной обвязки и погнали) НО солнце объект весьма прогнозируемый, автоматизируем же мы НЕдвижимое имущество и вполне можно обойтись простой математикой - абсолютно достаточно знать расположение и дату/время для вычисления положения солнца на небе.

Математика движения объектов по небу с одной стороны абсолютно точная с другой достаточно сложная, особенно с гео-привязкой, потому про нас позаботились. В базу openhab2 входит отличный плагин Astro (https://www.openhab.org/addons/bindings/astro/) который описывает, ни много ни мало, 2 устройства - Солнце и Луну. Вам достаточно скормить ему свою геолокацию. Каждое из "устройств" имеет множество полезных характеристик, в том числе азимут и склонение, этого нам уже достаточно для вычисления солнечной радиации в нужной точке. НО в последних версиях плагина появилось также свойство Radiation, которое можно просто брать и использовать.

things

astro:sun:home  [ geolocation="50.542568, 30.176788,100", interval=60 ]

items

DateTime Sunrise_Time       "Sunrise [%1$tH:%1$tM]"                   { channel="astro:sun:home:rise#start" }
DateTime Sunset_Time        "Sunset [%1$tH:%1$tM]"                    { channel="astro:sun:home:set#start" }
Number   Azimuth            "Azimuth"                                 { channel="astro:sun:home:position#azimuth" }
Number   Elevation          "Elevation"                               { channel="astro:sun:home:position#elevation" }
Number   Total_Radiation    "Radiation [%.2f W/m\u00B2]"              { channel="astro:sun:home:radiation#total" }
Number   Diffuse_Radiation  "Diffuse Radiation [%.2f W/m\u00B2]"      { channel="astro:sun:home:radiation#diffuse" }


Number Lux                  "radiation in Lux [%d]"
Number Weighted_Radiation   "total solar radiation (W/m^2) corrected for cloud layer [%d]"
Number WeightedLux          "radiation in Lux corrected for cloud layer [%d]"

Но хочется чуть большего - хочется иметь значения в более понятных чем Вт/м единицах (люкс) и хочется что-то придумать с облаками/тучами, которые часто случаются.

В составе openhab2 есть еще один полезный плагин, называется synopanalyzer (https://www.openhab.org/addons/bindings/synopanalyzer/) он умеет получать данные метео-обстановки от аэропортов, ценность этого плагина (а вернее данных аэропортов) в том что они отдают такой параметр как octa (https://en.wikipedia.org/wiki/Okta), это число от 0 до 9 которое связано со степенью пропускания солнечной радиации облачностью через специальную формулу:

1-0.75*octa3.4/8

Все что вам достаточно - узнать код ближайшего к вам аэропорта (https://www.ogimet.com/gsynop_nav.phtml.en), ну и что-бы этот аэропорт был от вас недалеко.

things

synopanalyzer:synopanalyzer:kyiv [ stationId="33345", refreshInterval=30]

items

Number Synop_Octa "Octa [%d]/8" { channel = "synopanalyzer:synopanalyzer:kyiv:octa" }

Соберем все это в правило:

rule "Calculate outside light"
when
    Item Synop_Octa changed or
    Item Total_Radiation changed
then
    // Okta
    var int vOkta = (Synop_Octa.state as Number).intValue
    var double vTotalRadiation = (Total_Radiation.state as Number).doubleValue

    // Factor of mitigation for the cloud layer
    var double Kc = 1 - 0.75 * Math.pow(vOkta/8.03.4)
    
    logInfo("Light""Kc {}"Kc)

    var double vLux = vTotalRadiation / 0.0079  // Radiation in Lux. 1 Lux = 0.0079 W/m²
    var double vWeightedLux = vLux * Kc         // radiation of the Sun with the cloud layer

    Lux.postUpdate(vLux)
    WeightedLux.postUpdate(vWeightedLux)
    Weighted_Radiation.postUpdate(vTotalRadiation * Kc)

end

Теперь у нас есть 3 замечательных виртуальных числовых "датчика" Lux - освещение без учета облаков, WeightedLux - освещение с учетом облаков, Weighted_Radiation - солнечная радиация с учетом облаков.

Во всем этом удовольствии есть только 1 ложка дегтя - данные по облачности на аэропортах обновляются в лучшем случае раз в час, а то и реже, сам аэропорт может быть от вас и в 5км и в 50км, что естественно сказывается на адекватности ситуации, но по личному опыту даже 50км работает вполне адекватно, по крайней мере облачный день от не облачного отличает.


Бондинг Astro очень мощный, и может крепко помогать в решении нетривиальных задач - например закрывать жалюзи когда солнце входит в определенный сектор неба, управлять следящими приводами солнечных систем, управлять ролетой мансардного окна ночью в полнолуние, синхронизировать режимы полива с циклами луны и тд. и тп.