<?php
namespace SHServ\Helpers;
use \SHServ\Models\Devices;
class DeviceScriptsHelper {
protected $devices_model;
public function __construct(Devices $devices_model) {
$this -> devices_model = $devices_model;
}
public function devices(): Devices {
return $this -> devices_model;
}
/**
* Синхронизировать указанный канал реле с указанным каналом устройства кнопки.
* Синхронизация низкоуровневая и одностороняя, от реле к кнопке.
* @param Relay $relay
* @param Button $btn
* @param int|integer $relay_channel
* @param int|integer $btn_channel
* @return void
*/
public function sync_relay_to_btn_channel(\SHServ\Tools\DeviceAPI\Relay $relay_api, \SHServ\Tools\DeviceAPI\Button $btn_block_api, int $relay_channel = 0, int $btn_channel = 0): void {
$relay_channels = ($relay_api -> get_status())["channels"];
$btn_block_api -> set_channel_state(
$relay_channels[$relay_channel]["state"] == "on" ? "enabled" : "disabled",
$btn_channel
);
}
/**
* Синхронизировать состояние каналов реле с соответствующими блоками кнопок с указанными каналами.
* Синхронизация односторонняя от реле к кнопкам
* @param Array $sync_map [
* relay_channel_num => [
* ["alias" => "button_alias", "channel" => 1],
* ["alias" => "button_alias_2", "channel" => 0],
* ]
* ]
* @param String $relay_alias
* @return Bool
*/
public function sync_relay_to_btns(Array $sync_map, String $relay_alias): Bool {
$relay = $this -> devices() -> by_alias($relay_alias);
if(!$relay) {
return false;
}
$relay_api = $relay -> device_api();
if(!($relay_api instanceof \SHServ\Tools\DeviceAPI\Relay)) {
return false;
}
foreach($sync_map as $relay_channel => $btns) {
foreach($btns as $item) {
$btn = $this -> devices() -> by_alias($item["alias"]);
if(!$btn) {
continue;
}
$btn_api = $btn -> device_api();
if(!($btn_api instanceof \SHServ\Tools\DeviceAPI\Button)) {
continue;
}
$this -> sync_relay_to_btn_channel($relay_api, $btn_api, $relay_channel, intval($item["channel"]));
}
}
return true;
}
/**
* Синхронизировать состояние каналов устройства "кнопка" с соответствующими реле с указанными каналами.
* Синхронизация односторонняя от реле к кнопкам
* @param Array $sync_map [
* button_channel_num => [
* ["alias" => "relay_alias", "channel" => 1],
* ["alias" => "relay_alias_2", "channel" => 0],
* ]
* ]
* @param String $btn_alias
* @return Bool
*/
public function sync_btn_channels(Array $sync_map, String $btn_alias): Bool {
$btn = $this -> devices() -> by_alias($btn_alias);
if(!$btn) {
return false;
}
$btn_api = $btn -> device_api();
if(!($btn_api instanceof \SHServ\Tools\DeviceAPI\Button)) {
return false;
}
foreach($sync_map as $btn_channel => $relays) {
foreach($relays as $item) {
$relay = $this -> devices() -> by_alias($item["alias"]);
if(!$relay) {
continue;
}
$relay_api = $relay -> device_api();
if(!($relay_api instanceof \SHServ\Tools\DeviceAPI\Relay)) {
continue;
}
$this -> sync_relay_to_btn_channel($relay_api, $btn_api, intval($item["channel"]), $btn_channel);
}
}
return true;
}
}