Install
openclaw skills install airshellAgent playbook for the AirShell open-source air quality sensor (github.com/oloapiu/airshell). Gives your agent domain knowledge about CO₂, PM2.5, temperature, and humidity — and a setup flow to connect a Sensirion SEN63C + Raspberry Pi sensor to your agent via webhook. The sensor wakes the agent when air quality needs attention. The agent decides whether to tell you.
openclaw skills install airshellAgent playbook for the AirShell air quality sensor.
Trigger: Any message containing Use skill:airshell or mentioning AirShell.
Read this skill, then act. Don't summarize it back to the user.
Before handling any message, check if references/deployment.md exists and is filled in.
The sensor has no deployment context yet. Interview the user to configure it properly.
Read all reference docs first, then ask these questions one at a time (don't dump them all at once):
Based on the answers:
references/deployment.md with the deployment context and agreed thresholdsopenclaw gateway status)."After setup, references/deployment.md contains:
Always read this file before interpreting readings or giving advice.
Before giving ventilation advice (for any alarm — including CO₂), check outdoor conditions:
GET https://api.open-meteo.com/v1/forecast
?latitude={lat}&longitude={lon}
¤t=temperature_2m,relative_humidity_2m,pm2p5
&timezone=auto
Get lat/lon from references/deployment.md → location.
Decision logic:
Never suggest opening a window if outdoor conditions are worse than indoor.
Read these before interpreting readings or recommending thresholds:
references/co2.md — CO₂ thresholds, causes, advicereferences/pm25.md — PM2.5 thresholds, causes, advicereferences/temp_humidity.md — Temperature and humidity standardsreferences/deployment.md — This specific installation (created during setup)references/deployment.md for contextGET {device_url}/statusGET {device_url}/api/readings?last=30mSame as RAISED but more direct — the user may not have acted yet. Include how long it's been raised.
Usually no notification needed. Exceptions:
Acknowledge quietly. No notification needed unless something looks wrong.
Query the sensor:
GET {device_url}/status → current values + alarm state
GET {device_url}/api/readings?last=2h → recent trend
GET {device_url}/readings?limit=60 → last 60 readings
Report key metrics in plain language. Reference docs for interpretation if a value is borderline.
references/deployment.mdConfig is pushed via POST {device_url}/config.
Get device_url from references/deployment.md. Always include the gateway section.
{
"skill": "airshell",
"device_id": "{device_id}",
"alarms": {
"co2_high": {
"measurand": "co2",
"operator": ">",
"raise": 800,
"clear": 700,
"smoothing_min": 5
},
"pm25_high": {
"measurand": "pm25",
"operator": ">",
"raise": 50,
"clear": 35,
"smoothing_min": 3
},
"temp_high": {
"measurand": "temp",
"operator": ">",
"raise": 24,
"clear": 22,
"smoothing_min": 10
},
"temp_low": {
"measurand": "temp",
"operator": "<",
"raise": 18,
"clear": 20,
"smoothing_min": 10
},
"humidity_high": {
"measurand": "humidity",
"operator": ">",
"raise": 65,
"clear": 60,
"smoothing_min": 10
},
"humidity_low": {
"measurand": "humidity",
"operator": "<",
"raise": 30,
"clear": 35,
"smoothing_min": 10
}
},
"notifications": {
"default": {
"on_raise": true,
"on_clear": false,
"repeat": {
"enabled": true,
"mode": "escalating",
"intervals_min": [30, 20, 10]
}
}
},
"location": {
"latitude": "{lat}",
"longitude": "{lon}",
"description": "{city}"
},
"gateway": {
"webhook_url": "{your_webhook_url}",
"token": "{your_webhook_token}",
"channel": "{channel}",
"to": "{recipient_id}"
}
}
Fill in values from references/deployment.md. Adjust thresholds per occupant type — the reference docs explain what's appropriate for infants, elderly, general adults, etc.
If references/deployment.md has a ## Purifier Control section with script and python paths:
{python} {script} {speed_high} to ramp up the purifier{python} {script} {speed_low} to drop it back to quietRun silently in the background — don't mention it to the user unless it fails. If the script fails (non-zero exit), note it briefly: "Tried to adjust the purifier but hit an error — you may need to set it manually."
If no purifier config in deployment.md, skip this entirely.