[Модуль] Sonoff (dev_sonoff)
Модератор: immortal
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: [Модуль] Sonoff
К свойству...ну мне 2е отписались что твоя проблема повторилась...так что видимо действительно косяк какой-то...либо на сервере совсем не сразу статус меняется. Я не понимаю почему.
- За это сообщение автора nick7zmail поблагодарил:
- Samir77 (Вт дек 11, 2018 9:43 pm)
- Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
- samolet
- Сообщения: 472
- Зарегистрирован: Чт июн 29, 2017 10:29 am
- Благодарил (а): 46 раз
- Поблагодарили: 45 раз
Re: [Модуль] Sonoff
я уже и просто кодом попробовал
callMethod("spalnya.turnOff");
callMethod("spalnya.turnOn");
та-же фигня.
а это лезет постоянно
21:57:49 0.17078700 Closing thread: c:/_majordomo/server/php/php.exe -q ./scripts/cycle_dev_sonoff.php --params "a:0:{}">>C:\_majordomo\htdocs/cms/debmes/log_2018-12-11-cycle_dev_sonoff.php.txt
callMethod("spalnya.turnOff");
callMethod("spalnya.turnOn");
та-же фигня.
а это лезет постоянно
21:57:49 0.17078700 Closing thread: c:/_majordomo/server/php/php.exe -q ./scripts/cycle_dev_sonoff.php --params "a:0:{}">>C:\_majordomo\htdocs/cms/debmes/log_2018-12-11-cycle_dev_sonoff.php.txt
-
- Сообщения: 26
- Зарегистрирован: Пт ноя 23, 2018 5:48 pm
- Благодарил (а): 1 раз
- Поблагодарили: 14 раз
Re: [Модуль] Sonoff
Приехал моя первая релюха Sonoff TH-10, можно же и поиграться...
Только по логину и паролю не заходит модуль в текущем его состоянии:
1. Параметр version - int, при установке модуля да, он хардкодом прописывается туда 6, но потом вот так
gr - возвращает строку.
Это можно проверить запросив базу (кстати кто придумал имена полям давать, которые совпадают с командами sql? Ну не суть)
Ложится оно туда примерно вот так a:13:{s:7:"VERSION";s:1:"6";s:10:"APKVERSION, короче строкой
сделал так, вроде поправилось
2. Не сохранялось перебитое значение операционной системы, хоть заперебивайся, "ios" и все тут как следствие версию я перебил, а вот операционку нет.
Правится добавлением значения в конфиг
3. Еще я не понял сокрального смысла вот в этом куске
Если сразу за ним идет
Закоментил…
4. А потом начались чудеса, не сохраняется в конфиге HTTPS_API_URL, хоть ты его убей, докопал до функционала где он в базу укладывается, не могу я понять причины. Как следствие запрос на устройства не ходит, он там использовался.
Пока не вынес сохранение в конфиг ниже отказывалось работать. В конечном итоге dev_sonoff.class.php стал выглядеть вот так:
p.s. Блин, только сейчас догадался посмотреть... оказывается оно на github лежит, завтра оформлю pull request`ом
Только по логину и паролю не заходит модуль в текущем его состоянии:
1. Параметр version - int, при установке модуля да, он хардкодом прописывается туда 6, но потом вот так
Код: Выделить всё
$this->config['VERSION']=gr('version');
Это можно проверить запросив базу (кстати кто придумал имена полям давать, которые совпадают с командами sql? Ну не суть)
Код: Выделить всё
SELECT (data) FROM db_terminal.project_modules
where (name)='dev_sonoff';
сделал так, вроде поправилось
Код: Выделить всё
$this->config['VERSION']=intval(gr('version'));
Правится добавлением значения в конфиг
Код: Выделить всё
$this->config['OS']=gr('os');
Код: Выделить всё
$out['HTTPS_API_URL']=$this->config['HTTPS_API_URL'];
if (!$out['HTTPS_API_URL']) {
$out['HTTPS_API_URL']='https://';
Код: Выделить всё
$out['HTTPS_API_URL']=$this->config['HTTPS_API_URL'];
4. А потом начались чудеса, не сохраняется в конфиге HTTPS_API_URL, хоть ты его убей, докопал до функционала где он в базу укладывается, не могу я понять причины. Как следствие запрос на устройства не ходит, он там использовался.
Пока не вынес сохранение в конфиг ниже отказывалось работать. В конечном итоге dev_sonoff.class.php стал выглядеть вот так:
СпойлерПоказать
Код: Выделить всё
<?php
/**
* Sonoff
* @package project
* @author Wizard <sergejey@gmail.com>
* @copyright http://majordomo.smartliving.ru/ (c)
* @version 0.1 (wizard, 21:11:19 [Nov 13, 2018])
*/
//
//
class dev_sonoff extends module {
private $sonoffws;
/**
* dev_sonoff
*
* Module class constructor
*
* @access private
*/
function __construct() {
$this->name="dev_sonoff";
$this->title="Sonoff";
$this->module_category="<#LANG_SECTION_DEVICES#>";
$this->checkInstalled();
}
/**
* saveParams
*
* Saving module parameters
*
* @access public
*/
function saveParams($data=1) {
$p=array();
if (IsSet($this->id)) {
$p["id"]=$this->id;
}
if (IsSet($this->view_mode)) {
$p["view_mode"]=$this->view_mode;
}
if (IsSet($this->edit_mode)) {
$p["edit_mode"]=$this->edit_mode;
}
if (IsSet($this->data_source)) {
$p["data_source"]=$this->data_source;
}
if (IsSet($this->tab)) {
$p["tab"]=$this->tab;
}
return parent::saveParams($p);
}
/**
* getParams
*
* Getting module parameters from query string
*
* @access public
*/
function getParams() {
global $id;
global $mode;
global $view_mode;
global $edit_mode;
global $data_source;
global $tab;
if (isset($id)) {
$this->id=$id;
}
if (isset($mode)) {
$this->mode=$mode;
}
if (isset($view_mode)) {
$this->view_mode=$view_mode;
}
if (isset($edit_mode)) {
$this->edit_mode=$edit_mode;
}
if (isset($data_source)) {
$this->data_source=$data_source;
}
if (isset($tab)) {
$this->tab=$tab;
}
}
/**
* Run
*
* Description
*
* @access public
*/
function run() {
global $session;
$out=array();
if ($this->action=='admin') {
$this->admin($out);
} else {
$this->usual($out);
}
if (IsSet($this->owner->action)) {
$out['PARENT_ACTION']=$this->owner->action;
}
if (IsSet($this->owner->name)) {
$out['PARENT_NAME']=$this->owner->name;
}
$out['VIEW_MODE']=$this->view_mode;
$out['EDIT_MODE']=$this->edit_mode;
$out['MODE']=$this->mode;
$out['ACTION']=$this->action;
$out['DATA_SOURCE']=$this->data_source;
$out['TAB']=$this->tab;
$this->data=$out;
$p=new parser(DIR_TEMPLATES.$this->name."/".$this->name.".html", $this->data, $this);
$this->result=$p->result;
}
/**
* BackEnd
*
* Module backend
*
* @access public
*/
function admin(&$out) {
$this->getConfig();
/* $out['HTTPS_API_URL']=$this->config['HTTPS_API_URL'];
if (!$out['HTTPS_API_URL']) {
$out['HTTPS_API_URL']='https://';
} */
$out['HTTPS_API_URL']=$this->config['HTTPS_API_URL'];
$out['WSS_API_URL']=$this->config['WSS_API_URL'];
$out['TOKEN']=$this->config['TOKEN'];
$out['EMAIL']=$this->config['EMAIL'];
$out['PASS']=$this->config['PASS'];
$out['POLL_PERIOD']=$this->config['POLL_PERIOD'];
$out['DEBUG']=$this->config['DEBUG'];
$out['APIKEY']=$this->config['APIKEY'];
$out['VERSION']=$this->config['VERSION'];
$out['APKVERSION']=$this->config['APKVERSION'];
$out['OS']=$this->config['OS'];
$out['MODEL']=$this->config['MODEL'];
$out['ROMVERSION']=$this->config['ROMVERSION'];
if ($this->view_mode=='update_settings') {
$api_url = "";
if(gr('login')) {
$login=$this->loginAuth(gr('login'), gr('pass'));
$at=$login['at'];
$reg=$login['region'];
//$this->config['HTTPS_API_URL']="$reg-api.coolkit.cc";
$api_url = "$reg-api.coolkit.cc";
$this->config['WSS_API_URL']=$this->getWssSrv($reg, $at);
} else {
//$this->config['HTTPS_API_URL']=gr('https_api_url');
$api_url=gr('https_api_url');
$this->config['WSS_API_URL']=gr('wss_api_url');
}
$this->config['EMAIL']=gr('login');
$this->config['PASS']=gr('pass');
if($at) {
$this->config['TOKEN']=$at;
} else {
$this->config['TOKEN']=gr('token');
}
$this->config['POLL_PERIOD']=intval(gr('poll_period'));
$this->config['DEBUG']=gr('debug');
$this->config['VERSION']=intval(gr('version'));
$this->config['APKVERSION']=gr('apkversion');
$this->config['OS']=gr('os');
$this->config['MODEL']=gr('model');
$this->config['ROMVERSION']=gr('romVersion');
$this->config['HTTPS_API_URL'] = $api_url;
if(!intval(gr('version'))) $out['ERR_VERSION']=1;
if(!intval(gr('poll_period'))) $out['ERR_POLL_PERIOD']=1;
$this->saveConfig();
$this->dev_sonoff_devices_cloudscan();
$this->redirect("?");
}
if (isset($this->data_source) && !$_GET['data_source'] && !$_POST['data_source']) {
$out['SET_DATASOURCE']=1;
}
if ($this->data_source=='dev_sonoff_devices' || $this->data_source=='') {
if ($this->view_mode=='' || $this->view_mode=='search_dev_sonoff_devices') {
$this->search_dev_sonoff_devices($out);
}
if ($this->view_mode=='edit_dev_sonoff_devices') {
$this->edit_dev_sonoff_devices($out, $this->id);
}
if ($this->view_mode=='delete_dev_sonoff_devices') {
$this->delete_dev_sonoff_devices($this->id);
$this->redirect("?data_source=dev_sonoff_devices");
}
}
if (isset($this->data_source) && !$_GET['data_source'] && !$_POST['data_source']) {
$out['SET_DATASOURCE']=1;
}
if ($this->data_source=='dev_sonoff_data') {
if ($this->view_mode=='' || $this->view_mode=='search_dev_sonoff_data') {
$this->search_dev_sonoff_data($out);
}
if ($this->view_mode=='edit_dev_sonoff_data') {
$this->edit_dev_sonoff_data($out, $this->id);
}
}
}
/**
* FrontEnd
*
* Module frontend
*
* @access public
*/
function usual(&$out) {
$this->admin($out);
}
/**
* dev_sonoff_devices cloud scan
*
* @access public
*/
function dev_sonoff_devices_cloudscan() {
require(DIR_MODULES.$this->name.'/dev_sonoff_devices_scan.inc.php');
}
/**
* dev_sonoff_devices search
*
* @access public
*/
function search_dev_sonoff_devices(&$out) {
require(DIR_MODULES.$this->name.'/dev_sonoff_devices_search.inc.php');
}
/**
* dev_sonoff_devices edit/add
*
* @access public
*/
function edit_dev_sonoff_devices(&$out, $id) {
require(DIR_MODULES.$this->name.'/dev_sonoff_devices_edit.inc.php');
}
/**
* dev_sonoff_devices delete record
*
* @access public
*/
function delete_dev_sonoff_devices($id) {
$rec=SQLSelectOne("SELECT * FROM dev_sonoff_devices WHERE ID='$id'");
// some action for related tables
SQLExec("DELETE FROM dev_sonoff_devices WHERE ID='".$rec['ID']."'");
}
/**
* dev_sonoff_data search
*
* @access public
*/
function search_dev_sonoff_data(&$out) {
require(DIR_MODULES.$this->name.'/dev_sonoff_data_search.inc.php');
}
/**
* dev_sonoff_data edit/add
*
* @access public
*/
function edit_dev_sonoff_data(&$out, $id) {
require(DIR_MODULES.$this->name.'/dev_sonoff_data_edit.inc.php');
}
function propertySetHandle($object, $property, $value) {
$this->getConfig();
$table='dev_sonoff_data';
$properties=SQLSelect("SELECT * FROM $table WHERE LINKED_OBJECT LIKE '".DBSafe($object)."' AND LINKED_PROPERTY LIKE '".DBSafe($property)."'");
$total=count($properties);
if ($total) {
for($i=0;$i<$total;$i++) {
$dev_id=$properties[$i]['DEVICE_ID'];
$device=SQLSelectOne("SELECT DEVICEID FROM dev_sonoff_devices WHERE ID='$dev_id'");
$param=$properties[$i]['TITLE'];
$payload['action']='update';
$payload['userAgent']='app';
$payload['apikey']=$this->config['APIKEY'];
$payload['deviceid']=$device['DEVICEID'];
if(strpos($param, 'switch.')!==false) {
$dev_arr=explode('.', $param);
$payload['params']['switches'][0]['outlet']=intval($dev_arr[1]);
$payload['params']['switches'][0]['switch']=$this->metricsModify($param, $value, 'to_device');
} else {
$payload['params'][$param]=$this->metricsModify($param, $value, 'to_device');
}
$payload['sequence']=time()*1000;
$jsonstring=json_encode($payload);
if($this->config['DEBUG']) debmes('[wss] --- '.$jsonstring, 'cycle_dev_sonoff_debug');
if(isset($this->sonoffws)) {
if($this->sonoffws->isConnected()) {
try {
$this->sonoffws->send($jsonstring);
} catch (BadOpcodeException $e) {
echo 'Couldn`t sent: ' . $e->getMessage();
}
}
} else {
include_once("./lib/websockets/sonoffws.class.php");
$wssurl=$this->getWssUrl();
$sonoffws = new SonoffWS($wssurl, $config);
$sonoffws->socketUrl=$wssurl;
$sonoffws->connect();
$this->sonoffws=$sonoffws;
$this->wssGreatings();
if($this->sonoffws->isConnected()) {
try {
$this->sonoffws->send($jsonstring);
} catch (BadOpcodeException $e) {
echo 'Couldn`t sent: ' . $e->getMessage();
}
}
}
if($this->config['DEBUG']) {
$recv=$this->sonoffws->receive();
debmes('[wss] +++ '.$recv, 'cycle_dev_sonoff_debug');
}
$sonoffws->close();
}
}
}
function processCycle() {
$this->dev_sonoff_devices_cloudscan();
}
function getWssUrl() {
$this->getConfig();
$url='wss://'.$this->config['WSS_API_URL'].':8080/api/ws';
return $url;
}
function wssInit($sonoffws) {
$this->sonoffws=$sonoffws;
$this->wssGreatings();
}
function wssGreatings() {
$this->getConfig();
$payload['action']='userOnline';
$payload['userAgent']='app';
$payload['version']=6;
$payload['nonce']=$this->sonoffws->generateKey(8, false);
$payload['apkVesrion']=$this->config['APKVERSION'];
$payload['os']=$this->config['OS'];
$payload['at']=$this->config['TOKEN'];
$payload['apikey']=$this->config['APIKEY'];
$payload['ts']=time();
$payload['model']= $this->config['MODEL'];
$payload['romVersion']=$this->config['ROMVERSION'];
$payload['sequence']=time()*1000;
$jsonstring=json_encode($payload);
if($this->config['DEBUG']) debmes('[wss] --- '.$jsonstring, 'cycle_dev_sonoff_debug');
if($this->sonoffws->isConnected()) {
try {
$this->sonoffws->send($jsonstring);
} catch (BadOpcodeException $e) {
echo 'Couldn`t sent: ' . $e->getMessage();
}
}
if($this->config['DEBUG']) {
$recv=$this->sonoffws->receive();
debmes('[wss] +++ '.$recv, 'cycle_dev_sonoff_debug');
}
}
function metricsModify($param, $val, $out) {
if($out=='to_device') {
if((strpos($param, 'switch')!==false || $param=='sledOnline') && $param!='switches') {
$val=($val)? 'on' : 'off';
}
} elseif($out=='from_device') {
if((strpos($param, 'switch')!==false || $param=='sledOnline') && $param!='switches') {
$val=($val=='on')? 1 : 0;
}
}
return $val;
}
function deviceRename($device) {
$devid=$device['DEVICEID'];
$this->getConfig();
$host='https://'.$this->config['HTTPS_API_URL'].":8080/api/user/device/$devid";
$payload['group']=' ';
$payload['deviceid']=$devid;
$payload['name']=$device['TITLE'];
$payload['version']=$this->config['VERSION'];
$payload['ts']=time();
$payload['os']=$this->config['OS'];
$payload['model']= $this->config['MODEL'];
$payload['romVersion']=$this->config['ROMVERSION'];
$payload['apkVesrion']=$this->config['APKVERSION'];
include_once("./lib/websockets/sonoffws.class.php");
$sonoffws = new SonoffWS($wssurl, $config);
$payload['nonce']=$sonoffws->generateKey(8, false);
$jsonstring=json_encode($payload);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"POST /api/user/device/$devid HTTP/1.1",
'Authorization: Bearer '.$this->config['TOKEN'],
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonstring)
));
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonstring);
$response = curl_exec($ch);
curl_close($ch);
if($this->config['DEBUG']) debmes('[http] --- '.$jsonstring, 'cycle_dev_sonoff_debug');
if($this->config['DEBUG']) debmes('[http] +++ '.$response, 'cycle_dev_sonoff_debug');
}
function loginAuth($login, $pass) {
$this->getConfig();
$host='https://api.coolkit.cc:8080/api/user/login';
//содержание файла, идущего со старыми версиями ewelink
$appid_str="204,208,176,196,204,176,216,192,176,224,176,220,176,200,212,176,228,176,200,196,176,204,192,176,204,196,176,204,204,176,208,224,176,208,192,176,216,196,176,200,192,176,212,228,176,204,228,176,196,228,176,216,176,204,224,176,196,208,176,196,228,176,200,220,176,208,192,176,204,228,176,216,176,212,200,176,200,220,176,208,192,176,216,208,176,212,196,176,204,216 "; //app ID
$key_str="216,200,176,212,200,176,208,212,176,200,220,176,204,204,176,200,204,176,208,204,176,208,216,176,216,204,176,204,224,176,216,204,176,204,216,176,196,200,176,208,204,176,212,212,176,196,208,176,200,212,176,204,196,176,204,216,176,208,192,176,204,220,176,200,200,176,220,176,200,212,176,204,192,176,204,224,176,216,196,176,216,196,176,204,192,176,212,228,176,208,196,176,212,196";//ключ
$dict_str='ab!@#$ijklmcdefghBCWXYZ01234DEFGHnopqrstuvwxyzAIJKLMNOPQRSTUV5689%^&*()';//словарь
//бъем на массивы
$app_arr=explode(',', $appid_str);
$key_arr=explode(',', $key_str);
$dict_arr=str_split($dict_str);
//сдвигаем биты
foreach($key_arr as $key=>$byte) {
$key_arr[$key]=($byte >> 2);
}
foreach($app_arr as $key=>$byte) {
$app_arr[$key]=($byte >> 2);
}
//ещё пару преобразований
$indexes_str = implode(array_map("chr", $key_arr));
$indexes_arr = explode(',', $indexes_str);
$indexes2_str = implode(array_map("chr", $app_arr));
$indexes2_arr = explode(',', $indexes2_str);
//ищем индексы в словаре
foreach($indexes_arr as $index) {$crypt_key.= $dict_arr[$index];}
foreach($indexes2_arr as $index) {$appid.= $dict_arr[$index];}
//формируем запрос
$payload['password']=$pass;
$payload['email']=$login;
$payload['version']=$this->config['VERSION'];
$payload['ts']=time();
$payload['os']=$this->config['OS'];
$payload['model']= $this->config['MODEL'];
$payload['romVersion']=$this->config['ROMVERSION'];
$payload['apkVesrion']=$this->config['APKVERSION'];
$payload['appid']=$appid;
//генерация nonce
include_once("./lib/websockets/sonoffws.class.php");
$sonoffws = new SonoffWS($wssurl, $config);
$payload['nonce']=$sonoffws->generateKey(8, false);
$jsonstring=json_encode($payload);
//финальная подпись ключем
$sign=base64_encode(hash_hmac('sha256',$jsonstring,$crypt_key,true)); //получение конечной подписи
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'POST /api/user/login HTTP/1.1',
"Authorization: Sign $sign",
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonstring)
));
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonstring);
$response = curl_exec($ch);
curl_close($ch);
if($this->config['DEBUG']) debmes('[http] --- '.$jsonstring, 'cycle_dev_sonoff_debug');
if($this->config['DEBUG']) debmes('[http] +++ '.$response, 'cycle_dev_sonoff_debug');
$json_resp=json_decode($response, TRUE);
return $json_resp;
}
function getWssSrv($reg, $at) {
$this->getConfig();
$host="https://$reg-disp.coolkit.cc:8080/dispatch/app";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'POST /dispatch/app HTTP/1.1',
"Authorization: Bearer $at",
'Content-Type: application/json'
));
$payload['accept']=$pass;
$payload['email']=$login;
$payload['version']=$this->config['VERSION'];
$payload['ts']=time();
$payload['os']=$this->config['OS'];
$payload['model']= $this->config['MODEL'];
$payload['romVersion']=$this->config['ROMVERSION'];
$payload['apkVesrion']=$this->config['APKVERSION'];
$payload['appid']=$appid;
//генерация nonce
include_once("./lib/websockets/sonoffws.class.php");
$sonoffws = new SonoffWS($wssurl, $config);
$payload['nonce']=$sonoffws->generateKey(8, false);
$jsonstring=json_encode($payload);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonstring);
$response = curl_exec($ch);
curl_close($ch);
if($this->config['DEBUG']) debmes('[http] --- '.$jsonstring, 'cycle_dev_sonoff_debug');
if($this->config['DEBUG']) debmes('[http] +++ '.$response, 'cycle_dev_sonoff_debug');
$resp=json_decode($response, TRUE);
return $resp['domain'];
}
/**
* Install
*
* Module installation routine
*
* @access private
*/
function install($data='') {
parent::install();
$this->getConfig();
$this->config['VERSION']=6;
$this->config['APKVERSION']='1.8';
$this->config['OS']='ios';
$this->config['MODEL']='iPhone10,6';
$this->config['ROMVERSION']='11.1.2';
$this->saveConfig();
}
/**
* Uninstall
*
* Module uninstall routine
*
* @access public
*/
function uninstall() {
SQLExec('DROP TABLE IF EXISTS dev_sonoff_devices');
SQLExec('DROP TABLE IF EXISTS dev_sonoff_data');
parent::uninstall();
}
/**
* dbInstall
*
* Database installation routine
*
* @access private
*/
function dbInstall($data) {
/*
dev_sonoff_devices -
dev_sonoff_data -
*/
$data = <<<EOD
dev_sonoff_devices: ID int(10) unsigned NOT NULL auto_increment
dev_sonoff_devices: TITLE varchar(100) NOT NULL DEFAULT ''
dev_sonoff_devices: DEVICEID varchar(255) NOT NULL DEFAULT ''
dev_sonoff_devices: BRANDNAME varchar(255) NOT NULL DEFAULT ''
dev_sonoff_devices: PRODUCTMODEL varchar(255) NOT NULL DEFAULT ''
dev_sonoff_devices: UIID varchar(255) NOT NULL DEFAULT ''
dev_sonoff_devices: UPDATED datetime
dev_sonoff_data: ID int(10) unsigned NOT NULL auto_increment
dev_sonoff_data: TITLE varchar(100) NOT NULL DEFAULT ''
dev_sonoff_data: VALUE varchar(255) NOT NULL DEFAULT ''
dev_sonoff_data: DEVICE_ID int(10) NOT NULL DEFAULT '0'
dev_sonoff_data: LINKED_OBJECT varchar(100) NOT NULL DEFAULT ''
dev_sonoff_data: LINKED_PROPERTY varchar(100) NOT NULL DEFAULT ''
EOD;
parent::dbInstall($data);
}
// --------------------------------------------------------------------
}
/*
*
* TW9kdWxlIGNyZWF0ZWQgTm92IDEzLCAyMDE4IHVzaW5nIFNlcmdlIEouIHdpemFyZCAoQWN0aXZlVW5pdCBJbmMgd3d3LmFjdGl2ZXVuaXQuY29tKQ==
*
*/
Последний раз редактировалось Nab0y Ср дек 12, 2018 1:16 am, всего редактировалось 1 раз.
- Рейтинг: 1.16%
-
- Сообщения: 26
- Зарегистрирован: Пт ноя 23, 2018 5:48 pm
- Благодарил (а): 1 раз
- Поблагодарили: 14 раз
Re: [Модуль] Sonoff
Вопрос вдогонку, Никита, в файлике dev_sonoff_devices_scan.inc.php, строка $this->saveConfig(); сразу после зачитки APIKEY "$this->config['APIKEY']=$device['apikey'];" зачем в цикле save у конфига вызывать (там серриализация массива и update в базу), когда можно один раз за циклом, вроде посмотрел по методу, больше запросов в процессе не делается где apikey бы срочно понадобился.
Последний раз редактировалось Nab0y Ср дек 12, 2018 1:23 am, всего редактировалось 1 раз.
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: [Модуль] Sonoff
Попробую на всё ответить, сори если что то упущу. Слишком много инфы с момента последнего посещения форума =D
1) засунуть версию в intval() вообще не проблема. Только не предал этому значения на самом деле, ибо в виде строки оно тоже работает. php в принципе в большинстве случаев непритязателен к формату переменных и не требует лишней конвертации. Какие поля совпадают с командами, если не секрет?))
2) Сорян, служебную инфу выносил второпяк, до этого она в коде вообще жестко вбита была. Мог строку упустить.
3) Верхний кусок, скорее всего, сгенерился модуль билдером, а нижний сам вписал)) Если честно пол модуля в принципе написано быдлокодом. Чего стоят только генерации хедеров с нуля в каждой второй функции)) Сейчас функционал у меня на 1ом месте. Потом уже код впорядок приводить надо.
4) Вроде сохранялся с пол тычка...хз что произошло.
5) По поводу apikey - он лежит почему-то в массиве девайсов, а не общем..т.е. сперва надо заглянуть внутрь какого либо девайса, потом его вытащить оттуда, и только тогда записать. Согласен, что в каждой итерации его записывать совсем не обязательно. Достаточно это сделать 1 раз. Можно ввести какой нить флаг проверки, и запускать эти строки после проверки флага, если нужно.
А что было с логином/паролем не так? У меня он вроде работал, и я не понимал почему у других не работает)) жду реквеста =D. Кстати скажи UIID у TH10.
1) засунуть версию в intval() вообще не проблема. Только не предал этому значения на самом деле, ибо в виде строки оно тоже работает. php в принципе в большинстве случаев непритязателен к формату переменных и не требует лишней конвертации. Какие поля совпадают с командами, если не секрет?))
2) Сорян, служебную инфу выносил второпяк, до этого она в коде вообще жестко вбита была. Мог строку упустить.
3) Верхний кусок, скорее всего, сгенерился модуль билдером, а нижний сам вписал)) Если честно пол модуля в принципе написано быдлокодом. Чего стоят только генерации хедеров с нуля в каждой второй функции)) Сейчас функционал у меня на 1ом месте. Потом уже код впорядок приводить надо.
4) Вроде сохранялся с пол тычка...хз что произошло.
5) По поводу apikey - он лежит почему-то в массиве девайсов, а не общем..т.е. сперва надо заглянуть внутрь какого либо девайса, потом его вытащить оттуда, и только тогда записать. Согласен, что в каждой итерации его записывать совсем не обязательно. Достаточно это сделать 1 раз. Можно ввести какой нить флаг проверки, и запускать эти строки после проверки флага, если нужно.
А что было с логином/паролем не так? У меня он вроде работал, и я не понимал почему у других не работает)) жду реквеста =D. Кстати скажи UIID у TH10.
- За это сообщение автора nick7zmail поблагодарил:
- Samir77 (Ср дек 12, 2018 10:08 pm)
- Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
- Samir77
- Сообщения: 95
- Зарегистрирован: Чт фев 02, 2017 7:30 pm
- Благодарил (а): 755 раз
- Поблагодарили: 9 раз
Re: [Модуль] Sonoff
Здравствуйте Никита... Подскажите пожалуйста, интересует вопрос, с какой скоростью обновляеться данные того что реле включено или выключено?nick7zmail писал(а): ↑Вт дек 11, 2018 9:32 pmК свойству...ну мне 2е отписались что твоя проблема повторилась...так что видимо действительно косяк какой-то...либо на сервере совсем не сразу статус меняется. Я не понимаю почему.
Имею соноф который управляеться и по wifi и по 433Mh , до этого управлял им с помощью броадлинк , ясное дело что обратной связи никакой, вышел ваш модуль, привязал его, но обратной связи пока не вижу, с мажордома могу включить и выключить, статус в ПУ обновляеться, но если выключить устройство с пульта что шел в комплекте, статус в модуле не обновляеться!((( Подскажите как исправить.. Может что то упустил!
Заранее благодарен за ответ!
- Вложения
-
- 1.PNG (55.96 КБ) 3274 просмотра
ASUS ASPIRE 5739G Windows 7 + Raspberry Pi3 + Broadlink + Sonoff
-
- Сообщения: 23
- Зарегистрирован: Сб дек 08, 2018 4:39 pm
- Благодарил (а): 9 раз
- Поблагодарили: 1 раз
Re: [Модуль] Sonoff
Samir77 писал(а): ↑Ср дек 12, 2018 11:04 amПрисоединяюсь к вопросу, у меня так же, в Эвелинке статус включено выключено виден в онлайне, в мажордомо нет, в МД статус меняется если в нем включать выключать, если с Эвелинка, то МД не видит изменений. А Эвелинк изменения с МД видит.обратной связи пока не вижу, с мажордома могу включить и выключить, статус в ПУ обновляеться, но если выключить устройство с пульта что шел в комплекте, статус в модуле не обновляеться!((( Подскажите как исправить.. Может что то упустил!
Заранее благодарен за ответ!
-
- Сообщения: 23
- Зарегистрирован: Сб дек 08, 2018 4:39 pm
- Благодарил (а): 9 раз
- Поблагодарили: 1 раз
Re: [Модуль] Sonoff
Ну и со скоростью обработки беда, с Эвелинка все моментально, с МД до 5 сек. Думал моя rasperrry pi2 слабовата, тупит МД на ней, но поставил модуль MILight, так он тоже моментально команды отрабатывает, значит дело в модуле Sonoff получается....
-
- Сообщения: 23
- Зарегистрирован: Сб дек 08, 2018 4:39 pm
- Благодарил (а): 9 раз
- Поблагодарили: 1 раз
Re: [Модуль] Sonoff
nick7zmail писал(а): ↑Вт дек 11, 2018 5:30 pmНемного переработал механизм включения несколько-релюшных выключателей. На вид - должно работать)) Попробуйте на sonoff dual, t1-2gang, 4ch и подобных. Если не работает - включите дебаг, попробуйте щелкнуть, и скиньте в личку файл дебага.
Увлекся и забыл самое главное ). Реле Sonoff Dual R2 после обновления модуля заработало!!! Урааааа!