Wednesday, September 3, 2014

Cisco 7941G (SIP 9.3) и Asterisk (11)

Лирическое отступление.

Cisco 79xx series это некая "классика" в мире IP телефонии. Не знаю у кого они купили дизайн, но он оказался очень удачным. Его воспроизводили и воспроизводят другие производители, его часто можно встретить в фильмах в качестве обязательного офисного аксессуара (хотя скорее это product placement), он приятен на вид, удобен в эксплуатации и достаточно прост в производстве. Сама линейка 79xx конечно очень разнообразна, там аппараты на разных ОС, разного функционала. Сейчас речь о 7941G и его ближайших собратьях.

В сети встречается множество негативных отзывов по этой модели в связке с Asterisk. И связь не держит и настройки слетают, nat не держит, да и сама его настройка вызовет у многих головную боль. На самом деле этот аппарат просто не предназначен для работы с сторонними PBX. Он создан специально для Cisco Call Manager и изначально даже не имел SIP прошивки. SIP был добавлен позже в качестве альтернативы проприетарному SCCP (skinny). Call Manager в свою очередь создавался для корпораций и крупных инсталляций. Настройкой одного-двух аппаратов в таких системах никто не занимается, счет там идет на сотни или тысячи. Весь механизм настройки и отладки создан для масштабных развертываний. Аппараты серии UC (79xx) работают в такой среде как родные, и не вызывают проблем.

Хотите телефон для SMB сектора, со всякими Asterisk - Вам просто нужен другой телефон. Для этих сред создавались аппараты SPAxxx.
Закупать для подключения к простым PBX новые аппараты серии UC просто не выгодно, они стоят в разы дороже. Другое дело вторичный рынок. Именно так чаще всего и попадают телефоны 79xx в среду SMB. Ценник на эти аппараты бу достаточно гуманный, качество отличное, потому и берут. За 30-100 баксов можно купить отличный аппарат. И не стоит жаловаться на сложность настройки, просто аппарат не для таких сред :)
После подключения работают телефоны стабильно. Несравнимо стабильнее чем например Avaya старых серий.

Подготовка.

Подготовка к использованию телефонов Cisco UC в среде Asterisk сводится к:
  • прошивке аппарата.
  • поднятию tftp сервера на Asterisk или в другом месте (если еще не поднят)
  • созданию и выкладыванию файлов конфигурации на tftp сервер для каждого телефона отдельно. (я использую OSS endpoint manager для автоматизации создания конфигов)
  • настройке опций на DHCP сервере, помогающих телефону найти сервер с конфигой.

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

Поскольку потратил день на поиск в сети рабочей конфигурации для подключения аппаратов Cisco 7941G к Asterisk, то выложу их здесь. Вдруг еще потребуются.
Вот такой конфиг у меня заработал с прошивкой SIP41.9-3-1SR4-1S и Asterisk 11. Он базовый, и мне лень его дальше копать.

Конфигурация.


SEPMAC.cnf.xml:

<?xml version="1.0" ?>
<device>
<deviceProtocol>SIP</deviceProtocol>
<sshUserId></sshUserId>
<sshPassword></sshPassword>
<devicePool>
 <dateTimeSetting>
    <dateTemplate>M/D/Y</dateTemplate>
    <timeZone>Russian Standard/Daylight Time</timeZone>
    <ntps>
         <ntp>
             <name>192.168.0.3</name>
             <ntpMode>Unicast</ntpMode>
         </ntp>
    </ntps>
 </dateTimeSetting>
 <callManagerGroup>
    <members>
       <member priority="0">
          <callManager>
             <ports>
                <sipPort>5060</sipPort>
                <securedSipPort>5061</securedSipPort>
             </ports>
             <processNodeName>192.168.0.3</processNodeName>
          </callManager>
       </member>
    </members>
 </callManagerGroup>
</devicePool>
<sipProfile>
 <sipProxies>
    <backupProxy></backupProxy>
    <backupProxyPort></backupProxyPort>
    <emergencyProxy></emergencyProxy>
    <emergencyProxyPort></emergencyProxyPort>
    <outboundProxy>192.168.0.3</outboundProxy>
    <outboundProxyPort>5060</outboundProxyPort>
    <registerWithProxy>true</registerWithProxy>
 </sipProxies>
 <sipStack>
    <sipInviteRetx>6</sipInviteRetx>
    <sipRetx>10</sipRetx>
    <timerInviteExpires>180</timerInviteExpires>
    <timerRegisterExpires>1200</timerRegisterExpires>
    <timerRegisterDelta>5</timerRegisterDelta>
    <timerKeepAliveExpires>120</timerKeepAliveExpires>
    <timerSubscribeExpires>120</timerSubscribeExpires>
    <timerSubscribeDelta>5</timerSubscribeDelta>
    <timerT1>500</timerT1>
    <timerT2>4000</timerT2>
    <maxRedirects>70</maxRedirects>
    <remotePartyID>false</remotePartyID>
    <userInfo>None</userInfo>
 </sipStack>
 <autoAnswerTimer>1</autoAnswerTimer>
 <autoAnswerAltBehavior>false</autoAnswerAltBehavior>
 <autoAnswerOverride>true</autoAnswerOverride>
 <transferOnhookEnabled>false</transferOnhookEnabled>
 <enableVad>false</enableVad>
 <preferredCodec>none</preferredCodec>
 <dtmfAvtPayload>101</dtmfAvtPayload>
 <dtmfDbLevel>3</dtmfDbLevel>
 <dtmfOutofBand>avt</dtmfOutofBand>
 <alwaysUsePrimeLine>false</alwaysUsePrimeLine>
 <alwaysUsePrimeLineVoiceMail>false</alwaysUsePrimeLineVoiceMail>
 <kpml>3</kpml>
 <natReceivedProcessing>true</natReceivedProcessing>
 <natEnabled>false</natEnabled>
 <natAddress></natAddress>
 <phoneLabel>test</phoneLabel>
 <stutterMsgWaiting>1</stutterMsgWaiting>
 <callStats>false</callStats>
 <silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts>
 <disableLocalSpeedDialConfig>false</disableLocalSpeedDialConfig>
 <startMediaPort>20000</startMediaPort>
 <stopMediaPort>24999</stopMediaPort>
 <sipLines>
  <line
     button="1">
       <featureID>9</featureID>
       <featureLabel>100</featureLabel>
       <proxy>USECALLMANAGER</proxy>
       <port>5060</port>
       <name>100</name>
       <displayName>100</displayName>
       <autoAnswer>
          <autoAnswerEnabled>2</autoAnswerEnabled>
       </autoAnswer>
       <callWaiting>3</callWaiting>
       <authName>100</authName>
       <authPassword>password</authPassword>
       <sharedLine>false</sharedLine>
       <messageWaitingLampPolicy>1</messageWaitingLampPolicy>
       <messagesNumber>880880</messagesNumber>
       <ringSettingIdle>4</ringSettingIdle>
       <ringSettingActive>5</ringSettingActive>
       <contact>100</contact>
       <forwardCallInfoDisplay>
          <callerName>true</callerName>
          <callerNumber>false</callerNumber>
          <redirectedNumber>false</redirectedNumber>
          <dialedNumber>true</dialedNumber>
       </forwardCallInfoDisplay>
    </line>
