Lemmy Lemmy 6 жовтня 2022, 15:16

Як уникнути штрафів за паркування з 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

  • 10
  • 8
  • 11

8 коментарів

  • HimarsTime HimarsTime 3 роки тому

    «Саме місто вели­че­зне це понад 100 тисяч ква­дра­тних миль»

    Думаю не місто, а Штат

    • 0
    • HimarsTime HimarsTime 3 роки тому

      Він вка­зав роз­мір міста, напи­сав­ши роз­мір штату

      • 0
    • Lemmy Lemmy 3 роки тому · Автор

      Тут напев­но я напо­ров, тому що Пло­ща: 1 608 км², а я додав тися­чі, випавляюсь 

      • 0
    • Lemmy Lemmy 3 роки тому · Автор

      Пере­ро­бив на:

      Саме місто вели­че­зне воно на 100 ква­дра­тних миль, біль­ше ніж Лос-Анжелес!

      • 0
    • Lemmy Lemmy 3 роки тому · Автор

      Так, вирі­шив зали­ши­ти як у ори­гі­на­ли, бо річ про аме­ри­ку а там всі від­ста­ні в милях.

      • 0