Sprawdzanie IP, automatyzacja

Panowie mam dane IP dajmy na to 8.8.8.8 w pomocniku text input_text.ip , i teraz chciałbym dynamicznie sprawdzać czy dane ip gdy się zmieni w pomocniku stoi za vpn lub proxy za pośrednictwem https://proxycheck.io/. Czyli na przykład https://proxycheck.io/v3/8.8.8.8 zwraca json w postaci jak poniżej ,chodzi mi tylko o wyciągnięcie wartości czy “proxy” lub “vpn” są true. I dalej chciałbym powiadomienie np w automatyzacji np " Uwaga połączenie poprzez vpn czy podobnie. Jak to można ugryźć za pomocą HA.

{
   "status": "ok",
   "8.8.8.8": {
       "network": {
           "asn": "AS15169",
           "range": "8.8.8.0/24",
           "hostname": "dns.google",
           "provider": "Google LLC",
           "organisation": "Level 3",
           "type": "Business"
       },
       "location": {
           "continent_name": "North America",
           "continent_code": "NA",
           "country_name": "United States",
           "country_code": "US",
           "region_name": "California",
           "region_code": "CA",
           "city_name": "Mountain View",
           "postal_code": "94043",
           "latitude": 37.422,
           "longitude": -122.085,
           "timezone": "America/Los_Angeles",
           "currency": {
               "name": "Dollar",
               "code": "USD",
               "symbol": "$"
           }
       },
       "device_estimate": {
           "address": 0,
           "subnet": 6
       },
       "detections": {
           "proxy": false,
           "vpn": false,
           "compromised": false,
           "scraper": false,
           "tor": false,
           "hosting": false,
           "anonymous": false,
           "risk": 0,
           "confidence": 100,
           "first_seen": null,
           "last_seen": null
       },
       "last_updated": "2026-02-01T10:57:48Z"
   },
   "query_time": 11
}

Najlepiej to zrobić przez RESTful Sensor.
Można w nim zrobić dynamiczne zapytania URL i wyciągać dane z JSON.

To sobie wklej do configuration.yaml. Przez to że adres IP w JSON-ie pojawia się jako klucz (np. “8.8.8.8”: { … }), użyjemy value_json[states('input_text.ip')] aby dynamicznie się do niego odwołać.

sensor:
  - platform: rest
    name: "Status VPN Proxy"
    # Adres URL budowany dynamicznie na podstawie pomocnika
    resource_template: "https://proxycheck.io/v2/{{ states('input_text.ip') }}?vpn=1"
    value_template: >
      {% set ip = states('input_text.ip') %}
      {% if value_json[ip] is defined %}
        {% if value_json[ip].proxy == 'yes' or value_json[ip].vpn == 'yes' %}
          wykryto
        {% else %}
          bezpieczny
        {% endif %}
      {% else %}
        brak_danych
      {% endif %}
    # Wyciągamy szczegóły do atrybutów, by użyć ich w powiadomieniu
    json_attributes_path: "$.['{{ states('input_text.ip') }}']"
    json_attributes:
      - proxy
      - vpn
      - type
    # Odświeżanie (API proxycheck ma limity, więc uważaj z małym interwałem)
    scan_interval: 60

W automatyzacji może sobie poradzisz ale masz tu szkic:

automation:
  - alias: "Powiadomienie o VPN/Proxy"
    trigger:
      - platform: state
        entity_id: sensor.status_vpn_proxy
        to: "wykryto"
    action:
      - service: notify.mobile_app_twoj_telefon
        data:
          title: "⚠️ Wykryto połączenie VPN/Proxy"
          message: >
            Adres IP {{ states('input_text.ip') }} jest maskowany.
            Typ: {{ state_attr('sensor.status_vpn_proxy', 'type') }}
            Proxy: {{ state_attr('sensor.status_vpn_proxy', 'proxy') }}
            VPN: {{ state_attr('sensor.status_vpn_proxy', 'vpn') }}

Kilka ważnych uwag:
API Key: Jeśli masz darmowe konto na proxycheck.io warto dodać klucz API do adresu URL (&key=TWOJ_KLUCZ), aby zwiększyć limit.

W kodzie użyłem endpointu /v2/ ponieważ jest standardem dla prostych zapytań, ale /v3/ zadziała analogicznie (sprawdź tylko czy struktura JSON się nie zmienia).

Jeśli chcesz, aby sensor sprawdzał IP natychmiast po zmianie pomocnika (nie czekając na scan_interval) dodaj w automatyzacji akcję:

- service: homeassistant.update_entity
  target:
    entity_id: sensor.status_vpn_proxy

Jak coś to myślałem to na szybko więc mogą być błędy.

Popraw sobie ten szkic automatyzacji bo coś źle przekleilo.z HA.