</sipLines>
 <voipControlPort>5060</voipControlPort>
 <dscpForAudio>184</dscpForAudio>
 <ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy>
 <dialTemplate>dialplan.xml</dialTemplate>
</sipProfile>
<commonProfile>
 <phonePassword></phonePassword>
 <backgroundImageAccess>true</backgroundImageAccess>
 <callLogBlfEnabled>2</callLogBlfEnabled>
</commonProfile>
<loadInformation>SIP41.9-3-1SR4-1S</loadInformation>
<vendorConfig>
 <disableSpeaker>false</disableSpeaker>
 <disableSpeakerAndHeadset>false</disableSpeakerAndHeadset>
 <pcPort>0</pcPort>
 <settingsAccess>1</settingsAccess>
 <garp>1</garp>
 <voiceVlanAccess>0</voiceVlanAccess>
 <videoCapability>0</videoCapability>
 <autoSelectLineEnable>0</autoSelectLineEnable>
 <webAccess>0</webAccess>
 <spanToPCPort>0</spanToPCPort>
 <loggingDisplay>1</loggingDisplay>
 <loadServer></loadServer>
</vendorConfig>
<versionStamp></versionStamp>
<userLocale>
 <name></name>
<uid></uid>
 <langCode></langCode>
<version></version>
 <winCharSet></winCharSet>
</userLocale>
<deviceSecurityMode>1</deviceSecurityMode>
<authenticationURL></authenticationURL>
<directoryURL></directoryURL>
<idleURL></idleURL>
<informationURL></informationURL>
<messagesURL></messagesURL>
<proxyServerURL></proxyServerURL>
<servicesURL></servicesURL>
<dscpForSCCPPhoneConfig>96</dscpForSCCPPhoneConfig>
<dscpForSCCPPhoneServices>0</dscpForSCCPPhoneServices>
<dscpForCm2Dvce>96</dscpForCm2Dvce>
<transportLayerProtocol>2</transportLayerProtocol>
<capfAuthMode>0</capfAuthMode>
<capfList>
 <capf>
    <phonePort>3804</phonePort>
 </capf>
</capfList>
<certHash></certHash>
<encrConfig>false</encrConfig>
</device>


XMLDefault.cnf.xml

<!--
#################PROVISIONER.NET#################
# This Configuration file was generated from the Provisioner.net Library by {$provisioner_processor_info}
# Generated on: {$provisioner_generated_timestamp}
#
# Provisioner Information Follows:
# Brand Revision Timestamp: {$provisioner_brand_timestamp}
# Family Revision Timestamp: {$provisioner_family_timestamp}
#
##################################################
-->
<Default>
<loadInformation8 model="IP Phone 7940">P0S3-8-12-00</loadInformation8>
<loadInformation7 model="IP Phone 7960">P0S3-8-12-00</loadInformation7>
<loadInformation435 model="Cisco 7945">SIP45.8-4-2S</loadInformation435>
<loadInformation436 model="Cisco 7965">SIP45.8-4-2S</loadInformation436>
<loadInformation30006 model="IP Phone 7970">SIP70.8-0-3S</loadInformation30006>
<loadInformation307 model="IP Phone 7911">SIP11.8-5-4S</loadInformation307>
<loadInformation309 model="Cisco 7941G-GE">SIP41.9-3-1SR4-1S</loadInformation309>
</Default>



Dialplan.xml

<DIALTEMPLATE>
<TEMPLATE MATCH="*" Timeout="0"/>
<TEMPLATE MATCH="1." TIMEOUT="1"/>
<TEMPLATE MATCH="2." TIMEOUT="1"/>
<TEMPLATE MATCH="7.........." TIMEOUT="3"/>
<TEMPLATE MATCH="......" TIMEOUT="2"/>
<TEMPLATE MATCH="8.........." TIMEOUT="3"/>
</DIALTEMPLATE>


Правда я использую OSS Endpoint плагин, так что в моем случае часть заменяется переменными, но в целом всё так. Для быстрой и комфортной перепрошивки одного - двух аппаратов я использую приложение landvcfd. Нет нужды поднимать TFTP, создавать xml шаблоны для обновления.

Ссылки и используемые материалы.

Последние версии прошивок и локализаций выложены в бесплатном доступе на сайте Cisco, для скачивания достаточно простой регистрации.
Все необходимые файлы выложены здесь.
А эти несколько ссылок помогут с настройкой и прошивкой:



Monday, July 28, 2014

SSHD странное поведение рынка гибридных дисков



