Внутреннее устройство ПО wirenboard

Посмотрел-почитал документацию, по железкам там, конечно, более-менее все написано (хотя и нет какого-то одного места где была бы сводная информация), а вот с остальным впечатление такое: “Там внутри линукс, все построено вокруг MQTT, вот еще wb-rules есть”. Все.

Возникли вопросы, ответы на которые было бы неплохо иметь в виде готовой документации:

  • какие там внутри есть пакеты (языки программирования, БД, либы итд)
  • на чем рекомендуется писать демонов, как их втыкать в автозагрузку, как дружить с вотчдогом (если надо), как разрулить битву за ресурсы (допустим, мне надо иметь доступ к RS-485, а туда же лезет какойнить встроенный модуль). в идеале - пошаговое создание простенького демона, который бы… ну, например, подключался бы к 1-wire и смотрел бы, не воткнули ли DS1990 и тыкал бы палочкой в релюшку. или что-то подобное. совсем в идеале - два примера, один через MQTT, второй - “вещь в себе”. это ответит прямо на огромную гору вопросов просто по ходу дела.
  • как воткнуть в автозагрузку какие-то разовые действия. вот, например, как запустить wb-gsm on при старте? в форуме написано добавить в rc.local. ага, как же. не работает.
  • отсюда еще один пункт - документация должна быть актуальной
  • если я обновлю прошивку - что будет с моими доработками и настройками? как их сохранить между апдейтами? где рекомендуется хранить свои скрипты, их логи и данные, чтобы что-нибудь системное не переполнилось?
  • как устроены уже написанные модули? куда лезть, если у счетчика меркурий температура отдается как unsigned short, хотя она signed? как поменять и избежать температуры во вводной коробке 65 тыщщ градусов? сгорит жеж…

В общем, считайте это пожеланием (хотя ответы на эти вопросы мне, например, сейчас нужны). Я такой человек, который пытается всегда как-то встроить что-то свое в уже существующую экосистему, чтобы оно выглядело потом целостным и правильным, и не люблю с лету лезить в ядро систему и править там все, что под руку попадется. Но это невозможно без каких-то best practices.

Также еще одно пожелание/предложение - наймите программиста, который до этого wirenboard не трогал, ничего ему про wirenboard не рассказывайте, и выдайте ему какую-то задачу, а лучше несколько. Все те вопросы, которые он задаст по ходу дела, не найдя в документации - заслуживают того, чтобы их в документацию добавить. Там есть места из серии “настройка закрючивание бздюнделя влияет на темпы закручивания бздюнделя в очереди MQTT. Чтобы лучше его закрючивать, поставьте значение побольше”. Потому что это вы, которые варитесь в этом не первый год, понимаете, что к чему и откуда растет, а новый человек вообще не в курсе. Доки, раскиданные по страничкам вики, также добавляют к процессу познания отдельную пикантность, вплоть до “ануевонахрен, поищу что-то, к чему доки структурированные и нормальные есть в pdf”.

Все это имеет смысл, только если вы позиционируете wirenboard как хорошо сделанную железку, с которой можно сделать вообще все что угодно. Если как “вот вам wb-rules, дальше не лезьте” - то тогда пофиг. Но тогда оно и менее универсальное, и ни про какую промку речи не идет - тольдко хардкор, только потомственные ардуинщики.

Как-то так. Надеюсь, вы не восприняли это как наезд, и что-то конструктивное из этого спича для себя найдете.

может это я туплю и чего-то не нашел в развезистой куче ссылок на ссылки на ссылки. Тогда ткните меня, плиз, в нужное место.

Беда в том, что линукс - он сложный. На наш софт не хватает документации и над этим мы работаем, но ваши вопросы - они выходят далеко-далеко за пределы нашего ПО и за пределы того, что простые смертные люди делают на нашем контроллере. Поэтому полноценная документация по этим вопросам - это вторая книжка “системное программирование под Linux”, которая займёт 900 страниц, и которую всё равно никто не осилит.

По пунктам:

там обычный Debian, так что любые. Разница в “есть внутри” и в “нет внутри” - один apt install XXXX.

рекомендуется их не писать, пользоваться wb-rules.
Если очень нужно - то на C++ c использованием libwbmqtt1. Примеры - это собственно весь наш гитхаб.

systemd

не надо, вотчдог должен проверять бизнес-логику

никак. Отключить в каком-нибудь встроенном модуле использование определённого порта, только так. Ещё можно дописать то, чего не хватает, в самом встроенном модуле - исходники-то октрыты. Хотя порог вхождения в такое достаточно высокий.

мыслите немножко не в том направлении. В WB и подобных системах оно уже спрятано за уровнем абстракций ядра. Поэтому нужно немножко настроить ядерную подсистему 1-Wire (в поиске по Dallas по форуму есть) на сканирование шины с большой частотой, дальше следить за файлами в /sys/class/w1. Проще всего, думаю, это сделать на баше или на wb-rules. Чтобы включить релюшку - нужно в wb-rules написать dev[релюшка] = true, на баше - отправить MQTT сообщение в топик через mosquitto_pub

