# Pi-hole Binding

The Pi-hole Binding is a bridge between openHAB and Pi-hole, enabling users to integrate Pi-hole statistics and controls into their home automation setup. Pi-hole is a DNS-based ad blocker that can run on a variety of platforms, including Raspberry Pi.

Pi-hole is a powerful network-level advertisement and internet tracker blocking application. By intercepting DNS requests, it can prevent unwanted content from being displayed on devices connected to your network. The Pi-hole Binding allows you to monitor Pi-hole statistics and control its functionality directly from your openHAB setup.

# Features

  • Real-time Statistics: Monitor key metrics such as the number of domains being blocked, DNS queries made today, ads blocked today, and more.
  • Control: Enable or disable Pi-hole's blocking functionality, configure blocking options, and adjust privacy settings directly from openHAB.
  • Integration: Seamlessly integrate Pi-hole data and controls with other openHAB items and rules to create advanced automation scenarios.

# Supported Things

  • server: Pi-hole server

# Thing Configuration

# server Thing Configuration

Name Type Description Default Required Advanced
hostname text Hostname or IP address of the device N/A yes no
token text Token to access the device. To generate token go to settings > API > Show API token N/A yes no
refreshInterval integer Interval the device is polled in sec. 600 no yes

# Channels

Channel Type Read/Write Description
domains-being-blocked Number RO The total number of domains currently being blocked.
dns-queries-today Number RO The count of DNS queries made today.
ads-blocked-today Number RO The number of ads blocked today.
ads-percentage-today Number RO The percentage of ads blocked today.
unique-domains Number RO The count of unique domains queried.
queries-forwarded Number RO The number of queries forwarded to an external DNS server.
queries-cached Number RO The number of queries served from the cache.
clients-ever-seen Number RO The total number of unique clients ever seen.
unique-clients Number RO The current count of unique clients.
dns-queries-all-types Number RO The total number of DNS queries of all types.
reply-unknown Number RO DNS replies with an unknown status.
reply-nodata Number RO DNS replies indicating no data.
reply-nxdomain Number RO DNS replies indicating non-existent domain.
reply-cname Number RO DNS replies with a CNAME record.
reply-ip Number RO DNS replies with an IP address.
reply-domain Number RO DNS replies with a domain name.
reply-rrname Number RO DNS replies with a resource record name.
reply-servfail Number RO DNS replies indicating a server failure.
reply-refused Number RO DNS replies indicating refusal.
reply-notimp Number RO DNS replies indicating not implemented.
reply-other Number RO DNS replies with other statuses.
reply-dnssec Number RO DNS replies with DNSSEC information.
reply-none Number RO DNS replies with no data.
reply-blob Number RO DNS replies with a BLOB (binary large object).
dns-queries-all-replies Number RO The total number of DNS queries with all reply types.
privacy-level Number RO The privacy level setting.
enabled Switch RO The current status of blocking
disable-enable String RW Is blocking enabled/disabled
gravity-last-update DateTime RO Last update of gravity
gravity-file-exists DateTime RO Does gravity file exists

# Full Example

# Thing Configuration

Thing pihole:server:a4a077edb8 "Pi-hole" @ "Location"
[
    refreshIntervalSeconds=600,
    hostname="http://123.456.7.89",
    token="as654gadf3h1dsfh654dfh6fh7et654asd3g21fh654eth8t4swd4g3s1g65sfg5"
] {
    Channels:
        Type number : domains_being_blocked "Domains Blocked" [ ]
        Type number : dns_queries_today "DNS Queries Today" [ ]
        Type number : ads_blocked_today "Ads Blocked Today" [ ]
        Type number : ads_percentage_today "Ads Percentage Today" [ ]
        Type number : unique_domains "Unique Domains" [ ]
        Type number : queries_forwarded "Queries Forwarded" [ ]
        Type number : queries_cached "Queries Cached" [ ]
        Type number : clients_ever_seen "Clients Ever Seen" [ ]
        Type number : unique_clients "Unique Clients" [ ]
        Type number : dns_queries_all_types "DNS Queries (All Types)" [ ]
        Type number : reply_UNKNOWN "Reply UNKNOWN" [ ]
        Type number : reply_NODATA "Reply NODATA" [ ]
        Type number : reply_NXDOMAIN "Reply NXDOMAIN" [ ]
        Type number : reply_CNAME "Reply CNAME" [ ]
        Type number : reply_IP "Reply IP" [ ]
        Type number : reply_DOMAIN "Reply DOMAIN" [ ]
        Type number : reply_RRNAME "Reply RRNAME" [ ]
        Type number : reply_SERVFAIL "Reply SERVFAIL" [ ]
        Type number : reply_REFUSED "Reply REFUSED" [ ]
        Type number : reply_NOTIMP "Reply NOTIMP" [ ]
        Type number : reply_OTHER "Reply OTHER" [ ]
        Type number : reply_DNSSEC "Reply DNSSEC" [ ]
        Type number : reply_NONE "Reply NONE" [ ]
        Type number : reply_BLOB "Reply BLOB" [ ]
        Type number : dns_queries_all_replies "DNS Queries (All Replies)" [ ]
        Type number : privacy_level "Privacy Level" [ ]
        Type switch : enabled "Status" [ ]
        Type string : disable-enable "Disable Blocking" [ ]
}

