Arduino+EthernetShield+реле управления питанием

Для решения задачи управления розетками было принято решение разработать сиё на основе Arduino.  Самый простой способ = самый надежный. Будем управлять по протоколу http. Для этого на ардулине придется «поднять» мини web сервер, который единственно на что способен : 1) принимать запрос и выполнять его 2) Отправлять в json формате информацию о статусе реле. Дополнительно в скетче использовалась библиотека TextFinder, для выделения параметров запроса GET.

Скетч:

#include <SPI.h>
#include <Ethernet.h>
#include <TextFinder.h>

//назначаем МАС и IP
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
EthernetServer server(80);
//на каких ногах переключатели
int pinscount=8;
int pins[]={2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
int pins_status[]={LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW};

int command = 0;
int setpin=0;
int setpinstatus=0;

void setup() {
  Serial.begin(9600);
   // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  for (int i=0; i < pinscount; i++){
    pinMode(pins[i], OUTPUT);    
  };  
}

void loop(){
 EthernetClient client = server.available();
 if (client)  {
  while (client.connected()) {
   if (client.available()) {
           TextFinder response(client);
           
           if(response.find("GET /")) {
         
             if (response.find("command=")) {
               command = response.getValue();
               Serial.println(command);
               }
           };
            
              if (command==1) {
                client.println("HTTP/1.1 200 OK");
                client.println("Content-Type: text/html");                
                client.println("Connection: close");  
                client.println();
                client.print("<!DOCTYPE HTML>");                
                  //Выводим информацию об устройстве
                 client.print("{\"ip\":\"");
                 client.print(Ethernet.localIP());
                 client.print("\",\"pins\":[");
                 for (int i=0; i < pinscount; i++){
                    client.print(pins[i]);                   
                    if (i<pinscount-1){client.print(",");};
                 };
                 client.print("],\"pinsstatus\":[");
                 for (int i=0; i < pinscount; i++){
                    client.print(pins_status[i]);                   
                    if (i<pinscount-1){client.print(",");};
                 };                 
                 client.print("]}\n");                 
              };
              if (command==99){
                  client.println("HTTP/1.1 200 OK");
                  client.println("Content-Type: text/html");                                
                  client.println("Connection: close");
                  client.println();
                  client.print("<!DOCTYPE HTML>");                  
                 if (response.find("setpin=")) {
                   setpin = response.getValue();
                   Serial.println(setpin);
                   }                
                 if (response.find("setpinstatus=")) {
                   setpinstatus = response.getValue();
                   Serial.println(setpinstatus);
                   }                
                   
                 digitalWrite(pins[setpin], setpinstatus);
                 pins_status[setpin]=setpinstatus;
                 client.print("{\"status\":\"ok\"}\n");
                 
              };

         client.stop();   
   }
  }
  
    delay(1);    
    client.stop();
    Serial.println("client disonnected");  
  
 }
}

Пример запроса на получение статуса розеток:

http://192.168.1.177/?command=1

Пример запроса на переключение реле:

http://192.168.1.177/?command=99&setpin=3&setpinstatus=1

Таким образом, т.к. на выходе JSOIN, легко нарисовать «Веб морду».

 

И снова Почта РФ..

Вот уже больше месяца, Почта РФ глобально обновляет своё ПО в подразделениях. Как результат — платежи организации где я работаю в настоящий момент, не принимаются ни в одном отделении. Стучание во все доступные инстанции приводит к нулевому результату. Хорошо, что я мудрый человек и изначально когда заключали договор с Почтой РФ предупредил, что не нужно особо рекламировать оплату посредством Почты ибо структура не понятная, не поворотливая и главное что когда с ними общаешся, возникает стойкое ощущение, что им ты как контрагент не нужен вовсе.

Плагин для jqGrid для сохранения и восстановления состояния колонок в локальном хранилище

Данный плагин разработан для сохранения состояния колонок таблиц jqgrid при перезагрузке страницы. Сохраняет/восстанавливает состояние колонок: скрыт/не скрыт и ширину. Более ничего. В принципе легко доработать для получения возможности сохранения любых других параметров.

Пример использования:

  jQuery("#fininetinfo").jqGrid({
   	url:'tinfo.php?orgid='+defaultorgid+"&blibase="+$("#blibase").val()+"&agrm_id="+agrm_id,
	datatype: "json",
   	colNames:['id','Сумма','Тариф','Период','Дата нач.'],
   	colModel:[   		
   		{name:'record_id'   ,index:'record_id'      , width:15,search: false,hidden:true,fixed:true},
   		{name:'amount'      ,index:'amount'         , width:55,editable:false,search: true,fixed:true},
                {name:'tarif'       ,index:'tarif'        , width:60,editable:false,search: true},
                {name:'period'      ,index:'period'         , width:60,editable:true,search: false,fixed:true},                                
                {name:'dateofcharge',index:'dateofcharge'   , width:60,editable:false,search: true,fixed:true}

   	],     
	resizeStop: function() {
	    $("#fininetinfo").saveCommonParam("fininetinfo");
	},		
	gridComplete:function() {			    
	    $("#fininetinfo").loadCommonParam("fininetinfo");
	},	
...
...

Команды:

$("селектор").saveCommonParam("уникальный идентификатор");  //сохраняем данные по колонкам

$("селектор").loadCommonParam("уникальный идентифкатор использованный в saveCommonParam"); // загрузить данные по колонкам.

Собственно сам плагин:

$(function() {         
    $.jgrid.extend({
	setColWidth: function (iCol, newWidth, adjustGridWidth) {
	    return this.each(function () {
		var $self = $(this), grid = this.grid, p = this.p, colName, colModel = p.colModel, i, nCol;
		if (typeof iCol === "string") {
		    colName = iCol;
		    for (i = 0, nCol = colModel.length; i < nCol; i++) {
			if (colModel[i].name === colName) {
			    iCol = i;
			    break;
			}
		    }
		    if (i >= nCol) {
			return; 
		    }
		} else if (typeof iCol !== "number") {
		    return;
		}
		grid.resizing = { idx: iCol };
		grid.headers[iCol].newWidth = newWidth;
		grid.newWidth = p.tblwidth + newWidth - grid.headers[iCol].width;
		grid.dragEnd(); 
		if (adjustGridWidth !== false) {
		    $self.jqGrid("setGridWidth", grid.newWidth, false); 
		}
	    });
	}
    });  
    $.jgrid.extend({
	saveCommonParam: function(stname){	    
	     colarray=$(this).jqGrid('getGridParam','colModel');
	     localStorage.setItem(stname, JSON.stringify(colarray));
	     console.log(JSON.stringify(colarray));	     
	},
	loadCommonParam: function(stname){	    	
	    if (localStorage[stname]!=undefined) {
		colarray=localStorage[stname];
		if (colarray!=""){
		    obj_for_load=JSON.parse(colarray);   // загружаем JSON в массив     
		    for (i in obj_for_load) {
			//console.log("name:",obj_for_load[i].name);
			//console.log("width:",obj_for_load[i].width);			
			if  (obj_for_load[i].hidden==true){
			   $(this).hideCol(obj_for_load[i].name);
			} else {
			   $(this).showCol(obj_for_load[i].name);
			   if (obj_for_load[i].fixed==true){
				$(this).setColWidth(obj_for_load[i].name, obj_for_load[i].width);
			   };
			}			
		    };    
		}
	    } else {
		console.log("в локальном хранилище не найден ключ "+stname);
	    };
	}
    });
});

Жизнь замечательных грибов