Только ленивый, глухой и вдобавок слепой айтишник сегодня не знает о преимуществах SSD. Рынок SSD стремительно развивается, появляются и исчезают новые игроки, инвестируются средства в усовершеноствованные технологии. Твердотельные накопители еще несколько лет назад дали рынку такой пинок, от которого всех производителей до сих пор колбасит. Причем перестраивается не только рынок самих накопителей, но и вслед за ним рынок контроллеров, СХД, ОС и приложений.
Однако SSD ёмкости по сравнению с традиционными пока остаются крайне дорогими. Приходится постоянно лавировать между скоростью и ёмкостью, и на уровне корпоративном и на уровне обычных пользователей и SOHO. Enterprise отдельная песня, оставим её в стороне. А вот на уровне обычных пользователей сейчас есть решения хранений на SSD, HDD и гибридные варианты. Причем по моему опыту SSD это хорошо, но всегда мало, а HDD всегда слишком медленно. Самым оптимальным вариантом является именно гибридный вариант, в котором "горячие" данные доступны быстро, а покрывшиеся пылью дистрибутивы или музыка лежат и спокойно ждут своего часа на медленном хранилище. В идеале сюда бы добавить совсем медленное хранилище для редко используемых данных (семейного фото видео архива на 2 тб), но это пока реализовано только в виде DVD BRD, облаков, NAS. В общем гибрид SSD + HDD выглядит почти мечтой.
Реализовать мечту пользователя об идеальном хранилище на сегодня позволяют:

  • Бытовые контроллеры SATA (Intel smart response, какие то поделки от китая)
  • Windows 8 (8.1) в виде Storage spaces
  • SSD + HDD в ручном варианте
  • SSHD - гибридные диски (два в одном).


 Бытовые контроллеры SATA.


Продвинутые чипсеты от Intel имеют возможность кэширования данных на SSD Intel Smart Response. Чаще всего это чипсеты имеющие в конце маркировки 5, 7 или 8 (Z77, B75). То есть практически все чипсеты кроме самых Low End. "Просто дабавь SSD", если кто то еще не знаком с этой технологией, рекомендую уделить пару минут. Если перед установкой ОС в BIOS был включен режим RAID у контроллера, то просто добавляете SSD, и в установленной утилите от Intel включаете кеширование. Всё. Остальное делают драйвера от Intel. Кстати, сейчас обещают что работает не только связка SSD + HDD, но и просто SSHD. Плюсы:

  • простота инсталляции и эксплуатации
  • отказ SSD не угражает данным (есть дубликат на HDD)
  • почти хардварно

Из минусов -

  • поддержка только ОС Microsoft (насколько я знаю), 
  • невозможность вручную указать файлы которые хотелось бы хранить на SSD, 
  • кэш ограничен только 20 гб (остальную ёмкость SSD можно использовать вроде). 
  • Ну а если режим стоял IDE или AHCI, то придется немного повозиться с ОС сначала.

Есть так же варианты контроллеров в формате PCIe и даже просто SATA от брендов пониже уровнем. Им я как то меньше доверяю. В любом случае - неплохой вариант гибрида.

Windows 8 (8.1) в виде Storage spaces. 

Никто не знал а я Batman! Действительно - мало кто знает что Microsoft начиная с Windows 8 предоставляет отличные функции по созданию дисковых массивов доступных ранее только для очень дорогих RAID контроллеров. Storage spaces это очень круто, меня даже пугает такой прогресс (чего же ожидать в Windows 9?) Думаю производителей крутых контроллеров этот подход тоже пугает, по этой причине никто громко об этой технологии не говорит, чтобы не обрушить рынок. Установленной Windows скармливают разные диски (HDD, SSD) и выбирают из вариантов (скорость, надежность, скорость и надежность), в общем строят RAID в том виде в котором хочется. Управляемость тут обалденная просто. Плюсы:
  • всеядность (USB, SATA, IDE, SAS, PCIe...). Не проверял все варианты.
  • огромное количество вариантов использования дисков
  • динамические размеры дисковых пространств
  • бесплатность (за ОС вы уже заплатили)
  • можно самостоятельно решать какие файлы будут всегда на SSD
минусы:
  • необходимы навыки построения массивов, ну хотя бы понимать что делаешь.
  • насколько я знаю нельзя установить ОС на такой гибридный диск, то есть под ОС отдельный диск нужен.

SSD + HDD в ручном варианте

Распространённый вариант. Когда не хочется заморачиваться с более сложными вариантами. Поставили ОС на SSD? Сколько Gb из этой ОС требуется считывать каждый день, и сколько файлов не будут прочитаны ни разу? То есть огромная часть дорогого дискового пространства будет использована для хранения файлов которые можно хранить на дешевом диске. Плюсы:
  • управляемость (пользователь решает что и где хранить)
  • предсказуемость (отработанная технология)
минусы:
  • высокая цена (с учетом потерянного места на SSD под "лишние" файлы)
  • управляемость (требуется ручками переносить файлы на быстрое или медленное хранилище)

SSHD - гибридные диски (два в одном).

User friendly вариант. Seagate в этом сегменте пока в лидерах. Обычный жесткий диск снабдили огромным кешем SSD. В эксплуатации ничем не отличается от обычного жесткого диска, не управляем, работает по алгоритмам заложенным производителем на заводе. Вообще не требует обслуживания, особой установки. Я был уверен что на рынке они полностью заменят обычные HDD. Плюсы:
  • невысокая цена
  • простейщая установка и эксплуатация
Минусы:
  • нет управления (возможно есть при использовании Intel smart response)
  • не заменить отдельно компоненты (заменить только SSD не выйдет)

А что в итоге?

При всём многообразии вариантов продавать современные ПК, с приличными процессорами, видеокартами, быстрой памятью и при этом устаревшими HDD я считаю практически преступлением. Любой современный ПК, будь то офисный или домашний, будет упираться именно в диски. Зачем вкладывать в процессоры, видео если упрется в жесткий диск, это же деньги потребителя на ветер.
И что я вижу на рынке? Сколько пользователей Smart Response вы знаете? Сколько моделей SSHD лежит на полках близлежащего магазина? А у его поставщика на складах? Сколько вам известно пользователей Windows использующих Storage spaces? При том что SSHD являются самым простым в инстяляции вариантом, при покупке пользователь по прежнему сравнивает просто ёмкость дисков. Даже айтишники и гики  предпочитают использовать отдельно SSD и HDD (или облака).
До сих пор большая часть basic линеек ПК и ноутбуков известных брендов продается с HDD. Мало того, ноутбуки продаются даже с HDD 5400 rpm! И ведь покупают.

