# The actuation-actuator-effect pattern in use: a ridge-vent window drive in a greenhouse
# receives the command "open to 60 %", and that command's effect is a drop in the bay's air
# temperature. The two plain dul:Entity individuals are the bay's circulation fan and the bay
# air itself, which stand in a closed loop: the fan acts on the air and draws it in, and the
# air temperature is in turn what controls the fan.

@prefix dul: <http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#> .
@prefix objectwithstates: <http://delicias.dia.fi.upm.es/ontologies/ObjectWithStates.owl#> .
@prefix qudt: <http://qudt.org/schema/qudt#> .
@prefix san: <http://www.irit.fr/recherches/MELODI/ontologies/SAN#> .
@prefix situation: <http://www.ontologydesignpatterns.org/cp/owl/situation.owl#> .
@prefix ssn: <http://purl.oclc.org/NET/ssnx/ssn#> .
@prefix time: <http://www.w3.org/2006/time#> .
@prefix voaf: <http://purl.org/vocommons/voaf#> .
@prefix ex: <https://w3id.org/ontoboard/example/actuation-actuator-effect#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

ex:RidgeVentDrive a owl:NamedIndividual , san:Actuator ;
    rdfs:label "the ridge-vent window drive in greenhouse bay 4" ;
    san:hasActuatingCapability ex:VentDriveCapability ;
    san:hasEffect ex:BayAirCooling ;
    san:receivedActuation ex:OpenVentTo60Percent .

ex:VentDriveCapability a owl:NamedIndividual , san:ActuatingCapability ;
    rdfs:label "what the vent drive can do: open the sash under load, in either direction" ;
    san:hasActuatingProperty ex:VentOpeningRange .

ex:VentOpeningRange a owl:NamedIndividual , san:ActuatingProperty ;
    rdfs:label "actuation range: 0 to 100 % sash opening, in 5 % steps" .

ex:OpenVentTo60Percent a owl:NamedIndividual , san:Actuation ;
    rdfs:label "the command to open the ridge vent to 60 %" ;
    san:actuationMethodUsed ex:GearedScrewDriving ;
    san:actuationResults ex:VentSetpoint60Percent ;
    san:impactedProperty ex:BayAirTemperature .

ex:GearedScrewDriving a owl:NamedIndividual , dul:Process ;
    rdfs:label "driving the vent rack along its geared screw" .

ex:VentSetpoint60Percent a owl:NamedIndividual , san:ActuatorInput ;
    rdfs:label "the 60 % opening setpoint handed to the drive" .

ex:BayAirCooling a owl:NamedIndividual , san:Effect ;
    rdfs:label "cooling of the bay as warm air leaves through the open ridge vent" ;
    san:impacts ex:BayAirTemperature .

ex:BayAirTemperature a owl:NamedIndividual , ssn:Property ;
    rdfs:label "the air temperature in greenhouse bay 4" .

ex:CirculationFan a owl:NamedIndividual , dul:Entity ;
    rdfs:label "the horizontal airflow fan in greenhouse bay 4" ;
    san:actsOn ex:BayAir ;
    san:consumes ex:BayAir ;
    san:controlledBy ex:BayAir .

ex:BayAir a owl:NamedIndividual , dul:Entity ;
    rdfs:label "the air in greenhouse bay 4" .

ex:CommandTimeRegion a owl:NamedIndividual , dul:Region ;
    rdfs:label "when the open-vent command was issued" ;
    san:hasDateTime ex:Instant_2026_03_14T09_12 .

ex:Instant_2026_03_14T09_12 a owl:NamedIndividual , time:Instant ;
    rdfs:label "09:12 on 14 March 2026" .

# Only one direction of each inverse pair is asserted: actsOn/isActedUponBy, consumes/isConsumedBy, controlledBy/isController, receivedActuation/wasActuationSent. A reasoner adds the other.
