Compare commits
	
		
			23 Commits
		
	
	
		
			eba065dd2d
			...
			master
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| cd68cd6811 | |||
| 2c6d185bfc | |||
| 861d1e1c4d | |||
| d75325198f | |||
| a259542870 | |||
| b9e92cd46e | |||
| 23e5caf13a | |||
| 565dac1946 | |||
| a8499a27b2 | |||
| bedd9c3011 | |||
| fd7e0df860 | |||
| 86a830897f | |||
| 058e57e1f5 | |||
| a74469bb2e | |||
| f7a842a7c1 | |||
| c92ed75f06 | |||
| 81b1aeed03 | |||
| a08c2a8c02 | |||
| 0627436adf | |||
| 15b48e375b | |||
| f48231f3b5 | |||
| 8bad9e2524 | |||
| eee1c30cac | 
							
								
								
									
										345
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -1,8 +1,5 @@
 | 
			
		||||
# SuperSensor v2.x
 | 
			
		||||
 | 
			
		||||
**NOTICE**: The Supersensor v2.x is still under development! Parts and configurations
 | 
			
		||||
may change until the design is finalized.
 | 
			
		||||
 | 
			
		||||
The SuperSensor is an all-in-one voice, motion, presence, temperature/humidity/air
 | 
			
		||||
quality, and light sensor, built on an ESP32 with ESPHome, and inspired
 | 
			
		||||
heavily by the EverythingSmartHome Everything Presence One sensor and the
 | 
			
		||||
@@ -13,8 +10,8 @@ interfaces with wake word detection, as well as other sensor detection options
 | 
			
		||||
as you want them.
 | 
			
		||||
 | 
			
		||||
Assist feedback is provided by a pair of common-cathode RGB LED. No speakers
 | 
			
		||||
or annoying TTS feedback here! With an optional 3D Printed case and a clear
 | 
			
		||||
diffuser cover, the LEDs can be turned into a sleek light bar on the bottom
 | 
			
		||||
or annoying TTS feedback here! With [an optional 3D Printed case and a clear
 | 
			
		||||
diffuser cover](/case), the LEDs can be turned into a sleek light bar on the bottom
 | 
			
		||||
of the unit for quick and easy confirmation of voice actions, or just use
 | 
			
		||||
it bare if you like the "PCB on a wall" aesthetic.
 | 
			
		||||
 | 
			
		||||