И я понять не могу - что происходит? Такой прогресс в технологиях, и такой разрыв в продажах. Выбирая на сайте дистриба ПК от HP или DELL, мне даже посмотреть не на что. Никто из них не предлагает рабочих станций с гибридными хранилищами и даже с SSD не найти. Это какой то заговор, какой то кризис здравого смысла.
IT всегда считалась отраслью идущей в авангарде технологий. Но не сейчас, не в плане ПК и ноутбуков. Возникли какие то барьеры, причем не технологические или производственные, а системные, рыночные.
Мои варианты ответов на вопрос - почему гибридные варианты хранения по продажам уступают классическим:

  1. Сложность использования. Отметается, разница в HDD и SSHD с точки зрения сложности эксплуатации нулевая.
  2. Высокая волантильность рынка. Потредители привыкли что главное в диске - его объем.
  3. Недолговечность SSD. Принимается частично. Технология была уязвима в начале, но сегодня приличного SSD хватает на 2-5 лет обычной эксплуатации. Бытовые HDD сейчас такие, что не все из них 3 года отрабатывают, так что в плане надежности еще вопрос кто кого. В случае гибридов допускаю повышенный износ, т.к. именно горячие данные будут выжигать диск, но для этого и существуют контроллеры - выбирать данные которые нужны не один два раза, а постоянно. Хотя, допускаю что именно из-за надежности вендоры ПК не используют активно SSD. Есть рипутационные риски.
  4. Высокая цена. Помилуйте - 8 гб кеша ssd увеличивают ценник диска на 1 т.р. или меньше. Был 1700 руб., стал 2500 руб. Сравните со стоимостью остальных компонентов. Да лучше на процессоре, системной плате и памяти сэкономить, они все вместе не повлияют на производительность системы так как это сделает быстрая дисковая подсистема.
  5. Заговор производителей. Вполне вероятно что Seagate или еще кто то обладает патентами на технологии необходимые для производства гибридов. В свою очередь крупные веендоры ПК не хотят допускать монополии Seagate или кого то ещё, и намеренно не используют технологию на которую есть монополия. Однако используют же они CPU Intel...
  6. Реальный прирост производительности не так велик. Этого просто не может быть, потому что не может быть. 
Ещё есть варианты?

Friday, July 4, 2014

Sony Vaio апгрейд с windows 7 до windows 8 (8.1)

Если по каким либо невероятным обстоятельствам в руках появился Vaio совместимый с Windows 8, но с установленной штатно Windows 7. И если руки эти чешутся произвести апгрейд - стоит остановиться и подумать.
Дело в том что в vaio как и в других ноутах есть множество всяких фишек: кнопочек; закладок; утилит. Если ими никто никогда не пользуется, то можно хоть сразу сносить раздел с данными ОС и устанавливать новую ОС с нуля. Если же хочется иногда прибавить яркость экрана, выключить подсветку экрана и вообще использовать ноут sony как ноут sony, а не самосборный ПК, то лучше оставить как есть.
Компания Sony в принципе подумала о пользователях и раскидала по своим серверам утилиты и мануалы способные облегчить жизнь пользователям желающим обновиться до windows 8, но найти эти самые мануалы сложно.
Мне например помогла следующая процедура обновления:
делаем полный бекап всего нужного на внешний носитель
восстанавливаем ноутбук в "заводские настройки" (4 часа)
запускаем утилиту Sony VAIO® Upgrade Tool for Windows® 8 - Lite
утилита удаляет весь софт несовместимый с новой ОС
запускаем из под Windows 7 установку Windows 8 upgrade (в данном случае была лицензия на апгрейд, но диск с обычной Windows 8 (pro) должен подойти)
перед установкой обнаружились еще 3 программы несовместимые с новой ОС, их удалил вручную.
устанавливаем Windows 8 с сохранением всех данных и настроек
запускаем Sony VAIO® Upgrade Tool for Windows® 8 - Lite  повторно. На этот раз она скачивает и устанавливает все необходимые утилиты и драйвера.

В принципе те же самые шаги можно было произвести и вручную, но необходимо строго соблюдать последовательность действий. Думаю что последовательность должна быть такой.
Кстати - если утилита в процессе установки в Windows 8 ругнется на какую то там ошибку 151
on post install line 151 argument blah blah blah
то нужно просто установить в панели управления, в разделе региональных настроек, в форматах, на закладке "дополнительно" язык программ не поддерживающих Юникод в английский США и перезагрузить. После загрузки утилита продолжит свою работу.

Monday, June 16, 2014

Минусы Shopotam (ebaytoday)

Просторы интернета пестрят восторженными отзывами о посреднических сервисах. Можно разделить эти отзывы на:

  • Инструкции по покупке в зарубежных интернет магазинах
  • Описание мегапокупки совершенной при помощи сервиса
  • Инструкции по максимизации выгоды и минимизации издержек.

