Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add personamanagmentlayer/pcl --skill iot-expertgit clone --depth 1 https://github.com/personamanagmentlayer/pclWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/personamanagmentlayer/pcl/iot-expert)<a href="https://agentmods.dev/skills/personamanagmentlayer/pcl/iot-expert"><img src="https://agentmods.dev/badge/skills/personamanagmentlayer/pcl/iot-expert/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/personamanagmentlayer/pcl/iot-expert"><img src="https://agentmods.dev/badge/skills/personamanagmentlayer/pcl/iot-expert.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00059 | $0.02776 |
| Opus 5 | $0.00030 | $0.01388 |
| Sonnet 5 | $0.00012 | $0.00555 |
| Haiku 4.5 | $0.00006 | $0.00278 |
Grade A, and why
iot-expert scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 4d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 441 lines — stays where its author put it; the contents beside it link to each section on GitHub.
IoT Expert
Expert guidance for IoT systems, embedded devices, edge computing, sensor networks, and IoT protocols.
Core Concepts
IoT Architecture
- Device layer (sensors, actuators)
- Edge computing layer
- Network layer (connectivity)
- Cloud/platform layer
- Application layer
- Security across all layers
IoT Protocols
- MQTT (Message Queuing Telemetry Transport)
- CoAP (Constrained Application Protocol)
- HTTP/REST for IoT
- WebSocket for real-time
- LoRaWAN for long-range
- Zigbee, Z-Wave for home automation
Embedded Systems
- Microcontroller programming
- Real-time operating systems (RTOS)
- Power management
- Firmware updates (OTA)
- Hardware interfaces (I2C, SPI, UART)
- Memory constraints
MQTT Implementation
import paho.mqtt.client as mqtt
import json
from datetime import datetime
from typing import Callable, Dict
class MQTTClient:
def __init__(self, broker: str, port: int = 1883, client_id: str = "iot_device"):
self.broker = broker
self.port = port
self.client = mqtt.Client(client_id)
self.subscriptions: Dict[str, Callable] = {}
self.client.on_connect = self._on_connect
self.client.on_message = self._on_message
self.client.on_disconnect = self._on_disconnect
def _on_connect(self, client, userdata, flags, rc):
if rc == 0:
print(f"Connected to MQTT broker at {self.broker}:{self.port}")
# Resubscribe to topics on reconnect
for topic in self.subscriptions.keys():
self.client.subscribe(topic)
else:
print(f"Connection failed with code {rc}")
def _on_message(self, client, userdata, msg):
topic = msg.topic
payload = msg.payload.decode()
if topic in self.subscriptions:
try:
data = json.loads(payload)
self.subscriptions[topic](data)
except json.JSONDecodeError:
self.subscriptions[topic](payload)
def _on_disconnect(self, client, userdata, rc):
if rc != 0:
print(f"Unexpected disconnect. Reconnecting...")
def connect(self, username: str = None, password: str = None):
if username and password:
self.client.username_pw_set(username, password)
self.client.connect(self.broker, self.port, 60)
self.client.loop_start()
def publish(self, topic: str, payload: Dict, qos: int = 1, retain: bool = False):
"""Publish message to MQTT topic"""
message = json.dumps(payload)
result = self.client.publish(topic, message, qos=qos, retain=retain)
return result.rc == mqtt.MQTT_ERR_SUCCESS
def subscribe(self, topic: str, callback: Callable, qos: int = 1):
"""Subscribe to MQTT topic with callback"""
self.subscriptions[topic] = callback
self.client.subscribe(topic, qos=qos)
def disconnect(self):
self.client.loop_stop()
self.client.disconnect()
# IoT Device Example
class TemperatureSensor:
def __init__(self, device_id: str, mqtt_client: MQTTClient):
self.device_id = device_id
self.mqtt = mqtt_client
self.topic = f"sensors/temperature/{device_id}"
def read_temperature(self) -> float:
# In real device, read from actual sensor
import random
return round(random.uniform(20.0, 30.0), 2)
def publish_reading(self):
temperature = self.read_temperature()
payload = {
"device_id": self.device_id,
"temperature": temperature,
"unit": "celsius",
"timestamp": datetime.utcnow().isoformat()
}
self.mqtt.publish(self.topic, payload)
return payload
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 4d ago Changed · +13 lines · +39 tokens per session 2377f0b63822
- 6d ago First seen · 428 lines · 20 tokens per session scan A b2f2baf4920e
iot-expert is a skill published in the GitHub repository personamanagmentlayer/pcl (40 stars, last pushed 2d ago), licensed Apache-2.0. It adds 59 tokens to every session and 2,776 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-03.
Other skills, from other repositories
aether-iot-query
Use this skill when the user asks about a live AetherEdge runtime: channels, points, real-time values, history, alarms, rules, models, instances, routing, SHM health, service health, or system status. Use aether CLI commands to answer — do NOT inspect source code, local database files, or config YAMLs to answer…
aether-iot
Build, integrate, diagnose, or generate applications for the AetherEdge AI-native edge kernel. Use for AetherEdge onboarding, SDK compositions, device and topology clients, read-only operations UIs, MCP integration, Domain Packs, or governed IoT commands where live-state authority and physical-device safety must be…
IoT Device Testing
IoT device testing including firmware validation, protocol testing (MQTT, CoAP), power consumption testing, and over-the-air update verification.
iot-skills
Use when developing with Raspberry Pi Pico (RP2040) for GPIO, I2C, Wi-Fi, MQTT, or sensor integration using MicroPython. Index of 1 skill: KE3036 Keyes Pico learning kit.
iot-developer
Expert in IoT development, microcontrollers, sensors, and MQTT protocols.
edge-iot
Edge computing, IoT protocols, and embedded systems integration.