@@ -46,12 +43,12 @@ and [my update post on version 2.0](https://www.boniface.me/posts/the-supersenso
 | 
			
		||||
 | 
			
		||||
2. Replaced the SR602 PIR sensor with the AM312 PIR sensor.
 | 
			
		||||
 | 
			
		||||
   The SR602 was, in my experience, prone to constant false misfirings even in completely empty rooms. In addition its orientation requirements
 | 
			
		||||
   are awkward (pins on the left or right side). While it's possible I just had a bad batch, this soured me significantly to these sensors,
 | 
			
		||||
   especially after reading many other similar reports around the internet.
 | 
			
		||||
   The SR602 was, in my experience, prone to constant false misfirings and hard to enclose due to its shape. In addition its orientation is
 | 
			
		||||
   awkward (pins on the left or right side) which made building around it difficult. Thus, this sensor has been replaced with the nicer,
 | 
			
		||||
   more straight AM312 PIR design. This does add vertical height to the sensor but I consider this a good tradeoff, and think it looks neat.
 | 
			
		||||
 | 
			
		||||
   Thus, this sensor has been replaced with the more reliable AM312. While the form factor fo the AM312 leaves a bit to be desired (sticking
 | 
			
		||||
   up by about 1cm more from the board), and in the end this sensor misfires just as much as the SR602, I've committed to the change.
 | 
			
		||||
   Note that like all cheap PIRs, the AM312 is prone to misfiring if exposed. For this reason, [the case](/case) is recommended for any serious
 | 
			
		||||
   PIR use-cases.
 | 
			
		||||
 | 
			
		||||
3. Completely redesigned the custom PCB around the above sensor changes, which is now more compact in a 50x55mm almost-square configuration.
 | 
			
		||||
 | 
			
		||||
@@ -63,7 +60,7 @@ and [my update post on version 2.0](https://www.boniface.me/posts/the-supersenso
 | 
			
		||||
|-------|--------------------|----------------------------------|-------|
 | 
			
		||||
| 1     | GY-SGP41           | $11.08                           | [AliExpress](https://www.aliexpress.com/item/1005006746827606.html)  |
 | 
			
		||||
| 1     | GY-SHT45           | $5.67                            | [AliExpress](https://www.aliexpress.com/item/1005008175340220.html)* |
 | 
			
		||||
| 1     | SR602              | $0.81                            | [AliExpress](https://www.aliexpress.com/item/1005001572550300.html)  |
 | 
			
		||||
| 1     | AM312              | $1.97                            | [AliExpress](https://www.aliexpress.com/item/1005008067324301.html)  |
 | 
			
		||||
| 1     | TSL2591            | $4.59                            | [AliExpress](https://www.aliexpress.com/item/1005008619462097.html)  |
 | 
			
		||||
| 1     | HL-LD2510C         | $4.79                            | [AliExpress](https://www.aliexpress.com/item/1005006000579211.html)* |
 | 
			
		||||
| 1     | INMP441            | $2.93                            | [AliExpress](https://www.aliexpress.com/item/1005002902615623.html)  |
 | 
			
		||||
@@ -72,7 +69,7 @@ and [my update post on version 2.0](https://www.boniface.me/posts/the-supersenso
 | 
			
		||||
| 1     | 470Ω resistor      | $0.08 ($7.99/100)                | [Amazon](https://www.amazon.ca/dp/B08MKQX2XT) |
 | 
			
		||||
| 2     | Female pin header† | $1.59 ($15.99/10)                | [Amazon](https://www.amazon.ca/dp/B08CMNRXJ1) |
 | 
			
		||||
| 1     | Custom PCB (JLC)   | $0.69 ($6.89/10)                 | [GitHub](https://github.com/joshuaboniface/supersensor) |
 | 
			
		||||
| **TOTAL** |                    | **$40.58**                           |       |
 | 
			
		||||
| **TOTAL** |                    | **$41.74**                           |       |
 | 
			
		||||
 | 
			
		||||
`*` Ensure you select the correct device on the page as it shows multiple options.
 | 
			
		||||
 | 
			
		||||
@@ -80,17 +77,14 @@ and [my update post on version 2.0](https://www.boniface.me/posts/the-supersenso
 | 
			
		||||
 | 
			
		||||
### To Solder or Not To Solder
 | 
			
		||||
 | 
			
		||||
Personally, for my Supersensor 1.x's and the initial batch of Supersensor 2.x's, I directly soldered
 | 
			
		||||
all the non-ESP components to the board. This proved to be a major mistake when I later decided
 | 
			
		||||
to switch from SGP30's to SGP41's after some testing and I had to desolder all of them, ruining
 | 
			
		||||
several PCBs in the process. It was also a hassle to desolder the existing sensors for reuse
 | 
			
		||||
during the 1.x to 2.x conversion.
 | 
			
		||||
I strongly encourage anyone building one of these units to leverage sockets for all components. First,
 | 
			
		||||
this provides good spacing between components which can help with general better performance. It can
 | 
			
		||||
also allow for quick swapping if any turn out to be defective or if future changes are warranted.
 | 
			
		||||
 | 
			
		||||
As a result, I actually strongly encourage anyone building one of these units to leverage sockets
 | 
			
		||||
for all components, to allow for quick swapping if any turn out to be defective or if future changes
 | 
			
		||||
are warranted.
 | 
			
		||||
**If you use the [case](/case), it is sized assuming socketed components!** So for case users you
 | 
			
		||||
must socket all components.
 | 
			
		||||
 | 
			
		||||
Note that due to the PCB design, you *must* socket at least one set of components - either the ESP32
 | 
			
		||||
Note that due to the PCB design, you *must socket at least one* set of components - either the ESP32
 | 
			
		||||
or the sensors on the front. Due to the positioning and overlap, it would be impossible to solder
 | 
			
		||||
everything directly to the board, as the ESP covers several of the solder points of the front
 | 
			
		||||
sensors and vice versa.
 | 
			
		||||
@@ -124,144 +118,7 @@ functionality, so I recommend using the provided models, but this is up to the b
 | 
			
		||||
 | 
			
		||||
No other parts can be easily swapped without code or PCB design changes.
 | 
			
		||||
 | 
			
		||||
## Configurable Options
 | 
			
		||||
 | 
			
		||||
There are several UI-configurable options with the SuperSensor to help you
 | 
			
		||||
get the most out of the sensor for your particular use-case.
 | 
			
		||||
 | 
			
		||||
**Note:** Configuration of the LD2410C is excluded here, as it is extensively
 | 
			
		||||
configurable. See [the documentation](https://esphome.io/components/sensor/ld2410.html) for more details on its options.
 | 
			
		||||
 | 
			
		||||
### Enable Voice Support (switch)
 | 
			
		||||
 | 
			
		||||
If enabled (the default), the SuperSensor's voice functionality including
 | 
			
		||||
wake word will be started, or it can be disabled to use the SuperSensor
 | 
			
		||||
purely as a presence/environmental sensor.
 | 
			
		||||
 | 
			
		||||
### Enable Presence LED (switch)
 | 
			
		||||
 | 
			
		||||
If enabled (the default), when overall presence is detected, the LEDs will
 | 
			
		||||
glow "white" at 15% power to signal presence.
 | 
			
		||||
 | 
			
		||||
### Temperature Offset (selector, -30 to +10 @ 0.1, -5 default)
 | 
			
		||||
 | 
			
		||||
Allows calibration of the SHT45 temperature sensor with an offset from -30 to +10
 | 
			
		||||
degrees C. Useful if the sensor is misreporting actual ambient tempreatures. Due
 | 
			
		||||
to internal heating of the SHT45 by the ESP32, this defaults to -5; further
 | 
			
		||||
calibration may be needed for your sensors and environment based on an external
 | 
			
		||||
reference.
 | 
			
		||||
 | 
			
		||||
### Humidity Offset (selector, -20 to +20 @ 0.1)
 | 
			
		||||
 | 
			
		||||
Allows calibration of the SHT45 humidity sensor with an offset from -10 to +10
 | 
			
		||||
percent relative humidity. Useful if the sensor is misreporting actual humidity
 | 
			
		||||
based on an external reference.
 | 
			
		||||
 | 
			
		||||
### PIR Hold Time (selector, 0 to +60 @ 5, 0 default)
 | 
			
		||||
 | 
			
		||||
The SuperSensor uses an AM312 PIR sensor, which has a stock hold time of ~2.5
 | 
			
		||||
seconds. This setting allows increasing that value, with retrigger support, to
 | 
			
		||||
up to 60 seconds, allowing the PIR detection to report for longer. 0 represents
 | 
			
		||||
"as long as the AM312 fires".
 | 
			
		||||
 | 
			
		||||
### Light Threshold Control (selector, 0 to +200 @ 5, 30 default)
 | 
			
		||||
 | 
			
		||||
The SuperSensor features a "light presence" binary sensor based on the light
 | 
			
		||||
level reported by the TSL2591 sensor. This control defines the minimum lux
 | 
			
		||||
value from the sensor to be considered "presence". For instance, if you have
 | 
			
		||||
a room that is usually dark at 0-5 lux, but illuminated to 100 lux when a
 | 
			
		||||
(non-automated) light switch is turned on, you could set a threshold here
 | 
			
		||||
of say 30 lux: then, while the light is on, "light presence" is detected,
 | 
			
		||||
and when the light is off, "light presence" is cleared. Light presence can
 | 
			
		||||
be used standalone or as part of the integrated occupancy sensor (below).
 | 
			
		||||
 | 
			
		||||
### Integrated Occupancy Sensor (Selector)
 | 
			
		||||
 | 
			
		||||
The SuperSensor features a fully integrated "occupancy" sensor, which can be
 | 
			
		||||
configured to provide exactly the sort of occupancy detection you may want
 | 
			
		||||
for your room.
 | 
			
		||||
 | 
			
		||||
There are 7 options (plus "None"/disabled), with both "detect" and "clear"
 | 
			
		||||
handled separately:
 | 
			
		||||
 | 
			
		||||
#### PIR + Radar + Light
 | 
			
		||||
 | 
			
		||||
Occupancy is detected when all 3 sensors report detected, and occupancy is
 | 
			
		||||
cleared when any of the sensors report cleared.
 | 
			
		||||
 | 
			
		||||
For detect, this provides the most "safety" against misfires, but requires
 | 
			
		||||
a normally-dark room with a non-automated light source and clear PIR
 | 
			
		||||
detection positioning.
 | 
			
		||||
 | 
			
		||||
For clear, this option is probably not very useful as it is likely to clear
 | 
			
		||||
quite frequently from the PIR, but is provided for completeness.
 | 
			
		||||
 | 
			
		||||
#### PIR + Radar
 | 
			
		||||
 | 
			
		||||
Occupancy is detected when both sensors report detected, and occupancy is
 | 
			
		||||
cleared when either of the sensors report cleared.
 | 
			
		||||
 | 
			
		||||
For detect, this provides good "safety" against PIR misfires without
 | 
			
		||||
needing a normally-dark room, though detection may be slightly delayed
 | 
			
		||||
from either sensor.
 | 
			
		||||
 | 
			
		||||
For clear, this option is probably not very useful as it is likely to clear
 | 
			
		||||
quite frequently from the PIR, but is provided for completeness.
 | 
			
		||||
 | 
			
		||||
#### PIR + Light
 | 
			
		||||
 | 
			
		||||
Occupancy is detected when both sensors report detected, and occupancy is
 | 
			
		||||
cleared when either of the sensors report cleared.
 | 
			
		||||
 | 
			
		||||
For detect, this provides some "safety" against PIR misfires, but requires
 | 
			
		||||
a normally-dark room with a non-automated light source and clear PIR
 | 
			
		||||
detection positioning.
 | 
			
		||||
 | 
			
		||||
For clear, this option is probably not very useful as it is likely to clear
 | 
			
		||||
quite frequently from the PIR, but is provided for completeness.
 | 
			
		||||
 | 
			
		||||
#### Radar + Light
 | 
			
		||||
 | 
			
		||||
Occupancy is detected when both sensors report detected, and occupancy is
 | 
			
		||||
cleared when either of the sensors report cleared.
 | 
			
		||||
 | 
			
		||||
For detect, this allows for radar detection while suppressing occupancy
 | 
			
		||||
without light, for instance in a hallway where one might not want a late
 | 
			
		||||
night bathroom visit to turn on the lights, or something to that effect.
 | 
			
		||||
 | 
			
		||||
For clear, this option can provide a useful option to clear presence
 | 
			
		||||
quickly if the lights go out, while still providing Radar presence.
 | 
			
		||||
 | 
			
		||||
#### PIR Only
 | 
			
		||||
 | 
			
		||||
Occupancy is based entirely on the PIR sensor for both detect and clear.
 | 
			
		||||
 | 
			
		||||
Prone to misfires, but otherwise a good option for quick detection and
 | 
			
		||||
clearance in a primarily-moving zone (e.g. hallway).
 | 
			
		||||
 | 
			
		||||
#### Radar Only
 | 
			
		||||
 | 
			
		||||
Occupancy is based entirely on the Radar sensor for both detect and clear.
 | 
			
		||||
 | 
			
		||||
Useful for an area with no consistent motion or light level.
 | 
			
		||||
 | 
			
		||||
#### Light Only
 | 
			
		||||
 | 
			
		||||
Occupancy is based entirely on the Light sensor for both detect and clear.
 | 
			
		||||
 | 
			
		||||
Useful for full dependence on an external light source.
 | 
			
		||||
 | 
			
		||||
#### None
 | 
			
		||||
 | 
			
		||||
Disable the functionality in either direction.
 | 
			
		||||
 | 
			
		||||
For detect, no occupancy will ever fire.
 | 
			
		||||
 | 
			
		||||
For clear, no states will clear occupancy; with any detect option, this
 | 
			
		||||
means that occupancy will be detected only once and never clear, which
 | 
			
		||||
is likely not useful.
 | 
			
		||||
 | 
			
		||||
## AQ Details
 | 
			
		||||
## Air Quality Handling
 | 
			
		||||
 | 
			
		||||
The SuperSensor 2.0 features an SGP41 air quality sensor by Sensirion. This is a powerful AQ
 | 
			
		||||
sensor which powers several commercial devices including the AirGradient One, which gave
 | 
			
		||||
@@ -285,6 +142,176 @@ for VOCs via AirGradient.
 | 
			
		||||
Note however that like all MOx sensors, the SGP41 does not differentiate gasses, and as
 | 
			
		||||
such cannot tell the difference between normal, everyday natural VOCs like those in
 | 
			
		||||
breath or from e.g. ripening fruit, and dangerous VOCs from e.g. construction materials.
 | 
			
		||||
It also reacts strongly to heavy humidity, resulting in higher values in such environments.
 | 
			
		||||
These should be used only as a general indication of air quality over short periods, rather
 | 
			
		||||
than an absolute reference over long periods (much to my own frustration but inevitable
 | 
			
		||||
begruding acceptance).
 | 
			
		||||
 | 
			
		||||
## Room Health
 | 
			
		||||
 | 
			
		||||
The SuperSensor 2.0 leverages the outputs of the SHT45 and SGP41 sensors to calculate a
 | 
			
		||||
"Room Health", expressed as a percentage, which represents how "healthy" i.e. comfortable
 | 
			
		||||
a room is for a person to be in.
 | 
			
		||||
 | 
			
		||||
The room health is calculated based on the VOC level, temperature, and relative humidity.
 | 
			
		||||
First, the raw value is converted to a per-sensor 100-0 scale as follows:
 | 
			
		||||
 | 
			
		||||
  * For VOC levels, there is a set of linear scales based on common VOC level
 | 
			
		||||
    mappings, such that less than 200 ppb is 100, 200-400 maps to 100-90,
 | 
			
		||||
    400-600 maps to 90-70, 600-1500 maps to 70-40, 1500-3000 maps to 40-0, and
 | 
			
		||||
    greater than 3000 is 0.
 | 
			
		||||
  * For temperature and humidity, there is a single linear scale based on a
 | 
			
		||||
    configurable penalty value, such that a value between the configurable
 | 
			
		||||
    minimum and maximum is 100, and each degree C or %RH outside of that range
 | 
			
		||||
    decreases the value by the penalty value.
 | 
			
		||||
 | 
			
		||||
Next, each indivdual per-sensor value is applied to the total 100-0 value by a configurable
 | 
			
		||||
weight, with the defaults being 40% to VOC level, 30% to temperature, and 30% to humidity. The
 | 
			
		||||
values can never total more than 100% or total to 0% but are otherwise normalized (i.e. decrease
 | 
			
		||||
others before increasing one, or the values will not be accepted; and at least one weight
 | 
			
		||||
must be >0).
 | 
			
		||||
 | 
			
		||||
The final result is thus a 100-0% range that, in broad strokes, describes the overall
 | 
			
		||||
health of the room. For some examples, assuming all of the default values below:
 | 
			
		||||
 | 
			
		||||
   * Perfect: Temp 23C, humidity 50%RH, and VOC level 150ppb = 100% health
 | 
			
		||||
   * A little warm: Temp 25C (+1), humidity 50%RH, and VOC level 250ppb = 97% health
 | 
			
		||||
   * Dry: Temp 22C, humidity 30%RH (-10), VOC level 150ppb = 91% health
 | 
			
		||||
   * Dirty air: Temp 23C, humidity 50%RH, VOC level 800ppb = 85% health
 | 
			
		||||
   * Hot & humid: Temp 28C, humidity 70%RH, VOC level 250ppb = 84% health
 | 
			
		||||
   * All-around bad: Temp 30C, humidity 30%RH, VOC level 2000ppb = 52% health
 | 
			
		||||
 | 
			
		||||
These are then mapped to textual values as well with the following bands:
 | 
			
		||||
 | 
			
		||||
   * 100%-95%: Great
 | 
			
		||||
   * 95%-90%: Good
 | 
			
		||||
   * 90%-80%: Fair
 | 
			
		||||
   * 80%-60%: Poor
 | 
			
		||||
   * 60%-0%: Bad
 | 
			
		||||
 | 
			
		||||
As mentioned above, most portions of this are configurable; see the section below for
 | 
			
		||||
specific details of each configuration value.
 | 
			
		||||
 | 
			
		||||
## Configurable Options
 | 
			
		||||
 | 
			
		||||
There are several UI-configurable options with the SuperSensor to help you
 | 
			
		||||
get the most out of the sensor for your particular use-case.
 | 
			
		||||
 | 
			
		||||
**Note:** Configuration of the LD2410C is excluded here, as it is extensively
 | 
			
		||||
configurable. See [the documentation](https://esphome.io/components/sensor/ld2410.html) for more details on its options.
 | 
			
		||||
 | 
			
		||||
### Enable Voice Support (switch)
 | 
			
		||||
 | 
			
		||||
If enabled (the default), the SuperSensor's voice functionality including
 | 
			
		||||
wake word will be started, or it can be disabled to use the SuperSensor
 | 
			
		||||
purely as a presence/environmental sensor.
 | 
			
		||||
 | 
			
		||||
### Enable Presence LED (switch)
 | 
			
		||||
 | 
			
		||||
If enabled (the default), when overall presence is detected, the LEDs will
 | 
			
		||||
glow "white" at 15% power to signal presence.
 | 
			
		||||
 | 
			
		||||
### Temperature Offset (number, -30 to +10 @ 0.1, -5 default)
 | 
			
		||||
 | 
			
		||||
Allows calibration of the SHT45 temperature sensor with an offset from -30 to +10
 | 
			
		||||
degrees C. Useful if the sensor is misreporting actual ambient tempreatures. Due
 | 
			
		||||
to internal heating of the SHT45 by the ESP32, this defaults to -5; further
 | 
			
		||||
calibration may be needed for your sensors and environment based on an external
 | 
			
		||||
reference.
 | 
			
		||||
 | 
			
		||||
### Humidity Offset (number, -20 to +20 @ 0.1)
 | 
			
		||||
 | 
			
		||||
Allows calibration of the SHT45 humidity sensor with an offset from -10 to +10
 | 
			
		||||
percent relative humidity. Useful if the sensor is misreporting actual humidity
 | 
			
		||||
based on an external reference.
 | 
			
		||||
 | 
			
		||||
### PIR Hold Time (number, 0 to +60 @ 5, 0 default)
 | 
			
		||||
 | 
			
		||||
The SuperSensor uses an AM312 PIR sensor, which has a stock hold time of ~2.5
 | 
			
		||||
seconds. This setting allows increasing that value, with retrigger support, to
 | 
			
		||||
up to 60 seconds, allowing the PIR detection to report for longer. 0 represents
 | 
			
		||||
"as long as the AM312 fires".
 | 
			
		||||
 | 
			
		||||
### Light Threshold Control (number, 0 to +200 @ 5, 30 default)
 | 
			
		||||
 | 
			
		||||
The SuperSensor features a "light presence" binary sensor based on the light
 | 
			
		||||
level reported by the TSL2591 sensor. This control defines the minimum lux
 | 
			
		||||
value from the sensor to be considered "presence". For instance, if you have
 | 
			
		||||
a room that is usually dark at 0-5 lux, but illuminated to 100 lux when a
 | 
			
		||||
(non-automated) light switch is turned on, you could set a threshold here
 | 
			
		||||
of say 30 lux: then, while the light is on, "light presence" is detected,
 | 
			
		||||
and when the light is off, "light presence" is cleared. Light presence can
 | 
			
		||||
be used standalone or as part of the integrated occupancy sensor (below).
 | 
			
		||||
 | 
			
		||||
### Integrated Occupancy Sensor (selector)
 | 
			
		||||
 | 
			
		||||
The SuperSensor features a fully integrated "occupancy" sensor, which can be
 | 
			
		||||
configured to provide exactly the sort of occupancy detection you may want
 | 
			
		||||
for your room.
 | 
			
		||||
 | 
			
		||||
There are 7 options (plus "None"/disabled), with both "detect" and "clear"
 | 
			
		||||
handled separately. Occupancy is always detected when ALL of the selected
 | 
			
		||||
sensors report detection, and occupancy is always cleared when ANY of the
 | 
			
		||||
selected sensors stop reporting detection (logical AND in, logical OR out).
 | 
			
		||||
 | 
			
		||||
   * PIR + Radar + Light
 | 
			
		||||
   * PIR + Radar
 | 
			
		||||
   * PIR + Light
 | 
			
		||||
   * Radar + Light
 | 
			
		||||
   * PIR Only
 | 
			
		||||
   * Radar Only
 | 
			
		||||
   * Light Only
 | 
			
		||||
   * None
 | 
			
		||||
 | 
			
		||||
### Room Health Sensor
 | 
			
		||||
 | 
			
		||||
#### Minimum Temperature (number, 15 to 30 @ 0.5, 21 default)
 | 
			
		||||
 | 
			
		||||
The lower bounds of a fully comfortable temperature; temperature values below
 | 
			
		||||
this value will begin decreasing the room health score.
 | 
			
		||||
 | 
			
		||||
#### Maximum Temperature (number, 15 to 30 @ 0.5, 24 default)
 | 
			
		||||
 | 
			
		||||
The upper bounds of a fully comfortable temperature; temperature values above
 | 
			
		||||
this value will begin decreasing the room health score.
 | 
			
		||||
 | 
			
		||||
#### Temperature Penalty (number, 1 to 20 @ 1, 10 default)
 | 
			
		||||
 | 
			
		||||
The penalty value per degree of temperature deviation from ideal levels, applied
 | 
			
		||||
to the pre-weighting value for temperature.
 | 
			
		||||
 | 
			
		||||
#### Minimum Humidity (number, 20 to 80 @ 1, 40 default)
 | 
			
		||||
 | 
			
		||||
The lower bounds of a fully comfortable relative humidity level; relative
 | 
			
		||||
humidity values below this value will begin decreasing the room health score.
 | 
			
		||||
 | 
			
		||||
#### Maximum Humidity (number, 20 to 80 @ 1, 60 default)
 | 
			
		||||
 | 
			
		||||
The upper bounds of a fully comfortable relative humidity level; relative
 | 
			
		||||
humidity values above this value will begin decreasing the room health score.
 | 
			
		||||
 | 
			
		||||
#### Humidity Penalty (number, 1 to 10 @ 1, 5 default)
 | 
			
		||||
 | 
			
		||||
The penalty value per % of relative humidity deviation from ideal levels, applied
 | 
			
		||||
to the pre-weighting value for humidity.
 | 
			
		||||
 | 
			
		||||
#### VOC Weight (number, 0.0 to 1.0, 0.4 default)
 | 
			
		||||
 | 
			
		||||
The weighting value of the VOC score relative to the other two for calculating
 | 
			
		||||
the total room health.
 | 
			
		||||
 | 
			
		||||
Note: Cannot exceed 0.4 without first decreasing one of the other weights (total max of 1.0).
 | 
			
		||||
 | 
			
		||||
#### Temperature Weight (number, 0.0 to 1.0, 0.3 default)
 | 
			
		||||
 | 
			
		||||
The weighting value of the Temperature score relative to the other two for
 | 
			
		||||
calculating the total room health.
 | 
			
		||||
 | 
			
		||||
Note: Cannot exceed 0.3 without first decreasing one of the other weights (total max of 1.0).
 | 
			
		||||
 | 
			
		||||
#### Humidity Weight (number, 0.0 to 1.0, 0.3 default)
 | 
			
		||||
 | 
			
		||||
The weighting value of the Humidity score relative to the other two for calculating
 | 
			
		||||
the total room health.
 | 
			
		||||
 | 
			
		||||
Note: Cannot exceed 0.3 without first decreasing one of the other weights (total max of 1.0).
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								case/.images/body-assembly-1.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 100 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/body-assembly-2.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 89 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/body-assembly-3.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 62 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/body-assembly-4.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 43 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/body-assembly-5.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 118 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/body-assembly-6.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 79 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/completed-case.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 81 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/completed-face.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 72 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/face-assembly-1.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 121 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/face-assembly-2.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 128 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/face-assembly-3.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 151 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/face-assembly-4.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 102 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/face-assembly-5.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 98 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/face-assembly-6.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 105 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/face-assembly-7.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 126 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/face-assembly-8.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 126 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/final-installation.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 92 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								case/.images/parts.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 74 KiB  | 
							
								
								
									
										427
									
								
								case/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,427 @@
 | 
			
		||||
Attribution-ShareAlike 4.0 International
 | 
			
		||||
 | 
			
		||||
=======================================================================
 | 
			
		||||
 | 
			
		||||
Creative Commons Corporation ("Creative Commons") is not a law firm and
 | 
			
		||||
does not provide legal services or legal advice. Distribution of
 | 
			
		||||
Creative Commons public licenses does not create a lawyer-client or
 | 
			
		||||
other relationship. Creative Commons makes its licenses and related
 | 
			
		||||
information available on an "as-is" basis. Creative Commons gives no
 | 
			
		||||
warranties regarding its licenses, any material licensed under their
 | 
			
		||||
terms and conditions, or any related information. Creative Commons
 | 
			
		||||
disclaims all liability for damages resulting from their use to the
 | 
			
		||||
fullest extent possible.
 | 
			
		||||
 | 
			
		||||
Using Creative Commons Public Licenses
 | 
			
		||||
 | 
			
		||||
Creative Commons public licenses provide a standard set of terms and
 | 
			
		||||
conditions that creators and other rights holders may use to share
 | 
			
		||||
original works of authorship and other material subject to copyright
 | 
			
		||||
and certain other rights specified in the public license below. The
 | 
			
		||||
following considerations are for informational purposes only, are not
 | 
			
		||||
exhaustive, and do not form part of our licenses.
 | 
			
		||||
 | 
			
		||||
     Considerations for licensors: Our public licenses are
 | 
			
		||||
     intended for use by those authorized to give the public
 | 
			
		||||
     permission to use material in ways otherwise restricted by
 | 
			
		||||
     copyright and certain other rights. Our licenses are
 | 
			
		||||
     irrevocable. Licensors should read and understand the terms
 | 
			
		||||
     and conditions of the license they choose before applying it.
 | 
			
		||||
     Licensors should also secure all rights necessary before
 | 
			
		||||
     applying our licenses so that the public can reuse the
 | 
			
		||||
     material as expected. Licensors should clearly mark any
 | 
			
		||||
     material not subject to the license. This includes other CC-
 | 
			
		||||
     licensed material, or material used under an exception or
 | 
			
		||||
     limitation to copyright. More considerations for licensors:
 | 
			
		||||
    wiki.creativecommons.org/Considerations_for_licensors
 | 
			
		||||
 | 
			
		||||
     Considerations for the public: By using one of our public
 | 
			
		||||
     licenses, a licensor grants the public permission to use the
 | 
			
		||||
     licensed material under specified terms and conditions. If
 | 
			
		||||
     the licensor's permission is not necessary for any reason--for
 | 
			
		||||
     example, because of any applicable exception or limitation to
 | 
			
		||||
     copyright--then that use is not regulated by the license. Our
 | 
			
		||||
     licenses grant only permissions under copyright and certain
 | 
			
		||||
     other rights that a licensor has authority to grant. Use of
 | 
			
		||||
     the licensed material may still be restricted for other
 | 
			
		||||
     reasons, including because others have copyright or other
 | 
			
		||||
     rights in the material. A licensor may make special requests,
 | 
			
		||||
     such as asking that all changes be marked or described.
 | 
			
		||||
     Although not required by our licenses, you are encouraged to
 | 
			
		||||
     respect those requests where reasonable. More considerations
 | 
			
		||||
     for the public:
 | 
			
		||||
    wiki.creativecommons.org/Considerations_for_licensees
 | 
			
		||||
 | 
			
		||||
=======================================================================
 | 
			
		||||
 | 
			
		||||
Creative Commons Attribution-ShareAlike 4.0 International Public
 | 
			
		||||
License
 | 
			
		||||
 | 
			
		||||
By exercising the Licensed Rights (defined below), You accept and agree
 | 
			
		||||
to be bound by the terms and conditions of this Creative Commons
 | 
			
		||||
Attribution-ShareAlike 4.0 International Public License ("Public
 | 
			
		||||
License"). To the extent this Public License may be interpreted as a
 | 
			
		||||
contract, You are granted the Licensed Rights in consideration of Your
 | 
			
		||||
acceptance of these terms and conditions, and the Licensor grants You
 | 
			
		||||
such rights in consideration of benefits the Licensor receives from
 | 
			
		||||
making the Licensed Material available under these terms and
 | 
			
		||||
conditions.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Section 1 -- Definitions.
 | 
			
		||||
 | 
			
		||||
  a. Adapted Material means material subject to Copyright and Similar
 | 
			
		||||
     Rights that is derived from or based upon the Licensed Material
 | 
			
		||||
     and in which the Licensed Material is translated, altered,
 | 
			
		||||
     arranged, transformed, or otherwise modified in a manner requiring
 | 
			
		||||
     permission under the Copyright and Similar Rights held by the
 | 
			
		||||
     Licensor. For purposes of this Public License, where the Licensed
 | 
			
		||||
     Material is a musical work, performance, or sound recording,
 | 
			
		||||
     Adapted Material is always produced where the Licensed Material is
 | 
			
		||||
     synched in timed relation with a moving image.
 | 
			
		||||
 | 
			
		||||
  b. Adapter's License means the license You apply to Your Copyright
 | 
			
		||||
     and Similar Rights in Your contributions to Adapted Material in
 | 
			
		||||
     accordance with the terms and conditions of this Public License.
 | 
			
		||||
 | 
			
		||||
  c. BY-SA Compatible License means a license listed at
 | 
			
		||||
     creativecommons.org/compatiblelicenses, approved by Creative
 | 
			
		||||
     Commons as essentially the equivalent of this Public License.
 | 
			
		||||
 | 
			
		||||
  d. Copyright and Similar Rights means copyright and/or similar rights
 | 
			
		||||
     closely related to copyright including, without limitation,
 | 
			
		||||
     performance, broadcast, sound recording, and Sui Generis Database
 | 
			
		||||
     Rights, without regard to how the rights are labeled or
 | 
			
		||||
     categorized. For purposes of this Public License, the rights
 | 
			
		||||
     specified in Section 2(b)(1)-(2) are not Copyright and Similar
 | 
			
		||||
     Rights.
 | 
			
		||||
 | 
			
		||||
  e. Effective Technological Measures means those measures that, in the
 | 
			
		||||
     absence of proper authority, may not be circumvented under laws
 | 
			
		||||
     fulfilling obligations under Article 11 of the WIPO Copyright
 | 
			
		||||
     Treaty adopted on December 20, 1996, and/or similar international
 | 
			
		||||
     agreements.
 | 
			
		||||
 | 
			
		||||
  f. Exceptions and Limitations means fair use, fair dealing, and/or
 | 
			
		||||
     any other exception or limitation to Copyright and Similar Rights
 | 
			
		||||
     that applies to Your use of the Licensed Material.
 | 
			
		||||
 | 
			
		||||
  g. License Elements means the license attributes listed in the name
 | 
			
		||||
     of a Creative Commons Public License. The License Elements of this
 | 
			
		||||
     Public License are Attribution and ShareAlike.
 | 
			
		||||
 | 
			
		||||
  h. Licensed Material means the artistic or literary work, database,
 | 
			
		||||
     or other material to which the Licensor applied this Public
 | 
			
		||||
     License.
 | 
			
		||||
 | 
			
		||||
  i. Licensed Rights means the rights granted to You subject to the
 | 
			
		||||
     terms and conditions of this Public License, which are limited to
 | 
			
		||||
     all Copyright and Similar Rights that apply to Your use of the
 | 
			
		||||
     Licensed Material and that the Licensor has authority to license.
 | 
			
		||||
 | 
			
		||||
  j. Licensor means the individual(s) or entity(ies) granting rights
 | 
			
		||||
     under this Public License.
 | 
			
		||||
 | 
			
		||||
  k. Share means to provide material to the public by any means or
 | 
			
		||||
     process that requires permission under the Licensed Rights, such
 | 
			
		||||
     as reproduction, public display, public performance, distribution,
 | 
			
		||||
     dissemination, communication, or importation, and to make material
 | 
			
		||||
     available to the public including in ways that members of the
 | 
			
		||||
     public may access the material from a place and at a time
 | 
			
		||||
     individually chosen by them.
 | 
			
		||||
 | 
			
		||||
  l. Sui Generis Database Rights means rights other than copyright
 | 
			
		||||
     resulting from Directive 96/9/EC of the European Parliament and of
 | 
			
		||||
     the Council of 11 March 1996 on the legal protection of databases,
 | 
			
		||||
     as amended and/or succeeded, as well as other essentially
 | 
			
		||||
     equivalent rights anywhere in the world.
 | 
			
		||||
 | 
			
		||||
  m. You means the individual or entity exercising the Licensed Rights
 | 
			
		||||
     under this Public License. Your has a corresponding meaning.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Section 2 -- Scope.
 | 
			
		||||
 | 
			
		||||
  a. License grant.
 | 
			
		||||
 | 
			
		||||
       1. Subject to the terms and conditions of this Public License,
 | 
			
		||||
          the Licensor hereby grants You a worldwide, royalty-free,
 | 
			
		||||
          non-sublicensable, non-exclusive, irrevocable license to
 | 
			
		||||
          exercise the Licensed Rights in the Licensed Material to:
 | 
			
		||||
 | 
			
		||||
            a. reproduce and Share the Licensed Material, in whole or
 | 
			
		||||
               in part; and
 | 
			
		||||
 | 
			
		||||
            b. produce, reproduce, and Share Adapted Material.
 | 
			
		||||
 | 
			
		||||
       2. Exceptions and Limitations. For the avoidance of doubt, where
 | 
			
		||||
          Exceptions and Limitations apply to Your use, this Public
 | 
			
		||||
          License does not apply, and You do not need to comply with
 | 
			
		||||
          its terms and conditions.
 | 
			
		||||
 | 
			
		||||
       3. Term. The term of this Public License is specified in Section
 | 
			
		||||
          6(a).
 | 
			
		||||
 | 
			
		||||
       4. Media and formats; technical modifications allowed. The
 | 
			
		||||
          Licensor authorizes You to exercise the Licensed Rights in
 | 
			
		||||
          all media and formats whether now known or hereafter created,
 | 
			
		||||
          and to make technical modifications necessary to do so. The
 | 
			
		||||
          Licensor waives and/or agrees not to assert any right or
 | 
			
		||||
          authority to forbid You from making technical modifications
 | 
			
		||||
          necessary to exercise the Licensed Rights, including
 | 
			
		||||
          technical modifications necessary to circumvent Effective
 | 
			
		||||
          Technological Measures. For purposes of this Public License,
 | 
			
		||||
          simply making modifications authorized by this Section 2(a)
 | 
			
		||||
          (4) never produces Adapted Material.
 | 
			
		||||
 | 
			
		||||
       5. Downstream recipients.
 | 
			
		||||
 | 
			
		||||
            a. Offer from the Licensor -- Licensed Material. Every
 | 
			
		||||
               recipient of the Licensed Material automatically
 | 
			
		||||
               receives an offer from the Licensor to exercise the
 | 
			
		||||
               Licensed Rights under the terms and conditions of this
 | 
			
		||||
               Public License.
 | 
			
		||||
 | 
			
		||||
            b. Additional offer from the Licensor -- Adapted Material.
 | 
			
		||||
               Every recipient of Adapted Material from You
 | 
			
		||||
               automatically receives an offer from the Licensor to
 | 
			
		||||
               exercise the Licensed Rights in the Adapted Material
 | 
			
		||||
               under the conditions of the Adapter's License You apply.
 | 
			
		||||
 | 
			
		||||
            c. No downstream restrictions. You may not offer or impose
 | 
			
		||||
               any additional or different terms or conditions on, or
 | 
			
		||||
               apply any Effective Technological Measures to, the
 | 
			
		||||
               Licensed Material if doing so restricts exercise of the
 | 
			
		||||
               Licensed Rights by any recipient of the Licensed
 | 
			
		||||
               Material.
 | 
			
		||||
 | 
			
		||||
       6. No endorsement. Nothing in this Public License constitutes or
 | 
			
		||||
          may be construed as permission to assert or imply that You
 | 
			
		||||
          are, or that Your use of the Licensed Material is, connected
 | 
			
		||||
          with, or sponsored, endorsed, or granted official status by,
 | 
			
		||||
          the Licensor or others designated to receive attribution as
 | 
			
		||||
          provided in Section 3(a)(1)(A)(i).
 | 
			
		||||
 | 
			
		||||
  b. Other rights.
 | 
			
		||||
 | 
			
		||||
       1. Moral rights, such as the right of integrity, are not
 | 
			
		||||
          licensed under this Public License, nor are publicity,
 | 
			
		||||
          privacy, and/or other similar personality rights; however, to
 | 
			
		||||
          the extent possible, the Licensor waives and/or agrees not to
 | 
			
		||||
          assert any such rights held by the Licensor to the limited
 | 
			
		||||
          extent necessary to allow You to exercise the Licensed
 | 
			
		||||
          Rights, but not otherwise.
 | 
			
		||||
 | 
			
		||||
       2. Patent and trademark rights are not licensed under this
 | 
			
		||||
          Public License.
 | 
			
		||||
 | 
			
		||||
       3. To the extent possible, the Licensor waives any right to
 | 
			
		||||
          collect royalties from You for the exercise of the Licensed
 | 
			
		||||
          Rights, whether directly or through a collecting society
 | 
			
		||||
          under any voluntary or waivable statutory or compulsory
 | 
			
		||||
          licensing scheme. In all other cases the Licensor expressly
 | 
			
		||||
          reserves any right to collect such royalties.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Section 3 -- License Conditions.
 | 
			
		||||
 | 
			
		||||
Your exercise of the Licensed Rights is expressly made subject to the
 | 
			
		||||
following conditions.
 | 
			
		||||
 | 
			
		||||
  a. Attribution.
 | 
			
		||||
 | 
			
		||||
       1. If You Share the Licensed Material (including in modified
 | 
			
		||||
          form), You must:
 | 
			
		||||
 | 
			
		||||
            a. retain the following if it is supplied by the Licensor
 | 
			
		||||
               with the Licensed Material:
 | 
			
		||||
 | 
			
		||||
                 i. identification of the creator(s) of the Licensed
 | 
			
		||||
                    Material and any others designated to receive
 | 
			
		||||
                    attribution, in any reasonable manner requested by
 | 
			
		||||
                    the Licensor (including by pseudonym if
 | 
			
		||||
                    designated);
 | 
			
		||||
 | 
			
		||||
                ii. a copyright notice;
 | 
			
		||||
 | 
			
		||||
               iii. a notice that refers to this Public License;
 | 
			
		||||
 | 
			
		||||
                iv. a notice that refers to the disclaimer of
 | 
			
		||||
                    warranties;
 | 
			
		||||
 | 
			
		||||
                 v. a URI or hyperlink to the Licensed Material to the
 | 
			
		||||
                    extent reasonably practicable;
 | 
			
		||||
 | 
			
		||||
            b. indicate if You modified the Licensed Material and
 | 
			
		||||
               retain an indication of any previous modifications; and
 | 
			
		||||
 | 
			
		||||
            c. indicate the Licensed Material is licensed under this
 | 
			
		||||
               Public License, and include the text of, or the URI or
 | 
			
		||||
               hyperlink to, this Public License.
 | 
			
		||||
 | 
			
		||||
       2. You may satisfy the conditions in Section 3(a)(1) in any
 | 
			
		||||
          reasonable manner based on the medium, means, and context in
 | 
			
		||||
          which You Share the Licensed Material. For example, it may be
 | 
			
		||||
          reasonable to satisfy the conditions by providing a URI or
 | 
			
		||||
          hyperlink to a resource that includes the required
 | 
			
		||||
          information.
 | 
			
		||||
 | 
			
		||||
       3. If requested by the Licensor, You must remove any of the
 | 
			
		||||
          information required by Section 3(a)(1)(A) to the extent
 | 
			
		||||
          reasonably practicable.
 | 
			
		||||
 | 
			
		||||
  b. ShareAlike.
 | 
			
		||||
 | 
			
		||||
     In addition to the conditions in Section 3(a), if You Share
 | 
			
		||||
     Adapted Material You produce, the following conditions also apply.
 | 
			
		||||
 | 
			
		||||
       1. The Adapter's License You apply must be a Creative Commons
 | 
			
		||||
          license with the same License Elements, this version or
 | 
			
		||||
          later, or a BY-SA Compatible License.
 | 
			
		||||
 | 
			
		||||
       2. You must include the text of, or the URI or hyperlink to, the
 | 
			
		||||
          Adapter's License You apply. You may satisfy this condition
 | 
			
		||||
          in any reasonable manner based on the medium, means, and
 | 
			
		||||
          context in which You Share Adapted Material.
 | 
			
		||||
 | 
			
		||||
       3. You may not offer or impose any additional or different terms
 | 
			
		||||
          or conditions on, or apply any Effective Technological
 | 
			
		||||
          Measures to, Adapted Material that restrict exercise of the
 | 
			
		||||
          rights granted under the Adapter's License You apply.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Section 4 -- Sui Generis Database Rights.
 | 
			
		||||
 | 
			
		||||
Where the Licensed Rights include Sui Generis Database Rights that
 | 
			
		||||
apply to Your use of the Licensed Material:
 | 
			
		||||
 | 
			
		||||
  a. for the avoidance of doubt, Section 2(a)(1) grants You the right
 | 
			
		||||
     to extract, reuse, reproduce, and Share all or a substantial
 | 
			
		||||
     portion of the contents of the database;
 | 
			
		||||
 | 
			
		||||
  b. if You include all or a substantial portion of the database
 | 
			
		||||
     contents in a database in which You have Sui Generis Database
 | 
			
		||||
     Rights, then the database in which You have Sui Generis Database
 | 
			
		||||
     Rights (but not its individual contents) is Adapted Material,
 | 
			
		||||
     including for purposes of Section 3(b); and
 | 
			
		||||
 | 
			
		||||
  c. You must comply with the conditions in Section 3(a) if You Share
 | 
			
		||||
     all or a substantial portion of the contents of the database.
 | 
			
		||||
 | 
			
		||||
For the avoidance of doubt, this Section 4 supplements and does not
 | 
			
		||||
replace Your obligations under this Public License where the Licensed
 | 
			
		||||
Rights include other Copyright and Similar Rights.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
 | 
			
		||||
 | 
			
		||||
  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
 | 
			
		||||
     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
 | 
			
		||||
     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
 | 
			
		||||
     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
 | 
			
		||||
     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
 | 
			
		||||
     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
 | 
			
		||||
     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
 | 
			
		||||
     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
 | 
			
		||||
     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
 | 
			
		||||
     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
 | 
			
		||||
 | 
			
		||||
  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
 | 
			
		||||
     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
 | 
			
		||||
     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
 | 
			
		||||
     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
 | 
			
		||||
     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
 | 
			
		||||
     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
 | 
			
		||||
     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
 | 
			
		||||
     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
 | 
			
		||||
     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
 | 
			
		||||
 | 
			
		||||
  c. The disclaimer of warranties and limitation of liability provided
 | 
			
		||||
     above shall be interpreted in a manner that, to the extent
 | 
			
		||||
     possible, most closely approximates an absolute disclaimer and
 | 
			
		||||
     waiver of all liability.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Section 6 -- Term and Termination.
 | 
			
		||||
 | 
			
		||||
  a. This Public License applies for the term of the Copyright and
 | 
			
		||||
     Similar Rights licensed here. However, if You fail to comply with
 | 
			
		||||
     this Public License, then Your rights under this Public License
 | 
			
		||||
     terminate automatically.
 | 
			
		||||
 | 
			
		||||
  b. Where Your right to use the Licensed Material has terminated under
 | 
			
		||||
     Section 6(a), it reinstates:
 | 
			
		||||
 | 
			
		||||
       1. automatically as of the date the violation is cured, provided
 | 
			
		||||
          it is cured within 30 days of Your discovery of the
 | 
			
		||||
          violation; or
 | 
			
		||||
 | 
			
		||||
       2. upon express reinstatement by the Licensor.
 | 
			
		||||
 | 
			
		||||
     For the avoidance of doubt, this Section 6(b) does not affect any
 | 
			
		||||
     right the Licensor may have to seek remedies for Your violations
 | 
			
		||||
     of this Public License.
 | 
			
		||||
 | 
			
		||||
  c. For the avoidance of doubt, the Licensor may also offer the
 | 
			
		||||
     Licensed Material under separate terms or conditions or stop
 | 
			
		||||
     distributing the Licensed Material at any time; however, doing so
 | 
			
		||||
     will not terminate this Public License.
 | 
			
		||||
 | 
			
		||||
  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
 | 
			
		||||
     License.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Section 7 -- Other Terms and Conditions.
 | 
			
		||||
 | 
			
		||||
  a. The Licensor shall not be bound by any additional or different
 | 
			
		||||
     terms or conditions communicated by You unless expressly agreed.
 | 
			
		||||
 | 
			
		||||
  b. Any arrangements, understandings, or agreements regarding the
 | 
			
		||||
     Licensed Material not stated herein are separate from and
 | 
			
		||||
     independent of the terms and conditions of this Public License.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Section 8 -- Interpretation.
 | 
			
		||||
 | 
			
		||||
  a. For the avoidance of doubt, this Public License does not, and
 | 
			
		||||
     shall not be interpreted to, reduce, limit, restrict, or impose
 | 
			
		||||
     conditions on any use of the Licensed Material that could lawfully
 | 
			
		||||
     be made without permission under this Public License.
 | 
			
		||||
 | 
			
		||||
  b. To the extent possible, if any provision of this Public License is
 | 
			
		||||
     deemed unenforceable, it shall be automatically reformed to the
 | 
			
		||||
     minimum extent necessary to make it enforceable. If the provision
 | 
			
		||||
     cannot be reformed, it shall be severed from this Public License
 | 
			
		||||
     without affecting the enforceability of the remaining terms and
 | 
			
		||||
     conditions.
 | 
			
		||||
 | 
			
		||||
  c. No term or condition of this Public License will be waived and no
 | 
			
		||||
     failure to comply consented to unless expressly agreed to by the
 | 
			
		||||
     Licensor.
 | 
			
		||||
 | 
			
		||||
  d. Nothing in this Public License constitutes or may be interpreted
 | 
			
		||||
     as a limitation upon, or waiver of, any privileges and immunities
 | 
			
		||||
     that apply to the Licensor or You, including from the legal
 | 
			
		||||
     processes of any jurisdiction or authority.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=======================================================================
 | 
			
		||||
 | 
			
		||||
Creative Commons is not a party to its public
 | 
			
		||||
licenses. Notwithstanding, Creative Commons may elect to apply one of
 | 
			
		||||
its public licenses to material it publishes and in those instances
 | 
			
		||||
will be considered the “Licensor.” The text of the Creative Commons
 | 
			
		||||
public licenses is dedicated to the public domain under the CC0 Public
 | 
			
		||||
Domain Dedication. Except for the limited purpose of indicating that
 | 
			
		||||
material is shared under a Creative Commons public license or as
 | 
			
		||||
otherwise permitted by the Creative Commons policies published at
 | 
			
		||||
creativecommons.org/policies, Creative Commons does not authorize the
 | 
			
		||||
use of the trademark "Creative Commons" or any other trademark or logo
 | 
			
		||||
of Creative Commons without its prior written consent including,
 | 
			
		||||
without limitation, in connection with any unauthorized modifications
 | 
			
		||||
to any of its public licenses or any other arrangements,
 | 
			
		||||
understandings, or agreements concerning use of licensed material. For
 | 
			
		||||
the avoidance of doubt, this paragraph does not form part of the
 | 
			
		||||
public licenses.
 | 
			
		||||
 | 
			
		||||
Creative Commons may be contacted at creativecommons.org.
 | 
			
		||||
							
								
								
									
										177
									
								
								case/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,177 @@
 | 
			
		||||
# SuperSensor 2.x Case
 | 
			
		||||
 | 
			
		||||
This is a 3D-printable case for the SuperSensor 2.x all-in-one voice, motion,
 | 
			
		||||
presence, temperature/humidity/air quality, and light sensor.
 | 
			
		||||
 | 
			
		||||
This case provides a convenient way to cover up the SuperSensor's PCB, either
 | 
			
		||||
for aesthetics or to help protect it from harsh environments.
 | 
			
		||||
 | 
			
		||||
You can [tinker the design on TinkerCAD here](https://www.tinkercad.com/things/1HT3fyNbln0-supersensor-case).
 | 
			
		||||
The case design and images in this folder are licensed under the Creative Commons
 | 
			
		||||
Attribution-ShareAlike (BY-SA) 4.0 license.
 | 
			
		||||
 | 
			
		||||
## Printing
 | 
			
		||||
 | 
			
		||||
Provided here are 5 `.obj` CAD files designed for slicing and printing with
 | 
			
		||||
any slicer software and 3D printer.
 | 
			
		||||
 | 
			
		||||
### `body.obj`
 | 
			
		||||
 | 
			
		||||
This is the main body of the case which houses the PCB. It includes an opening
 | 
			
		||||
for the insertion of a USB-C cable of "normal" size, which should fit most cables.
 | 
			
		||||
 | 
			
		||||
This part should be printed in a solid, durable material of any colour you wish.
 | 
			
		||||
 | 
			
		||||
### `face.obj`
 | 
			
		||||
 | 
			
		||||
This is the front face of the case. It clips into the body with 4 triangular
 | 
			
		||||
grip clips, and has 5 openings:
 | 
			
		||||
  * A large rectangle for the insert below.
 | 
			
		||||
  * A large circle for the PIR and am312 extension tube below.
 | 
			
		||||
  * A small flush hole for the TSL2591 light sensor.
 | 
			
		||||
  * A small funneled hole for the SGP41 air quality sensor.
 | 
			
		||||
  * A small funneled hole for the SHT45 temperature/humidity sensor.
 | 
			
		||||
 | 
			
		||||
**NOTE**: This design can affect the baseline readings of these sensors!
 | 
			
		||||
Specifically, the TSL will report much lower ambient light levels (up to 30 lux)
 | 
			
		||||
unless light is directly facing it; and the SHT45 will hover about 6 degrees
 | 
			
		||||
higher than the exposed PCB would from my testing. Take these into account in
 | 
			
		||||
your usage!
 | 
			
		||||
 | 
			
		||||
This part should be printed in a solid, durable material of any colour you wish.
 | 
			
		||||
 | 
			
		||||
### `insert.obj`
 | 
			
		||||
 | 
			
		||||
This insert fits into the large rectangle in the face, and provides a diffuser
 | 
			
		||||
for the feedback/status LEDs, including an opening for the INA microphone. It
 | 
			
		||||
is inserted into the face separately during assembly, though a multi-material
 | 
			
		||||
printer could concievably print it into the face during printing.
 | 
			
		||||
 | 
			
		||||
This part should be printed in a solid, durable material in **a natural or transluscent** colour (it must let light through).
 | 
			
		||||
 | 
			
		||||
### `am312-tube.obj`
 | 
			
		||||
 | 
			
		||||
This round tube provides additional buffering for the AM312 over the face, extending
 | 
			
		||||
it by 8mm to completely cover the AM312 body. It attaches to the face over the large
 | 
			
		||||
circular hol separately during assembly.
 | 
			
		||||
 | 
			
		||||
This part should be printed in a solid, durable material in any colour you wish.
 | 
			
		||||
 | 
			
		||||
### `usb-extension.obj` (optional)
 | 
			
		||||
 | 
			
		||||
This square tube provides additional coverage of the USB cable opening for situations
 | 
			
		||||
where that may be needed, either for "weatherproofing", cable management, or mounting.
 | 
			
		||||
It attaches over the opening in the body and should fit most cables. Note that USB
 | 
			
		||||
insertion may be harder with this on so consider that carefully during cable selection;
 | 
			
		||||
a long boot cable is a plus here.
 | 
			
		||||
 | 
			
		||||
This part should be printed in a solid, durable material in any colour you wish.
 | 
			
		||||
 | 
			
		||||
## Assembly
 | 
			
		||||
 | 
			
		||||
To begin, print the parts above as indicated; default slicer settings should be sufficient.
 | 
			
		||||
We will exclude the USB cable opening extension for this assembly, but its installation
 | 
			
		||||
is straightforward.
 | 
			
		||||
 | 
			
		||||
Lay out the parts; you will need:
 | 
			
		||||
 | 
			
		||||
    * The body, face, insert, and AM312 tube parts.
 | 
			
		||||
    * Superglue
 | 
			
		||||
    * A toothpick (if not using a precision superglue applicator)
 | 
			
		||||
    * A hard, flat surface (I use a vice)
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
### Face
 | 
			
		||||
 | 
			
		||||
1. Place the face face-down (clips up), and place dabs of superglue at the corners of the
 | 
			
		||||
   insert openings.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
2. Spread the superglue along the inner edges with the toothpick; or, combine 2+3 by using
 | 
			
		||||
   a precision superglue applicator. You need very little glue here; avoid extra ooze!
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
3. Firmly place the insert face-down into the hole; the overlap edges should match.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
4. Apply firm pressure to both sides of the insert with your thumbs, a vice, or another
 | 
			
		||||
   pressing object, until the glue can set up (15-30 seconds).
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
5. Flip over the face; the insert should now be solidly affixed. Clean up any oozing superglue
 | 
			
		||||
   with a paper towel or lint-free rag.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
6. Place a small amount of superglue on your toothpick tip; if using a precision superglue
 | 
			
		||||
   applicator, skip this step.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
7. Gently spread the superglue around the circular opening (or apply using a precision superglue
 | 
			
		||||
   applicator); you want the bead to be no more than 1mm wide to avoid ooze.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
8. Line up the AM312 tube, and firmly press it down to seal. Clean up any oozing superglue
 | 
			
		||||
   with a paper towel or lint-free rag.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
You will now have a completed face assembly and are ready to install the actual SuperSensor.
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
### Body
 | 
			
		||||
 | 
			
		||||
1. Gently insert the SuperSensor board into the case body, lining it up with the four standoffs.
 | 
			
		||||
    The ESP32 should b firmly sitting on the bottom (it should require no force).
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
   You can verify that the USB plug is sitting flush on the base.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
2. Remove the top cap of the AM312.
 | 
			
		||||
 | 
			
		||||
3. Place the face over the AM312.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
4. Line up the clips on one side (I prefer the left). Then using a gentle squeezing motion, apply
 | 
			
		||||
   pressure to the sides of the case on the right side while also applying lateral pressure on
 | 
			
		||||
   the face towards the inserted clips. This picture is a one-handed demonstration, applying a
 | 
			
		||||
   squeezing pressure between my thumb and middle finger and a downwards pressure with my index
 | 
			
		||||
   finger to provide force; using two hands is advised.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
5. While doing the previous step, ensure that the 3 sensor holes are lined up with their corresponding sensors.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
6. Press the face into the body so that all 4 clips are making contact.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
7. Reinstall the top cap of the AM312; it should have a snug fit against the tube.
 | 
			
		||||
 | 
			
		||||
You now have an assembled case!
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
As a further step, consider placing a line of tape around the face-body joint. The locking clip
 | 
			
		||||
design was made with printing in mind, and does have some play here.
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
You may either mount the SuperSensor by its USB plug (as with a bare board design), or by attaching
 | 
			
		||||
a mounting piece to the case. Enjoy your newly-enclosed SuperSensor with diffused status LEDs!
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
							
								
								
									
										592
									
								
								case/am312-tube.obj
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,592 @@
 | 
			
		||||
# Object Export From Tinkercad Server 2015
 | 
			
		||||
 | 
			
		||||
mtllib obj.mtl
 | 
			
		||||
 | 
			
		||||
o obj_0
 | 
			
		||||
v 25.003 		-60.5 		0
 | 
			
		||||
v 24.947 		-61.349 		0
 | 
			
		||||
v 12.219 		-58.817 		0
 | 
			
		||||
v 12.053 		-59.651 		0
 | 
			
		||||
v 25.003 		-60.5 		8
 | 
			
		||||
v 24.947 		-61.349 		8
 | 
			
		||||
v 12.492 		-58.012 		0
 | 
			
		||||
v 24.781 		-62.183 		0
 | 
			
		||||
v 12.869 		-57.249 		0
 | 
			
		||||
v 12.492 		-58.012 		8
 | 
			
		||||
v 24.508 		-62.988 		0
 | 
			
		||||
v 12.869 		-57.249 		8
 | 
			
		||||
v 24.781 		-62.183 		8
 | 
			
		||||
v 13.341 		-56.542 		0
 | 
			
		||||
v 24.131 		-63.751 		0
 | 
			
		||||
v 13.341 		-56.542 		8
 | 
			
		||||
v 24.45 		-65.066 		0
 | 
			
		||||
v 24.995 		-64.25 		0
 | 
			
		||||
v 24.995 		-64.25 		8
 | 
			
		||||
v 24.508 		-62.988 		8
 | 
			
		||||
v 24.45 		-65.066 		8
 | 
			
		||||
v 13.902 		-55.902 		8
 | 
			
		||||
v 23.659 		-64.458 		0
 | 
			
		||||
v 24.781 		-58.817 		0
 | 
			
		||||
v 24.781 		-58.817 		8
 | 
			
		||||
v 24.508 		-58.012 		8
 | 
			
		||||
v 24.508 		-58.012 		0
 | 
			
		||||
v 13.902 		-55.902 		0
 | 
			
		||||
v 23.098 		-65.098 		0
 | 
			
		||||
v 24.131 		-63.751 		8
 | 
			
		||||
v 14.75 		-66.995 		0
 | 
			
		||||
v 14.75 		-66.995 		8
 | 
			
		||||
v 24.947 		-59.651 		0
 | 
			
		||||
v 24.947 		-59.651 		8
 | 
			
		||||
v 13.934 		-54.55 		8
 | 
			
		||||
v 13.197 		-55.197 		8
 | 
			
		||||
v 12.55 		-55.934 		8
 | 
			
		||||
v 12.005 		-56.75 		8
 | 
			
		||||
v 25.429 		-63.37 		0
 | 
			
		||||
v 23.659 		-64.458 		8
 | 
			
		||||
v 25.429 		-63.37 		8
 | 
			
		||||
v 25.744 		-62.441 		0
 | 
			
		||||
v 25.744 		-62.441 		8
 | 
			
		||||
v 12.005 		-56.75 		0
 | 
			
		||||
v 23.098 		-65.098 		8
 | 
			
		||||
v 12.55 		-55.934 		0
 | 
			
		||||
v 22.25 		-54.005 		0
 | 
			
		||||
v 23.803 		-65.803 		0
 | 
			
		||||
v 22.25 		-54.005 		8
 | 
			
		||||
v 13.197 		-55.197 		0
 | 
			
		||||
v 23.066 		-66.45 		0
 | 
			
		||||
v 15.63 		-67.429 		0
 | 
			
		||||
v 13.934 		-54.55 		0
 | 
			
		||||
v 15.63 		-67.429 		8
 | 
			
		||||
v 25.936 		-61.479 		0
 | 
			
		||||
v 25.936 		-61.479 		8
 | 
			
		||||
v 11.571 		-57.63 		8
 | 
			
		||||
v 11.256 		-58.559 		8
 | 
			
		||||
v 11.064 		-59.521 		8
 | 
			
		||||
v 26 		-60.5 		0
 | 
			
		||||
v 26 		-60.5 		8
 | 
			
		||||
v 16.559 		-67.744 		0
 | 
			
		||||
v 16.559 		-67.744 		8
 | 
			
		||||
v 21.37 		-53.571 		0
 | 
			
		||||
v 21.37 		-53.571 		8
 | 
			
		||||
v 11.064 		-59.521 		0
 | 
			
		||||
v 23.098 		-55.902 		0
 | 
			
		||||
v 11.256 		-58.559 		0
 | 
			
		||||
v 25.936 		-59.521 		0
 | 
			
		||||
v 11.571 		-57.63 		0
 | 
			
		||||
v 25.936 		-59.521 		8
 | 
			
		||||
v 20.441 		-53.256 		0
 | 
			
		||||
v 20.441 		-53.256 		8
 | 
			
		||||
v 13.902 		-65.098 		8
 | 
			
		||||
v 25.744 		-58.559 		0
 | 
			
		||||
v 19.479 		-53.064 		0
 | 
			
		||||
v 25.744 		-58.559 		8
 | 
			
		||||
v 19.479 		-53.064 		8
 | 
			
		||||
v 23.066 		-66.45 		8
 | 
			
		||||
v 23.803 		-65.803 		8
 | 
			
		||||
v 13.902 		-65.098 		0
 | 
			
		||||
v 18.5 		-53 		0
 | 
			
		||||
v 18.5 		-53 		8
 | 
			
		||||
v 23.659 		-56.542 		0
 | 
			
		||||
v 25.429 		-57.63 		0
 | 
			
		||||
v 25.429 		-57.63 		8
 | 
			
		||||
v 17.521 		-53.064 		0
 | 
			
		||||
v 17.521 		-53.064 		8
 | 
			
		||||
v 13.341 		-64.458 		8
 | 
			
		||||
v 13.341 		-64.458 		0
 | 
			
		||||
v 23.098 		-55.902 		8
 | 
			
		||||
v 16.559 		-53.256 		0
 | 
			
		||||
v 24.995 		-56.75 		0
 | 
			
		||||
v 16.559 		-53.256 		8
 | 
			
		||||
v 24.995 		-56.75 		8
 | 
			
		||||
v 24.131 		-57.249 		0
 | 
			
		||||
v 12.869 		-63.751 		8
 | 
			
		||||
v 15.63 		-53.571 		0
 | 
			
		||||
v 23.659 		-56.542 		8
 | 
			
		||||
v 15.63 		-53.571 		8
 | 
			
		||||
v 12.869 		-63.751 		0
 | 
			
		||||
v 23.066 		-54.55 		0
 | 
			
		||||
v 24.45 		-55.934 		0
 | 
			
		||||
v 24.45 		-55.934 		8
 | 
			
		||||
v 14.75 		-54.005 		0
 | 
			
		||||
v 14.75 		-54.005 		8
 | 
			
		||||
v 12.492 		-62.988 		8
 | 
			
		||||
v 24.131 		-57.249 		8
 | 
			
		||||
v 12.053 		-59.651 		8
 | 
			
		||||
v 12.492 		-62.988 		0
 | 
			
		||||
v 13.934 		-66.45 		8
 | 
			
		||||
v 13.934 		-66.45 		0
 | 
			
		||||
v 23.803 		-55.197 		0
 | 
			
		||||
v 12.219 		-58.817 		8
 | 
			
		||||
v 12.219 		-62.183 		8
 | 
			
		||||
v 13.197 		-65.803 		8
 | 
			
		||||
v 12.219 		-62.183 		0
 | 
			
		||||
v 23.066 		-54.55 		8
 | 
			
		||||
v 13.197 		-65.803 		0
 | 
			
		||||
v 23.803 		-55.197 		8
 | 
			
		||||
v 12.053 		-61.349 		8
 | 
			
		||||
v 12.55 		-65.066 		8
 | 
			
		||||
v 12.053 		-61.349 		0
 | 
			
		||||
v 14.542 		-55.341 		0
 | 
			
		||||
v 14.542 		-55.341 		8
 | 
			
		||||
v 12.55 		-65.066 		0
 | 
			
		||||
v 11.998 		-60.5 		8
 | 
			
		||||
v 15.249 		-54.869 		0
 | 
			
		||||
v 11.998 		-60.5 		0
 | 
			
		||||
v 15.249 		-54.869 		8
 | 
			
		||||
v 12.005 		-64.25 		0
 | 
			
		||||
v 12.005 		-64.25 		8
 | 
			
		||||
v 17.651 		-66.947 		0
 | 
			
		||||
v 16.012 		-54.492 		0
 | 
			
		||||
v 18.5 		-67.003 		0
 | 
			
		||||
v 16.012 		-54.492 		8
 | 
			
		||||
v 18.5 		-67.003 		8
 | 
			
		||||
v 17.651 		-66.947 		8
 | 
			
		||||
v 16.817 		-66.781 		0
 | 
			
		||||
v 16.817 		-54.219 		0
 | 
			
		||||
v 16.817 		-54.219 		8
 | 
			
		||||
v 20.441 		-67.744 		0
 | 
			
		||||
v 20.441 		-67.744 		8
 | 
			
		||||
v 16.817 		-66.781 		8
 | 
			
		||||
v 16.012 		-66.508 		0
 | 
			
		||||
v 17.651 		-54.053 		0
 | 
			
		||||
v 17.651 		-54.053 		8
 | 
			
		||||
v 16.012 		-66.508 		8
 | 
			
		||||
v 21.37 		-67.429 		0
 | 
			
		||||
v 21.37 		-67.429 		8
 | 
			
		||||
v 15.249 		-66.131 		0
 | 
			
		||||
v 18.5 		-53.998 		0
 | 
			
		||||
v 18.5 		-53.998 		8
 | 
			
		||||
v 15.249 		-66.131 		8
 | 
			
		||||
v 22.25 		-66.995 		0
 | 
			
		||||
v 22.25 		-66.995 		8
 | 
			
		||||
v 14.542 		-65.659 		0
 | 
			
		||||
v 19.349 		-54.053 		0
 | 
			
		||||
v 19.349 		-54.053 		8
 | 
			
		||||
v 14.542 		-65.659 		8
 | 
			
		||||
v 20.183 		-54.219 		0
 | 
			
		||||
v 20.183 		-54.219 		8
 | 
			
		||||
v 20.988 		-54.492 		0
 | 
			
		||||
v 20.988 		-54.492 		8
 | 
			
		||||
v 11 		-60.5 		0
 | 
			
		||||
v 11 		-60.5 		8
 | 
			
		||||
v 22.458 		-65.659 		0
 | 
			
		||||
v 21.751 		-54.869 		0
 | 
			
		||||
v 21.751 		-54.869 		8
 | 
			
		||||
v 11.064 		-61.479 		0
 | 
			
		||||
v 11.064 		-61.479 		8
 | 
			
		||||
v 22.458 		-65.659 		8
 | 
			
		||||
v 21.751 		-66.131 		0
 | 
			
		||||
v 22.458 		-55.341 		0
 | 
			
		||||
v 22.458 		-55.341 		8
 | 
			
		||||
v 11.256 		-62.441 		0
 | 
			
		||||
v 11.256 		-62.441 		8
 | 
			
		||||
v 21.751 		-66.131 		8
 | 
			
		||||
v 11.571 		-63.37 		0
 | 
			
		||||
v 11.571 		-63.37 		8
 | 
			
		||||
v 20.988 		-66.508 		0
 | 
			
		||||
v 20.988 		-66.508 		8
 | 
			
		||||
v 20.183 		-66.781 		0
 | 
			
		||||
v 20.183 		-66.781 		8
 | 
			
		||||
v 19.349 		-66.947 		0
 | 
			
		||||
v 19.349 		-66.947 		8
 | 
			
		||||
v 17.521 		-67.936 		8
 | 
			
		||||
v 18.5 		-68 		0
 | 
			
		||||
v 17.521 		-67.936 		0
 | 
			
		||||
v 18.5 		-68 		8
 | 
			
		||||
v 19.479 		-67.936 		8
 | 
			
		||||
v 19.479 		-67.936 		0
 | 
			
		||||
# 192 vertices
 | 
			
		||||
 | 
			
		||||
g group_0_16089887
 | 
			
		||||
 | 
			
		||||
usemtl color_16089887
 | 
			
		||||
s 0
 | 
			
		||||
 | 
			
		||||
f 1 	33 	69
 | 
			
		||||
f 2 	1 	55
 | 
			
		||||
f 12 	38 	10
 | 
			
		||||
f 13 	20 	43
 | 
			
		||||
f 8 	2 	42
 | 
			
		||||
f 16 	38 	12
 | 
			
		||||
f 17 	18 	19
 | 
			
		||||
f 17 	19 	21
 | 
			
		||||
f 35 	36 	22
 | 
			
		||||
f 7 	3 	68
 | 
			
		||||
f 11 	18 	15
 | 
			
		||||
f 24 	25 	26
 | 
			
		||||
f 24 	26 	27
 | 
			
		||||
f 33 	34 	25
 | 
			
		||||
f 33 	25 	24
 | 
			
		||||
f 39 	41 	18
 | 
			
		||||
f 19 	18 	41
 | 
			
		||||
f 38 	16 	37
 | 
			
		||||
f 36 	37 	22
 | 
			
		||||
f 22 	37 	16
 | 
			
		||||
f 35 	125 	106
 | 
			
		||||
f 30 	19 	20
 | 
			
		||||
f 1 	34 	33
 | 
			
		||||
f 52 	54 	32
 | 
			
		||||
f 52 	32 	31
 | 
			
		||||
f 39 	42 	43
 | 
			
		||||
f 39 	43 	41
 | 
			
		||||
f 40 	19 	30
 | 
			
		||||
f 42 	55 	56
 | 
			
		||||
f 42 	56 	43
 | 
			
		||||
f 44 	46 	14
 | 
			
		||||
f 28 	14 	46
 | 
			
		||||
f 46 	50 	28
 | 
			
		||||
f 28 	50 	53
 | 
			
		||||
f 47 	64 	65
 | 
			
		||||
f 47 	65 	49
 | 
			
		||||
f 23 	15 	18
 | 
			
		||||
f 18 	17 	23
 | 
			
		||||
f 29 	23 	17
 | 
			
		||||
f 29 	17 	48
 | 
			
		||||
f 29 	48 	51
 | 
			
		||||
f 114 	10 	58
 | 
			
		||||
f 59 	109 	58
 | 
			
		||||
f 55 	60 	61
 | 
			
		||||
f 55 	61 	56
 | 
			
		||||
f 62 	63 	54
 | 
			
		||||
f 62 	54 	52
 | 
			
		||||
f 60 	69 	71
 | 
			
		||||
f 60 	71 	61
 | 
			
		||||
f 64 	72 	73
 | 
			
		||||
f 64 	73 	65
 | 
			
		||||
f 14 	9 	44
 | 
			
		||||
f 9 	7 	44
 | 
			
		||||
f 70 	44 	7
 | 
			
		||||
f 68 	70 	7
 | 
			
		||||
f 3 	4 	68
 | 
			
		||||
f 66 	68 	4
 | 
			
		||||
f 72 	76 	78
 | 
			
		||||
f 72 	78 	73
 | 
			
		||||
f 69 	75 	77
 | 
			
		||||
f 69 	77 	71
 | 
			
		||||
f 76 	82 	83
 | 
			
		||||
f 76 	83 	78
 | 
			
		||||
f 79 	80 	45
 | 
			
		||||
f 80 	21 	45
 | 
			
		||||
f 40 	45 	21
 | 
			
		||||
f 40 	21 	19
 | 
			
		||||
f 70 	57 	44
 | 
			
		||||
f 38 	44 	57
 | 
			
		||||
f 75 	85 	86
 | 
			
		||||
f 75 	86 	77
 | 
			
		||||
f 82 	87 	88
 | 
			
		||||
f 82 	88 	83
 | 
			
		||||
f 89 	122 	74
 | 
			
		||||
f 70 	68 	58
 | 
			
		||||
f 70 	58 	57
 | 
			
		||||
f 87 	92 	94
 | 
			
		||||
f 87 	94 	88
 | 
			
		||||
f 68 	66 	59
 | 
			
		||||
f 68 	59 	58
 | 
			
		||||
f 113 	103 	67
 | 
			
		||||
f 102 	113 	67
 | 
			
		||||
f 97 	132 	89
 | 
			
		||||
f 92 	98 	100
 | 
			
		||||
f 92 	100 	94
 | 
			
		||||
f 99 	104 	91
 | 
			
		||||
f 85 	93 	95
 | 
			
		||||
f 85 	95 	86
 | 
			
		||||
f 112 	119 	81
 | 
			
		||||
f 84 	67 	103
 | 
			
		||||
f 103 	93 	84
 | 
			
		||||
f 103 	104 	93
 | 
			
		||||
f 180 	132 	107
 | 
			
		||||
f 32 	160 	111
 | 
			
		||||
f 108 	95 	99
 | 
			
		||||
f 127 	129 	109
 | 
			
		||||
f 4 	109 	129
 | 
			
		||||
f 119 	126 	81
 | 
			
		||||
f 90 	81 	126
 | 
			
		||||
f 98 	105 	106
 | 
			
		||||
f 98 	106 	100
 | 
			
		||||
f 96 	84 	93
 | 
			
		||||
f 93 	104 	95
 | 
			
		||||
f 3 	114 	109
 | 
			
		||||
f 3 	109 	4
 | 
			
		||||
f 115 	177 	107
 | 
			
		||||
f 111 	74 	116
 | 
			
		||||
f 26 	95 	108
 | 
			
		||||
f 169 	175 	49
 | 
			
		||||
f 35 	106 	105
 | 
			
		||||
f 126 	131 	90
 | 
			
		||||
f 101 	90 	131
 | 
			
		||||
f 27 	96 	93
 | 
			
		||||
f 93 	85 	27
 | 
			
		||||
f 7 	10 	114
 | 
			
		||||
f 7 	114 	3
 | 
			
		||||
f 25 	34 	77
 | 
			
		||||
f 121 	177 	115
 | 
			
		||||
f 116 	74 	122
 | 
			
		||||
f 104 	103 	120
 | 
			
		||||
f 113 	120 	103
 | 
			
		||||
f 9 	12 	10
 | 
			
		||||
f 9 	10 	7
 | 
			
		||||
f 22 	28 	125
 | 
			
		||||
f 124 	125 	28
 | 
			
		||||
f 110 	101 	131
 | 
			
		||||
f 131 	179 	110
 | 
			
		||||
f 85 	75 	27
 | 
			
		||||
f 24 	27 	75
 | 
			
		||||
f 120 	91 	104
 | 
			
		||||
f 179 	176 	110
 | 
			
		||||
f 117 	110 	176
 | 
			
		||||
f 97 	107 	132
 | 
			
		||||
f 122 	89 	132
 | 
			
		||||
f 14 	16 	12
 | 
			
		||||
f 14 	12 	9
 | 
			
		||||
f 104 	99 	95
 | 
			
		||||
f 34 	5 	71
 | 
			
		||||
f 128 	130 	125
 | 
			
		||||
f 128 	125 	124
 | 
			
		||||
f 118 	113 	102
 | 
			
		||||
f 28 	22 	16
 | 
			
		||||
f 28 	16 	14
 | 
			
		||||
f 134 	136 	130
 | 
			
		||||
f 134 	130 	128
 | 
			
		||||
f 113 	118 	120
 | 
			
		||||
f 135 	189 	133
 | 
			
		||||
f 90 	89 	74
 | 
			
		||||
f 90 	74 	81
 | 
			
		||||
f 140 	141 	136
 | 
			
		||||
f 140 	136 	134
 | 
			
		||||
f 49 	102 	47
 | 
			
		||||
f 101 	97 	89
 | 
			
		||||
f 101 	89 	90
 | 
			
		||||
f 142 	143 	191
 | 
			
		||||
f 142 	191 	192
 | 
			
		||||
f 146 	147 	141
 | 
			
		||||
f 146 	141 	140
 | 
			
		||||
f 5 	6 	56
 | 
			
		||||
f 6 	13 	43
 | 
			
		||||
f 41 	43 	20
 | 
			
		||||
f 41 	20 	19
 | 
			
		||||
f 43 	56 	6
 | 
			
		||||
f 56 	61 	5
 | 
			
		||||
f 61 	71 	5
 | 
			
		||||
f 71 	77 	34
 | 
			
		||||
f 26 	25 	77
 | 
			
		||||
f 77 	86 	26
 | 
			
		||||
f 95 	26 	86
 | 
			
		||||
f 102 	49 	118
 | 
			
		||||
f 149 	150 	143
 | 
			
		||||
f 149 	143 	142
 | 
			
		||||
f 110 	107 	97
 | 
			
		||||
f 110 	97 	101
 | 
			
		||||
f 139 	62 	145
 | 
			
		||||
f 152 	153 	147
 | 
			
		||||
f 152 	147 	146
 | 
			
		||||
f 34 	1 	5
 | 
			
		||||
f 154 	32 	148
 | 
			
		||||
f 155 	156 	150
 | 
			
		||||
f 155 	150 	149
 | 
			
		||||
f 130 	106 	125
 | 
			
		||||
f 158 	159 	153
 | 
			
		||||
f 158 	153 	152
 | 
			
		||||
f 117 	115 	107
 | 
			
		||||
f 117 	107 	110
 | 
			
		||||
f 2 	6 	5
 | 
			
		||||
f 2 	5 	1
 | 
			
		||||
f 160 	32 	154
 | 
			
		||||
f 22 	125 	35
 | 
			
		||||
f 161 	162 	159
 | 
			
		||||
f 161 	159 	158
 | 
			
		||||
f 123 	121 	115
 | 
			
		||||
f 123 	115 	117
 | 
			
		||||
f 8 	13 	6
 | 
			
		||||
f 8 	6 	2
 | 
			
		||||
f 156 	155 	51
 | 
			
		||||
f 151 	145 	31
 | 
			
		||||
f 112 	157 	31
 | 
			
		||||
f 151 	31 	157
 | 
			
		||||
f 81 	157 	112
 | 
			
		||||
f 163 	164 	162
 | 
			
		||||
f 163 	162 	161
 | 
			
		||||
f 121 	123 	129
 | 
			
		||||
f 121 	129 	127
 | 
			
		||||
f 11 	20 	13
 | 
			
		||||
f 11 	13 	8
 | 
			
		||||
f 74 	111 	160
 | 
			
		||||
f 32 	54 	148
 | 
			
		||||
f 54 	63 	148
 | 
			
		||||
f 166 	59 	165
 | 
			
		||||
f 66 	165 	59
 | 
			
		||||
f 147 	94 	141
 | 
			
		||||
f 141 	94 	136
 | 
			
		||||
f 29 	51 	167
 | 
			
		||||
f 168 	169 	164
 | 
			
		||||
f 168 	164 	163
 | 
			
		||||
f 15 	30 	20
 | 
			
		||||
f 15 	20 	11
 | 
			
		||||
f 166 	165 	170
 | 
			
		||||
f 166 	170 	171
 | 
			
		||||
f 153 	83 	147
 | 
			
		||||
f 130 	136 	106
 | 
			
		||||
f 174 	175 	169
 | 
			
		||||
f 174 	169 	168
 | 
			
		||||
f 170 	176 	177
 | 
			
		||||
f 170 	177 	171
 | 
			
		||||
f 23 	40 	30
 | 
			
		||||
f 23 	30 	15
 | 
			
		||||
f 178 	156 	172
 | 
			
		||||
f 133 	138 	137
 | 
			
		||||
f 133 	137 	135
 | 
			
		||||
f 176 	179 	180
 | 
			
		||||
f 176 	180 	177
 | 
			
		||||
f 51 	155 	167
 | 
			
		||||
f 29 	45 	40
 | 
			
		||||
f 29 	40 	23
 | 
			
		||||
f 67 	91 	175
 | 
			
		||||
f 67 	175 	174
 | 
			
		||||
f 150 	156 	182
 | 
			
		||||
f 45 	172 	79
 | 
			
		||||
f 139 	144 	138
 | 
			
		||||
f 139 	138 	133
 | 
			
		||||
f 180 	131 	132
 | 
			
		||||
f 105 	53 	35
 | 
			
		||||
f 173 	167 	155
 | 
			
		||||
f 179 	131 	180
 | 
			
		||||
f 53 	50 	36
 | 
			
		||||
f 53 	36 	35
 | 
			
		||||
f 184 	143 	182
 | 
			
		||||
f 79 	172 	156
 | 
			
		||||
f 50 	46 	37
 | 
			
		||||
f 50 	37 	36
 | 
			
		||||
f 145 	148 	144
 | 
			
		||||
f 145 	144 	139
 | 
			
		||||
f 186 	143 	184
 | 
			
		||||
f 46 	44 	38
 | 
			
		||||
f 46 	38 	37
 | 
			
		||||
f 155 	149 	181
 | 
			
		||||
f 181 	173 	155
 | 
			
		||||
f 175 	91 	118
 | 
			
		||||
f 91 	67 	84
 | 
			
		||||
f 91 	84 	99
 | 
			
		||||
f 151 	154 	148
 | 
			
		||||
f 151 	148 	145
 | 
			
		||||
f 131 	126 	122
 | 
			
		||||
f 131 	122 	132
 | 
			
		||||
f 190 	191 	137
 | 
			
		||||
f 178 	182 	156
 | 
			
		||||
f 183 	181 	142
 | 
			
		||||
f 149 	142 	181
 | 
			
		||||
f 99 	84 	96
 | 
			
		||||
f 99 	96 	108
 | 
			
		||||
f 169 	49 	164
 | 
			
		||||
f 120 	118 	91
 | 
			
		||||
f 118 	49 	175
 | 
			
		||||
f 65 	164 	49
 | 
			
		||||
f 157 	160 	154
 | 
			
		||||
f 157 	154 	151
 | 
			
		||||
f 75 	69 	33
 | 
			
		||||
f 33 	24 	75
 | 
			
		||||
f 69 	60 	1
 | 
			
		||||
f 60 	55 	1
 | 
			
		||||
f 55 	42 	2
 | 
			
		||||
f 11 	8 	42
 | 
			
		||||
f 42 	39 	11
 | 
			
		||||
f 18 	11 	39
 | 
			
		||||
f 108 	96 	27
 | 
			
		||||
f 108 	27 	26
 | 
			
		||||
f 126 	119 	116
 | 
			
		||||
f 126 	116 	122
 | 
			
		||||
f 124 	28 	53
 | 
			
		||||
f 81 	74 	160
 | 
			
		||||
f 81 	160 	157
 | 
			
		||||
f 53 	105 	124
 | 
			
		||||
f 128 	124 	105
 | 
			
		||||
f 116 	119 	111
 | 
			
		||||
f 112 	111 	119
 | 
			
		||||
f 138 	144 	63
 | 
			
		||||
f 144 	148 	63
 | 
			
		||||
f 63 	187 	138
 | 
			
		||||
f 137 	138 	187
 | 
			
		||||
f 187 	190 	137
 | 
			
		||||
f 150 	182 	143
 | 
			
		||||
f 134 	128 	105
 | 
			
		||||
f 52 	31 	145
 | 
			
		||||
f 62 	52 	145
 | 
			
		||||
f 62 	139 	133
 | 
			
		||||
f 142 	192 	185
 | 
			
		||||
f 185 	183 	142
 | 
			
		||||
f 185 	192 	135
 | 
			
		||||
f 188 	135 	192
 | 
			
		||||
f 94 	147 	88
 | 
			
		||||
f 100 	136 	94
 | 
			
		||||
f 106 	136 	100
 | 
			
		||||
f 88 	147 	83
 | 
			
		||||
f 83 	153 	159
 | 
			
		||||
f 162 	73 	159
 | 
			
		||||
f 65 	73 	164
 | 
			
		||||
f 162 	164 	73
 | 
			
		||||
f 73 	78 	159
 | 
			
		||||
f 83 	159 	78
 | 
			
		||||
f 45 	29 	167
 | 
			
		||||
f 45 	167 	172
 | 
			
		||||
f 105 	98 	134
 | 
			
		||||
f 98 	92 	134
 | 
			
		||||
f 140 	134 	92
 | 
			
		||||
f 127 	109 	166
 | 
			
		||||
f 121 	127 	166
 | 
			
		||||
f 166 	171 	121
 | 
			
		||||
f 177 	121 	171
 | 
			
		||||
f 180 	107 	177
 | 
			
		||||
f 123 	117 	176
 | 
			
		||||
f 176 	170 	123
 | 
			
		||||
f 170 	165 	123
 | 
			
		||||
f 129 	123 	165
 | 
			
		||||
f 4 	129 	165
 | 
			
		||||
f 4 	165 	66
 | 
			
		||||
f 172 	167 	173
 | 
			
		||||
f 172 	173 	178
 | 
			
		||||
f 62 	133 	189
 | 
			
		||||
f 189 	135 	188
 | 
			
		||||
f 114 	58 	109
 | 
			
		||||
f 59 	166 	109
 | 
			
		||||
f 161 	72 	163
 | 
			
		||||
f 143 	186 	191
 | 
			
		||||
f 186 	137 	191
 | 
			
		||||
f 111 	112 	32
 | 
			
		||||
f 31 	32 	112
 | 
			
		||||
f 38 	57 	10
 | 
			
		||||
f 57 	58 	10
 | 
			
		||||
f 178 	173 	181
 | 
			
		||||
f 178 	181 	182
 | 
			
		||||
f 51 	79 	156
 | 
			
		||||
f 168 	163 	47
 | 
			
		||||
f 174 	168 	47
 | 
			
		||||
f 47 	102 	174
 | 
			
		||||
f 67 	174 	102
 | 
			
		||||
f 51 	48 	80
 | 
			
		||||
f 51 	80 	79
 | 
			
		||||
f 182 	181 	183
 | 
			
		||||
f 182 	183 	184
 | 
			
		||||
f 48 	17 	21
 | 
			
		||||
f 48 	21 	80
 | 
			
		||||
f 64 	47 	163
 | 
			
		||||
f 158 	72 	161
 | 
			
		||||
f 87 	82 	146
 | 
			
		||||
f 146 	140 	92
 | 
			
		||||
f 92 	87 	146
 | 
			
		||||
f 152 	146 	82
 | 
			
		||||
f 158 	152 	82
 | 
			
		||||
f 82 	76 	158
 | 
			
		||||
f 72 	158 	76
 | 
			
		||||
f 64 	163 	72
 | 
			
		||||
f 184 	183 	185
 | 
			
		||||
f 184 	185 	186
 | 
			
		||||
f 186 	185 	135
 | 
			
		||||
f 186 	135 	137
 | 
			
		||||
f 190 	188 	192
 | 
			
		||||
f 190 	192 	191
 | 
			
		||||
f 63 	62 	187
 | 
			
		||||
f 189 	187 	62
 | 
			
		||||
f 188 	190 	187
 | 
			
		||||
f 188 	187 	189
 | 
			
		||||
# 384 faces
 | 
			
		||||
 | 
			
		||||
 #end of obj_0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2953
									
								
								case/body.obj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1133
									
								
								case/face.obj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										361
									
								
								case/insert.obj
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,361 @@
 | 
			
		||||
# Object Export From Tinkercad Server 2015
 | 
			
		||||
 | 
			
		||||
mtllib obj.mtl
 | 
			
		||||
 | 
			
		||||
o obj_0
 | 
			
		||||
v 35.425 		-3.7 		0.32
 | 
			
		||||
v 35.425 		-3.7 		0
 | 
			
		||||
v 35.425 		-14.1 		0
 | 
			
		||||
v 35.425 		-14.1 		0.32
 | 
			
		||||
v 60.0646 		-9.8708 		0
 | 
			
		||||
v 60.1961 		-9.9358 		0
 | 
			
		||||
v 60.0646 		-7.9292 		0
 | 
			
		||||
v 36.625 		-12.9 		0.32
 | 
			
		||||
v 59.9425 		-8.0104 		0
 | 
			
		||||
v 36.625 		-4.9 		0.32
 | 
			
		||||
v 59.8322 		-8.1072 		0
 | 
			
		||||
v 59.9425 		-9.7896 		0
 | 
			
		||||
v 62.0396 		-10.3146 		1.32
 | 
			
		||||
v 36.625 		-4.9 		1.32
 | 
			
		||||
v 60.1961 		-7.8642 		0
 | 
			
		||||
v 61.8428 		-10.4874 		1.32
 | 
			
		||||
v 60.335 		-9.9828 		0
 | 
			
		||||
v 62.2124 		-10.1178 		1.32
 | 
			
		||||
v 60.4789 		-10.0114 		0
 | 
			
		||||
v 36.625 		-12.9 		1.32
 | 
			
		||||
v 85.825 		-14.1 		0.32
 | 
			
		||||
v 85.825 		-14.1 		0
 | 
			
		||||
v 85.825 		-3.7 		0
 | 
			
		||||
v 60.625 		-10.0214 		0
 | 
			
		||||
v 85.825 		-3.7 		0.32
 | 
			
		||||
v 84.625 		-4.9 		0.32
 | 
			
		||||
v 84.625 		-12.9 		0.32
 | 
			
		||||
v 62.628 		-3.7 		0
 | 
			
		||||
v 62.3573 		-9.9 		1.32
 | 
			
		||||
v 62.4732 		-9.6652 		1.32
 | 
			
		||||
v 84.625 		-4.9 		1.32
 | 
			
		||||
v 84.625 		-12.9 		1.32
 | 
			
		||||
v 62.608 		-9.1607 		1.32
 | 
			
		||||
v 62.5571 		-9.4175 		1.32
 | 
			
		||||
v 60.7711 		-10.0114 		0
 | 
			
		||||
v 62.626 		-8.9 		1.32
 | 
			
		||||
v 61.8846 		-10.903 		0
 | 
			
		||||
v 62.608 		-8.6393 		1.32
 | 
			
		||||
v 60.915 		-9.9828 		0
 | 
			
		||||
v 61.1854 		-9.8708 		0
 | 
			
		||||
v 61.0539 		-9.9358 		0
 | 
			
		||||
v 61.3075 		-9.7896 		0
 | 
			
		||||
v 61.4178 		-9.6928 		0
 | 
			
		||||
v 62.5571 		-8.3825 		1.32
 | 
			
		||||
v 59.7354 		-8.2175 		0
 | 
			
		||||
v 61.5146 		-9.5825 		0
 | 
			
		||||
v 61.5958 		-9.4604 		0
 | 
			
		||||
v 59.6542 		-8.3396 		0
 | 
			
		||||
v 59.5892 		-8.4711 		0
 | 
			
		||||
v 61.6608 		-9.3289 		0
 | 
			
		||||
v 59.5422 		-8.61 		0
 | 
			
		||||
v 61.7078 		-9.19 		0
 | 
			
		||||
v 61.7364 		-9.0461 		0
 | 
			
		||||
v 59.5136 		-8.7539 		0
 | 
			
		||||
v 61.7464 		-8.9 		0
 | 
			
		||||
v 59.5041 		-8.9 		0
 | 
			
		||||
v 61.7364 		-8.7539 		0
 | 
			
		||||
v 59.5136 		-9.0461 		0
 | 
			
		||||
v 61.7078 		-8.61 		0
 | 
			
		||||
v 62.4732 		-8.1348 		1.32
 | 
			
		||||
v 59.5422 		-9.19 		0
 | 
			
		||||
v 61.6608 		-8.4711 		0
 | 
			
		||||
v 62.3573 		-7.9 		1.32
 | 
			
		||||
v 59.5892 		-9.3289 		0
 | 
			
		||||
v 61.5958 		-8.3396 		0
 | 
			
		||||
v 61.5146 		-8.2175 		0
 | 
			
		||||
v 59.6542 		-9.4604 		0
 | 
			
		||||
v 59.7354 		-9.5825 		0
 | 
			
		||||
v 62.2124 		-7.6822 		1.32
 | 
			
		||||
v 59.8322 		-9.6928 		0
 | 
			
		||||
v 61.4178 		-8.1072 		0
 | 
			
		||||
v 62.0396 		-7.4854 		1.32
 | 
			
		||||
v 61.3075 		-8.0104 		0
 | 
			
		||||
v 61.1854 		-7.9292 		0
 | 
			
		||||
v 61.8428 		-7.3126 		1.32
 | 
			
		||||
v 61.0539 		-7.8642 		0
 | 
			
		||||
v 61.625 		-7.1677 		1.32
 | 
			
		||||
v 60.915 		-7.8172 		0
 | 
			
		||||
v 60.7711 		-7.7886 		0
 | 
			
		||||
v 61.3902 		-7.0518 		1.32
 | 
			
		||||
v 60.625 		-7.7791 		0
 | 
			
		||||
v 60.4789 		-7.7886 		0
 | 
			
		||||
v 61.1425 		-6.9679 		1.32
 | 
			
		||||
v 60.335 		-7.8172 		0
 | 
			
		||||
v 60.8857 		-6.917 		1.32
 | 
			
		||||
v 60.625 		-6.9 		1.32
 | 
			
		||||
v 60.3643 		-6.917 		1.32
 | 
			
		||||
v 60.1075 		-6.9679 		1.32
 | 
			
		||||
v 59.8598 		-7.0518 		1.32
 | 
			
		||||
v 59.625 		-7.1677 		1.32
 | 
			
		||||
v 59.4072 		-7.3126 		1.32
 | 
			
		||||
v 62.628 		-4.9 		1.32
 | 
			
		||||
v 59.2104 		-7.4854 		1.32
 | 
			
		||||
v 59.0376 		-7.6822 		1.32
 | 
			
		||||
v 58.8927 		-7.9 		1.32
 | 
			
		||||
v 58.7768 		-8.1348 		1.32
 | 
			
		||||
v 60.8857 		-10.883 		1.32
 | 
			
		||||
v 60.625 		-10.901 		1.32
 | 
			
		||||
v 58.6929 		-8.3825 		1.32
 | 
			
		||||
v 58.642 		-8.6393 		1.32
 | 
			
		||||
v 58.625 		-8.9 		1.32
 | 
			
		||||
v 58.642 		-9.1607 		1.32
 | 
			
		||||
v 58.6929 		-9.4175 		1.32
 | 
			
		||||
v 58.7768 		-9.6652 		1.32
 | 
			
		||||
v 58.8927 		-9.9 		1.32
 | 
			
		||||
v 59.0376 		-10.1178 		1.32
 | 
			
		||||
v 59.2104 		-10.3146 		1.32
 | 
			
		||||
v 59.4072 		-10.4874 		1.32
 | 
			
		||||
v 59.625 		-10.6323 		1.32
 | 
			
		||||
v 59.8598 		-10.7482 		1.32
 | 
			
		||||
v 60.1075 		-10.8321 		1.32
 | 
			
		||||
v 60.3643 		-10.883 		1.32
 | 
			
		||||
v 61.1425 		-10.8321 		1.32
 | 
			
		||||
v 61.3902 		-10.7482 		1.32
 | 
			
		||||
v 61.625 		-10.6323 		1.32
 | 
			
		||||
# 115 vertices
 | 
			
		||||
 | 
			
		||||
g group_0_15277357
 | 
			
		||||
 | 
			
		||||
usemtl color_15277357
 | 
			
		||||
s 0
 | 
			
		||||
 | 
			
		||||
f 1 	2 	3
 | 
			
		||||
f 1 	3 	4
 | 
			
		||||
f 4 	8 	1
 | 
			
		||||
f 8 	10 	1
 | 
			
		||||
f 6 	3 	5
 | 
			
		||||
f 37 	3 	17
 | 
			
		||||
f 70 	3 	68
 | 
			
		||||
f 14 	10 	8
 | 
			
		||||
f 14 	8 	20
 | 
			
		||||
f 21 	22 	23
 | 
			
		||||
f 21 	23 	25
 | 
			
		||||
f 112 	19 	17
 | 
			
		||||
f 21 	25 	27
 | 
			
		||||
f 26 	27 	25
 | 
			
		||||
f 19 	112 	24
 | 
			
		||||
f 9 	2 	7
 | 
			
		||||
f 11 	2 	9
 | 
			
		||||
f 32 	26 	31
 | 
			
		||||
f 32 	27 	26
 | 
			
		||||
f 34 	30 	32
 | 
			
		||||
f 30 	29 	32
 | 
			
		||||
f 71 	23 	66
 | 
			
		||||
f 73 	28 	71
 | 
			
		||||
f 23 	71 	28
 | 
			
		||||
f 22 	55 	23
 | 
			
		||||
f 52 	50 	34
 | 
			
		||||
f 33 	34 	32
 | 
			
		||||
f 46 	22 	37
 | 
			
		||||
f 3 	37 	22
 | 
			
		||||
f 34 	33 	52
 | 
			
		||||
f 53 	52 	33
 | 
			
		||||
f 28 	15 	2
 | 
			
		||||
f 6 	17 	3
 | 
			
		||||
f 24 	37 	19
 | 
			
		||||
f 35 	37 	24
 | 
			
		||||
f 39 	37 	35
 | 
			
		||||
f 17 	19 	37
 | 
			
		||||
f 2 	56 	3
 | 
			
		||||
f 21 	4 	3
 | 
			
		||||
f 21 	3 	22
 | 
			
		||||
f 25 	28 	1
 | 
			
		||||
f 53 	33 	55
 | 
			
		||||
f 36 	55 	33
 | 
			
		||||
f 28 	25 	23
 | 
			
		||||
f 42 	37 	40
 | 
			
		||||
f 28 	2 	1
 | 
			
		||||
f 39 	41 	37
 | 
			
		||||
f 55 	36 	38
 | 
			
		||||
f 43 	37 	42
 | 
			
		||||
f 41 	40 	37
 | 
			
		||||
f 45 	2 	11
 | 
			
		||||
f 97 	35 	24
 | 
			
		||||
f 22 	46 	47
 | 
			
		||||
f 49 	2 	48
 | 
			
		||||
f 48 	2 	45
 | 
			
		||||
f 50 	22 	47
 | 
			
		||||
f 51 	2 	49
 | 
			
		||||
f 52 	22 	50
 | 
			
		||||
f 39 	113 	41
 | 
			
		||||
f 53 	22 	52
 | 
			
		||||
f 54 	2 	51
 | 
			
		||||
f 55 	22 	53
 | 
			
		||||
f 114 	115 	41
 | 
			
		||||
f 56 	2 	54
 | 
			
		||||
f 57 	23 	55
 | 
			
		||||
f 37 	43 	46
 | 
			
		||||
f 59 	23 	57
 | 
			
		||||
f 62 	23 	59
 | 
			
		||||
f 64 	3 	61
 | 
			
		||||
f 65 	23 	62
 | 
			
		||||
f 65 	62 	63
 | 
			
		||||
f 66 	23 	65
 | 
			
		||||
f 67 	3 	64
 | 
			
		||||
f 61 	3 	58
 | 
			
		||||
f 69 	66 	63
 | 
			
		||||
f 12 	3 	70
 | 
			
		||||
f 58 	3 	56
 | 
			
		||||
f 5 	3 	12
 | 
			
		||||
f 68 	3 	67
 | 
			
		||||
f 36 	31 	38
 | 
			
		||||
f 101 	56 	54
 | 
			
		||||
f 78 	28 	76
 | 
			
		||||
f 76 	28 	74
 | 
			
		||||
f 101 	58 	56
 | 
			
		||||
f 38 	31 	44
 | 
			
		||||
f 79 	28 	78
 | 
			
		||||
f 81 	28 	79
 | 
			
		||||
f 58 	102 	61
 | 
			
		||||
f 82 	28 	81
 | 
			
		||||
f 73 	74 	28
 | 
			
		||||
f 84 	28 	82
 | 
			
		||||
f 61 	103 	64
 | 
			
		||||
f 15 	28 	84
 | 
			
		||||
f 63 	60 	31
 | 
			
		||||
f 114 	41 	113
 | 
			
		||||
f 7 	2 	15
 | 
			
		||||
f 81 	79 	86
 | 
			
		||||
f 67 	105 	68
 | 
			
		||||
f 87 	82 	86
 | 
			
		||||
f 107 	70 	68
 | 
			
		||||
f 107 	68 	106
 | 
			
		||||
f 40 	115 	42
 | 
			
		||||
f 70 	107 	12
 | 
			
		||||
f 16 	13 	42
 | 
			
		||||
f 43 	42 	13
 | 
			
		||||
f 75 	72 	92
 | 
			
		||||
f 77 	75 	92
 | 
			
		||||
f 18 	46 	13
 | 
			
		||||
f 43 	13 	46
 | 
			
		||||
f 20 	27 	32
 | 
			
		||||
f 27 	20 	8
 | 
			
		||||
f 83 	80 	92
 | 
			
		||||
f 85 	83 	92
 | 
			
		||||
f 18 	29 	46
 | 
			
		||||
f 47 	46 	29
 | 
			
		||||
f 10 	26 	1
 | 
			
		||||
f 25 	1 	26
 | 
			
		||||
f 47 	29 	50
 | 
			
		||||
f 30 	50 	29
 | 
			
		||||
f 92 	10 	14
 | 
			
		||||
f 7 	15 	90
 | 
			
		||||
f 89 	90 	15
 | 
			
		||||
f 30 	34 	50
 | 
			
		||||
f 91 	9 	90
 | 
			
		||||
f 7 	90 	9
 | 
			
		||||
f 89 	14 	90
 | 
			
		||||
f 9 	91 	93
 | 
			
		||||
f 9 	93 	11
 | 
			
		||||
f 90 	14 	91
 | 
			
		||||
f 48 	45 	95
 | 
			
		||||
f 93 	91 	14
 | 
			
		||||
f 38 	57 	55
 | 
			
		||||
f 95 	94 	14
 | 
			
		||||
f 94 	93 	14
 | 
			
		||||
f 94 	45 	93
 | 
			
		||||
f 45 	11 	93
 | 
			
		||||
f 96 	95 	14
 | 
			
		||||
f 44 	59 	38
 | 
			
		||||
f 57 	38 	59
 | 
			
		||||
f 10 	92 	26
 | 
			
		||||
f 31 	26 	92
 | 
			
		||||
f 60 	62 	44
 | 
			
		||||
f 59 	44 	62
 | 
			
		||||
f 89 	88 	14
 | 
			
		||||
f 92 	14 	88
 | 
			
		||||
f 87 	92 	88
 | 
			
		||||
f 87 	86 	92
 | 
			
		||||
f 86 	85 	92
 | 
			
		||||
f 60 	63 	62
 | 
			
		||||
f 24 	98 	97
 | 
			
		||||
f 20 	32 	98
 | 
			
		||||
f 80 	77 	92
 | 
			
		||||
f 69 	31 	72
 | 
			
		||||
f 63 	31 	69
 | 
			
		||||
f 92 	72 	31
 | 
			
		||||
f 60 	44 	31
 | 
			
		||||
f 36 	33 	32
 | 
			
		||||
f 31 	36 	32
 | 
			
		||||
f 39 	35 	97
 | 
			
		||||
f 99 	96 	14
 | 
			
		||||
f 97 	98 	32
 | 
			
		||||
f 98 	112 	20
 | 
			
		||||
f 100 	99 	14
 | 
			
		||||
f 65 	63 	66
 | 
			
		||||
f 94 	95 	45
 | 
			
		||||
f 101 	100 	14
 | 
			
		||||
f 111 	110 	20
 | 
			
		||||
f 20 	105 	104
 | 
			
		||||
f 103 	102 	20
 | 
			
		||||
f 14 	20 	101
 | 
			
		||||
f 104 	103 	20
 | 
			
		||||
f 102 	101 	20
 | 
			
		||||
f 8 	4 	27
 | 
			
		||||
f 4 	21 	27
 | 
			
		||||
f 69 	72 	66
 | 
			
		||||
f 71 	66 	72
 | 
			
		||||
f 96 	49 	95
 | 
			
		||||
f 48 	95 	49
 | 
			
		||||
f 75 	73 	72
 | 
			
		||||
f 71 	72 	73
 | 
			
		||||
f 96 	99 	49
 | 
			
		||||
f 51 	49 	99
 | 
			
		||||
f 77 	74 	73
 | 
			
		||||
f 77 	73 	75
 | 
			
		||||
f 106 	105 	20
 | 
			
		||||
f 99 	100 	51
 | 
			
		||||
f 54 	51 	100
 | 
			
		||||
f 74 	77 	76
 | 
			
		||||
f 80 	76 	77
 | 
			
		||||
f 107 	106 	20
 | 
			
		||||
f 108 	107 	20
 | 
			
		||||
f 83 	78 	76
 | 
			
		||||
f 83 	76 	80
 | 
			
		||||
f 101 	54 	100
 | 
			
		||||
f 109 	108 	20
 | 
			
		||||
f 110 	109 	20
 | 
			
		||||
f 83 	85 	78
 | 
			
		||||
f 79 	78 	85
 | 
			
		||||
f 111 	20 	112
 | 
			
		||||
f 102 	58 	101
 | 
			
		||||
f 85 	86 	79
 | 
			
		||||
f 103 	61 	102
 | 
			
		||||
f 97 	32 	113
 | 
			
		||||
f 81 	86 	82
 | 
			
		||||
f 64 	103 	104
 | 
			
		||||
f 114 	113 	32
 | 
			
		||||
f 82 	87 	84
 | 
			
		||||
f 88 	84 	87
 | 
			
		||||
f 114 	32 	115
 | 
			
		||||
f 104 	105 	64
 | 
			
		||||
f 67 	64 	105
 | 
			
		||||
f 89 	15 	88
 | 
			
		||||
f 84 	88 	15
 | 
			
		||||
f 115 	32 	16
 | 
			
		||||
f 106 	68 	105
 | 
			
		||||
f 16 	32 	13
 | 
			
		||||
f 13 	32 	18
 | 
			
		||||
f 12 	107 	108
 | 
			
		||||
f 29 	18 	32
 | 
			
		||||
f 109 	5 	12
 | 
			
		||||
f 109 	12 	108
 | 
			
		||||
f 5 	109 	6
 | 
			
		||||
f 110 	6 	109
 | 
			
		||||
f 111 	17 	6
 | 
			
		||||
f 111 	6 	110
 | 
			
		||||
f 17 	111 	112
 | 
			
		||||
f 24 	112 	98
 | 
			
		||||
f 113 	39 	97
 | 
			
		||||
f 40 	41 	115
 | 
			
		||||
f 16 	42 	115
 | 
			
		||||
# 230 faces
 | 
			
		||||
 | 
			
		||||
 #end of obj_0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										64
									
								
								case/usb-extension.obj
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,64 @@
 | 
			
		||||
# Object Export From Tinkercad Server 2015
 | 
			
		||||
 | 
			
		||||
mtllib obj.mtl
 | 
			
		||||
 | 
			
		||||
o obj_0
 | 
			
		||||
v 22.378 		-32.248 		0
 | 
			
		||||
v 15.373 		-32.248 		0
 | 
			
		||||
v 15.373 		-45.253 		0
 | 
			
		||||
v 22.378 		-45.253 		0
 | 
			
		||||
v 13.375 		-47.25 		0
 | 
			
		||||
v 13.375 		-30.25 		0
 | 
			
		||||
v 24.375 		-47.25 		0
 | 
			
		||||
v 24.375 		-30.25 		0
 | 
			
		||||
v 22.378 		-45.253 		20
 | 
			
		||||
v 15.373 		-45.253 		20
 | 
			
		||||
v 15.373 		-32.248 		20
 | 
			
		||||
v 22.378 		-32.248 		20
 | 
			
		||||
v 24.375 		-30.25 		20
 | 
			
		||||
v 24.375 		-47.25 		20
 | 
			
		||||
v 13.375 		-47.25 		20
 | 
			
		||||
v 13.375 		-30.25 		20
 | 
			
		||||
# 16 vertices
 | 
			
		||||
 | 
			
		||||
g group_0_15277357
 | 
			
		||||
 | 
			
		||||
usemtl color_15277357
 | 
			
		||||
s 0
 | 
			
		||||
 | 
			
		||||
f 6 	8 	2
 | 
			
		||||
f 4 	7 	3
 | 
			
		||||
f 3 	5 	2
 | 
			
		||||
f 5 	6 	2
 | 
			
		||||
f 5 	3 	7
 | 
			
		||||
f 7 	4 	1
 | 
			
		||||
f 1 	2 	8
 | 
			
		||||
f 7 	1 	8
 | 
			
		||||
f 12 	13 	11
 | 
			
		||||
f 10 	14 	9
 | 
			
		||||
f 8 	13 	14
 | 
			
		||||
f 8 	14 	7
 | 
			
		||||
f 5 	15 	16
 | 
			
		||||
f 5 	16 	6
 | 
			
		||||
f 5 	14 	15
 | 
			
		||||
f 16 	15 	11
 | 
			
		||||
f 10 	11 	15
 | 
			
		||||
f 14 	10 	15
 | 
			
		||||
f 5 	7 	14
 | 
			
		||||
f 16 	11 	13
 | 
			
		||||
f 9 	14 	12
 | 
			
		||||
f 13 	12 	14
 | 
			
		||||
f 9 	4 	3
 | 
			
		||||
f 9 	3 	10
 | 
			
		||||
f 10 	3 	2
 | 
			
		||||
f 10 	2 	11
 | 
			
		||||
f 16 	13 	6
 | 
			
		||||
f 8 	6 	13
 | 
			
		||||
f 12 	1 	4
 | 
			
		||||
f 12 	4 	9
 | 
			
		||||
f 1 	12 	11
 | 
			
		||||
f 1 	11 	2
 | 
			
		||||
# 32 faces
 | 
			
		||||
 | 
			
		||||
 #end of obj_0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										459
									
								
								supersensor.yaml
									
									
									
									
									
								
							
							
						
						@@ -31,19 +31,22 @@ esphome:
 | 
			
		||||
  on_boot:
 | 
			
		||||
    - priority: 600
 | 
			
		||||
      then:
 | 
			
		||||
        - light.turn_on:
 | 
			
		||||
            id: output_led
 | 
			
		||||
        - delay: 0.25s
 | 
			
		||||
        - light.turn_off:
 | 
			
		||||
            id: output_led
 | 
			
		||||
        - delay: 0.25s
 | 
			
		||||
        - light.turn_on:
 | 
			
		||||
            id: output_led
 | 
			
		||||
        - delay: 0.25s
 | 
			
		||||
        - light.turn_off:
 | 
			
		||||
            id: output_led
 | 
			
		||||
        - lambda: |-
 | 
			
		||||
            id(supersensor_occupancy).publish_state(false);
 | 
			
		||||
            id(pir_presence).publish_state(false);
 | 
			
		||||
            id(light_presence).publish_state(false);
 | 
			
		||||
            id(radar_presence).publish_state(false);
 | 
			
		||||
    - priority: 100
 | 
			
		||||
      then:
 | 
			
		||||
        - light.turn_on:
 | 
			
		||||
            id: output_led
 | 
			
		||||
            effect: flash_white
 | 
			
		||||
        - delay: 2s
 | 
			
		||||
        - light.turn_off:
 | 
			
		||||
            id: output_led
 | 
			
		||||
    - priority: -100
 | 
			
		||||
      then:
 | 
			
		||||
        - if:
 | 
			
		||||
@@ -86,6 +89,51 @@ globals:
 | 
			
		||||
    restore_value: true
 | 
			
		||||
    initial_value: "0.0"
 | 
			
		||||
 | 
			
		||||
  - id: room_health_temperature_min
 | 
			
		||||
    type: float
 | 
			
		||||
    restore_value: true
 | 
			
		||||
    initial_value: "21.0"
 | 
			
		||||
 | 
			
		||||
  - id: room_health_temperature_max
 | 
			
		||||
    type: float
 | 
			
		||||
    restore_value: true
 | 
			
		||||
    initial_value: "24.0"
 | 
			
		||||
 | 
			
		||||
  - id: room_health_temperature_penalty
 | 
			
		||||
    type: float
 | 
			
		||||
    restore_value: true
 | 
			
		||||
    initial_value: "10.0"
 | 
			
		||||
 | 
			
		||||
  - id: room_health_humidity_min
 | 
			
		||||
    type: float
 | 
			
		||||
    restore_value: true
 | 
			
		||||
    initial_value: "40.0"
 | 
			
		||||
 | 
			
		||||
  - id: room_health_humidity_max
 | 
			
		||||
    type: float
 | 
			
		||||
    restore_value: true
 | 
			
		||||
    initial_value: "60.0"
 | 
			
		||||
 | 
			
		||||
  - id: room_health_humidity_penalty
 | 
			
		||||
    type: float
 | 
			
		||||
    restore_value: true
 | 
			
		||||
    initial_value: "5.0"
 | 
			
		||||
 | 
			
		||||
  - id: room_health_voc_weight
 | 
			
		||||
    type: float
 | 
			
		||||
    restore_value: true
 | 
			
		||||
    initial_value: "0.4"
 | 
			
		||||
 | 
			
		||||
  - id: room_health_temperature_weight
 | 
			
		||||
    type: float
 | 
			
		||||
    restore_value: true
 | 
			
		||||
    initial_value: "0.3"
 | 
			
		||||
 | 
			
		||||
  - id: room_health_humidity_weight
 | 
			
		||||
    type: float
 | 
			
		||||
    restore_value: true
 | 
			
		||||
    initial_value: "0.3"
 | 
			
		||||
 | 
			
		||||
  - id: pir_hold_time
 | 
			
		||||
    type: int
 | 
			
		||||
    restore_value: true
 | 
			
		||||
@@ -116,25 +164,34 @@ globals:
 | 
			
		||||
    restore_value: yes
 | 
			
		||||
    initial_value: '"mww_computer"'
 | 
			
		||||
 | 
			
		||||
  - id: light_is_holding
 | 
			
		||||
    type: bool
 | 
			
		||||
    restore_value: no
 | 
			
		||||
    initial_value: 'false'
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
  - id: light_off
 | 
			
		||||
    then:
 | 
			
		||||
      if:
 | 
			
		||||
        condition:
 | 
			
		||||
          - binary_sensor.is_on: supersensor_occupancy
 | 
			
		||||
          - switch.is_on: enable_presence_led
 | 
			
		||||
        then:
 | 
			
		||||
          - light.turn_on:
 | 
			
		||||
              id: output_led
 | 
			
		||||
              brightness: 15%
 | 
			
		||||
              red: 1
 | 
			
		||||
              green: 1
 | 
			
		||||
              blue: 1
 | 
			
		||||
              transition_length: 1s
 | 
			
		||||
        else:
 | 
			
		||||
          - light.turn_off:
 | 
			
		||||
              id: output_led
 | 
			
		||||
              transition_length: 1s
 | 
			
		||||
      - if:
 | 
			
		||||
          condition:
 | 
			
		||||
            lambda: 'return !id(light_is_holding);'
 | 
			
		||||
          then:
 | 
			
		||||
            - if:
 | 
			
		||||
                condition:
 | 
			
		||||
                  - binary_sensor.is_on: supersensor_occupancy
 | 
			
		||||
                  - switch.is_on: enable_presence_led
 | 
			
		||||
                then:
 | 
			
		||||
                  - light.turn_on:
 | 
			
		||||
                      id: output_led
 | 
			
		||||
                      brightness: 25%
 | 
			
		||||
                      red: 1
 | 
			
		||||
                      green: 1
 | 
			
		||||
                      blue: 1
 | 
			
		||||
                      transition_length: 1s
 | 
			
		||||
                else:
 | 
			
		||||
                  - light.turn_off:
 | 
			
		||||
                      id: output_led
 | 
			
		||||
                      transition_length: 1s
 | 
			
		||||
 | 
			
		||||
  - id: pir_handler
 | 
			
		||||
    then:
 | 
			
		||||
@@ -302,32 +359,6 @@ logger:
 | 
			
		||||
 | 
			
		||||
api:
 | 
			
		||||
  reboot_timeout: 15min
 | 
			
		||||
#  on_client_connected:
 | 
			
		||||
#    - logger.log:
 | 
			
		||||
#        format: "Client %s (IP %s) connected to API"
 | 
			
		||||
#        args: ["client_info.c_str()", "client_address.c_str()"]
 | 
			
		||||
#    - script.execute: light_off
 | 
			
		||||
#    - if:
 | 
			
		||||
#        condition:
 | 
			
		||||
#          lambda: |-
 | 
			
		||||
#            return id(enable_voice_support).state &&
 | 
			
		||||
#                   !id(mww).is_running();
 | 
			
		||||
#        then:
 | 
			
		||||
#          - micro_wake_word.start:
 | 
			
		||||
#  on_client_disconnected:
 | 
			
		||||
#    - logger.log:
 | 
			
		||||
#        format: "Client %s (IP %s) disconnected from API"
 | 
			
		||||
#        args: ["client_info.c_str()", "client_address.c_str()"]
 | 
			
		||||
#    - if:
 | 
			
		||||
#        condition:
 | 
			
		||||
#          lambda: |-
 | 
			
		||||
#            return id(enable_voice_support).state &&
 | 
			
		||||
#                   id(mww).is_running();
 | 
			
		||||
#        then:
 | 
			
		||||
#          - micro_wake_word.stop:
 | 
			
		||||
#    - light.turn_on:
 | 
			
		||||
#        id: output_led
 | 
			
		||||
#        effect: flash_white
 | 
			
		||||
 | 
			
		||||
ota:
 | 
			
		||||
  platform: esphome
 | 
			
		||||
@@ -377,13 +408,13 @@ i2s_audio:
 | 
			
		||||
      number: GPIO17 # WS
 | 
			
		||||
    i2s_bclk_pin:
 | 
			
		||||
      number: GPIO16  # SCK
 | 
			
		||||
  # Dummy I2S audio pipeline for "speaker"
 | 
			
		||||
  - id: i2s_dummy
 | 
			
		||||
    i2s_lrclk_pin:
 | 
			
		||||
      number: GPIO15 # WS
 | 
			
		||||
      ignore_strapping_warning: true  # This isn't connected to anything anyways
 | 
			
		||||
    i2s_bclk_pin:
 | 
			
		||||
      number: GPIO14  # SCK
 | 
			
		||||
#  # Dummy I2S audio pipeline for "speaker"
 | 
			
		||||
#  - id: i2s_dummy
 | 
			
		||||
#    i2s_lrclk_pin:
 | 
			
		||||
#      number: GPIO15 # WS
 | 
			
		||||
#      ignore_strapping_warning: true  # This isn't connected to anything anyways
 | 
			
		||||
#    i2s_bclk_pin:
 | 
			
		||||
#      number: GPIO14  # SCK
 | 
			
		||||
 | 
			
		||||
microphone:
 | 
			
		||||
  - platform: i2s_audio
 | 
			
		||||
@@ -394,23 +425,23 @@ microphone:
 | 
			
		||||
    pdm: false
 | 
			
		||||
    channel: left
 | 
			
		||||
 | 
			
		||||
speaker:
 | 
			
		||||
  # Dummy speaker to fix home-assistant/core#142363
 | 
			
		||||
  - platform: i2s_audio
 | 
			
		||||
    id: dummy_speaker
 | 
			
		||||
    i2s_audio_id: i2s_dummy
 | 
			
		||||
    i2s_dout_pin: GPIO25
 | 
			
		||||
    dac_type: external
 | 
			
		||||
    bits_per_sample: 16bit
 | 
			
		||||
    sample_rate: 16000
 | 
			
		||||
    channel: mono #mono will have bad performance, however, we are not using the on device speaker
 | 
			
		||||
    buffer_duration: 60ms
 | 
			
		||||
#speaker:
 | 
			
		||||
#  # Dummy speaker to fix home-assistant/core#142363
 | 
			
		||||
#  - platform: i2s_audio
 | 
			
		||||
#    id: dummy_speaker
 | 
			
		||||
#    i2s_audio_id: i2s_dummy
 | 
			
		||||
#    i2s_dout_pin: GPIO25
 | 
			
		||||
#    dac_type: external
 | 
			
		||||
#    bits_per_sample: 16bit
 | 
			
		||||
#    sample_rate: 16000
 | 
			
		||||
#    channel: mono #mono will have bad performance, however, we are not using the on device speaker
 | 
			
		||||
#    buffer_duration: 60ms
 | 
			
		||||
 | 
			
		||||
micro_wake_word:
 | 
			
		||||
  id: mww
 | 
			
		||||
  microphone:
 | 
			
		||||
    microphone: mic
 | 
			
		||||
    gain_factor: 8
 | 
			
		||||
    gain_factor: 2
 | 
			
		||||
  stop_after_detection: false
 | 
			
		||||
  models:
 | 
			
		||||
    - model: github://joshuaboniface/Custom_V2_MicroWakeWords/models/computer/computer.json
 | 
			
		||||
@@ -437,7 +468,7 @@ micro_wake_word:
 | 
			
		||||
voice_assistant:
 | 
			
		||||
  id: va
 | 
			
		||||
  microphone: mic
 | 
			
		||||
  speaker: dummy_speaker
 | 
			
		||||
#  speaker: dummy_speaker
 | 
			
		||||
  micro_wake_word: mww
 | 
			
		||||
  use_wake_word: false
 | 
			
		||||
  noise_suppression_level: 3
 | 
			
		||||
@@ -482,6 +513,7 @@ voice_assistant:
 | 
			
		||||
              red: 1
 | 
			
		||||
              green: 0
 | 
			
		||||
              blue: 0
 | 
			
		||||
          - voice_assistant.stop:
 | 
			
		||||
        else:
 | 
			
		||||
          - logger.log: "Command successful!"
 | 
			
		||||
          - light.turn_on:
 | 
			
		||||
@@ -491,6 +523,10 @@ voice_assistant:
 | 
			
		||||
              red: 0
 | 
			
		||||
              green: 1
 | 
			
		||||
              blue: 0
 | 
			
		||||
          - voice_assistant.stop:
 | 
			
		||||
  on_tts_end:
 | 
			
		||||
    - logger.log: "Finished STT result"
 | 
			
		||||
    - voice_assistant.stop:
 | 
			
		||||
 | 
			
		||||
light:
 | 
			
		||||
  - platform: rgb
 | 
			
		||||
@@ -505,7 +541,7 @@ light:
 | 
			
		||||
          name: flash_white
 | 
			
		||||
          colors:
 | 
			
		||||
            - state: true
 | 
			
		||||
              brightness: 15%
 | 
			
		||||
              brightness: 25%
 | 
			
		||||
              red: 100%
 | 
			
		||||
              green: 90%
 | 
			
		||||
              blue: 90%
 | 
			
		||||
@@ -515,7 +551,13 @@ light:
 | 
			
		||||
      - automation:
 | 
			
		||||
          name: hold
 | 
			
		||||
          sequence:
 | 
			
		||||
            - globals.set:
 | 
			
		||||
                id: light_is_holding
 | 
			
		||||
                value: "true"
 | 
			
		||||
            - delay: 5s
 | 
			
		||||
            - globals.set:
 | 
			
		||||
                id: light_is_holding
 | 
			
		||||
                value: "false"
 | 
			
		||||
            - script.execute: light_off
 | 
			
		||||
 | 
			
		||||
output:
 | 
			
		||||
@@ -566,13 +608,13 @@ sensor:
 | 
			
		||||
 | 
			
		||||
  - platform: debug
 | 
			
		||||
    free:
 | 
			
		||||
      name: "Heap Free"
 | 
			
		||||
      name: "ESP32 Heap Free"
 | 
			
		||||
    block:
 | 
			
		||||
      name: "Heap Max Block"
 | 
			
		||||
      name: "ESP32 Heap Max Block"
 | 
			
		||||
    loop_time:
 | 
			
		||||
      name: "Loop Time"
 | 
			
		||||
      name: "ESP32 Loop Time"
 | 
			
		||||
    cpu_frequency:
 | 
			
		||||
      name: "CPU Frequency"
 | 
			
		||||
      name: "ESP32 CPU Frequency"
 | 
			
		||||
 | 
			
		||||
  - platform: sgp4x
 | 
			
		||||
    voc:
 | 
			
		||||
@@ -652,6 +694,20 @@ sensor:
 | 
			
		||||
      id: sht45_humidity
 | 
			
		||||
      accuracy_decimals: 1
 | 
			
		||||
      filters:
 | 
			
		||||
        - lambda: |-
 | 
			
		||||
            // Grab measured and corrected temperatures
 | 
			
		||||
            float t_meas = id(sht45_temperature).state - id(temperature_offset);
 | 
			
		||||
            float t_corr = id(sht45_temperature).state;
 | 
			
		||||
            float rh_meas = x;
 | 
			
		||||
 | 
			
		||||
            // Compute saturation vapor pressures (Magnus formula)
 | 
			
		||||
            auto es = [](float T) { return 6.112 * exp((17.62 * T) / (243.12 + T)); };
 | 
			
		||||
            float rh_corr = rh_meas * es(t_meas) / es(t_corr);
 | 
			
		||||
 | 
			
		||||
            // Clamp to 0–100 %
 | 
			
		||||
            if (rh_corr < 0) rh_corr = 0;
 | 
			
		||||
            if (rh_corr > 100) rh_corr = 100;
 | 
			
		||||
            return rh_corr + id(humidity_offset);
 | 
			
		||||
        - offset: !lambda return id(humidity_offset);
 | 
			
		||||
        - sliding_window_moving_average:
 | 
			
		||||
            window_size: 20
 | 
			
		||||
@@ -685,37 +741,68 @@ sensor:
 | 
			
		||||
    unit_of_measurement: "%"
 | 
			
		||||
    icon: mdi:home-heart
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      float voc_index = id(sgp41_voc_index).state;
 | 
			
		||||
      float voc = id(sgp41_tvoc_ppb).state;
 | 
			
		||||
      if (isnan(voc) || voc < 1) voc = 1;
 | 
			
		||||
      float temp = id(sht45_temperature).state;
 | 
			
		||||
      float humidity = id(sht45_humidity).state;
 | 
			
		||||
  
 | 
			
		||||
      // VOC Score (0–100)
 | 
			
		||||
      float voc_score = 0;
 | 
			
		||||
      if (voc_index <= 100) voc_score = 100;
 | 
			
		||||
      else if (voc_index <= 200) voc_score = 80;
 | 
			
		||||
      else if (voc_index <= 300) voc_score = 60;
 | 
			
		||||
      else if (voc_index <= 400) voc_score = 40;
 | 
			
		||||
      else if (voc_index <= 500) voc_score = 50;
 | 
			
		||||
      else voc_score = 0;
 | 
			
		||||
  
 | 
			
		||||
      // Temperature Score (0–100)
 | 
			
		||||
      float temp_score = 100.0 - abs(temp - 23.0) * 10.0;
 | 
			
		||||
 | 
			
		||||
      float temp_min = id(room_health_temperature_min);
 | 
			
		||||
      float temp_max = id(room_health_temperature_max);
 | 
			
		||||
      float temp_penalty = id(room_health_temperature_penalty);
 | 
			
		||||
      float humid_min = id(room_health_humidity_min);
 | 
			
		||||
      float humid_max = id(room_health_humidity_max);
 | 
			
		||||
      float humid_penalty = id(room_health_humidity_penalty);
 | 
			
		||||
      float voc_weight = id(room_health_voc_weight);
 | 
			
		||||
      float temp_weight = id(room_health_temperature_weight);
 | 
			
		||||
      float humid_weight = id(room_health_humidity_weight);
 | 
			
		||||
 | 
			
		||||
      // VOC score (0–100) mapped to categories from Chemical Pollution levels below
 | 
			
		||||
      float voc_score;
 | 
			
		||||
      if (voc <= 200) {
 | 
			
		||||
        voc_score = 100.0;
 | 
			
		||||
      } else if (voc <= 400) {
 | 
			
		||||
        // 200–400: 100 → 90
 | 
			
		||||
        voc_score = 100.0 - (voc - 200) * (10.0 / 200.0);
 | 
			
		||||
      } else if (voc <= 600) {
 | 
			
		||||
        // 400–600: 90 → 70
 | 
			
		||||
        voc_score = 90.0 - (voc - 400) * (20.0 / 200.0);
 | 
			
		||||
      } else if (voc <= 1500) {
 | 
			
		||||
        // 600–1500: 70 → 40
 | 
			
		||||
        voc_score = 70.0 - (voc - 600) * (30.0 / 900.0);
 | 
			
		||||
      } else if (voc <= 3000) {
 | 
			
		||||
        // 1500–3000: 40 → 0
 | 
			
		||||
        voc_score = 40.0 - (voc - 1500) * (40.0 / 1500.0);
 | 
			
		||||
      } else {
 | 
			
		||||
        voc_score = 0.0;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Temperature score
 | 
			
		||||
      float temp_score = 100;
 | 
			
		||||
      if (temp < temp_min) temp_score = 100 - (temp_min - temp) * temp_penalty;
 | 
			
		||||
      else if (temp > temp_max) temp_score = 100 - (temp - temp_max) * temp_penalty;
 | 
			
		||||
      if (temp_score < 0) temp_score = 0;
 | 
			
		||||
  
 | 
			
		||||
      // Humidity Score (0–100), ideal range 35–55%
 | 
			
		||||
      float humidity_score = 100.0 - abs(humidity - 50.0) * 3.0;
 | 
			
		||||
 | 
			
		||||
      // Humidity score
 | 
			
		||||
      float humidity_score = 100;
 | 
			
		||||
      if (humidity < humid_min) humidity_score = 100 - (humid_min - humidity) * humid_penalty;
 | 
			
		||||
      else if (humidity > humid_max) humidity_score = 100 - (humidity - humid_max) * humid_penalty;
 | 
			
		||||
      if (humidity_score < 0) humidity_score = 0;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
      // Weighted average
 | 
			
		||||
      float overall_score = (voc_score * 0.5 + temp_score * 0.25 + humidity_score * 0.25);
 | 
			
		||||
  
 | 
			
		||||
      float total_weights = voc_weight + temp_weight + humid_weight;
 | 
			
		||||
      if (total_weights <= 0) total_weights = 1.0;
 | 
			
		||||
      voc_weight /= total_weights;
 | 
			
		||||
      temp_weight /= total_weights;
 | 
			
		||||
      humid_weight /= total_weights;
 | 
			
		||||
      float overall_score = (voc_score * voc_weight + temp_score * temp_weight + humidity_score * humid_weight);
 | 
			
		||||
 | 
			
		||||
      return (int) round(overall_score);
 | 
			
		||||
    update_interval: 15s
 | 
			
		||||
 | 
			
		||||
  - platform: tsl2591
 | 
			
		||||
    address: 0x29
 | 
			
		||||
    update_interval: 1s
 | 
			
		||||
    integration_time: 200ms
 | 
			
		||||
    update_interval: 2s
 | 
			
		||||
    integration_time: 600ms
 | 
			
		||||
    power_save_mode: no
 | 
			
		||||
    gain: auto
 | 
			
		||||
    device_factor: 53
 | 
			
		||||
@@ -771,7 +858,9 @@ binary_sensor:
 | 
			
		||||
    id: pir_gpio
 | 
			
		||||
    pin:
 | 
			
		||||
      number: GPIO32
 | 
			
		||||
      mode: INPUT_PULLDOWN
 | 
			
		||||
      mode:
 | 
			
		||||
        input: true
 | 
			
		||||
        pulldown: true
 | 
			
		||||
    internal: false
 | 
			
		||||
    device_class: motion
 | 
			
		||||
    on_press:
 | 
			
		||||
@@ -844,12 +933,12 @@ text_sensor:
 | 
			
		||||
    id: sgp41_chemical_pollution
 | 
			
		||||
    icon: mdi:molecule
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      float voc_index = id(sgp41_voc_index).state;
 | 
			
		||||
      if (voc_index < 1 || voc_index > 500) return {"Unknown"};
 | 
			
		||||
      if (voc_index <= 100) return {"Excellent"};
 | 
			
		||||
      else if (voc_index <= 200) return {"Good"};
 | 
			
		||||
      else if (voc_index <= 300) return {"Moderate"};
 | 
			
		||||
      else if (voc_index <= 400) return {"Unhealthy"};
 | 
			
		||||
      float voc = id(sgp41_tvoc_ppb).state;
 | 
			
		||||
      if (isnan(voc) || voc < 1) return {"Unknown"};
 | 
			
		||||
      else if (voc <= 200) return {"Excellent"};
 | 
			
		||||
      else if (voc <= 400) return {"Good"};
 | 
			
		||||
      else if (voc <= 600) return {"Moderate"};
 | 
			
		||||
      else if (voc <= 1500) return {"Unhealthy"};
 | 
			
		||||
      else return {"Hazardous"};
 | 
			
		||||
    update_interval: 15s
 | 
			
		||||
 | 
			
		||||
@@ -860,10 +949,10 @@ text_sensor:
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      float score = id(room_health_score).state;
 | 
			
		||||
      if (score < 0) return {"Unknown"};
 | 
			
		||||
      else if (score >= 90.0) return {"Great"};
 | 
			
		||||
      else if (score >= 80.0) return {"Good"};
 | 
			
		||||
      else if (score >= 60.0) return {"Fair"};
 | 
			
		||||
      else if (score >= 40.0) return {"Poor"};
 | 
			
		||||
      else if (score >= 95.0) return {"Great"};
 | 
			
		||||
      else if (score >= 90.0) return {"Good"};
 | 
			
		||||
      else if (score >= 80.0) return {"Fair"};
 | 
			
		||||
      else if (score >= 60.0) return {"Poor"};
 | 
			
		||||
      else return {"Bad"};
 | 
			
		||||
    update_interval: 15s
 | 
			
		||||
 | 
			
		||||
@@ -923,7 +1012,7 @@ switch:
 | 
			
		||||
 | 
			
		||||
number:
 | 
			
		||||
  # Temperature offset:
 | 
			
		||||
  # A calibration from -30 to +5 for the temperature sensor
 | 
			
		||||
  # A calibration from -30 to +10 for the temperature sensor
 | 
			
		||||
  - platform: template
 | 
			
		||||
    name: "Temperature Offset"
 | 
			
		||||
    id: temperature_offset_setter
 | 
			
		||||
@@ -939,12 +1028,12 @@ number:
 | 
			
		||||
            value: !lambda 'return float(x);'
 | 
			
		||||
 | 
			
		||||
  # Humidity offset:
 | 
			
		||||
  # A calibration from -20 to +20 for the humidity sensor
 | 
			
		||||
  # A calibration from -50 to +50 for the humidity sensor
 | 
			
		||||
  - platform: template
 | 
			
		||||
    name: "Humidity Offset"
 | 
			
		||||
    id: humidity_offset_setter
 | 
			
		||||
    min_value: -20
 | 
			
		||||
    max_value: 20
 | 
			
		||||
    min_value: -50
 | 
			
		||||
    max_value: 50
 | 
			
		||||
    step: 0.1
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      return id(humidity_offset);
 | 
			
		||||
@@ -986,6 +1075,154 @@ number:
 | 
			
		||||
            id: light_presence_threshold
 | 
			
		||||
            value: !lambda 'return int(x);'
 | 
			
		||||
 | 
			
		||||
  # Room Health Calibration Values
 | 
			
		||||
  # These values allow the user to tweak the values of the room health calculation
 | 
			
		||||
  - platform: template
 | 
			
		||||
    name: "Room Health Min Temperature"
 | 
			
		||||
    id: room_health_temperature_min_setter
 | 
			
		||||
    min_value: 15
 | 
			
		||||
    max_value: 30
 | 
			
		||||
    step: 0.5
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      return id(room_health_temperature_min);
 | 
			
		||||
    set_action:
 | 
			
		||||
      then:
 | 
			
		||||
        - globals.set:
 | 
			
		||||
            id: room_health_temperature_min
 | 
			
		||||
            value: !lambda 'return float(x);'
 | 
			
		||||
  - platform: template
 | 
			
		||||
    name: "Room Health Max Temperature"
 | 
			
		||||
    id: room_health_temperature_max_setter
 | 
			
		||||
    min_value: 15
 | 
			
		||||
    max_value: 30
 | 
			
		||||
    step: 0.5
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      return id(room_health_temperature_max);
 | 
			
		||||
    set_action:
 | 
			
		||||
      then:
 | 
			
		||||
        - globals.set:
 | 
			
		||||
            id: room_health_temperature_max
 | 
			
		||||
            value: !lambda 'return float(x);'
 | 
			
		||||
  - platform: template
 | 
			
		||||
    name: "Room Health Temperature Penalty"
 | 
			
		||||
    id: room_health_temperature_penalty_setter
 | 
			
		||||
    min_value: 1
 | 
			
		||||
    max_value: 20
 | 
			
		||||
    step: 1
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      return int(id(room_health_temperature_penalty));
 | 
			
		||||
    set_action:
 | 
			
		||||
      then:
 | 
			
		||||
        - globals.set:
 | 
			
		||||
            id: room_health_temperature_penalty
 | 
			
		||||
            value: !lambda 'return float(x);'
 | 
			
		||||
  - platform: template
 | 
			
		||||
    name: "Room Health Min Humidity"
 | 
			
		||||
    id: room_health_humidity_min_setter
 | 
			
		||||
    min_value: 20
 | 
			
		||||
    max_value: 80
 | 
			
		||||
    step: 1.0
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      return id(room_health_humidity_min);
 | 
			
		||||
    set_action:
 | 
			
		||||
      then:
 | 
			
		||||
        - globals.set:
 | 
			
		||||
            id: room_health_humidity_min
 | 
			
		||||
            value: !lambda 'return float(x);'
 | 
			
		||||
  - platform: template
 | 
			
		||||
    name: "Room Health Max Humidity"
 | 
			
		||||
    id: room_health_humidity_max_setter
 | 
			
		||||
    min_value: 20
 | 
			
		||||
    max_value: 80
 | 
			
		||||
    step: 1.0
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      return id(room_health_humidity_max);
 | 
			
		||||
    set_action:
 | 
			
		||||
      then:
 | 
			
		||||
        - globals.set:
 | 
			
		||||
            id: room_health_humidity_max
 | 
			
		||||
            value: !lambda 'return float(x);'
 | 
			
		||||
  - platform: template
 | 
			
		||||
    name: "Room Health Humidity Penalty"
 | 
			
		||||
    id: room_health_humidity_penalty_setter
 | 
			
		||||
    min_value: 1
 | 
			
		||||
    max_value: 10
 | 
			
		||||
    step: 1
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      return int(id(room_health_humidity_penalty));
 | 
			
		||||
    set_action:
 | 
			
		||||
      then:
 | 
			
		||||
        - globals.set:
 | 
			
		||||
            id: room_health_humidity_penalty
 | 
			
		||||
            value: !lambda 'return float(x);'
 | 
			
		||||
  - platform: template
 | 
			
		||||
    name: "Room Health VOC Weight"
 | 
			
		||||
    id: room_health_voc_weight_setter
 | 
			
		||||
    min_value: 0.00
 | 
			
		||||
    max_value: 1.00
 | 
			
		||||
    step: 0.01
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      return id(room_health_voc_weight);
 | 
			
		||||
    set_action:
 | 
			
		||||
      - if:
 | 
			
		||||
          condition:
 | 
			
		||||
            lambda: |-
 | 
			
		||||
              float total = x + id(room_health_temperature_weight) + id(room_health_humidity_weight);
 | 
			
		||||
              return (total > 0.0) && (total <= 1.0);
 | 
			
		||||
          then:
 | 
			
		||||
            - globals.set:
 | 
			
		||||
                id: room_health_voc_weight
 | 
			
		||||
                value: !lambda 'return float(x);'
 | 
			
		||||
          else:
 | 
			
		||||
            - logger.log:
 | 
			
		||||
                format: "Rejected VOC weight %.2f (total would be out of range: must be > 0.0 and ≤ 1.0)"
 | 
			
		||||
                args: [ 'x' ]
 | 
			
		||||
  - platform: template
 | 
			
		||||
    name: "Room Health Temperature Weight"
 | 
			
		||||
    id: room_health_temperature_weight_setter
 | 
			
		||||
    min_value: 0.00
 | 
			
		||||
    max_value: 1.00
 | 
			
		||||
    step: 0.01
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      return id(room_health_temperature_weight);
 | 
			
		||||
    set_action:
 | 
			
		||||
      - if:
 | 
			
		||||
          condition:
 | 
			
		||||
            lambda: |-
 | 
			
		||||
              float total = x + id(room_health_voc_weight) + id(room_health_humidity_weight);
 | 
			
		||||
              return (total > 0.0) && (total <= 1.0);
 | 
			
		||||
          then:
 | 
			
		||||
            - globals.set:
 | 
			
		||||
                id: room_health_temperature_weight
 | 
			
		||||
                value: !lambda 'return float(x);'
 | 
			
		||||
          else:
 | 
			
		||||
            - logger.log:
 | 
			
		||||
                format: "Rejected Temperature weight %.2f (total would be out of range: must be > 0.0 and ≤ 1.0)"
 | 
			
		||||
                args: [ 'x' ]
 | 
			
		||||
  - platform: template
 | 
			
		||||
    name: "Room Health Humidity Weight"
 | 
			
		||||
    id: room_health_humidity_weight_setter
 | 
			
		||||
    min_value: 0.00
 | 
			
		||||
    max_value: 1.00
 | 
			
		||||
    step: 0.01
 | 
			
		||||
    lambda: |-
 | 
			
		||||
      return id(room_health_humidity_weight);
 | 
			
		||||
    set_action:
 | 
			
		||||
      - if:
 | 
			
		||||
          condition:
 | 
			
		||||
            lambda: |-
 | 
			
		||||
              float total = x + id(room_health_temperature_weight) + id(room_health_voc_weight);
 | 
			
		||||
              return (total > 0.0) && (total <= 1.0);
 | 
			
		||||
          then:
 | 
			
		||||
            - globals.set:
 | 
			
		||||
                id: room_health_humidity_weight
 | 
			
		||||
                value: !lambda 'return float(x);'
 | 
			
		||||
          else:
 | 
			
		||||
            - logger.log:
 | 
			
		||||
                format: "Rejected Humidity weight %.2f (total would be out of range: must be > 0.0 and ≤ 1.0)"
 | 
			
		||||
                args: [ 'x' ]
 | 
			
		||||
 | 
			
		||||
  # LD2410c configuration values
 | 
			
		||||
  - platform: ld2410
 | 
			
		||||
    timeout:
 | 
			
		||||
      name: "LD2410C Timeout"
 | 
			
		||||
 
 | 
			
		||||