Все эти статьи либо появляются откровенно на правах рекламы, либо не так откровенно, но мотивация у авторов есть. Посреднические сервисы используют скидки на свои услуги для продвижения, нередки компании "приведи друга, получи 0,5%" или "напиши отзыв, получи 5$ на счет". Эти механизмы продвижения эффективны, прибавим заказные статьи и контекстную рекламу и.. Я бы использовал те же способы на их месте. Молодцы ребята. С другой стороны бюджет на использование всех механизмов сразу должен быть весьма приличным, а это наводит на мысли о маржинальности услуг. Раз столько написано про плюсы, напишу пожалуй про минусы.
Мне приходится время от времени заказывать оборудование в США или в Китае. Рынок в штатах переполнен бу оборудованием по сходным ценам и его легко купить (cisco, hp, fluke...), а Китай предоставляет возможность экономии на каких то мелочах (батарейки, arduino, запчасти). В РФ бу оборудования, кстати, тоже навалом стало, просто оно продается под прилавком, мешает информационная закрытость. И если его выкупят у гос конторы за 500 руб, то на Avito оно появится с плохим описанием и уже за 5000.  В процессе часто приходится пользоваться посредником Shopotam. 
Я ленивый - это основная причина по которой я до сих пор не перешел к shipito или полярному экспрессу. Регистрация в новом сервисе занимает какое то время, нахождение нужных кнопочек в интерфейсе. У сервиса есть плюсы, но никто не пишет про минусы, а они есть (объективные и субъективные). Например:
  1. Умалчивание
  2. Скорость работы
  3. Гарантии
  4. Тех поддержка

Умалчивание. 

Зайдя на сайт можно онлайн калькулятором просчитать стоимость покупки или доставки. 3 бакса за мэйл форвард, 10% комиссия при покупке, на первый взгляд всё прозрачно. Можно сравнить эти цены с конкурентами, сделать выводы о ценовой привлекательности сервиса. Только на самом деле ценник на все услуги можно смело умножать на 110%. Дело в том что для оплаты вы не можете просто использовать paypal или visa, mastercard. Вам придется либо заплатить платежной системе нехилую комиссию, либо оплатить в рублях по курсу устанавливаемому сервисом Shopotam, иногда одно другому не мешает. На момент написания статьи:
34,32  ЦБ РФ
36,18  Shopotam через РБК
Операции ввода/вывода средств в кошелёк посредника очень дороги. Может и есть способ экономии, например, мне встречались хвалебные отзывы об оплате Webmoney WMZ. То есть нужно купить долларов в банке, потом купить WMZ у кого то. Но мне не удалось найти в своем городе WMZ обменника, и думаю что вход/выход в Webmoney + перевод в shopotam будет стоить сравнимо с другими вариантами, а возни больше. 
Уверен что комиссии должны быть прозрачными, сейчас сервис делает всё возможное чтобы не информировать пользователей о реальных расценках на услуги. Наученный горьким опытом я теперь раз 5 прикину стоит ли овчинка выделки.
Здесь стоит сделать небольшую ремарку. Необходимость использования сервиса возникает в том случае если продавец принципиально не отсылает в РФ или если он отправляет посылки дорогой курьерской службой (для США UPS например). При этом возникают расходы на отправку до склада посредника, а потом еще и со склада до покупателя. То есть делая ставку в лоте на 30 баксов нужно понимать что доставка может обойтись в 100 баксов. Стоит перед размещением ставки потратить 5 минут и спросить продавца о возможности отправки в РФ (отправки дешевой почтой). Можно даже предложить ему немного накинуть сверху за "риски". Вероятность отказа тем ниже чем выше ваша репутация. Чтобы не терроризировать продавца можно о доставке спросить и после выигрыша лота, только не отказывайтесь от лота в случае если продавец упрямый. Лучше делая ставку рассчитывать на худший вариант.
Я не говорю про покупки силами самого посредника, там вообще здравый смысл отсутствует. При ценах ниже на 20% оплатить комиссию за ввод денежных средств, плюс за посредничество, плюс доставку, плюс риски связанные с доставкой и самим товаром - к чёрту такие спец предложения.
О - еще добью, мне после совершения очередной операции посредник выводит мега спец предложение с переходом на другой тариф. Круто думаю, занеся курсор на "согласен", читаю в чем же предложение... В ухудшении ценовых условий :) При определенных условиях может и выгодно, но это в очень редких случаях.

Скорость работы.

Продавец отправляет мне посылку. Есть трекинг номер почтового отправления, я заношу в сервис посредника информацию "Ждите посылку с таким то номером, едет" . Посылка пришла по данным трекинга еще 5 дней назад на склад Shoptam. Это же не должно быть так сложно - при получении посылки сразу отсканировать штрих коды, считать номер трекинга, отправить мне уведомление о получении посылки! Это должно занимать несколько минут, ну часов, но не 5 дней. В общем случае проходит дня 2. Потрясающая скорость работы. Так этого мало, потом еще дня 2 будут упаковывать и отправлять. Сама доставка от сервиса Shopotam тоже может затянуться. Это только на сайте всё так красиво, в реальности почта РФ сейчас может работать быстрее. Хотя может это только мне так не везло с доставкой силами посредника.
Предположим что покупка произведена в США. Доставка по стране в среднем 3 дня, плюс 2 дня ожидания на складе посредника пока её найдут, плюс 2 дня упаковки и отправки, плюс 5 дней (как обещают в сервисе) доставка экспрессом. (почта РФ может за 10 дней доставлять если захочет).
Итого из 12 дней целых 4 дня посылка что то делает у посредника на складе. Есть о чем задуматься логисту сервиса.
Разумеется любые праздники в любой из стран (отправки/получения) встречаются работниками сервиса на ура. 
Ремарка. Меня всегда особо радуют этим наши курьерские службы (автотрейдинг, пэк, деловые линии): 
"У нас уже закончился рабочий день, а завтра выходные. Приходите в понедельник", а ведь вот она, лежит моя посылка в паре метров.
С учетом того что сервис не из дешевых хочется сервиса соответствующего.

Гарантии.

