Умный дом на 1С + ардуино




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

53 Comments

  1. IvanovAV

    Круто!!!

    Reply
  2. Артано

    Один вопрос — чем обусловлены ведущие символы нижнего подчеркивания в именах методов?

    Reply
  3. PhoenixAOD

    (2)Скорее всего привычкой))

    Reply
  4. MaxS

    Неужели ARDUINO не справиться с простейшими задачами? Может быть 1С полезнее использовать для конфигурирования логики и запись результата в память ARDUINO?

    Иначе если после включения обогревателя зависнет 1С сервер, будет жарко.

    Либо добавить простейшую логику защиты от зависания сервера. Обогреватель включается максимум на пол часа. Если за это время не получен ответ от сервера, переводим в состояние по умолчанию, заданное ранее в 1С, рекомендуется состояние по умолчанию — «выключен».

    Reply
  5. sasha777666

    (2) хотел выделить процедуры которые являются комбинациями, чтобы набрав «К._» в подсказке появился их список, не знаю почему выбрал именно этот символ «_» 🙂

    Reply
  6. sasha777666

    (4) Справится, но для этого нужно писать код для ардуины, а я хочу приобщить тех кто может писать только на 1С 🙂

    Зависания и потеря связи предусмотрена, есть команда К.АвтоСброс(НомерПорта, ВремяВСекундах), вызвав её в МК включится таймер и если по прошествии указанного времени МК снова не получит эту команду то перезагрузится сбросив состояние всех пинов. В случае если причино стало зависание COM порта то можно перезапустить агент сервера К.ПерезапуститьАгентСервера1С, а если причина в ошибках ОС то перезагрузить сервер К.ПерезагрузитьСервер1С … конечно если зависнет сам сервер то решать проблему нужно чем-то стороннем.

    Reply
  7. adapter

    т.е. умный дом теперь требует купить серверную лицензию 1С? Или мерзни как нищеброд. Вендор аплодирует )

    Серверная 1С требует еще и сервер БД, даже фришный, но все равно ресурсы ест — как из пушки по воробьям.

    Reply
  8. sasha777666

    (8) размер базы несколько мегабайт, подойдёт скуль экспресс он бесплатный. У меня всё на мини ПК работает ( флешка 30 гиг, проц 1.4*4 вроде, 2 гига ОЗУ)

    Reply
  9. TODD22

    (9)

    подойдёт скуль экспресс он бесплатный.

    Но сервер 1С платный.

    Reply
  10. TODD22

    (6)

    а я хочу приобщить тех кто может писать только на 1С 🙂

    Пусть лучше освоят для разнообразия другие языки и технологии….

    Reply
  11. корум

    (9)

    флешка 30 гиг, проц 1.4*4 вроде, 2 гига ОЗУ

    … и вот это вот всё для того, чтобы включать вентилятор?

    Господа, вы слишком много кушать.

    Reply
  12. корум

    (11)

    другие языки и технологии

    Например, родной русский для выдачи команд сыну.

    Reply
  13. TODD22

    (12)

    … и вот это вот всё для того, чтобы включать вентилятор?

    Ну почему всё? Ещё 1С сервер и СУБД 🙂 Управлять вентиляторами это вам не сыну команды отдавать! Тут серьёзно всё…

    Reply
  14. juricher

    (12) Я бы сказал жиром пука…те

    Reply
  15. starik-2005

    Не, мне, конечно, понравилось все это (в плане темы), но, господа! XXI-й век на дворе, стоимость «райспбери пиай» дешевле не только микросервера (я так понял, что 1С микросервер на 5 клиентов за 15 косарей выпустила именно для подобного шаманства), но и чуть ли не учебной 1С-ки. И в линухе не нужны эти все драйвера и компоненты для работы с COM-портом, эмулируемым кривыми виндовыми дровами — там уже есть порт-файл, в который ты на том же PHP/Python/C++/Go/куче всего другого можешь писать и из которого можешь читать. Это не говоря о том, что на «райспбери» (или «оранже» и прочих) девайсе ты можешь GPIO дергать вообще хоть из шелла. Кароч, за напоминание — спасибо, а за 1С в качестве управлятеля — чисто поржать.

    https://www.terraelectronica.ru/news_postup.php?ID=3568

    Reply
  16. sasha777666

    (16) и много ли программист 1C накодит на PHP/Python/C++/Go/ ? для тех кто зная только 1С хочет что-то сделать малинка не альтернатива. Дёргать GPIO вообще опасно, 15мА превысишь и нет малинки….. и насчёт файла, ну и в винде можно писать/читать напрямую в порт «\.Com8» …

    Reply
  17. vano-ekt

    (16) да главное оттащить прога от регистра бухгалтерии, если у него душа лежит к робототехнике

    он сам С++/пайтон в руки возьмет, потыкавшись с 1С

    Reply
  18. Amedis

    «Умный дом на 1С» даже звучит страшно )))

    Reply
  19. awk

    Спасибо за комментарии. Ржал…. Настроение подняли с утра…

    Reply
  20. OhlamOOOOn

    (6) Как вариант применения 1С, прямо скажу, для меня было неожиданно 🙂 Классный изврат, порадовал 🙂

    Но вот практического применения я пока увидеть не могу. Очень дорого. К всеобщему счастью, стоимость ардуины мега в китае около 400 руб, web расширения к ней того же порядка, силовые модули тоже рублей по 100 на контакт. Все, получаем веб сервер для управления. Да придется немного посмотреть уроков и почитать. Но извините меня, объем знаний для начального программирования ардуины ничтожно мал, по сравнению с применением той же БСП. Я сомневаюсь, что даже начинающий 1С-ник будет испытывать какие-либо проблемы при изучении. А вот для тех, «кто может писать только на 1С» думаю области управления устройствами лежат за пределами их интересов…

    Повторюсь, спасибо за интересную идею применения, осталось только придумать область применения.

    Хотя у меня уже есть вариант — управление светом на рабочем месте бухгалтера путем проведения документа «расход электроэнергии» 🙂

    Reply
  21. madonov

    ждем ЦУП на 1С =)

    и желательно на клюшках.

    Reply
  22. disnos

    (6) Как чистый эксперимент интересно, но не для реального использования. Был опыт разработки связки 1с и ардуино для испытательной системы.

    На первом месте должна быть надежность системы. При выходе из строя отдельных частей системы, или потери связи одного устройства с другим.

    Ардуина должна рулить сама, а 1с только дает команды на смену режимов.

    Повисла ночью у вас 1с-ка или винда или роутер и все система ушла в цикличный рестарт и сброс пинов.

    Тогда надо поставить еще 1 ардуину, которая будет проверять каждое из устройств и в случае зависания ребутить комп, роутер и тд. 🙂

    Reply
  23. sg12

    Года 3 назад выиграл у методиста бутылку текилы, за реализацию получения и записи в регистр сведений температуры с датчика ds18b20. А по теме, конечно интересная идея, но вот опускать низкий уровень в 1С мне кажется не правильно(но сама реализация интересна), я бы реализовал саму систему на ардуино, а вот управление системой на 1С.

    Reply
  24. sasha777666

    (21) Практическая цель — возможность сделать какое-то устройство без изучения материала по ардуине. Сравнивать с какими-то специально разработанными для этого платформами не корректно. Но тут есть 2 преимущества которые являются очень весомыми для 1Сника:

    1.Пишем на языке 1С

    2. Доступны все фичи платформы.

    Reply
  25. stilet

    В ленивом режиме пишу нечто подобное, но с некоторым отличием:

    1. 1С только как центр управления

    2. Исполнительными устройствами являются MegaD 2561

    Reply
  26. starik-2005

    (17) если программист не сможет что-то запилить на питоне, на котором дети 12-летние пишут вполне приличные приложения, то это, во-первых, ни разу не программист и даже в 1С ему делать нечего.

    А по поводу 15мА, то это Ваше личное непонимание того, как все работает. У народа до 0,5А на выходе напруга. Но ежу понятно, что двигателем крутить надо через драйвер (это микросхема такая, а не то, что кто-то подумал). А для чтения данных с GPIO другие методы.

    Reply
  27. TODD22

    (27)

    У народа до 0,5А на выходе напруга.

    Это сила тока 😉

    Reply
  28. корум

    (28) Все всё искричество в ОМАХ меряют! 🙂

    Reply
  29. sasha777666

    (27) 16 мА это тех характеристики, а не моё личное мнение.

    Reply
  30. starik-2005

    (30) Суть GPIO — прочитать уровень, установить уровень. Они двух вариантов: цифровой — высокий/низкий и аналоговый — это некий каскадный ЦАП (энное количество бит по количеству резисторов в каскаже). Дальше есть ШИМ — широтно-импульсная модуляция сигнала для управления скоростью вращения двигателя (ясно, что через линию управления драйвера), угла поворота или интенсивности свечения светодиода (можно и для иных моментов — генератор прямоугольного звукового сигнала на зуммерах, например). Все. Там мощи не надо. GPIO — это, считай, нога цифровая/аналоговая ардуинки — не более. То же самое для малины, апельсины и прочих девайсов (апельсинку зиро H2+ можно у кетайцев с 256 метрами и 4-мя ядрами 1,2Ггц купить за 700 рублей с учетом доставки).

    Так вот, на ногах максимальная сила тока — до 0,5А = 500мА (от источника питания зависит в принципе, от ноги, от девайса). Напряжение — 5/3 вольта (в зависимости от девайса и ноги). Дальше все нетрудно посчитать, закон Ома в этих ваших интернетах описан в достаточном количестве источников. Подбираете правильный резистор и огребаете профит в виде данных с датчика, верчения пропеллером или поворота камеры на угол альфа.

    И все это на питоне или даже bash-е. Для извращенцев на последние малины ставится Windows IoT.

    Reply
  31. sasha777666

    (31) Зачем вы всё это пишите? А на счёт МК у которого через GPIO можно пропустить 0.5 Ампера, поделитесь ссылочкой пожалуйста.

    Reply
  32. starik-2005

    (32) а все зависит от того, зачем Вы пишите это:

    Дёргать GPIO вообще опасно, 15мА превысишь и нет малинки.

    То, что бред написан — это полбеды. Беда в том, что кто-то этот бред прочитает и подумает, что GPIO дергать вообще нельзя.

    Reply
  33. sasha777666

    (33)

    (34) да вы батенька Не культурный человек, да и с названием раздела ошиблись

    для тупых специальный раздел даже написан

    судя по тому, что вы не поняли его, он явно не

    для тупых

    Вывод 5 вольт это 5 вольт от преобразователя напряжения, а GPIO это выводы АЦП

    Reply
  34. citicat

    Для домашнего применения (выключить вентилятор) дороговато с учетом всех лицензий.

    Для управлением ТСЖ, правда, не для включения вентилятора, а для похожих систем со включением- выключением электричества по подъездам можно переработать систему.

    Reply
  35. TODD22

    (36)

    включением- выключением электричества по подъездам

    Уже придумали датчики освещённости и датчики движения. Без всяких 1С и ардуин работает.

    Reply
  36. starik-2005

    (35)

    судя по тому, что вы не поняли его, он явно не

    Ну расскажите нам, просветите, так сказать, темноту…

    Reply
  37. sasha777666

    (38) Сергей я посмотрел ваши публикации и у меня складывается впечатление, что ваш аккаунт взломали и сейчас тут другой человек. По ссылке написано что 0.3А можно взять с 5 вольтовых пинов питания, логика на малинке 3.3 вольта и на GPIO не может быть 5, я работал с малинкой и прекрасно знаю её характеристики. И то, что нельзя использовать GPIO — написали вы, я же говорил что их опасно использовать потому что есть риск спалить МК т.к. они напрямую завязаны на АЦП. И если ток ( пусть даже для поддержания логического напряжения) будет больше нормы, а это 16мА а не как не 300 то будет беда.

    Reply
  38. starik-2005

    (39) хорошо, допустим ошибся я и перепутал выходы питания и ноги gpio — ошибся, умнее стал.

    Но меня смутило именно то, что Ваш ответ звучал как «использовать gpio» нельзя. И тут уже вопрос сам всплывает: а как информацию сдатчиков считывать? У Вас есть вариант, как это сделать без gpio? Глупость на глупость = ничья.

    Reply
  39. sasha777666

    (40) я подключал ардуино нано и использовал её, а на малинке была веб морда, код писал на пхп….. по сути сейчас сделал тоже самое но с мини пк, а код на 1С. Но основная причина использования ардуины была как раз в том, что на малинке логика 3.3 вольта.

    Reply
  40. vostok1.dz

    Горячая тема, для автоматизации небольших производств, я у себя на «подвластном» мне производстве окон уже заменил пару контроллеров на ардуино, и получаю тем самым, через com порт информацию о сделанных операциях станком (человеком), далее идет загрузка данных в 1с…

    Реально освободил одно рабочее место кладовщика (или мастера)…, бонусом вижу когда идёт максимальная выработка по часам…, и много попутной информации…

    Так же и я страдаю этим безумием ардуино ))), но уже есть реальные результаты….

    Reply
  41. sasha777666

    (42) Присоединяйтесь к проекту )) Сделайте модуль управления светом или климатом 🙂 я сейчас делаю модуль управления зарядом АКБ от солнечных панелей.

    Reply
  42. vostok1.dz

    (43)Ближе к новому году, буду внедрять модбас в 1с, есть интерес у клиентов поуправлять БРУ (бетоно-растворный узел), правда не через ардуину, а напрямик ПЛК, с выгрузкой всего в 1С, минуя всякие АСУТП…

    У меня с оконными производствами уже 2 положительных внедрения, народ в экстазе)))…

    А по поводу умного дома я согласен с вышесказанным, что это немного изврат, но для тренировки полезно )))

    Reply
  43. TODD22

    (44)

    а напрямик ПЛК, с выгрузкой всего в 1С, минуя всякие АСУТП…

    ПЛК это не часть АСУТП?

    Reply
  44. sad_1

    Предположим, вам надо отвезти тёще мешок картошки. Как вы это сделаете?

    Правильно!

    Вы возьмёте танк, привяжете к нему садовую тачку, в тачку положите мешок картошки и поедите.

    Причем, смотрите какое универсальное решение, если надо отправить внуков к бабушке, то к танку привязывается детская коляска и оп-ля, получается вариант пассажирской перевозки.

    Вообще, танк, это очень полезная штука в хозяйстве, например, на пушке можно сушить бельё.

    Хотя, сплошь и рядом в типовых конфигурациях встречается такой подход.

    Например, вчера наши бухгалтера решили сделать типовую операцию (БГУ 2.0). Бухгалтера у нас творческие, пытливые люди. Они почитали ИТС, посмотрели на другие типовые операции и изваяли операцию. Запустили. Проводки не формируются и программа молчит как партизан. Всё нормально, хотя не понятно почему нет никаких сообщений.

    Зовут меня. Мне становится интересно и я запускаю отладку. Лезу по программе и дохожу до создания Процессора компоновки данных.

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);

    Это чо? Это для создания каждой записи Журнала проводок вызывается СКД?

    Даа-а!

    Простые решения это не наш метод!

    «Нормальные герои всегда идут в обход» (С)

    Reply
  45. vde69

    плюсанул как вещь которая должна дать подумать…

    идеологически 1с с com на уровне надежного драйвера работать не может, а всякие буферизации приводят к частичной потери данных…. говорю это как человек писавший под ардуинку спец софт для отладки сетевого обмена (даже разработал свой собственный сетевой протокол поверх RS485). по этому сабж интересен «поиграть», но абсолютно не пригоден для рельного использования.

    ну и скетч под ардуинку — то же не идеал 🙂

    Reply
  46. sasha777666

    (48) Проблема с ком портом действительно серьёзная, в случае зависания приходится перезапускать службу сервера :(, в общий модуль внёс процедуру для этого. «ну и скетч под ардуинку — то же не идеал» ну так присоединяйтесь )) доведём его до идеала :))

    Reply
  47. BigBoss

    Однозначно плюс

    Reply
  48. DrAku1a

    (11) Я за! Тема интересная, вот только практической необходимости, пока что, нету.

    Reply
  49. maxlab

    Оживлю тему. Автору респект и уважуха. И еще больше интересных идей по скрещиванию ужа и ежа. На самом деле, не смотря на критику «бывалых» эмбедеров, есть уверенность что платформу 1С можно использовать в управлении производственными процессами не только на уровне бумаг, но и на уровне пром. оборудования. Разумеется, жесткий реалтайм не получится, но пробовать на медленно текущих производственных процессах уже можно. Вопрос, какую лепту внесет 1С в комплексный показатель надежности всей системы в целом. И конечно же стоимость такого решения под вопросом. Но, с другой стороны… стоимость всей совокупности промышленных контроллеров, участвующих в производственном процессе иногда бывает просто заоблачной. Достаточно, для примера, поинтересоваться у КИПовцев на каком нибудь современном мясокомбинате или сахарном заводе. И нельзя сказать что пром.оборудование супернадежно как на космическом корабле и безгеморройно для обслуживания персоналом. Так что у платформы 1С, и по цене , по качеству и по надежности — есть перспектива. Просто надо сосредоточится на шине CAN. Датчики и исполнительные механизмы на ардуинках (и т.п.) вешать на эту шину, а 1С контролируя эти датчики, в индивидуальных фоновых заданиях, решает задачи (ПИД например), выставляет управляющие воздействия и визуализирует состояние и события на производственной линии. Кстати, поэкспериментирую на досуге на своем самогонном аппарате :). Лиха беда начало… так можно и до крекинг-процессов дорасти.

    Reply
  50. acanta
  51. vadimt_82

    У меня вопрос к автору статьи. Статью еще не прочитал, но обязательно прочитаю статьи автора. Возможно в публикациях автора уже есть ответы на мои вопросы. Я решил сначала задать вопрос.

    Как организовать работу мобильного приложения 1С в среде Android с платами Arduino? Arduino управляет шаговым двигателем. Скажите пожалуйста как это сделать в 2-х словах. Я только начал изучать данный вопрос. Какие программные средства, программные объект? Какие аппаратные средства? я так понимаю через USB?

    Reply
  52. sasha777666

    (54) Используя эту конфигурацию возможно управлять с телефона шаговым двигателем подключенного к ардуине которая подключена к локальной сети в которой находится сервер 1С. Возможности управления контроллером подключенным к клиенту 1С в этой конфигурации нет

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *