Створити

Як уникнути штрафів за паркування з Pipedream

Привіт, сьогодні в чаті поставили питання про те як розпізнати текст з камери і я згадав про прикольний сервіс, яким переодично користуюся для того щоб автоматизувати різні процеси, наприклад раз на день збирати заголовки новин з Економічної правди та додавати у UJournal. І я вирішив знайти той блог пост з якого почалося знайомство з цим сервісом та перекласти українською. Я юзав цей сервіс безкоштовно деякий час і він мені допоміг тому це буде правильно розказати про нього. Далі переклад блог посту Avoiding parking tickets with Pipedream.

Я виріс в Оклахомі. У цьому місті відчувається брак громадського транспорту, тож ти всюди їздиш на машині. Саме місто величезне воно на 100 квадратних миль, більше ніж Лос-Анжелес!

Але 10 років тому я переїхав до Сан-Франциско де я став багато їздити на велосипеді, тому став рідше користуватися машиною. Тут є департамент громадських робіт, який прибирає вулиці за графіком і якщо ваша машина буде заважати і ви не перепаркуєте її до початку прибирання, вас оштрафують.

Розклад прибирання на кожній вулиці свій. Наприклад, один квартал можут прибирати у понеділок, інший у середу. І тут є проблема: я завжди забуваю прибрати машину в потрібний час. Оскільки я рідко їздив на машині я врешті решт продав її.

Швидка перемотка вперед до сьогодення. У нас з дружиною зʼявилась дитина:

І ми купили нову машину. Спогади про штрафи повернулися. Мені потрібно було щось, що нагадувало б мені перепаркувати машину у час прибирання. Дуже захотілося знайти спосіб перетворити цей знак:

у нагадування в Google Календарі:

Тож я вирішив автоматизувати це, використовуючи iOS Shorcuts і Pipedream. Можливо вам ніколи не доведеться паркувати машину у Сан-Франциско, але маю надію, що мій досвід з вирішення реальної проблеми стане вам в нагоді і ви зможете автоматизувати свою повсякденну працю.

Що таке Pipedream?

Pipedream — це платформа для розробників завдяки якої ви зможете поїднати декілька API або бібліотек. За її допомоги можно запускати робочі процеси які складаються з набору кроків. Робочі процеси можно запускати за HTTP-запитом (за лінкою), за вхідним емейлом, за розкладом, або у відповідь на подію як-то новий твіт, або новий файл завантажений на Google Диск, тощо.

При створенні робочого процесу ви можете використовувати вже створені дії, які виконують операції в понад 300 програмах, наприклад “створити нову подію в календарі” або "надіслати електронного листа. Для більш складних варіантів ви можете написати код на NodeJS.

Ви можете розглядати Pipedream як суміш інструментів інтеграції, таких як Zapier / IFTTT, і безсерверних платформ, таких як AWS Lambda / Google Cloud Functions.

Мої перші спроби вилучити текст з знаків

Хочу розповісти про усі невдалі спроби обробити інформацію реального світу і можу сказати, що світ створює брудні дані.

Оскільки вуличні знаки мають графік прибирання, я подумав, що зможу сфотографувати знак і використати текст для створення нагадувань. Я видобув текст за допомогою Google Cloud Vision API. Потім я проаналізував цей текст і отримав день і час прибирання, далі я створив нагадування в Google Календарі. Це чудово спрацювало для кількох знаків навколо мого району.

Потім я натрапив на цей поганий знак:

далі був другий поганий знак:

Стало зрозуміло, що я не міг покладатися на читання тексту з кожного знака. Мені потрібен був інший підхід.

На допомогу приходить DataSF

Уряд міста Сан-Франциско керує порталом «відкритих даних» під назвою DataSF. Команда DataSF отримує дані з різних міських департаментів і об’єднує їх в єдиний масив данних.

Будь хто може завантажити статистику щодо COVID-19, дзвінків у 911, карту дорожнього руху та сотню інших загальнодоступних наборів даних. І ще чудово, що усі дані доступні через API.

Я вже використовував DataSF у минилих проєктах, тому вирішив пошукати на їхньому порталі “прибирання вулиць”. І що ви знаєте? Вони надають графік прибирання усіх вулиць міста!

Кожен запис у цьому наборі даних мав таку структуру:

  1. Centerline Network Number (CNN) – унікальний ідентифікатор для районів міста
  2. Сторона вулиці, до якої відноситься цей графік прибирання (на різних сторонах різні розклади)
  3. День і час прибирання для цієї сторони вулиці, приклад: Середа з 12:00 до 14:00
  4. Географічні та геометричні данні про те де розташована і як виглядає вулиця (WKT)

Останнє значення (WKT) це LINESTRING: пари значень (довгота, широта), які складають лінію.

LINESTRING ( -122.485667402435 37.778117247851,  -122.485532329198 37.776252458259 )

Для того щоб отримати розклад прибирання, я вирішив знайти WKT-лінію вулиці, найближчу до місця мого паркування. У мене не було досвіду роботи з геоданними, тому мені було не зрозуміло як вирішувати цю проблему.

DataSF працює на платформі Socrata. Коли ви робите запити API до DataSF, ви використовуєте API Socrata. Вони надають список функцій, які можна використовувати в запитах API. Я проглянув цей список і знайшов функцію intersects(), яка «дозволяє вам порівнювати два геопросторові типи, щоб побачити, чи вони перетинаються або перекривають один одного».

Замість того, щоб шукати найближчу вулицю (або WKT-лінію) до моєї машини, я міг би змінити формулювання проблеми: я хочу знайти вулицю, яка збігається з моїм поточним місцезнаходженням.

Щоб дізнатися своє поточне місцезнаходження я можу використовувати свій телефон. Але моє місцезнаходження — це точка, а відрізок вулиці — лінія в центрі вулиці. Це геометричні обʼекти, які не перетинаються.

Я вирішив намалювати рамку навколо нашого поточного місцезнаходження на кілька метрів у кожному напрямку. З точки зору WKT, це поле є ПОЛІГОНОМ, і ми можемо запитати DataSF, чи цей багатокутник перетинається з якоюсь вулицею. Це також допомагає усунути недостатню точність GPS, розширюючи область, де ми шукаємо близькі вулиці.

Це чудово спрацювало, але виникла ще проблема. Кожена WKT-лінія вулиці має два записи про прибирання: один для лівого боку вулиці, інший для правого. WKT лінія з обох боків проходила по центру вулиці, тому неможливо визначити, праворуч ви чи ліворуч, порівнюючи відстань від вашого поточного місцезнаходження. А оскільки GPS не є ідеально точним, я б не хотів, щоб програма обирала невірну сторону.

Існує неочевидне, але просте рішення цієї проблеми: просто дайте мені вибрати правильний час зі списку.

Тепер треба склеїти все разом за допомогою iOS Shorcuts

У ранніх версіях цього проекту, коли я фотографував вуличні знаки, я теж використовував iOS Shorcuts.

iOS Shorcuts це таке середовище для автоматизації iOS “без коду”. За допомогою цього середовища можно отримати координати свого поточного місцезнаходження, фотографувати або зробити HTTP-запити, тощо. Навіть можно користуватися операторами IF/THEN або циклом FOR. А ще можно запросити користувача обрати варіант зі списку. Тож я використав DataSF API, щоб знайти найближчу вулицю та її графік прибирання, а потім показав список з якого я можу обрати потрібний варіант.

(Для Android існує Tasker, який пропонує подібні функції).

Ось як працює автоматизація:

  1. iOS Shorcuts: отримує поточне місцезнаходження
  2. iOS Shorcuts: надсилає це місце в Pipedream (HTTP-запит)
  3. Pipedream: отримує графік прибирання вулиці у цьому місці
  4. iOS Shorcuts: показує розкладу прибирання у вигляді списку з метою обрати один варіант
  5. iOS Shorcuts: надсилає обраний розклад і місце в Pipedream (HTTP-запит)
  6. Pipedream: видаляє старі нагадування, створює нагадування Google Календар із поточним місцем розташування

І поки що в мене немає штрафів!

Підсумок

Проблеми з реальними данними можуть бути набагато складнішими ніж сама автоматизація, але і нагорода за їх вирішення значна. Я б не зміг закінчити цей проєкт без SFData — величезне спасибі їм за збір і оприлюднення графіків прибирання.

Джерело: pipedream.com/blog.

#pipedream, #nocode, #lowcode

8 коментарів