Ну тут я придираюсь конечно. В одном случае я попал на пару сотен баксов. При заказе товаров на склад посредника Amazon упорно не принимал адрес склада. Постоянно просил переделать его и говорил что такого адреса не может быть. Ну не может так не может сказал я и разрешил Амазону исправить почтовый индекс. Время идет, посылки не появляются на складе посредника. Обращение в тех поддержку, переписка, уточнения заняли пол месяца. Выяснилось что кто то получил мои посылки, но это не Shopotam. 
Каким образом посылки смог получить кто то с неправильным индексом, но по правильному адресу?
Каким образом Shopotam смог найти в UK такой адрес которого не знает Amazon? Почему не попытались объяснить тех поддержке Amazon что такие индексы бывают?
Сколько еще таких посылок ушло соседям склада?
Посредник разумеется не виноват, умыл руки и отошел в сторону. В общем сам виноват, но ответственности у посредника никакой.
По поводу страховки предлагаемой сервисом - 2% предлагаемые по умолчанию это тоже очень  приличная страховая премия. Мы же уже заплатили 10% от транспортировки при конвертации, теперь еще 2.2% от стоимости товара. При чем непонятно - за что? 
Если приедет товар ненадлежащего качества посредник всегда сошлётся на продавца. Для разборок с продавцом часто требуется отправка товара обратно, а это часто дороже самого товара.. Если продавец отправил вам в руки - он и оплатит расходы по доставке обратно, в случае с mailforward отправка обратно на склад посредника за ваш счет.
Если товар повредился в пути или вообще не дошел (затонул контейнер, в аэропорту выпал) то разве транспортная компания не должна возместить стоимость? С почты РФ получить сложно, но с Шопотам экспресс то должно быть все хорошо, клиенто-ориентированность и т.п. - разве нет?

Тех поддержка.

Сервис судя по расходам на рекламу имеет неплохую маржинальность. Но вот поддержка хромает. В принципе, отвечают. Но вопросы нужно формировать Крайне четко, вносить в вопрос всю возможную информацию. Мы ведь живем в каменном веке и сотрудники поддержки не могут сами посмотреть подробную информацию по посылкам и товарам касающимся конкретного пользователя. Нестандартный вопрос, да еще и требующий ответа со склада? Ответ займет пару дней. Склад как будто упрашивать надо ответить.
Задерживается отправка или доставка? В любом человеческом сервисе вам напишут, чтобы не волновались (сдвигаем сроки по такой то причине, пардон, примите дисконт в подарок), но не здесь. Здесь нужно напрячь тех поддержку.
Вообще я понимаю что тех поддержка обходится дорого, и нужно на ней экономить, но уверен что большая часть вопросов связана с неизвестностью. Пользователь просто не в курсе что и где происходит с его заказом. Информируйте его в автоматическом режиме и он не будет тревожить поддержку.

Пусть этот пост здесь полежит пока.

Monday, April 28, 2014

Домашний климат под контролем 2 (Arduino + CO2)

Just another meteostation, co2meter

Получив в руки игрушку под названием Arduino первое что приходит в голову - поморгать светодиодами, второе - собрать метеостанцию.
Следующим после уровня влажности  и температуры меня интересовал уровень загрязнения воздуха. А самое главное - уровень CO2. Этот показатель основа для определения качества воздуха. Если этот показатель в норме, то и с остальными газами скорее всего нет проблем. Это показатель проветриваемости помещения. Основной источник CO2 в помещении это мы сами. Минимальный уровень CO2 это обычно свежий уличный воздух - 300-400 ppm. Уровень приемлемый в жилом помещении 500-800 ppm.  Высокий уровень CO2 вызывает головные боли, тошноту, слабость, в общем симптомы отравления вплоть до несовместимости с жизнью.
Сенсоров CO2 дешевых не встречал. Китайцы не захламили ebay вариантами "все по 10 долларов", так что искать нужно у приличных производителей. При выборе смотреть нужно на уровень определения газа, для наших бытовых случаев достаточно будет от 0-400 ppm до 2000-10000 ppm. Ниже 400 у нас не будет показаний, а выше 2000 это уже очень серьезный повод покинуть помещение. Из всего что просмотрел мне приглянулся K30 от co2meter.com. Есть скетчи для arduino, есть различные варианты подключения (аналог, UART, I2C), есть система автокалибровки и все это за 65 баксов без учета доставки. Правда в РФ по сложившейся традиции не доставляют, так что ищем посредников.

По моему опыту от девайса требуется:

  • возможность посмотреть данные мониторинга на самом девайсе (глупо идти за смартфоном чтобы узнать влажность в комнате когда датчик на расстоянии вытянцтой руки). Экран в таких устройствах очень желателен.
  • возможность смотреть данные (графики) онлайн. Скидываем куда нибудь вроде narodmon.ru .
  • возможность изменять настройки устройства через веб интерфейс (к сожалению на маломощных UNO и Ethernet с 32kb FLASH и 2 SVRAM веб интерфейс это из мира фантастики).
Приведенная здесь простенькая инструкция по сборке DIY устройства мониторинга качества воздуха в помещении может вам помочь в оздоровлении окружающей вас среды.

Элементы:

Arduino (Uno + Ethernet shield, Ethernet, Ethernet with PoE)
DHT22 (dht11, AM2302)
K30
LCD 1602 (LCM1602 IIC V2)

Схема подключения:

co2 k30 pinout

LCD для экономии задействованных контактов был выбран с нашлепкой в виде PCF8574T, а сенсор AM2302 уже шел в DHT22 с резистором. Рекомендую почитать таки datasheet от K30.

Скетч для ардуино:



/*

Library LCD.
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
1602 with PCF8574T  LCM1602 IIC V1


K_Series.h -Library for interfacing with a K-series sensor
Created by Jason Berger
for CO2METER.com
OCT-12-2012
http://www.co2meters.com/Documentation/AppNotes/AN126-K3x-sensor-arduino-uart.zip

FILE: dht.h
VERSION: 0.1.05
PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
URL: http://playground.arduino.cc/Main/DHTLib
HISTORY:
see dht.cpp file


MemoryFree library based on code posted here:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1213583720/15
Extended by Matthew Murdoch to include walking of the free list.

 */



#include <SPI.h>
#include <Ethernet.h>
#include "kSeries.h"
#include <dht.h>
#include <MemoryFree.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

dht DHT;
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);



EthernetClient client; //

char CurTemp[5]={
}
,CurHum[5]={
}
,ppm[5]={
};

kSeries K_30(6,8);

// CHANGE MAC ADDRESS TO ANY OTHER!!! (use http://www.miniwebtool.com/mac-address-generator/ for example)
byte mac[] = {
  0x90, 0xA2, 0x7C, 0x5E, 0xA7, 0xB9       }; // default mac address of ethernet shield

