Files
librenms-librenms/app/Models/Sensor.php
Tony Murray 0a5c174f4f Fix test regressions introduced while tests were broken (#16399)
* AuthSSOTest: clear roles cache

* PollingJob: When a poller module doesn't exist, return null instead of false.  Skip all other checks and disable polling in that case.

* Sensors: Guess high and low limits separately as needed

* Sensors: drac test psu current data was wrong, referencing the snmprec, 8 / 10 and 0 / 10 should be the values
NOTE: drac is messed up and runs a billion snmp queriess for no reason

* please phpstan

* Sensors: limits reference old code
move to "creating"

* Fix gw-eydfa accidental assignment

* Fix ies5000 test data now that the bad state is removed

* Fix ies5000 test data part 2

* Move sensor discovery reset into discover_device()

* infinera remove duplicate sensor (also a lot of trailing whitespace apparently)

* Fix innovaphone bad yaml discovery

* module tests should be using null when test data doesn't exist, not an empty array

* When discovery or polling is not supported, dump null instead of an array.
Account for nulls in testing

* update ISE serial

* Janitza was seemingly wrong before

* Remove some private data

* bgp-peers requires ipv4-addresses and ipv6-addresses for bgpPeerIface

* fix polycomLens broken state sensor discovery

* Raritan pdu and pdu2 test data was combined in one test file, split it out

* scs-ks duplicate temperature sensor indexes

* sentry3 someone tried to avoid breaking stuff but just broke things more

* smartos-dcp-m fix incorrect numeric oids

* ssu2000 apparently test data was wrong, must have fixed a bug in the code.

* timos remove duplicate dbm sensor definitions

* bgpPeerIface is working in tests now

* Fix moxa-etherdevice when mibs are a bit different

* xw_to_dbm negative values should return null

* Update cisco test data due previous fixes/changes

* One more bgpPeerIface

* Add orderBy to ospf module db dumps

* Remove links test data for now

* Improve handling of bad data in ipv6-addresses module
2024-09-23 10:11:05 -05:00

176 lines
5.2 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasOneThrough;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use LibreNMS\Interfaces\Models\Keyable;
class Sensor extends DeviceRelatedModel implements Keyable
{
use HasFactory;
public $timestamps = false;
protected $primaryKey = 'sensor_id';
protected $fillable = [
'poller_type',
'sensor_class',
'device_id',
'sensor_oid',
'sensor_index',
'sensor_type',
'sensor_descr',
'sensor_divisor',
'sensor_multiplier',
'sensor_limit',
'sensor_limit_warn',
'sensor_limit_low',
'sensor_limit_low_warn',
'sensor_current',
'entPhysicalIndex',
'entPhysicalIndex_measured',
'user_func',
'group',
'rrd_type',
];
protected static $icons = [
'airflow' => 'angle-double-right',
'ber' => 'sort-amount-desc',
'charge' => 'battery-half',
'chromatic_dispersion' => 'indent',
'cooling' => 'thermometer-full',
'count' => 'hashtag',
'current' => 'bolt fa-flip-horizontal',
'dbm' => 'sun-o',
'delay' => 'clock-o',
'eer' => 'snowflake-o',
'fanspeed' => 'refresh',
'frequency' => 'line-chart',
'humidity' => 'tint',
'load' => 'percent',
'loss' => 'percentage',
'power' => 'power-off',
'power_consumed' => 'plug',
'power_factor' => 'calculator',
'pressure' => 'thermometer-empty',
'quality_factor' => 'arrows',
'runtime' => 'hourglass-half',
'signal' => 'wifi',
'snr' => 'signal',
'state' => 'bullseye',
'temperature' => 'thermometer-three-quarters',
'tv_signal' => 'signal',
'bitrate' => 'bar-chart',
'voltage' => 'bolt',
'waterflow' => 'tint',
'percent' => 'percent',
];
// ---- Helper Functions ----
public function classDescr()
{
$nice = collect([
'ber' => 'BER',
'dbm' => 'dBm',
'eer' => 'EER',
'snr' => 'SNR',
]);
return $nice->get($this->sensor_class, ucwords(str_replace('_', ' ', $this->sensor_class)));
}
public function icon()
{
return collect(self::$icons)->get($this->sensor_class, 'delicius');
}
public static function getTypes()
{
return array_keys(self::$icons);
}
// for the legacy menu
public static function getIconMap()
{
return self::$icons;
}
public function guessLimits(bool $high, bool $low): void
{
if ($high) {
$this->sensor_limit = match ($this->sensor_class) {
'temperature' => $this->sensor_current + 20,
'voltage' => $this->sensor_current * 1.15,
'humidity' => 70,
'fanspeed' => $this->sensor_current * 1.80,
'power_factor' => 1,
'signal' => -30,
'load' => 80,
'airflow', 'snr', 'frequency', 'pressure', 'cooling' => $this->sensor_current * 1.05,
default => null,
};
}
if ($low) {
$this->sensor_limit_low = match ($this->sensor_class) {
'temperature' => $this->sensor_current - 10,
'voltage' => $this->sensor_current * 0.85,
'humidity' => 30,
'fanspeed' => $this->sensor_current * 0.80,
'power_factor' => -1,
'signal' => -80,
'airflow', 'snr', 'frequency', 'pressure', 'cooling' => $this->sensor_current * 0.95,
default => null,
};
}
}
// ---- Define Relationships ----
public function events(): MorphMany
{
return $this->morphMany(Eventlog::class, 'events', 'type', 'reference');
}
public function stateIndex(): HasOneThrough
{
return $this->hasOneThrough(StateIndex::class, SensorToStateIndex::class, 'sensor_id', 'state_index_id', 'sensor_id', 'state_index_id');
}
public function translations(): BelongsToMany
{
return $this->belongsToMany(StateTranslation::class, 'sensors_to_state_indexes', 'sensor_id', 'state_index_id', 'sensor_id', 'state_index_id');
}
public function getCompositeKey(): string
{
return "$this->poller_type-$this->sensor_class-$this->device_id-$this->sensor_type-$this->sensor_index";
}
public function syncGroup(): string
{
return "$this->sensor_class-$this->poller_type";
}
public function __toString()
{
$data = $this->only([
'sensor_oid',
'sensor_index',
'sensor_type',
'sensor_descr',
'poller_type',
'sensor_divisor',
'sensor_multiplier',
'entPhysicalIndex',
'sensor_current',
]);
$data[] = "(limits: LL: $this->sensor_limit_low, LW: $this->sensor_limit_low_warn, W: $this->sensor_limit_warn, H: $this->sensor_limit)";
$data[] = "rrd_type = $this->rrd_type";
return implode(', ', $data);
}
}