# Item Configuration

Number domains_being_blocked "Domains Blocked" { channel="pihole:server:a4a077edb8:domains_being_blocked" }
Number dns_queries_today "DNS Queries Today" { channel="pihole:server:a4a077edb8:dns_queries_today" }
Number ads_blocked_today "Ads Blocked Today" { channel="pihole:server:a4a077edb8:ads_blocked_today" }
Number ads_percentage_today "Ads Percentage Today" { channel="pihole:server:a4a077edb8:ads_percentage_today" }
Number unique_domains "Unique Domains" { channel="pihole:server:a4a077edb8:unique_domains" }
Number queries_forwarded "Queries Forwarded" { channel="pihole:server:a4a077edb8:queries_forwarded" }
Number queries_cached "Queries Cached" { channel="pihole:server:a4a077edb8:queries_cached" }
Number clients_ever_seen "Clients Ever Seen" { channel="pihole:server:a4a077edb8:clients_ever_seen" }
Number unique_clients "Unique Clients" { channel="pihole:server:a4a077edb8:unique_clients" }
Number dns_queries_all_types "DNS Queries (All Types)" { channel="pihole:server:a4a077edb8:dns_queries_all_types" }
Number reply_UNKNOWN "Reply UNKNOWN" { channel="pihole:server:a4a077edb8:reply_UNKNOWN" }
Number reply_NODATA "Reply NODATA" { channel="pihole:server:a4a077edb8:reply_NODATA" }
Number reply_NXDOMAIN "Reply NXDOMAIN" { channel="pihole:server:a4a077edb8:reply_NXDOMAIN" }
Number reply_CNAME "Reply CNAME" { channel="pihole:server:a4a077edb8:reply_CNAME" }
Number reply_IP "Reply IP" { channel="pihole:server:a4a077edb8:reply_IP" }
Number reply_DOMAIN "Reply DOMAIN" { channel="pihole:server:a4a077edb8:reply_DOMAIN" }
Number reply_RRNAME "Reply RRNAME" { channel="pihole:server:a4a077edb8:reply_RRNAME" }
Number reply_SERVFAIL "Reply SERVFAIL" { channel="pihole:server:a4a077edb8:reply_SERVFAIL" }
Number reply_REFUSED "Reply REFUSED" { channel="pihole:server:a4a077edb8:reply_REFUSED" }
Number reply_NOTIMP "Reply NOTIMP" { channel="pihole:server:a4a077edb8:reply_NOTIMP" }
Number reply_OTHER "Reply OTHER" { channel="pihole:server:a4a077edb8:reply_OTHER" }
Number reply_DNSSEC "Reply DNSSEC" { channel="pihole:server:a4a077edb8:reply_DNSSEC" }
Number reply_NONE "Reply NONE" { channel="pihole:server:a4a077edb8:reply_NONE" }
Number reply_BLOB "Reply BLOB" { channel="pihole:server:a4a077edb8:reply_BLOB" }
Number dns_queries_all_replies "DNS Queries (All Replies)" { channel="pihole:server:a4a077edb8:dns_queries_all_replies" }
Number privacy_level "Privacy Level" { channel="pihole:server:a4a077edb8:privacy_level" }
Switch enabled "Status" { channel="pihole:server:a4a077edb8:enabled" }
String disable_enable "Disable Blocking" { channel="pihole:server:a4a077edb8:disable-enable" }

# Actions

Pi-hole binding provides actions to use in rules:

import java.util.concurrent.TimeUnit

rule "test"
when
    /* when */
then
	val actions = getActions("pihole", "pihole:server:as8af03m38")
	if (actions !== null) {
            // disable blocking for 5 * 60 seconds (5 minutes)
            actions.disableBlocking(5 * 60)

            // disable blocking for 5 minutes
            actions.disableBlocking(5, TimeUnit.MINUTES)

            // disable blocking for infinity
            actions.disableBlocking(0)
            actions.disableBlocking()

            // enable blocking
            actions.enableBlocking()
	}
end