Lyova

<<< Back

Доводим до ума предсказатель погоды v0.1 beta доработка 18.09.2018

Надыхнули статьи
https://majordomo.smartliving.ru/forum/viewtopic.php?t=4674
даже есть готовое решение как отдельное устройство...
https://github.com/AlexGyver/WeatherPredict

Создаем скрипт в меню сценарии и ставим его на исполнение каждые 10 минут средством cron
https://kb.smartliving.ru/cron_help/?utm_source=sy...


//предсказатель погоды v0.1 beta
$sensor = 'Sensor_tempPressure01.valuePressure'; 
// прописываем свой датчик атмосферного давления 
// показания должны быть в ммРтутногостолба как минимум 2 знака после запятой к примеру (740,34)
// и обязательно отдающий данные в реальном режиме времени!
//$sensor = 'ow_fact.pressure_mmhg'; НЕ ИСПОЛЬЗОВАТЬ!!! сори за капс)
$period = 3*60*60;
//$history=getHistoryAvg($sensor, time()-$period, time());
$history = getHistory($sensor, time()-$period, time());
$sumX = 0;
$sumY = 0;
$sumX2 = 0;
$sumXY = 0;
$i = 0;//а это надо?
foreach($history as $h_part){
     $pres = $h_part['VALUE'];//паскали нафиг не нужны, точно
     $sumX += time() - strtotime($h_part['ADDED']);
     $sumY += $pres;
     $sumX2 += (time() - strtotime($h_part['ADDED'])) * (time()-strtotime($h_part['ADDED']));
     $sumXY += (time() - strtotime($h_part['ADDED'])) * $pres;
     $i++;//а это надо?
}
//unset($h_part);//а это надо?
$a = 0;//а это надо?
$a = $i*$sumXY; // расчёт коэффициента наклона прямой и $i надо, но все ли верно?
$a = $a-$sumX*$sumY;
$a = $a/($i*$sumX2-$sumX*$sumY);
$dt = -$a * $i;// расчёт изменения давления, эээм минус не лишний
$dt = (($dt)*100000)/9; // калибровка, нужна доводка...
$dt =round($dt);
//print_r($dt);
sg('Predictor.DT',$dt); // запись в базу значений для предсказателя

//file_put_contents('./cms/texts/predictorPressure.txt', date('Y-m-d H:i:s')  . ' ' .  $dt  . PHP_EOL, FILE_APPEND); // для отладки - пишем данные в файл
/*
if($dt<-250) {
 say('Апокалипсис не за горами. Дельта'.$dt);
} elseif ($dt<-150) {
 say('Ожидается резкое ухудшение погоды. Значение дельты '.$dt);
} elseif ($dt<-50) {
 say('Ожидается ухудшение погоды. Значение дельты '.$dt);
} elseif ($dt>50) {
 say('Ожидается улучшение погоды. Значение дельты '.$dt);
} elseif ($dt>150) {
 say('Ожидается резкое улучшение погоды. Значение дельты '.$dt);
} elseif ($dt>250) {
 say('Апокалипсис не за горами. Дельта '.$dt);
}
/*

Создаем в меню управления HTML блок


<html>
<head>
      <script src="/js/canvas-gauges/gauge.min.js"></script>
</head>
<body>
<center>

<canvas data-type="radial-gauge"
        data-width="200"
        data-height="200"
        data-units="Осадки | Солнечно"
        data-title="Предсказатель погоды"
        data-value=%Predictor.DT%
        data-min-value="-500"
        data-max-value="500"
        data-major-ticks="[-500,-450,-400,-350,-300,-250,-200,-150,-100,-50,0,50,100,150,200,250,300,350,400,450,500]"
        data-minor-ticks="2"
        data-stroke-ticks="true"
        data-animation-rule="elastic"
        data-animation-duration="500"
        data-highlights='[
                    {"from": -100, "to": 0, "color": "rgba(78, 187, 48, 1)"},
                         {"from": -300, "to": -100, "color": "rgba(229, 210, 6, 1)"},
                         {"from": 100, "to": 300, "color": "rgba(229, 210, 6, 1)"},
                         {"from": -500, "to": -300, "color": "rgba(229, 6, 6, 1)"},
                         {"from": 300, "to": 500, "color": "rgba(229, 6, 6, 1)"},
                    {"from": 0, "to": 100, "color": "rgba(78, 187, 48, 1)"}

                ]'
        data-ticks-angle="225"
        data-start-angle="67.5"
        data-border-shadow-width="0"
        data-borders="true"
        data-needle-type="arrow"
        data-needle-width="3"
        data-needle-circle-size="7"
        data-needle-circle-outer="true"
        data-needle-circle-inner="false"
        data-animation-duration="1500"
        data-animation-rule="linear"
        data-value-box-border-radius="2"
        data-font-value="Led"
        data-font-numbers="Led"
        data-font-title="Led"
        data-font-units="Led"
></canvas>
 </center>
</body>
</html>

Ставим компонент виджета

(canvas-gauges) https://github.com/Mikhus/canvas-gauges

в папку /www/js/canvas-gauges

а именно файл gauge.min.js

В результате имеем информативный виджет

18.09.2018 Прековырял код, получил следующее) показания датчика берем челым числом (в паскалях) к примеру 978...1024 - запускаем в кроне скрипт каждую минуту

//предсказатель погоды v0.1 beta
$sensor = 'Sensor_tempPressureHum01.valuePressure';
$period = 600*6;
$history = getHistory($sensor, time()-$period, time());
$sumX = 0;
$sumY = 0;
$sumX2 = 0;
$sumXY = 0;
foreach($history as $h_part){
     $pres = $h_part['VALUE'];
     $sumX += time() - strtotime($h_part['ADDED']);
     $sumY += $pres;
     $sumX2 += (time() - strtotime($h_part['ADDED'])) * (time()-strtotime($h_part['ADDED']));
     $sumXY += (time() - strtotime($h_part['ADDED'])) * $pres;
}
$a = 0;
$a = 6*$sumXY; 
$a = $a-$sumX*$sumY;
$a = -$a/(6*$sumX2-$sumX*$sumY);
$dt = $a*6;
//$dt = $dt;
sg('Predictor.DT',$dt);

Discuss (10) (8)

See also:
2018-07-11 Оптимизация MySQL 5.7 на Ubuntu 18.04 LTS

Berezhany, Украина