понедельник, 25 июля 2011 г.

meter-webapp --- система учёта показаний водных счётчиков

Общие сведения

Каждый месяц мне, как и другим жителям моего многоквартирного дома, приходится проделывать процедуру под названием "заполнение справки о расходах холодной и горячей воды". Данная процедура включает в себя заполнение бланка, в котором указываются: ФИО, номер квартиры, номера счётчиков холодной и горячей воды, предыдущие показания счётчиков холодной и горячей воды, дата подачи предыдущих показаний и, разумеется, текущие показания счётчиков холодной и горячей воды. Вдобавок, бланк заполняется в двух экземплярах. Ясно, что вся информация кроме текущих показаний либо не меняется вообще, либо может быть вычислена на основе уже имеющихся данных, причём эту задачу совсем несложно автоматизировать. Именно этой цели и служит web-приложение meter-webapp. Ещё одна приятная мелочь - email-напоминалка, которая отслеживает подал человек показания счётчиков в текущем месяце или нет.

Краткая техническая информация
Тестирование
  • Модульные тесты для всех пользовательских ORM-классов, порождённых от Class::DBI::*
  • Тест, проверяющий функционирование ORM-классов в комплексе
  • Тест, проверяющий работу web-приложения на самом вернем уровне
Все тесты самостоятельно создают для себя всё необходимое окружение и убирают за собой после завершения. Тесты первых двух типов создают для себя временную БД со всеми необходимыми таблицами. Результат манипуляции с данными проверяется при помощи модуля Test::DatabaseRow.

Функциональный тест также создаёт временную БД, инициализирует её, генерирует конфигурационный файл Apache-а, запускает instance на выделенном порту и полностью имитирует работу нескольких пользователей с сайтом: регистрацию, логин, настройку информации по квартире, подачу показаний и т.д. Все вышеперечисленное осуществляется при помощи модуля Test::WWW::Mechanize. После завершения теста, все временные файлы удаляются.

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

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

Что дальше
  • Если получится, то "распространить среди жильцов нашего ЖЭКа" (C).
  • Do TODO