boolean DHCP = true,NMService=true,DHT22=true,DL=false,K30=true;

IPAddress IP=(192,168,1,121),GW=(192,168,1,1),DNS=(192,168,1,1),NMIP=(94,19,113,221);
IPAddress server(94,19,113,221);
int DHT_P=(7),DL_P=int (5);


const unsigned long postingInterval = 400000;  // интервал между отправками данных в миллисекундах (5 минут)
unsigned long lastConnectionTime = postingInterval;           // время последней передачи данных
boolean lastConnected = false;                  // состояние подключения
int HighByte, LowByte, TReading, SignBit, Tc_100;
char replyBuffer[106],macch[14];


void setup() {
  delay(200);
  Serial.begin (115200);
  if (DHCP) {
    if (Ethernet.begin(mac) == 0) {
      Serial.println("Failed  DHCP");
      // doing nothing
      for(;;)
        ;
    }
  }
  else {
    Ethernet.begin(mac, IP);

  };
  delay(500);  // Couple of seconds just to warm up Ethernet.
  Serial.println();
  Serial.print("IP ");
  Serial.println(Ethernet.localIP());
  genmacchar();

  lcd.backlight ();

  lcd.begin(16,2);               // initialize the lcd

  lcd.home ();                   // go home
  lcd.print ("IP ");
  lcd.print(Ethernet.localIP());
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print ("MAC ");    
  lcd.print (macch);

  Serial.println();
  Serial.print("IP Address is ");
  Serial.println(Ethernet.localIP());


  Serial.print ("MAC ");
  Serial.println (macch);
  delay (2500);
  lcd.clear ();
  lcd.home ();
  lcd.print ("   ");
  lcd.print((char)223);
  lcd.print ("C");
  lcd.setCursor ( 0, 1 );
  lcd.print ("   ");

  lcd.print ("%     ppm");




}

void loop() {
  delay (500);

  lcd.home ();
  if (DHT22) DHTRead();
  if (K30)  co2();

  delay (3000);
  Serial.print("frmem()=");
  Serial.println(freeMemory());
  //debug
  if (client.connected()) Serial.println ("client connected");


  Serial.println ("client stopped");

  Serial.print ("lastConnectionTime= ");
  Serial.println (lastConnectionTime);
  Serial.print ("postingInterval= ");
  Serial.println (postingInterval);
  Serial.print ("millis= ");
  Serial.println (millis());
  Serial.print ("CurTemp=");
  Serial.println (CurTemp);
  Serial.print ("CurHum=");
  Serial.println (CurHum);
  Serial.print("frmem()=");
  Serial.println(freeMemory());

  //debug
  if (client.connected() && lastConnected) {
    client.stop();
  }
  if(!client.connected() && ((millis() - lastConnectionTime )> postingInterval))   {
    formingPOST ();

  }
  lastConnected = client.connected();

  delay (1000);



}



void co2 (){ //reading data from CO2 sensor
  itoa (K_30.getCO2('p'),ppm,10);
  //Print the value on Serial
  Serial.print("Co2 =");
  Serial.println(ppm);
  lcd.setCursor (9,0);
  lcd.print ("     ");
  lcd.setCursor (9,0);
  lcd.print (ppm);

}


void formingPOST (){

  Serial.println ("forming POST");

  //формирование HTTP-запроса. Preparing http request.
  memset(replyBuffer, 0, sizeof(replyBuffer));
  strcpy(replyBuffer,"ID=");
  strcat(replyBuffer,macch);
  //Конвертируем MAC-адрес. Converting mac address.

  //конвертируем адрес термодатчика. Converting first sensor address.
  Serial.print ("Here is our replyBuffer");
  Serial.println (replyBuffer);
  strcat(replyBuffer,"&");
  strcat(replyBuffer,macch);
  strcat(replyBuffer,"01");
  Serial.print ("Here is our replyBuffer");
  Serial.println (replyBuffer);
  //конвертируем адрес датчика влажности. Converting secong sensor address.
  strcat(replyBuffer,"=");
  if (SignBit)
  {
    strcat(replyBuffer,"-");
    Serial.println (" Beware of Minus !!! ");
  }

  strcat(replyBuffer,CurTemp);
  strcat(replyBuffer,"&");
  strcat(replyBuffer,macch);
  strcat(replyBuffer,"02");
  strcat(replyBuffer,"=");
  strcat(replyBuffer,CurHum);
  strcat(replyBuffer,"&");
  strcat(replyBuffer,macch);
  strcat(replyBuffer,"03");
  strcat(replyBuffer,"=");
  Serial.print ("Here is our ppm");
  Serial.println (ppm);
  strcat(replyBuffer,ppm);
  Serial.print ("Here is our replyBuffer");
  Serial.println (replyBuffer);
  httpRequest();



}

void httpRequest() {
  Serial.print ("staring to POST request");

  if (client.connect(server, 80)) {

    // send the HTTP POST request:
    client.println("POST http://narodmon.ru/post.php HTTP/1.0");
    Serial.println("POST http://narodmon.ru/post.php HTTP/1.0");
    client.println("Host: narodmon.ru");
    Serial.println("Host: narodmon.ru");
    //client.println("User-Agent: arduino-ethernet");
    //client.println("Connection: close");
    client.println("Content-Type: application/x-www-form-urlencoded");
    Serial.println("Content-Type: application/x-www-form-urlencoded");
    client.print("Content-Length: ");
    client.println(strlen(replyBuffer));
    Serial.print("Content-Length: ");
    Serial.println(strlen(replyBuffer));
    client.println();
    Serial.println();
    client.println(replyBuffer);
    Serial.println(replyBuffer);
    client.println();

    delay(1000);
  }
  else {
    Serial.print("http request failed - client not connected");
    client.stop();
  }
  lastConnectionTime = millis();
}