Rozumiem chęć kolegi do pomocy ale z tego co widzę ,mając podstawowe doświadczenie z HA to zadziałać nie może , przypuszczam że wygenerowane za pomocą “sztucznej inteligencji”. Na pierwszy rzut oka nie może działać choćby przez to ,że jak widać proxy w jsonie nie przyjmuje wartości “yes” tylko “true” (to akurat łatwo edytować) . Stan jest wywoływany w automatyzacji jako wykryty , niestety takiego realnie nie przyjmie. Składnia automatyzacji kompletnie rozjechana. Niestety próbuje sobie z tym poradzić od dłuższego czasu i nie mogę ,sztuczna inteligencja kompletnie sobie z tym nie radzi.

Wyciąganie konkretnych wartości z tego co zwraca json masz na przykład tutaj:

2 polubienia

Mi się wydaje że to jest dobre rozumowanie jedynie co bym zmienił to scan interwał na większy bo proxycheck obsługuje chyba max 1000 zapytań na 24h. Być może masz rację z tym yas/no choć nie jestem pewny bo ekleiłeś JSON z V3 ale jeśli tak naprawdę jest to trzeba

{% if value_json[ip].proxy|string|lower == 'yes' or value_json[ip].proxy == true %}
  wykryto
{% else %}
  bezpieczny
{% endif %}

To obsługuje i yes i true

Jeśli się mylę to mnie poprawcie.

Mogłem to przetestować zanim zabrałem się za pomoc ale narazie nie ma mnie w domu.

Przetestowałe ten kod i u mnie działa:

Screen z HA:

image

1 polubienie

Działa jednak jeszcze kawałek do sukcesu. Kolega podał wyżej wynik dla json v2 a dla json w przypadku przykladowe go IP https://proxycheck.io/v2/185.156.173.22

{
    "status": "ok",
    "185.156.173.22": {
        "proxy": "no",
        "type": "Business"
    }
}

Jednak dla wersji v3 dla tego samego IP https://proxycheck.io/v3/185.156.173.22 wynik jest taki

{
    "status": "ok",
    "185.156.173.22": {
        "network": {
            "asn": "AS9009",
            "range": "185.156.173.22/27",
            "hostname": null,
            "provider": "M247 Europe SRL",
            "organisation": "M247 LTD",
            "type": "Hosting"
        },
        "location": {
            "continent_name": "Europe",
            "continent_code": "EU",
            "country_name": "France",
            "country_code": "FR",
            "region_name": "Île-de-France",
            "region_code": "IDF",
            "city_name": "Saint-Denis",
            "postal_code": "93200",
            "latitude": 48.9316,
            "longitude": 2.3563,
            "timezone": "Europe/Paris",
            "currency": {
                "name": "Euro",
                "code": "EUR",
                "symbol": "€"
            }
        },
        "device_estimate": {
            "address": 10,
            "subnet": 60
        },
        "detections": {
            "proxy": false,
            "vpn": true,
            "compromised": false,
            "scraper": false,
            "tor": false,
            "hosting": true,
            "anonymous": true,
            "risk": 50,
            "confidence": 100,
            "first_seen": "2026-02-02T15:10:26Z",
            "last_seen": "2026-02-02T15:10:26Z"
        },
        "last_updated": "2026-02-01T10:57:48Z"
    },
    "query_time": 103
}

Z góry dziękuje za poświęcony czas. Głównie chodzi o sprawdzenie tych 3 pozycji . proxy , tor , vpn. Niestety w wersji v2 sprawdza tylko proxy.

Działa , dziękuje koledze za naprowadzenie. Zostawiam dla potomnych

  - platform: rest
    name: "Status VPN Proxy"
    resource_template: "https://proxycheck.io/v3/{{ states('input_text.ip') }}?vpn=1"
    scan_interval: 0  # brak automatycznego odświeżania
    value_template: >
      {% set ip = states('input_text.ip') %}
      {% if value_json[ip] is defined and value_json[ip].detections is defined %}
        {% if value_json[ip].detections.proxy or value_json[ip].detections.vpn %}
          wykryto
        {% else %}
          bezpieczny
        {% endif %}
      {% else %}
        brak_danych
      {% endif %}
    json_attributes_path: "$.['{{ states('input_text.ip') }}'].detections"
    json_attributes:
      - proxy
      - vpn
      - hosting
      - anonymous
      - risk
      - confidence

I automatyzacja odświeżająca sensor przy zmianie wartośći input_text.ip

alias: Nowa automatyzacja
description: ""
triggers:
  - trigger: state
    entity_id:
      - input_text.ip
conditions: []
actions:
  - action: homeassistant.update_entity
    metadata: {}
    data:
      entity_id:
        - sensor.status_vpn_proxy
mode: single

1 polubienie