Взаимодействие с контроллером заряда солнечных панелей Фотон-100-50-IoT.
Получение от контроллера данных о входном напряжении и токе, выходном напряжении и токе, выходной мощности и температуре.
Выяснить URL с которого данный контроллер отдает JSON данные было несложно, посмотрев исходный код страницы.
Контроллер отдает данные с адреса http://IP/data.json
Авторизоваться можно стандартно http://login:password@192.168.100.47/data.json
Попытался получать данные при помощи вэб-переменных.
В качестве примера для получения выходного напряжения шаблон поиска "vout":(.*?),
Все бы ничего, но столкнулся с проблемой - данные о напряжении, токе и мощности передаются целым числом и для получения истиного значения нужно делить на 10. Вот с этим справиться не удалось.
---=== Добавлено на следующий день ===---
Точнее удалось, но решение мне не очень понравилось.
Сначала я создал вот такой метод (подсмотрел на форуме пример округления)
// Получаем данные
$value = $params['PROPERTY'];
// Делим на 10
$value = $params['NEW_VALUE'] / 10;
// Сохраняем обработанное значение в свойство объекта
$tmp=$params['PROPERTY'];
$this->setProperty($tmp, $value);
Мне даже показалось, что он заработал, т.к. значения в свойствах получались нужные, но когда попытался построить график - получил "волны". Не сразу понял что за ерунда, но потом посмотрел на данные и все понял - значения сохранялись парами через одно до деления на 10 и после деления на 10. А еще в логах я получил ругань на рекурсию, что вполне логично. На самом деле возможность рекурсии меня сразу озадачивала, но попробовал - работает. Это потом уже в логи глянул да и то не по своей инициативе.
Мне подсказали в качестве решения писать в другой параметр.
Последюю строчку заменить на такую $this->setproperty($tmp.'_upd',$value);
Было поздно, я отчаяно тупил и в тот момент даже не сообразил, что свойству без _upd можно поставить 0 во времени хранения данных, дабы не забивать зря базу, а свойству с _upd уже нормальные настройки с хранением.
Полагаю, можно сделать еще аккуратнее (чисто эстетически) - писать в веб-переменных в свойство с _tmp, а обработанные данные класть в свойство с нормальным именем, но я этого еще не пробовал.
---======---
Еще мне подсказали вот это.
В поле Код вэб-переменной
DebMes('webvars test - ' . json_encode($params));
DebMes('webvars test - ' . $_SERVER['REQUEST_URI']);
В логе получил
16:52:21 0.79974700 webvars test -
16:52:21 0.79968300 webvars test - {"VALUE":"281"}
Вроде, результат тот, что нужен, но я не понял, как это можно использовать.
В итоге решил делать без вэб-переменных. Сделать еще один цикл, получать данные и раскидывать по параметрам.
На данный момент получилось вот что.
<?php
$login_url = 'http://login:password@192.168.100.47/data.json'; // URL запроса
$ch = curl_init(); // создание объекта curl
curl_setopt($ch, CURLOPT_URL, $login_url ); // задаем URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // вернуть результат запроса
$json = curl_exec($ch); // выполнить запрос
$array = json_decode($json, true);
$result = $array['vin']/10;
echo $result;
echo "<br>";
$result = $array['cin']/10;
echo $result;
echo "<br>";
$result = $array['vout']/10;
echo $result;
echo "<br>";
$result = $array['cout']/10;
echo $result;
echo "<br>";
$result = $array['pwr']/10;
echo $result;
echo "<br>";
$result = $array['temp'];
echo $result;
echo "<br>";
Тестовый php файл исправно заработал.
В общем этого достаточно, чтобы получать текущие значения и строить графики, но так не получить самого нужного - энергию.
В отдаваемомом массиве есть "eday" и "etot", но на странице состояния они не используются и значения отдаются некорректные.
Нужно разбираться дальше.
Вот пример, что отдает контроллер по адресу http://IP/data.json
{"vin":281,"vout":281,"cin":0,"cout":0,"temp":22,"charge":72,"relay":0,"pwr":0,"vch":303,"vfl":303,"ich":40,"ifl":1,"v_relay_on":260,"v_relay_off":250,"mppt_percent":75,"snd_ena":1,"light_mode":1,"contrOn":0,"bat_lo":240,"bat_hi":297,"ssidPass":"password","ssid":"SSID","iLogin":"login","iPass":"password","cloudName":"url","cloudKey":"api_key","ApPass":"11111111","relay_mode":0,"mppt_mode":3,"st_mode":0,"refr":10,"modd":41,"eday":7,"etot":8,"sec":45,"min":48,"hour":23,"date":6,"month":1,"year":19}
07.01.2019
И все же на данный момент остановился на вэб-переменных.
Проверил идею о которой писал выше - временный параметр.
Пожалуй, пора написать рецепт.
Создал класс PowerDevices
Создал ему свойства CurrentIn, CurrentOut, VoltageIn, VoltageOut ну и далее по списку.
Создал дочерний класс SolarControllers
Создал метод Div on 10 со следующим кодом
// Получаем данные
$value = $params['PROPERTY'];
// Делим на 10
$value = $params['NEW_VALUE'] / 10;
// Получаем имя свойства объекта
$tmp=$params['PROPERTY'];
// Обрезаем суффикс _tmp (4 символа)
$tmp=substr($tmp, 0, -4);
// Сохраняем обработанное значение в основное свойство объекта
$this->setProperty($tmp, $value);
Создал свойства CurrentIn_tmp, CurrentOut_tmp, VoltageIn_tmp, VoltageOut_tmp ну и далее по списку c нулевым временем хранения.
В каждом из созданных свойств указал Запускать метод при изменении: Div on 10
Создал в классе SolarControllers объект SolarController1
В вэб-переменных создал SolarControllerInVoltage1, SolarControllerOutVoltage1 и далее по списку
Пример одной вэб переменной
Название: SolarControllerInVoltage1
Ссылка: http://192.168.100.47/data.json
Имя пользователя: login
Пароль: password
Шаблон поиска: "vin":(.*?),
Связанный объект: SolarController1
Свойство: VoltageIn_tmp
Вот собственно и все.
Вэб-переменная обновляется по таймеру, пишет в Свойство_tmp тут же выполняется метод Div on 10 и готовое значение Свойство ложится в БД.