void DHTRead (){

  int chk = DHT.read22(DHT_P);
  Serial.print(chk);
  switch (chk)
  {
  case DHTLIB_OK:
    Serial.println("DHT OK,\t");
    delay (1000);
    dtostrf(DHT.temperature, 3, 0, CurTemp);
    Serial.print("temp and hum");
    Serial.print (CurTemp);

    Serial.print(",\t");
    delay (1000);
    dtostrf(DHT.humidity, 3, 0, CurHum);
    Serial.println (CurHum);
    lcd.setCursor(0,0);
    lcd.print ("   ");
    lcd.setCursor (0,1);
    lcd.print ("   ");
    lcd.setCursor(0,0);
    lcd.print (CurTemp);
    lcd.setCursor (0,1);
    lcd.print (CurHum);

    break;
  case DHTLIB_ERROR_CHECKSUM:
    Serial.print("Checksum er,\t");
    break;
  case DHTLIB_ERROR_TIMEOUT:
    Serial.print("Time out er,\t");
    break;
  default:
    Serial.print("Unknown er,\t");
    break;

  }


}

void genmacchar() {
  for (int k=0; k<6; k++)
  {
    int b1=mac[k]/16;
    int b2=mac[k]%16;
    char c1[2],c2[2];

    if (b1>9) c1[0]=(char)(b1-10)+'A';
    else c1[0] = (char)(b1) + '0';
    if (b2>9) c2[0]=(char)(b2-10)+'A';
    else c2[0] = (char)(b2) + '0';

    c1[1]='\0';
    c2[1]='\0';

    strcat(macch,c1);
    strcat(macch,c2);
  }
}



Выглядит непрезентабельно, комментариев мало, если будет возможность - переделаю.
ОБЯЗАТЕЛЬНО меняем mac адрес в скетче на свой или на генерируемый.

Вставляем все в корпус и запускаем. Приятной сборки.





Saturday, January 11, 2014

Anviz fingerprint + SQL

Попались в руки замечательные штуки от Anviz (С2, С3 fingerprint scanners).
Если кто не понял - ставим сканеры отпечатков пальцев на входе в офис и получаем контроль доступа в офис и контроль посещаемости рабочих мест (отслеживание опозданий, неявок, ранних уходов). Пришел сотрудник, приложил палец (любой) и автоматически в журнале отметился приход на работу, при необходимости еще и дверь/турникет открылись. Если кто то не хочет сканировать свои драгоценные пальчики - можно использовать RFID карты. На ПК можно построить отчетность по посещаемости в различных разрезах.
Чем же эти сканеры отпечатков пальцев замечательны:
  • Привлекательная цена. Контроллеры Anviz начального уровня в сборе стоят в России от 10 до 20 т.р, что уже вполне могут себе позволить пользователи малого бизнеса.
  • Простота установки. Наличие статуса "опытный пользователь" позволит произвести все процессы необходимые для запуска.

  Из минусов:
  • сложности с поддержкой (продавцы в РФ после продажи вообще на письма не реагируют, софт идущий в комплекте неработоспособен, сайт поддержки anviz.com подглючивает)
  • недостаток информации об устройстве, компонентах, интеграции. Этот минус мы здесь и пытаемся переправить на плюс.
  • глючность устройства (может перестать отвечать на запросы извне, решается перезагрузкой, в настройках устройства есть возможность установки перезагрузки по расписанию)
  • глючность софта. (кстати прошивок новых давно не выпускали).
  • не у всех людей отпечатки легко распознаются устройством. У меня статистика один к двадцати. Решается выдачей таким уникумам карточек RFID.
  • Нет поддержки PoE.
Ну и в общем очень прикольная штука, сразу несколько друзей и знакомых решили себе поставить такие в офисы. Есть еще сканеры с распознаванием лица, но пока и пальцев хватает. Со вступлением закончили.

Итак софт от Anviz (Intelligent management system, она же AIM Standard, она же имеет несколько отечественных названий) по умолчанию работает с базой данных MS Access. База располагается где то в папках вроде C:\Anviz\standard\Att2003.mdb Уточнить можно в меню "система" -> "связь с базой данных".


И все бы хорошо, но если нам необходимо построить какие либо отчеты кроме тех что стандартно зашиты в софт, нам придется обращаться к БД. Один 1С-ник сделал для себя обработку подключающуюся к БД Access и вытаскивающую нужные ему отчеты, сложного вроде ничего нет. Но во многих случаях при обращении к этой базе мы сталкиваемся с кофликтом. База данных постоянно должна быть открыта в Intelligent management system, чтобы скидывать туда данные по расписанию с наших контроллеров. А значит при обращении к базе из стороннего ПО мы можем получить ошибку монопольного доступа. Разбираться с расшариванием самой БД access я не стал, просто решил завести базу в MS SQL, благо опция есть в Intelligent management system. Для этого нам потребуется уже установленный MS SQL server, SQL Management Studio, Anviz Intelligent management system.



  • Открываем SQL Management Studio
  • Создаем в ней базу данных для наших нужд (например anviz)
  • находим в папке с установленным Intelligent management system файлик Att2003.sql. Обычно C:\Anviz\standard\Att2003.sql.
  • Открываем этот файл в SQL Management Studio
  • Указываем для какой базы выполнить набор команд (мы ведь создали её перед этим шагом) и запускаем. 
  • Проверяем базу данных, она уже должна содержать все таблицы для работы с Intelligent management system.


  • Запускаем Intelligent management system, указываем в пункте "система" -> "связь с базой данных" поставщика данных Microsoft OLE DB Provider for SQL Server. Название может отличаться в разных версиях, но суть одна.
  • В следующем окне выбираем SQL сервер из списка, или вводим руками один из своих sql серверов (тот на котором мы создали нашу базу данных). И выбираем базу данных на сервере. Проверяем соединение.
  • На всякий случай перегружаем Intelligent management system.

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

Теперь можем строить отчеты из бд MS SQL, например в странички Sharepoint выводить состояние посещаемости (перечень отсутствующих, регулярно опаздывающих, каждому сотруднику его табель на страничку).