Сам процесс установки выглядит так: вызываете мастера из сертифицированной конторы, он устанавливает счетчик, опечатывает его, расписывается и ставит печать в бумагах, с которыми идёте в единый расчетный центр, и ваш счетчик ставится на учет.
Далее через сайт, либо по телефону вы передаете показания. Но как обычно, ко всякому благому делу присасываются кровопийцы и мошенники разных мастей. Чтобы облегчить себе жизнь, и усложнить её спамерам и мошенникам я написал приложение «Журнал счетчиков».
Под катом я расскажу вам о размышлениях, творческих метаниях, и процессе разработки, в шести частях, с антрактом, лирическими отступлениями и техническими подробностями.
Часть первая — Воинственная
Вот поставили вы себе счётчики, опломбировали и подали информацию в службу Единого Окна. Живёте себе спокойно, передаёте данные по показаниям, и в ус не дуете. И тут через год или два раздаётся звонок, от Единого Расчетного Центра/Управы/Городского Центра Метрологии/Самой Управляющей Компанией (нужное подчеркнуть). В трубке воинственная барышня/юноша сообщают, что срок службы счётчика вашего истёк — и быстрее ставьте новый – и когда наш мастер приедет?
Мошенники ведут себя агрессивно, вываливают поток слов, угрожают переводом на повышенный тариф без счетчиков, штрафами и санкциями. Так как звонят в середине рабочего дня, когда все на работе, и дома в основном пенсионеры, то в основном рассчитано на них, как наиболее доверчивых людей.
Общая рекомендация – не стесняйтесь, и посылайте этих нехороших людишек в далёкие страны. А информацию о сроках поверки, вы можете посмотреть в паспорте на свой счетчик.
Но порой найти вы в упор не помните, когда и что меняли и устанавливали, и куда паспорт от прибора запихали.
(С) – (и даже не поздоровался, хамло) РосКосмосВодоНаноКанал имени Святой Метрологии. Вы должны поменять счетчики на воду! У вас заканчивается срок службы!
(Я) – (в голосе паника) Ой! Что же делать!
(С) – (довольный, рыбка-то попалась) Мы пришлем вам мастера. Когда сможете принять?
(Я) – А что мастер сделает?
(С) – Он поменяет вам счетчики на новые!
(Я) – А зачем менять то?
(С) – (сердится) Потому, что так положено! Говорите адрес!
(Я) – Погодите. У меня сосед, он профессиональный строитель. Он мне сказал, что детальку меняют, и не надо счетчик снимать!
(С) – (уже с душой) Ваш сосед ничего не понимает! Это же метрология!
(Я) — (праведный гнев) Вы обманываете меня! Мой сосед ПРОФЕССИОНАЛЬНЫЙ строитель!!! Он лучше всех знает!!!
(С) – (раздражение и злость, смешалось в этом голоске) Ах так!!! Ну тогда вам пришлют письменное извещение!!! И платить вы будете по повышенному тарифу!!! (гудки....)
Часть вторая – Размышления.
Итак, чтобы не искать информацию по счетчикам, необходимо иметь её под рукою. Может записать её в тетрадочку и положить на стол? А заодно в эту тетрадочку буду записывать и ежемесячные показания счётчиков.
Решение простое, и эффективное. Осложняется тем, что у меня трое весёлых малышей, для которых любая бумага в пределах доступности (включая документы и обои) – потенциальный альбом, который нужно изрисовать или порвать на мелкие кусочки. По той же причине дома порой не найдёшь нормально пишущей ручки или карандаша. И приходится писать показания на огрызках салфеток (манжетах/глиняных табличках).
Хорошо, заведу-ка я таблицу в Excel, табличку и буду записывать всё там. Но опять же, не потащу я компьютер в ванную и туалет, чтобы записать показания. Иначе мы опять возвращаемся к бумажке и ручке.
ОК. Буду использовать планшет. Но всё что мог на тот момент предоставить Маркет – либо платное, либо не отвечающее моему представлению о прекрасном. Да и в конце-то концов я Android – разработчик, или где?
(Я) – Простите, представьтесь пожалуйста.
(С) – Ээээ… Мария. Так вот…
(Я) – (торжественно) Мария! Я хочу поговорить с вами о Боге!
(С) — …
(Я) – Вы хотите поговорить со мной о Боге? Мария, я не слышу вас!
(С) — … Мы вообще-то…
(делает попытку вернуть все в русло первоначальной беседы)
(С) – Послушайте, мы хотим предложить вам выгодные условия…
(Я) – (добавив, щепотку праведного гнева) Мария! О чем вы?!!! Что может быть важнее разговора о Боге?!!!
(С) – Как понимаю, вы не хотите разговаривать. (гудки...)
Часть третья – Подготовительная
Итак, составим план, в котором перечислив всё, что нам нужно.
Первое – иметь под рукой все данные по счётчикам. А именно: номер, модель, дата замены, лицевой счёт, контакты обслуживающей компании и мастер-установщик.
Второе – удобный инструмент для занесения ежемесячных показаний, а также какой-то простейший инструмент анализа.
Третье – иметь возможность завести несколько квартир, например чтобы вести статистику по квартире родителей.
Четвёртое – если понравится в использовании, не быть жадиной и поделиться с миром.
(Я) – Виталька!!! Это ты?!!! Сколько лет!!! Сколько зим!!!
(С) – (слегка обалдев) Я…
(Я) – Блин!!! Я ж твоего звонка ждал!!! Как сам?!!! Как жена?! Как дети?!!!
(С) – (охреневая глубже) Я вообще-то не женат…
(Я) – Ну что ж ты балбес. Мужик без жены, как гусеница без дерева!
(С) – Ну, я как понимаю вас достали со звонками. До свидания…
Часть четвёртая – Эксперименты.
Первый вариант был прост и бесхитростен. Всё построено на ListView. Настроек нет. Зато ввиду моего тогдашнего увлечения пиксель-артом, значки нарисовал сам.
Старый дизайн
Главное, что приложение работало. Велась статистика (кстати пригодилось, когда пришлось пободаться с Мосэнерго).
Ввиду того, что меня приложение устраивало – создал аккаунт разработчика в Маркете, и выложил на суд общественности. Параллельно написал пост на Пикабу.
Основная критика касалась непритязательного внешнего вида, полного отсутствия Материал Дизайна, и значков которые «словно вернули в 90-е». Но в целом отзывы были положительными.
Тем временем я написал еще одно приложение, о чем рассказал на Хабре. Совершенно неожиданно для меня, количество скачиваний именно «Журнала счётчиков» резко скакануло вверх.
Чувствуя ответственность перед более 5000 пользователей, я решил переписать приложение.
Для начала сел с блокнотом (чудом спасённым от моих индейцев), проанализировал комментарии, и выписал наиболее интересные предложения. Причём некоторые был весьма неожиданными, но реально добавляющие удобства пользователю. Например, добавить возможность включить фонарик, при занесении показаний счетчика.
Переписывать пришлось очень много. А с учетом работы и семьи, работать приходилось ночами, и переделка заняла чуть ли не больше времени, чем написание первой версии.
Поменял полностью дизайн:
Новый дизайн
Добавил настройки, и возможность сохранить/загрузить данные в/из файла:
Перерисовал иконки в векторе, исправил кучу глюков и ошибок, добавил счётчик тепла, и написал инструкцию. В общем, почти с нуля переделал.
(Я) – Нет
(С) – Можно узнать почему?
(Я) – Боги запретили мне делать это.
(С) – (пауза....) Простите, что?
(Я) – Боги запретили мне брать кредиты.
(С) – А может всё-таки…
(Я) – (возмущённо) Вы хотите поспорить с Богами?!!!
(С) – Ээээ… нет… До свидания…
Часть 5. Трюки разработчика
При разработке приложения столкнулся с кучей интересных моментов. Например, если вы хотите создать ListView, внутри которого будут не просто данные, а еще и управляющие элементы (чекбоксы, редактируемые поля) вы можете столкнуться с тем, что информация неверно отображается, или передаётся в родительскую активность.
Например, в моём случае это был ListView и его адаптер, заполняемый при внесении показаний.
Диалог для ввода данных
Всё было нормально для обычных, однотарифных счётчиков, но для многотарифных началась ерунда. Вот так я победил это. Заводим адаптер (amountList)
ListView lvAmounts = (ListView)mView.findViewById(R.id.lv_newAmount_Amount);
insertAmountAdapter insertAmountAdapter = new insertAmountAdapter(getActivity(), amountList);
lvAmounts.setAdapter(insertAmountAdapter);
Класс адаптера (также есть класс следящий за введёнными показаниями AmountTextWatcher):
public class insertAmountAdapter extends BaseAdapter {
Context mContext;
ArrayList<Amount> amountList;
LayoutInflater mLayoutInflater;
EditText etAmount, etTariff;
TextView tvTariffTitle;
public insertAmountAdapter(Context mContext, ArrayList<Amount> amountList) {
this.mContext = mContext;
this.amountList = amountList;
mLayoutInflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return amountList.size();
}
@Override
public Object getItem(int position) {
return amountList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view == null){
view = mLayoutInflater.inflate(R.layout.item_insertamount, parent, false);
etTariff = (EditText)view.findViewById(R.id.et_amount_tariffInfo);
etTariff.addTextChangedListener(new AmountTextWatcher(view, etTariff, amountList));
etAmount = (EditText)view.findViewById(R.id.et_amount_Amount);
etAmount.addTextChangedListener(new AmountTextWatcher(view, etAmount, amountList));
}
etAmount.setTag(position);
etAmount.setText(String.valueOf(amountList.get(position).getAmount()));
etAmount.setFilters(new InputFilter[]{new DigitalFilter(3)});
tvTariffTitle = (TextView)view.findViewById(R.id.tv_amount_tariffTitle);
tvTariffTitle.setText(amountList.get(position).getTariffTitle()+", "+amountList.get(position).getUnit());
etTariff.setTag(position);
etTariff.setText(amountList.get(position).getTariffValue());
etTariff.setFilters(new InputFilter[]{new DigitalFilter(2)});
return view;
}
}
class AmountTextWatcher implements TextWatcher {
private View view;
private EditText editText;
private ArrayList<Amount> amountList;
public AmountTextWatcher(View view, EditText editText, ArrayList<Amount> amountList) {
this.view = view;
this.editText = editText;
this.amountList = amountList;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if(editText.equals(view.findViewById(R.id.et_amount_Amount))){
amountList.get(Integer.parseInt(editText.getTag().toString())).setAmount(Double.valueOf(s.toString().isEmpty()?"0":s.toString()));
} else if(editText.equals(view.findViewById(R.id.et_amount_tariffInfo))){
amountList.get(Integer.parseInt(editText.getTag().toString())).setTariffValue(s.toString().isEmpty()?"0":s.toString());
}
return;
}
}
Как видите, отслеживание рабочей строки идёт, через setTag и getTag.
Также, я захотел сделать инструкцию не просто с текстом, а с иллюстрациями. Для этого я решил использовать html-разметку. Но при работе с ней, есть некоторые нюансы.
Создаём инструкцию в strings.xml:
<string name="instructionText" formatted = "false">
<![CDATA[
<h3>Управляющие кнопки:</h3>
<p><img src="add_btn_instruction"> <b>Добавить элемент</b></p>
<p><img src="open_btn_instruction"> <b>Открыть информацию</b></p>
<h3>Инструкция:</h3>
<p>Чтобы добавить новый элемент (квартира, счетчик, показания) - нажмите на кнопку <b>Добавить элемент</b>, и введите необходимую информацию.</p>
<p>Чтобы увидеть дополнительную информацию (лицевой счет, компания и т.д.) - нажмите на кнопку <b>Открыть информацию</b>.</p>
<p>Чтобы открыть интересующий вас элемент - нажмите на него, и удерживайте около двух секунд. Затем выберите интересующий вас пункт меню.</p>
<h3>УПРАВЛЯЮЩЕЕ МЕНЮ:</h3>
<h6>(значок шестерёнки в правом верхнем углу, на экране со списком квартир)</h6>
<p><b>Валюта</b> можно поменять денежные единицы.</p>
<p><b>Инструкция</b> ознакомиться с данной инструкцией, и настроить её показ.</p>
<p><b>Разрешения</b> настроить разрешенные действия для приложения.</p>
<p>1)<b>Разрешение на работу с камерой/фонариком</b> - нужно для работы с фонариком.</p>
<p>2)<b>Разрешение на работу с файлами</b> - нужно для сохранения данных.</p>
<p><b>Сохранение/загрузка в файл</b>:</p>
<p>1)<b>Сохранение в XML-файл</b> - сохранит данные в файл <b>MLLDataOut.xml</b>, в папке <b>MeterListLog</b></p>
<p>2)<b>Загрузка из XML-файла</b> - разместите файл с данными <b>MLLDataIn.xml</b>, сформированными по подобию <b>MLLDataOut.xml</b>, в папке <b>MeterListLog</b>.</p>
<p><b>Внимание!!! Даное действие уничтожит все данные в программе, и перезапишет данными из файла.</b></p>
<h3>Пункты меню:</h3>
<p><b>Открыть</b> - войти в выбранный элемент, на следующий уровень(пример: квартира - счётчики).</p>
<p><b>Редактировать</b> - изменить данные по выбранному элементу.</p>
<p><b>Удалить</b> - удалить выбранный элемент.</p>
]]>
</string>
Добавляем картинки, под такими же именами, которые прописаны в инструкции, в папку drawables (у меня это: add_btn_instruction.png и open_btn_instruction.png).
В требуемом месте создаём строку, TextView и ImageGetter:
String instructionHTML = getString(R.string.instructionText);
TextView tvInstruction = (TextView)findViewById(R.id.tv_instruction);
tvInstruction.setText(Html.fromHtml(instructionHTML, htmlImageGetter, null));
Html.ImageGetter htmlImageGetter = new Html.ImageGetter() {
public Drawable getDrawable(String source) {
int resId = getResources().getIdentifier(source, "drawable", getPackageName());
Drawable ret = InstructionActivity.this.getResources().getDrawable(resId);
ret.setBounds(0, 0, ret.getIntrinsicWidth(), ret.getIntrinsicHeight());
return ret;
}
};
(Я) – В чем вопрос?
(С) – Мы проводим социологический опрос…
(Я) – Женщина, вы вообще на часы смотрите? Время уже десять вечера!
(С) – (праведное возмущение) Ну если вы спать хотите, то выключать телефон надо! (гудки...)
Часть 6. Реклама и все-все-все.
Как уже упоминал, изначально приложение писал для себя. И никаких вложений в рекламу не делал. Единственное – это статьи на Пикабу, и косвенная на Хабре. Перевёл на английский, так на всякий случай.
Монетизации, нет никакой. Приложение бесплатно, и без рекламы. Как говорил уже раньше, в другой статье «Никакой материальной выгоды, кроме морального удовлетворения (и немного, для удовлетворения мании величия), и желания поделиться полезным инструментом с сообществом, автор не получает.»
В планах на следующую версию добавить напоминалку, расширить список счётчиков (счетчики с тарификацией, водоотведение), перевести еще на несколько языков (немецкий, белорусский, украинский, быть может казахский).
Вот собственно и вся история написания моего самого первого приложения.
(Я) – Зови меня, Добрый Человек, Добрый Человек.
(гудки....)
Засим позвольте откланяться. Надеюсь кому-то это окажется полезным. Если у кого-то есть замечания или подсказки, с большим удовольствием их выслушаю.
Комментарии (66)
Markscheider
03.07.2017 16:23+1Не в обиду будь сказано, но именно функции передачи данных и контроля за поверочным интервалом вполне себе реализованы в приложении Госуслуги Москвы. Не скажу за другие регионы, но в столице оно работает (иногда коряво, но в целом устраивает).
Ваше приложение хорошо дополнительными плюшками, которых нет в ДИТовской поделке.Snakecatcher
03.07.2017 16:33Не, не в обиду.
Изначально, как я написал — прототип представлял из себя записную книжку, с удобным образом организованным редактором. Потом я добавил к нему различных плюшек.
А уж если взял старт, то плюшки еще буду добавлять. Планов — громадьё. И напоминалка, и различные стили оформления, и еще куча дополнений.
Angel2S2
03.07.2017 18:36Классная программа, спасибо!
Еще бы синхронизацию с облаком и было бы совсем шикарно )))
Workanator
03.07.2017 20:22Программа и статья очень понравились. Спасибо. Думаю, в качестве плюшки, а может быть нового приложения, вам надо добавить Диалоги со спамерами. :)
Snakecatcher
03.07.2017 21:15Спасибо и вам за отзыв.
Есть еще несколько диалогов.
Если интересно, можете несколько моих историй посмотреть на Пикабу
stepmex
03.07.2017 21:15Спасибо очень полезная программа!
Правда обнаружил одну багу: ввёл самые первые показания со счётчиков, и система мне сразу показала огромный расход. Хотелось бы отметить первоначальные показания как начало отсчёта, и соответственно нулевым расходом.Snakecatcher
03.07.2017 21:16Спасибо и вам.
Да, есть такое дело. В следующей версии добавлю возможность ввести первоначальные данные.
Prototik
03.07.2017 23:13Скрытый текстif(view == null){ view = mLayoutInflater.inflate(R.layout.item_insertamount, parent, false); etTariff = (EditText)view.findViewById(R.id.et_amount_tariffInfo); etTariff.addTextChangedListener(new AmountTextWatcher(view, etTariff, amountList)); etAmount = (EditText)view.findViewById(R.id.et_amount_Amount); etAmount.addTextChangedListener(new AmountTextWatcher(view, etAmount, amountList)); } etAmount.setTag(position); etAmount.setText(String.valueOf(amountList.get(position).getAmount())); etAmount.setFilters(new InputFilter[]{new DigitalFilter(3)});
Prototik
03.07.2017 23:20Костыль с тегом тоже выглядит как совсем костыль — проще передать позицию в Watcher.
Хотя сама идея сохранять как только пользователь что-то ввёл тоже не очень правильная — старая добрая кнопка OK тут уместнее.
Snakecatcher
03.07.2017 23:28Уточните пожалуйста. вы имеете в виду вынести за if?
На RV потихоньку перехожу. Штука удобная.Prototik
03.07.2017 23:37То, что поиск по id должен быть всегда — вне зависимости от того, view == null или нет.
Логика работы адаптера — «дай мне вьюху для элемента номер n, у меня тут вот осталась вьюха от элемента номер x, может понадобится тебе (а может и не осталась)».
Адаптер должен создать вьюху при необходимости (если это самое начало работы приложения, когда старых вьюх ещё нет) и заполнить её новыми данными. У Вас же поиск дочерних вьюх происходит только в том случае, когда нет старой вьюхи, и если она всё-таки придёт — Вы будете работать с вьюхами от другого элемента просто потому, что ссылки на них остались в адаптере. Лучше вообще убрать поля дочерних вьюх в адаптере и оставить только локальные переменные в методе:
if(view == null) { // если не осталось старой вьюхи ... // ... создадим новую view = mLayoutInflater.inflate(R.layout.item_insertamount, parent, false); } // обновляем все данные вне зависимости от того, была у нас там вьюха или нет EditText etAmount = (EditText)view.findViewById(R.id.et_amount_Amount); etAmount.setText(String.valueOf(amountList.get(position).getAmount())); ...
rvncerr
03.07.2017 23:32Спасибо за статью и за программу!
P.S. Особенно порадовал первый диалог со спамером, в котором сочетаются:
У вас заканчивается срок службы!
Ну тогда вам пришлют письменное извещение!!!
и
Говорите адрес!
Snakecatcher
03.07.2017 23:45И вам спасибо, за хорошие слова.
А эти спамеры, вообще какие-то странные. Я когда звонил в одну контору, из здания где вода была только в аквариуме, мне с ходу выпалили, что определили адрес по телефону, и нужно менять счётчики незамедлительно.
seri0shka
04.07.2017 07:23+3Понравились ваши «диалоги со спамерами».
Навеяло</В университете начинается лекция по психологии. Удобно устроившись за кафедрой, профессор:
— Сегодня, товарищи студенты, мы будем с вами изучать три сходные стадии психики человека: удивление, раздражение и гнев. Рассмотрим на конкретном примере…
Достав из портфеля телефон, профессор набирает первый попавшийся номер.
— Здравствуйте, а Васю можно?
— Знаете, здесь такой не живет…
— Вот, — улыбаясь, говорит профессор, — это всего лишь легкое удивление. Смотрите дальше.
Набирает номер снова.
— Здравствуйте, а Вася не подошел?
— Сказал же, нет тут таких…
Потирая руки, профессор заговорщицки подмигивает аудитории.
— Клюнул. Ну, а теперь…
Третий раз набирает номер.
— Так Васи нет?
— Да пошел ты…
— Что ж, товарищи, надеюсь, пример вам понятен. Приступим к теоретической части…
С первой парты встает молодой человек.
— Простите, профессор, но вы забыли четвертую стадию.
— Это какую же?
— Стадию полного офигения.
Подойдя к кафедре, молодой человек набирает номер.
— Добрый день. Это Вася. Мне никто не звонил?>Snakecatcher
04.07.2017 07:25Спасибо. )
Поначалу спамеры бесили. Ругался с ними, требовал убрать данные из их списка. А потом просто начал прикалываться над ними.
Кстати интересная статистика — после подобного диалога, спамеры перестают названивать.ozonar
05.07.2017 14:42А я просил перезвонить вечером, после девяти. После этого, не то что конкретный спаммер, вообще все спаммеры звонить перестали.
andykov
04.07.2017 07:25Программа пригодится, спасибо. Если одна из целей — занять руки и мозг, то вопрос отпадает. В противном случае не проще было бы вести учет и статистику например в Google Tables? :)
Snakecatcher
04.07.2017 07:27Спасибо за отзыв.
Хотелось своего, удобно организованного. Плюс всякие маленькие добавления (типа фонарика при вводе данных, или просмотра расходов за некоторый период), которые облегчают жизнь.
kisaa
04.07.2017 09:22Поддерживается ли несколько счетчиков холодной/горячей воды в одной квартире? (например, в кухне и в ванной отдельные горячие стояки, и, соответственно, установлено два счетчика — каждый со своими показаниями)
Snakecatcher
04.07.2017 09:22Да, конечно.
По квартире потом еще выдастся сумма.
AslanKurbanov
04.07.2017 09:39Тема актуальная, спаммеры конкретно задолбали звонить на городской телефон, вопрос кто им сливает базы и как закон о персональных данных они исполняют с 1июля.
По поводу передачи показаний: Когда нам делали кап.ремонт поставили счетчики от которых идут провода в какуюто коробочку(не разбирал) для дистанционного снятия показаний. На коробочке написано POSITIONER и наклейка Геркон 3.0(М). На вопрос когда они включат эту систему, было сказано что если у ДЭЗ есть оборудование для считывания — то будет работать, прошло 7 лет и все по прежнему в ручном режиме. На лестничной площадке сделаны тоже какието блоки, по-моему это связано. По идее както можно считывать эти данные в Вашу программу.
Спонсорами этого приложения вполне могут стать водоспаммеры:) А вообще есть в Москве нормальная контора «поверяющая» мне счетчики несколько лет, все действо занимает 5 мин., 80% времени на оформление документов, стоит 550 руб. Понятно что эта поверка сплошная профанация.Snakecatcher
04.07.2017 10:06Мне сказали, что опломбировка счётчика вообще бесплатна.
Вот, что мне писали люди:
«Все просто, есть ФЗ 416 где чёрным по белому указано что опломбировку производит обслуживающая организация и она должна сделать это бесплатно „
и
“Ну, на самом деле пломбирует счетчик та организация которая заключила с вами договор на поставку воды. Допустим существует три шараги: 1. Управляющая Компания которая обслуживает ваш дом. 2 Владелец магистральных сетей по которым вода течет в ваш дом. 3 Водоканал (обычно) который собственно эту воду производит, ну типа всасывает из какой нибудь лужи, очищает и насосами вам втюхивает. Так вот если договор на поставку воды заключен с организацией №3 она и пломбирует и никто другой. Все остальные лесом. Однако могут быть и другие варианты.Читайте договор.А платно или бесплатно это можно у знать только у них. На самом деле эта процедура настолько копеечная что серьёзные конторы не будут даже связываться. Денег не заработаешь а имидж в задницу улетит.На воду ставить счетчик имеете полное право самостоятельно но только с учетом паспортных данных счетчика и отсутствием кривизны рук. Никакой лицензии и сертификации не требуется.Далее мастер из вышеуказанной конторы приходит, проверяет правильность установки, наличие действующей поверки, записывает № в книжечку, иногда копирует паспорт, пломбирует с двух сторон и выписывает Акт установки с первоначальными показаниями.Всё. Погнали платить по счетчику. А, забыл, Счетчик лучше покупать самые дешевые, но наиболее длинным сроком поверки 6 или 8 лет, поскольку ни один водяной, да и бытовые газовые счетчики на моей памяти повторную поверку ни разу не прошли.»AslanKurbanov
04.07.2017 23:10Да, все так про пломбировку: пришел дядечка из аффилированной с УК конторы и чуть ли не пассатижами обжал свинцовую пломбу на одном и потом на другом счетчике. А я то размечтался, что пломбиратор принесет с хитрым логотипом. На то что бесплатно он сказал что ничего не знает, я дал ему за непомерный труд требуемое бабло и он отправился счастливый восвояси, а я закрыл эту тему на 4 года.
Когда понадобилось поверять счетчик горячей воды я тоже по наивности думал что вот придет инженер с чемоданом в котором суперприбор для проверки тока воды и ноутбуком, дотошно все проверит. А пришел дядя с борсеткой, повключал воду и через 5 минут удалился, оставив документы для ЕИРЦ и красивый с голограммами сертификат на поверку. Еще он сказал что при моем расходе счетчики долго проживут и чтобы я никого не слушал. Счетчики самые простые называются Берегун, им уже 8 лет.
Как я понял есть конторы которые заточены на развод клиентов на установку новых счетчиков и те что делают упор на длительную работу по поверке, нужны вторые. Хотя повторюсь — с поверками это полнейшая профанация, и все действующие лица это прекрасно знают.Markscheider
05.07.2017 09:39я тоже по наивности думал что вот придет инженер с чемоданом в котором суперприбор для проверки тока воды
Вчера такой приходил. Суперприбора с нанотрубками не было. Была сборка из 1/2" труб, с ними- два счетчика и разъем для подключения шланга от смесителя.
Заняло 15 минут, включал воду, сравнивал показания на своем приборе с моим счетчиком. Делал несколько замеров, думаю, для минимизации погрешности. Бумаги выдал, ушел. ИМХО свое бабло отработал.
redmanmale
04.07.2017 11:32Самый долгий и неприятный момент в нашем цифровом мире это необходимость руками набирать значения счётчиков в приложение/браузер для учёта.
Было бы круто на(до)писать функционал распознавания цифр с фоток счётчика и вносить их в приложение. А дальше по команде отправлять для учёта в ЭнергоСбыт и остальным.Snakecatcher
04.07.2017 11:49С распознаванием цифр, есть сложности с тем, что счетчики могут располагаться весьма неудобно для фотографирования.
Трудности с отправкой связанаы с тем, что поставщиков много и универсального API для внешних приложений, пока нет (если оно вообще есть).
fgtmenow
04.07.2017 11:46Без обид, но мне как Android Разработчику немного больно смотреть что на дизайн, что на код.
Объясню почему:
В интерфейсе не пахнет концептом материал дизайна. При том на скринах видно, что диалоги явно от системы версии 5.0+, получается смесь. Отступы, размеры, цвета все смотрится инородно и неопрятно.
Не используются Compability классы из support library.
вместо Drawable ret = InstructionActivity.this.getResources().getDrawable(resId);
следует использовать Drawable ret = ContextCompat.getDrawable(InstructionActivity.this, resId)
а так же DrawableCompat. Как — гуглится на раз-два, иначе можно словить много неожиданных ошибок на старых устройствах.
Использование ListView не рекомендуется, потому что у него есть проблемы с производительностью на больших списках, плюс он не поддерживается. Recyclerview до сих пор получает фиксы.
Это то, что можно сказать не особо смотрев код.
Snakecatcher
04.07.2017 11:47Без обид.
Все мы учимся. Приложение потихоньку дорабатываю. С LV перехожу на RV.fgtmenow
04.07.2017 12:28Если помощь будет нужна в консультативном ключе — обращайся
telegram: @AzarevArtem
Acuna
05.07.2017 01:49Использование ListView не рекомендуется, потому что у него есть проблемы с производительностью на больших списках, плюс он не поддерживается.
Извиняюсь, не поддерживается чем? Что-то пропущено?fgtmenow
05.07.2017 09:01Listview поставляется как компонент, реализованный в системе. Recyclerview поставляется как одна из support library. Последние обновляются раз в месяц в среднем, включают в себя фиксы. А listview в 4.4 на старом устройстве каков был, таков и остался.
Snakecatcher
05.07.2017 10:20Но есть и другая сторона медали. Вы точно знаете, что старый-добрый LV, всегда останется таким же. И никаких сюрпризов от него не надо ждать.
fgtmenow
05.07.2017 10:25Зато вопрос оптимизации тогда лежит на плечах разработчика. А тут уже надо честно себе признаться, достаточно ли у тебя (не конкретно тебя, а просто абстрактного разраба) опыта для выполнения этой задачи.
Вцелом советую посмотреть лекцию на youtube канале Android Developers на тему Recyclerview
IvanVakhrushev
04.07.2017 14:50А есть возможность передать показания счётчиков из приложения на e-mail управляющей компании?
Acuna
05.07.2017 01:47Спасибо за статью! Но я сделал вообще шикарно: однажды обнаружил, что уже пару лет показания остаются неизменными (1 кубометр (или в чем меряется, уже даже не помню) — холодная вода и два — горячая в месяц), в итоге шлю на сайт управляющей компании эти данные курлой по крону раз в месяц. Надо бы написать статью по этому поводу, все руки не доходят. Понятно, что мы живем в Самой Лучшей Стране в Мире, поэтому приходится все допиливать самому, и мало того, не удивлюсь, если эту лавочку накроют по причинам, известным только богам. Но пока работает.
И хотел бы спросить, пользуясь случаем, вдруг сталкивались: в ящик пришла бумажка, что счетчик нужно менять время от времени, класс точности указан в кружке на табло, чем выше — тем дольше служит, квартира вообще съемная, ни о каких паспортах даже речи быть не может, стоит ли в этой ситуации рыпаться и может ли УК чем-нибудь помочь?Markscheider
05.07.2017 09:43квартира вообще съемная, ни о каких паспортах даже речи быть не может
Паспорта изначально д.б. Если владелец их прос%ал — плохо. Без паспортов на счетчики даже поверку не сделать.
Думаю, тут надо капать на моск квартировладельцу, чтобы решал проблему (искал паспорта/делал поверку или менял счетчики на новые и уже паспорта не терял). Как только у вас закончится поверочный интервал — за воду будете платить по конским тарифам.
На бумажки в почтовом ящике, конечно же, не реагировать. Если есть доступ в ЛК — уточнить дату окончания поверочного интервала и тогда уже начинать паниковать.Snakecatcher
05.07.2017 10:19Ну почему же. Бумажки можно использовать по назначению… Самолётики например делать. )
К нам в ящик клали уже подготовленную квитанцию, с реквизитами. И потом названивали, и обещали в суд пойти если не оплатим продление договора.
Snakecatcher
05.07.2017 10:21Куб холодной, и два горячей?! Поделитесь рецептом экономии. У меня около 8 и 6 выходит. ))
Markscheider
05.07.2017 10:36У меня около 8 и 6 выходит.
А сколько народу живет? Я тут видел рекорд — 9/10 кубов на 4 человек. Но там ПММ стоит и народ в основном душем пользуется, а ванну не принимает.Snakecatcher
05.07.2017 14:18Двое взрослых, трое детей.
Хотя, стирки много. Стиралка работает почти каждый день.Markscheider
05.07.2017 14:20Двое взрослых, трое детей.
Для такого количества 8 и 6 — это вообще идеально. Даже при условии частых стирок. Машины, кстати, не так и много воды потребляют, особенно современные.
Acuna
06.07.2017 22:37Хох! Я уже даже засомневался, даже специально проверил, под одно убедился что все шлется нормально. Да, все верно, 1 и 2 куба. Но я один живу, собссно в этом и секрет я думаю)
Acuna
05.07.2017 01:51(С) – (и даже не поздоровался, хамло) РосКосмосВодоНаноКанал имени Святой Метрологии. Вы должны поменять счетчики на воду! У вас заканчивается срок службы!
(Я) – (в голосе паника) Ой! Что же делать!
Это просто пять! Рассмеялся в голос, представив произнесенную последнюю фразу!)))Snakecatcher
05.07.2017 10:17Ага, чтобы не злиться, разыгрываю театр одного актёра. ))
Кстати, столкнулся только с одной настырной девицей, которую было не прошибить моими дурачествами. Остальные понимают, что тут им не рады, и кладут трубку.
ozonar
05.07.2017 14:46Киллер фича такого типа приложений — возможность определять числа счётчика через обработку фотографии с камеры.
Тем более, если есть данные о предыдущем значении, достаточно просто избавляться от ошибокSnakecatcher
05.07.2017 18:25Надо попробовать. Но сейчас в первую очередь — напоминалка, счётчик с накопительным итогом, и переводы. Потом облако.
technomancer
Не сочтите за каприз, но есть шанс увидеть версию с пофиксенными багами и фонариком, как в новой, но дизайном, как в старой? Очень уж душевно смотрится.
Snakecatcher
Спасибо. :)
Есть мысль на будущее — выбирать различное оформление. С этим экспериментировал в своём другом приложении «Таймер трудового человека».
Но на очень далёкое будущее.
ScarletFlash
По поводу оформления – у Google есть классный сайт на эту тему:
https://material.io/guidelines/style/color.html
Snakecatcher
Ага, знаю такой.
Спасибо.