мне кажется, что не ответит. Ваш пример с DS1990 решается как я описал, с каким-то другим чипом - по-другому, а чем-нибудь третьим - вообще не решается никак.

В большинстве прикладных задач - через wb-rules. Если они никакого отношения к устройствам и данным не имеют, то гуглить по systemd.

лучше использовать wb-gsm restart_if_broken, и лучше его не запускать при старте, а дёргать перед любым использованием модема

  1. не обновлять прошивку, обновляться только через apt. Как на настольном компьютере или сервере
  2. Всё сохранять в /mnt/data или /root (что примерно одно и то же)

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

ну а какая альтернатива? Вставить в это место три страницы про то, что такое очердеь MQTT и что такое закрючивание? Я бы лично промотал такое не читая.

Мы, вместо этого, делаем страницы с быстрым стартом и пошаговыми инструкциями, которые можно выполнить, даже не особо понимая, что происходит. Типа https://wirenboard.com/wiki/RS-485 или https://wirenboard.com/wiki/First_launch_and_configuration_of_the_controller

А я , наоборот, уверен, что документация в виде вики - это единственный способ обеспечить актуальную документацию. Поддерживать 50 разных структурированных pdf-ок на 5000 страниц каждая - это огромная работа, поэтому ни у кого и не получается. Получаются релизные циклы по году, расползание неактуальных версий по клиентам/дистрибьюторам/всему интернету и прочие прелести. Примеры, чтобы было и хорошо, и актуально, мне неизвестны, к сожалению.

Экспорт в pdf есть тут:https://wirenboard.com/wiki/Служебная:Print
но это всё те же страницы, так что если есть интернет - лучше пользоваться вики.

Мы это позиционируем как железку, на которой 80% задач по автоматизации и диспетчеризации можно сделать, используя встроенное ПО и тот самый wb-rules. Если хочется залезть глубже - мы двумя руками за, у нас и интерфейсы открытые, и линуксы стандартные, и даже исходники на гитхабе лежат.
Но чем ближе к железу, тем документации у нас меньше и смысла в ней тоже меньше: если клиент готов фигачить на плюсах драйверы, то вот какую документацию ему нужно, кроме исходников пяти похожих драйверов и описания API?

Вот смотрите, мне надо сделать штуковину, которая бы общалась с /dev/ttyGSM, и щелкала релюшкой.

Окей, на чем ее писать?
Лезу в wirenboard, пробую запускать разное. шел, разумеется, есть, php нету, python есть, perl есть. Ладно, будем делать на perl. А обновить его можно? а фиг его знает зачем он там, может используется где… ладно, скорее всего, ничего страшного не будет, и нам пойдет и такой какой есть.

Окей, написали программку, запустили, надо релюшкой щелкнуть. Лезем в вики, там в релейных модулях его нету. Лезем в модули расширения, о, вот он, видимо, не особо релейный попался.
А там написано, что включите его в настройках, и вот вам MQTT топики. И что? Чего мне с этим делать? Как его из скрипта дернуть?

Ищем дальше, находим где-то список GPIO и отдельную доку на английском, как надо GPIO дергать. Дергаем через echo 1 > …, щелкает, повезло. Могло и не повезти, мог быть и занят на эксклюзивное использование тем самым внутренним модулем, который мы настроили. MQTT на это тоже реагирует, значит, как-то это внутри решено через драйверы, наверное.

Но ведь можно было бы написать все это в страничке модуля? Ну хотя бы ссылки на тему, что вот оно подключено к MQTT, можно дернуть MQTT (и вот вам команда), а можно через /dev, вот вам тоже команда, вот вам ссылка на список всех GPIO, дерзайте.

Конкретная метрика пригодности документации должна быть такая - если я от описания того, чем управляем, могу пройти по ссылкам до всей нужной инфы - это нормально. Если мне надо прочитать весь вики вдоль и поперек и внутри своего мозга из несвязанных кусочков построить эти связи - это плохая документация.

По пунктам:

В условиях ограниченности ресурсов любой реюз уже существующего - благо. почему бы не написать страничку, где было бы: “вот у нас там есть перл, юзается там-то и тут-то, еще есть sqlite, его не обновляйте больше такой-то версии, может чегонить посыпаться, вот еще питон положили на всякий случай, вдруг пригодится. mysql не ставьте - летает хреново на такой памяти”?

А если так - клиент не готов изучать С++, но хотел бы написать свой скриптик на чем-то полегче?
Вот например я сомневаюсь что получится на wb-rules запилить срипт, который будет общаться с GSM, искать телефоны в БД, писать статистику, синхронизировать на сервер логи проходов. А С++ для этого явно избыточен.

Впрочем, у меня свое мнение, у вас - свое. Я свое изложил, хотите пользуйтесь этим как еще одной точкой зрения, хотите - забейте на это :slight_smile:

Зачем через GPIO?
Ну просто же вызвать

mosquitto_pub

как описано (с примерами!)

wb-rules - это java-script. И он (в том числе) имеет возможность вызывать внешние программы с парсингом их вывода.
Хм. Посмотрите на https://habr.com/ru/company/wirenboard/blog/420831/
GSM в этом примере нет, но тут уже в зависимости от задач.
Написать можно что угодно…