31 комментарий:

  1. Ух ты! А у нас раз в год приходит дядько, который сам снимает показания со всех водяных и отопительных счётчиков у всех жильцов. Сами снимаем только с электрического - тоже раз в год.

    И никаких предыдущих показаний, только текущие. Информацию можно донести следующими способами:
    - бесплатной почтовой карточкой
    - бесплатным звонком
    - е-мейлом
    - веб-сайтом

    ОтветитьУдалить
  2. Вот где цивилизация! И наверное ещё формат, в котором подаются эти показания унифицирован, а не так что в каждой управляющей компании свои бланки и свои требования)

    ОтветитьУдалить
  3. Да нет, весь формат - это либо белое поле на бланке, либо форма для ввода на сайте. Не знаю, о каком ты формате, но даже способы информирования у разных энергокомпаний разные - у некоторых только открытку можно послать. Моя - типа, продвинутая. На день рождения даже открытки со всякой фигнёй посылают.

    ОтветитьУдалить
  4. > либо может быть вычислена на основе уже имеющихся данных, причём эту задачу совсем несложно автоматизировать

    Последнее кажется не работает. Можно пойти ещё дальше и позволить системе самой интерполировать данные без участия пользователя. Ему останется только раз в месяц кликнуть на "распечатать текущий отчёт" и раз в два-три месяца вводить текущие показания.

    ОтветитьУдалить
  5. Когда человек вводит показания счётчиков впервые, то действительно придётся заполнить все поля формы. Если в базе уже что-то есть, то берётся самая свежая запись с её помощью заполняются почти все поля формы. Т.е. на второй месяц использования вводить нужно только два значения - текущие показания счётчиков ХВ и ГВ.

    По поводу интерполяции - неплохая идея, даже до счётчиков ходить не надо :) Надо поднакопить статистики и посмотреть, сколько вообще найдётся желающих.

    ОтветитьУдалить
  6. Можно даже так: всегда заполнять текущие показания средними значениями, а человек, если требуется, может их откорректировать.

    ОтветитьУдалить
  7. А можно даже и так: на форме ввода оставить только поле для одной даты (без всяких начал и концов периода) и поля для показаний двух счётчиков. На форме ввода ничего не интерполировать и не подставлять, чтобы не сбивать пользователя.

    Распечатку делать на основе имеющихся данных за любой указываемый период. И если на начало либо конец нет точных данных, то интерполиравать их и печатать вверху крупными буквами: "Внимание! Данные на [начало|конец|начало и конец] периода были вычислены на основе данных для других дат и могут быть неточными! Для внесения точных показаний воспользуйтесь формой ввода данных."

    ОтветитьУдалить
  8. > А можно даже и так: на форме ввода оставить только поле для одной даты (без всяких начал и концов периода)

    Дело в том, что если человек не подаст показания счётчиков в период с 25-го числа до последнего дня месяца, то счёт за воду в этом месяце ему будет выставлен по нормативу, а не по фактическим показаниям счётчиков. Соответственно, чтобы не платить за воду второй раз, в следующем месяце нужно будет явно указать показания счётчиков не только на конец периода, но и на начало.

    ОтветитьУдалить
  9. > Дело в том, что если человек не подаст показания счётчиков ...

    Я этого не предлагаю. Я предлагаю отказаться от понятия "начало/конец периода" для входных данных. Это понятие здесь искусственно. У счётчика нет начала периода. Есть только показание в момемт времени.

    А вот у отчёта есть. Задал интервал - получил отчёт. Надо за месяц - получи за месяц, надо за 5 дней - получи за пять. Не нравятся интерполируемое значение 25-го числа - вводи точное значение на 25 число. Будет ли это концом предыдущего периода или началом следующего - не играет роли.

    ОтветитьУдалить
  10. > Я предлагаю отказаться от понятия "начало/конец периода" для входных данных. Это понятие здесь искусственно.

    Да, пожалуй искусственно. К тому же, показание на начало периода, как правило, дублирует уже имеющуюся информацию. Проблема в том, что люди зачастую скептически относятся к переменам, даже не успев разобраться в чём же они состоят / не могу полностью исключить себя из их числа :-) /

    Пример из жизни: сегодня с утра я беседовал с главным инженером по нашему дому - Мариной. Я показывал ей систему в действии. Я только начал рассказывать про бланк и его избыточность, как она возразила, (1) что да, там много повторяющейся информации, но так требует бухгалтерия и с этим ничего не поделаешь. Я ответил, что всё останется по прежнему и бланк останется таким какой он есть. Потом я сказал, что система доступна через интернет. Марина спросила, (2) а как быть с подписью человека на бланке? Я ответил, что и подпись останется. За этим последовал третий вопрос: (3) а как быть бабушкам и дедушками, которые привыкли "по-старинке"? Я и к этому вопросу был готов - всё просто, новая система не заменяет старую, а только дополняет, никто не заставляет ей пользоваться.

    Только после того как Марина убедилась, что новая система полностью backward compatible со старой (даже бланк делается в 2-х экземплярах, чтобы люди могли подшивать корешки в папку) и я беру на себя обязательства по консультированию пользователей, она сказала что всё клёво и наверняка найдутся желающие воспользоваться этой возможностью. В итоге, я заручился её поддержкой и содействием в плане распространения "агитационных материалов" через диспетчерскую службу и информационные стенды.

    После этого разговора, я понял, что чем меньше новая система будет отличаться от того к чему люди привыкли за полтора года заполнения бланков, как в плане использования так и в плане конечного результата, тем меньше будет у них внутреннего сопротивления и вопросов в "службу поддержки" :)

    Если пользователь зайдёт на сайт, который позиционирует себя как drop-in replacement и не найдёт на форме подачи показаний полей "Начало периода/Конец периода", которые он заполнял на протяжении полутора лет, то у него наверняка возникнут вопросы (у меня бы точно возникли). Возможно пользователь почитает документацию, в которой будет написано, что значения интерполируются (не уверен, что все знают что это такое) автоматически. Возможно он напишет мне письмо. А может просто бросит и вернётся к тому что ему знакомо. Лично я бы почитал доку, но многие просто не станут тратить время, хотя оно бы и окупилось.

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

    ОтветитьУдалить
  11. добрый день! У нас по 2 счетчика ХВ и ГВ (всего 4), а система позволяет ввести только по одному значению. Как можно добавить по второму счетчику ГВ и ХВ? Большое спасибо!

    ОтветитьУдалить
  12. Добрый день Наталья!

    К сожалению, на данный момент эта возможность не реализована. Как временное решение, можно завести второй аккаунт и вторую пару счётчиков вести там. Но предварительно лучше позвонить в бухгалтерию УК (их телефон есть на квитанции на оплату ЖКУ) и спросить как они отнесутся к двум бланкам.

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

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Александр, сообщите, пожалуйста, когда ожидать очередную итерацию разработки. Вопросу уже 2 года.
      Спасибо.

      Удалить
    2. Здравствуйте!

      Большое спасибо за интерес, но порадовать Вас пока нечем. Срок очередной итерации не ясен, т.к. этим проектом я занимаюсь в свободное время, которого как всегда на всё не хватает.

      Удалить
  13. Вопрос на счет бланков. Заполняется только первая строчка, а предыдущие 3 поля остаются пустыми - это так и должно быть?

    ОтветитьУдалить
    Ответы
    1. Дело в том, что в некоторых квартирах стоят по два счётчика холодной и по два счётчика горячей воды. Возможно бухгалтерия управляющей компании сделала бланк (который я скопировал) в расчёте на 4 счётчика холодной и 4 счётчика горячей воды. Но веб-приложение позволяет подавать показания только по одной паре, поэтому остальные 3 поля всегда пустые.

      Удалить
  14. Здравствуйте! После входа, сайт перенаправляется снова на главную страницу и не дает производить никаких действий. Т.е снова просит ввести пароль и ник. Потом страница опять на несколько секунд открывается, и снова вылетает...

    ОтветитьУдалить
  15. Да, я тоже вчера обратил на это внимание. А какой у вас браузер и ОС? У меня эта ошибка появилась сразу после upgrade-а браузера Google Chrome на Debian Linux. Как временное решение можно попробовать другой браузер.

    ОтветитьУдалить
  16. Здравствуйте! Такое предложение возникло.. Возможно ли создать (раз уж у вас это получилось, за что отдельное спасибо - очень удобно) что-то типа форума и "распространить среди жильцов нашего ЖЭКа", чтобы люди могли обсуждать различные насущные проблемы нашего дома (УК, коммуналка и пр). Чтобы мы не были "разрозненными овцами", которыми легко манипулировать.
    Вот, например, приходит квитанция по квартплате. Раньше платил примерно 2100руб всегда, а сейчас на 2600 пришла. Гор вода считается по 110 руб за куб метр (при нормативе 70 руб). УК решила считать по общедомовому расходу. Насколько это правомерно? А многие оплачивают не задумываясь.

    ОтветитьУдалить
    Ответы
    1. Добрый день!

      На счёт форума - хорошая идея, но прямо сейчас я не могу найти время на то чтобы его развернуть и поддерживать, но я без проблем могу разместить ссылочку на такой форум (если он появится) на странице сайта с показаниями счётчиков.

      Потом, я думаю когда-нибудь переписать сайт с счётчиками (на Python), с учётом всех накопившихся пожеланий и выявленных проблем. К списку пожеланий теперь добавился и форум.

      Удалить
  17. почему-то перестали работать уведомления через имейл. А было очень удобно, чтобы в суете не забыть)

    ОтветитьУдалить
    Ответы
    1. Спасибо за баг-репорт!
      Я и сам чуть не забыл про показания счётчиков.
      Исправил, всё должно заработать.

      Удалить
  18. Добрый день!
    Александр, у меня сменился счётчик горячей воды. Номер счётчика поменял. Не могу ввести данные за текущий месяц, так как текущее значение меньше предыдущего.
    Чего делать?
    Спасибо.

    ОтветитьУдалить
  19. Добрый день!

    Когда у меня сменился счётчик горячей воды я просто завёл новую учётную запись, ввёл номера счётчиков и начальные показания: у холодного - то что было на момент прошлой подачи, а у горячего - 1.

    ОтветитьУдалить
  20. Так смысл в этом какой? Не проще Вам поменять мне предыдущие показания счётчика?

    ОтветитьУдалить
  21. Дело в том, что программа закладывается на то, что показания счётчиков эта неубывающая последовательность. Если я поменяю последнее показание, скажем со 100 на 1, то может сломаться отображение данных. Собственно, проверка на то, что новое показание не меньше предыдущего была специально добавлена чтобы гарантировать целостность данных.

    ОтветитьУдалить
  22. TODO: Я возьму себе на заметку, что хорошо бы реализовать такую функцию как "замена счётчика". При замене счётчика старые показания уйдут куда-нибудь в архив, а из данных нужно будет ввести только номер нового счётчика и его начальное показание.

    ОтветитьУдалить
  23. 30 Декабря 2015 сайт был остановлен.
    К концу Января 2016 постараюсь разместить его на другом хостинге.

    ОтветитьУдалить
  24. Александр, здравствуйте. Хотел бы уточнить, планируете ли Вы дальше поддерживать данный сервис? Больно удобно было, надеялся на "конец января"...

    ОтветитьУдалить
  25. Добрый день. К сожалению пока нет времени перенести и настроить сервис на другом хостинге. Пока что сам заполняю бумажный вариант.

    Я постараюсь найти на это время, но точных сроков сейчас назвать не могу.

    ОтветитьУдалить